Version 2.9.0-4.0.dev

Merge commit '726d3c772554924f62db0b9e0d4c280dbbddc824' into dev
diff --git a/41458.dart b/41458.dart
new file mode 100644
index 0000000..22bd14a
--- /dev/null
+++ b/41458.dart
@@ -0,0 +1,9 @@
+class A {}
+
+extension AList on Iterable<A> {
+  get foo => null;
+}
+
+extension AMap on Map<String, A> {
+  get bar => values.foo; // <-- foo is underlined red
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1aa6464..4415ec9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,31 @@
 *   Class `OSError` now implements `Exception`. This change means `OSError` will
     now be caught in catch clauses catching `Exception`s.
 
+### Tools
+
+#### dartfmt
+
+* Add `--fix-single-cascade-statements`.
+* Correctly handle `var` in `--fix-function-typedefs`.
+* Preserve leading indentation in fixed doc comments.
+* Split outer nested control flow elements.
+* Always place a blank line after script tags.
+* Don't add unneeded splits on if elements near comments.
+* Indent blocks in initializers of multiple-variable declarations.
+* Update the null-aware subscript syntax from `?.[]` to `?[]`.
+
+#### Linter
+
+Updated the Linter to `0.1.115`, which includes:
+
+* Updated `avoid_types_as_parameter_names` to check catch-clauses.
+* Fixed `unsafe_html` to check attributes and methods on extensions.
+* Extended `unsafe_html` to include `Window.open`, `Element.html` and
+  `DocumentFragment.html` in unsafe API checks.
+* Improved docs for `sort_child_properties_last`.
+* (internal) `package:analyzer` API updates.
+* New lint: `sized_box_for_whitespace`.
+
 ### Dart VM
 
 
@@ -695,6 +720,13 @@
 * new lint: `avoid_web_libraries_in_flutter` (experimental)
 * (internal) prepare `unnecessary_lambdas` for coming `MethodInvocation` vs. `FunctionExpressionInvocation` changes
 
+## 2.5.2 - 2019-10-08
+
+This is a patch release with properly signed binaries required for macOS
+Catalina (Issue [38765][]).
+
+[38765]: https://github.com/dart-lang/sdk/issues/38765
+
 ## 2.5.1 - 2019-09-27
 
 This is a patch release that prevents type inference failures in the analyzer
diff --git a/DEPS b/DEPS
index 232f736..13150cf 100644
--- a/DEPS
+++ b/DEPS
@@ -39,7 +39,7 @@
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "929da300c553ebb8a9ff744746bcc1326613e1f9",
+  "co19_rev": "919e0b662aa4b392dcb791446d80f31e972f8635",
   "co19_2_rev": "368bfa9e877a2df003547f64bb17e30596af10c7",
 
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
@@ -60,16 +60,16 @@
   "async_tag": "2.4.1",
   "bazel_worker_tag": "v0.1.22",
   "benchmark_harness_tag": "81641290dea44c34138a109a37e215482f405f81",
-  "boolean_selector_tag" : "1.0.4",
+  "boolean_selector_tag": "1309eabed510cc3b7536fd4367d39b97ebee3d69",
   "boringssl_gen_rev": "b9e27cff1ff0803e97ab1f88764a83be4aa94a6d",
   "boringssl_rev" : "4dfd5af70191b068aebe567b8e29ce108cee85ce",
-  "charcode_tag": "v1.1.2",
+  "charcode_tag": "9085e6b6127f084d66c0a94810a808121459012a",
   "chrome_rev" : "19997",
   "cli_util_rev" : "4ad7ccbe3195fd2583b30f86a86697ef61e80f41",
-  "collection_tag": "1.14.11",
-  "convert_tag": "2.0.2",
+  "collection_tag": "7be42e03d427cc19571cd7f9fc628a5913a6b757",
+  "convert_tag": "49bde5b371eb5c2c8e721557cf762f17c75e49fc",
   "crypto_tag" : "2.0.6",
-  "csslib_tag" : "0.15.0",
+  "csslib_tag": "bf372d4fdc6dfa232ad93f77a0a3de0891edd04c",
   "dart2js_info_tag" : "0.6.0",
 
   # Note: Updates to dart_style have to be coordinated with the infrastructure
@@ -84,30 +84,30 @@
   #     and land the review.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "1.3.2",  # Please see the note above before updating.
+  "dart_style_tag": "1.3.6",  # Please see the note above before updating.
 
   "dartdoc_tag" : "v0.31.0",
   "ffi_tag": "ea88d71b043ee14b268c3aedff14e9eb32e20959",
-  "fixnum_tag": "0.10.9",
-  "glob_tag": "1.1.7",
+  "fixnum_tag": "eb3748663dc979271ff6a3d014fbe522543b1d91",
+  "glob_tag": "e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6",
   "html_tag" : "0.14.0+1",
   "http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
   "http_multi_server_rev" : "ea269f79321d659208402088f3297e8920a88ee6",
   "http_parser_tag" : "3.1.3",
   "http_retry_tag": "0.1.1",
-  "http_tag" : "0.12.0+2",
+  "http_tag": "a131e563c09349f624d5421237183a06fb10552d",
   "http_throttle_tag" : "1.0.2",
   "icu_rev" : "5005010d694e16571b8dfbf07d70817841f80a69",
   "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
   "intl_tag": "0.16.1",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
-  "json_rpc_2_tag": "2.0.9",
-  "linter_tag": "0.1.114",
-  "logging_tag": "0.11.3+2",
+  "json_rpc_2_tag": "eec10819a40e7bf2e401f2b97368776a90cc5550",
+  "linter_tag": "0.1.115",
+  "logging_tag": "9561ba016ae607747ae69b846c0e10958ca58ed4",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
-  "markdown_tag": "2.1.1",
-  "matcher_tag": "0.12.5",
-  "mime_tag": "0.9.6+2",
+  "markdown_tag": "dd150bb64c5f3b41d31f20f399ae2a855f7f8c00",
+  "matcher_tag": "af4fe7daf8e94a46981e4f072872be550a6969e9",
+  "mime_tag": "179b5e6a88f4b63f36dc1b8fcbc1e83e5e0cd3a7",
   "mockito_tag": "d39ac507483b9891165e422ec98d9fb480037c8b",
   "mustache_tag" : "5e81b12215566dbe2473b2afd01a8a8aedd56ad9",
   "oauth2_tag": "1.2.1",
@@ -144,7 +144,7 @@
   "tflite_native_rev": "3c777c40608a2a9f1427bfe0028ab48e7116b4c1",
   "typed_data_tag": "1.1.6",
   "usage_tag": "3.4.0",
-  "watcher_rev": "0.9.7+14",
+  "watcher_rev": "fc3c9aae5d31d707b3013b42634dde8d8a1161b4",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
   "web_socket_channel_tag": "1.1.0",
   "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
diff --git a/benchmarks/IsolateJson/dart/IsolateJson.dart b/benchmarks/IsolateJson/dart/IsolateJson.dart
index bdc7988..1fa4919 100644
--- a/benchmarks/IsolateJson/dart/IsolateJson.dart
+++ b/benchmarks/IsolateJson/dart/IsolateJson.dart
@@ -11,17 +11,24 @@
 import 'package:benchmark_harness/benchmark_harness.dart' show BenchmarkBase;
 import 'package:meta/meta.dart';
 
+import 'runtime/tests/vm/dart/export_sendAndExit_helper.dart' show sendAndExit;
+
 class JsonDecodingBenchmark {
   JsonDecodingBenchmark(this.name,
-      {@required this.sample, @required this.numTasks});
+      {@required this.sample,
+      @required this.numTasks,
+      @required this.useSendAndExit});
 
   Future<void> report() async {
     final stopwatch = Stopwatch()..start();
-    final decodedFutures = <Future>[];
-    for (int i = 0; i < numTasks; i++) {
-      decodedFutures.add(decodeJson(sample));
+    // Benchmark harness counts 10 iterations as one.
+    for (int i = 0; i < 10; i++) {
+      final decodedFutures = <Future>[];
+      for (int i = 0; i < numTasks; i++) {
+        decodedFutures.add(decodeJson(useSendAndExit, sample));
+      }
+      await Future.wait(decodedFutures);
     }
-    await Future.wait(decodedFutures);
 
     print("$name(RunTime): ${stopwatch.elapsedMicroseconds} us.");
   }
@@ -29,6 +36,7 @@
   final String name;
   final Uint8List sample;
   final int numTasks;
+  final bool useSendAndExit;
 }
 
 Uint8List createSampleJson(final size) {
@@ -41,27 +49,42 @@
 }
 
 class JsonDecodeRequest {
+  final bool useSendAndExit;
   final SendPort sendPort;
   final Uint8List encodedJson;
-  const JsonDecodeRequest(this.sendPort, this.encodedJson);
+  const JsonDecodeRequest(this.useSendAndExit, this.sendPort, this.encodedJson);
 }
 
-Future<Map> decodeJson(Uint8List encodedJson) async {
+Future<Map> decodeJson(bool useSendAndExit, Uint8List encodedJson) async {
   final port = ReceivePort();
   final inbox = StreamIterator<dynamic>(port);
-  final workerExitedPort = ReceivePort();
-  await Isolate.spawn(
-      jsonDecodingIsolate, JsonDecodeRequest(port.sendPort, encodedJson),
-      onExit: workerExitedPort.sendPort);
+  final completer = Completer<bool>();
+  final workerExitedPort = RawReceivePort((v) {
+    completer.complete(true);
+  });
+  final workerErroredPort = RawReceivePort((v) {
+    stderr.writeln('worker errored out $v');
+    completer.completeError(true);
+  });
+  await Isolate.spawn(jsonDecodingIsolate,
+      JsonDecodeRequest(useSendAndExit, port.sendPort, encodedJson),
+      onError: workerErroredPort.sendPort, onExit: workerExitedPort.sendPort);
+  await completer.future;
+  workerExitedPort.close();
+  workerErroredPort.close();
   await inbox.moveNext();
   final decodedJson = inbox.current;
-  await workerExitedPort.first;
   port.close();
   return decodedJson;
 }
 
 Future<void> jsonDecodingIsolate(JsonDecodeRequest request) async {
-  request.sendPort.send(json.decode(utf8.decode(request.encodedJson)));
+  final result = json.decode(utf8.decode(request.encodedJson));
+  if (request.useSendAndExit) {
+    sendAndExit(request.sendPort, result);
+  } else {
+    request.sendPort.send(result);
+  }
 }
 
 class SyncJsonDecodingBenchmark extends BenchmarkBase {
@@ -118,6 +141,13 @@
     for (final iterations in <int>[1, 4]) {
       await JsonDecodingBenchmark(
               "IsolateJson.Decode${config.suffix}x$iterations",
+              useSendAndExit: false,
+              sample: config.sample,
+              numTasks: iterations)
+          .report();
+      await JsonDecodingBenchmark(
+              "IsolateJson.SendAndExit_Decode${config.suffix}x$iterations",
+              useSendAndExit: true,
               sample: config.sample,
               numTasks: iterations)
           .report();
diff --git a/benchmarks/IsolateJson/dart/runtime/tests/vm/dart/export_sendAndExit_helper.dart b/benchmarks/IsolateJson/dart/runtime/tests/vm/dart/export_sendAndExit_helper.dart
new file mode 100644
index 0000000..75628d6
--- /dev/null
+++ b/benchmarks/IsolateJson/dart/runtime/tests/vm/dart/export_sendAndExit_helper.dart
@@ -0,0 +1 @@
+export 'dart:_internal' show sendAndExit;
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index b3dec5b..7548761 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -118,10 +118,7 @@
       ldflags += [ "-fsanitize=thread" ]
     }
     if (is_ubsan) {
-      cflags += [
-        "-fsanitize=undefined",
-        "-fno-sanitize=null,alignment",
-      ]
+      cflags += [ "-fsanitize=undefined" ]
       ldflags += [ "-fsanitize=undefined" ]
     }
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
index 14ab354..f210251 100644
--- a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
@@ -11,12 +11,14 @@
 const String cfeMarker = 'cfe';
 const String cfeWithNnbdMarker = '$cfeMarker:nnbd';
 const String dart2jsMarker = 'dart2js';
+const String dart2jsWithNnbdSdkMarker = '$dart2jsMarker:nnbd-sdk';
 const String analyzerMarker = 'analyzer';
 
 /// Markers used in annotated tests shared by CFE, analyzer and dart2js.
 const List<String> sharedMarkers = [
   cfeMarker,
   dart2jsMarker,
+  dart2jsWithNnbdSdkMarker,
   analyzerMarker,
 ];
 
@@ -31,6 +33,7 @@
   cfeMarker,
   cfeWithNnbdMarker,
   dart2jsMarker,
+  dart2jsWithNnbdSdkMarker,
   analyzerMarker,
 ];
 
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/basic.dart b/pkg/_fe_analyzer_shared/test/constants/data/basic.dart
index ec98279..138949b 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/basic.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/basic.dart
@@ -20,10 +20,10 @@
   print(/*Double(0.5)*/ double0);
   print(
       /*cfe|analyzer.Symbol(foo)*/
-      /*dart2js.Instance(Symbol,{_name:String(foo))*/
+      /*dart2js|dart2js:nnbd-sdk.Instance(Symbol,{_name:String(foo))*/
       symbol0);
   print(
       /*cfe|analyzer.Symbol(foo)*/
-      /*dart2js.Instance(Symbol,{_name:String(foo))*/
+      /*dart2js|dart2js:nnbd-sdk.Instance(Symbol,{_name:String(foo))*/
       symbol1);
 }
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/errors.dart b/pkg/_fe_analyzer_shared/test/constants/data/errors.dart
index b2026dc..a1c0f01 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/errors.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/errors.dart
@@ -5,7 +5,7 @@
 String method() => 'foo';
 
 const String string0 =
-    /*cfe|dart2js.error: Method invocation is not a constant expression.*/
+    /*cfe|dart2js|dart2js:nnbd-sdk.error: Method invocation is not a constant expression.*/
     method();
 
 main() {
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/function.dart b/pkg/_fe_analyzer_shared/test/constants/data/function.dart
index 987b64c5..d8cf2b6 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/function.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/function.dart
@@ -15,15 +15,15 @@
 
 main() {
   print(
-      /*cfe|dart2js.Function(method1)*/
+      /*cfe|dart2js|dart2js:nnbd-sdk.Function(method1)*/
       /*analyzer.Function(method1,type=T Function<T>(T))*/
       function0);
   print(
       /*cfe|dart2js.Instantiation(method1<int>)*/
       /*analyzer.Function(method1,type=int Function(int))*/
-      instantiation0);
+      /*dart2js:nnbd-sdk.Instantiation(method1<int*>)*/ instantiation0);
   print(
       /*cfe|dart2js.Instantiation(method2<String,int>)*/
       /*analyzer.Function(method2,type=Map<String, int> Function(String, int))*/
-      instantiation1);
+      /*dart2js:nnbd-sdk.Instantiation(method2<String*,int*>)*/ instantiation1);
 }
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/list.dart b/pkg/_fe_analyzer_shared/test/constants/data/list.dart
index 446475d..c18686c 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/list.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/list.dart
@@ -16,8 +16,12 @@
 
 main() {
   print(/*List<dynamic>()*/ list0);
-  print(/*List<int>()*/ list1);
-  print(/*List<int>()*/ list2);
-  print(/*List<int>(Int(42))*/ list3);
-  print(/*List<int>(Int(42),Int(87))*/ list4);
+  print(
+      /*cfe|analyzer|dart2js.List<int>()*/ /*dart2js:nnbd-sdk.List<int*>()*/ list1);
+  print(
+      /*cfe|analyzer|dart2js.List<int>()*/ /*dart2js:nnbd-sdk.List<int*>()*/ list2);
+  print(
+      /*cfe|analyzer|dart2js.List<int>(Int(42))*/ /*dart2js:nnbd-sdk.List<int*>(Int(42))*/ list3);
+  print(
+      /*cfe|analyzer|dart2js.List<int>(Int(42),Int(87))*/ /*dart2js:nnbd-sdk.List<int*>(Int(42),Int(87))*/ list4);
 }
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/map.dart b/pkg/_fe_analyzer_shared/test/constants/data/map.dart
index 88cf275..bb783c2 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/map.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/map.dart
@@ -17,8 +17,12 @@
 
 main() {
   print(/*Map<dynamic,dynamic>()*/ map0);
-  print(/*Map<String,int>()*/ map1);
-  print(/*Map<String,int>()*/ map2);
-  print(/*Map<String,int>(String(foo):Int(42))*/ map3);
-  print(/*Map<String,int>(String(foo):Int(42),String(bar):Int(87))*/ map4);
+  print(
+      /*cfe|analyzer|dart2js.Map<String,int>()*/ /*dart2js:nnbd-sdk.Map<String*,int*>()*/ map1);
+  print(
+      /*cfe|analyzer|dart2js.Map<String,int>()*/ /*dart2js:nnbd-sdk.Map<String*,int*>()*/ map2);
+  print(
+      /*cfe|analyzer|dart2js.Map<String,int>(String(foo):Int(42))*/ /*dart2js:nnbd-sdk.Map<String*,int*>(String(foo):Int(42))*/ map3);
+  print(
+      /*cfe|analyzer|dart2js.Map<String,int>(String(foo):Int(42),String(bar):Int(87))*/ /*dart2js:nnbd-sdk.Map<String*,int*>(String(foo):Int(42),String(bar):Int(87))*/ map4);
 }
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/marker.options b/pkg/_fe_analyzer_shared/test/constants/data/marker.options
index f713e63..98b58d7 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/marker.options
+++ b/pkg/_fe_analyzer_shared/test/constants/data/marker.options
@@ -1,3 +1,4 @@
 cfe=pkg/front_end/test/id_tests/constant_test.dart
 analyzer=pkg/analyzer/test/id_tests/constant_test.dart
-dart2js=tests/compiler/dart2js/model/cfe_constant_test.dart
\ No newline at end of file
+dart2js=tests/compiler/dart2js/model/cfe_constant_test.dart
+dart2js:nnbd-sdk=tests/compiler/dart2js/model/cfe_constant_test.dart
\ No newline at end of file
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/set.dart b/pkg/_fe_analyzer_shared/test/constants/data/set.dart
index 26ca6c3..bf567fe 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/set.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/set.dart
@@ -21,8 +21,12 @@
 
 main() {
   print(/*Set<dynamic>()*/ set0);
-  print(/*Set<int>()*/ set1);
-  print(/*Set<int>()*/ set2);
-  print(/*Set<int>(Int(42))*/ set3);
-  print(/*Set<int>(Int(42),Int(87))*/ set4);
+  print(
+      /*cfe|analyzer|dart2js.Set<int>()*/ /*dart2js:nnbd-sdk.Set<int*>()*/ set1);
+  print(
+      /*cfe|analyzer|dart2js.Set<int>()*/ /*dart2js:nnbd-sdk.Set<int*>()*/ set2);
+  print(
+      /*cfe|analyzer|dart2js.Set<int>(Int(42))*/ /*dart2js:nnbd-sdk.Set<int*>(Int(42))*/ set3);
+  print(
+      /*cfe|analyzer|dart2js.Set<int>(Int(42),Int(87))*/ /*dart2js:nnbd-sdk.Set<int*>(Int(42),Int(87))*/ set4);
 }
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart b/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart
index f729673..49a9d8f 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart
@@ -22,27 +22,27 @@
 main() {
   print(
       /*cfe|analyzer.TypeLiteral(dynamic Function())*/
-      /*dart2js.TypeLiteral(()->dynamic)*/
+      /*dart2js|dart2js:nnbd-sdk.TypeLiteral(()->dynamic)*/
       typedef);
 
   print(
       /*cfe|analyzer.TypeLiteral(void Function(dynamic))*/
-      /*dart2js.TypeLiteral((dynamic)->void)*/
+      /*dart2js|dart2js:nnbd-sdk.TypeLiteral((dynamic)->void)*/
       genericTypedef);
 
   print(
       /*cfe|analyzer.TypeLiteral(void Function<T>(T))*/
-      /*dart2js.TypeLiteral((0)->void)*/
+      /*dart2js|dart2js:nnbd-sdk.TypeLiteral((0)->void)*/
       genericFunctionTypedef);
 
   print(
       /*cfe|analyzer.TypeLiteral(void Function<T>(FutureOr<T>))*/
-      /*dart2js.TypeLiteral((FutureOr<0>)->void)*/
+      /*dart2js|dart2js:nnbd-sdk.TypeLiteral((FutureOr<0>)->void)*/
       typedefWithFutureOr);
 
   print(
       /*cfe|analyzer.TypeLiteral(FutureOr<dynamic>)*/
-      /*dart2js.TypeLiteral(dynamic)*/
+      /*dart2js|dart2js:nnbd-sdk.TypeLiteral(dynamic)*/
       futureOr);
 
   print(
diff --git a/pkg/analysis_server/.gitignore b/pkg/analysis_server/.gitignore
deleted file mode 100644
index ad1fe33..0000000
--- a/pkg/analysis_server/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-lib/src/edit/nnbd_migration/resources/*.js.deps
-lib/src/edit/nnbd_migration/resources/*.js.map
-lib/src/edit/nnbd_migration/resources/migration.js
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index f712b61..bcc76e2 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -26,7 +26,6 @@
 import 'package:analysis_server/src/domain_execution.dart';
 import 'package:analysis_server/src/domain_kythe.dart';
 import 'package:analysis_server/src/domain_server.dart';
-import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
 import 'package:analysis_server/src/domains/analysis/occurrences.dart';
 import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart';
 import 'package:analysis_server/src/edit/edit_domain.dart';
@@ -59,6 +58,7 @@
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
+import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
 import 'package:telemetry/crash_reporting.dart';
 import 'package:telemetry/telemetry.dart' as telemetry;
 import 'package:watcher/watcher.dart';
@@ -597,8 +597,6 @@
   }
 
   Future<void> _scheduleAnalysisImplementedNotification() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var files = analysisServices[AnalysisService.IMPLEMENTED];
     if (files != null) {
       scheduleImplementedNotification(this, files);
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 98f4efe..c7a9f65 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -47,10 +47,11 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/util/glob.dart';
+import 'package:nnbd_migration/api_for_analysis_server/driver_provider.dart';
 
 /// Implementations of [AbstractAnalysisServer] implement a server that listens
 /// on a [CommunicationChannel] for analysis messages and process them.
-abstract class AbstractAnalysisServer {
+abstract class AbstractAnalysisServer implements DriverProvider {
   /// The options of this server instance.
   AnalysisServerOptions options;
 
@@ -127,6 +128,7 @@
   ];
 
   /// The [ResourceProvider] using which paths are converted into [Resource]s.
+  @override
   final OverlayResourceProvider resourceProvider;
 
   /// The next modification stamp for a changed file in the [resourceProvider].
@@ -282,6 +284,10 @@
     return null;
   }
 
+  @override
+  AnalysisSession getAnalysisSession(String path) =>
+      getAnalysisDriver(path).currentSession;
+
   DartdocDirectiveInfo getDartdocDirectiveInfoFor(ResolvedUnitResult result) {
     return declarationsTracker
             ?.getContext(result.session.analysisContext)
@@ -293,8 +299,6 @@
   /// [offset] of the given [file], or with `null` if there is no node at the
   /// [offset] or the node does not have an element.
   Future<Element> getElementAtOffset(String file, int offset) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     if (!priorityFiles.contains(file)) {
       var driver = getAnalysisDriver(file);
       if (driver == null) {
@@ -342,8 +346,6 @@
   /// given [offset] of the given [file], or with `null` if there is no node as
   /// the [offset].
   Future<AstNode> getNodeAtOffset(String file, int offset) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = await getResolvedUnit(file);
     var unit = result?.unit;
     if (unit != null) {
diff --git a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
index 1684533..beb2d8e 100644
--- a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
@@ -49,8 +49,6 @@
 
   @override
   Future<Response> sendRequest(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var id = request.id;
     output.write(json.encode(request.toJson()) + '\n');
     return await responseStream
diff --git a/pkg/analysis_server/lib/src/cider/completion.dart b/pkg/analysis_server/lib/src/cider/completion.dart
index 2e32b66..d44effd 100644
--- a/pkg/analysis_server/lib/src/cider/completion.dart
+++ b/pkg/analysis_server/lib/src/cider/completion.dart
@@ -9,11 +9,13 @@
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
+import 'package:analysis_server/src/services/completion/filtering/fuzzy_matcher.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart' show LibraryElement;
-import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
+import 'package:analyzer/src/test_utilities/function_ast_visitor.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:meta/meta.dart';
 
@@ -23,6 +25,7 @@
 /// example types and elements.
 class CiderCompletionCache {
   final Map<String, _CiderImportedLibrarySuggestions> _importedLibraries = {};
+  _LastCompletionResult _lastResult;
 }
 
 class CiderCompletionComputer {
@@ -31,22 +34,26 @@
   final FileResolver _fileResolver;
 
   DartCompletionRequestImpl _dartCompletionRequest;
-  final List<String> _computedImportedLibraries = [];
+
+  /// Paths of imported libraries for which suggestions were (re)computed
+  /// during processing of this request. Does not include libraries that were
+  /// processed during previous requests, and reused from the cache now.
+  @visibleForTesting
+  final List<String> computedImportedLibraries = [];
 
   CiderCompletionComputer(this._logger, this._cache, this._fileResolver);
 
   @deprecated
   Future<List<CompletionSuggestion>> compute(String path, int offset) async {
-    var file = _fileResolver.resourceProvider.getFile(path);
-    var content = file.readAsStringSync();
+    var fileContext = _fileResolver.getFileContext(path);
+    var file = fileContext.file;
 
-    var lineInfo = LineInfo.fromContent(content);
-    var location = lineInfo.getLocation(offset);
+    var location = file.lineInfo.getLocation(offset);
 
     var result = await compute2(
       path: path,
       line: location.lineNumber - 1,
-      character: location.columnNumber - 1,
+      column: location.columnNumber - 1,
     );
 
     return result.suggestions;
@@ -58,20 +65,37 @@
   ///
   /// The content of the file has already been updated.
   ///
-  /// The [line] and [character] are zero based.
+  /// The [line] and [column] are zero based.
   Future<CiderCompletionResult> compute2({
     @required String path,
     @required int line,
-    @required int character,
+    @required int column,
   }) async {
-    var file = _fileResolver.resourceProvider.getFile(path);
-    var content = file.readAsStringSync();
+    var fileContext = _logger.run('Get file $path', () {
+      return _fileResolver.getFileContext(path);
+    });
+
+    var file = fileContext.file;
+
+    var resolvedSignature = _logger.run('Get signature', () {
+      return file.resolvedSignature;
+    });
+
+    var lineInfo = file.lineInfo;
+    var offset = lineInfo.getOffsetOfLine(line) + column;
+
+    // If the same file, in the same state as the last time, reuse the result.
+    var lastResult = _cache._lastResult;
+    if (lastResult != null &&
+        lastResult.path == path &&
+        lastResult.signature == resolvedSignature &&
+        lastResult.offset == offset) {
+      _logger.writeln('Use the last completion result.');
+      return lastResult.result;
+    }
 
     var resolvedUnit = _fileResolver.resolve(path);
 
-    var lineInfo = LineInfo.fromContent(content);
-    var offset = lineInfo.getOffsetOfLine(line) + character;
-
     var completionRequest = CompletionRequestImpl(
       resolvedUnit,
       offset,
@@ -100,18 +124,29 @@
       dartdocDirectiveInfo,
     );
 
-    _logger.run('Add imported suggestions', () {
-      suggestions.addAll(
-        _importedLibrariesSuggestions(
-          resolvedUnit.libraryElement,
-        ),
-      );
+    if (_dartCompletionRequest.includeIdentifiers) {
+      _logger.run('Add imported suggestions', () {
+        suggestions.addAll(
+          _importedLibrariesSuggestions(
+            resolvedUnit.libraryElement,
+          ),
+        );
+      });
+    }
+
+    _logger.run('Filter suggestions', () {
+      suggestions = _FilterSort(
+        _dartCompletionRequest,
+        suggestions,
+      ).perform();
     });
 
-    return CiderCompletionResult._(
-      suggestions,
-      _computedImportedLibraries,
-    );
+    var result = CiderCompletionResult._(suggestions);
+
+    _cache._lastResult =
+        _LastCompletionResult(path, resolvedSignature, offset, result);
+
+    return result;
   }
 
   /// Return suggestions from libraries imported into the [target].
@@ -139,7 +174,7 @@
 
     var cacheEntry = _cache._importedLibraries[path];
     if (cacheEntry == null || cacheEntry.signature != signature) {
-      _computedImportedLibraries.add(path);
+      computedImportedLibraries.add(path);
       var suggestions = _librarySuggestions(element);
       cacheEntry = _CiderImportedLibrarySuggestions(
         signature,
@@ -165,16 +200,7 @@
 class CiderCompletionResult {
   final List<CompletionSuggestion> suggestions;
 
-  /// Paths of imported libraries for which suggestions were (re)computed
-  /// during processing of this request. Does not include libraries that were
-  /// processed during previous requests, and reused from the cache now.
-  @visibleForTesting
-  final List<String> computedImportedLibraries;
-
-  CiderCompletionResult._(
-    this.suggestions,
-    this.computedImportedLibraries,
-  );
+  CiderCompletionResult._(this.suggestions);
 }
 
 class _CiderImportedLibrarySuggestions {
@@ -183,3 +209,80 @@
 
   _CiderImportedLibrarySuggestions(this.signature, this.suggestions);
 }
+
+class _FilterSort {
+  final DartCompletionRequestImpl _request;
+  final List<CompletionSuggestion> _suggestions;
+
+  FuzzyMatcher _matcher;
+
+  _FilterSort(this._request, this._suggestions);
+
+  List<CompletionSuggestion> perform() {
+    var pattern = _matchingPattern();
+    _matcher = FuzzyMatcher(pattern, matchStyle: MatchStyle.SYMBOL);
+
+    var scored = _suggestions
+        .map((e) => _FuzzyScoredSuggestion(e, _score(e)))
+        .where((e) => e.score > 0)
+        .toList();
+
+    scored.sort((a, b) {
+      // Prefer what the user requested by typing.
+      if (a.score > b.score) {
+        return -1;
+      } else if (a.score < b.score) {
+        return 1;
+      }
+
+      // Then prefer what is more relevant in the context.
+      if (a.suggestion.relevance != b.suggestion.relevance) {
+        return -(a.suggestion.relevance - b.suggestion.relevance);
+      }
+
+      // Other things being equal, sort by name.
+      return a.suggestion.completion.compareTo(b.suggestion.completion);
+    });
+
+    return scored.map((e) => e.suggestion).toList();
+  }
+
+  /// Return the pattern to match suggestions against, from the identifier
+  /// to the left of the caret. Return the empty string if cannot find the
+  /// identifier.
+  String _matchingPattern() {
+    SimpleIdentifier patternNode;
+    _request.target.containingNode.accept(
+      FunctionAstVisitor(simpleIdentifier: (node) {
+        if (node.end == _request.offset) {
+          patternNode = node;
+        }
+      }),
+    );
+
+    if (patternNode != null) {
+      return patternNode.name;
+    }
+
+    return '';
+  }
+
+  double _score(CompletionSuggestion e) => _matcher.score(e.completion);
+}
+
+/// [CompletionSuggestion] scored using [FuzzyMatcher].
+class _FuzzyScoredSuggestion {
+  final CompletionSuggestion suggestion;
+  final double score;
+
+  _FuzzyScoredSuggestion(this.suggestion, this.score);
+}
+
+class _LastCompletionResult {
+  final String path;
+  final String signature;
+  final int offset;
+  final CiderCompletionResult result;
+
+  _LastCompletionResult(this.path, this.signature, this.offset, this.result);
+}
diff --git a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
index 0bab64a..6383a22 100644
--- a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
@@ -38,8 +38,6 @@
   /// imported into the library at the given [path].
   Future<SourceChange> createEdits(
       List<ImportedElements> importedElementsList) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var filteredImportedElements =
         _filterImportedElements(importedElementsList);
     var libraryElement = libraryResult.libraryElement;
diff --git a/pkg/analysis_server/lib/src/computer/new_notifications.dart b/pkg/analysis_server/lib/src/computer/new_notifications.dart
index 31f80848..e44abed 100644
--- a/pkg/analysis_server/lib/src/computer/new_notifications.dart
+++ b/pkg/analysis_server/lib/src/computer/new_notifications.dart
@@ -4,12 +4,12 @@
 
 import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
 import 'package:analysis_server/src/analysis_server.dart' show AnalysisServer;
-import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
 import 'package:analysis_server/src/domains/analysis/occurrences.dart';
 import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
+import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
 
 void new_sendDartNotificationNavigation(
     AnalysisServer analysisServer, ResolvedUnitResult result) {
diff --git a/pkg/analysis_server/lib/src/domain_abstract.dart b/pkg/analysis_server/lib/src/domain_abstract.dart
index fc0b989..a2c28e2 100644
--- a/pkg/analysis_server/lib/src/domain_abstract.dart
+++ b/pkg/analysis_server/lib/src/domain_abstract.dart
@@ -43,8 +43,6 @@
       Map<PluginInfo, Future<plugin.Response>> futures,
       {plugin.RequestParams requestParameters,
       int timeout = 500}) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     // TODO(brianwilkerson) requestParameters might need to be required.
     var endTime = DateTime.now().millisecondsSinceEpoch + timeout;
     var responses = <plugin.Response>[];
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 6351adc..f6b02a4 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -11,7 +11,6 @@
 import 'package:analysis_server/src/computer/computer_signature.dart';
 import 'package:analysis_server/src/computer/imported_elements_computer.dart';
 import 'package:analysis_server/src/domain_abstract.dart';
-import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
 import 'package:analysis_server/src/plugin/request_converter.dart';
 import 'package:analysis_server/src/plugin/result_merger.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
@@ -24,6 +23,7 @@
 import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
+import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
 
 // TODO(devoncarew): See #31456 for the tracking issue to remove this flag.
 final bool disableManageImportsOnPaste = true;
@@ -57,8 +57,6 @@
 
   /// Implement the `analysis.getHover` request.
   Future<void> getHover(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params = AnalysisGetHoverParams.fromRequest(request);
     var file = params.file;
 
@@ -87,8 +85,6 @@
 
   /// Implement the `analysis.getImportedElements` request.
   Future<void> getImportedElements(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params = AnalysisGetImportedElementsParams.fromRequest(request);
     var file = params.file;
 
@@ -147,8 +143,6 @@
 
   /// Implement the `analysis.getNavigation` request.
   Future<void> getNavigation(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params = AnalysisGetNavigationParams.fromRequest(request);
     var file = params.file;
     var offset = params.offset;
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 1527b5b..d9ffaca 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -69,8 +69,6 @@
     Set<String> includedElementNames,
     List<IncludedSuggestionRelevanceTag> includedSuggestionRelevanceTags,
   ) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     //
     // Allow plugins to start computing fixes.
     //
diff --git a/pkg/analysis_server/lib/src/domain_diagnostic.dart b/pkg/analysis_server/lib/src/domain_diagnostic.dart
index a7faff3..f095fba 100644
--- a/pkg/analysis_server/lib/src/domain_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/domain_diagnostic.dart
@@ -37,8 +37,6 @@
 
   /// Answer the `diagnostic.getServerPort` request.
   Future handleGetServerPort(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     try {
       // Open a port (or return the existing one).
       var port = await server.diagnosticServer.getServerPort();
diff --git a/pkg/analysis_server/lib/src/domain_execution.dart b/pkg/analysis_server/lib/src/domain_execution.dart
index c22eec5..2e75ddd 100644
--- a/pkg/analysis_server/lib/src/domain_execution.dart
+++ b/pkg/analysis_server/lib/src/domain_execution.dart
@@ -46,8 +46,6 @@
 
   /// Implement the 'execution.getSuggestions' request.
   void getSuggestions(Request request) async {
-//    // TODO(brianwilkerson) Determine whether this await is necessary.
-//    await null;
 //    var params = new ExecutionGetSuggestionsParams.fromRequest(request);
 //    var computer = new RuntimeCompletionComputer(
 //        server.resourceProvider,
diff --git a/pkg/analysis_server/lib/src/domain_kythe.dart b/pkg/analysis_server/lib/src/domain_kythe.dart
index 357e1ae..2937a4d 100644
--- a/pkg/analysis_server/lib/src/domain_kythe.dart
+++ b/pkg/analysis_server/lib/src/domain_kythe.dart
@@ -28,8 +28,6 @@
 
   /// Implement the `kythe.getKytheEntries` request.
   Future<void> getKytheEntries(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var file = KytheGetKytheEntriesParams.fromRequest(request).file;
     var driver = server.getAnalysisDriver(file);
     if (driver == null) {
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index 55439af..35b320a 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -44,8 +44,6 @@
       this.expressions);
 
   Future<RuntimeCompletionResult> compute() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var contextResult = await analysisDriver.getResult(contextPath);
     var session = contextResult.session;
 
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 316164d..862fd83 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -165,8 +165,6 @@
   }
 
   Future getAssists(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params = EditGetAssistsParams.fromRequest(request);
     var file = params.file;
     var offset = params.offset;
@@ -287,8 +285,6 @@
   }
 
   Future getPostfixCompletion(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     server.options.analytics?.sendEvent('edit', 'getPostfixCompletion');
 
     var params = EditGetPostfixCompletionParams.fromRequest(request);
@@ -319,9 +315,6 @@
   }
 
   Future getStatementCompletion(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-
     var params = EditGetStatementCompletionParams.fromRequest(request);
     var file = params.file;
 
@@ -396,9 +389,6 @@
 
   /// Implement the `edit.importElements` request.
   Future<void> importElements(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-
     var params = EditImportElementsParams.fromRequest(request);
     var file = params.file;
 
@@ -437,8 +427,6 @@
   }
 
   Future isPostfixCompletionApplicable(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params = EditGetPostfixCompletionParams.fromRequest(request);
     var file = params.file;
 
@@ -475,8 +463,6 @@
   }
 
   Future<void> organizeDirectives(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     server.options.analytics?.sendEvent('edit', 'organizeDirectives');
 
     var params = EditOrganizeDirectivesParams.fromRequest(request);
@@ -516,8 +502,6 @@
   }
 
   Future<void> sortMembers(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params = EditSortMembersParams.fromRequest(request);
     var file = params.file;
 
@@ -922,8 +906,6 @@
     }
 
     runZonedGuarded(() async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
       await _init(params.kind, file, params.offset, params.length);
       if (initStatus.hasFatalError) {
         feedback = null;
@@ -1013,8 +995,6 @@
   /// parameters. The existing [Refactoring] is reused or created as needed.
   Future _init(
       RefactoringKind kind, String file, int offset, int length) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     // check if we can continue with the existing Refactoring instance
     if (this.kind == kind &&
         this.file == file &&
diff --git a/pkg/analysis_server/lib/src/edit/fix/dartfix_listener.dart b/pkg/analysis_server/lib/src/edit/fix/dartfix_listener.dart
index a711888..ca028f7 100644
--- a/pkg/analysis_server/lib/src/edit/fix/dartfix_listener.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/dartfix_listener.dart
@@ -8,13 +8,17 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show Location, SourceChange, SourceEdit, SourceFileEdit;
+import 'package:nnbd_migration/api_for_analysis_server/dartfix_listener_interface.dart';
 
 /// Tasks use this API to report results.
-class DartFixListener {
+class DartFixListener implements DartFixListenerInterface {
+  @override
   final AnalysisServer server;
 
   final List<DartFixSuggestion> suggestions = <DartFixSuggestion>[];
   final List<DartFixSuggestion> otherSuggestions = <DartFixSuggestion>[];
+
+  @override
   final SourceChange sourceChange = SourceChange('dartfix');
 
   /// The details to be returned to the client.
@@ -24,6 +28,7 @@
 
   /// Add the given [detail] to the list of details to be returned to the
   /// client.
+  @override
   void addDetail(String detail) {
     if (details.length < 200) {
       details.add(detail);
@@ -34,11 +39,13 @@
   ///
   /// The associated suggestion should be separately added by calling
   /// [addSuggestion].
+  @override
   void addEditWithoutSuggestion(Source source, SourceEdit edit) {
     sourceChange.addEdit(source.fullName, -1, edit);
   }
 
   /// Record a recommendation to be sent to the client.
+  @override
   void addRecommendation(String description, [Location location]) {
     otherSuggestions.add(DartFixSuggestion(description, location: location));
   }
@@ -64,6 +71,7 @@
   }
 
   /// Record a source change to be sent to the client.
+  @override
   void addSourceFileEdit(
       String description, Location location, SourceFileEdit fileEdit) {
     suggestions.add(DartFixSuggestion(description, location: location));
@@ -76,6 +84,7 @@
   ///
   /// The associated edits should be separately added by calling
   /// [addEditWithoutRecommendation].
+  @override
   void addSuggestion(String description, Location location) {
     suggestions.add(DartFixSuggestion(description, location: location));
   }
diff --git a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
index 3a695592..89432f8 100644
--- a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
@@ -6,16 +6,17 @@
 import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
 import 'package:analysis_server/src/edit/fix/dartfix_registrar.dart';
 import 'package:analysis_server/src/edit/fix/fix_code_task.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_listener.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/migration_state.dart';
-import 'package:analysis_server/src/edit/preview/http_preview_server.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:charcode/charcode.dart';
-import 'package:nnbd_migration/nnbd_migration.dart';
+import 'package:nnbd_migration/api_for_analysis_server/dartfix_listener_interface.dart';
+import 'package:nnbd_migration/api_for_analysis_server/http_preview_server.dart';
+import 'package:nnbd_migration/api_for_analysis_server/instrumentation_listener.dart';
+import 'package:nnbd_migration/api_for_analysis_server/migration_state.dart';
+import 'package:nnbd_migration/api_for_analysis_server/nnbd_migration.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:source_span/source_span.dart';
 import 'package:yaml/yaml.dart';
@@ -37,7 +38,7 @@
 
   final int preferredPort;
 
-  final DartFixListener listener;
+  final DartFixListenerInterface listener;
 
   /// The root of the included paths.
   ///
@@ -47,7 +48,7 @@
   final String includedRoot;
 
   /// The HTTP server that serves the preview tool.
-  HttpPreviewServer server;
+  HttpPreviewServer _server;
 
   /// The port on which preview pages should be served, or `null` if no preview
   /// server should be started.
@@ -92,14 +93,14 @@
   @override
   Future<void> finish() async {
     final state = MigrationState(
-        migration, includedRoot, listener, instrumentationListener, adapter);
+        migration, includedRoot, listener, instrumentationListener);
     await state.refresh();
 
-    if (server == null) {
-      server = HttpPreviewServer(state, rerun, preferredPort);
-      server.serveHttp();
-      port = await server.boundPort;
-      authToken = await server.authToken;
+    if (_server == null) {
+      _server = HttpPreviewServer(state, rerun, preferredPort);
+      _server.serveHttp();
+      port = await _server.boundPort;
+      authToken = await _server.authToken;
     }
   }
 
@@ -240,7 +241,7 @@
     reset();
     await rerunFunction(changedPaths);
     final state = MigrationState(
-        migration, includedRoot, listener, instrumentationListener, adapter);
+        migration, includedRoot, listener, instrumentationListener);
     await state.refresh();
     return state;
   }
@@ -253,6 +254,10 @@
         instrumentation: instrumentationListener);
   }
 
+  void shutdownServer() {
+    _server?.close();
+  }
+
   static void task(DartFixRegistrar registrar, DartFixListener listener,
       EditDartfixParams params) {
     registrar.registerCodeTask(NonNullableFix(listener,
@@ -290,7 +295,7 @@
 }
 
 class NullabilityMigrationAdapter implements NullabilityMigrationListener {
-  final DartFixListener listener;
+  final DartFixListenerInterface listener;
 
   NullabilityMigrationAdapter(this.listener);
 
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
deleted file mode 100644
index fa4b09e..0000000
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
+++ /dev/null
@@ -1,4839 +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.
-
-// This file is generated; don't edit it directly.
-//
-// See pkg/analysis_server/tool/nnbd_migration/generate_resources.dart for how
-// to edit the source content and for re-generation instructions.
-
-import 'dart:convert' as convert;
-
-String get highlight_css {
-  return _highlight_css ??= _decode(_highlight_css_base64);
-}
-
-String get highlight_pack_js {
-  return _highlight_pack_js ??= _decode(_highlight_pack_js_base64);
-}
-
-String get index_html {
-  return _index_html ??= _decode(_index_html_base64);
-}
-
-String get migration_css {
-  return _migration_css ??= _decode(_migration_css_base64);
-}
-
-String get migration_js {
-  return _migration_js ??= _decode(_migration_js_base64);
-}
-
-String _decode(String data) {
-  data = data.replaceAll('\n', '').trim();
-  return String.fromCharCodes(convert.base64Decode(data));
-}
-
-String _highlight_css;
-// highlight_css md5 is 'fb012626bafd286510d32da815dae448'
-String _highlight_css_base64 = '''
-LyoKRGF0ZTogMjQgRmV2IDIwMTUKQXV0aG9yOiBQZWRybyBPbGl2ZWlyYSA8a2FueXR1QGdtYWlsIC4g
-Y29tPgoqLwoKLmhsanMgewogIGNvbG9yOiAjYTliN2M2OwogIGJhY2tncm91bmQ6ICMyODJiMmU7CiAg
-ZGlzcGxheTogYmxvY2s7CiAgb3ZlcmZsb3cteDogYXV0bzsKICBwYWRkaW5nOiAwLjVlbTsKfQoKLmhs
-anMtbnVtYmVyLAouaGxqcy1saXRlcmFsLAouaGxqcy1zeW1ib2wsCi5obGpzLWJ1bGxldCB7CiAgY29s
-b3I6ICM2ODk3QkI7Cn0KCi5obGpzLWtleXdvcmQsCi5obGpzLXNlbGVjdG9yLXRhZywKLmhsanMtZGVs
-ZXRpb24gewogIGNvbG9yOiAjY2M3ODMyOwp9CgouaGxqcy12YXJpYWJsZSwKLmhsanMtdGVtcGxhdGUt
-dmFyaWFibGUsCi5obGpzLWxpbmsgewogIGNvbG9yOiAjNjI5NzU1Owp9CgouaGxqcy1jb21tZW50LAou
-aGxqcy1xdW90ZSB7CiAgY29sb3I6ICM4MDgwODA7Cn0KCi5obGpzLW1ldGEgewogIGNvbG9yOiAjYmJi
-NTI5Owp9CgouaGxqcy1zdHJpbmcsCi5obGpzLWF0dHJpYnV0ZSwKLmhsanMtYWRkaXRpb24gewogIGNv
-bG9yOiAjNkE4NzU5Owp9CgouaGxqcy1zZWN0aW9uLAouaGxqcy10aXRsZSwKLmhsanMtdHlwZSB7CiAg
-Y29sb3I6ICNmZmM2NmQ7Cn0KCi5obGpzLW5hbWUsCi5obGpzLXNlbGVjdG9yLWlkLAouaGxqcy1zZWxl
-Y3Rvci1jbGFzcyB7CiAgY29sb3I6ICNlOGJmNmE7Cn0KCi5obGpzLWVtcGhhc2lzIHsKICBmb250LXN0
-eWxlOiBpdGFsaWM7Cn0KCi5obGpzLXN0cm9uZyB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0K
-''';
-
-String _highlight_pack_js;
-// highlight_pack_js md5 is '9104bfe8b056f8e00da50b0ea3d6e6d4'
-String _highlight_pack_js_base64 = '''
-LyohIGhpZ2hsaWdodC5qcyB2OS4xNS4xMCB8IEJTRDMgTGljZW5zZSB8IGdpdC5pby9obGpzbGljZW5z
-ZSAqLwohZnVuY3Rpb24oZSl7dmFyIG49Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvd3x8Im9i
-amVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmOyJ1bmRlZmluZWQiPT10eXBlb2YgZXhwb3J0c3x8ZXhwb3J0
-cy5ub2RlVHlwZT9uJiYobi5obGpzPWUoe30pLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmlu
-ZS5hbWQmJmRlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBuLmhsanN9KSk6ZShleHBvcnRzKX0oZnVu
-Y3Rpb24oYSl7dmFyIGY9W10sdT1PYmplY3Qua2V5cyxOPXt9LGM9e30sbj0vXihuby0/aGlnaGxpZ2h0
-fHBsYWlufHRleHQpJC9pLHM9L1xibGFuZyg/OnVhZ2UpPy0oW1x3LV0rKVxiL2ksdD0vKCheKDxbXj5d
-Kz58XHR8KSt8KD86XG4pKSkvZ20scj17Y2FzZV9pbnNlbnNpdGl2ZToiY0kiLGxleGVtZXM6ImwiLGNv
-bnRhaW5zOiJjIixrZXl3b3JkczoiayIsc3ViTGFuZ3VhZ2U6InNMIixjbGFzc05hbWU6ImNOIixiZWdp
-bjoiYiIsYmVnaW5LZXl3b3JkczoiYksiLGVuZDoiZSIsZW5kc1dpdGhQYXJlbnQ6ImVXIixpbGxlZ2Fs
-OiJpIixleGNsdWRlQmVnaW46ImVCIixleGNsdWRlRW5kOiJlRSIscmV0dXJuQmVnaW46InJCIixyZXR1
-cm5FbmQ6InJFIixyZWxldmFuY2U6InIiLHZhcmlhbnRzOiJ2IixJREVOVF9SRToiSVIiLFVOREVSU0NP
-UkVfSURFTlRfUkU6IlVJUiIsTlVNQkVSX1JFOiJOUiIsQ19OVU1CRVJfUkU6IkNOUiIsQklOQVJZX05V
-TUJFUl9SRToiQk5SIixSRV9TVEFSVEVSU19SRToiUlNSIixCQUNLU0xBU0hfRVNDQVBFOiJCRSIsQVBP
-U19TVFJJTkdfTU9ERToiQVNNIixRVU9URV9TVFJJTkdfTU9ERToiUVNNIixQSFJBU0FMX1dPUkRTX01P
-REU6IlBXTSIsQ19MSU5FX0NPTU1FTlRfTU9ERToiQ0xDTSIsQ19CTE9DS19DT01NRU5UX01PREU6IkNC
-Q00iLEhBU0hfQ09NTUVOVF9NT0RFOiJIQ00iLE5VTUJFUl9NT0RFOiJOTSIsQ19OVU1CRVJfTU9ERToi
-Q05NIixCSU5BUllfTlVNQkVSX01PREU6IkJOTSIsQ1NTX05VTUJFUl9NT0RFOiJDU1NOTSIsUkVHRVhQ
-X01PREU6IlJNIixUSVRMRV9NT0RFOiJUTSIsVU5ERVJTQ09SRV9USVRMRV9NT0RFOiJVVE0iLENPTU1F
-TlQ6IkMiLGJlZ2luUmU6ImJSIixlbmRSZToiZVIiLGlsbGVnYWxSZToiaVIiLGxleGVtZXNSZToibFIi
-LHRlcm1pbmF0b3JzOiJ0Iix0ZXJtaW5hdG9yX2VuZDoidEUifSxiPSI8L3NwYW4+IixoPXtjbGFzc1By
-ZWZpeDoiaGxqcy0iLHRhYlJlcGxhY2U6bnVsbCx1c2VCUjohMSxsYW5ndWFnZXM6dm9pZCAwfTtmdW5j
-dGlvbiBfKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsi
-KS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiBFKGUpe3JldHVybiBlLm5vZGVOYW1lLnRvTG93
-ZXJDYXNlKCl9ZnVuY3Rpb24gdihlLG4pe3ZhciB0PWUmJmUuZXhlYyhuKTtyZXR1cm4gdCYmMD09PXQu
-aW5kZXh9ZnVuY3Rpb24gbChlKXtyZXR1cm4gbi50ZXN0KGUpfWZ1bmN0aW9uIGcoZSl7dmFyIG4sdD17
-fSxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtmb3IobiBpbiBlKXRbbl09
-ZVtuXTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZvcihuIGluIGUpdFtuXT1lW25dfSksdH1m
-dW5jdGlvbiBSKGUpe3ZhciBhPVtdO3JldHVybiBmdW5jdGlvbiBlKG4sdCl7Zm9yKHZhciByPW4uZmly
-c3RDaGlsZDtyO3I9ci5uZXh0U2libGluZykzPT09ci5ub2RlVHlwZT90Kz1yLm5vZGVWYWx1ZS5sZW5n
-dGg6MT09PXIubm9kZVR5cGUmJihhLnB1c2goe2V2ZW50OiJzdGFydCIsb2Zmc2V0OnQsbm9kZTpyfSks
-dD1lKHIsdCksRShyKS5tYXRjaCgvYnJ8aHJ8aW1nfGlucHV0Lyl8fGEucHVzaCh7ZXZlbnQ6InN0b3Ai
-LG9mZnNldDp0LG5vZGU6cn0pKTtyZXR1cm4gdH0oZSwwKSxhfWZ1bmN0aW9uIGkoZSl7aWYociYmIWUu
-bGFuZ0FwaVJlc3RvcmVkKXtmb3IodmFyIG4gaW4gZS5sYW5nQXBpUmVzdG9yZWQ9ITAscillW25dJiYo
-ZVtyW25dXT1lW25dKTsoZS5jfHxbXSkuY29uY2F0KGUudnx8W10pLmZvckVhY2goaSl9fWZ1bmN0aW9u
-IG0obyl7ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZSYmZS5zb3VyY2V8fGV9ZnVuY3Rpb24gYyhlLG4pe3Jl
-dHVybiBuZXcgUmVnRXhwKHMoZSksIm0iKyhvLmNJPyJpIjoiIikrKG4/ImciOiIiKSl9IWZ1bmN0aW9u
-IG4odCxlKXtpZighdC5jb21waWxlZCl7aWYodC5jb21waWxlZD0hMCx0Lms9dC5rfHx0LmJLLHQuayl7
-ZnVuY3Rpb24gcih0LGUpe28uY0kmJihlPWUudG9Mb3dlckNhc2UoKSksZS5zcGxpdCgiICIpLmZvckVh
-Y2goZnVuY3Rpb24oZSl7dmFyIG49ZS5zcGxpdCgifCIpO2FbblswXV09W3QsblsxXT9OdW1iZXIoblsx
-XSk6MV19KX12YXIgYT17fTsic3RyaW5nIj09dHlwZW9mIHQuaz9yKCJrZXl3b3JkIix0LmspOnUodC5r
-KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IoZSx0LmtbZV0pfSksdC5rPWF9dC5sUj1jKHQubHx8L1x3Ky8s
-ITApLGUmJih0LmJLJiYodC5iPSJcXGIoIit0LmJLLnNwbGl0KCIgIikuam9pbigifCIpKyIpXFxiIiks
-dC5ifHwodC5iPS9cQnxcYi8pLHQuYlI9Yyh0LmIpLHQuZW5kU2FtZUFzQmVnaW4mJih0LmU9dC5iKSx0
-LmV8fHQuZVd8fCh0LmU9L1xCfFxiLyksdC5lJiYodC5lUj1jKHQuZSkpLHQudEU9cyh0LmUpfHwiIix0
-LmVXJiZlLnRFJiYodC50RSs9KHQuZT8ifCI6IiIpK2UudEUpKSx0LmkmJih0LmlSPWModC5pKSksbnVs
-bD09dC5yJiYodC5yPTEpLHQuY3x8KHQuYz1bXSksdC5jPUFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBw
-bHkoW10sdC5jLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4udiYmIW4u
-Y2FjaGVkX3ZhcmlhbnRzJiYobi5jYWNoZWRfdmFyaWFudHM9bi52Lm1hcChmdW5jdGlvbihlKXtyZXR1
-cm4gZyhuLHt2Om51bGx9LGUpfSkpLG4uY2FjaGVkX3ZhcmlhbnRzfHxuLmVXJiZbZyhuKV18fFtuXX0o
-InNlbGYiPT09ZT90OmUpfSkpLHQuYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe24oZSx0KX0pLHQuc3RhcnRz
-JiZuKHQuc3RhcnRzLGUpO3ZhciBpPXQuYy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYks/IlxcLj8o
-PzoiK2UuYisiKVxcLj8iOmUuYn0pLmNvbmNhdChbdC50RSx0LmldKS5tYXAocykuZmlsdGVyKEJvb2xl
-YW4pO3QudD1pLmxlbmd0aD9jKGZ1bmN0aW9uKGUsbil7Zm9yKHZhciB0PS9cWyg/OlteXFxcXV18XFwu
-KSpcXXxcKFw/P3xcXChbMS05XVswLTldKil8XFwuLyxyPTAsYT0iIixpPTA7aTxlLmxlbmd0aDtpKysp
-e3ZhciBvPXIsYz1zKGVbaV0pO2ZvcigwPGkmJihhKz1uKTswPGMubGVuZ3RoOyl7dmFyIHU9dC5leGVj
-KGMpO2lmKG51bGw9PXUpe2ErPWM7YnJlYWt9YSs9Yy5zdWJzdHJpbmcoMCx1LmluZGV4KSxjPWMuc3Vi
-c3RyaW5nKHUuaW5kZXgrdVswXS5sZW5ndGgpLCJcXCI9PXVbMF1bMF0mJnVbMV0/YSs9IlxcIitTdHJp
-bmcoTnVtYmVyKHVbMV0pK28pOihhKz11WzBdLCIoIj09dVswXSYmcisrKX19cmV0dXJuIGF9KGksInwi
-KSwhMCk6e2V4ZWM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19fX0obyl9ZnVuY3Rpb24gQyhlLG4saSx0
-KXtmdW5jdGlvbiBjKGUsbix0LHIpe3ZhciBhPSc8c3BhbiBjbGFzcz0iJysocj8iIjpoLmNsYXNzUHJl
-Zml4KTtyZXR1cm4gZT8oYSs9ZSsnIj4nKStuKyh0PyIiOmIpOm59ZnVuY3Rpb24gbygpe0UrPW51bGwh
-PWwuc0w/ZnVuY3Rpb24oKXt2YXIgZT0ic3RyaW5nIj09dHlwZW9mIGwuc0w7aWYoZSYmIU5bbC5zTF0p
-cmV0dXJuIF8oZyk7dmFyIG49ZT9DKGwuc0wsZywhMCxmW2wuc0xdKTpPKGcsbC5zTC5sZW5ndGg/bC5z
-TDp2b2lkIDApO3JldHVybiAwPGwuciYmKFIrPW4uciksZSYmKGZbbC5zTF09bi50b3ApLGMobi5sYW5n
-dWFnZSxuLnZhbHVlLCExLCEwKX0oKTpmdW5jdGlvbigpe3ZhciBlLG4sdCxyLGEsaSxvO2lmKCFsLmsp
-cmV0dXJuIF8oZyk7Zm9yKHI9IiIsbj0wLGwubFIubGFzdEluZGV4PTAsdD1sLmxSLmV4ZWMoZyk7dDsp
-cis9XyhnLnN1YnN0cmluZyhuLHQuaW5kZXgpKSxhPWwsaT10LHZvaWQgMCxvPXMuY0k/aVswXS50b0xv
-d2VyQ2FzZSgpOmlbMF0sKGU9YS5rLmhhc093blByb3BlcnR5KG8pJiZhLmtbb10pPyhSKz1lWzFdLHIr
-PWMoZVswXSxfKHRbMF0pKSk6cis9Xyh0WzBdKSxuPWwubFIubGFzdEluZGV4LHQ9bC5sUi5leGVjKGcp
-O3JldHVybiByK18oZy5zdWJzdHIobikpfSgpLGc9IiJ9ZnVuY3Rpb24gdShlKXtFKz1lLmNOP2MoZS5j
-TiwiIiwhMCk6IiIsbD1PYmplY3QuY3JlYXRlKGUse3BhcmVudDp7dmFsdWU6bH19KX1mdW5jdGlvbiBy
-KGUsbil7aWYoZys9ZSxudWxsPT1uKXJldHVybiBvKCksMDt2YXIgdD1mdW5jdGlvbihlLG4pe3ZhciB0
-LHIsYTtmb3IodD0wLHI9bi5jLmxlbmd0aDt0PHI7dCsrKWlmKHYobi5jW3RdLmJSLGUpKXJldHVybiBu
-LmNbdF0uZW5kU2FtZUFzQmVnaW4mJihuLmNbdF0uZVI9KGE9bi5jW3RdLmJSLmV4ZWMoZSlbMF0sbmV3
-IFJlZ0V4cChhLnJlcGxhY2UoL1stXC9cXF4kKis/LigpfFtcXXt9XS9nLCJcXCQmIiksIm0iKSkpLG4u
-Y1t0XX0obixsKTtpZih0KXJldHVybiB0LnNraXA/Zys9bjoodC5lQiYmKGcrPW4pLG8oKSx0LnJCfHx0
-LmVCfHwoZz1uKSksdSh0KSx0LnJCPzA6bi5sZW5ndGg7dmFyIHI9ZnVuY3Rpb24gZShuLHQpe2lmKHYo
-bi5lUix0KSl7Zm9yKDtuLmVuZHNQYXJlbnQmJm4ucGFyZW50OyluPW4ucGFyZW50O3JldHVybiBufWlm
-KG4uZVcpcmV0dXJuIGUobi5wYXJlbnQsdCl9KGwsbik7aWYocil7dmFyIGE9bDtmb3IoYS5za2lwP2cr
-PW46KGEuckV8fGEuZUV8fChnKz1uKSxvKCksYS5lRSYmKGc9bikpO2wuY04mJihFKz1iKSxsLnNraXB8
-fGwuc0x8fChSKz1sLnIpLChsPWwucGFyZW50KSE9PXIucGFyZW50Oyk7cmV0dXJuIHIuc3RhcnRzJiYo
-ci5lbmRTYW1lQXNCZWdpbiYmKHIuc3RhcnRzLmVSPXIuZVIpLHUoci5zdGFydHMpKSxhLnJFPzA6bi5s
-ZW5ndGh9aWYoZnVuY3Rpb24oZSxuKXtyZXR1cm4haSYmdihuLmlSLGUpfShuLGwpKXRocm93IG5ldyBF
-cnJvcignSWxsZWdhbCBsZXhlbWUgIicrbisnIiBmb3IgbW9kZSAiJysobC5jTnx8Ijx1bm5hbWVkPiIp
-KyciJyk7cmV0dXJuIGcrPW4sbi5sZW5ndGh8fDF9dmFyIHM9QihlKTtpZighcyl0aHJvdyBuZXcgRXJy
-b3IoJ1Vua25vd24gbGFuZ3VhZ2U6ICInK2UrJyInKTttKHMpO3ZhciBhLGw9dHx8cyxmPXt9LEU9IiI7
-Zm9yKGE9bDthIT09czthPWEucGFyZW50KWEuY04mJihFPWMoYS5jTiwiIiwhMCkrRSk7dmFyIGc9IiIs
-Uj0wO3RyeXtmb3IodmFyIGQscCxNPTA7bC50Lmxhc3RJbmRleD1NLGQ9bC50LmV4ZWMobik7KXA9cihu
-LnN1YnN0cmluZyhNLGQuaW5kZXgpLGRbMF0pLE09ZC5pbmRleCtwO2ZvcihyKG4uc3Vic3RyKE0pKSxh
-PWw7YS5wYXJlbnQ7YT1hLnBhcmVudClhLmNOJiYoRSs9Yik7cmV0dXJue3I6Uix2YWx1ZTpFLGxhbmd1
-YWdlOmUsdG9wOmx9fWNhdGNoKGUpe2lmKGUubWVzc2FnZSYmLTEhPT1lLm1lc3NhZ2UuaW5kZXhPZigi
-SWxsZWdhbCIpKXJldHVybntyOjAsdmFsdWU6XyhuKX07dGhyb3cgZX19ZnVuY3Rpb24gTyh0LGUpe2U9
-ZXx8aC5sYW5ndWFnZXN8fHUoTik7dmFyIHI9e3I6MCx2YWx1ZTpfKHQpfSxhPXI7cmV0dXJuIGUuZmls
-dGVyKEIpLmZpbHRlcihNKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPUMoZSx0LCExKTtuLmxhbmd1
-YWdlPWUsbi5yPmEuciYmKGE9biksbi5yPnIuciYmKGE9cixyPW4pfSksYS5sYW5ndWFnZSYmKHIuc2Vj
-b25kX2Jlc3Q9YSkscn1mdW5jdGlvbiBkKGUpe3JldHVybiBoLnRhYlJlcGxhY2V8fGgudXNlQlI/ZS5y
-ZXBsYWNlKHQsZnVuY3Rpb24oZSxuKXtyZXR1cm4gaC51c2VCUiYmIlxuIj09PWU/Ijxicj4iOmgudGFi
-UmVwbGFjZT9uLnJlcGxhY2UoL1x0L2csaC50YWJSZXBsYWNlKToiIn0pOmV9ZnVuY3Rpb24gbyhlKXt2
-YXIgbix0LHIsYSxpLG89ZnVuY3Rpb24oZSl7dmFyIG4sdCxyLGEsaT1lLmNsYXNzTmFtZSsiICI7aWYo
-aSs9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5jbGFzc05hbWU6IiIsdD1zLmV4ZWMoaSkpcmV0dXJu
-IEIodFsxXSk/dFsxXToibm8taGlnaGxpZ2h0Ijtmb3Iobj0wLHI9KGk9aS5zcGxpdCgvXHMrLykpLmxl
-bmd0aDtuPHI7bisrKWlmKGwoYT1pW25dKXx8QihhKSlyZXR1cm4gYX0oZSk7bChvKXx8KGgudXNlQlI/
-KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwi
-ZGl2IikpLmlubmVySFRNTD1lLmlubmVySFRNTC5yZXBsYWNlKC9cbi9nLCIiKS5yZXBsYWNlKC88YnJb
-IFwvXSo+L2csIlxuIik6bj1lLGk9bi50ZXh0Q29udGVudCxyPW8/QyhvLGksITApOk8oaSksKHQ9Uihu
-KSkubGVuZ3RoJiYoKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8x
-OTk5L3hodG1sIiwiZGl2IikpLmlubmVySFRNTD1yLnZhbHVlLHIudmFsdWU9ZnVuY3Rpb24oZSxuLHQp
-e3ZhciByPTAsYT0iIixpPVtdO2Z1bmN0aW9uIG8oKXtyZXR1cm4gZS5sZW5ndGgmJm4ubGVuZ3RoP2Vb
-MF0ub2Zmc2V0IT09blswXS5vZmZzZXQ/ZVswXS5vZmZzZXQ8blswXS5vZmZzZXQ/ZTpuOiJzdGFydCI9
-PT1uWzBdLmV2ZW50P2U6bjplLmxlbmd0aD9lOm59ZnVuY3Rpb24gYyhlKXthKz0iPCIrRShlKStmLm1h
-cC5jYWxsKGUuYXR0cmlidXRlcyxmdW5jdGlvbihlKXtyZXR1cm4iICIrZS5ub2RlTmFtZSsnPSInK18o
-ZS52YWx1ZSkucmVwbGFjZSgnIicsIiZxdW90OyIpKyciJ30pLmpvaW4oIiIpKyI+In1mdW5jdGlvbiB1
-KGUpe2ErPSI8LyIrRShlKSsiPiJ9ZnVuY3Rpb24gcyhlKXsoInN0YXJ0Ij09PWUuZXZlbnQ/Yzp1KShl
-Lm5vZGUpfWZvcig7ZS5sZW5ndGh8fG4ubGVuZ3RoOyl7dmFyIGw9bygpO2lmKGErPV8odC5zdWJzdHJp
-bmcocixsWzBdLm9mZnNldCkpLHI9bFswXS5vZmZzZXQsbD09PWUpe2ZvcihpLnJldmVyc2UoKS5mb3JF
-YWNoKHUpO3MobC5zcGxpY2UoMCwxKVswXSksKGw9bygpKT09PWUmJmwubGVuZ3RoJiZsWzBdLm9mZnNl
-dD09PXI7KTtpLnJldmVyc2UoKS5mb3JFYWNoKGMpfWVsc2Uic3RhcnQiPT09bFswXS5ldmVudD9pLnB1
-c2gobFswXS5ub2RlKTppLnBvcCgpLHMobC5zcGxpY2UoMCwxKVswXSl9cmV0dXJuIGErXyh0LnN1YnN0
-cihyKSl9KHQsUihhKSxpKSksci52YWx1ZT1kKHIudmFsdWUpLGUuaW5uZXJIVE1MPXIudmFsdWUsZS5j
-bGFzc05hbWU9ZnVuY3Rpb24oZSxuLHQpe3ZhciByPW4/Y1tuXTp0LGE9W2UudHJpbSgpXTtyZXR1cm4g
-ZS5tYXRjaCgvXGJobGpzXGIvKXx8YS5wdXNoKCJobGpzIiksLTE9PT1lLmluZGV4T2YocikmJmEucHVz
-aChyKSxhLmpvaW4oIiAiKS50cmltKCl9KGUuY2xhc3NOYW1lLG8sci5sYW5ndWFnZSksZS5yZXN1bHQ9
-e2xhbmd1YWdlOnIubGFuZ3VhZ2UscmU6ci5yfSxyLnNlY29uZF9iZXN0JiYoZS5zZWNvbmRfYmVzdD17
-bGFuZ3VhZ2U6ci5zZWNvbmRfYmVzdC5sYW5ndWFnZSxyZTpyLnNlY29uZF9iZXN0LnJ9KSl9ZnVuY3Rp
-b24gcCgpe2lmKCFwLmNhbGxlZCl7cC5jYWxsZWQ9ITA7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3Rv
-ckFsbCgicHJlIGNvZGUiKTtmLmZvckVhY2guY2FsbChlLG8pfX1mdW5jdGlvbiBCKGUpe3JldHVybiBl
-PShlfHwiIikudG9Mb3dlckNhc2UoKSxOW2VdfHxOW2NbZV1dfWZ1bmN0aW9uIE0oZSl7dmFyIG49Qihl
-KTtyZXR1cm4gbiYmIW4uZGlzYWJsZUF1dG9kZXRlY3R9cmV0dXJuIGEuaGlnaGxpZ2h0PUMsYS5oaWdo
-bGlnaHRBdXRvPU8sYS5maXhNYXJrdXA9ZCxhLmhpZ2hsaWdodEJsb2NrPW8sYS5jb25maWd1cmU9ZnVu
-Y3Rpb24oZSl7aD1nKGgsZSl9LGEuaW5pdEhpZ2hsaWdodGluZz1wLGEuaW5pdEhpZ2hsaWdodGluZ09u
-TG9hZD1mdW5jdGlvbigpe2FkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHAsITEpLGFk
-ZEV2ZW50TGlzdGVuZXIoImxvYWQiLHAsITEpfSxhLnJlZ2lzdGVyTGFuZ3VhZ2U9ZnVuY3Rpb24obixl
-KXt2YXIgdD1OW25dPWUoYSk7aSh0KSx0LmFsaWFzZXMmJnQuYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9u
-KGUpe2NbZV09bn0pfSxhLmxpc3RMYW5ndWFnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdShOKX0sYS5nZXRM
-YW5ndWFnZT1CLGEuYXV0b0RldGVjdGlvbj1NLGEuaW5oZXJpdD1nLGEuSVI9YS5JREVOVF9SRT0iW2Et
-ekEtWl1cXHcqIixhLlVJUj1hLlVOREVSU0NPUkVfSURFTlRfUkU9IlthLXpBLVpfXVxcdyoiLGEuTlI9
-YS5OVU1CRVJfUkU9IlxcYlxcZCsoXFwuXFxkKyk/IixhLkNOUj1hLkNfTlVNQkVSX1JFPSIoLT8pKFxc
-YjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQr
-KT8pIixhLkJOUj1hLkJJTkFSWV9OVU1CRVJfUkU9IlxcYigwYlswMV0rKSIsYS5SU1I9YS5SRV9TVEFS
-VEVSU19SRT0iIXwhPXwhPT18JXwlPXwmfCYmfCY9fFxcKnxcXCo9fFxcK3xcXCs9fCx8LXwtPXwvPXwv
-fDp8O3w8PHw8PD18PD18PHw9PT18PT18PXw+Pj49fD4+PXw+PXw+Pj58Pj58PnxcXD98XFxbfFxce3xc
-XCh8XFxefFxcXj18XFx8fFxcfD18XFx8XFx8fH4iLGEuQkU9YS5CQUNLU0xBU0hfRVNDQVBFPXtiOiJc
-XFxcW1xcc1xcU10iLHI6MH0sYS5BU009YS5BUE9TX1NUUklOR19NT0RFPXtjTjoic3RyaW5nIixiOiIn
-IixlOiInIixpOiJcXG4iLGM6W2EuQkVdfSxhLlFTTT1hLlFVT1RFX1NUUklOR19NT0RFPXtjTjoic3Ry
-aW5nIixiOiciJyxlOiciJyxpOiJcXG4iLGM6W2EuQkVdfSxhLlBXTT1hLlBIUkFTQUxfV09SRFNfTU9E
-RT17YjovXGIoYXxhbnx0aGV8YXJlfEknbXxpc24ndHxkb24ndHxkb2Vzbid0fHdvbid0fGJ1dHxqdXN0
-fHNob3VsZHxwcmV0dHl8c2ltcGx5fGVub3VnaHxnb25uYXxnb2luZ3x3dGZ8c298c3VjaHx3aWxsfHlv
-dXx5b3VyfHRoZXl8bGlrZXxtb3JlKVxiL30sYS5DPWEuQ09NTUVOVD1mdW5jdGlvbihlLG4sdCl7dmFy
-IHI9YS5pbmhlcml0KHtjTjoiY29tbWVudCIsYjplLGU6bixjOltdfSx0fHx7fSk7cmV0dXJuIHIuYy5w
-dXNoKGEuUFdNKSxyLmMucHVzaCh7Y046ImRvY3RhZyIsYjoiKD86VE9ET3xGSVhNRXxOT1RFfEJVR3xY
-WFgpOiIscjowfSkscn0sYS5DTENNPWEuQ19MSU5FX0NPTU1FTlRfTU9ERT1hLkMoIi8vIiwiJCIpLGEu
-Q0JDTT1hLkNfQkxPQ0tfQ09NTUVOVF9NT0RFPWEuQygiL1xcKiIsIlxcKi8iKSxhLkhDTT1hLkhBU0hf
-Q09NTUVOVF9NT0RFPWEuQygiIyIsIiQiKSxhLk5NPWEuTlVNQkVSX01PREU9e2NOOiJudW1iZXIiLGI6
-YS5OUixyOjB9LGEuQ05NPWEuQ19OVU1CRVJfTU9ERT17Y046Im51bWJlciIsYjphLkNOUixyOjB9LGEu
-Qk5NPWEuQklOQVJZX05VTUJFUl9NT0RFPXtjTjoibnVtYmVyIixiOmEuQk5SLHI6MH0sYS5DU1NOTT1h
-LkNTU19OVU1CRVJfTU9ERT17Y046Im51bWJlciIsYjphLk5SKyIoJXxlbXxleHxjaHxyZW18dnd8dmh8
-dm1pbnx2bWF4fGNtfG1tfGlufHB0fHBjfHB4fGRlZ3xncmFkfHJhZHx0dXJufHN8bXN8SHp8a0h6fGRw
-aXxkcGNtfGRwcHgpPyIscjowfSxhLlJNPWEuUkVHRVhQX01PREU9e2NOOiJyZWdleHAiLGI6L1wvLyxl
-Oi9cL1tnaW11eV0qLyxpOi9cbi8sYzpbYS5CRSx7YjovXFsvLGU6L1xdLyxyOjAsYzpbYS5CRV19XX0s
-YS5UTT1hLlRJVExFX01PREU9e2NOOiJ0aXRsZSIsYjphLklSLHI6MH0sYS5VVE09YS5VTkRFUlNDT1JF
-X1RJVExFX01PREU9e2NOOiJ0aXRsZSIsYjphLlVJUixyOjB9LGEuTUVUSE9EX0dVQVJEPXtiOiJcXC5c
-XHMqIithLlVJUixyOjB9LGF9KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoInhtbCIsZnVuY3Rpb24ocyl7
-dmFyIGU9e2VXOiEwLGk6LzwvLHI6MCxjOlt7Y046ImF0dHIiLGI6IltBLVphLXowLTlcXC5fOi1dKyIs
-cjowfSx7YjovPVxzKi8scjowLGM6W3tjTjoic3RyaW5nIixlbmRzUGFyZW50OiEwLHY6W3tiOi8iLyxl
-Oi8iL30se2I6LycvLGU6LycvfSx7YjovW15ccyInPTw+YF0rL31dfV19XX07cmV0dXJue2FsaWFzZXM6
-WyJodG1sIiwieGh0bWwiLCJyc3MiLCJhdG9tIiwieGpiIiwieHNkIiwieHNsIiwicGxpc3QiLCJ3c2Yi
-XSxjSTohMCxjOlt7Y046Im1ldGEiLGI6IjwhRE9DVFlQRSIsZToiPiIscjoxMCxjOlt7YjoiXFxbIixl
-OiJcXF0ifV19LHMuQygiXHgzYyEtLSIsIi0tXHgzZSIse3I6MTB9KSx7YjoiPFxcIVxcW0NEQVRBXFxb
-IixlOiJcXF1cXF0+IixyOjEwfSx7Y046Im1ldGEiLGI6LzxcP3htbC8sZTovXD8+LyxyOjEwfSx7Yjov
-PFw/KHBocCk/LyxlOi9cPz4vLHNMOiJwaHAiLGM6W3tiOiIvXFwqIixlOiJcXCovIixza2lwOiEwfSx7
-YjonYiInLGU6JyInLHNraXA6ITB9LHtiOiJiJyIsZToiJyIsc2tpcDohMH0scy5pbmhlcml0KHMuQVNN
-LHtpOm51bGwsY046bnVsbCxjOm51bGwsc2tpcDohMH0pLHMuaW5oZXJpdChzLlFTTSx7aTpudWxsLGNO
-Om51bGwsYzpudWxsLHNraXA6ITB9KV19LHtjTjoidGFnIixiOiI8c3R5bGUoPz1cXHN8PnwkKSIsZToi
-PiIsazp7bmFtZToic3R5bGUifSxjOltlXSxzdGFydHM6e2U6Ijwvc3R5bGU+IixyRTohMCxzTDpbImNz
-cyIsInhtbCJdfX0se2NOOiJ0YWciLGI6IjxzY3JpcHQoPz1cXHN8PnwkKSIsZToiPiIsazp7bmFtZToi
-c2NyaXB0In0sYzpbZV0sc3RhcnRzOntlOiI8XC9zY3JpcHQ+IixyRTohMCxzTDpbImFjdGlvbnNjcmlw
-dCIsImphdmFzY3JpcHQiLCJoYW5kbGViYXJzIiwieG1sIiwidmJzY3JpcHQiXX19LHtjTjoidGFnIixi
-OiI8Lz8iLGU6Ii8/PiIsYzpbe2NOOiJuYW1lIixiOi9bXlwvPjxcc10rLyxyOjB9LGVdfV19fSk7aGxq
-cy5yZWdpc3Rlckxhbmd1YWdlKCJtYXJrZG93biIsZnVuY3Rpb24oZSl7cmV0dXJue2FsaWFzZXM6WyJt
-ZCIsIm1rZG93biIsIm1rZCJdLGM6W3tjTjoic2VjdGlvbiIsdjpbe2I6Il4jezEsNn0iLGU6IiQifSx7
-YjoiXi4rP1xcbls9LV17Mix9JCJ9XX0se2I6IjwiLGU6Ij4iLHNMOiJ4bWwiLHI6MH0se2NOOiJidWxs
-ZXQiLGI6Il5cXHMqKFsqKy1dfChcXGQrXFwuKSlcXHMrIn0se2NOOiJzdHJvbmciLGI6IlsqX117Mn0u
-Kz9bKl9dezJ9In0se2NOOiJlbXBoYXNpcyIsdjpbe2I6IlxcKi4rP1xcKiJ9LHtiOiJfLis/XyIscjow
-fV19LHtjTjoicXVvdGUiLGI6Il4+XFxzKyIsZToiJCJ9LHtjTjoiY29kZSIsdjpbe2I6Il5gYGB3KnMq
-JCIsZToiXmBgYHMqJCJ9LHtiOiJgLis/YCJ9LHtiOiJeKCB7NH18XHQpIixlOiIkIixyOjB9XX0se2I6
-Il5bLVxcKl17Myx9IixlOiIkIn0se2I6IlxcWy4rP1xcXVtcXChcXFtdLio/W1xcKVxcXV0iLHJCOiEw
-LGM6W3tjTjoic3RyaW5nIixiOiJcXFsiLGU6IlxcXSIsZUI6ITAsckU6ITAscjowfSx7Y046Imxpbmsi
-LGI6IlxcXVxcKCIsZToiXFwpIixlQjohMCxlRTohMH0se2NOOiJzeW1ib2wiLGI6IlxcXVxcWyIsZToi
-XFxdIixlQjohMCxlRTohMH1dLHI6MTB9LHtiOi9eXFtbXlxuXStcXTovLHJCOiEwLGM6W3tjTjoic3lt
-Ym9sIixiOi9cWy8sZTovXF0vLGVCOiEwLGVFOiEwfSx7Y046ImxpbmsiLGI6LzpccyovLGU6LyQvLGVC
-OiEwfV19XX19KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoImRhcnQiLGZ1bmN0aW9uKGUpe3ZhciB0PXtj
-Tjoic3Vic3QiLHY6W3tiOiJcXCRbQS1aYS16MC05X10rIn1dfSxyPXtjTjoic3Vic3QiLHY6W3tiOiJc
-XCR7IixlOiJ9In1dLGs6InRydWUgZmFsc2UgbnVsbCB0aGlzIGlzIG5ldyBzdXBlciJ9LG49e2NOOiJz
-dHJpbmciLHY6W3tiOiJyJycnIixlOiInJycifSx7YjonciIiIicsZTonIiIiJ30se2I6InInIixlOiIn
-IixpOiJcXG4ifSx7YjonciInLGU6JyInLGk6IlxcbiJ9LHtiOiInJyciLGU6IicnJyIsYzpbZS5CRSx0
-LHJdfSx7YjonIiIiJyxlOiciIiInLGM6W2UuQkUsdCxyXX0se2I6IiciLGU6IiciLGk6IlxcbiIsYzpb
-ZS5CRSx0LHJdfSx7YjonIicsZTonIicsaToiXFxuIixjOltlLkJFLHQscl19XX07ci5jPVtlLkNOTSxu
-XTtyZXR1cm57azp7a2V5d29yZDoiYXNzZXJ0IGFzeW5jIGF3YWl0IGJyZWFrIGNhc2UgY2F0Y2ggY2xh
-c3MgY29uc3QgY29udGludWUgZGVmYXVsdCBkbyBlbHNlIGVudW0gZXh0ZW5kcyBmYWxzZSBmaW5hbCBm
-aW5hbGx5IGZvciBpZiBpbiBpcyBuZXcgbnVsbCByZXRocm93IHJldHVybiBzdXBlciBzd2l0Y2ggc3lu
-YyB0aGlzIHRocm93IHRydWUgdHJ5IHZhciB2b2lkIHdoaWxlIHdpdGggeWllbGQgYWJzdHJhY3QgYXMg
-ZHluYW1pYyBleHBvcnQgZXh0ZXJuYWwgZmFjdG9yeSBnZXQgaW1wbGVtZW50cyBpbXBvcnQgbGlicmFy
-eSBvcGVyYXRvciBwYXJ0IHNldCBzdGF0aWMgdHlwZWRlZiIsYnVpbHRfaW46InByaW50IENvbXBhcmFi
-bGUgRGF0ZVRpbWUgRHVyYXRpb24gRnVuY3Rpb24gSXRlcmFibGUgSXRlcmF0b3IgTGlzdCBNYXAgTWF0
-Y2ggTnVsbCBPYmplY3QgUGF0dGVybiBSZWdFeHAgU2V0IFN0b3B3YXRjaCBTdHJpbmcgU3RyaW5nQnVm
-ZmVyIFN0cmluZ1NpbmsgU3ltYm9sIFR5cGUgVXJpIGJvb2wgZG91YmxlIGludCBudW0gZG9jdW1lbnQg
-d2luZG93IHF1ZXJ5U2VsZWN0b3IgcXVlcnlTZWxlY3RvckFsbCBFbGVtZW50IEVsZW1lbnRMaXN0In0s
-YzpbbixlLkMoIi9cXCpcXCoiLCJcXCovIix7c0w6Im1hcmtkb3duIn0pLGUuQygiLy8vIiwiJCIse3NM
-OiJtYXJrZG93biJ9KSxlLkNMQ00sZS5DQkNNLHtjTjoiY2xhc3MiLGJLOiJjbGFzcyBpbnRlcmZhY2Ui
-LGU6InsiLGVFOiEwLGM6W3tiSzoiZXh0ZW5kcyBpbXBsZW1lbnRzIn0sZS5VVE1dfSxlLkNOTSx7Y046
-Im1ldGEiLGI6IkBbQS1aYS16XSsifSx7YjoiPT4ifV19fSk7Cg==
-''';
-
-String _index_html;
-// index_html md5 is '2cf3e3cd2e7c2331a600c030c2976c58'
-String _index_html_base64 = '''
-PGh0bWw+CjxoZWFkPgogICAgPHRpdGxlPk51bGwgU2FmZXR5IFByZXZpZXc8L3RpdGxlPgogICAgPHNj
-cmlwdCBzcmM9Int7IGhpZ2hsaWdodEpzUGF0aCB9fSI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0Pnt7IGRh
-cnRQYWdlU2NyaXB0IH19PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0
-dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1PcGVuK1NhbnM6NDAwLDYwMCZkaXNw
-bGF5PXN3YXAiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7eyBoaWdobGlnaHRTdHls
-ZVBhdGggfX0iPgogICAgPHN0eWxlPnt7IGRhcnRQYWdlU3R5bGUgfX08L3N0eWxlPgo8L2hlYWQ+Cjxi
-b2R5IGNsYXNzPSJ7eyBtaWdyYXRpb25BcHBsaWVkU3R5bGUgfX0ge3sgbmVlZHNSZXJ1blN0eWxlIH19
-Ij4KPGRpdiBjbGFzcz0icmVydW5uaW5nLXBhbmUiPgogIDxoMT5SZXJ1bm5pbmcuLi48L2gxPgo8L2Rp
-dj4KPHAgY2xhc3M9InJvb3QiPnt7IHJvb3QgfX08L3A+CjxoZWFkZXIgY2xhc3M9ImVsZXZhdGlvbi16
-NCI+CiAgICA8aDEgY2xhc3M9ImJlZm9yZS1hcHBseSI+UHJvcG9zZWQgbnVsbCBzYWZldHkgY2hhbmdl
-czwvaDE+CiAgICA8aDEgY2xhc3M9ImFmdGVyLWFwcGx5Ij4mIzEwMDAzOyBOdWxsIHNhZmV0eSBtaWdy
-YXRpb24gYXBwbGllZDwvaDE+CiAgICA8aDIgaWQ9InVuaXQtbmFtZSI+Jm5ic3A7PC9oMj4KICAgIDxi
-dXR0b24gY2xhc3M9ImFwcGx5LW1pZ3JhdGlvbiI+JiM5OTk4OyBBcHBseSBNaWdyYXRpb248L2J1dHRv
-bj4KICAgIDxidXR0b24gY2xhc3M9ImFwcGx5LW1pZ3JhdGlvbiIgZGlzYWJsZWQ+JiM5OTk4OyBBcHBs
-eSBNaWdyYXRpb248L2J1dHRvbj4KICAgIDxidXR0b24gY2xhc3M9InJlcnVuLW1pZ3JhdGlvbiBiZWZv
-cmUtYXBwbHkiPgogICAgICA8c3BhbiBjbGFzcz0ib3B0aW9uYWwiPiYjODYzNTsgUmVydW4gRnJvbSBT
-b3VyY2VzPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0icmVxdWlyZWQiPgogICAgICAgIDxzcGFuIGNs
-YXNzPSJpY29uIiAKICAgICAgICAgIHRpdGxlPSJEaXNrIGNvbnRlbnRzIGhhdmUgY2hhbmdlZC4gUmVy
-dW4gdG8gZ2V0IGFuIHVwLXRvLWRhdGUgbWlncmF0aW9uLiI+ITwvc3Bhbj4KICAgICAgICBSZXJ1biBX
-aXRoIENoYW5nZXMKICAgICAgPC9zcGFuPgogICAgPC9idXR0b24+CjwvaGVhZGVyPgo8ZGl2IGNsYXNz
-PSJwYW5lbHMgaG9yaXpvbnRhbCI+CiAgICA8ZGl2IGNsYXNzPSJuYXYtcGFuZWwiPgogICAgICAgIDxk
-aXYgY2xhc3M9Im5hdi1pbm5lciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmci
-PlByb2plY3QgRmlsZXM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXRyZWUiPjwvZGl2
-PgogICAgICAgIDwvZGl2PjwhLS0gL25hdi1pbm5lciAtLT4KICAgIDwvZGl2PjwhLS0gL25hdiAtLT4K
-ICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9InJlZ2lvbnMiPgogICAg
-ICAgICAgICA8IS0tIFRoZSByZWdpb25zIG92ZXJsYXkgY29kZSBjb3B5IG9mIHRoZSBjb250ZW50IHRv
-IHByb3ZpZGUgLS0+CiAgICAgICAgICAgIDwhLS0gdG9vbHRpcHMgZm9yIG1vZGlmaWVkIHJlZ2lvbnMu
-IC0tPgogICAgICAgIDwvZGl2PjwhLS0gL3JlZ2lvbnMgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iY29k
-ZSI+CiAgICAgICAgICAgIDwhLS0gQ29tcGlsYXRpb24gdW5pdCBjb250ZW50IGlzIHdyaXR0ZW4gaGVy
-ZS4gLS0+CiAgICAgICAgICAgIDxwIGNsYXNzPSJ3ZWxjb21lIj4KICAgICAgICAgICAgICAgIFNlbGVj
-dCBhIHNvdXJjZSBmaWxlIG9uIHRoZSBsZWZ0IHRvIHByZXZpZXcgdGhlIHByb3Bvc2VkIGVkaXRzLgog
-ICAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj48IS0tIC9jb250ZW50IC0tPgog
-ICAgPGRpdiBjbGFzcz0iaW5mby1wYW5lbCI+CiAgICAgICAgPGRpdiBjbGFzcz0iZWRpdC1saXN0Ij4K
-ICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+UHJvcG9zZWQgRWRpdHM8L2Rpdj4K
-ICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtY29udGVudCI+PC9kaXY+CiAgICAgICAgPC9kaXY+
-PCEtLSAvZWRpdC1saXN0IC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImVkaXQtcGFuZWwiPgogICAgICAg
-ICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj5FZGl0IERldGFpbHM8L2Rpdj4KICAgICAgICAg
-ICAgPGRpdiBjbGFzcz0icGFuZWwtY29udGVudCI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0icGxh
-Y2Vob2xkZXIiPlNlZSBkZXRhaWxzIGFib3V0IGEgcHJvcG9zZWQgZWRpdC48L3A+CiAgICAgICAgICAg
-IDwvZGl2PjwhLS0gL3BhbmVsLWNvbnRlbnQgLS0+CiAgICAgICAgPC9kaXY+PCEtLSAvZWRpdC1wYW5l
-bCAtLT4KICAgIDwvZGl2PjwhLS0gL2luZm8tcGFuZWwgLS0+CjwvZGl2PjwhLS0gL3BhbmVscyAtLT4K
-PGZvb3Rlcj4KICAgIDxhIHRhcmdldD0iX2JsYW5rIgogICAgICBocmVmPSJodHRwczovL2dvby5nbGUv
-ZGFydC1udWxsLXNhZmV0eS1taWdyYXRpb24tdG9vbCI+TnVsbCBzYWZldHkKICAgICAgICBtaWdyYXRp
-b24gaGVscDwvYT4KICAgIDxzcGFuIGNsYXNzPSJ3aWRlIj4gPC9zcGFuPgogICAgPGRpdj5CYXNlZCBv
-biB7eyBzZGtWZXJzaW9uIH19PC9kaXY+CjwvZm9vdGVyPgo8L2JvZHk+CjwvaHRtbD4K
-''';
-
-String _migration_css;
-// migration_css md5 is '0063c2f22a79d4534f0b3e9d3a805e2d'
-String _migration_css_base64 = '''
-LyogQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUg
-dGhlIEFVVEhPUlMgZmlsZSAgKi8KLyogZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVz
-ZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgKi8KLyogQlNELXN0eWxlIGxpY2Vu
-c2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4gICAgICAgICAgICAgICAgICAg
-Ki8KCmJvZHkgewogIGJhY2tncm91bmQtY29sb3I6ICMxMjIwMmY7CiAgY29sb3I6ICNjY2M7CiAgZm9u
-dC1mYW1pbHk6ICJSb2JvdG8iLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTRweDsKICBkaXNwbGF5
-OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRv
-cDogMDsKICByaWdodDogMDsKICBib3R0b206IDA7CiAgbGVmdDogMDsKICBtYXJnaW46IDA7CiAgcGFk
-ZGluZzogMDsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucHJvcG9zZWQgLmFmdGVyLWFwcGx5IHsKICBk
-aXNwbGF5OiBub25lOwp9CgouYXBwbGllZCAuYmVmb3JlLWFwcGx5IHsKICBkaXNwbGF5OiBub25lOwp9
-CgouYXBwbGllZCAuYXBwbHktbWlncmF0aW9uOm5vdChbZGlzYWJsZWRdKSwgLm5lZWRzLXJlcnVuIC5h
-cHBseS1taWdyYXRpb246bm90KFtkaXNhYmxlZF0pIHsKICBkaXNwbGF5OiBub25lOwp9CgoucHJvcG9z
-ZWQ6bm90KC5uZWVkcy1yZXJ1bikgLmFwcGx5LW1pZ3JhdGlvbltkaXNhYmxlZF0gewogIGRpc3BsYXk6
-IG5vbmU7Cn0KCmhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzFjMjgzNDsKICBoZWlnaHQ6IDQ4
-cHg7CiAgcGFkZGluZy1sZWZ0OiAyNHB4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgei1pbmRleDog
-NDsKfQoKaGVhZGVyIGgxLApoZWFkZXIgaDIgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250
-LWZhbWlseTogIkdvb2dsZSBTYW5zIiwiUm9ib3RvIixzYW5zLXNlcmlmOwogIGZvbnQtd2VpZ2h0OiA0
-MDA7CiAgbWFyZ2luLXJpZ2h0OiAyNHB4Owp9CgpoMSB7CiAgZm9udC1zaXplOiAxLjVlbTsKfQoKaGVh
-ZGVyIGgyIHsKICBmb250LXNpemU6IDEuMmVtOwp9CgpoZWFkZXIgLmFwcGx5LW1pZ3JhdGlvbiwgLnJl
-cnVuLW1pZ3JhdGlvbiB7CiAgcmlnaHQ6IDBweDsKICBmbG9hdDogcmlnaHQ7CiAgbWFyZ2luOiAxMHB4
-Owp9CgoucmVydW4tbWlncmF0aW9uIC5yZXF1aXJlZCB7CiAgZGlzcGxheTogbm9uZTsKfQoKLm5lZWRz
-LXJlcnVuIC5yZXJ1bi1taWdyYXRpb24gLnJlcXVpcmVkIHsKICBkaXNwbGF5OiBpbml0aWFsOwp9Cgou
-bmVlZHMtcmVydW4gLnJlcnVuLW1pZ3JhdGlvbiAub3B0aW9uYWwgewogIGRpc3BsYXk6bm9uZTsKfQoK
-LyogUmVkIHRyaWFuZ2xlICovCi5yZXJ1bi1taWdyYXRpb24gLnJlcXVpcmVkIC5pY29uOjpiZWZvcmUg
-ewogIHRyYW5zZm9ybTogdHJhbnNsYXRlKC04cHgsIC0xMXB4KTsKICBjb250ZW50OiAnXDI1QjMnOwog
-IGZvbnQtc2l6ZTogMjVweDsKICBwb3NpdGlvbjogZml4ZWQ7CiAgY29sb3I6ICNlODJjMmM7CiAgdGV4
-dC1zaGFkb3c6IDBweCAwcHggNXB4IHdoaXRlOwogIHotaW5kZXg6IC0zOwp9CgovKiBSZWQgdHJpYW5n
-bGUgZmlsbCAqLwoucmVydW4tbWlncmF0aW9uIC5yZXF1aXJlZCAuaWNvbjo6YWZ0ZXIgewogIHRyYW5z
-Zm9ybTogdHJhbnNsYXRlKC05cHgsIC0xMHB4KTsKICBjb250ZW50OiAnXDI1QjQnOwogIGZvbnQtc2l6
-ZTogMjVweDsKICBwb3NpdGlvbjogZml4ZWQ7CiAgY29sb3I6ICNiM2VjZmY7CiAgei1pbmRleDogLTE7
-Cn0KCi8qIFJlZCB0cmlhbmdsZSBleGNsYW1hdGlvbiAqLwoucmVydW4tbWlncmF0aW9uIC5yZXF1aXJl
-ZCAuaWNvbiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1yaWdodDogOHB4OwogIHRy
-YW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMnB4KTsKICBtYXJnaW4tbGVmdDogMnB4OwogIGNvbG9yOiAj
-MmIyYjJiOwp9Cgpmb290ZXIgewogIGNvbG9yOiAjY2NjOwogIGJhY2tncm91bmQtY29sb3I6ICMyNzMy
-M2E7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogcm93OwogIGFsaWduLWl0ZW1zOiBj
-ZW50ZXI7CiAgcGFkZGluZzogOHB4IDI0cHg7Cn0KCmZvb3RlciAud2lkZSB7CiAgZmxleDogMTsKfQoK
-Lmhvcml6b250YWwgewogIGRpc3BsYXk6IGZsZXg7Cn0KCi5wYW5lbHMgewogIGJhY2tncm91bmQtY29s
-b3I6ICMxMjFhMjU7CiAgZmxleDogMTsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucGFuZWwtaGVhZGlu
-ZyB7CiAgY29sb3I6IGdyYXk7CiAgbWFyZ2luOiA4cHg7Cn0KCi5uYXYtbGluaywKLnJlZ2lvbiB7CiAg
-Y3Vyc29yOiBwb2ludGVyOwp9CgoubmF2LXBhbmVsIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjgyYjJl
-OwogIGZsZXg6IDEgMjAwcHg7CiAgbWFyZ2luOiAwOwogIG92ZXJmbG93OiBzY3JvbGw7Cn0KCi5uYXYt
-aW5uZXIgewogIHBhZGRpbmc6IDAgMCA3cHggN3B4Owp9CgouZml4ZWQgewogIHBvc2l0aW9uOiBmaXhl
-ZDsKICB0b3A6IDA7Cn0KCi5yb290IHsKICBtYXJnaW46IDA7CiAgZGlzcGxheTogbm9uZTsKfQoKLm5h
-di10cmVlID4gdWwgewogIHBhZGRpbmctbGVmdDogNnB4Owp9CgoubmF2LWlubmVyIHVsIHsKICBwYWRk
-aW5nLWxlZnQ6IDEycHg7CiAgbWFyZ2luOiAwOwp9CgoubmF2LWlubmVyIGxpIHsKICBsaXN0LXN0eWxl
-LXR5cGU6IG5vbmU7Cn0KCi5uYXYtaW5uZXIgbGk6bm90KC5kaXIpIHsKICBtYXJnaW4tbGVmdDogMjBw
-eDsKICBtYXJnaW4tYm90dG9tOiAzcHg7Cn0KCi5uYXYtaW5uZXIgbGkuZGlyIC5hcnJvdyB7CiAgY3Vy
-c29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEwcHg7CiAg
-bWFyZ2luLXJpZ2h0OiA0cHg7CiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuNXMgZWFzZS1vdXQ7Cn0K
-Ci5uYXYtaW5uZXIgbGkuZGlyIC5hcnJvdy5jb2xsYXBzZWQgewogIHRyYW5zZm9ybTogcm90YXRlKC05
-MGRlZyk7Cn0KCi5uYXYtaW5uZXIgdWwgewogIG1heC1oZWlnaHQ6IDIwMDBweDsKICB0cmFuc2l0aW9u
-OiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1vdXQ7Cn0KCi5uYXYtaW5uZXIgdWwuY29sbGFwc2VkIHsKICBt
-YXgtaGVpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm5hdi1pbm5lciAu
-c2VsZWN0ZWQtZmlsZSB7CiAgY29sb3I6IHdoaXRlOwogIGN1cnNvcjogaW5oZXJpdDsKICBmb250LXdl
-aWdodDogNjAwOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLmVkaXQtY291bnQgewogIGJhY2tn
-cm91bmQtY29sb3I6ICMzN2FlZGM7CiAgYm9yZGVyLXJhZGl1czogMTBweDsKICBjb2xvcjogIzAwMDAw
-MDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMXB4OwogIGZvbnQtd2VpZ2h0
-OiA2MDA7CiAgbWFyZ2luLWxlZnQ6IDVweDsKICBtaW4td2lkdGg6IDI1cHg7CiAgcGFkZGluZzogNHB4
-IDAgMnB4IDA7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGxpbmUtaGVpZ2h0OiAxZW07Cn0KCi5jb250
-ZW50IHsKICBmbGV4OiA0IDMwMHB4OwogIGJhY2tncm91bmQ6ICMyODJiMmU7CiAgZm9udC1mYW1pbHk6
-IG1vbm9zcGFjZTsKICBtYXJnaW46IDAgNnB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB3aGl0ZS1z
-cGFjZTogcHJlOwogIG92ZXJmbG93OiBzY3JvbGw7Cn0KCi5jb2RlIHsKICBwYWRkaW5nOiAwLjVlbTsK
-ICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsKICB0b3A6IDA7CiAgbWFyZ2luLWxlZnQ6IDU2
-cHg7Cn0KCi5obGpzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjgyYjJlOwogIGRpc3BsYXk6IGJsb2Nr
-OwogIG92ZXJmbG93LXg6IGF1dG87CiAgcGFkZGluZzogMC41ZW07Cn0KCi5jb2RlIC53ZWxjb21lIHsK
-ICBmb250LWZhbWlseTogIkdvb2dsZSBTYW5zIiwiUm9ib3RvIixzYW5zLXNlcmlmOwogIGZvbnQtc2l6
-ZTogMThweDsKICBtYXJnaW4tcmlnaHQ6IDYycHg7CiAgY29sb3I6ICM3Nzc7Cn0KCi5jb2RlIC5uYXYt
-bGluayB7CiAgY29sb3I6IGluaGVyaXQ7CiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7Cn0KCi5j
-b2RlIC5uYXYtbGluazp2aXNpdGVkIHsKICBjb2xvcjogaW5oZXJpdDsKICB0ZXh0LWRlY29yYXRpb24t
-bGluZTogbm9uZTsKfQoKLmNvZGUgLm5hdi1saW5rOmhvdmVyIHsKICB0ZXh0LWRlY29yYXRpb24tbGlu
-ZTogdW5kZXJsaW5lOwogIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5yZWdpb25zIHsKICBwYWRkaW5nOiAw
-LjVlbTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsKICB0b3A6IDA7Cn0KCi5yZWdpb25z
-IHRhYmxlIHsKICBib3JkZXItc3BhY2luZzogMDsKICBmb250LXNpemU6IGluaGVyaXQ7Cn0KCi5yZWdp
-b25zIHRkIHsKICBib3JkZXI6IG5vbmU7CiAgLyogVGhlIGNvbnRlbnQgb2YgdGhlIHJlZ2lvbnMgaXMg
-bm90IHZpc2libGU7IHRoZSB1c2VyIGluc3RlYWQgd2lsbCBzZWUgdGhlCiAgICogaGlnaGxpZ2h0ZWQg
-Y29weSBvZiB0aGUgY29udGVudC4gKi8KICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwKTsKICBw
-YWRkaW5nOiAwOwogIHdoaXRlLXNwYWNlOiBwcmU7Cn0KCi5yZWdpb25zIHRkOmVtcHR5OmFmdGVyIHsK
-ICBjb250ZW50OiAiXDAwYTAiOwp9CgoucmVnaW9ucyB0ci5oaWdobGlnaHQgdGQ6bGFzdC1jaGlsZCB7
-CiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDQ0NDsKICBjb2xvcjogd2hpdGU7Cn0KCi5yZWdpb25zIHRk
-LmxpbmUtbm8gewogIGJvcmRlci1yaWdodDogc29saWQgIzI4MmIyZSAycHg7CiAgY29sb3I6ICM5OTk5
-OTk7CiAgcGFkZGluZy1yaWdodDogNHB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHZpc2liaWxpdHk6
-IHZpc2libGU7CiAgd2lkdGg6IDUwcHg7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgoucmVnaW9u
-cyB0ci5oaWdobGlnaHQgdGQubGluZS1ubyB7CiAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjY2NjIDJweDsK
-fQoKLnJlZ2lvbiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsK
-ICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogIHotaW5kZXg6IDIwMDsKfQoKLnJlZ2lvbi5hZGRlZC1yZWdp
-b24gewogIGJhY2tncm91bmQtY29sb3I6ICNjY2ZmY2M7CiAgY29sb3I6ICMwMDMzMDA7Cn0KCi5yZWdp
-b24ucmVtb3ZlZC1yZWdpb24gewogIGJhY2tncm91bmQtY29sb3I6ICNmZjY2NjY7CiAgY29sb3I6ICMw
-MDExMDA7Cn0KCi5yZWdpb24uaW5mb3JtYXRpdmUtcmVnaW9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAj
-ODg4ODg4OwogIGNvbG9yOiAjMDAwMDAwOwp9CgoudGFyZ2V0IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAj
-NDQ0OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogIGZvbnQtd2Vp
-Z2h0OiA2MDA7Cn0KCi5pbmZvLXBhbmVsIHsKICBmbGV4OiAxIDIwMHB4OwogIG1hcmdpbjogMDsKICBo
-ZWlnaHQ6IDEwMCU7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9Cgou
-aW5mby1wYW5lbCAuZWRpdC1wYW5lbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzI4MmIyZTsKICBvdmVy
-ZmxvdzogYXV0bzsKfQoKLmluZm8tcGFuZWwgLnBhbmVsLWNvbnRlbnQgewogIHBhZGRpbmc6IDdweDsK
-fQoKLmluZm8tcGFuZWwgLnBhbmVsLWNvbnRlbnQ+IDpmaXJzdC1jaGlsZCB7CiAgbWFyZ2luLXRvcDog
-MDsKfQoKLmluZm8tcGFuZWwgLm5vd3JhcCB7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmluZm8t
-cGFuZWwgdWwsCi5pbmZvLXBhbmVsIG9sIHsKICBwYWRkaW5nLWxlZnQ6IDIwcHg7Cn0KCi5pbmZvLXBh
-bmVsIGxpIHsKICBtYXJnaW46IDAgMCA1cHggMDsKfQoKLmluZm8tcGFuZWwgYSB7CiAgY29sb3I6ICMz
-M2NjZmY7Cn0KCi5pbmZvLXBhbmVsIC5lZGl0LWxpc3QgewogIGJhY2tncm91bmQtY29sb3I6ICMyODJi
-MmU7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5lZGl0LXBhbmVsIHsKICBtYXJnaW4tdG9wOiA2cHg7CiAg
-ZmxleDogMSAxMDBweDsKfQoKLmVkaXQtbGlzdCB7CiAgZmxleDogMiAxMDBweDsKfQoKLmVkaXQtbGlz
-dCAuZWRpdCB7CiAgbWFyZ2luOiAzcHggMDsKfQoKLmVkaXQtbGlzdCAuZWRpdC1saW5rIHsKICBjdXJz
-b3I6IHBvaW50ZXI7Cn0KCi5yZXJ1bm5pbmctcGFuZSB7CiAgZGlzcGxheTogbm9uZTsKfQoKYm9keS5y
-ZXJ1bm5pbmcgLnJlcnVubmluZy1wYW5lIHsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogZml4
-ZWQ7CiAgdG9wOiAwcHg7CiAgYm90dG9tOiAwcHg7CiAgbGVmdDogMHB4OwogIHJpZ2h0OiAwcHg7CiAg
-YmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMEFBOyAvKiB0cmFuc2x1Y2VudCBibGFjayAqLwogIHotaW5k
-ZXg6IDQwMDsKfQoKLnJlcnVubmluZy1wYW5lIGgxIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9w
-OiA1MCU7CiAgbGVmdDogNTAlOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwp9Cgpw
-LnRyYWNlIC50eXBlLWRlc2NyaXB0aW9uIHsKICAvKiBGcm9tIEhMSlMncyAuaGxqcy1rZXl3b3JkLCAu
-aGxqcy1zZWxlY3Rvci10YWcsIC5obGpzLWRlbGV0aW9uICovCiAgY29sb3I6ICNjYzc4MzI7CiAgZm9u
-dC1mYW1pbHk6IG1vbm9zcGFjZTsKfQoKdWwudHJhY2UgewogIGZvbnQtc2l6ZTogMTNweDsKICBsaXN0
-LXN0eWxlLXR5cGU6IG5vbmU7CiAgcGFkZGluZy1sZWZ0OiAwcHg7Cn0KCnVsLnRyYWNlIGxpIHsKICBj
-b2xvcjogd2hpdGU7CiAgbWFyZ2luLWxlZnQ6IDE0cHg7CiAgdGV4dC1pbmRlbnQ6IC0xNHB4Owp9Cgp1
-bC50cmFjZSBsaSAuZnVuY3Rpb24gewogIC8qIEZyb20gSExKUydzIC5obGpzLXNlY3Rpb24sIC5obGpz
-LXRpdGxlLCAuaGxqcy10eXBlICovCiAgY29sb3I6ICNmZmM2NmQ7CiAgZm9udC1mYW1pbHk6IG1vbm9z
-cGFjZTsKICBmb250LXdlaWdodDogNjAwOwp9CgouZWxldmF0aW9uLXo0IHsKICBib3gtc2hhZG93OiAw
-cHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwKICAgICAgMHB4IDRweCA1cHggMHB4IHJn
-YmEoMCwgMCwgMCwgMC4xNCksCiAgICAgIDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAuMTIp
-Owp9CgphIHsKICBjb2xvcjogI2NjYzsKICBmaWxsOiAjY2NjOwogIHRleHQtZGVjb3JhdGlvbjogbm9u
-ZTsKfQoKYTpob3ZlciB7CiAgY29sb3I6ICNmZmY7CiAgZmlsbDogI2ZmZjsKfQoKYS5wb3N0LWxpbmsg
-ewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBtYXJnaW46IDNweDsKfQoKYnV0dG9uLCBhLnBvc3Qt
-bGluayB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzMzY2NmZjsKICBib3JkZXI6IDJweCBzb2xpZCAjMzdh
-ZWRjOwogIGJvcmRlci1yYWRpdXM6IDNweDsKICBwYWRkaW5nOiA2cHggMTBweDsKICBmb250LXdlaWdo
-dDogYm9sZDsKICBjb2xvcjogIzI4MjgyODsKfQoKYnV0dG9uOmhvdmVyLCBhLnBvc3QtbGluazpob3Zl
-ciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzgwZGZmZjsKICBib3JkZXI6IDJweCBzb2xpZCAjNTJiOGUw
-OwogIGN1cnNvcjogcG9pbnRlcjsKfQoKYnV0dG9uW2Rpc2FibGVkXSB7CiAgYmFja2dyb3VuZC1jb2xv
-cjogIzdhYThiODsKICBjb2xvcjogIzUwNzE3NzsKICBib3JkZXI6IDJweCBzb2xpZCAjNTA3MTc3Owog
-IGN1cnNvcjogbm90LWFsbG93ZWQ7Cn0KCi5wbGFjZWhvbGRlciB7CiAgY29sb3I6ICM3Nzc7CiAgdGV4
-dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbi10b3A6IDNlbSAhaW1wb3J0YW50Owp9CgovKioKICogSExK
-UyBPdmVycmlkZXMKICovCi5obGpzIHsKICAvKioKICAgKiBUaGlzIGFsbG93cyB0aGUgcGVyLWxpbmUg
-aGlnaGxpZ2h0cyB0byBzaG93LgogICAqLwogIGJhY2tncm91bmQ6IG5vbmU7Cn0K
-''';
-
-String _migration_js;
-// migration_dart md5 is '8114403a4ae0e1440ba0cea2923c01da'
-String _migration_js_base64 = '''
-KGZ1bmN0aW9uIGRhcnRQcm9ncmFtKCl7ZnVuY3Rpb24gY29weVByb3BlcnRpZXMoYSxiKXt2YXIgdD1P
-YmplY3Qua2V5cyhhKQpmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9dFtzXQpiW3JdPWFb
-cl19fXZhciB6PWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oKXt9CnQucHJvdG90eXBlPXtwOnt9fQp2
-YXIgcz1uZXcgdCgpCmlmKCEocy5fX3Byb3RvX18mJnMuX19wcm90b19fLnA9PT10LnByb3RvdHlwZS5w
-KSlyZXR1cm4gZmFsc2UKdHJ5e2lmKHR5cGVvZiBuYXZpZ2F0b3IhPSJ1bmRlZmluZWQiJiZ0eXBlb2Yg
-bmF2aWdhdG9yLnVzZXJBZ2VudD09InN0cmluZyImJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigi
-Q2hyb21lLyIpPj0wKXJldHVybiB0cnVlCmlmKHR5cGVvZiB2ZXJzaW9uPT0iZnVuY3Rpb24iJiZ2ZXJz
-aW9uLmxlbmd0aD09MCl7dmFyIHI9dmVyc2lvbigpCmlmKC9eXGQrXC5cZCtcLlxkK1wuXGQrJC8udGVz
-dChyKSlyZXR1cm4gdHJ1ZX19Y2F0Y2gocSl7fXJldHVybiBmYWxzZX0oKQpmdW5jdGlvbiBzZXRGdW5j
-dGlvbk5hbWVzSWZOZWNlc3NhcnkoYSl7ZnVuY3Rpb24gdCgpe307aWYodHlwZW9mIHQubmFtZT09InN0
-cmluZyIpcmV0dXJuCmZvcih2YXIgdD0wO3Q8YS5sZW5ndGg7dCsrKXt2YXIgcz1hW3RdCnZhciByPU9i
-amVjdC5rZXlzKHMpCmZvcih2YXIgcT0wO3E8ci5sZW5ndGg7cSsrKXt2YXIgcD1yW3FdCnZhciBvPXNb
-cF0KaWYodHlwZW9mIG89PSdmdW5jdGlvbicpby5uYW1lPXB9fX1mdW5jdGlvbiBpbmhlcml0KGEsYil7
-YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YQphLnByb3RvdHlwZVsiJGkiK2EubmFtZV09YQppZihiIT1u
-dWxsKXtpZih6KXthLnByb3RvdHlwZS5fX3Byb3RvX189Yi5wcm90b3R5cGUKcmV0dXJufXZhciB0PU9i
-amVjdC5jcmVhdGUoYi5wcm90b3R5cGUpCmNvcHlQcm9wZXJ0aWVzKGEucHJvdG90eXBlLHQpCmEucHJv
-dG90eXBlPXR9fWZ1bmN0aW9uIGluaGVyaXRNYW55KGEsYil7Zm9yKHZhciB0PTA7dDxiLmxlbmd0aDt0
-KyspaW5oZXJpdChiW3RdLGEpfWZ1bmN0aW9uIG1peGluKGEsYil7Y29weVByb3BlcnRpZXMoYi5wcm90
-b3R5cGUsYS5wcm90b3R5cGUpCmEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWF9ZnVuY3Rpb24gbGF6eShh
-LGIsYyxkKXt2YXIgdD1hCmFbYl09dAphW2NdPWZ1bmN0aW9uKCl7YVtjXT1mdW5jdGlvbigpe0guYWco
-Yil9CnZhciBzCnZhciByPWQKdHJ5e2lmKGFbYl09PT10KXtzPWFbYl09cgpzPWFbYl09ZCgpfWVsc2Ug
-cz1hW2JdfWZpbmFsbHl7aWYocz09PXIpYVtiXT1udWxsCmFbY109ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
-c1tiXX19cmV0dXJuIHN9fWZ1bmN0aW9uIG1ha2VDb25zdExpc3QoYSl7YS5pbW11dGFibGUkbGlzdD1B
-cnJheQphLmZpeGVkJGxlbmd0aD1BcnJheQpyZXR1cm4gYX1mdW5jdGlvbiBjb252ZXJ0VG9GYXN0T2Jq
-ZWN0KGEpe2Z1bmN0aW9uIHQoKXt9dC5wcm90b3R5cGU9YQpuZXcgdCgpCnJldHVybiBhfWZ1bmN0aW9u
-IGNvbnZlcnRBbGxUb0Zhc3RPYmplY3QoYSl7Zm9yKHZhciB0PTA7dDxhLmxlbmd0aDsrK3QpY29udmVy
-dFRvRmFzdE9iamVjdChhW3RdKX12YXIgeT0wCmZ1bmN0aW9uIHRlYXJPZmZHZXR0ZXIoYSxiLGMsZCxl
-KXtyZXR1cm4gZT9uZXcgRnVuY3Rpb24oImZ1bmNzIiwiYXBwbHlUcmFtcG9saW5lSW5kZXgiLCJyZWZs
-ZWN0aW9uSW5mbyIsIm5hbWUiLCJIIiwiYyIsInJldHVybiBmdW5jdGlvbiB0ZWFyT2ZmXyIrZCt5Kysr
-IihyZWNlaXZlcikgeyIrImlmIChjID09PSBudWxsKSBjID0gIisiSC51YyIrIigiKyJ0aGlzLCBmdW5j
-cywgYXBwbHlUcmFtcG9saW5lSW5kZXgsIHJlZmxlY3Rpb25JbmZvLCBmYWxzZSwgdHJ1ZSwgbmFtZSk7
-IisicmV0dXJuIG5ldyBjKHRoaXMsIGZ1bmNzWzBdLCByZWNlaXZlciwgbmFtZSk7IisifSIpKGEsYixj
-LGQsSCxudWxsKTpuZXcgRnVuY3Rpb24oImZ1bmNzIiwiYXBwbHlUcmFtcG9saW5lSW5kZXgiLCJyZWZs
-ZWN0aW9uSW5mbyIsIm5hbWUiLCJIIiwiYyIsInJldHVybiBmdW5jdGlvbiB0ZWFyT2ZmXyIrZCt5Kysr
-IigpIHsiKyJpZiAoYyA9PT0gbnVsbCkgYyA9ICIrIkgudWMiKyIoIisidGhpcywgZnVuY3MsIGFwcGx5
-VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgZmFsc2UsIGZhbHNlLCBuYW1lKTsiKyJyZXR1
-cm4gbmV3IGModGhpcywgZnVuY3NbMF0sIG51bGwsIG5hbWUpOyIrIn0iKShhLGIsYyxkLEgsbnVsbCl9
-ZnVuY3Rpb24gdGVhck9mZihhLGIsYyxkLGUsZil7dmFyIHQ9bnVsbApyZXR1cm4gZD9mdW5jdGlvbigp
-e2lmKHQ9PT1udWxsKXQ9SC51Yyh0aGlzLGEsYixjLHRydWUsZmFsc2UsZSkucHJvdG90eXBlCnJldHVy
-biB0fTp0ZWFyT2ZmR2V0dGVyKGEsYixjLGUsZil9dmFyIHg9MApmdW5jdGlvbiBpbnN0YWxsVGVhck9m
-ZihhLGIsYyxkLGUsZixnLGgsaSxqKXt2YXIgdD1bXQpmb3IodmFyIHM9MDtzPGgubGVuZ3RoO3MrKyl7
-dmFyIHI9aFtzXQppZih0eXBlb2Ygcj09J3N0cmluZycpcj1hW3JdCnIuJGNhbGxOYW1lPWdbc10KdC5w
-dXNoKHIpfXZhciByPXRbMF0Kci4kUj1lCnIuJEQ9Zgp2YXIgcT1pCmlmKHR5cGVvZiBxPT0ibnVtYmVy
-IilxKz14CnZhciBwPWhbMF0Kci4kc3R1Yk5hbWU9cAp2YXIgbz10ZWFyT2ZmKHQsanx8MCxxLGMscCxk
-KQphW2JdPW8KaWYoYylyLiR0ZWFyT2ZmPW99ZnVuY3Rpb24gaW5zdGFsbFN0YXRpY1RlYXJPZmYoYSxi
-LGMsZCxlLGYsZyxoKXtyZXR1cm4gaW5zdGFsbFRlYXJPZmYoYSxiLHRydWUsZmFsc2UsYyxkLGUsZixn
-LGgpfWZ1bmN0aW9uIGluc3RhbGxJbnN0YW5jZVRlYXJPZmYoYSxiLGMsZCxlLGYsZyxoLGkpe3JldHVy
-biBpbnN0YWxsVGVhck9mZihhLGIsZmFsc2UsYyxkLGUsZixnLGgsaSl9ZnVuY3Rpb24gc2V0T3JVcGRh
-dGVJbnRlcmNlcHRvcnNCeVRhZyhhKXt2YXIgdD12LmludGVyY2VwdG9yc0J5VGFnCmlmKCF0KXt2Lmlu
-dGVyY2VwdG9yc0J5VGFnPWEKcmV0dXJufWNvcHlQcm9wZXJ0aWVzKGEsdCl9ZnVuY3Rpb24gc2V0T3JV
-cGRhdGVMZWFmVGFncyhhKXt2YXIgdD12LmxlYWZUYWdzCmlmKCF0KXt2LmxlYWZUYWdzPWEKcmV0dXJu
-fWNvcHlQcm9wZXJ0aWVzKGEsdCl9ZnVuY3Rpb24gdXBkYXRlVHlwZXMoYSl7dmFyIHQ9di50eXBlcwp2
-YXIgcz10Lmxlbmd0aAp0LnB1c2guYXBwbHkodCxhKQpyZXR1cm4gc31mdW5jdGlvbiB1cGRhdGVIb2xk
-ZXIoYSxiKXtjb3B5UHJvcGVydGllcyhiLGEpCnJldHVybiBhfXZhciBodW5rSGVscGVycz1mdW5jdGlv
-bigpe3ZhciB0PWZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIGZ1bmN0aW9uKGYsZyxoLGkpe3JldHVy
-biBpbnN0YWxsSW5zdGFuY2VUZWFyT2ZmKGYsZyxhLGIsYyxkLFtoXSxpLGUpfX0scz1mdW5jdGlvbihh
-LGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZSxmLGcsaCl7cmV0dXJuIGluc3RhbGxTdGF0aWNUZWFyT2Zm
-KGUsZixhLGIsYyxbZ10saCxkKX19CnJldHVybntpbmhlcml0OmluaGVyaXQsaW5oZXJpdE1hbnk6aW5o
-ZXJpdE1hbnksbWl4aW46bWl4aW4saW5zdGFsbFN0YXRpY1RlYXJPZmY6aW5zdGFsbFN0YXRpY1RlYXJP
-ZmYsaW5zdGFsbEluc3RhbmNlVGVhck9mZjppbnN0YWxsSW5zdGFuY2VUZWFyT2ZmLF9pbnN0YW5jZV8w
-dTp0KDAsMCxudWxsLFsiJDAiXSwwKSxfaW5zdGFuY2VfMXU6dCgwLDEsbnVsbCxbIiQxIl0sMCksX2lu
-c3RhbmNlXzJ1OnQoMCwyLG51bGwsWyIkMiJdLDApLF9pbnN0YW5jZV8waTp0KDEsMCxudWxsLFsiJDAi
-XSwwKSxfaW5zdGFuY2VfMWk6dCgxLDEsbnVsbCxbIiQxIl0sMCksX2luc3RhbmNlXzJpOnQoMSwyLG51
-bGwsWyIkMiJdLDApLF9zdGF0aWNfMDpzKDAsbnVsbCxbIiQwIl0sMCksX3N0YXRpY18xOnMoMSxudWxs
-LFsiJDEiXSwwKSxfc3RhdGljXzI6cygyLG51bGwsWyIkMiJdLDApLG1ha2VDb25zdExpc3Q6bWFrZUNv
-bnN0TGlzdCxsYXp5OmxhenksdXBkYXRlSG9sZGVyOnVwZGF0ZUhvbGRlcixjb252ZXJ0VG9GYXN0T2Jq
-ZWN0OmNvbnZlcnRUb0Zhc3RPYmplY3Qsc2V0RnVuY3Rpb25OYW1lc0lmTmVjZXNzYXJ5OnNldEZ1bmN0
-aW9uTmFtZXNJZk5lY2Vzc2FyeSx1cGRhdGVUeXBlczp1cGRhdGVUeXBlcyxzZXRPclVwZGF0ZUludGVy
-Y2VwdG9yc0J5VGFnOnNldE9yVXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcsc2V0T3JVcGRhdGVMZWFmVGFn
-czpzZXRPclVwZGF0ZUxlYWZUYWdzfX0oKQpmdW5jdGlvbiBpbml0aWFsaXplRGVmZXJyZWRIdW5rKGEp
-e3g9di50eXBlcy5sZW5ndGgKYShodW5rSGVscGVycyx2LHcsJCl9ZnVuY3Rpb24gZ2V0R2xvYmFsRnJv
-bU5hbWUoYSl7Zm9yKHZhciB0PTA7dDx3Lmxlbmd0aDt0Kyspe2lmKHdbdF09PUMpY29udGludWUKaWYo
-d1t0XVthXSlyZXR1cm4gd1t0XVthXX19dmFyIEM9e30sSD17ZW86ZnVuY3Rpb24gZW8oKXt9LApvbzpm
-dW5jdGlvbihhKXt2YXIgdCxzPWFeNDgKaWYoczw9OSlyZXR1cm4gcwp0PWF8MzIKaWYoOTc8PXQmJnQ8
-PTEwMilyZXR1cm4gdC04NwpyZXR1cm4tMX0sCnFDOmZ1bmN0aW9uKGEsYixjLGQpe1AuazEoYiwic3Rh
-cnQiKQppZihjIT1udWxsKXtQLmsxKGMsImVuZCIpCmlmKGI+YylILlZqKFAuVEUoYiwwLGMsInN0YXJ0
-IixudWxsKSl9cmV0dXJuIG5ldyBILm5IKGEsYixjLGQuQygibkg8MD4iKSl9LApLMTpmdW5jdGlvbihh
-LGIsYyxkKXtpZih1Lmd3LmMoYSkpcmV0dXJuIG5ldyBILnh5KGEsYixjLkMoIkA8MD4iKS5LKGQpLkMo
-Inh5PDEsMj4iKSkKcmV0dXJuIG5ldyBILmkxKGEsYixjLkMoIkA8MD4iKS5LKGQpLkMoImkxPDEsMj4i
-KSl9LApXcDpmdW5jdGlvbigpe3JldHVybiBuZXcgUC5saigiTm8gZWxlbWVudCIpfSwKZFU6ZnVuY3Rp
-b24oKXtyZXR1cm4gbmV3IFAubGooIlRvbyBtYW55IGVsZW1lbnRzIil9LAphcjpmdW5jdGlvbigpe3Jl
-dHVybiBuZXcgUC5saigiVG9vIGZldyBlbGVtZW50cyIpfSwKcWo6ZnVuY3Rpb24gcWooYSl7dGhpcy5h
-PWF9LApiUTpmdW5jdGlvbiBiUSgpe30sCmFMOmZ1bmN0aW9uIGFMKCl7fSwKbkg6ZnVuY3Rpb24gbkgo
-YSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKYTc6ZnVuY3Rpb24g
-YTcoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPTAKXy5kPW51bGwKXy4kdGk9Y30sCmkx
-OmZ1bmN0aW9uIGkxKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKeHk6ZnVuY3Rp
-b24geHkoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LApNSDpmdW5jdGlvbiBNSChh
-LGIsYyl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9YQpfLmM9YgpfLiR0aT1jfSwKQTg6ZnVuY3Rpb24g
-QTgoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LApVNTpmdW5jdGlvbiBVNShhLGIs
-Yyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sClNPOmZ1bmN0aW9uIFNPKGEsYixjKXt0aGlz
-LmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKU1U6ZnVuY3Rpb24gU1UoKXt9LApSZTpmdW5jdGlvbiBS
-ZSgpe30sClhDOmZ1bmN0aW9uIFhDKCl7fSwKd3Y6ZnVuY3Rpb24gd3YoYSl7dGhpcy5hPWF9LApkYzpm
-dW5jdGlvbigpe3Rocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBNYXAiKSl9
-LApOUTpmdW5jdGlvbihhKXt2YXIgdCxzPUguSmcoYSkKaWYodHlwZW9mIHM9PSJzdHJpbmciKXJldHVy
-biBzCnQ9Im1pbmlmaWVkOiIrYQpyZXR1cm4gdH0sClh0OmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYiE9
-bnVsbCl7dD1iLngKaWYodCE9bnVsbClyZXR1cm4gdH1yZXR1cm4gdS5hVS5jKGEpfSwKZDpmdW5jdGlv
-bihhKXt2YXIgdAppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJudW1i
-ZXIiKXtpZihhIT09MClyZXR1cm4iIithfWVsc2UgaWYoITA9PT1hKXJldHVybiJ0cnVlIgplbHNlIGlm
-KCExPT09YSlyZXR1cm4iZmFsc2UiCmVsc2UgaWYoYT09bnVsbClyZXR1cm4ibnVsbCIKdD1KLmooYSkK
-aWYodHlwZW9mIHQhPSJzdHJpbmciKXRocm93IEguYihILnRMKGEpKQpyZXR1cm4gdH0sCmVROmZ1bmN0
-aW9uKGEpe3ZhciB0PWEuJGlkZW50aXR5SGFzaAppZih0PT1udWxsKXt0PU1hdGgucmFuZG9tKCkqMHgz
-ZmZmZmZmZnwwCmEuJGlkZW50aXR5SGFzaD10fXJldHVybiB0fSwKSHA6ZnVuY3Rpb24oYSxiKXt2YXIg
-dCxzLHIscSxwLG8sbj1udWxsCmlmKHR5cGVvZiBhIT0ic3RyaW5nIilILlZqKEgudEwoYSkpCnQ9L15c
-cypbKy1dPygoMHhbYS1mMC05XSspfChcZCspfChbYS16MC05XSspKVxzKiQvaS5leGVjKGEpCmlmKHQ9
-PW51bGwpcmV0dXJuIG4KaWYoMz49dC5sZW5ndGgpcmV0dXJuIEguT0godCwzKQpzPUgueSh0WzNdKQpp
-ZihiPT1udWxsKXtpZihzIT1udWxsKXJldHVybiBwYXJzZUludChhLDEwKQppZih0WzJdIT1udWxsKXJl
-dHVybiBwYXJzZUludChhLDE2KQpyZXR1cm4gbn1pZihiPDJ8fGI+MzYpdGhyb3cgSC5iKFAuVEUoYiwy
-LDM2LCJyYWRpeCIsbikpCmlmKGI9PT0xMCYmcyE9bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwxMCkKaWYo
-YjwxMHx8cz09bnVsbCl7cj1iPD0xMD80NytiOjg2K2IKcT10WzFdCmZvcihwPXEubGVuZ3RoLG89MDtv
-PHA7KytvKWlmKChDLnhCLldkKHEsbyl8MzIpPnIpcmV0dXJuIG59cmV0dXJuIHBhcnNlSW50KGEsYil9
-LApNOmZ1bmN0aW9uKGEpe3ZhciB0PUguSDUoYSkKcmV0dXJuIHR9LApINTpmdW5jdGlvbihhKXt2YXIg
-dCxzLHIKaWYoYSBpbnN0YW5jZW9mIFAuaylyZXR1cm4gSC5kbShILnpLKGEpLG51bGwpCmlmKEouaWEo
-YSk9PT1DLk9rfHx1LmFrLmMoYSkpe3Q9Qy5PNChhKQppZihILmYodCkpcmV0dXJuIHQKcz1hLmNvbnN0
-cnVjdG9yCmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXtyPXMubmFtZQppZih0eXBlb2Ygcj09InN0cmlu
-ZyImJkguZihyKSlyZXR1cm4gcn19cmV0dXJuIEguZG0oSC56SyhhKSxudWxsKX0sCmY6ZnVuY3Rpb24o
-YSl7dmFyIHQ9YSE9PSJPYmplY3QiJiZhIT09IiIKcmV0dXJuIHR9LApNMDpmdW5jdGlvbigpe2lmKCEh
-c2VsZi5sb2NhdGlvbilyZXR1cm4gc2VsZi5sb2NhdGlvbi5ocmVmCnJldHVybiBudWxsfSwKVks6ZnVu
-Y3Rpb24oYSl7dmFyIHQscyxyLHEscD1hLmxlbmd0aAppZihwPD01MDApcmV0dXJuIFN0cmluZy5mcm9t
-Q2hhckNvZGUuYXBwbHkobnVsbCxhKQpmb3IodD0iIixzPTA7czxwO3M9cil7cj1zKzUwMApxPXI8cD9y
-OnAKdCs9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEuc2xpY2UocyxxKSl9cmV0dXJuIHR9
-LApDcTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1ILlZNKFtdLHUudCkKZm9yKHQ9YS5sZW5ndGgscz0w
-O3M8YS5sZW5ndGg7YS5sZW5ndGg9PT10fHwoMCxILmxrKShhKSwrK3Mpe3I9YVtzXQppZighSC5vayhy
-KSl0aHJvdyBILmIoSC50TChyKSkKaWYocjw9NjU1MzUpQy5ObS5BKHEscikKZWxzZSBpZihyPD0xMTE0
-MTExKXtDLk5tLkEocSw1NTI5NisoQy5qbi53RyhyLTY1NTM2LDEwKSYxMDIzKSkKQy5ObS5BKHEsNTYz
-MjArKHImMTAyMykpfWVsc2UgdGhyb3cgSC5iKEgudEwocikpfXJldHVybiBILlZLKHEpfSwKZVQ6ZnVu
-Y3Rpb24oYSl7dmFyIHQscyxyCmZvcih0PWEubGVuZ3RoLHM9MDtzPHQ7KytzKXtyPWFbc10KaWYoIUgu
-b2socikpdGhyb3cgSC5iKEgudEwocikpCmlmKHI8MCl0aHJvdyBILmIoSC50TChyKSkKaWYocj42NTUz
-NSlyZXR1cm4gSC5DcShhKX1yZXR1cm4gSC5WSyhhKX0sCmZ3OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxz
-LHIscQppZihjPD01MDAmJmI9PT0wJiZjPT09YS5sZW5ndGgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNv
-ZGUuYXBwbHkobnVsbCxhKQpmb3IodD1iLHM9IiI7dDxjO3Q9cil7cj10KzUwMApxPXI8Yz9yOmMKcys9
-U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEuc3ViYXJyYXkodCxxKSl9cmV0dXJuIHN9LApM
-dzpmdW5jdGlvbihhKXt2YXIgdAppZigwPD1hKXtpZihhPD02NTUzNSlyZXR1cm4gU3RyaW5nLmZyb21D
-aGFyQ29kZShhKQppZihhPD0xMTE0MTExKXt0PWEtNjU1MzYKcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNv
-ZGUoKDU1Mjk2fEMuam4ud0codCwxMCkpPj4+MCw1NjMyMHx0JjEwMjMpfX10aHJvdyBILmIoUC5URShh
-LDAsMTExNDExMSxudWxsLG51bGwpKX0sCm8yOmZ1bmN0aW9uKGEpe2lmKGEuZGF0ZT09PXZvaWQgMClh
-LmRhdGU9bmV3IERhdGUoYS5hKQpyZXR1cm4gYS5kYXRlfSwKdEo6ZnVuY3Rpb24oYSl7cmV0dXJuIGEu
-Yj9ILm8yKGEpLmdldFVUQ0Z1bGxZZWFyKCkrMDpILm8yKGEpLmdldEZ1bGxZZWFyKCkrMH0sCk5TOmZ1
-bmN0aW9uKGEpe3JldHVybiBhLmI/SC5vMihhKS5nZXRVVENNb250aCgpKzE6SC5vMihhKS5nZXRNb250
-aCgpKzF9LApqQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5iP0gubzIoYSkuZ2V0VVRDRGF0ZSgpKzA6SC5v
-MihhKS5nZXREYXRlKCkrMH0sCktMOmZ1bmN0aW9uKGEpe3JldHVybiBhLmI/SC5vMihhKS5nZXRVVENI
-b3VycygpKzA6SC5vMihhKS5nZXRIb3VycygpKzB9LApjaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5iP0gu
-bzIoYSkuZ2V0VVRDTWludXRlcygpKzA6SC5vMihhKS5nZXRNaW51dGVzKCkrMH0sCkpkOmZ1bmN0aW9u
-KGEpe3JldHVybiBhLmI/SC5vMihhKS5nZXRVVENTZWNvbmRzKCkrMDpILm8yKGEpLmdldFNlY29uZHMo
-KSswfSwKbzE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYj9ILm8yKGEpLmdldFVUQ01pbGxpc2Vjb25kcygp
-KzA6SC5vMihhKS5nZXRNaWxsaXNlY29uZHMoKSswfSwKem86ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMs
-cj17fQpyLmE9MAp0PVtdCnM9W10Kci5hPWIubGVuZ3RoCkMuTm0uRlYodCxiKQpyLmI9IiIKaWYoYyE9
-bnVsbCYmYy5hIT09MCljLlUoMCxuZXcgSC5DaihyLHMsdCkpCiIiK3IuYQpyZXR1cm4gSi5KeShhLG5l
-dyBILkxJKEMuVGUsMCx0LHMsMCkpfSwKRWs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxCmlmKGIg
-aW5zdGFuY2VvZiBBcnJheSl0PWM9PW51bGx8fGMuYT09PTAKZWxzZSB0PSExCmlmKHQpe3M9YgpyPXMu
-bGVuZ3RoCmlmKHI9PT0wKXtpZighIWEuJDApcmV0dXJuIGEuJDAoKX1lbHNlIGlmKHI9PT0xKXtpZigh
-IWEuJDEpcmV0dXJuIGEuJDEoc1swXSl9ZWxzZSBpZihyPT09Mil7aWYoISFhLiQyKXJldHVybiBhLiQy
-KHNbMF0sc1sxXSl9ZWxzZSBpZihyPT09Myl7aWYoISFhLiQzKXJldHVybiBhLiQzKHNbMF0sc1sxXSxz
-WzJdKX1lbHNlIGlmKHI9PT00KXtpZighIWEuJDQpcmV0dXJuIGEuJDQoc1swXSxzWzFdLHNbMl0sc1sz
-XSl9ZWxzZSBpZihyPT09NSlpZighIWEuJDUpcmV0dXJuIGEuJDUoc1swXSxzWzFdLHNbMl0sc1szXSxz
-WzRdKQpxPWFbIiIrIiQiK3JdCmlmKHEhPW51bGwpcmV0dXJuIHEuYXBwbHkoYSxzKX1yZXR1cm4gSC5F
-dyhhLGIsYyl9LApFdzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGs9YiBpbnN0
-YW5jZW9mIEFycmF5P2I6UC5DSChiLCEwLHUueiksaj1rLmxlbmd0aCxpPWEuJFIKaWYoajxpKXJldHVy
-biBILnpvKGEsayxjKQp0PWEuJEQKcz10PT1udWxsCnI9IXM/dCgpOm51bGwKcT1KLmlhKGEpCnA9cS4k
-QwppZih0eXBlb2YgcD09InN0cmluZyIpcD1xW3BdCmlmKHMpe2lmKGMhPW51bGwmJmMuYSE9PTApcmV0
-dXJuIEguem8oYSxrLGMpCmlmKGo9PT1pKXJldHVybiBwLmFwcGx5KGEsaykKcmV0dXJuIEguem8oYSxr
-LGMpfWlmKHIgaW5zdGFuY2VvZiBBcnJheSl7aWYoYyE9bnVsbCYmYy5hIT09MClyZXR1cm4gSC56byhh
-LGssYykKaWYoaj5pK3IubGVuZ3RoKXJldHVybiBILnpvKGEsayxudWxsKQpDLk5tLkZWKGssci5zbGlj
-ZShqLWkpKQpyZXR1cm4gcC5hcHBseShhLGspfWVsc2V7aWYoaj5pKXJldHVybiBILnpvKGEsayxjKQpv
-PU9iamVjdC5rZXlzKHIpCmlmKGM9PW51bGwpZm9yKHM9by5sZW5ndGgsbj0wO248by5sZW5ndGg7by5s
-ZW5ndGg9PT1zfHwoMCxILmxrKShvKSwrK24pQy5ObS5BKGsscltILnkob1tuXSldKQplbHNle2Zvcihz
-PW8ubGVuZ3RoLG09MCxuPTA7bjxvLmxlbmd0aDtvLmxlbmd0aD09PXN8fCgwLEgubGspKG8pLCsrbil7
-bD1ILnkob1tuXSkKaWYoYy54NCgwLGwpKXsrK20KQy5ObS5BKGssYy5xKDAsbCkpfWVsc2UgQy5ObS5B
-KGsscltsXSl9aWYobSE9PWMuYSlyZXR1cm4gSC56byhhLGssYyl9cmV0dXJuIHAuYXBwbHkoYSxrKX19
-LApwWTpmdW5jdGlvbihhKXt0aHJvdyBILmIoSC50TChhKSl9LApPSDpmdW5jdGlvbihhLGIpe2lmKGE9
-PW51bGwpSi5IbShhKQp0aHJvdyBILmIoSC5IWShhLGIpKX0sCkhZOmZ1bmN0aW9uKGEsYil7dmFyIHQs
-cyxyPSJpbmRleCIKaWYoIUgub2soYikpcmV0dXJuIG5ldyBQLnUoITAsYixyLG51bGwpCnQ9SC5TYyhK
-LkhtKGEpKQppZighKGI8MCkpe2lmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIEgucFkodCkKcz1i
-Pj10fWVsc2Ugcz0hMAppZihzKXJldHVybiBQLkNmKGIsYSxyLG51bGwsdCkKcmV0dXJuIFAueChiLHIp
-fSwKYXU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PSJJbnZhbGlkIHZhbHVlIgppZihhPmMpcmV0dXJuIG5l
-dyBQLmJKKDAsYywhMCxhLCJzdGFydCIsdCkKaWYoYiE9bnVsbCl7aWYoIUgub2soYikpcmV0dXJuIG5l
-dyBQLnUoITAsYiwiZW5kIixudWxsKQppZihiPGF8fGI+YylyZXR1cm4gbmV3IFAuYkooYSxjLCEwLGIs
-ImVuZCIsdCl9cmV0dXJuIG5ldyBQLnUoITAsYiwiZW5kIixudWxsKX0sCnRMOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBuZXcgUC51KCEwLGEsbnVsbCxudWxsKX0sCmI6ZnVuY3Rpb24oYSl7dmFyIHQKaWYoYT09bnVs
-bClhPW5ldyBQLm4oKQp0PW5ldyBFcnJvcigpCnQuZGFydEV4Y2VwdGlvbj1hCmlmKCJkZWZpbmVQcm9w
-ZXJ0eSIgaW4gT2JqZWN0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwibWVzc2FnZSIse2dldDpILmh9
-KQp0Lm5hbWU9IiJ9ZWxzZSB0LnRvU3RyaW5nPUguaApyZXR1cm4gdH0sCmg6ZnVuY3Rpb24oKXtyZXR1
-cm4gSi5qKHRoaXMuZGFydEV4Y2VwdGlvbil9LApWajpmdW5jdGlvbihhKXt0aHJvdyBILmIoYSl9LAps
-azpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5hNChhKSl9LApjTTpmdW5jdGlvbihhKXt2YXIgdCxzLHIs
-cSxwLG8KYT1ILmVBKGEucmVwbGFjZShTdHJpbmcoe30pLCckcmVjZWl2ZXIkJykpCnQ9YS5tYXRjaCgv
-XFxcJFthLXpBLVpdK1xcXCQvZykKaWYodD09bnVsbCl0PUguVk0oW10sdS5zKQpzPXQuaW5kZXhPZigi
-XFwkYXJndW1lbnRzXFwkIikKcj10LmluZGV4T2YoIlxcJGFyZ3VtZW50c0V4cHJcXCQiKQpxPXQuaW5k
-ZXhPZigiXFwkZXhwclxcJCIpCnA9dC5pbmRleE9mKCJcXCRtZXRob2RcXCQiKQpvPXQuaW5kZXhPZigi
-XFwkcmVjZWl2ZXJcXCQiKQpyZXR1cm4gbmV3IEguZjkoYS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxc
-XCRhcmd1bWVudHNcXFxcXFwkJywnZycpLCcoKD86eHxbXnhdKSopJykucmVwbGFjZShuZXcgUmVnRXhw
-KCdcXFxcXFwkYXJndW1lbnRzRXhwclxcXFxcXCQnLCdnJyksJygoPzp4fFteeF0pKiknKS5yZXBsYWNl
-KG5ldyBSZWdFeHAoJ1xcXFxcXCRleHByXFxcXFxcJCcsJ2cnKSwnKCg/Onh8W154XSkqKScpLnJlcGxh
-Y2UobmV3IFJlZ0V4cCgnXFxcXFxcJG1ldGhvZFxcXFxcXCQnLCdnJyksJygoPzp4fFteeF0pKiknKS5y
-ZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXCRyZWNlaXZlclxcXFxcXCQnLCdnJyksJygoPzp4fFteeF0p
-KiknKSxzLHIscSxwLG8pfSwKUzc6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCRleHByJCl7dmFy
-ICRhcmd1bWVudHNFeHByJD0nJGFyZ3VtZW50cyQnCnRyeXskZXhwciQuJG1ldGhvZCQoJGFyZ3VtZW50
-c0V4cHIkKX1jYXRjaCh0KXtyZXR1cm4gdC5tZXNzYWdlfX0oYSl9LApNajpmdW5jdGlvbihhKXtyZXR1
-cm4gZnVuY3Rpb24oJGV4cHIkKXt0cnl7JGV4cHIkLiRtZXRob2QkfWNhdGNoKHQpe3JldHVybiB0Lm1l
-c3NhZ2V9fShhKX0sCklqOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILlcwKGEsYj09bnVsbD9udWxs
-OmIubWV0aG9kKX0sClQzOmZ1bmN0aW9uKGEsYil7dmFyIHQ9Yj09bnVsbCxzPXQ/bnVsbDpiLm1ldGhv
-ZApyZXR1cm4gbmV3IEguYXooYSxzLHQ/bnVsbDpiLnJlY2VpdmVyKX0sClJ1OmZ1bmN0aW9uKGEpe3Zh
-ciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZj1udWxsLGU9bmV3IEguQW0oYSkKaWYoYT09bnVs
-bClyZXR1cm4gZgppZihhIGluc3RhbmNlb2YgSC5icSlyZXR1cm4gZS4kMShhLmEpCmlmKHR5cGVvZiBh
-IT09Im9iamVjdCIpcmV0dXJuIGEKaWYoImRhcnRFeGNlcHRpb24iIGluIGEpcmV0dXJuIGUuJDEoYS5k
-YXJ0RXhjZXB0aW9uKQplbHNlIGlmKCEoIm1lc3NhZ2UiIGluIGEpKXJldHVybiBhCnQ9YS5tZXNzYWdl
-CmlmKCJudW1iZXIiIGluIGEmJnR5cGVvZiBhLm51bWJlcj09Im51bWJlciIpe3M9YS5udW1iZXIKcj1z
-JjY1NTM1CmlmKChDLmpuLndHKHMsMTYpJjgxOTEpPT09MTApc3dpdGNoKHIpe2Nhc2UgNDM4OnJldHVy
-biBlLiQxKEguVDMoSC5kKHQpKyIgKEVycm9yICIrcisiKSIsZikpCmNhc2UgNDQ1OmNhc2UgNTAwNzpy
-ZXR1cm4gZS4kMShILklqKEguZCh0KSsiIChFcnJvciAiK3IrIikiLGYpKX19aWYoYSBpbnN0YW5jZW9m
-IFR5cGVFcnJvcil7cT0kLlNuKCkKcD0kLmxxKCkKbz0kLk45KCkKbj0kLmlJKCkKbT0kLktmKCkKbD0k
-LlpoKCkKaz0kLnJOKCkKJC5jMygpCmo9JC5ISygpCmk9JC5yMSgpCmg9cS5xUyh0KQppZihoIT1udWxs
-KXJldHVybiBlLiQxKEguVDMoSC55KHQpLGgpKQplbHNle2g9cC5xUyh0KQppZihoIT1udWxsKXtoLm1l
-dGhvZD0iY2FsbCIKcmV0dXJuIGUuJDEoSC5UMyhILnkodCksaCkpfWVsc2V7aD1vLnFTKHQpCmlmKGg9
-PW51bGwpe2g9bi5xUyh0KQppZihoPT1udWxsKXtoPW0ucVModCkKaWYoaD09bnVsbCl7aD1sLnFTKHQp
-CmlmKGg9PW51bGwpe2g9ay5xUyh0KQppZihoPT1udWxsKXtoPW4ucVModCkKaWYoaD09bnVsbCl7aD1q
-LnFTKHQpCmlmKGg9PW51bGwpe2g9aS5xUyh0KQpnPWghPW51bGx9ZWxzZSBnPSEwfWVsc2UgZz0hMH1l
-bHNlIGc9ITB9ZWxzZSBnPSEwfWVsc2UgZz0hMH1lbHNlIGc9ITB9ZWxzZSBnPSEwCmlmKGcpcmV0dXJu
-IGUuJDEoSC5JaihILnkodCksaCkpfX1yZXR1cm4gZS4kMShuZXcgSC52Vih0eXBlb2YgdD09InN0cmlu
-ZyI/dDoiIikpfWlmKGEgaW5zdGFuY2VvZiBSYW5nZUVycm9yKXtpZih0eXBlb2YgdD09InN0cmluZyIm
-JnQuaW5kZXhPZigiY2FsbCBzdGFjayIpIT09LTEpcmV0dXJuIG5ldyBQLktZKCkKdD1mdW5jdGlvbihi
-KXt0cnl7cmV0dXJuIFN0cmluZyhiKX1jYXRjaChkKXt9cmV0dXJuIG51bGx9KGEpCnJldHVybiBlLiQx
-KG5ldyBQLnUoITEsZixmLHR5cGVvZiB0PT0ic3RyaW5nIj90LnJlcGxhY2UoL15SYW5nZUVycm9yOlxz
-Ki8sIiIpOnQpKX1pZih0eXBlb2YgSW50ZXJuYWxFcnJvcj09ImZ1bmN0aW9uIiYmYSBpbnN0YW5jZW9m
-IEludGVybmFsRXJyb3IpaWYodHlwZW9mIHQ9PSJzdHJpbmciJiZ0PT09InRvbyBtdWNoIHJlY3Vyc2lv
-biIpcmV0dXJuIG5ldyBQLktZKCkKcmV0dXJuIGF9LAp0czpmdW5jdGlvbihhKXt2YXIgdAppZihhIGlu
-c3RhbmNlb2YgSC5icSlyZXR1cm4gYS5iCmlmKGE9PW51bGwpcmV0dXJuIG5ldyBILlhPKGEpCnQ9YS4k
-Y2FjaGVkVHJhY2UKaWYodCE9bnVsbClyZXR1cm4gdApyZXR1cm4gYS4kY2FjaGVkVHJhY2U9bmV3IEgu
-WE8oYSl9LApCNzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxPWEubGVuZ3RoCmZvcih0PTA7dDxxO3Q9
-cil7cz10KzEKcj1zKzEKYi5ZKDAsYVt0XSxhW3NdKX1yZXR1cm4gYn0sCmZ0OmZ1bmN0aW9uKGEsYixj
-LGQsZSxmKXt1LlouYihhKQpzd2l0Y2goSC5TYyhiKSl7Y2FzZSAwOnJldHVybiBhLiQwKCkKY2FzZSAx
-OnJldHVybiBhLiQxKGMpCmNhc2UgMjpyZXR1cm4gYS4kMihjLGQpCmNhc2UgMzpyZXR1cm4gYS4kMyhj
-LGQsZSkKY2FzZSA0OnJldHVybiBhLiQ0KGMsZCxlLGYpfXRocm93IEguYihuZXcgUC5DRCgiVW5zdXBw
-b3J0ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3Igd3JhcHBlZCBjbG9zdXJlIikpfSwKdFI6ZnVuY3Rp
-b24oYSxiKXt2YXIgdAppZihhPT1udWxsKXJldHVybiBudWxsCnQ9YS4kaWRlbnRpdHkKaWYoISF0KXJl
-dHVybiB0CnQ9ZnVuY3Rpb24oYyxkLGUpe3JldHVybiBmdW5jdGlvbihmLGcsaCxpKXtyZXR1cm4gZShj
-LGQsZixnLGgsaSl9fShhLGIsSC5mdCkKYS4kaWRlbnRpdHk9dApyZXR1cm4gdH0sCmlBOmZ1bmN0aW9u
-KGEsYixjLGQsZSxmLGcpe3ZhciB0LHMscixxLHAsbyxuLG0sbD1udWxsLGs9YlswXSxqPWsuJGNhbGxO
-YW1lLGk9ZT9PYmplY3QuY3JlYXRlKG5ldyBILnp4KCkuY29uc3RydWN0b3IucHJvdG90eXBlKTpPYmpl
-Y3QuY3JlYXRlKG5ldyBILnJUKGwsbCxsLGwpLmNvbnN0cnVjdG9yLnByb3RvdHlwZSkKaS4kaW5pdGlh
-bGl6ZT1pLmNvbnN0cnVjdG9yCmlmKGUpdD1mdW5jdGlvbiBzdGF0aWNfdGVhcl9vZmYoKXt0aGlzLiRp
-bml0aWFsaXplKCl9CmVsc2V7cz0kLnlqCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuVCgp
-CiQueWo9cysxCnM9bmV3IEZ1bmN0aW9uKCJhLGIsYyxkIitzLCJ0aGlzLiRpbml0aWFsaXplKGEsYixj
-LGQiK3MrIikiKQp0PXN9aS5jb25zdHJ1Y3Rvcj10CnQucHJvdG90eXBlPWkKaWYoIWUpe3I9SC5ieChh
-LGssZikKci4kcmVmbGVjdGlvbkluZm89ZH1lbHNle2kuJHN0YXRpY19uYW1lPWcKcj1rfXE9SC5pbShk
-LGUsZikKaS4kUz1xCmlbal09cgpmb3IocD1yLG89MTtvPGIubGVuZ3RoOysrbyl7bj1iW29dCm09bi4k
-Y2FsbE5hbWUKaWYobSE9bnVsbCl7bj1lP246SC5ieChhLG4sZikKaVttXT1ufWlmKG89PT1jKXtuLiRy
-ZWZsZWN0aW9uSW5mbz1kCnA9bn19aS4kQz1wCmkuJFI9ay4kUgppLiREPWsuJEQKcmV0dXJuIHR9LApp
-bTpmdW5jdGlvbihhLGIsYyl7dmFyIHQKaWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBmdW5jdGlv
-bihkLGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBkKGUpfX0oSC5CcCxhKQppZih0eXBlb2YgYT09
-InN0cmluZyIpe2lmKGIpdGhyb3cgSC5iKCJDYW5ub3QgY29tcHV0ZSBzaWduYXR1cmUgZm9yIHN0YXRp
-YyB0ZWFyb2ZmLiIpCnQ9Yz9ILlBXOkguVG4KcmV0dXJuIGZ1bmN0aW9uKGQsZSl7cmV0dXJuIGZ1bmN0
-aW9uKCl7cmV0dXJuIGUodGhpcyxkKX19KGEsdCl9dGhyb3cgSC5iKCJFcnJvciBpbiBmdW5jdGlvblR5
-cGUgb2YgdGVhcm9mZiIpfSwKdnE6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQ9SC5EVgpzd2l0Y2goYj8t
-MTphKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYo
-dGhpcylbZV0oKX19KGMsdCkKY2FzZSAxOnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlv
-bihnKXtyZXR1cm4gZih0aGlzKVtlXShnKX19KGMsdCkKY2FzZSAyOnJldHVybiBmdW5jdGlvbihlLGYp
-e3JldHVybiBmdW5jdGlvbihnLGgpe3JldHVybiBmKHRoaXMpW2VdKGcsaCl9fShjLHQpCmNhc2UgMzpy
-ZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGkpe3JldHVybiBmKHRoaXMpW2Vd
-KGcsaCxpKX19KGMsdCkKY2FzZSA0OnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbihn
-LGgsaSxqKXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSxqKX19KGMsdCkKY2FzZSA1OnJldHVybiBmdW5j
-dGlvbihlLGYpe3JldHVybiBmdW5jdGlvbihnLGgsaSxqLGspe3JldHVybiBmKHRoaXMpW2VdKGcsaCxp
-LGosayl9fShjLHQpCmRlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKCl7
-cmV0dXJuIGUuYXBwbHkoZih0aGlzKSxhcmd1bWVudHMpfX0oZCx0KX19LApieDpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHQscyxyLHEscCxvLG4KaWYoYylyZXR1cm4gSC5IZihhLGIpCnQ9Yi4kc3R1Yk5hbWUKcz1i
-Lmxlbmd0aApyPWFbdF0KcT1iPT1udWxsP3I9PW51bGw6Yj09PXIKcD0hcXx8cz49MjcKaWYocClyZXR1
-cm4gSC52cShzLCFxLHQsYikKaWYocz09PTApe3E9JC55agppZih0eXBlb2YgcSE9PSJudW1iZXIiKXJl
-dHVybiBxLlQoKQokLnlqPXErMQpvPSJzZWxmIitxCnE9InJldHVybiBmdW5jdGlvbigpe3ZhciAiK28r
-IiA9IHRoaXMuIgpwPSQubUoKcmV0dXJuIG5ldyBGdW5jdGlvbihxK0guZChwPT1udWxsPyQubUo9SC5F
-Migic2VsZiIpOnApKyI7cmV0dXJuICIrbysiLiIrSC5kKHQpKyIoKTt9IikoKX1uPSJhYmNkZWZnaGlq
-a2xtbm9wcXJzdHV2d3h5eiIuc3BsaXQoIiIpLnNwbGljZSgwLHMpLmpvaW4oIiwiKQpxPSQueWoKaWYo
-dHlwZW9mIHEhPT0ibnVtYmVyIilyZXR1cm4gcS5UKCkKJC55aj1xKzEKbis9cQpxPSJyZXR1cm4gZnVu
-Y3Rpb24oIituKyIpe3JldHVybiB0aGlzLiIKcD0kLm1KCnJldHVybiBuZXcgRnVuY3Rpb24ocStILmQo
-cD09bnVsbD8kLm1KPUguRTIoInNlbGYiKTpwKSsiLiIrSC5kKHQpKyIoIituKyIpO30iKSgpfSwKWjQ6
-ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQ9SC5EVixzPUgueVMKc3dpdGNoKGI/LTE6YSl7Y2FzZSAwOnRo
-cm93IEguYihILkVmKCJJbnRlcmNlcHRlZCBmdW5jdGlvbiB3aXRoIG5vIGFyZ3VtZW50cy4iKSkKY2Fz
-ZSAxOnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcylb
-ZV0oZyh0aGlzKSl9fShjLHQscykKY2FzZSAyOnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1
-bmN0aW9uKGgpe3JldHVybiBmKHRoaXMpW2VdKGcodGhpcyksaCl9fShjLHQscykKY2FzZSAzOnJldHVy
-biBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSl7cmV0dXJuIGYodGhpcylbZV0oZyh0
-aGlzKSxoLGkpfX0oYyx0LHMpCmNhc2UgNDpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5j
-dGlvbihoLGksail7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksail9fShjLHQscykKY2FzZSA1
-OnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSxqLGspe3JldHVybiBmKHRo
-aXMpW2VdKGcodGhpcyksaCxpLGosayl9fShjLHQscykKY2FzZSA2OnJldHVybiBmdW5jdGlvbihlLGYs
-Zyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSxqLGssbCl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGks
-aixrLGwpfX0oYyx0LHMpCmRlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsZixnLGgpe3JldHVybiBmdW5j
-dGlvbigpe2g9W2codGhpcyldCkFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGgsYXJndW1lbnRzKQpy
-ZXR1cm4gZS5hcHBseShmKHRoaXMpLGgpfX0oZCx0LHMpfX0sCkhmOmZ1bmN0aW9uKGEsYil7dmFyIHQs
-cyxyLHEscCxvLG4sbT0kLm1KCmlmKG09PW51bGwpbT0kLm1KPUguRTIoInNlbGYiKQp0PSQuUDQKaWYo
-dD09bnVsbCl0PSQuUDQ9SC5FMigicmVjZWl2ZXIiKQpzPWIuJHN0dWJOYW1lCnI9Yi5sZW5ndGgKcT1h
-W3NdCnA9Yj09bnVsbD9xPT1udWxsOmI9PT1xCm89IXB8fHI+PTI4CmlmKG8pcmV0dXJuIEguWjQociwh
-cCxzLGIpCmlmKHI9PT0xKXttPSJyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4iK0guZChtKSsi
-LiIrSC5kKHMpKyIodGhpcy4iK0guZCh0KSsiKTsiCnQ9JC55agppZih0eXBlb2YgdCE9PSJudW1iZXIi
-KXJldHVybiB0LlQoKQokLnlqPXQrMQpyZXR1cm4gbmV3IEZ1bmN0aW9uKG0rdCsifSIpKCl9bj0iYWJj
-ZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zcGxpY2UoMCxyLTEpLmpvaW4oIiwiKQpt
-PSJyZXR1cm4gZnVuY3Rpb24oIituKyIpe3JldHVybiB0aGlzLiIrSC5kKG0pKyIuIitILmQocykrIih0
-aGlzLiIrSC5kKHQpKyIsICIrbisiKTsiCnQ9JC55agppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVy
-biB0LlQoKQokLnlqPXQrMQpyZXR1cm4gbmV3IEZ1bmN0aW9uKG0rdCsifSIpKCl9LAp1YzpmdW5jdGlv
-bihhLGIsYyxkLGUsZixnKXtyZXR1cm4gSC5pQShhLGIsYyxkLCEhZSwhIWYsZyl9LApUbjpmdW5jdGlv
-bihhLGIpe3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLEgueksoYS5hKSxiKX0sClBXOmZ1bmN0aW9u
-KGEsYil7cmV0dXJuIEguY0Uodi50eXBlVW5pdmVyc2UsSC56SyhhLmMpLGIpfSwKRFY6ZnVuY3Rpb24o
-YSl7cmV0dXJuIGEuYX0sCnlTOmZ1bmN0aW9uKGEpe3JldHVybiBhLmN9LApFMjpmdW5jdGlvbihhKXt2
-YXIgdCxzLHIscT1uZXcgSC5yVCgic2VsZiIsInRhcmdldCIsInJlY2VpdmVyIiwibmFtZSIpLHA9Si5F
-cChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhxKSkKZm9yKHQ9cC5sZW5ndGgscz0wO3M8dDsrK3Mp
-e3I9cFtzXQppZihxW3JdPT09YSlyZXR1cm4gcn19LApvVDpmdW5jdGlvbihhKXtpZihhPT1udWxsKUgu
-Zk8oImJvb2xlYW4gZXhwcmVzc2lvbiBtdXN0IG5vdCBiZSBudWxsIikKcmV0dXJuIGF9LApmTzpmdW5j
-dGlvbihhKXt0aHJvdyBILmIobmV3IEgua1koYSkpfSwKYWc6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKG5l
-dyBQLmMoYSkpfSwKRWY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILkVxKGEpfSwKWWc6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHYuZ2V0SXNvbGF0ZVRhZyhhKX0sClZNOmZ1bmN0aW9uKGEsYil7YS4kdGk9YgpyZXR1
-cm4gYX0sCm9YOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIGEuJHRpfSwK
-SU06ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBILlk5KGFbIiRhIitILmQoYyldLEgub1goYikpfSwKWTk6
-ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVybiBiCmE9YS5hcHBseShudWxsLGIpCmlmKGE9PW51
-bGwpcmV0dXJuIG51bGwKaWYoQXJyYXkuaXNBcnJheShhKSlyZXR1cm4gYQppZih0eXBlb2YgYT09ImZ1
-bmN0aW9uIilyZXR1cm4gYS5hcHBseShudWxsLGIpCnJldHVybiBifSwKRlo6ZnVuY3Rpb24oYSxiLGMp
-e3JldHVybiBhLmFwcGx5KGIsSC5ZOShKLmlhKGIpWyIkYSIrSC5kKGMpXSxILm9YKGIpKSl9LAppdzpm
-dW5jdGlvbihhLGIsYyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7dmFsdWU6YyxlbnVtZXJhYmxl
-OmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KX0sCnczOmZ1bmN0aW9uKGEpe3Zh
-ciB0LHMscixxLHA9SC55KCQuTkYuJDEoYSkpLG89JC5ud1twXQppZihvIT1udWxsKXtPYmplY3QuZGVm
-aW5lUHJvcGVydHkoYSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpvLGVudW1lcmFibGU6ZmFs
-c2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBvLml9dD0kLnZ2W3BdCmlm
-KHQhPW51bGwpcmV0dXJuIHQKcz12LmludGVyY2VwdG9yc0J5VGFnW3BdCmlmKHM9PW51bGwpe3A9SC55
-KCQuVFguJDIoYSxwKSkKaWYocCE9bnVsbCl7bz0kLm53W3BdCmlmKG8hPW51bGwpe09iamVjdC5kZWZp
-bmVQcm9wZXJ0eShhLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOm8sZW51bWVyYWJsZTpmYWxz
-ZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIG8uaX10PSQudnZbcF0KaWYo
-dCE9bnVsbClyZXR1cm4gdApzPXYuaW50ZXJjZXB0b3JzQnlUYWdbcF19fWlmKHM9PW51bGwpcmV0dXJu
-IG51bGwKdD1zLnByb3RvdHlwZQpyPXBbMF0KaWYocj09PSIhIil7bz1ILlZhKHQpCiQubndbcF09bwpP
-YmplY3QuZGVmaW5lUHJvcGVydHkoYSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpvLGVudW1l
-cmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBvLml9aWYo
-cj09PSJ+Iil7JC52dltwXT10CnJldHVybiB0fWlmKHI9PT0iLSIpe3E9SC5WYSh0KQpPYmplY3QuZGVm
-aW5lUHJvcGVydHkoT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUs
-e3ZhbHVlOnEsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkK
-cmV0dXJuIHEuaX1pZihyPT09IisiKXJldHVybiBILkxjKGEsdCkKaWYocj09PSIqIil0aHJvdyBILmIo
-UC5TWShwKSkKaWYodi5sZWFmVGFnc1twXT09PXRydWUpe3E9SC5WYSh0KQpPYmplY3QuZGVmaW5lUHJv
-cGVydHkoT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVl
-OnEsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJu
-IHEuaX1lbHNlIHJldHVybiBILkxjKGEsdCl9LApMYzpmdW5jdGlvbihhLGIpe3ZhciB0PU9iamVjdC5n
-ZXRQcm90b3R5cGVPZihhKQpPYmplY3QuZGVmaW5lUHJvcGVydHkodCx2LmRpc3BhdGNoUHJvcGVydHlO
-YW1lLHt2YWx1ZTpKLlF1KGIsdCxudWxsLG51bGwpLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1
-ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBifSwKVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUXUo
-YSwhMSxudWxsLCEhYS4kaVhqKX0sClZGOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1iLnByb3RvdHlwZQpp
-Zih2LmxlYWZUYWdzW2FdPT09dHJ1ZSlyZXR1cm4gSC5WYSh0KQplbHNlIHJldHVybiBKLlF1KHQsYyxu
-dWxsLG51bGwpfSwKWEQ6ZnVuY3Rpb24oKXtpZighMD09PSQuQnYpcmV0dXJuCiQuQnY9ITAKSC5aMSgp
-fSwKWjE6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtCiQubnc9T2JqZWN0LmNyZWF0ZShudWxs
-KQokLnZ2PU9iamVjdC5jcmVhdGUobnVsbCkKSC5rTygpCnQ9di5pbnRlcmNlcHRvcnNCeVRhZwpzPU9i
-amVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpCmlmKHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiKXt3
-aW5kb3cKcj1mdW5jdGlvbigpe30KZm9yKHE9MDtxPHMubGVuZ3RoOysrcSl7cD1zW3FdCm89JC54Ny4k
-MShwKQppZihvIT1udWxsKXtuPUguVkYocCx0W3BdLG8pCmlmKG4hPW51bGwpe09iamVjdC5kZWZpbmVQ
-cm9wZXJ0eShvLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOm4sZW51bWVyYWJsZTpmYWxzZSx3
-cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKci5wcm90b3R5cGU9b319fX1mb3IocT0wO3E8
-cy5sZW5ndGg7KytxKXtwPXNbcV0KaWYoL15bQS1aYS16X10vLnRlc3QocCkpe209dFtwXQp0WyIhIitw
-XT1tCnRbIn4iK3BdPW0KdFsiLSIrcF09bQp0WyIrIitwXT1tCnRbIioiK3BdPW19fX0sCmtPOmZ1bmN0
-aW9uKCl7dmFyIHQscyxyLHEscCxvLG49Qy5ZcSgpCm49SC51ZChDLktVLEgudWQoQy5mUSxILnVkKEMu
-aTcsSC51ZChDLmk3LEgudWQoQy54aSxILnVkKEMuZGssSC51ZChDLndiKEMuTzQpLG4pKSkpKSkpCmlm
-KHR5cGVvZiBkYXJ0TmF0aXZlRGlzcGF0Y2hIb29rc1RyYW5zZm9ybWVyIT0idW5kZWZpbmVkIil7dD1k
-YXJ0TmF0aXZlRGlzcGF0Y2hIb29rc1RyYW5zZm9ybWVyCmlmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXQ9
-W3RdCmlmKHQuY29uc3RydWN0b3I9PUFycmF5KWZvcihzPTA7czx0Lmxlbmd0aDsrK3Mpe3I9dFtzXQpp
-Zih0eXBlb2Ygcj09ImZ1bmN0aW9uIiluPXIobil8fG59fXE9bi5nZXRUYWcKcD1uLmdldFVua25vd25U
-YWcKbz1uLnByb3RvdHlwZUZvclRhZwokLk5GPW5ldyBILmRDKHEpCiQuVFg9bmV3IEgud04ocCkKJC54
-Nz1uZXcgSC5WWChvKX0sCnVkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEoYil8fGJ9LAp2NDpmdW5jdGlv
-bihhLGIsYyxkLGUsZil7dmFyIHQ9Yj8ibSI6IiIscz1jPyIiOiJpIixyPWQ/InUiOiIiLHE9ZT8icyI6
-IiIscD1mPyJnIjoiIixvPWZ1bmN0aW9uKGcsaCl7dHJ5e3JldHVybiBuZXcgUmVnRXhwKGcsaCl9Y2F0
-Y2gobil7cmV0dXJuIG59fShhLHQrcytyK3ErcCkKaWYobyBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4g
-bwp0aHJvdyBILmIoUC5ycigiSWxsZWdhbCBSZWdFeHAgcGF0dGVybiAoIitTdHJpbmcobykrIikiLGEs
-bnVsbCkpfSwKbTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKHR5cGVvZiBiPT0ic3RyaW5nIilyZXR1
-cm4gYS5pbmRleE9mKGIsYyk+PTAKZWxzZSBpZihiIGluc3RhbmNlb2YgSC5WUil7dD1DLnhCLnluKGEs
-YykKcmV0dXJuIGIuYi50ZXN0KHQpfWVsc2V7dD1KLkZMKGIsQy54Qi55bihhLGMpKQpyZXR1cm4hdC5n
-bDAodCl9fSwKQTQ6ZnVuY3Rpb24oYSl7aWYoYS5pbmRleE9mKCIkIiwwKT49MClyZXR1cm4gYS5yZXBs
-YWNlKC9cJC9nLCIkJCQkIikKcmV0dXJuIGF9LAplQTpmdW5jdGlvbihhKXtpZigvW1tcXXt9KCkqKz8u
-XFxeJHxdLy50ZXN0KGEpKXJldHVybiBhLnJlcGxhY2UoL1tbXF17fSgpKis/LlxcXiR8XS9nLCJcXCQm
-IikKcmV0dXJuIGF9LAp5czpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5uTShhLGIsYykKcmV0dXJuIHR9
-LApuTTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEKaWYoYj09PSIiKXtpZihhPT09IiIpcmV0dXJu
-IGMKdD1hLmxlbmd0aApmb3Iocz1jLHI9MDtyPHQ7KytyKXM9cythW3JdK2MKcmV0dXJuIHMuY2hhckNv
-ZGVBdCgwKT09MD9zOnN9cT1hLmluZGV4T2YoYiwwKQppZihxPDApcmV0dXJuIGEKaWYoYS5sZW5ndGg8
-NTAwfHxjLmluZGV4T2YoIiQiLDApPj0wKXJldHVybiBhLnNwbGl0KGIpLmpvaW4oYykKcmV0dXJuIGEu
-cmVwbGFjZShuZXcgUmVnRXhwKEguZUEoYiksJ2cnKSxILkE0KGMpKX0sClBEOmZ1bmN0aW9uIFBEKGEs
-Yil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCldVOmZ1bmN0aW9uIFdVKCl7fSwKTFA6ZnVuY3Rpb24gTFAo
-YSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKWFI6ZnVuY3Rpb24g
-WFIoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKTEk6ZnVuY3Rpb24gTEkoYSxiLGMsZCxlKXt2YXIg
-Xz10aGlzCl8uYT1hCl8uYz1iCl8uZD1jCl8uZT1kCl8uZj1lfSwKQ2o6ZnVuY3Rpb24gQ2ooYSxiLGMp
-e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKZjk6ZnVuY3Rpb24gZjkoYSxiLGMsZCxlLGYpe3Zh
-ciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWZ9LApXMDpmdW5jdGlvbiBX
-MChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKYXo6ZnVuY3Rpb24gYXooYSxiLGMpe3RoaXMuYT1hCnRo
-aXMuYj1iCnRoaXMuYz1jfSwKdlY6ZnVuY3Rpb24gdlYoYSl7dGhpcy5hPWF9LApicTpmdW5jdGlvbiBi
-cShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQW06ZnVuY3Rpb24gQW0oYSl7dGhpcy5hPWF9LApYTzpm
-dW5jdGlvbiBYTyhhKXt0aGlzLmE9YQp0aGlzLmI9bnVsbH0sClRwOmZ1bmN0aW9uIFRwKCl7fSwKbGM6
-ZnVuY3Rpb24gbGMoKXt9LAp6eDpmdW5jdGlvbiB6eCgpe30sCnJUOmZ1bmN0aW9uIHJUKGEsYixjLGQp
-e3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LApFcTpmdW5jdGlvbiBFcShhKXt0aGlz
-LmE9YX0sCmtZOmZ1bmN0aW9uIGtZKGEpe3RoaXMuYT1hfSwKTjU6ZnVuY3Rpb24gTjUoYSl7dmFyIF89
-dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4kdGk9YX0sCnZoOmZ1bmN0
-aW9uIHZoKGEsYil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGx9LAppNTpmdW5jdGlv
-biBpNShhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApONjpmdW5jdGlvbiBONihhLGIsYyl7dmFyIF89
-dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGwKXy4kdGk9Y30sCmRDOmZ1bmN0aW9uIGRDKGEpe3Ro
-aXMuYT1hfSwKd046ZnVuY3Rpb24gd04oYSl7dGhpcy5hPWF9LApWWDpmdW5jdGlvbiBWWChhKXt0aGlz
-LmE9YX0sClZSOmZ1bmN0aW9uIFZSKGEsYil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51
-bGx9LApFSzpmdW5jdGlvbiBFSyhhKXt0aGlzLmI9YX0sCktXOmZ1bmN0aW9uIEtXKGEsYixjKXt0aGlz
-LmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClBiOmZ1bmN0aW9uIFBiKGEsYixjKXt2YXIgXz10aGlzCl8u
-YT1hCl8uYj1iCl8uYz1jCl8uZD1udWxsfSwKdFE6ZnVuY3Rpb24gdFEoYSxiKXt0aGlzLmE9YQp0aGlz
-LmM9Yn0sCnVuOmZ1bmN0aW9uIHVuKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClNk
-OmZ1bmN0aW9uIFNkKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1udWxsfSwK
-WEY6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApEUTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEludDhBcnJh
-eShhKX0sCm9kOmZ1bmN0aW9uKGEsYixjKXtpZihhPj4+MCE9PWF8fGE+PWMpdGhyb3cgSC5iKEguSFko
-YixhKSl9LApyTTpmdW5jdGlvbihhLGIsYyl7dmFyIHQKaWYoIShhPj4+MCE9PWEpKXQ9Yj4+PjAhPT1i
-fHxhPmJ8fGI+YwplbHNlIHQ9ITAKaWYodCl0aHJvdyBILmIoSC5hdShhLGIsYykpCnJldHVybiBifSwK
-V1o6ZnVuY3Rpb24gV1ooKXt9LApFVDpmdW5jdGlvbiBFVCgpe30sCmRmOmZ1bmN0aW9uIGRmKCl7fSwK
-YjA6ZnVuY3Rpb24gYjAoKXt9LApEZzpmdW5jdGlvbiBEZygpe30sClBnOmZ1bmN0aW9uIFBnKCl7fSwK
-eGo6ZnVuY3Rpb24geGooKXt9LApkRTpmdW5jdGlvbiBkRSgpe30sClpBOmZ1bmN0aW9uIFpBKCl7fSwK
-d2Y6ZnVuY3Rpb24gd2YoKXt9LApQcTpmdW5jdGlvbiBQcSgpe30sCmVFOmZ1bmN0aW9uIGVFKCl7fSwK
-VjY6ZnVuY3Rpb24gVjYoKXt9LApSRzpmdW5jdGlvbiBSRygpe30sClZQOmZ1bmN0aW9uIFZQKCl7fSwK
-V0I6ZnVuY3Rpb24gV0IoKXt9LApaRzpmdW5jdGlvbiBaRygpe30sCnhaOmZ1bmN0aW9uKGEsYil7dmFy
-IHQ9Yi5kCnJldHVybiB0PT1udWxsP2IuZD1ILkooYSwiYjgiLFtiLlFdKTp0fSwKUTE6ZnVuY3Rpb24o
-YSl7dmFyIHQ9YS56CmlmKHQ9PT02fHx0PT09N3x8dD09PTgpcmV0dXJuIEguUTEoYS5RKQpyZXR1cm4g
-dD09PTExfHx0PT09MTJ9LAptRDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kYn0sCllROmZ1bmN0aW9uKGEp
-e3JldHVybiBILkUodi50eXBlVW5pdmVyc2UsYSl9LApKUzpmdW5jdGlvbihhKXt2YXIgdD1hLiRTCmlm
-KHQhPW51bGwpe2lmKHR5cGVvZiB0PT0ibnVtYmVyIilyZXR1cm4gSC5CcCh0KQpyZXR1cm4gYS4kUygp
-fXJldHVybiBudWxsfSwKVWU6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihILlExKGIpKWlmKGEgaW5zdGFu
-Y2VvZiBILlRwKXt0PUguSlMoYSkKaWYodCE9bnVsbClyZXR1cm4gdH1yZXR1cm4gSC56SyhhKX0sCnpL
-OmZ1bmN0aW9uKGEpe3ZhciB0CmlmKGEgaW5zdGFuY2VvZiBQLmspe3Q9YS4kdGkKcmV0dXJuIHQhPW51
-bGw/dDpILlZVKGEpfWlmKEFycmF5LmlzQXJyYXkoYSkpcmV0dXJuIEgudDYoYSkKcmV0dXJuIEguVlUo
-Si5pYShhKSl9LAp0NjpmdW5jdGlvbihhKXt2YXIgdD1hLiR0aSxzPXUudQppZih0PT1udWxsKXJldHVy
-biBzCmlmKHQuY29uc3RydWN0b3IhPT1zLmNvbnN0cnVjdG9yKXJldHVybiBzCnJldHVybiB0fSwKTGg6
-ZnVuY3Rpb24oYSl7dmFyIHQ9YS4kdGkKcmV0dXJuIHQhPW51bGw/dDpILlZVKGEpfSwKVlU6ZnVuY3Rp
-b24oYSl7dmFyIHQ9YS5jb25zdHJ1Y3RvcixzPXQuJGNjYWNoZQppZihzIT1udWxsKXJldHVybiBzCnJl
-dHVybiBILnI5KGEsdCl9LApyOTpmdW5jdGlvbihhLGIpe3ZhciB0PWEgaW5zdGFuY2VvZiBILlRwP2Eu
-X19wcm90b19fLl9fcHJvdG9fXy5jb25zdHJ1Y3RvcjpiLHM9SC5haSh2LnR5cGVVbml2ZXJzZSx0Lm5h
-bWUpCmIuJGNjYWNoZT1zCnJldHVybiBzfSwKQnA6ZnVuY3Rpb24oYSl7dmFyIHQscz1hLHI9di50eXBl
-cyxxPXJbc10KaWYodHlwZW9mIHE9PSJzdHJpbmciKXt0PUguRSh2LnR5cGVVbml2ZXJzZSxxKQpyW3Nd
-PXQKcmV0dXJuIHR9cmV0dXJuIHF9LApKSjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMscj1zLnoscT1I
-LllPCmlmKEguY2Mocykpe3E9SC5JdwpzLmI9cy5hPUguaG59ZWxzZSBpZihyPT09OSl7dD1zLmRiCmlm
-KCJLTiI9PT10KXE9SC5vawplbHNlIGlmKCJDUCI9PT10KXE9SC5LSAplbHNlIGlmKCJGSyI9PT10KXE9
-SC5LSAplbHNlIGlmKCJxVSI9PT10KXE9SC5NTQplbHNlIGlmKCJhMiI9PT10KXE9SC5sCmVsc2V7cj1z
-LlEKaWYocy5jaC5ldmVyeShILmNjKSl7cy54PSIkaSIrcgpxPUgudDR9fX1zLmM9cQpyZXR1cm4gcy5j
-KGEpfSwKWU86ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcwpyZXR1cm4gSC5XZSh2LnR5cGVVbml2ZXJzZSxI
-LlVlKGEsdCksbnVsbCx0LG51bGwpfSwKdDQ6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy54CmlmKGEgaW5z
-dGFuY2VvZiBQLmspcmV0dXJuISFhW3RdCnJldHVybiEhSi5pYShhKVt0XX0sCk96OmZ1bmN0aW9uKGEp
-e3ZhciB0CmlmKGE9PW51bGwpcmV0dXJuIGEKdD10aGlzCmlmKHQuYyhhKSlyZXR1cm4gYQp0aHJvdyBI
-LmIoSC5RNShILldLKGEsSC5VZShhLHQpLEguZG0odCxudWxsKSkpKX0sCkF2OmZ1bmN0aW9uKGEpe3Zh
-ciB0CmlmKGE9PW51bGwpcmV0dXJuIGEKdD10aGlzCmlmKHQuYyhhKSlyZXR1cm4gYQp0aHJvdyBILmIo
-SC5aYyhILldLKGEsSC5VZShhLHQpLEguZG0odCxudWxsKSkpKX0sCkRoOmZ1bmN0aW9uKGEsYixjLGQp
-e3ZhciB0PW51bGwKaWYoSC5XZSh2LnR5cGVVbml2ZXJzZSxhLHQsYix0KSlyZXR1cm4gYQp0aHJvdyBI
-LmIoSC5aYygiVGhlIHR5cGUgYXJndW1lbnQgJyIrSC5kKEguZG0oYSx0KSkrIicgaXMgbm90IGEgc3Vi
-dHlwZSBvZiB0aGUgdHlwZSB2YXJpYWJsZSBib3VuZCAnIitILmQoSC5kbShiLHQpKSsiJyBvZiB0eXBl
-IHZhcmlhYmxlICciK2MrIicgaW4gJyIrSC5kKGQpKyInLiIpKX0sCldLOmZ1bmN0aW9uKGEsYixjKXt2
-YXIgdD1QLnAoYSkscz1ILmRtKGI9PW51bGw/SC56SyhhKTpiLG51bGwpCnJldHVybiB0KyI6IHR5cGUg
-JyIrSC5kKHMpKyInIGlzIG5vdCBhIHN1YnR5cGUgb2YgdHlwZSAnIitILmQoYykrIicifSwKUTU6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIG5ldyBILmh6KCJDYXN0RXJyb3I6ICIrYSl9LApQdjpmdW5jdGlvbihhLGIp
-e3JldHVybiBuZXcgSC5oeigiQ2FzdEVycm9yOiAiK0guV0soYSxudWxsLGIpKX0sClpjOmZ1bmN0aW9u
-KGEpe3JldHVybiBuZXcgSC5pTSgiVHlwZUVycm9yOiAiK2EpfSwKcTpmdW5jdGlvbihhLGIpe3JldHVy
-biBuZXcgSC5pTSgiVHlwZUVycm9yOiAiK0guV0soYSxudWxsLGIpKX0sCkl3OmZ1bmN0aW9uKGEpe3Jl
-dHVybiEwfSwKaG46ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApsOmZ1bmN0aW9uKGEpe3JldHVybiEwPT09
-YXx8ITE9PT1hfSwKRTk6ZnVuY3Rpb24oYSl7aWYoITA9PT1hfHwhMT09PWEpcmV0dXJuIGEKaWYoYT09
-bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5QdihhLCJib29sIikpfSwKeGQ6ZnVuY3Rpb24oYSl7aWYo
-ITA9PT1hfHwhMT09PWEpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEs
-ImJvb2wiKSl9LApkajpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKaWYo
-YT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5QdihhLCJkb3VibGUiKSl9LApJZzpmdW5jdGlvbihh
-KXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBI
-LmIoSC5xKGEsImRvdWJsZSIpKX0sCm9rOmZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09Im51bWJl
-ciImJk1hdGguZmxvb3IoYSk9PT1hfSwKU0g6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIi
-JiZNYXRoLmZsb29yKGEpPT09YSlyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihI
-LlB2KGEsImludCIpKX0sClNjOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIiYmTWF0aC5m
-bG9vcihhKT09PWEpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsImlu
-dCIpKX0sCktIOmZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09Im51bWJlciJ9LAp1VTpmdW5jdGlv
-bihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJv
-dyBILmIoSC5QdihhLCJudW0iKSl9LApETjpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciIp
-cmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIm51bSIpKX0sCk1NOmZ1
-bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09InN0cmluZyJ9LApyYzpmdW5jdGlvbihhKXtpZih0eXBl
-b2YgYT09InN0cmluZyIpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5Qdihh
-LCJTdHJpbmciKSl9LAp5OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gYQpp
-ZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihILnEoYSwiU3RyaW5nIikpfSwKaW86ZnVuY3Rpb24o
-YSxiKXt2YXIgdCxzLHIKZm9yKHQ9IiIscz0iIixyPTA7cjxhLmxlbmd0aDsrK3Iscz0iLCAiKXQrPUMu
-eEIuVChzLEguZG0oYVtyXSxiKSkKcmV0dXJuIHR9LApiSTpmdW5jdGlvbihhMCxhMSxhMil7dmFyIHQs
-cyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYT0iLCAiCmlmKGEyIT1udWxsKXt0PWEy
-Lmxlbmd0aAppZihhMT09bnVsbCl7YTE9SC5WTShbXSx1LnMpCnM9bnVsbH1lbHNlIHM9YTEubGVuZ3Ro
-CnI9YTEubGVuZ3RoCmZvcihxPXQ7cT4wOy0tcSlDLk5tLkEoYTEsIlQiKyhyK3EpKQpmb3IocD0iPCIs
-bz0iIixxPTA7cTx0OysrcSxvPWEpe3ArPW8Kbj1hMS5sZW5ndGgKbT1uLTEtcQppZihtPDApcmV0dXJu
-IEguT0goYTEsbSkKcD1DLnhCLlQocCxhMVttXSkKbD1hMltxXQppZighSC5jYyhsKSlwKz1DLnhCLlQo
-IiBleHRlbmRzICIsSC5kbShsLGExKSl9cCs9Ij4ifWVsc2V7cD0iIgpzPW51bGx9bj1hMC5RCms9YTAu
-Y2gKaj1rLmEKaT1qLmxlbmd0aApoPWsuYgpnPWgubGVuZ3RoCmY9ay5jCmU9Zi5sZW5ndGgKZD1ILmRt
-KG4sYTEpCmZvcihjPSIiLGI9IiIscT0wO3E8aTsrK3EsYj1hKWMrPUMueEIuVChiLEguZG0oaltxXSxh
-MSkpCmlmKGc+MCl7Yys9YisiWyIKZm9yKGI9IiIscT0wO3E8ZzsrK3EsYj1hKWMrPUMueEIuVChiLEgu
-ZG0oaFtxXSxhMSkpCmMrPSJdIn1pZihlPjApe2MrPWIrInsiCmZvcihiPSIiLHE9MDtxPGU7cSs9Mixi
-PWEpYys9Qy54Qi5UKGIsSC5kbShmW3ErMV0sYTEpKSsiICIrZltxXQpjKz0ifSJ9aWYocyE9bnVsbClh
-MS5sZW5ndGg9cwpyZXR1cm4gcCsiKCIrYysiKSA9PiAiK0guZChkKX0sCmRtOmZ1bmN0aW9uKGEsYil7
-dmFyIHQscyxyLHEscD1hLnoKaWYocD09PTUpcmV0dXJuImVyYXNlZCIKaWYocD09PTIpcmV0dXJuImR5
-bmFtaWMiCmlmKHA9PT0zKXJldHVybiJ2b2lkIgppZihwPT09MSlyZXR1cm4iTmV2ZXIiCmlmKHA9PT00
-KXJldHVybiJhbnkiCmlmKHA9PT02KXJldHVybiBILmQoSC5kbShhLlEsYikpKyIqIgppZihwPT09Nyly
-ZXR1cm4gSC5kKEguZG0oYS5RLGIpKSsiPyIKaWYocD09PTgpcmV0dXJuIkZ1dHVyZU9yPCIrSC5kKEgu
-ZG0oYS5RLGIpKSsiPiIKaWYocD09PTkpe3Q9SC5vMyhhLlEpCnM9YS5jaApyZXR1cm4gcy5sZW5ndGgh
-PT0wP3QrKCI8IitILmlvKHMsYikrIj4iKTp0fWlmKHA9PT0xMSlyZXR1cm4gSC5iSShhLGIsbnVsbCkK
-aWYocD09PTEyKXJldHVybiBILmJJKGEuUSxiLGEuY2gpCmlmKHA9PT0xMyl7cj1hLlEKcT1iLmxlbmd0
-aApyPXEtMS1yCmlmKHI8MHx8cj49cSlyZXR1cm4gSC5PSChiLHIpCnJldHVybiBiW3JdfXJldHVybiI/
-In0sCm8zOmZ1bmN0aW9uKGEpe3ZhciB0LHM9SC5KZyhhKQppZihzIT1udWxsKXJldHVybiBzCnQ9Im1p
-bmlmaWVkOiIrYQpyZXR1cm4gdH0sClFvOmZ1bmN0aW9uKGEsYil7dmFyIHQ9YS50UltiXQpmb3IoO3R5
-cGVvZiB0PT0ic3RyaW5nIjspdD1hLnRSW3RdCnJldHVybiB0fSwKYWk6ZnVuY3Rpb24oYSxiKXt2YXIg
-dCxzLHIscSxwLG89YS5lVCxuPW9bYl0KaWYobj09bnVsbClyZXR1cm4gSC5FKGEsYikKZWxzZSBpZih0
-eXBlb2Ygbj09Im51bWJlciIpe3Q9bgpzPUgubShhLDUsIiMiKQpyPVtdCmZvcihxPTA7cTx0OysrcSly
-LnB1c2gocykKcD1ILkooYSxiLHIpCm9bYl09cApyZXR1cm4gcH1lbHNlIHJldHVybiBufSwKeGI6ZnVu
-Y3Rpb24oYSxiKXtyZXR1cm4gSC5JeChhLnRSLGIpfSwKRkY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5J
-eChhLmVULGIpfSwKRTpmdW5jdGlvbihhLGIpe3ZhciB0LHM9YS5lQyxyPXMuZ2V0KGIpCmlmKHIhPW51
-bGwpcmV0dXJuIHIKdD1ILnooYSxudWxsLGIpCnMuc2V0KGIsdCkKcmV0dXJuIHR9LApjRTpmdW5jdGlv
-bihhLGIsYyl7dmFyIHQscyxyPWIuY3gKaWYocj09bnVsbClyPWIuY3g9bmV3IE1hcCgpCnQ9ci5nZXQo
-YykKaWYodCE9bnVsbClyZXR1cm4gdApzPUgueihhLGIsYykKci5zZXQoYyxzKQpyZXR1cm4gc30sCnY1
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscT1iLmN5CmlmKHE9PW51bGwpcT1iLmN5PW5ldyBNYXAo
-KQp0PWMuZGIKcz1xLmdldCh0KQppZihzIT1udWxsKXJldHVybiBzCnI9SC5hKGEsYixjLno9PT0xMD9j
-LmNoOltjXSkKcS5zZXQodCxyKQpyZXR1cm4gcn0sCno6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PUguaShI
-Lm8oYSxiLGMpKQpyZXR1cm4gdH0sCldHOmZ1bmN0aW9uKGEsYil7dmFyIHQ9Yi5kYgphLmVDLnNldCh0
-LGIpCmIuYT1ILk96CmIuYj1ILkF2CmIuYz1ILkpKCnJldHVybiBifSwKbTpmdW5jdGlvbihhLGIsYyl7
-dmFyIHQscz1hLmVDLmdldChjKQppZihzIT1udWxsKXJldHVybiBzCnQ9bmV3IEguSmMobnVsbCxudWxs
-LG51bGwpCnQuej1iCnQuZGI9YwpyZXR1cm4gSC5XRyhhLHQpfSwKdjpmdW5jdGlvbihhLGIsYyxkKXt2
-YXIgdCxzPWEuZUMuZ2V0KGQpCmlmKHMhPW51bGwpcmV0dXJuIHMKdD1uZXcgSC5KYyhudWxsLG51bGws
-bnVsbCkKdC56PWIKdC5RPWMKdC5kYj1kCnJldHVybiBILldHKGEsdCl9LApIOmZ1bmN0aW9uKGEsYil7
-dmFyIHQscz0iIitiKyJeIixyPWEuZUMuZ2V0KHMpCmlmKHIhPW51bGwpcmV0dXJuIHIKdD1uZXcgSC5K
-YyhudWxsLG51bGwsbnVsbCkKdC56PTEzCnQuUT1iCnQuZGI9cwpyZXR1cm4gSC5XRyhhLHQpfSwKVXg6
-ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9YS5sZW5ndGgKZm9yKHQ9IiIscz0iIixyPTA7cjxxOysrcixz
-PSIsIil0Kz1zK2Fbcl0uZGIKcmV0dXJuIHR9LApTNDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG89
-YS5sZW5ndGgKZm9yKHQ9IiIscz0iIixyPTA7cjxvO3IrPTIscz0iLCIpe3E9YVtyXQpwPWFbcisxXS5k
-Ygp0Kz1zK3ErIjoiK3B9cmV0dXJuIHR9LApKOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHI9YgppZihj
-Lmxlbmd0aCE9PTApcis9IjwiK0guVXgoYykrIj4iCnQ9YS5lQy5nZXQocikKaWYodCE9bnVsbClyZXR1
-cm4gdApzPW5ldyBILkpjKG51bGwsbnVsbCxudWxsKQpzLno9OQpzLlE9YgpzLmNoPWMKaWYoYy5sZW5n
-dGg+MClzLmQ9Y1swXQpzLmRiPXIKcmV0dXJuIEguV0coYSxzKX0sCmE6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0LHMscixxLHAKaWYoYi56PT09MTApe3Q9Yi5RCnM9Yi5jaC5jb25jYXQoYyl9ZWxzZXtzPWMKdD1i
-fXI9dC5kYisiOyIrKCI8IitILlV4KHMpKyI+IikKcT1hLmVDLmdldChyKQppZihxIT1udWxsKXJldHVy
-biBxCnA9bmV3IEguSmMobnVsbCxudWxsLG51bGwpCnAuej0xMApwLlE9dApwLmNoPXMKcC5kYj1yCnJl
-dHVybiBILldHKGEscCl9LApDOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscT1iLmRiLHA9Yy5hLG89
-cC5sZW5ndGgsbj1jLmIsbT1uLmxlbmd0aCxsPWMuYyxrPWwubGVuZ3RoLGo9IigiK0guVXgocCkKaWYo
-bT4wKWorPShvPjA/IiwiOiIiKSsiWyIrSC5VeChuKSsiXSIKaWYoaz4wKWorPShvPjA/IiwiOiIiKSsi
-eyIrSC5TNChsKSsifSIKdD1xKyhqKyIpIikKcz1hLmVDLmdldCh0KQppZihzIT1udWxsKXJldHVybiBz
-CnI9bmV3IEguSmMobnVsbCxudWxsLG51bGwpCnIuej0xMQpyLlE9YgpyLmNoPWMKci5kYj10CnJldHVy
-biBILldHKGEscil9LApEOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPWIuZGIrIjwiK0guVXgoYykrIj4i
-LHI9YS5lQy5nZXQocykKaWYociE9bnVsbClyZXR1cm4gcgp0PW5ldyBILkpjKG51bGwsbnVsbCxudWxs
-KQp0Lno9MTIKdC5RPWIKdC5jaD1jCnQuZGI9cwpyZXR1cm4gSC5XRyhhLHQpfSwKbzpmdW5jdGlvbihh
-LGIsYyl7cmV0dXJue3U6YSxlOmIscjpjLHM6W10scDowfX0sCmk6ZnVuY3Rpb24oYSl7dmFyIHQscyxy
-LHEscCxvLG4sbSxsLGssaixpLGgsZz1hLnIsZj1hLnMKZm9yKHQ9Zy5sZW5ndGgscz0wO3M8dDspe3I9
-Zy5jaGFyQ29kZUF0KHMpCmlmKHI+PTQ4JiZyPD01NylzPUguQShzKzEscixnLGYpCmVsc2UgaWYoKCgo
-cnwzMik+Pj4wKS05NyY2NTUzNSk8MjZ8fHI9PT05NXx8cj09PTM2KXM9SC50KGEscyxnLGYsITEpCmVs
-c2UgaWYocj09PTQ2KXM9SC50KGEscyxnLGYsITApCmVsc2V7KytzCnN3aXRjaChyKXtjYXNlIDQ0OmJy
-ZWFrCmNhc2UgNTg6YnJlYWsKY2FzZSA1OTpmLnB1c2goSC5LKGEudSxhLmUsZi5wb3AoKSkpCmJyZWFr
-CmNhc2UgOTQ6Zi5wdXNoKEguSChhLnUsZi5wb3AoKSkpCmJyZWFrCmNhc2UgMzU6Zi5wdXNoKEgubShh
-LnUsNSwiIyIpKQpicmVhawpjYXNlIDY0OmYucHVzaChILm0oYS51LDIsIkAiKSkKYnJlYWsKY2FzZSAx
-MjY6Zi5wdXNoKEgubShhLnUsMywifiIpKQpicmVhawpjYXNlIDYwOmYucHVzaChhLnApCmEucD1mLmxl
-bmd0aApicmVhawpjYXNlIDYyOnE9YS51CnA9Zi5zcGxpY2UoYS5wKQpILnIoYS51LGEuZSxwKQphLnA9
-Zi5wb3AoKQpvPWYucG9wKCkKaWYodHlwZW9mIG89PSJzdHJpbmciKWYucHVzaChILkoocSxvLHApKQpl
-bHNle249SC5LKHEsYS5lLG8pCnN3aXRjaChuLnope2Nhc2UgMTE6Zi5wdXNoKEguRChxLG4scCkpCmJy
-ZWFrCmRlZmF1bHQ6Zi5wdXNoKEguYShxLG4scCkpCmJyZWFrfX1icmVhawpjYXNlIDM4OkguSShhLGYp
-CmJyZWFrCmNhc2UgNDI6bT1hLnUKbD1ILksobSxhLmUsZi5wb3AoKSkKZi5wdXNoKEgudihtLDYsbCxs
-LmRiKyIqIikpCmJyZWFrCmNhc2UgNjM6bT1hLnUKbD1ILksobSxhLmUsZi5wb3AoKSkKZi5wdXNoKEgu
-dihtLDcsbCxsLmRiKyI/IikpCmJyZWFrCmNhc2UgNDc6bT1hLnUKbD1ILksobSxhLmUsZi5wb3AoKSkK
-Zi5wdXNoKEgudihtLDgsbCxsLmRiKyIvIikpCmJyZWFrCmNhc2UgNDA6Zi5wdXNoKGEucCkKYS5wPWYu
-bGVuZ3RoCmJyZWFrCmNhc2UgNDE6cT1hLnUKaz1uZXcgSC5HKCkKaj1xLnNFQQppPXEuc0VBCm89Zi5w
-b3AoKQppZih0eXBlb2Ygbz09Im51bWJlciIpc3dpdGNoKG8pe2Nhc2UtMTpqPWYucG9wKCkKYnJlYWsK
-Y2FzZS0yOmk9Zi5wb3AoKQpicmVhawpkZWZhdWx0OmYucHVzaChvKQpicmVha31lbHNlIGYucHVzaChv
-KQpwPWYuc3BsaWNlKGEucCkKSC5yKGEudSxhLmUscCkKYS5wPWYucG9wKCkKay5hPXAKay5iPWoKay5j
-PWkKZi5wdXNoKEguQyhxLEguSyhxLGEuZSxmLnBvcCgpKSxrKSkKYnJlYWsKY2FzZSA5MTpmLnB1c2go
-YS5wKQphLnA9Zi5sZW5ndGgKYnJlYWsKY2FzZSA5MzpwPWYuc3BsaWNlKGEucCkKSC5yKGEudSxhLmUs
-cCkKYS5wPWYucG9wKCkKZi5wdXNoKHApCmYucHVzaCgtMSkKYnJlYWsKY2FzZSAxMjM6Zi5wdXNoKGEu
-cCkKYS5wPWYubGVuZ3RoCmJyZWFrCmNhc2UgMTI1OnA9Zi5zcGxpY2UoYS5wKQpILkIoYS51LGEuZSxw
-KQphLnA9Zi5wb3AoKQpmLnB1c2gocCkKZi5wdXNoKC0yKQpicmVhawpkZWZhdWx0OnRocm93IkJhZCBj
-aGFyYWN0ZXIgIityfX19aD1mLnBvcCgpCnJldHVybiBILksoYS51LGEuZSxoKX0sCkE6ZnVuY3Rpb24o
-YSxiLGMsZCl7dmFyIHQscyxyPWItNDgKZm9yKHQ9Yy5sZW5ndGg7YTx0OysrYSl7cz1jLmNoYXJDb2Rl
-QXQoYSkKaWYoIShzPj00OCYmczw9NTcpKWJyZWFrCnI9cioxMCsocy00OCl9ZC5wdXNoKHIpCnJldHVy
-biBhfSwKdDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0LHMscixxLHAsbyxuPWIrMQpmb3IodD1jLmxl
-bmd0aDtuPHQ7KytuKXtzPWMuY2hhckNvZGVBdChuKQppZihzPT09NDYpe2lmKGUpYnJlYWsKZT0hMH1l
-bHNle2lmKCEoKCgoc3wzMik+Pj4wKS05NyY2NTUzNSk8MjZ8fHM9PT05NXx8cz09PTM2KSlyPXM+PTQ4
-JiZzPD01NwplbHNlIHI9ITAKaWYoIXIpYnJlYWt9fXE9Yy5zdWJzdHJpbmcoYixuKQppZihlKXt0PWEu
-dQpwPWEuZQppZihwLno9PT0xMClwPXAuUQpvPUguUW8odCxwLlEpW3FdCmlmKG89PW51bGwpSC5Waign
-Tm8gIicrcSsnIiBpbiAiJytILm1EKHApKyciJykKZC5wdXNoKEguY0UodCxwLG8pKX1lbHNlIGQucHVz
-aChxKQpyZXR1cm4gbn0sCkk6ZnVuY3Rpb24oYSxiKXt2YXIgdD1iLnBvcCgpCmlmKDA9PT10KXtiLnB1
-c2goSC5tKGEudSwxLCIwJiIpKQpyZXR1cm59aWYoMT09PXQpe2IucHVzaChILm0oYS51LDQsIjEmIikp
-CnJldHVybn10aHJvdyBILmIoUC5oVigiVW5leHBlY3RlZCBleHRlbmRlZCBvcGVyYXRpb24gIitILmQo
-dCkpKX0sCks6ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBjPT0ic3RyaW5nIilyZXR1cm4gSC5KKGEs
-YyxhLnNFQSkKZWxzZSBpZih0eXBlb2YgYz09Im51bWJlciIpcmV0dXJuIEguVFYoYSxiLGMpCmVsc2Ug
-cmV0dXJuIGN9LApyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPWMubGVuZ3RoCmZvcih0PTA7dDxzOysr
-dCljW3RdPUguSyhhLGIsY1t0XSl9LApCOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPWMubGVuZ3RoCmZv
-cih0PTE7dDxzO3QrPTIpY1t0XT1ILksoYSxiLGNbdF0pfSwKVFY6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
-LHMscj1iLnoKaWYocj09PTEwKXtpZihjPT09MClyZXR1cm4gYi5RCnQ9Yi5jaApzPXQubGVuZ3RoCmlm
-KGM8PXMpcmV0dXJuIHRbYy0xXQpjLT1zCmI9Yi5RCnI9Yi56fWVsc2UgaWYoYz09PTApcmV0dXJuIGIK
-aWYociE9PTkpdGhyb3cgSC5iKFAuaFYoIkluZGV4ZWQgYmFzZSBtdXN0IGJlIGFuIGludGVyZmFjZSB0
-eXBlIikpCnQ9Yi5jaAppZihjPD10Lmxlbmd0aClyZXR1cm4gdFtjLTFdCnRocm93IEguYihQLmhWKCJC
-YWQgaW5kZXggIitjKyIgZm9yICIrYi53KDApKSl9LApXZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0
-LHMscixxLHAsbyxuLG0sbCxrCmlmKGI9PT1kKXJldHVybiEwCmlmKEguY2MoZCkpcmV0dXJuITAKdD1i
-LnoKaWYodD09PTQpcmV0dXJuITAKaWYoSC5jYyhiKSlyZXR1cm4hMQppZihiPT09dS5QKXJldHVybiEw
-CnM9dD09PTEzCmlmKHMpaWYoSC5XZShhLGNbYi5RXSxjLGQsZSkpcmV0dXJuITAKcj1kLnoKaWYodD09
-PTYpcmV0dXJuIEguV2UoYSxiLlEsYyxkLGUpCmlmKHI9PT02KXtxPWQuUQpyZXR1cm4gSC5XZShhLGIs
-YyxxLGUpfWlmKHQ9PT04KXtpZighSC5XZShhLGIuUSxjLGQsZSkpcmV0dXJuITEKcmV0dXJuIEguV2Uo
-YSxILnhaKGEsYiksYyxkLGUpfWlmKHQ9PT03KXtxPUguV2UoYSxiLlEsYyxkLGUpCnJldHVybiBxfWlm
-KHI9PT04KXtpZihILldlKGEsYixjLGQuUSxlKSlyZXR1cm4hMApyZXR1cm4gSC5XZShhLGIsYyxILnha
-KGEsZCksZSl9aWYocj09PTcpe3E9SC5XZShhLGIsYyxkLlEsZSkKcmV0dXJuIHF9aWYocylyZXR1cm4h
-MQpxPXQhPT0xMQppZigoIXF8fHQ9PT0xMikmJmQ9PT11LlopcmV0dXJuITAKaWYocj09PTEyKXtpZihi
-PT09dS5nKXJldHVybiEwCmlmKHQhPT0xMilyZXR1cm4hMQpwPWIuY2gKbz1kLmNoCm49cC5sZW5ndGgK
-aWYobiE9PW8ubGVuZ3RoKXJldHVybiExCmZvcihxPXUuYXYsbT0wO208bjsrK20pe2w9cFttXQprPW9b
-bV0KcS5iKGwpCnEuYihrKQppZighSC5XZShhLGwsYyxrLGUpfHwhSC5XZShhLGssZSxsLGMpKXJldHVy
-biExfWM9Yz09bnVsbD9wOnAuY29uY2F0KGMpCmU9ZT09bnVsbD9vOm8uY29uY2F0KGUpCnJldHVybiBI
-LmJPKGEsYi5RLGMsZC5RLGUpfWlmKHI9PT0xMSl7aWYoYj09PXUuZylyZXR1cm4hMAppZihxKXJldHVy
-biExCnJldHVybiBILmJPKGEsYixjLGQsZSl9aWYodD09PTkpe2lmKHIhPT05KXJldHVybiExCnJldHVy
-biBILnBHKGEsYixjLGQsZSl9cmV0dXJuITF9LApiTzpmdW5jdGlvbihhMCxhMSxhMixhMyxhNCl7dmFy
-IHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYQppZighSC5XZShhMCxhMS5RLGEy
-LGEzLlEsYTQpKXJldHVybiExCnQ9YTEuY2gKcz1hMy5jaApyPXQuYQpxPXMuYQpwPXIubGVuZ3RoCm89
-cS5sZW5ndGgKaWYocD5vKXJldHVybiExCm49by1wCm09dC5iCmw9cy5iCms9bS5sZW5ndGgKaj1sLmxl
-bmd0aAppZihwK2s8bytqKXJldHVybiExCmZvcihpPTA7aTxwOysraSl7aD1yW2ldCmlmKCFILldlKGEw
-LHFbaV0sYTQsaCxhMikpcmV0dXJuITF9Zm9yKGk9MDtpPG47KytpKXtoPW1baV0KaWYoIUguV2UoYTAs
-cVtwK2ldLGE0LGgsYTIpKXJldHVybiExfWZvcihpPTA7aTxqOysraSl7aD1tW24raV0KaWYoIUguV2Uo
-YTAsbFtpXSxhNCxoLGEyKSlyZXR1cm4hMX1nPXQuYwpmPXMuYwplPWcubGVuZ3RoCmQ9Zi5sZW5ndGgK
-Zm9yKGk9MCxjPTA7YzxkO2MrPTIpe2I9ZltjXQpkb3tpZihpPj1lKXJldHVybiExCmE9Z1tpXQppKz0y
-fXdoaWxlKGE8YikKaWYoYjxhKXJldHVybiExCmg9Z1tpLTFdCmlmKCFILldlKGEwLGZbYysxXSxhNCxo
-LGEyKSlyZXR1cm4hMX1yZXR1cm4hMH0sCnBHOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyLHEs
-cCxvLG4sbSxsPWIuUSxrPWQuUQppZihsPT09ayl7dD1iLmNoCnM9ZC5jaApyPXQubGVuZ3RoCmZvcihx
-PTA7cTxyOysrcSl7cD10W3FdCm89c1txXQppZighSC5XZShhLHAsYyxvLGUpKXJldHVybiExfXJldHVy
-biEwfW49SC5RbyhhLGwpCmlmKG49PW51bGwpcmV0dXJuITEKbT1uW2tdCmlmKG09PW51bGwpcmV0dXJu
-ITEKcj1tLmxlbmd0aApzPWQuY2gKZm9yKHE9MDtxPHI7KytxKWlmKCFILldlKGEsSC5jRShhLGIsbVtx
-XSksYyxzW3FdLGUpKXJldHVybiExCnJldHVybiEwfSwKY2M6ZnVuY3Rpb24oYSl7dmFyIHQscwppZihh
-PT09dS5LKXJldHVybiEwCnQ9YS56CmlmKHQhPT0yKWlmKHQhPT0zKWlmKHQhPT00KWlmKHQhPT01KXM9
-dD09PTgmJkguY2MoYS5RKQplbHNlIHM9ITAKZWxzZSBzPSEwCmVsc2Ugcz0hMAplbHNlIHM9ITAKcmV0
-dXJuIHN9LApJeDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj1PYmplY3Qua2V5cyhiKSxxPXIubGVuZ3Ro
-CmZvcih0PTA7dDxxOysrdCl7cz1yW3RdCmFbc109YltzXX19LApKYzpmdW5jdGlvbiBKYyhhLGIsYyl7
-dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLnk9Xy54PV8uZD1udWxsCl8uej0wCl8uZGI9Xy5j
-eT1fLmN4PV8uY2g9Xy5RPW51bGx9LApHOmZ1bmN0aW9uIEcoKXt0aGlzLmM9dGhpcy5iPXRoaXMuYT1u
-dWxsfSwKdTk6ZnVuY3Rpb24gdTkoKXt9LApoejpmdW5jdGlvbiBoeihhKXt0aGlzLmE9YX0sCmlNOmZ1
-bmN0aW9uIGlNKGEpe3RoaXMuYT1hfSwKUjk6ZnVuY3Rpb24oYSl7cmV0dXJuIHUuZC5jKGEpfHx1LkIu
-YyhhKXx8dS5kei5jKGEpfHx1LkkuYyhhKXx8dS5BLmMoYSl8fHUuZzQuYyhhKXx8dS5nMi5jKGEpfSwK
-Smc6ZnVuY3Rpb24oYSl7cmV0dXJuIHYubWFuZ2xlZEdsb2JhbE5hbWVzW2FdfX0sSj17ClF1OmZ1bmN0
-aW9uKGEsYixjLGQpe3JldHVybntpOmEscDpiLGU6Yyx4OmR9fSwKa3M6ZnVuY3Rpb24oYSl7dmFyIHQs
-cyxyLHEscD1hW3YuZGlzcGF0Y2hQcm9wZXJ0eU5hbWVdCmlmKHA9PW51bGwpaWYoJC5Cdj09bnVsbCl7
-SC5YRCgpCnA9YVt2LmRpc3BhdGNoUHJvcGVydHlOYW1lXX1pZihwIT1udWxsKXt0PXAucAppZighMT09
-PXQpcmV0dXJuIHAuaQppZighMD09PXQpcmV0dXJuIGEKcz1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkK
-aWYodD09PXMpcmV0dXJuIHAuaQppZihwLmU9PT1zKXRocm93IEguYihQLlNZKCJSZXR1cm4gaW50ZXJj
-ZXB0b3IgZm9yICIrSC5kKHQoYSxwKSkpKX1yPWEuY29uc3RydWN0b3IKcT1yPT1udWxsP251bGw6clsk
-LlVOKCldCmlmKHEhPW51bGwpcmV0dXJuIHEKcT1ILnczKGEpCmlmKHEhPW51bGwpcmV0dXJuIHEKaWYo
-dHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEMuREcKdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkK
-aWYodD09bnVsbClyZXR1cm4gQy5aUQppZih0PT09T2JqZWN0LnByb3RvdHlwZSlyZXR1cm4gQy5aUQpp
-Zih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsJC5VTigpLHt2YWx1
-ZTpDLnZCLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJl
-dHVybiBDLnZCfXJldHVybiBDLnZCfSwKUWk6ZnVuY3Rpb24oYSxiKXtpZihhPDB8fGE+NDI5NDk2NzI5
-NSl0aHJvdyBILmIoUC5URShhLDAsNDI5NDk2NzI5NSwibGVuZ3RoIixudWxsKSkKcmV0dXJuIEoucHko
-bmV3IEFycmF5KGEpLGIpfSwKcHk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5FcChILlZNKGEsYi5DKCJq
-ZDwwPiIpKSl9LApFcDpmdW5jdGlvbihhKXthLmZpeGVkJGxlbmd0aD1BcnJheQpyZXR1cm4gYX0sCnpD
-OmZ1bmN0aW9uKGEpe2EuZml4ZWQkbGVuZ3RoPUFycmF5CmEuaW1tdXRhYmxlJGxpc3Q9QXJyYXkKcmV0
-dXJuIGF9LApHYTpmdW5jdGlvbihhKXtpZihhPDI1Nilzd2l0Y2goYSl7Y2FzZSA5OmNhc2UgMTA6Y2Fz
-ZSAxMTpjYXNlIDEyOmNhc2UgMTM6Y2FzZSAzMjpjYXNlIDEzMzpjYXNlIDE2MDpyZXR1cm4hMApkZWZh
-dWx0OnJldHVybiExfXN3aXRjaChhKXtjYXNlIDU3NjA6Y2FzZSA4MTkyOmNhc2UgODE5MzpjYXNlIDgx
-OTQ6Y2FzZSA4MTk1OmNhc2UgODE5NjpjYXNlIDgxOTc6Y2FzZSA4MTk4OmNhc2UgODE5OTpjYXNlIDgy
-MDA6Y2FzZSA4MjAxOmNhc2UgODIwMjpjYXNlIDgyMzI6Y2FzZSA4MjMzOmNhc2UgODIzOTpjYXNlIDgy
-ODc6Y2FzZSAxMjI4ODpjYXNlIDY1Mjc5OnJldHVybiEwCmRlZmF1bHQ6cmV0dXJuITF9fSwKbW06ZnVu
-Y3Rpb24oYSxiKXt2YXIgdCxzCmZvcih0PWEubGVuZ3RoO2I8dDspe3M9Qy54Qi5XZChhLGIpCmlmKHMh
-PT0zMiYmcyE9PTEzJiYhSi5HYShzKSlicmVhazsrK2J9cmV0dXJuIGJ9LApjMTpmdW5jdGlvbihhLGIp
-e3ZhciB0LHMKZm9yKDtiPjA7Yj10KXt0PWItMQpzPUMueEIuTzIoYSx0KQppZihzIT09MzImJnMhPT0x
-MyYmIUouR2EocykpYnJlYWt9cmV0dXJuIGJ9LApSRTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVy
-biBhCmlmKHR5cGVvZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEou
-YzUucHJvdG90eXBlCnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQLmspcmV0dXJuIGEKcmV0dXJuIEou
-a3MoYSl9LApUSjpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIEoucUkucHJv
-dG90eXBlCmlmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90b3R5cGUKaWYoYT09bnVs
-bClyZXR1cm4gYQppZihhLmNvbnN0cnVjdG9yPT1BcnJheSlyZXR1cm4gSi5qZC5wcm90b3R5cGUKaWYo
-dHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90
-b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuaylyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0s
-ClU2OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90b3R5cGUK
-aWYoYT09bnVsbClyZXR1cm4gYQppZihhLmNvbnN0cnVjdG9yPT1BcnJheSlyZXR1cm4gSi5qZC5wcm90
-b3R5cGUKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4g
-Si5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuaylyZXR1cm4gYQpyZXR1cm4g
-Si5rcyhhKX0sCmlhOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIil7aWYoTWF0aC5mbG9v
-cihhKT09YSlyZXR1cm4gSi51ci5wcm90b3R5cGUKcmV0dXJuIEouVkEucHJvdG90eXBlfWlmKHR5cGVv
-ZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gSi5ZRS5w
-cm90b3R5cGUKaWYodHlwZW9mIGE9PSJib29sZWFuIilyZXR1cm4gSi55RS5wcm90b3R5cGUKaWYoYS5j
-b25zdHJ1Y3Rvcj09QXJyYXkpcmV0dXJuIEouamQucHJvdG90eXBlCmlmKHR5cGVvZiBhIT0ib2JqZWN0
-Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBhfWlm
-KGEgaW5zdGFuY2VvZiBQLmspcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LApyWTpmdW5jdGlvbihhKXtp
-Zih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIEouRHIucHJvdG90eXBlCmlmKGE9PW51bGwpcmV0dXJu
-IGEKaWYoIShhIGluc3RhbmNlb2YgUC5rKSlyZXR1cm4gSi5rZC5wcm90b3R5cGUKcmV0dXJuIGF9LAp6
-cTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJl
-dHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVu
-Y3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5rKXJl
-dHVybiBhCnJldHVybiBKLmtzKGEpfSwKQjI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLnpxKGEpLlko
-YSxiLGMpfSwKQ006ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouUkUoYSkuZHUoYSxiLGMsZCl9LApG
-TDpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLmRkKGEsYil9LApHQTpmdW5jdGlvbihhLGIpe3Jl
-dHVybiBKLnpxKGEpLlcoYSxiKX0sCkdyOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdtVyhhKX0s
-CkhtOmZ1bmN0aW9uKGEpe3JldHVybiBKLlU2KGEpLmdoKGEpfSwKSVQ6ZnVuY3Rpb24oYSl7cmV0dXJu
-IEouenEoYSkuZ2t6KGEpfSwKSnk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5pYShhKS5lNyhhLGIpfSwK
-S1Y6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS55bihhLGIpfSwKTHQ6ZnVuY3Rpb24oYSl7cmV0
-dXJuIEouUkUoYSkud2coYSl9LApNMTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouenEoYSkuRTIoYSxi
-LGMpfSwKUU06ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1B1KGEpfSwKUXo6ZnVuY3Rpb24oYSxi
-KXtyZXR1cm4gSi5yWShhKS5XZChhLGIpfSwKUk06ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVy
-biBiPT1udWxsCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYiE9bnVsbCYmYT09PWIKcmV0dXJu
-IEouaWEoYSkuRE4oYSxiKX0sClQwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnJZKGEpLmJTKGEpfSwKYTY6
-ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5PMihhLGIpfSwKYlQ6ZnVuY3Rpb24oYSl7cmV0dXJu
-IEouUkUoYSkuRDQoYSl9LApiYjpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIiYmdHlw
-ZW9mIGI9PSJudW1iZXIiKXJldHVybiBhK2IKcmV0dXJuIEouVEooYSkuVChhLGIpfSwKY0g6ZnVuY3Rp
-b24oYSl7cmV0dXJuIEouclkoYSkuaGMoYSl9LApkUjpmdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5n
-REQoYSl9LApkWjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5SRShhKS5PbihhLGIsYyxkKX0sCmRn
-OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLnJZKGEpLmk3KGEsYixjLGQpfSwKZGg6ZnVuY3Rpb24o
-YSl7cmV0dXJuIEouUkUoYSkudG4oYSl9LApoRTpmdW5jdGlvbihhLGIpe3JldHVybiBKLnpxKGEpLlUo
-YSxiKX0sCmhmOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlhKGEpLmdpKGEpfSwKaHc6ZnVuY3Rpb24oYSxi
-KXtyZXR1cm4gSi5yWShhKS5UYyhhLGIpfSwKaWc6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1Fn
-KGEpfSwKajpmdW5jdGlvbihhKXtyZXR1cm4gSi5pYShhKS53KGEpfSwKbDU6ZnVuY3Rpb24oYSxiKXty
-ZXR1cm4gSi5SRShhKS5zaGYoYSxiKX0sCmxkOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5yWShhKS5O
-aihhLGIsYyl9LApxMDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouclkoYSkuUWkoYSxiLGMpfSwKcUY6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1ZsKGEpfSwKdEg6ZnVuY3Rpb24oYSxiLGMpe3JldHVy
-biBKLlJFKGEpLnBrKGEsYixjKX0sCncyOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGI9PT0ibnVtYmVy
-IilpZihhLmNvbnN0cnVjdG9yPT1BcnJheXx8dHlwZW9mIGE9PSJzdHJpbmcifHxILlh0KGEsYVt2LmRp
-c3BhdGNoUHJvcGVydHlOYW1lXSkpaWYoYj4+PjA9PT1iJiZiPGEubGVuZ3RoKXJldHVybiBhW2JdCnJl
-dHVybiBKLlU2KGEpLnEoYSxiKX0sCnpsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouVTYoYSkudGcoYSxi
-KX0sCnZCOmZ1bmN0aW9uIHZCKCl7fSwKeUU6ZnVuY3Rpb24geUUoKXt9LApZRTpmdW5jdGlvbiBZRSgp
-e30sCk1GOmZ1bmN0aW9uIE1GKCl7fSwKaUM6ZnVuY3Rpb24gaUMoKXt9LAprZDpmdW5jdGlvbiBrZCgp
-e30sCmM1OmZ1bmN0aW9uIGM1KCl7fSwKamQ6ZnVuY3Rpb24gamQoYSl7dGhpcy4kdGk9YX0sClBvOmZ1
-bmN0aW9uIFBvKGEpe3RoaXMuJHRpPWF9LAptMTpmdW5jdGlvbiBtMShhLGIsYyl7dmFyIF89dGhpcwpf
-LmE9YQpfLmI9YgpfLmM9MApfLmQ9bnVsbApfLiR0aT1jfSwKcUk6ZnVuY3Rpb24gcUkoKXt9LAp1cjpm
-dW5jdGlvbiB1cigpe30sClZBOmZ1bmN0aW9uIFZBKCl7fSwKRHI6ZnVuY3Rpb24gRHIoKXt9fSxQPXsK
-T2o6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9e30KaWYoc2VsZi5zY2hlZHVsZUltbWVkaWF0ZSE9bnVsbCly
-ZXR1cm4gUC5FWCgpCmlmKHNlbGYuTXV0YXRpb25PYnNlcnZlciE9bnVsbCYmc2VsZi5kb2N1bWVudCE9
-bnVsbCl7dD1zZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCnM9c2VsZi5kb2N1bWVudC5j
-cmVhdGVFbGVtZW50KCJzcGFuIikKci5hPW51bGwKbmV3IHNlbGYuTXV0YXRpb25PYnNlcnZlcihILnRS
-KG5ldyBQLnRoKHIpLDEpKS5vYnNlcnZlKHQse2NoaWxkTGlzdDp0cnVlfSkKcmV0dXJuIG5ldyBQLmhh
-KHIsdCxzKX1lbHNlIGlmKHNlbGYuc2V0SW1tZWRpYXRlIT1udWxsKXJldHVybiBQLnl0KCkKcmV0dXJu
-IFAucVcoKX0sClpWOmZ1bmN0aW9uKGEpe3NlbGYuc2NoZWR1bGVJbW1lZGlhdGUoSC50UihuZXcgUC5W
-cyh1Lk0uYihhKSksMCkpfSwKcUc6ZnVuY3Rpb24oYSl7c2VsZi5zZXRJbW1lZGlhdGUoSC50UihuZXcg
-UC5GdCh1Lk0uYihhKSksMCkpfSwKQno6ZnVuY3Rpb24oYSl7dS5NLmIoYSkKUC5RTigwLGEpfSwKUU46
-ZnVuY3Rpb24oYSxiKXt2YXIgdD1uZXcgUC5XMygpCnQuQ1koYSxiKQpyZXR1cm4gdH0sCkZYOmZ1bmN0
-aW9uKGEpe3JldHVybiBuZXcgUC5paChuZXcgUC52cygkLlgzLGEuQygidnM8MD4iKSksYS5DKCJpaDww
-PiIpKX0sCkRJOmZ1bmN0aW9uKGEsYil7YS4kMigwLG51bGwpCmIuYj0hMApyZXR1cm4gYi5hfSwKalE6
-ZnVuY3Rpb24oYSxiKXtQLkplKGEsYil9LAp5QzpmdW5jdGlvbihhLGIpe2IuYU0oMCxhKX0sCmYzOmZ1
-bmN0aW9uKGEsYil7Yi53MChILlJ1KGEpLEgudHMoYSkpfSwKSmU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
-LHI9bmV3IFAuV00oYikscT1uZXcgUC5TWChiKQppZihhIGluc3RhbmNlb2YgUC52cylhLlFkKHIscSx1
-LnopCmVsc2V7dD11LnoKaWYodS5jLmMoYSkpYS5TcShyLHEsdCkKZWxzZXtzPW5ldyBQLnZzKCQuWDMs
-dS5fKQpzLmE9NApzLmM9YQpzLlFkKHIsbnVsbCx0KX19fSwKbHo6ZnVuY3Rpb24oYSl7dmFyIHQ9ZnVu
-Y3Rpb24oYixjKXtyZXR1cm4gZnVuY3Rpb24oZCxlKXt3aGlsZSh0cnVlKXRyeXtiKGQsZSkKYnJlYWt9
-Y2F0Y2gocyl7ZT1zCmQ9Y319fShhLDEpCnJldHVybiAkLlgzLkxqKG5ldyBQLkdzKHQpLHUuUCx1LmVn
-LHUueil9LApHUTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuRnkoYSwxKX0sClRoOmZ1bmN0aW9uKCl7
-cmV0dXJuIEMud1F9LApZbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuRnkoYSwzKX0sCmwwOmZ1bmN0
-aW9uKGEsYil7cmV0dXJuIG5ldyBQLnE0KGEsYi5DKCJxNDwwPiIpKX0sCmszOmZ1bmN0aW9uKGEsYil7
-dmFyIHQscyxyCmIuYT0xCnRyeXthLlNxKG5ldyBQLnBWKGIpLG5ldyBQLlU3KGIpLHUuUCl9Y2F0Y2go
-cil7dD1ILlJ1KHIpCnM9SC50cyhyKQpQLnJiKG5ldyBQLnZyKGIsdCxzKSl9fSwKQTk6ZnVuY3Rpb24o
-YSxiKXt2YXIgdCxzLHIKZm9yKHQ9dS5fO3M9YS5hLHM9PT0yOylhPXQuYihhLmMpCmlmKHM+PTQpe3I9
-Yi5haCgpCmIuYT1hLmEKYi5jPWEuYwpQLkhaKGIscil9ZWxzZXtyPXUueC5iKGIuYykKYi5hPTIKYi5j
-PWEKYS5qUShyKX19LApIWjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxo
-LGcsZixlPW51bGwsZD17fSxjPWQuYT1hCmZvcih0PXUubixzPXUueCxyPXUuYzshMDspe3E9e30KcD1j
-LmE9PT04CmlmKGI9PW51bGwpe2lmKHApe289dC5iKGMuYykKUC5MMihlLGUsYy5iLG8uYSxvLmIpfXJl
-dHVybn1mb3IoO249Yi5hLG4hPW51bGw7Yj1uKXtiLmE9bnVsbApQLkhaKGQuYSxiKX1jPWQuYQptPWMu
-YwpxLmE9cApxLmI9bQpsPSFwCmlmKGwpe2s9Yi5jCms9KGsmMSkhPT0wfHwoayYxNSk9PT04fWVsc2Ug
-az0hMAppZihrKXtrPWIuYgpqPWsuYgppZihwKXtpPWMuYj09PWoKaT0hKGl8fGkpfWVsc2UgaT0hMQpp
-ZihpKXt0LmIobSkKUC5MMihlLGUsYy5iLG0uYSxtLmIpCnJldHVybn1oPSQuWDMKaWYoaCE9PWopJC5Y
-Mz1qCmVsc2UgaD1lCmM9Yi5jCmlmKChjJjE1KT09PTgpbmV3IFAuUlQoZCxxLGIscCkuJDAoKQplbHNl
-IGlmKGwpe2lmKChjJjEpIT09MCluZXcgUC5ycShxLGIsbSkuJDAoKX1lbHNlIGlmKChjJjIpIT09MClu
-ZXcgUC5SVyhkLHEsYikuJDAoKQppZihoIT1udWxsKSQuWDM9aApjPXEuYgppZihyLmMoYykpe2lmKGMu
-YT49NCl7Zz1zLmIoay5jKQprLmM9bnVsbApiPWsuTjgoZykKay5hPWMuYQprLmM9Yy5jCmQuYT1jCmNv
-bnRpbnVlfWVsc2UgUC5BOShjLGspCnJldHVybn19Zj1iLmIKZz1zLmIoZi5jKQpmLmM9bnVsbApiPWYu
-TjgoZykKYz1xLmEKbD1xLmIKaWYoIWMpe2YuJHRpLmQuYihsKQpmLmE9NApmLmM9bH1lbHNle3QuYihs
-KQpmLmE9OApmLmM9bH1kLmE9ZgpjPWZ9fSwKVkg6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZih1LmFnLmMo
-YSkpcmV0dXJuIGIuTGooYSx1LnosdS5LLHUubCkKdD11LnkKaWYodC5jKGEpKXJldHVybiB0LmIoYSkK
-dGhyb3cgSC5iKFAuTDMoYSwib25FcnJvciIsIkVycm9yIGhhbmRsZXIgbXVzdCBhY2NlcHQgb25lIE9i
-amVjdCBvciBvbmUgT2JqZWN0IGFuZCBhIFN0YWNrVHJhY2UgYXMgYXJndW1lbnRzLCBhbmQgcmV0dXJu
-IGEgYSB2YWxpZCByZXN1bHQiKSl9LApwdTpmdW5jdGlvbigpe3ZhciB0LHMKZm9yKDt0PSQuUzYsdCE9
-bnVsbDspeyQubWc9bnVsbApzPXQuYgokLlM2PXMKaWYocz09bnVsbCkkLms4PW51bGwKdC5hLiQwKCl9
-fSwKZU46ZnVuY3Rpb24oKXskLlVEPSEwCnRyeXtQLnB1KCl9ZmluYWxseXskLm1nPW51bGwKJC5VRD0h
-MQppZigkLlM2IT1udWxsKSQudXQoKS4kMShQLlVJKCkpfX0sCmVXOmZ1bmN0aW9uKGEpe3ZhciB0PW5l
-dyBQLk9NKGEpCmlmKCQuUzY9PW51bGwpeyQuUzY9JC5rOD10CmlmKCEkLlVEKSQudXQoKS4kMShQLlVJ
-KCkpfWVsc2UgJC5rOD0kLms4LmI9dH0sCnJSOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj0kLlM2CmlmKHI9
-PW51bGwpe1AuZVcoYSkKJC5tZz0kLms4CnJldHVybn10PW5ldyBQLk9NKGEpCnM9JC5tZwppZihzPT1u
-dWxsKXt0LmI9cgokLlM2PSQubWc9dH1lbHNle3QuYj1zLmIKJC5tZz1zLmI9dAppZih0LmI9PW51bGwp
-JC5rOD10fX0sCnJiOmZ1bmN0aW9uKGEpe3ZhciB0PW51bGwscz0kLlgzCmlmKEMuTlU9PT1zKXtQLlRr
-KHQsdCxDLk5VLGEpCnJldHVybn1QLlRrKHQsdCxzLHUuTS5iKHMuR1koYSkpKX0sClF3OmZ1bmN0aW9u
-KGEsYil7aWYoYT09bnVsbClILlZqKFAuRWUoInN0cmVhbSIpKQpyZXR1cm4gbmV3IFAueEkoYi5DKCJ4
-STwwPiIpKX0sCkwyOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQ9e30KdC5hPWQKUC5yUihuZXcgUC5w
-Syh0LGUpKX0sClQ4OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVy
-biBkLiQwKCkKJC5YMz1jCnQ9cwp0cnl7cz1kLiQwKCkKcmV0dXJuIHN9ZmluYWxseXskLlgzPXR9fSwK
-eXY6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBkLiQx
-KGUpCiQuWDM9Ywp0PXMKdHJ5e3M9ZC4kMShlKQpyZXR1cm4gc31maW5hbGx5eyQuWDM9dH19LApReDpm
-dW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBkLiQy
-KGUsZikKJC5YMz1jCnQ9cwp0cnl7cz1kLiQyKGUsZikKcmV0dXJuIHN9ZmluYWxseXskLlgzPXR9fSwK
-VGs6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQKdS5NLmIoZCkKdD1DLk5VIT09YwppZih0KWQ9ISghdHx8
-ITEpP2MuR1koZCk6Yy5SVChkLHUuSCkKUC5lVyhkKX0sCnRoOmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1h
-fSwKaGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVu
-Y3Rpb24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChhKXt0aGlzLmE9YX0sClczOmZ1bmN0
-aW9uIFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0
-aW9uIGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRpPWJ9LApXTTpmdW5jdGlvbiBXTShh
-KXt0aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7
-dGhpcy5hPWF9LApGeTpmdW5jdGlvbiBGeShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKR1Y6ZnVuY3Rp
-b24gR1YoYSxiKXt2YXIgXz10aGlzCl8uYT1hCl8uZD1fLmM9Xy5iPW51bGwKXy4kdGk9Yn0sCnE0OmZ1
-bmN0aW9uIHE0KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmI4OmZ1bmN0aW9uIGI4KCl7fSwKUGY6
-ZnVuY3Rpb24gUGYoKXt9LApaZjpmdW5jdGlvbiBaZihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApG
-ZTpmdW5jdGlvbiBGZShhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5hPW51bGwKXy5iPWEKXy5jPWIKXy5k
-PWMKXy5lPWQKXy4kdGk9ZX0sCnZzOmZ1bmN0aW9uIHZzKGEsYil7dmFyIF89dGhpcwpfLmE9MApfLmI9
-YQpfLmM9bnVsbApfLiR0aT1ifSwKZGE6ZnVuY3Rpb24gZGEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-Cm9ROmZ1bmN0aW9uIG9RKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApwVjpmdW5jdGlvbiBwVihhKXt0
-aGlzLmE9YX0sClU3OmZ1bmN0aW9uIFU3KGEpe3RoaXMuYT1hfSwKdnI6ZnVuY3Rpb24gdnIoYSxiLGMp
-e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKckg6ZnVuY3Rpb24gckgoYSxiKXt0aGlzLmE9YQp0
-aGlzLmI9Yn0sCktGOmZ1bmN0aW9uIEtGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApaTDpmdW5jdGlv
-biBaTChhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApSVDpmdW5jdGlvbiBSVChhLGIs
-YyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKalo6ZnVuY3Rpb24galooYSl7
-dGhpcy5hPWF9LApycTpmdW5jdGlvbiBycShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9
-LApSVzpmdW5jdGlvbiBSVyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApPTTpmdW5j
-dGlvbiBPTShhKXt0aGlzLmE9YQp0aGlzLmI9bnVsbH0sCnFoOmZ1bmN0aW9uIHFoKCl7fSwKQjU6ZnVu
-Y3Rpb24gQjUoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClBJOmZ1bmN0aW9uIFBJKGEsYil7dGhpcy5h
-PWEKdGhpcy5iPWJ9LApNTzpmdW5jdGlvbiBNTygpe30sCmtUOmZ1bmN0aW9uIGtUKCl7fSwKeEk6ZnVu
-Y3Rpb24geEkoYSl7dGhpcy4kdGk9YX0sCkN3OmZ1bmN0aW9uIEN3KGEsYil7dGhpcy5hPWEKdGhpcy5i
-PWJ9LAptMDpmdW5jdGlvbiBtMCgpe30sCnBLOmZ1bmN0aW9uIHBLKGEsYil7dGhpcy5hPWEKdGhpcy5i
-PWJ9LApKaTpmdW5jdGlvbiBKaSgpe30sCmhqOmZ1bmN0aW9uIGhqKGEsYixjKXt0aGlzLmE9YQp0aGlz
-LmI9Ygp0aGlzLmM9Y30sClZwOmZ1bmN0aW9uIFZwKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApPUjpm
-dW5jdGlvbiBPUihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApFRjpmdW5jdGlvbihh
-LGIsYyl7cmV0dXJuIGIuQygiQDwwPiIpLksoYykuQygiRm88MSwyPiIpLmIoSC5CNyhhLG5ldyBILk41
-KGIuQygiQDwwPiIpLksoYykuQygiTjU8MSwyPiIpKSkpfSwKRmw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-bmV3IEguTjUoYS5DKCJAPDA+IikuSyhiKS5DKCJONTwxLDI+IikpfSwKTHM6ZnVuY3Rpb24oYSl7cmV0
-dXJuIG5ldyBQLmI2KGEuQygiYjY8MD4iKSl9LApUMjpmdW5jdGlvbigpe3ZhciB0PU9iamVjdC5jcmVh
-dGUobnVsbCkKdFsiPG5vbi1pZGVudGlmaWVyLWtleT4iXT10CmRlbGV0ZSB0WyI8bm9uLWlkZW50aWZp
-ZXIta2V5PiJdCnJldHVybiB0fSwKcmo6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PW5ldyBQLmxtKGEsYixj
-LkMoImxtPDA+IikpCnQuYz1hLmUKcmV0dXJuIHR9LApFUDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscwpp
-ZihQLmhCKGEpKXtpZihiPT09IigiJiZjPT09IikiKXJldHVybiIoLi4uKSIKcmV0dXJuIGIrIi4uLiIr
-Y310PUguVk0oW10sdS5zKQpDLk5tLkEoJC54ZyxhKQp0cnl7UC5WcihhLHQpfWZpbmFsbHl7aWYoMD49
-JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54ZywtMSkKJC54Zy5wb3AoKX1zPVAudmcoYix1LlIuYih0
-KSwiLCAiKStjCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKV0U6ZnVuY3Rpb24oYSxiLGMp
-e3ZhciB0LHMKaWYoUC5oQihhKSlyZXR1cm4gYisiLi4uIitjCnQ9bmV3IFAuUm4oYikKQy5ObS5BKCQu
-eGcsYSkKdHJ5e3M9dApzLmE9UC52ZyhzLmEsYSwiLCAiKX1maW5hbGx5e2lmKDA+PSQueGcubGVuZ3Ro
-KXJldHVybiBILk9IKCQueGcsLTEpCiQueGcucG9wKCl9dC5hKz1jCnM9dC5hCnJldHVybiBzLmNoYXJD
-b2RlQXQoMCk9PTA/czpzfSwKaEI6ZnVuY3Rpb24oYSl7dmFyIHQscwpmb3IodD0kLnhnLmxlbmd0aCxz
-PTA7czx0OysrcylpZihhPT09JC54Z1tzXSlyZXR1cm4hMApyZXR1cm4hMX0sClZyOmZ1bmN0aW9uKGEs
-Yil7dmFyIHQscyxyLHEscCxvLG4sbT1hLmdreihhKSxsPTAsaz0wCndoaWxlKCEwKXtpZighKGw8ODB8
-fGs8MykpYnJlYWsKaWYoIW0ubSgpKXJldHVybgp0PUguZChtLmdSKG0pKQpDLk5tLkEoYix0KQpsKz10
-Lmxlbmd0aCsyOysra31pZighbS5tKCkpe2lmKGs8PTUpcmV0dXJuCmlmKDA+PWIubGVuZ3RoKXJldHVy
-biBILk9IKGIsLTEpCnM9Yi5wb3AoKQppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpyPWIu
-cG9wKCl9ZWxzZXtxPW0uZ1IobSk7KytrCmlmKCFtLm0oKSl7aWYoazw9NCl7Qy5ObS5BKGIsSC5kKHEp
-KQpyZXR1cm59cz1ILmQocSkKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcj1iLnBvcCgp
-CmwrPXMubGVuZ3RoKzJ9ZWxzZXtwPW0uZ1IobSk7KytrCmZvcig7bS5tKCk7cT1wLHA9byl7bz1tLmdS
-KG0pOysrawppZihrPjEwMCl7d2hpbGUoITApe2lmKCEobD43NSYmaz4zKSlicmVhawppZigwPj1iLmxl
-bmd0aClyZXR1cm4gSC5PSChiLC0xKQpsLT1iLnBvcCgpLmxlbmd0aCsyOy0ta31DLk5tLkEoYiwiLi4u
-IikKcmV0dXJufX1yPUguZChxKQpzPUguZChwKQpsKz1zLmxlbmd0aCtyLmxlbmd0aCs0fX1pZihrPmIu
-bGVuZ3RoKzIpe2wrPTUKbj0iLi4uIn1lbHNlIG49bnVsbAp3aGlsZSghMCl7aWYoIShsPjgwJiZiLmxl
-bmd0aD4zKSlicmVhawppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpsLT1iLnBvcCgpLmxl
-bmd0aCsyCmlmKG49PW51bGwpe2wrPTUKbj0iLi4uIn19aWYobiE9bnVsbClDLk5tLkEoYixuKQpDLk5t
-LkEoYixyKQpDLk5tLkEoYixzKX0sCnRNOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPVAuTHMoYikKZm9y
-KHQ9YS5sZW5ndGgscz0wO3M8YS5sZW5ndGg7YS5sZW5ndGg9PT10fHwoMCxILmxrKShhKSwrK3Mpci5B
-KDAsYi5iKGFbc10pKQpyZXR1cm4gcn0sCm5POmZ1bmN0aW9uKGEpe3ZhciB0LHM9e30KaWYoUC5oQihh
-KSlyZXR1cm4iey4uLn0iCnQ9bmV3IFAuUm4oIiIpCnRyeXtDLk5tLkEoJC54ZyxhKQp0LmErPSJ7Igpz
-LmE9ITAKSi5oRShhLG5ldyBQLnJhKHMsdCkpCnQuYSs9In0ifWZpbmFsbHl7aWYoMD49JC54Zy5sZW5n
-dGgpcmV0dXJuIEguT0goJC54ZywtMSkKJC54Zy5wb3AoKX1zPXQuYQpyZXR1cm4gcy5jaGFyQ29kZUF0
-KDApPT0wP3M6c30sCmI2OmZ1bmN0aW9uIGI2KGEpe3ZhciBfPXRoaXMKXy5hPTAKXy5mPV8uZT1fLmQ9
-Xy5jPV8uYj1udWxsCl8ucj0wCl8uJHRpPWF9LApibjpmdW5jdGlvbiBibihhKXt0aGlzLmE9YQp0aGlz
-LmM9dGhpcy5iPW51bGx9LApsbTpmdW5jdGlvbiBsbShhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9
-YgpfLmQ9Xy5jPW51bGwKXy4kdGk9Y30sCm1XOmZ1bmN0aW9uIG1XKCl7fSwKTFU6ZnVuY3Rpb24gTFUo
-KXt9LApsRDpmdW5jdGlvbiBsRCgpe30sCmlsOmZ1bmN0aW9uIGlsKCl7fSwKcmE6ZnVuY3Rpb24gcmEo
-YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCllrOmZ1bmN0aW9uIFlrKCl7fSwKeVE6ZnVuY3Rpb24geVEo
-YSl7dGhpcy5hPWF9LApLUDpmdW5jdGlvbiBLUCgpe30sClBuOmZ1bmN0aW9uIFBuKCl7fSwKR2o6ZnVu
-Y3Rpb24gR2ooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKbGY6ZnVuY3Rpb24gbGYoKXt9LApSSzpm
-dW5jdGlvbiBSSygpe30sClh2OmZ1bmN0aW9uIFh2KCl7fSwKblk6ZnVuY3Rpb24gblkoKXt9LApXWTpm
-dW5jdGlvbiBXWSgpe30sClJVOmZ1bmN0aW9uIFJVKCl7fSwKQlM6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
-LHIscQppZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgSC5iKEgudEwoYSkpCnQ9bnVsbAp0cnl7dD1K
-U09OLnBhcnNlKGEpfWNhdGNoKHIpe3M9SC5SdShyKQpxPVAucnIoU3RyaW5nKHMpLG51bGwsbnVsbCkK
-dGhyb3cgSC5iKHEpfXE9UC5RZSh0KQpyZXR1cm4gcX0sClFlOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKGE9
-PW51bGwpcmV0dXJuIG51bGwKaWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBhCmlmKE9iamVjdC5n
-ZXRQcm90b3R5cGVPZihhKSE9PUFycmF5LnByb3RvdHlwZSlyZXR1cm4gbmV3IFAudXcoYSxPYmplY3Qu
-Y3JlYXRlKG51bGwpKQpmb3IodD0wO3Q8YS5sZW5ndGg7Kyt0KWFbdF09UC5RZShhW3RdKQpyZXR1cm4g
-YX0sCmt5OmZ1bmN0aW9uKGEsYixjLGQpe2lmKGIgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBQ
-LlJQKCExLGIsYyxkKQpyZXR1cm4gbnVsbH0sClJQOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscj0k
-LnJmKCkKaWYocj09bnVsbClyZXR1cm4gbnVsbAp0PTA9PT1jCmlmKHQmJiEwKXJldHVybiBQLk9RKHIs
-YikKcz1iLmxlbmd0aApkPVAuakIoYyxkLHMpCmlmKHQmJmQ9PT1zKXJldHVybiBQLk9RKHIsYikKcmV0
-dXJuIFAuT1EocixiLnN1YmFycmF5KGMsZCkpfSwKT1E6ZnVuY3Rpb24oYSxiKXtpZihQLkJlKGIpKXJl
-dHVybiBudWxsCnJldHVybiBQLkpoKGEsYil9LApKaDpmdW5jdGlvbihhLGIpe3ZhciB0LHMKdHJ5e3Q9
-YS5kZWNvZGUoYikKcmV0dXJuIHR9Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4gbnVsbH0sCkJlOmZ1bmN0
-aW9uKGEpe3ZhciB0LHM9YS5sZW5ndGgtMgpmb3IodD0wO3Q8czsrK3QpaWYoYVt0XT09PTIzNylpZigo
-YVt0KzFdJjIyNCk9PT0xNjApcmV0dXJuITAKcmV0dXJuITF9LApXSTpmdW5jdGlvbigpe3ZhciB0LHMK
-dHJ5e3Q9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2ZhdGFsOnRydWV9KQpyZXR1cm4gdH1jYXRjaChz
-KXtILlJ1KHMpfXJldHVybiBudWxsfSwKY1A6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscgpmb3IodD1K
-LlU2KGEpLHM9YjtzPGM7KytzKXtyPXQucShhLHMpCmlmKHR5cGVvZiByIT09Im51bWJlciIpcmV0dXJu
-IHIuek0oKQppZigociYxMjcpIT09cilyZXR1cm4gcy1ifXJldHVybiBjLWJ9LAp4TTpmdW5jdGlvbihh
-LGIsYyxkLGUsZil7aWYoQy5qbi56WShmLDQpIT09MCl0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNl
-NjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIGZvdXIsIGlzICIrZixh
-LGMpKQppZihkK2UhPT1mKXRocm93IEguYihQLnJyKCJJbnZhbGlkIGJhc2U2NCBwYWRkaW5nLCAnPScg
-bm90IGF0IHRoZSBlbmQiLGEsYikpCmlmKGU+Mil0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQg
-cGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFjdGVycyIsYSxiKSl9LAp1dzpmdW5jdGlvbiB1
-dyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1udWxsfSwKaTg6ZnVuY3Rpb24gaTgoYSl7dGhp
-cy5hPWF9LApDVjpmdW5jdGlvbiBDVigpe30sCnZBOmZ1bmN0aW9uIHZBKCl7fSwKVWs6ZnVuY3Rpb24g
-VWsoKXt9LAp3STpmdW5jdGlvbiB3SSgpe30sClppOmZ1bmN0aW9uIFppKCl7fSwKYnk6ZnVuY3Rpb24g
-YnkoKXt9LApNeDpmdW5jdGlvbiBNeChhKXt0aGlzLmE9YX0sCnU1OmZ1bmN0aW9uIHU1KCl7fSwKRTM6
-ZnVuY3Rpb24gRTMoKXt9LApSdzpmdW5jdGlvbiBSdyhhKXt0aGlzLmI9MAp0aGlzLmM9YX0sCkdZOmZ1
-bmN0aW9uIEdZKGEpe3RoaXMuYT1hfSwKYno6ZnVuY3Rpb24gYnooYSxiKXt2YXIgXz10aGlzCl8uYT1h
-Cl8uYj1iCl8uYz0hMApfLmY9Xy5lPV8uZD0wfSwKUUE6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PUguSHAo
-YSxjKQppZih0IT1udWxsKXJldHVybiB0CmlmKGIhPW51bGwpcmV0dXJuIGIuJDEoYSkKdGhyb3cgSC5i
-KFAucnIoYSxudWxsLG51bGwpKX0sCkY6ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIEguVHApcmV0
-dXJuIGEudygwKQpyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5kKEguTShhKSkrIicifSwKTzg6ZnVuY3Rp
-b24oYSxiLGMpe3ZhciB0LHM9Si5RaShhLGMpCmlmKGEhPT0wJiYhMClmb3IodD0wO3Q8cy5sZW5ndGg7
-Kyt0KUMuTm0uWShzLHQsYikKcmV0dXJuIHN9LApDSDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1ILlZN
-KFtdLGMuQygiamQ8MD4iKSkKZm9yKHQ9Si5JVChhKTt0Lm0oKTspQy5ObS5BKHMsYy5iKHQuZ1IodCkp
-KQppZihiKXJldHVybiBzCnJldHVybiBjLkMoInpNPDA+IikuYihKLkVwKHMpKX0sCkFGOmZ1bmN0aW9u
-KGEsYil7cmV0dXJuIGIuQygiek08MD4iKS5iKEouekMoUC5DSChhLCExLGIpKSl9LApITTpmdW5jdGlv
-bihhLGIsYyl7dmFyIHQKaWYoQXJyYXkuaXNBcnJheShhKSl7dS50LmIoYSkKdD1hLmxlbmd0aApjPVAu
-akIoYixjLHQpCnJldHVybiBILmVUKGI+MHx8Yzx0P0MuTm0uRDYoYSxiLGMpOmEpfWlmKHUuYm0uYyhh
-KSlyZXR1cm4gSC5mdyhhLGIsUC5qQihiLGMsYS5sZW5ndGgpKQpyZXR1cm4gUC5idyhhLGIsYyl9LApP
-bzpmdW5jdGlvbihhKXtyZXR1cm4gSC5MdyhhKX0sCmJ3OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIs
-cSxwPW51bGwKaWYoYjwwKXRocm93IEguYihQLlRFKGIsMCxKLkhtKGEpLHAscCkpCnQ9Yz09bnVsbApp
-ZighdCYmYzxiKXRocm93IEguYihQLlRFKGMsYixKLkhtKGEpLHAscCkpCnM9Si5JVChhKQpmb3Iocj0w
-O3I8YjsrK3IpaWYoIXMubSgpKXRocm93IEguYihQLlRFKGIsMCxyLHAscCkpCnE9W10KaWYodClmb3Io
-O3MubSgpOylxLnB1c2gocy5nUihzKSkKZWxzZSBmb3Iocj1iO3I8YzsrK3Ipe2lmKCFzLm0oKSl0aHJv
-dyBILmIoUC5URShjLGIscixwLHApKQpxLnB1c2gocy5nUihzKSl9cmV0dXJuIEguZVQocSl9LApudTpm
-dW5jdGlvbihhKXtyZXR1cm4gbmV3IEguVlIoYSxILnY0KGEsITEsITAsITEsITEsITEpKX0sCnZnOmZ1
-bmN0aW9uKGEsYixjKXt2YXIgdD1KLklUKGIpCmlmKCF0Lm0oKSlyZXR1cm4gYQppZihjLmxlbmd0aD09
-PTApe2RvIGErPUguZCh0LmdSKHQpKQp3aGlsZSh0Lm0oKSl9ZWxzZXthKz1ILmQodC5nUih0KSkKZm9y
-KDt0Lm0oKTspYT1hK2MrSC5kKHQuZ1IodCkpfXJldHVybiBhfSwKbHI6ZnVuY3Rpb24oYSxiLGMsZCl7
-cmV0dXJuIG5ldyBQLm1wKGEsYixjLGQpfSwKdW86ZnVuY3Rpb24oKXt2YXIgdD1ILk0wKCkKaWYodCE9
-bnVsbClyZXR1cm4gUC5oSyh0KQp0aHJvdyBILmIoUC5MNCgiJ1VyaS5iYXNlJyBpcyBub3Qgc3VwcG9y
-dGVkIikpfSwKZVA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyLHEscCxvLG49IjAxMjM0NTY3ODlB
-QkNERUYiCmlmKGM9PT1DLnhNKXt0PSQuejQoKS5iCmlmKHR5cGVvZiBiIT0ic3RyaW5nIilILlZqKEgu
-dEwoYikpCnQ9dC50ZXN0KGIpfWVsc2UgdD0hMQppZih0KXJldHVybiBiCkguTGgoYykuQygiVWsuUyIp
-LmIoYikKcz1jLmdaRSgpLldKKGIpCmZvcih0PXMubGVuZ3RoLHI9MCxxPSIiO3I8dDsrK3Ipe3A9c1ty
-XQppZihwPDEyOCl7bz1wPj4+NAppZihvPj04KXJldHVybiBILk9IKGEsbykKbz0oYVtvXSYxPDwocCYx
-NSkpIT09MH1lbHNlIG89ITEKaWYobylxKz1ILkx3KHApCmVsc2UgcT1kJiZwPT09MzI/cSsiKyI6cSsi
-JSIrbltwPj4+NCYxNV0rbltwJjE1XX1yZXR1cm4gcS5jaGFyQ29kZUF0KDApPT0wP3E6cX0sCkdxOmZ1
-bmN0aW9uKGEpe3ZhciB0PU1hdGguYWJzKGEpLHM9YTwwPyItIjoiIgppZih0Pj0xMDAwKXJldHVybiIi
-K2EKaWYodD49MTAwKXJldHVybiBzKyIwIit0CmlmKHQ+PTEwKXJldHVybiBzKyIwMCIrdApyZXR1cm4g
-cysiMDAwIit0fSwKVng6ZnVuY3Rpb24oYSl7aWYoYT49MTAwKXJldHVybiIiK2EKaWYoYT49MTApcmV0
-dXJuIjAiK2EKcmV0dXJuIjAwIithfSwKaDA6ZnVuY3Rpb24oYSl7aWYoYT49MTApcmV0dXJuIiIrYQpy
-ZXR1cm4iMCIrYX0sCnA6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIifHxILmwoYSl8fG51
-bGw9PWEpcmV0dXJuIEouaihhKQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIEpTT04uc3RyaW5n
-aWZ5KGEpCnJldHVybiBQLkYoYSl9LApoVjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuQzYoYSl9LAp4
-WTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAudSghMSxudWxsLG51bGwsYSl9LApMMzpmdW5jdGlvbihh
-LGIsYyl7cmV0dXJuIG5ldyBQLnUoITAsYSxiLGMpfSwKRWU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQ
-LnUoITEsbnVsbCxhLCJNdXN0IG5vdCBiZSBudWxsIil9LAp4OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5l
-dyBQLmJKKG51bGwsbnVsbCwhMCxhLGIsIlZhbHVlIG5vdCBpbiByYW5nZSIpfSwKVEU6ZnVuY3Rpb24o
-YSxiLGMsZCxlKXtyZXR1cm4gbmV3IFAuYkooYixjLCEwLGEsZCwiSW52YWxpZCB2YWx1ZSIpfSwKd0E6
-ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYTxifHxhPmMpdGhyb3cgSC5iKFAuVEUoYSxiLGMsZCxudWxsKSl9
-LApqQjpmdW5jdGlvbihhLGIsYyl7aWYoMD5hfHxhPmMpdGhyb3cgSC5iKFAuVEUoYSwwLGMsInN0YXJ0
-IixudWxsKSkKaWYoYiE9bnVsbCl7aWYoYT5ifHxiPmMpdGhyb3cgSC5iKFAuVEUoYixhLGMsImVuZCIs
-bnVsbCkpCnJldHVybiBifXJldHVybiBjfSwKazE6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYSE9PSJu
-dW1iZXIiKXJldHVybiBhLkooKQppZihhPDApdGhyb3cgSC5iKFAuVEUoYSwwLG51bGwsYixudWxsKSl9
-LApDZjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0PUguU2MoZT09bnVsbD9KLkhtKGIpOmUpCnJldHVy
-biBuZXcgUC5lWSh0LCEwLGEsYywiSW5kZXggb3V0IG9mIHJhbmdlIil9LApMNDpmdW5jdGlvbihhKXty
-ZXR1cm4gbmV3IFAudWIoYSl9LApTWTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuZHMoYSl9LApQVjpm
-dW5jdGlvbihhKXtyZXR1cm4gbmV3IFAubGooYSl9LAphNDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAu
-VVYoYSl9LApycjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBQLmFFKGEsYixjKX0sCmRIOmZ1bmN0
-aW9uKGEsYixjLGQpe3ZhciB0LHM9SC5WTShbXSxkLkMoImpkPDA+IikpCkMuTm0uc2gocyxhKQpmb3Io
-dD0wO3Q8YTsrK3QpQy5ObS5ZKHMsdCxiLiQxKHQpKQpyZXR1cm4gc30sCmhLOmZ1bmN0aW9uKGEpe3Zh
-ciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlPW51bGwsZD1hLmxlbmd0aAppZihkPj01KXt0
-PSgoSi5ReihhLDQpXjU4KSozfEMueEIuV2QoYSwwKV4xMDB8Qy54Qi5XZChhLDEpXjk3fEMueEIuV2Qo
-YSwyKV4xMTZ8Qy54Qi5XZChhLDMpXjk3KT4+PjAKaWYodD09PTApcmV0dXJuIFAuS0QoZDxkP0MueEIu
-TmooYSwwLGQpOmEsNSxlKS5nbFIoKQplbHNlIGlmKHQ9PT0zMilyZXR1cm4gUC5LRChDLnhCLk5qKGEs
-NSxkKSwwLGUpLmdsUigpfXM9bmV3IEFycmF5KDgpCnMuZml4ZWQkbGVuZ3RoPUFycmF5CnI9SC5WTShz
-LHUudCkKQy5ObS5ZKHIsMCwwKQpDLk5tLlkociwxLC0xKQpDLk5tLlkociwyLC0xKQpDLk5tLlkociw3
-LC0xKQpDLk5tLlkociwzLDApCkMuTm0uWShyLDQsMCkKQy5ObS5ZKHIsNSxkKQpDLk5tLlkociw2LGQp
-CmlmKFAuVUIoYSwwLGQsMCxyKT49MTQpQy5ObS5ZKHIsNyxkKQpxPXJbMV0KaWYodHlwZW9mIHEhPT0i
-bnVtYmVyIilyZXR1cm4gcS50QigpCmlmKHE+PTApaWYoUC5VQihhLDAscSwyMCxyKT09PTIwKXJbN109
-cQpzPXJbMl0KaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5UKCkKcD1zKzEKbz1yWzNdCm49
-cls0XQptPXJbNV0KbD1yWzZdCmlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0dXJuIGwuSigpCmlmKHR5
-cGVvZiBtIT09Im51bWJlciIpcmV0dXJuIEgucFkobSkKaWYobDxtKW09bAppZih0eXBlb2YgbiE9PSJu
-dW1iZXIiKXJldHVybiBuLkooKQppZihuPHApbj1tCmVsc2UgaWYobjw9cSluPXErMQppZih0eXBlb2Yg
-byE9PSJudW1iZXIiKXJldHVybiBvLkooKQppZihvPHApbz1uCnM9cls3XQppZih0eXBlb2YgcyE9PSJu
-dW1iZXIiKXJldHVybiBzLkooKQprPXM8MAppZihrKWlmKHA+cSszKXtqPWUKaz0hMX1lbHNle3M9bz4w
-CmlmKHMmJm8rMT09PW4pe2o9ZQprPSExfWVsc2V7aWYoIShtPGQmJm09PT1uKzImJkoucTAoYSwiLi4i
-LG4pKSlpPW0+bisyJiZKLnEwKGEsIi8uLiIsbS0zKQplbHNlIGk9ITAKaWYoaSl7aj1lCms9ITF9ZWxz
-ZXtpZihxPT09NClpZihKLnEwKGEsImZpbGUiLDApKXtpZihwPD0wKXtpZighQy54Qi5RaShhLCIvIixu
-KSl7aD0iZmlsZTovLy8iCnQ9M31lbHNle2g9ImZpbGU6Ly8iCnQ9Mn1hPWgrQy54Qi5OaihhLG4sZCkK
-cS09MApzPXQtMAptKz1zCmwrPXMKZD1hLmxlbmd0aApwPTcKbz03Cm49N31lbHNlIGlmKG49PT1tKXtn
-PW0rMTsrK2wKYT1DLnhCLmk3KGEsbixtLCIvIik7KytkCm09Z31qPSJmaWxlIn1lbHNlIGlmKEMueEIu
-UWkoYSwiaHR0cCIsMCkpe2lmKHMmJm8rMz09PW4mJkMueEIuUWkoYSwiODAiLG8rMSkpe2Y9bi0zCm0t
-PTMKbC09MwphPUMueEIuaTcoYSxvLG4sIiIpCmQtPTMKbj1mfWo9Imh0dHAifWVsc2Ugaj1lCmVsc2Ug
-aWYocT09PTUmJkoucTAoYSwiaHR0cHMiLDApKXtpZihzJiZvKzQ9PT1uJiZKLnEwKGEsIjQ0MyIsbysx
-KSl7Zj1uLTQKbS09NApsLT00CmE9Si5kZyhhLG8sbiwiIikKZC09MwpuPWZ9aj0iaHR0cHMifWVsc2Ug
-aj1lCms9ITB9fX1lbHNlIGo9ZQppZihrKXtzPWEubGVuZ3RoCmlmKGQ8cyl7YT1KLmxkKGEsMCxkKQpx
-LT0wCnAtPTAKby09MApuLT0wCm0tPTAKbC09MH1yZXR1cm4gbmV3IFAuVWYoYSxxLHAsbyxuLG0sbCxq
-KX1yZXR1cm4gUC5qdihhLDAsZCxxLHAsbyxuLG0sbCxqKX0sCk10OmZ1bmN0aW9uKGEpe0gueShhKQpy
-ZXR1cm4gUC5rdShhLDAsYS5sZW5ndGgsQy54TSwhMSl9LApXWDpmdW5jdGlvbihhKXt2YXIgdD11Lk4K
-cmV0dXJuIEMuTm0uTjAoSC5WTShhLnNwbGl0KCImIiksdS5zKSxQLkZsKHQsdCksbmV3IFAubjEoQy54
-TSksdS5mKX0sCkhoOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPW51bGwsbD0iSVB2
-NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cyIsaz0iZWFjaCBwYXJ0IG11c3Qg
-YmUgaW4gdGhlIHJhbmdlIDAuLjI1NSIsaj1uZXcgUC5jUyhhKSxpPW5ldyBVaW50OEFycmF5KDQpCmZv
-cih0PWkubGVuZ3RoLHM9YixyPXMscT0wO3M8YzsrK3Mpe3A9Qy54Qi5PMihhLHMpCmlmKHAhPT00Nil7
-aWYoKHBeNDgpPjkpai4kMigiaW52YWxpZCBjaGFyYWN0ZXIiLHMpfWVsc2V7aWYocT09PTMpai4kMihs
-LHMpCm89UC5RQShDLnhCLk5qKGEscixzKSxtLG0pCmlmKHR5cGVvZiBvIT09Im51bWJlciIpcmV0dXJu
-IG8ub3MoKQppZihvPjI1NSlqLiQyKGsscikKbj1xKzEKaWYocT49dClyZXR1cm4gSC5PSChpLHEpCmlb
-cV09bwpyPXMrMQpxPW59fWlmKHEhPT0zKWouJDIobCxjKQpvPVAuUUEoQy54Qi5OaihhLHIsYyksbSxt
-KQppZih0eXBlb2YgbyE9PSJudW1iZXIiKXJldHVybiBvLm9zKCkKaWYobz4yNTUpai4kMihrLHIpCmlm
-KHE+PXQpcmV0dXJuIEguT0goaSxxKQppW3FdPW8KcmV0dXJuIGl9LAplZzpmdW5jdGlvbihhLGIsYTAp
-e3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQ9bmV3IFAuVkMoYSksYz1uZXcgUC5K
-VChkLGEpCmlmKGEubGVuZ3RoPDIpZC4kMSgiYWRkcmVzcyBpcyB0b28gc2hvcnQiKQp0PUguVk0oW10s
-dS50KQpmb3Iocz1iLHI9cyxxPSExLHA9ITE7czxhMDsrK3Mpe289Qy54Qi5PMihhLHMpCmlmKG89PT01
-OCl7aWYocz09PWIpeysrcwppZihDLnhCLk8yKGEscykhPT01OClkLiQyKCJpbnZhbGlkIHN0YXJ0IGNv
-bG9uLiIscykKcj1zfWlmKHM9PT1yKXtpZihxKWQuJDIoIm9ubHkgb25lIHdpbGRjYXJkIGA6OmAgaXMg
-YWxsb3dlZCIscykKQy5ObS5BKHQsLTEpCnE9ITB9ZWxzZSBDLk5tLkEodCxjLiQyKHIscykpCnI9cysx
-fWVsc2UgaWYobz09PTQ2KXA9ITB9aWYodC5sZW5ndGg9PT0wKWQuJDEoInRvbyBmZXcgcGFydHMiKQpu
-PXI9PT1hMAptPUMuTm0uZ3JaKHQpCmlmKG4mJm0hPT0tMSlkLiQyKCJleHBlY3RlZCBhIHBhcnQgYWZ0
-ZXIgbGFzdCBgOmAiLGEwKQppZighbilpZighcClDLk5tLkEodCxjLiQyKHIsYTApKQplbHNle2w9UC5I
-aChhLHIsYTApCkMuTm0uQSh0LChsWzBdPDw4fGxbMV0pPj4+MCkKQy5ObS5BKHQsKGxbMl08PDh8bFsz
-XSk+Pj4wKX1pZihxKXtpZih0Lmxlbmd0aD43KWQuJDEoImFuIGFkZHJlc3Mgd2l0aCBhIHdpbGRjYXJk
-IG11c3QgaGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cyIpfWVsc2UgaWYodC5sZW5ndGghPT04KWQuJDEoImFu
-IGFkZHJlc3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHMiKQpr
-PW5ldyBVaW50OEFycmF5KDE2KQpmb3IobT10Lmxlbmd0aCxqPWsubGVuZ3RoLGk9OS1tLHM9MCxoPTA7
-czxtOysrcyl7Zz10W3NdCmlmKGc9PT0tMSlmb3IoZj0wO2Y8aTsrK2Ype2lmKGg8MHx8aD49ailyZXR1
-cm4gSC5PSChrLGgpCmtbaF09MAplPWgrMQppZihlPj1qKXJldHVybiBILk9IKGssZSkKa1tlXT0wCmgr
-PTJ9ZWxzZXtlPUMuam4ud0coZyw4KQppZihoPDB8fGg+PWopcmV0dXJuIEguT0goayxoKQprW2hdPWUK
-ZT1oKzEKaWYoZT49ailyZXR1cm4gSC5PSChrLGUpCmtbZV09ZyYyNTUKaCs9Mn19cmV0dXJuIGt9LApq
-djpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxqKXt2YXIgdCxzLHIscSxwLG8sbixtPW51bGwKaWYo
-aj09bnVsbClpZihkPmIpaj1QLlBpKGEsYixkKQplbHNle2lmKGQ9PT1iKVAuUjMoYSxiLCJJbnZhbGlk
-IGVtcHR5IHNjaGVtZSIpCmo9IiJ9aWYoZT5iKXt0PWQrMwpzPXQ8ZT9QLnpSKGEsdCxlLTEpOiIiCnI9
-UC5PZShhLGUsZiwhMSkKaWYodHlwZW9mIGYhPT0ibnVtYmVyIilyZXR1cm4gZi5UKCkKcT1mKzEKaWYo
-dHlwZW9mIGchPT0ibnVtYmVyIilyZXR1cm4gSC5wWShnKQpwPXE8Zz9QLndCKFAuUUEoSi5sZChhLHEs
-ZyksbmV3IFAuZTEoYSxmKSxtKSxqKTptfWVsc2V7cD1tCnI9cApzPSIifW89UC5rYShhLGcsaCxtLGos
-ciE9bnVsbCkKaWYodHlwZW9mIGghPT0ibnVtYmVyIilyZXR1cm4gaC5KKCkKbj1oPGk/UC5sZShhLGgr
-MSxpLG0pOm0KcmV0dXJuIG5ldyBQLkRuKGoscyxyLHAsbyxuLGk8Yz9QLnRHKGEsaSsxLGMpOm0pfSwK
-d0s6ZnVuY3Rpb24oYSl7aWYoYT09PSJodHRwIilyZXR1cm4gODAKaWYoYT09PSJodHRwcyIpcmV0dXJu
-IDQ0MwpyZXR1cm4gMH0sClIzOmZ1bmN0aW9uKGEsYixjKXt0aHJvdyBILmIoUC5ycihjLGEsYikpfSwK
-a0U6ZnVuY3Rpb24oYSxiKXtDLk5tLlUoYSxuZXcgUC5OWSghMSkpfSwKSE46ZnVuY3Rpb24oYSxiLGMp
-e3ZhciB0LHMscgpmb3IodD1ILnFDKGEsYyxudWxsLEgudDYoYSkuZCksdD1uZXcgSC5hNyh0LHQuZ2go
-dCksdC4kdGkuQygiYTc8YUwuRT4iKSk7dC5tKCk7KXtzPXQuZApyPVAubnUoJ1siKi86PD4/XFxcXHxd
-JykKcy50b1N0cmluZwppZihILm0yKHMsciwwKSl7dD1QLkw0KCJJbGxlZ2FsIGNoYXJhY3RlciBpbiBw
-YXRoOiAiK3MpCnRocm93IEguYih0KX19fSwKcmc6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZighKDY1PD1h
-JiZhPD05MCkpdD05Nzw9YSYmYTw9MTIyCmVsc2UgdD0hMAppZih0KXJldHVybgp0PVAuTDQoIklsbGVn
-YWwgZHJpdmUgbGV0dGVyICIrUC5PbyhhKSkKdGhyb3cgSC5iKHQpfSwKd0I6ZnVuY3Rpb24oYSxiKXtp
-ZihhIT1udWxsJiZhPT09UC53SyhiKSlyZXR1cm4gbnVsbApyZXR1cm4gYX0sCk9lOmZ1bmN0aW9uKGEs
-YixjLGQpe3ZhciB0LHMscixxLHAsbwppZihhPT1udWxsKXJldHVybiBudWxsCmlmKGI9PT1jKXJldHVy
-biIiCmlmKEMueEIuTzIoYSxiKT09PTkxKXtpZih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVybiBjLkhO
-KCkKdD1jLTEKaWYoQy54Qi5PMihhLHQpIT09OTMpUC5SMyhhLGIsIk1pc3NpbmcgZW5kIGBdYCB0byBt
-YXRjaCBgW2AgaW4gaG9zdCIpCnM9YisxCnI9UC50byhhLHMsdCkKaWYodHlwZW9mIHIhPT0ibnVtYmVy
-IilyZXR1cm4gci5KKCkKaWYocjx0KXtxPXIrMQpwPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixxKT9yKzM6
-cSx0LCIlMjUiKX1lbHNlIHA9IiIKUC5lZyhhLHMscikKcmV0dXJuIEMueEIuTmooYSxiLHIpLnRvTG93
-ZXJDYXNlKCkrcCsiXSJ9aWYodHlwZW9mIGMhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShjKQpvPWIKZm9y
-KDtvPGM7KytvKWlmKEMueEIuTzIoYSxvKT09PTU4KXtyPUMueEIuWFUoYSwiJSIsYikKaWYoIShyPj1i
-JiZyPGMpKXI9YwppZihyPGMpe3E9cisxCnA9UC5PQShhLEMueEIuUWkoYSwiMjUiLHEpP3IrMzpxLGMs
-IiUyNSIpfWVsc2UgcD0iIgpQLmVnKGEsYixyKQpyZXR1cm4iWyIrQy54Qi5OaihhLGIscikrcCsiXSJ9
-cmV0dXJuIFAuT0woYSxiLGMpfSwKdG86ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHM9Qy54Qi5YVShhLCIl
-IixiKQppZihzPj1iKXtpZih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVybiBILnBZKGMpCnQ9czxjfWVs
-c2UgdD0hMQpyZXR1cm4gdD9zOmN9LApPQTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHIscSxwLG8s
-bixtLGwsaz1kIT09IiI/bmV3IFAuUm4oZCk6bnVsbAppZih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVy
-biBILnBZKGMpCnQ9YgpzPXQKcj0hMApmb3IoO3Q8Yzspe3E9Qy54Qi5PMihhLHQpCmlmKHE9PT0zNyl7
-cD1QLnJ2KGEsdCwhMCkKbz1wPT1udWxsCmlmKG8mJnIpe3QrPTMKY29udGludWV9aWYoaz09bnVsbClr
-PW5ldyBQLlJuKCIiKQpuPWsuYSs9Qy54Qi5OaihhLHMsdCkKaWYobylwPUMueEIuTmooYSx0LHQrMykK
-ZWxzZSBpZihwPT09IiUiKVAuUjMoYSx0LCJab25lSUQgc2hvdWxkIG5vdCBjb250YWluICUgYW55bW9y
-ZSIpCmsuYT1uK3AKdCs9MwpzPXQKcj0hMH1lbHNle2lmKHE8MTI3KXtvPXE+Pj40CmlmKG8+PTgpcmV0
-dXJuIEguT0goQy5GMyxvKQpvPShDLkYzW29dJjE8PChxJjE1KSkhPT0wfWVsc2Ugbz0hMQppZihvKXtp
-ZihyJiY2NTw9cSYmOTA+PXEpe2lmKGs9PW51bGwpaz1uZXcgUC5SbigiIikKaWYoczx0KXtrLmErPUMu
-eEIuTmooYSxzLHQpCnM9dH1yPSExfSsrdH1lbHNle2lmKChxJjY0NTEyKT09PTU1Mjk2JiZ0KzE8Yyl7
-bT1DLnhCLk8yKGEsdCsxKQppZigobSY2NDUxMik9PT01NjMyMCl7cT02NTUzNnwocSYxMDIzKTw8MTB8
-bSYxMDIzCmw9Mn1lbHNlIGw9MX1lbHNlIGw9MQppZihrPT1udWxsKWs9bmV3IFAuUm4oIiIpCmsuYSs9
-Qy54Qi5OaihhLHMsdCkKay5hKz1QLkhIKHEpCnQrPWwKcz10fX19aWYoaz09bnVsbClyZXR1cm4gQy54
-Qi5OaihhLGIsYykKaWYoczxjKWsuYSs9Qy54Qi5OaihhLHMsYykKbz1rLmEKcmV0dXJuIG8uY2hhckNv
-ZGVBdCgwKT09MD9vOm99LApPTDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGss
-agppZih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVybiBILnBZKGMpCnQ9YgpzPXQKcj1udWxsCnE9ITAK
-Zm9yKDt0PGM7KXtwPUMueEIuTzIoYSx0KQppZihwPT09Mzcpe289UC5ydihhLHQsITApCm49bz09bnVs
-bAppZihuJiZxKXt0Kz0zCmNvbnRpbnVlfWlmKHI9PW51bGwpcj1uZXcgUC5SbigiIikKbT1DLnhCLk5q
-KGEscyx0KQpsPXIuYSs9IXE/bS50b0xvd2VyQ2FzZSgpOm0KaWYobil7bz1DLnhCLk5qKGEsdCx0KzMp
-Cms9M31lbHNlIGlmKG89PT0iJSIpe289IiUyNSIKaz0xfWVsc2Ugaz0zCnIuYT1sK28KdCs9awpzPXQK
-cT0hMH1lbHNle2lmKHA8MTI3KXtuPXA+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5lYSxuKQpuPShD
-LmVhW25dJjE8PChwJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKXtpZihxJiY2NTw9cCYmOTA+PXApe2lm
-KHI9PW51bGwpcj1uZXcgUC5SbigiIikKaWYoczx0KXtyLmErPUMueEIuTmooYSxzLHQpCnM9dH1xPSEx
-fSsrdH1lbHNle2lmKHA8PTkzKXtuPXA+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5hayxuKQpuPShD
-LmFrW25dJjE8PChwJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKVAuUjMoYSx0LCJJbnZhbGlkIGNoYXJh
-Y3RlciIpCmVsc2V7aWYoKHAmNjQ1MTIpPT09NTUyOTYmJnQrMTxjKXtqPUMueEIuTzIoYSx0KzEpCmlm
-KChqJjY0NTEyKT09PTU2MzIwKXtwPTY1NTM2fChwJjEwMjMpPDwxMHxqJjEwMjMKaz0yfWVsc2Ugaz0x
-fWVsc2Ugaz0xCmlmKHI9PW51bGwpcj1uZXcgUC5SbigiIikKbT1DLnhCLk5qKGEscyx0KQpyLmErPSFx
-P20udG9Mb3dlckNhc2UoKTptCnIuYSs9UC5ISChwKQp0Kz1rCnM9dH19fX1pZihyPT1udWxsKXJldHVy
-biBDLnhCLk5qKGEsYixjKQppZihzPGMpe209Qy54Qi5OaihhLHMsYykKci5hKz0hcT9tLnRvTG93ZXJD
-YXNlKCk6bX1uPXIuYQpyZXR1cm4gbi5jaGFyQ29kZUF0KDApPT0wP246bn0sClBpOmZ1bmN0aW9uKGEs
-YixjKXt2YXIgdCxzLHIscQppZihiPT09YylyZXR1cm4iIgppZighUC5FdChKLnJZKGEpLldkKGEsYikp
-KVAuUjMoYSxiLCJTY2hlbWUgbm90IHN0YXJ0aW5nIHdpdGggYWxwaGFiZXRpYyBjaGFyYWN0ZXIiKQpm
-b3IodD1iLHM9ITE7dDxjOysrdCl7cj1DLnhCLldkKGEsdCkKaWYocjwxMjgpe3E9cj4+PjQKaWYocT49
-OClyZXR1cm4gSC5PSChDLm1LLHEpCnE9KEMubUtbcV0mMTw8KHImMTUpKSE9PTB9ZWxzZSBxPSExCmlm
-KCFxKVAuUjMoYSx0LCJJbGxlZ2FsIHNjaGVtZSBjaGFyYWN0ZXIiKQppZig2NTw9ciYmcjw9OTApcz0h
-MH1hPUMueEIuTmooYSxiLGMpCnJldHVybiBQLllhKHM/YS50b0xvd2VyQ2FzZSgpOmEpfSwKWWE6ZnVu
-Y3Rpb24oYSl7aWYoYT09PSJodHRwIilyZXR1cm4iaHR0cCIKaWYoYT09PSJmaWxlIilyZXR1cm4iZmls
-ZSIKaWYoYT09PSJodHRwcyIpcmV0dXJuImh0dHBzIgppZihhPT09InBhY2thZ2UiKXJldHVybiJwYWNr
-YWdlIgpyZXR1cm4gYX0sCnpSOmZ1bmN0aW9uKGEsYixjKXtpZihhPT1udWxsKXJldHVybiIiCnJldHVy
-biBQLnVPKGEsYixjLEMudG8sITEpfSwKa2E6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciB0LHM9ZT09
-PSJmaWxlIixyPXN8fGYscT1hPT1udWxsCmlmKHEmJiEwKXJldHVybiBzPyIvIjoiIgp0PSFxP1AudU8o
-YSxiLGMsQy5XZCwhMCk6Qy5qTi5FMihkLG5ldyBQLlJaKCksdS5OKS56VigwLCIvIikKaWYodC5sZW5n
-dGg9PT0wKXtpZihzKXJldHVybiIvIn1lbHNlIGlmKHImJiFDLnhCLm5DKHQsIi8iKSl0PSIvIit0CnJl
-dHVybiBQLkpyKHQsZSxmKX0sCkpyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1iLmxlbmd0aD09PTAKaWYo
-dCYmIWMmJiFDLnhCLm5DKGEsIi8iKSlyZXR1cm4gUC53RihhLCF0fHxjKQpyZXR1cm4gUC54ZShhKX0s
-CmxlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHM9e30KaWYoYSE9bnVsbCl7aWYoZCE9bnVsbCl0aHJv
-dyBILmIoUC54WSgiQm90aCBxdWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJzIHNwZWNpZmllZCIpKQpyZXR1
-cm4gUC51TyhhLGIsYyxDLlZDLCEwKX1pZihkPT1udWxsKXJldHVybiBudWxsCnQ9bmV3IFAuUm4oIiIp
-CnMuYT0iIgpkLlUoMCxuZXcgUC55NShuZXcgUC5NRShzLHQpKSkKcz10LmEKcmV0dXJuIHMuY2hhckNv
-ZGVBdCgwKT09MD9zOnN9LAp0RzpmdW5jdGlvbihhLGIsYyl7aWYoYT09bnVsbClyZXR1cm4gbnVsbApy
-ZXR1cm4gUC51TyhhLGIsYyxDLlZDLCEwKX0sCnJ2OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxw
-LG89YisyCmlmKG8+PWEubGVuZ3RoKXJldHVybiIlIgp0PUMueEIuTzIoYSxiKzEpCnM9Qy54Qi5PMihh
-LG8pCnI9SC5vbyh0KQpxPUgub28ocykKaWYocjwwfHxxPDApcmV0dXJuIiUiCnA9cioxNitxCmlmKHA8
-MTI3KXtvPUMuam4ud0cocCw0KQppZihvPj04KXJldHVybiBILk9IKEMuRjMsbykKbz0oQy5GM1tvXSYx
-PDwocCYxNSkpIT09MH1lbHNlIG89ITEKaWYobylyZXR1cm4gSC5MdyhjJiY2NTw9cCYmOTA+PXA/KHB8
-MzIpPj4+MDpwKQppZih0Pj05N3x8cz49OTcpcmV0dXJuIEMueEIuTmooYSxiLGIrMykudG9VcHBlckNh
-c2UoKQpyZXR1cm4gbnVsbH0sCkhIOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuPSIwMTIzNDU2
-Nzg5QUJDREVGIgppZihhPDEyOCl7dD1uZXcgQXJyYXkoMykKdC5maXhlZCRsZW5ndGg9QXJyYXkKcz1I
-LlZNKHQsdS50KQpDLk5tLlkocywwLDM3KQpDLk5tLlkocywxLEMueEIuV2QobixhPj4+NCkpCkMuTm0u
-WShzLDIsQy54Qi5XZChuLGEmMTUpKX1lbHNle2lmKGE+MjA0NylpZihhPjY1NTM1KXtyPTI0MApxPTR9
-ZWxzZXtyPTIyNApxPTN9ZWxzZXtyPTE5MgpxPTJ9dD1uZXcgQXJyYXkoMypxKQp0LmZpeGVkJGxlbmd0
-aD1BcnJheQpzPUguVk0odCx1LnQpCmZvcihwPTA7LS1xLHE+PTA7cj0xMjgpe289Qy5qbi5iZihhLDYq
-cSkmNjN8cgpDLk5tLlkocyxwLDM3KQpDLk5tLlkocyxwKzEsQy54Qi5XZChuLG8+Pj40KSkKQy5ObS5Z
-KHMscCsyLEMueEIuV2QobixvJjE1KSkKcCs9M319cmV0dXJuIFAuSE0ocywwLG51bGwpfSwKdU86ZnVu
-Y3Rpb24oYSxiLGMsZCxlKXt2YXIgdD1QLlVsKGEsYixjLGQsZSkKcmV0dXJuIHQ9PW51bGw/Qy54Qi5O
-aihhLGIsYyk6dH0sClVsOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyLHEscCxvPW51bGwsbj0h
-ZSxtPWIsbD1tLGs9bwp3aGlsZSghMCl7aWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gbS5KKCkK
-aWYodHlwZW9mIGMhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShjKQppZighKG08YykpYnJlYWsKYyQwOnt0
-PUMueEIuTzIoYSxtKQppZih0PDEyNyl7cz10Pj4+NAppZihzPj04KXJldHVybiBILk9IKGQscykKcz0o
-ZFtzXSYxPDwodCYxNSkpIT09MH1lbHNlIHM9ITEKaWYocykrK20KZWxzZXtpZih0PT09Mzcpe3I9UC5y
-dihhLG0sITEpCmlmKHI9PW51bGwpe20rPTMKYnJlYWsgYyQwfWlmKCIlIj09PXIpe3I9IiUyNSIKcT0x
-fWVsc2UgcT0zfWVsc2V7aWYobilpZih0PD05Myl7cz10Pj4+NAppZihzPj04KXJldHVybiBILk9IKEMu
-YWsscykKcz0oQy5ha1tzXSYxPDwodCYxNSkpIT09MH1lbHNlIHM9ITEKZWxzZSBzPSExCmlmKHMpe1Au
-UjMoYSxtLCJJbnZhbGlkIGNoYXJhY3RlciIpCnE9bwpyPXF9ZWxzZXtpZigodCY2NDUxMik9PT01NTI5
-Nil7cz1tKzEKaWYoczxjKXtwPUMueEIuTzIoYSxzKQppZigocCY2NDUxMik9PT01NjMyMCl7dD02NTUz
-NnwodCYxMDIzKTw8MTB8cCYxMDIzCnE9Mn1lbHNlIHE9MX1lbHNlIHE9MX1lbHNlIHE9MQpyPVAuSEgo
-dCl9fWlmKGs9PW51bGwpaz1uZXcgUC5SbigiIikKay5hKz1DLnhCLk5qKGEsbCxtKQprLmErPUguZChy
-KQppZih0eXBlb2YgcSE9PSJudW1iZXIiKXJldHVybiBILnBZKHEpCm0rPXEKbD1tfX19aWYoaz09bnVs
-bClyZXR1cm4gbwppZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBsLkooKQppZihsPGMpay5hKz1D
-LnhCLk5qKGEsbCxjKQpuPWsuYQpyZXR1cm4gbi5jaGFyQ29kZUF0KDApPT0wP246bn0sCnlCOmZ1bmN0
-aW9uKGEpe2lmKEMueEIubkMoYSwiLiIpKXJldHVybiEwCnJldHVybiBDLnhCLk9ZKGEsIi8uIikhPT0t
-MX0sCnhlOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuCmlmKCFQLnlCKGEpKXJldHVybiBhCnQ9
-SC5WTShbXSx1LnMpCmZvcihzPWEuc3BsaXQoIi8iKSxyPXMubGVuZ3RoLHE9ITEscD0wO3A8cjsrK3Ap
-e289c1twXQppZihKLlJNKG8sIi4uIikpe249dC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJu
-IEguT0godCwtMSkKdC5wb3AoKQppZih0Lmxlbmd0aD09PTApQy5ObS5BKHQsIiIpfXE9ITB9ZWxzZSBp
-ZigiLiI9PT1vKXE9ITAKZWxzZXtDLk5tLkEodCxvKQpxPSExfX1pZihxKUMuTm0uQSh0LCIiKQpyZXR1
-cm4gQy5ObS56Vih0LCIvIil9LAp3RjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbwppZighUC55
-QihhKSlyZXR1cm4hYj9QLkMxKGEpOmEKdD1ILlZNKFtdLHUucykKZm9yKHM9YS5zcGxpdCgiLyIpLHI9
-cy5sZW5ndGgscT0hMSxwPTA7cDxyOysrcCl7bz1zW3BdCmlmKCIuLiI9PT1vKWlmKHQubGVuZ3RoIT09
-MCYmQy5ObS5ncloodCkhPT0iLi4iKXtpZigwPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LC0xKQp0LnBv
-cCgpCnE9ITB9ZWxzZXtDLk5tLkEodCwiLi4iKQpxPSExfWVsc2UgaWYoIi4iPT09bylxPSEwCmVsc2V7
-Qy5ObS5BKHQsbykKcT0hMX19cz10Lmxlbmd0aAppZihzIT09MClpZihzPT09MSl7aWYoMD49cylyZXR1
-cm4gSC5PSCh0LDApCnM9dFswXS5sZW5ndGg9PT0wfWVsc2Ugcz0hMQplbHNlIHM9ITAKaWYocylyZXR1
-cm4iLi8iCmlmKHF8fEMuTm0uZ3JaKHQpPT09Ii4uIilDLk5tLkEodCwiIikKaWYoIWIpe2lmKDA+PXQu
-bGVuZ3RoKXJldHVybiBILk9IKHQsMCkKQy5ObS5ZKHQsMCxQLkMxKHRbMF0pKX1yZXR1cm4gQy5ObS56
-Vih0LCIvIil9LApDMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLmxlbmd0aAppZihxPj0yJiZQLkV0
-KEouUXooYSwwKSkpZm9yKHQ9MTt0PHE7Kyt0KXtzPUMueEIuV2QoYSx0KQppZihzPT09NTgpcmV0dXJu
-IEMueEIuTmooYSwwLHQpKyIlM0EiK0MueEIueW4oYSx0KzEpCmlmKHM8PTEyNyl7cj1zPj4+NAppZihy
-Pj04KXJldHVybiBILk9IKEMubUsscikKcj0oQy5tS1tyXSYxPDwocyYxNSkpPT09MH1lbHNlIHI9ITAK
-aWYocilicmVha31yZXR1cm4gYX0sCm1uOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPWEuZ0ZqKCkscD1x
-Lmxlbmd0aAppZihwPjAmJkouSG0ocVswXSk9PT0yJiZKLmE2KHFbMF0sMSk9PT01OCl7aWYoMD49cCly
-ZXR1cm4gSC5PSChxLDApClAucmcoSi5hNihxWzBdLDApLCExKQpQLkhOKHEsITEsMSkKdD0hMH1lbHNl
-e1AuSE4ocSwhMSwwKQp0PSExfXM9YS5ndFQoKSYmIXQ/IlxcIjoiIgppZihhLmdjaigpKXtyPWEuZ0pm
-KGEpCmlmKHIubGVuZ3RoIT09MClzPXMrIlxcIityKyJcXCJ9cz1QLnZnKHMscSwiXFwiKQpwPXQmJnA9
-PT0xP3MrIlxcIjpzCnJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpwfSwKSWg6ZnVuY3Rpb24oYSxi
-KXt2YXIgdCxzLHIKZm9yKHQ9MCxzPTA7czwyOysrcyl7cj1DLnhCLldkKGEsYitzKQppZig0ODw9ciYm
-cjw9NTcpdD10KjE2K3ItNDgKZWxzZXtyfD0zMgppZig5Nzw9ciYmcjw9MTAyKXQ9dCoxNityLTg3CmVs
-c2UgdGhyb3cgSC5iKFAueFkoIkludmFsaWQgVVJMIGVuY29kaW5nIikpfX1yZXR1cm4gdH0sCmt1OmZ1
-bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyLHEscD1KLnJZKGEpLG89Ygp3aGlsZSghMCl7aWYoIShv
-PGMpKXt0PSEwCmJyZWFrfXM9cC5XZChhLG8pCmlmKHM8PTEyNylpZihzIT09Mzcpcj1lJiZzPT09NDMK
-ZWxzZSByPSEwCmVsc2Ugcj0hMAppZihyKXt0PSExCmJyZWFrfSsrb31pZih0KXtpZihDLnhNIT09ZCly
-PSExCmVsc2Ugcj0hMAppZihyKXJldHVybiBwLk5qKGEsYixjKQplbHNlIHE9bmV3IEgucWoocC5Oaihh
-LGIsYykpfWVsc2V7cT1ILlZNKFtdLHUudCkKZm9yKG89YjtvPGM7KytvKXtzPXAuV2QoYSxvKQppZihz
-PjEyNyl0aHJvdyBILmIoUC54WSgiSWxsZWdhbCBwZXJjZW50IGVuY29kaW5nIGluIFVSSSIpKQppZihz
-PT09Mzcpe2lmKG8rMz5hLmxlbmd0aCl0aHJvdyBILmIoUC54WSgiVHJ1bmNhdGVkIFVSSSIpKQpDLk5t
-LkEocSxQLkloKGEsbysxKSkKbys9Mn1lbHNlIGlmKGUmJnM9PT00MylDLk5tLkEocSwzMikKZWxzZSBD
-Lk5tLkEocSxzKX19dS5MLmIocSkKcmV0dXJuIG5ldyBQLkdZKCExKS5XSihxKX0sCkV0OmZ1bmN0aW9u
-KGEpe3ZhciB0PWF8MzIKcmV0dXJuIDk3PD10JiZ0PD0xMjJ9LApLRDpmdW5jdGlvbihhLGIsYyl7dmFy
-IHQscyxyLHEscCxvLG4sbSxsPSJJbnZhbGlkIE1JTUUgdHlwZSIsaz1ILlZNKFtiLTFdLHUudCkKZm9y
-KHQ9YS5sZW5ndGgscz1iLHI9LTEscT1udWxsO3M8dDsrK3Mpe3E9Qy54Qi5XZChhLHMpCmlmKHE9PT00
-NHx8cT09PTU5KWJyZWFrCmlmKHE9PT00Nyl7aWYocjwwKXtyPXMKY29udGludWV9dGhyb3cgSC5iKFAu
-cnIobCxhLHMpKX19aWYocjwwJiZzPmIpdGhyb3cgSC5iKFAucnIobCxhLHMpKQpmb3IoO3EhPT00NDsp
-e0MuTm0uQShrLHMpOysrcwpmb3IocD0tMTtzPHQ7KytzKXtxPUMueEIuV2QoYSxzKQppZihxPT09NjEp
-e2lmKHA8MClwPXN9ZWxzZSBpZihxPT09NTl8fHE9PT00NClicmVha31pZihwPj0wKUMuTm0uQShrLHAp
-CmVsc2V7bz1DLk5tLmdyWihrKQppZihxIT09NDR8fHMhPT1vKzd8fCFDLnhCLlFpKGEsImJhc2U2NCIs
-bysxKSl0aHJvdyBILmIoUC5ycigiRXhwZWN0aW5nICc9JyIsYSxzKSkKYnJlYWt9fUMuTm0uQShrLHMp
-Cm49cysxCmlmKChrLmxlbmd0aCYxKT09PTEpYT1DLmg5LnlyKDAsYSxuLHQpCmVsc2V7bT1QLlVsKGEs
-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
-ZDwwfHxkPj1vLmxlbmd0aClyZXR1cm4gSC5PSChvLGQpCnI9b1tkXQpxPXQuV2QoYSxzKV45NgppZihx
-Pjk1KXE9MzEKaWYocT49ci5sZW5ndGgpcmV0dXJuIEguT0gocixxKQpwPXJbcV0KZD1wJjMxCkMuTm0u
-WShlLHA+Pj41LHMpfXJldHVybiBkfSwKV0Y6ZnVuY3Rpb24gV0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9
-Yn0sCmEyOmZ1bmN0aW9uIGEyKCl7fSwKaVA6ZnVuY3Rpb24gaVAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9
-Yn0sCkNQOmZ1bmN0aW9uIENQKCl7fSwKWFM6ZnVuY3Rpb24gWFMoKXt9LApDNjpmdW5jdGlvbiBDNihh
-KXt0aGlzLmE9YX0sCm46ZnVuY3Rpb24gbigpe30sCnU6ZnVuY3Rpb24gdShhLGIsYyxkKXt2YXIgXz10
-aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKYko6ZnVuY3Rpb24gYkooYSxiLGMsZCxlLGYpe3Zh
-ciBfPXRoaXMKXy5lPWEKXy5mPWIKXy5hPWMKXy5iPWQKXy5jPWUKXy5kPWZ9LAplWTpmdW5jdGlvbiBl
-WShhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5mPWEKXy5hPWIKXy5iPWMKXy5jPWQKXy5kPWV9LAptcDpm
-dW5jdGlvbiBtcChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKdWI6
-ZnVuY3Rpb24gdWIoYSl7dGhpcy5hPWF9LApkczpmdW5jdGlvbiBkcyhhKXt0aGlzLmE9YX0sCmxqOmZ1
-bmN0aW9uIGxqKGEpe3RoaXMuYT1hfSwKVVY6ZnVuY3Rpb24gVVYoYSl7dGhpcy5hPWF9LAprNTpmdW5j
-dGlvbiBrNSgpe30sCktZOmZ1bmN0aW9uIEtZKCl7fSwKYzpmdW5jdGlvbiBjKGEpe3RoaXMuYT1hfSwK
-Q0Q6ZnVuY3Rpb24gQ0QoYSl7dGhpcy5hPWF9LAphRTpmdW5jdGlvbiBhRShhLGIsYyl7dGhpcy5hPWEK
-dGhpcy5iPWIKdGhpcy5jPWN9LApFSDpmdW5jdGlvbiBFSCgpe30sCktOOmZ1bmN0aW9uIEtOKCl7fSwK
-Y1g6ZnVuY3Rpb24gY1goKXt9LApBbjpmdW5jdGlvbiBBbigpe30sCnpNOmZ1bmN0aW9uIHpNKCl7fSwK
-WjA6ZnVuY3Rpb24gWjAoKXt9LApOMzpmdW5jdGlvbiBOMyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIK
-dGhpcy4kdGk9Y30sCmM4OmZ1bmN0aW9uIGM4KCl7fSwKRks6ZnVuY3Rpb24gRksoKXt9LAprOmZ1bmN0
-aW9uIGsoKXt9LApPZDpmdW5jdGlvbiBPZCgpe30sCmliOmZ1bmN0aW9uIGliKCl7fSwKeHU6ZnVuY3Rp
-b24geHUoKXt9LApHejpmdW5jdGlvbiBHeigpe30sCnFVOmZ1bmN0aW9uIHFVKCl7fSwKUm46ZnVuY3Rp
-b24gUm4oYSl7dGhpcy5hPWF9LApHRDpmdW5jdGlvbiBHRCgpe30sCm4xOmZ1bmN0aW9uIG4xKGEpe3Ro
-aXMuYT1hfSwKY1M6ZnVuY3Rpb24gY1MoYSl7dGhpcy5hPWF9LApWQzpmdW5jdGlvbiBWQyhhKXt0aGlz
-LmE9YX0sCkpUOmZ1bmN0aW9uIEpUKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApEbjpmdW5jdGlvbiBE
-bihhLGIsYyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8u
-Zj1mCl8ucj1nCl8uUT1fLno9Xy55PV8ueD1udWxsfSwKZTE6ZnVuY3Rpb24gZTEoYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sCk5ZOmZ1bmN0aW9uIE5ZKGEpe3RoaXMuYT1hfSwKUlo6ZnVuY3Rpb24gUlooKXt9
-LApNRTpmdW5jdGlvbiBNRShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKeTU6ZnVuY3Rpb24geTUoYSl7
-dGhpcy5hPWF9LApQRTpmdW5jdGlvbiBQRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9
-LApxMzpmdW5jdGlvbiBxMygpe30sCnlJOmZ1bmN0aW9uIHlJKGEpe3RoaXMuYT1hfSwKYzY6ZnVuY3Rp
-b24gYzYoKXt9LApxZDpmdW5jdGlvbiBxZCgpe30sClVmOmZ1bmN0aW9uIFVmKGEsYixjLGQsZSxmLGcs
-aCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9ZgpfLnI9ZwpfLng9
-aApfLnk9bnVsbH0sCnFlOmZ1bmN0aW9uIHFlKGEsYixjLGQsZSxmLGcpe3ZhciBfPXRoaXMKXy5hPWEK
-Xy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy5RPV8uej1fLnk9Xy54PW51bGx9LApt
-UjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwCmlmKGE9PW51bGwpcmV0dXJuIG51bGwKdD1QLkZsKHUu
-Tix1LnopCnM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYSkKZm9yKHI9cy5sZW5ndGgscT0wO3E8
-cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwrK3Epe3A9SC55KHNbcV0pCnQuWSgwLHAs
-YVtwXSl9cmV0dXJuIHR9LAppNjpmdW5jdGlvbiBpNigpe30sCmxSOmZ1bmN0aW9uIGxSKGEsYil7dGhp
-cy5hPWEKdGhpcy5iPWJ9LApqZzpmdW5jdGlvbiBqZyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKYUo6
-ZnVuY3Rpb24gYUooKXt9LApLNTpmdW5jdGlvbiBLNShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQmY6
-ZnVuY3Rpb24gQmYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnpnOmZ1bmN0aW9uIHpnKGEsYil7dGhp
-cy5hPWEKdGhpcy5iPWIKdGhpcy5jPSExfSwKZE06ZnVuY3Rpb24gZE0oKXt9LApHRTpmdW5jdGlvbiBH
-RShhKXt0aGlzLmE9YX0sCk43OmZ1bmN0aW9uIE43KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp1UTpm
-dW5jdGlvbiB1USgpe30sClcyOmZ1bmN0aW9uIFcyKCl7fSwKZTM6ZnVuY3Rpb24gZTMoKXt9LApoRjpm
-dW5jdGlvbiBoRigpe30sCkJWOmZ1bmN0aW9uIEJWKCl7fSwKUjQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
-IHQscyxyCkgueGQoYikKdS5qLmIoZCkKaWYoSC5vVChiKSl7dD1bY10KQy5ObS5GVih0LGQpCmQ9dH1z
-PXUuegpyPVAuQ0goSi5NMShkLFAudzAoKSxzKSwhMCxzKQp1LlouYihhKQpyZXR1cm4gUC53WShILkVr
-KGEscixudWxsKSl9LApEbTpmdW5jdGlvbihhLGIsYyl7dmFyIHQKdHJ5e2lmKE9iamVjdC5pc0V4dGVu
-c2libGUoYSkmJiFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxiKSl7T2JqZWN0
-LmRlZmluZVByb3BlcnR5KGEsYix7dmFsdWU6Y30pCnJldHVybiEwfX1jYXRjaCh0KXtILlJ1KHQpfXJl
-dHVybiExfSwKT206ZnVuY3Rpb24oYSxiKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5
-LmNhbGwoYSxiKSlyZXR1cm4gYVtiXQpyZXR1cm4gbnVsbH0sCndZOmZ1bmN0aW9uKGEpe2lmKGE9PW51
-bGx8fHR5cGVvZiBhPT0ic3RyaW5nInx8dHlwZW9mIGE9PSJudW1iZXIifHxILmwoYSkpcmV0dXJuIGEK
-aWYoYSBpbnN0YW5jZW9mIFAuRTQpcmV0dXJuIGEuYQppZihILlI5KGEpKXJldHVybiBhCmlmKHUudy5j
-KGEpKXJldHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQLmlQKXJldHVybiBILm8yKGEpCmlmKHUuWi5jKGEp
-KXJldHVybiBQLmIzKGEsIiRkYXJ0X2pzRnVuY3Rpb24iLG5ldyBQLlBDKCkpCnJldHVybiBQLmIzKGEs
-Il8kZGFydF9qc09iamVjdCIsbmV3IFAubXQoJC5rSSgpKSl9LApiMzpmdW5jdGlvbihhLGIsYyl7dmFy
-IHQ9UC5PbShhLGIpCmlmKHQ9PW51bGwpe3Q9Yy4kMShhKQpQLkRtKGEsYix0KX1yZXR1cm4gdH0sCkw3
-OmZ1bmN0aW9uKGEpe3ZhciB0LHMKaWYoYT09bnVsbHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2Yg
-YT09Im51bWJlciJ8fHR5cGVvZiBhPT0iYm9vbGVhbiIpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNl
-b2YgT2JqZWN0JiZILlI5KGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCYmdS53
-LmMoYSkpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNlb2YgRGF0ZSl7dD1ILlNjKGEuZ2V0VGltZSgp
-KQpzPW5ldyBQLmlQKHQsITEpCnMuWGsodCwhMSkKcmV0dXJuIHN9ZWxzZSBpZihhLmNvbnN0cnVjdG9y
-PT09JC5rSSgpKXJldHVybiBhLm8KZWxzZSByZXR1cm4gUC5ORChhKX0sCk5EOmZ1bmN0aW9uKGEpe2lm
-KHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBQLmlRKGEsJC53KCksbmV3IFAuTnooKSkKaWYoYSBp
-bnN0YW5jZW9mIEFycmF5KXJldHVybiBQLmlRKGEsJC5SOCgpLG5ldyBQLm5wKCkpCnJldHVybiBQLmlR
-KGEsJC5SOCgpLG5ldyBQLlV0KCkpfSwKaVE6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PVAuT20oYSxiKQpp
-Zih0PT1udWxsfHwhKGEgaW5zdGFuY2VvZiBPYmplY3QpKXt0PWMuJDEoYSkKUC5EbShhLGIsdCl9cmV0
-dXJuIHR9LApQQzpmdW5jdGlvbiBQQygpe30sCm10OmZ1bmN0aW9uIG10KGEpe3RoaXMuYT1hfSwKTno6
-ZnVuY3Rpb24gTnooKXt9LApucDpmdW5jdGlvbiBucCgpe30sClV0OmZ1bmN0aW9uIFV0KCl7fSwKRTQ6
-ZnVuY3Rpb24gRTQoYSl7dGhpcy5hPWF9LApyNzpmdW5jdGlvbiByNyhhKXt0aGlzLmE9YX0sClR6OmZ1
-bmN0aW9uIFR6KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmNvOmZ1bmN0aW9uIGNvKCl7fSwKVTg6
-ZnVuY3Rpb24oYSxiKXt2YXIgdD1uZXcgUC52cygkLlgzLGIuQygidnM8MD4iKSkscz1uZXcgUC5aZih0
-LGIuQygiWmY8MD4iKSkKYS50aGVuKEgudFIobmV3IFAudksocyxiKSwxKSxILnRSKG5ldyBQLnBVKHMp
-LDEpKQpyZXR1cm4gdH0sCnZLOmZ1bmN0aW9uIHZLKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApwVTpm
-dW5jdGlvbiBwVShhKXt0aGlzLmE9YX0sCklOOmZ1bmN0aW9uIElOKCl7fSwKdG46ZnVuY3Rpb24gdG4o
-KXt9LAp1ajpmdW5jdGlvbiB1aigpe30sCngwOmZ1bmN0aW9uIHgwKCl7fSwKcTY6ZnVuY3Rpb24gcTYo
-KXt9LAp1UDpmdW5jdGlvbiB1UCgpe30sCmZ6OmZ1bmN0aW9uIGZ6KCl7fSwKRUQ6ZnVuY3Rpb24gRUQo
-KXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktxOmZ1bmN0aW9uIEtxKCl7fSwKS2U6ZnVuY3Rpb24gS2Uo
-YSl7dGhpcy5hPWF9LApkNTpmdW5jdGlvbiBkNSgpe30sCnpZOmZ1bmN0aW9uIHpZKCl7fSwKTkM6ZnVu
-Y3Rpb24gTkMoKXt9LApmVTpmdW5jdGlvbiBmVSgpe30sCkdDOmZ1bmN0aW9uIEdDKCl7fSwKakc6ZnVu
-Y3Rpb24gakcoKXt9LApqUzpmdW5jdGlvbiBqUygpe30sCnhXOmZ1bmN0aW9uIHhXKCl7fSwKZFM6ZnVu
-Y3Rpb24gZFMoKXt9LAp3ajpmdW5jdGlvbiB3aigpe30sCk1ZOmZ1bmN0aW9uIE1ZKCl7fSwKbjY6ZnVu
-Y3Rpb24gbjYoKXt9LApyMjpmdW5jdGlvbiByMigpe30sCnJPOmZ1bmN0aW9uIHJPKCl7fSwKejg6ZnVu
-Y3Rpb24gejgoKXt9LApxZjpmdW5jdGlvbiBxZihhKXt0aGlzLmE9YX0sCmZvOmZ1bmN0aW9uIGZvKCl7
-fSwKVjg6ZnVuY3Rpb24gVjgoKXt9LApHbjpmdW5jdGlvbiBHbigpe30sClUzOmZ1bmN0aW9uIFUzKCl7
-fSwKRm46ZnVuY3Rpb24gRm4oKXt9LAptbzpmdW5jdGlvbiBtbygpe30sCktnOmZ1bmN0aW9uIEtnKCl7
-fX0sVz17CngzOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd30sClpyOmZ1bmN0aW9uKCl7cmV0dXJuIGRv
-Y3VtZW50fSwKVTk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PWRvY3VtZW50LmJvZHkscz0odCYmQy5SWSku
-cjYodCxhLGIsYykKcy50b1N0cmluZwp0PXUuYWMKdD1uZXcgSC5VNShuZXcgVy5lNyhzKSx0LkMoImEy
-KGxELkUpIikuYihuZXcgVy5DdigpKSx0LkMoIlU1PGxELkU+IikpCnJldHVybiB1LmguYih0LmdyOCh0
-KSl9LApyUzpmdW5jdGlvbihhKXt2YXIgdCxzLHI9ImVsZW1lbnQgdGFnIHVuYXZhaWxhYmxlIgp0cnl7
-dD1KLlJFKGEpCmlmKHR5cGVvZiB0LmducyhhKT09InN0cmluZyIpcj10LmducyhhKX1jYXRjaChzKXtI
-LlJ1KHMpfXJldHVybiByfSwKcUQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxPW5ldyBQLnZzKCQu
-WDMsdS5hbykscD1uZXcgUC5aZihxLHUuYmopLG89bmV3IFhNTEh0dHBSZXF1ZXN0KCkKQy5EdC5lbyhv
-LGI9PW51bGw/IkdFVCI6YixhLCEwKQpjLlUoMCxuZXcgVy5iVShvKSkKdD11LmFuCnM9dC5iKG5ldyBX
-LmhIKG8scCkpCnUuTS5iKG51bGwpCnI9dS5wClcuSkUobywibG9hZCIscywhMSxyKQpXLkpFKG8sImVy
-cm9yIix0LmIocC5nWUooKSksITEscikKby5zZW5kKCkKcmV0dXJuIHF9LApDMDpmdW5jdGlvbihhLGIp
-e2E9NTM2ODcwOTExJmErYgphPTUzNjg3MDkxMSZhKygoNTI0Mjg3JmEpPDwxMCkKcmV0dXJuIGFeYT4+
-PjZ9LApyRTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdD1XLkMwKFcuQzAoVy5DMChXLkMwKDAsYSksYiks
-YyksZCkscz01MzY4NzA5MTEmdCsoKDY3MTA4ODYzJnQpPDwzKQpzXj1zPj4+MTEKcmV0dXJuIDUzNjg3
-MDkxMSZzKygoMTYzODMmcyk8PDE1KX0sClROOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPWEuY2xhc3NM
-aXN0CmZvcih0PWIubGVuZ3RoLHM9MDtzPGIubGVuZ3RoO2IubGVuZ3RoPT09dHx8KDAsSC5saykoYiks
-KytzKXIuYWRkKGJbc10pfSwKSkU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdD1XLmFGKG5ldyBXLnZO
-KGMpLHUuQikKaWYodCE9bnVsbCYmITApSi5kWihhLGIsdCwhMSkKcmV0dXJuIG5ldyBXLnhDKGEsYix0
-LCExLGUuQygieEM8MD4iKSl9LApUdzpmdW5jdGlvbihhKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVt
-ZW50KCJhIikscz1uZXcgVy5tayh0LHdpbmRvdy5sb2NhdGlvbikKcz1uZXcgVy5KUShzKQpzLkNZKGEp
-CnJldHVybiBzfSwKVXc6ZnVuY3Rpb24oYSxiLGMsZCl7dS5oLmIoYSkKSC55KGIpCkgueShjKQp1LkUu
-YihkKQpyZXR1cm4hMH0sCm5aOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscgp1LmguYihhKQpILnko
-YikKSC55KGMpCnQ9dS5FLmIoZCkuYQpzPXQuYQpzLmhyZWY9YwpyPXMuaG9zdG5hbWUKdD10LmIKaWYo
-IShyPT10Lmhvc3RuYW1lJiZzLnBvcnQ9PXQucG9ydCYmcy5wcm90b2NvbD09dC5wcm90b2NvbCkpaWYo
-cj09PSIiKWlmKHMucG9ydD09PSIiKXt0PXMucHJvdG9jb2wKdD10PT09IjoifHx0PT09IiJ9ZWxzZSB0
-PSExCmVsc2UgdD0hMQplbHNlIHQ9ITAKcmV0dXJuIHR9LApCbDpmdW5jdGlvbigpe3ZhciB0PXUuTixz
-PVAudE0oQy5ReCx0KSxyPXUuZEcuYihuZXcgVy5JQSgpKSxxPUguVk0oWyJURU1QTEFURSJdLHUucykK
-dD1uZXcgVy5jdChzLFAuTHModCksUC5Mcyh0KSxQLkxzKHQpLG51bGwpCnQuQ1kobnVsbCxuZXcgSC5B
-OChDLlF4LHIsdS5kdikscSxudWxsKQpyZXR1cm4gdH0sCnVWOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwp
-cmV0dXJuIG51bGwKcmV0dXJuIFcuUDEoYSl9LApxYzpmdW5jdGlvbihhKXt2YXIgdAppZihhPT1udWxs
-KXJldHVybiBudWxsCmlmKCJwb3N0TWVzc2FnZSIgaW4gYSl7dD1XLlAxKGEpCnJldHVybiB0fWVsc2Ug
-cmV0dXJuIHUuYVMuYihhKX0sClAxOmZ1bmN0aW9uKGEpe2lmKGE9PT13aW5kb3cpcmV0dXJuIHUuY2ku
-YihhKQplbHNlIHJldHVybiBuZXcgVy5kVyhhKX0sCnpYOmZ1bmN0aW9uKGEpe2lmKGE9PT13aW5kb3cu
-bG9jYXRpb24pcmV0dXJuIGEKZWxzZSByZXR1cm4gbmV3IFcuRmIoKX0sCmFGOmZ1bmN0aW9uKGEsYil7
-dmFyIHQ9JC5YMwppZih0PT09Qy5OVSlyZXR1cm4gYQpyZXR1cm4gdC5QeShhLGIpfSwKcUU6ZnVuY3Rp
-b24gcUUoKXt9LApZZTpmdW5jdGlvbiBZZSgpe30sCkdoOmZ1bmN0aW9uIEdoKCl7fSwKZlk6ZnVuY3Rp
-b24gZlkoKXt9LApuQjpmdW5jdGlvbiBuQigpe30sCkF6OmZ1bmN0aW9uIEF6KCl7fSwKUFU6ZnVuY3Rp
-b24gUFUoKXt9LApRUDpmdW5jdGlvbiBRUCgpe30sCklGOmZ1bmN0aW9uIElGKCl7fSwKbng6ZnVuY3Rp
-b24gbngoKXt9LApSZDpmdW5jdGlvbiBSZCgpe30sCmtSOmZ1bmN0aW9uIGtSKCl7fSwKVGY6ZnVuY3Rp
-b24gVGYoKXt9LApsdzpmdW5jdGlvbiBsdygpe30sCm9KOmZ1bmN0aW9uIG9KKCl7fSwKaWQ6ZnVuY3Rp
-b24gaWQoKXt9LApCdzpmdW5jdGlvbiBCdygpe30sCm80OmZ1bmN0aW9uIG80KCl7fSwKSFM6ZnVuY3Rp
-b24gSFMoKXt9LApWbzpmdW5jdGlvbiBWbygpe30sCkZoOmZ1bmN0aW9uIEZoKCl7fSwKY3g6ZnVuY3Rp
-b24gY3goKXt9LApTYjpmdW5jdGlvbiBTYigpe30sClFGOmZ1bmN0aW9uIFFGKCl7fSwKTmg6ZnVuY3Rp
-b24gTmgoKXt9LApGdjpmdW5jdGlvbiBGdigpe30sCklCOmZ1bmN0aW9uIElCKCl7fSwKWWw6ZnVuY3Rp
-b24gWWwoKXt9LApuNzpmdW5jdGlvbiBuNygpe30sCnd6OmZ1bmN0aW9uIHd6KGEsYil7dGhpcy5hPWEK
-dGhpcy4kdGk9Yn0sCmN2OmZ1bmN0aW9uIGN2KCl7fSwKQ3Y6ZnVuY3Rpb24gQ3YoKXt9LApRSTpmdW5j
-dGlvbiBRSSgpe30sCmVhOmZ1bmN0aW9uIGVhKCl7fSwKRDA6ZnVuY3Rpb24gRDAoKXt9LApUNTpmdW5j
-dGlvbiBUNSgpe30sClhWOmZ1bmN0aW9uIFhWKCl7fSwKd0o6ZnVuY3Rpb24gd0ooKXt9LApoNDpmdW5j
-dGlvbiBoNCgpe30sCkdPOmZ1bmN0aW9uIEdPKCl7fSwKSkM6ZnVuY3Rpb24gSkMoKXt9LApicjpmdW5j
-dGlvbiBicigpe30sCnhuOmZ1bmN0aW9uIHhuKCl7fSwKVmI6ZnVuY3Rpb24gVmIoKXt9LApPNzpmdW5j
-dGlvbiBPNygpe30sCmJVOmZ1bmN0aW9uIGJVKGEpe3RoaXMuYT1hfSwKaEg6ZnVuY3Rpb24gaEgoYSxi
-KXt0aGlzLmE9YQp0aGlzLmI9Yn0sCndhOmZ1bmN0aW9uIHdhKCl7fSwKU2c6ZnVuY3Rpb24gU2coKXt9
-LApKSzpmdW5jdGlvbiBKSygpe30sCkhMOmZ1bmN0aW9uIEhMKCl7fSwKd1A6ZnVuY3Rpb24gd1AoKXt9
-LAp1ODpmdW5jdGlvbiB1OCgpe30sCno2OmZ1bmN0aW9uIHo2KCl7fSwKbEs6ZnVuY3Rpb24gbEsoKXt9
-LApRYjpmdW5jdGlvbiBRYigpe30sClMwOmZ1bmN0aW9uIFMwKCl7fSwKRkE6ZnVuY3Rpb24gRkEoYSl7
-dGhpcy5hPWF9LAp6MjpmdW5jdGlvbiB6Migpe30sCnVxOmZ1bmN0aW9uIHVxKGEpe3RoaXMuYT1hfSwK
-QVc6ZnVuY3Rpb24gQVcoKXt9LApETTpmdW5jdGlvbiBETSgpe30sCkFqOmZ1bmN0aW9uIEFqKCl7fSwK
-ZTc6ZnVuY3Rpb24gZTcoYSl7dGhpcy5hPWF9LAp1SDpmdW5jdGlvbiB1SCgpe30sCkJIOmZ1bmN0aW9u
-IEJIKCl7fSwKUWw6ZnVuY3Rpb24gUWwoKXt9LApHWDpmdW5jdGlvbiBHWCgpe30sClNOOmZ1bmN0aW9u
-IFNOKCl7fSwKSEQ6ZnVuY3Rpb24gSEQoKXt9LApjbDpmdW5jdGlvbiBjbCgpe30sCkV2OmZ1bmN0aW9u
-IEV2KCl7fSwKTHI6ZnVuY3Rpb24gTHIoKXt9LApLUjpmdW5jdGlvbiBLUigpe30sCmV3OmZ1bmN0aW9u
-IGV3KCl7fSwKcDg6ZnVuY3Rpb24gcDgoKXt9LAppaTpmdW5jdGlvbiBpaShhKXt0aGlzLmE9YX0sCmxw
-OmZ1bmN0aW9uIGxwKCl7fSwKU1Y6ZnVuY3Rpb24gU1YoKXt9LApNazpmdW5jdGlvbiBNaygpe30sClk0
-OmZ1bmN0aW9uIFk0KCl7fSwKTm46ZnVuY3Rpb24gTm4oKXt9LApsODpmdW5jdGlvbiBsOCgpe30sCkFz
-OmZ1bmN0aW9uIEFzKCl7fSwKd1E6ZnVuY3Rpb24gd1EoYSl7dGhpcy5hPWF9LApiazpmdW5jdGlvbiBi
-aygpe30sCldXOmZ1bmN0aW9uIFdXKCl7fSwKVGI6ZnVuY3Rpb24gVGIoKXt9LApJdjpmdW5jdGlvbiBJ
-digpe30sCkJUOmZ1bmN0aW9uIEJUKCl7fSwKZlg6ZnVuY3Rpb24gZlgoKXt9LApGQjpmdW5jdGlvbiBG
-Qigpe30sCkExOmZ1bmN0aW9uIEExKCl7fSwKTU46ZnVuY3Rpb24gTU4oKXt9LApYMDpmdW5jdGlvbiBY
-MCgpe30sCm5KOmZ1bmN0aW9uIG5KKCl7fSwKbXo6ZnVuY3Rpb24gbXooKXt9LAphMzpmdW5jdGlvbiBh
-Mygpe30sCmNpOmZ1bmN0aW9uIGNpKCl7fSwKY246ZnVuY3Rpb24gY24oKXt9LAp3NjpmdW5jdGlvbiB3
-Nigpe30sCkZqOmZ1bmN0aW9uIEZqKCl7fSwKdkY6ZnVuY3Rpb24gdkYoKXt9LApPaTpmdW5jdGlvbiBP
-aSgpe30sCkNtOmZ1bmN0aW9uIENtKCl7fSwKQ1E6ZnVuY3Rpb24gQ1EoKXt9LApQUjpmdW5jdGlvbiBQ
-Uigpe30sCnc0OmZ1bmN0aW9uIHc0KCl7fSwKRjI6ZnVuY3Rpb24gRjIoKXt9LApyaDpmdW5jdGlvbiBy
-aCgpe30sCkxPOmZ1bmN0aW9uIExPKCl7fSwKYjE6ZnVuY3Rpb24gYjEoKXt9LAphVDpmdW5jdGlvbiBh
-VCgpe30sCmk3OmZ1bmN0aW9uIGk3KGEpe3RoaXMuYT1hfSwKU3k6ZnVuY3Rpb24gU3koYSl7dGhpcy5h
-PWF9LApLUzpmdW5jdGlvbiBLUyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQTM6ZnVuY3Rpb24gQTMo
-YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkk0OmZ1bmN0aW9uIEk0KGEpe3RoaXMuYT1hfSwKRms6ZnVu
-Y3Rpb24gRmsoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKUk86ZnVuY3Rpb24gUk8oYSxiLGMsZCl7
-dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKZXU6ZnVuY3Rpb24gZXUoYSxiLGMs
-ZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKeEM6ZnVuY3Rpb24geEMoYSxi
-LGMsZCxlKXt2YXIgXz10aGlzCl8uYj1hCl8uYz1iCl8uZD1jCl8uZT1kCl8uJHRpPWV9LAp2TjpmdW5j
-dGlvbiB2TihhKXt0aGlzLmE9YX0sCkpROmZ1bmN0aW9uIEpRKGEpe3RoaXMuYT1hfSwKR206ZnVuY3Rp
-b24gR20oKXt9LAp2RDpmdW5jdGlvbiB2RChhKXt0aGlzLmE9YX0sClV2OmZ1bmN0aW9uIFV2KGEpe3Ro
-aXMuYT1hfSwKRWc6ZnVuY3Rpb24gRWcoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwK
-bTY6ZnVuY3Rpb24gbTYoKXt9LApFbzpmdW5jdGlvbiBFbygpe30sCldrOmZ1bmN0aW9uIFdrKCl7fSwK
-Y3Q6ZnVuY3Rpb24gY3QoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uZT1hCl8uYT1iCl8uYj1jCl8uYz1k
-Cl8uZD1lfSwKSUE6ZnVuY3Rpb24gSUEoKXt9LApPdzpmdW5jdGlvbiBPdygpe30sClc5OmZ1bmN0aW9u
-IFc5KGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz0tMQpfLmQ9bnVsbApfLiR0aT1jfSwK
-ZFc6ZnVuY3Rpb24gZFcoYSl7dGhpcy5hPWF9LApGYjpmdW5jdGlvbiBGYigpe30sCmtGOmZ1bmN0aW9u
-IGtGKCl7fSwKbWs6ZnVuY3Rpb24gbWsoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCktvOmZ1bmN0aW9u
-IEtvKGEpe3RoaXMuYT1hfSwKZm06ZnVuY3Rpb24gZm0oYSl7dGhpcy5hPWF9LApMZTpmdW5jdGlvbiBM
-ZSgpe30sCkpVOmZ1bmN0aW9uIEpVKCl7fSwKeFg6ZnVuY3Rpb24geFgoKXt9LAp2ZTpmdW5jdGlvbiB2
-ZSgpe30sCmJHOmZ1bmN0aW9uIGJHKCl7fSwKdEk6ZnVuY3Rpb24gdEkoKXt9LApmZzpmdW5jdGlvbiBm
-Zygpe30sClo3OmZ1bmN0aW9uIFo3KCl7fSwKSFc6ZnVuY3Rpb24gSFcoKXt9LApsRzpmdW5jdGlvbiBs
-Rygpe30sCnFzOmZ1bmN0aW9uIHFzKCl7fSwKY3M6ZnVuY3Rpb24gY3MoKXt9LApLQjpmdW5jdGlvbiBL
-Qigpe30sCks3OmZ1bmN0aW9uIEs3KCl7fSwKckI6ZnVuY3Rpb24gckIoKXt9LApmVDpmdW5jdGlvbiBm
-VCgpe30sCmY3OmZ1bmN0aW9uIGY3KCl7fSwKYmc6ZnVuY3Rpb24gYmcoKXt9LApvSDpmdW5jdGlvbiBv
-SCgpe30sCkNFOmZ1bmN0aW9uIENFKCl7fSwKYUQ6ZnVuY3Rpb24gYUQoKXt9LApaeDpmdW5jdGlvbiBa
-eCgpe30sCk9YOmZ1bmN0aW9uIE9YKCl7fSwKVWo6ZnVuY3Rpb24gVWooKXt9LApqTTpmdW5jdGlvbiBq
-TSgpe30sClFWOmZ1bmN0aW9uIFFWKCl7fSwKQXc6ZnVuY3Rpb24gQXcoKXt9LAp0cjpmdW5jdGlvbiB0
-cigpe30sCk8zOmZ1bmN0aW9uIE8zKCl7fSwKT3Y6ZnVuY3Rpb24gT3YoKXt9LApjTzpmdW5jdGlvbiBj
-Tygpe30sCllEOmZ1bmN0aW9uIFlEKCl7fSwKRHg6ZnVuY3Rpb24gRHgoKXt9LApYVzpmdW5jdGlvbiBY
-Vygpe30sCm9hOmZ1bmN0aW9uIG9hKCl7fSwKWFU6ZnVuY3Rpb24gWFUoKXt9LApSeTpmdW5jdGlvbiBS
-eSgpe30sCnp2OmZ1bmN0aW9uIHp2KCl7fSwKbno6ZnVuY3Rpb24gbnooKXt9fSxVPXsKamY6ZnVuY3Rp
-b24oYSl7dmFyIHQscyxyLHEKaWYoYT09bnVsbCl0PW51bGwKZWxzZXt0PUguVk0oW10sdS5mQSkKZm9y
-KHM9Si5JVCh1LlIuYihhKSk7cy5tKCk7KXtyPXMuZ1IocykKcT1KLlU2KHIpCkMuTm0uQSh0LG5ldyBV
-LlNlKEgueShxLnEociwiZGVzY3JpcHRpb24iKSksSC55KHEucShyLCJocmVmIikpKSl9fXJldHVybiB0
-fSwKTmQ6ZnVuY3Rpb24oYSl7dmFyIHQscwppZihhPT1udWxsKXQ9bnVsbAplbHNle3Q9SC5WTShbXSx1
-LmhoKQpmb3Iocz1KLklUKHUuUi5iKGEpKTtzLm0oKTspQy5ObS5BKHQsVS5OZihzLmdSKHMpKSl9cmV0
-dXJuIHR9LApOZjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG89ImRlc2NyaXB0aW9uIixuPUouVTYo
-YSksbT1ILnkobi5xKGEsbykpLGw9SC5WTShbXSx1LmFKKQpmb3Iobj1KLklUKHUuUi5iKG4ucShhLCJl
-bnRyaWVzIikpKTtuLm0oKTspe3Q9bi5nUihuKQpzPUouVTYodCkKcj1ILnkocy5xKHQsbykpCnE9SC55
-KHMucSh0LCJmdW5jdGlvbiIpKQpzPXMucSh0LCJsaW5rIikKaWYocz09bnVsbClzPW51bGwKZWxzZXtw
-PUouVTYocykKcz1uZXcgVS5NbChILnkocC5xKHMsImhyZWYiKSksSC5TYyhwLnEocywibGluZSIpKSxI
-LnkocC5xKHMsInBhdGgiKSkpfUMuTm0uQShsLG5ldyBVLndiKHIscSxzKSl9cmV0dXJuIG5ldyBVLnlE
-KG0sbCl9LApkMjpmdW5jdGlvbiBkMihhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5j
-PWMKXy5kPWQKXy5lPWV9LApTZTpmdW5jdGlvbiBTZShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTWw6
-ZnVuY3Rpb24gTWwoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKeUQ6ZnVuY3Rpb24g
-eUQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCndiOmZ1bmN0aW9uIHdiKGEsYixjKXt0aGlzLmE9YQp0
-aGlzLmI9Ygp0aGlzLmM9Y319LEI9ewpZZjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9
-Si5VNihhKSxrPUgueShsLnEoYSwicmVnaW9ucyIpKSxqPUgueShsLnEoYSwibmF2aWdhdGlvbkNvbnRl
-bnQiKSksaT1ILnkobC5xKGEsInNvdXJjZUNvZGUiKSksaD1QLkZsKHUuTix1LmY0KQpmb3IobD1KLklU
-KEouUU0obC5xKGEsImVkaXRzIikpKSx0PXUuUixzPXUuZ2k7bC5tKCk7KXtyPWwuZ1IobCkKcT1KLlJF
-KHIpCnA9SC55KHEuZ0czKHIpKQpvPUguVk0oW10scykKZm9yKHE9Si5JVCh0LmIocS5nbncocikpKTtx
-Lm0oKTspe249cS5nUihxKQptPUouVTYobikKQy5ObS5BKG8sbmV3IEIuajgoSC5TYyhtLnEobiwibGlu
-ZSIpKSxILnkobS5xKG4sImV4cGxhbmF0aW9uIikpLEguU2MobS5xKG4sIm9mZnNldCIpKSkpfWguWSgw
-LHAsbyl9cmV0dXJuIG5ldyBCLnFwKGssaixpLGgpfSwKajg6ZnVuY3Rpb24gajgoYSxiLGMpe3RoaXMu
-YT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKcXA6ZnVuY3Rpb24gcXAoYSxiLGMsZCl7dmFyIF89dGhpcwpf
-LmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCkx1OmZ1bmN0aW9uIEx1KCl7fSwKT1M6ZnVuY3Rpb24oYSl7
-dmFyIHQKaWYoIShhPj02NSYmYTw9OTApKXQ9YT49OTcmJmE8PTEyMgplbHNlIHQ9ITAKcmV0dXJuIHR9
-LApZdTpmdW5jdGlvbihhLGIpe3ZhciB0PWEubGVuZ3RoLHM9YisyCmlmKHQ8cylyZXR1cm4hMQppZigh
-Qi5PUyhDLnhCLk8yKGEsYikpKXJldHVybiExCmlmKEMueEIuTzIoYSxiKzEpIT09NTgpcmV0dXJuITEK
-aWYodD09PXMpcmV0dXJuITAKcmV0dXJuIEMueEIuTzIoYSxzKT09PTQ3fX0sVD17bVE6ZnVuY3Rpb24g
-bVEoKXt9fSxMPXsKRGU6ZnVuY3Rpb24oKXtDLkJaLkIoZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQi
-LG5ldyBMLmUoKSkKQy5vbC5CKHdpbmRvdywicG9wc3RhdGUiLG5ldyBMLkwoKSl9LAprejpmdW5jdGlv
-bihhKXt2YXIgdCxzPXUuaC5hKGEucGFyZW50Tm9kZSkucXVlcnlTZWxlY3RvcigiOnNjb3BlID4gdWwi
-KSxyPXMuc3R5bGUscT0iIitDLkNELnpRKHMub2Zmc2V0SGVpZ2h0KSoyKyJweCIKci5tYXhIZWlnaHQ9
-cQpyPUoucUYoYSkKcT1yLiR0aQp0PXEuQygifigxKSIpLmIobmV3IEwuV3gocyxhKSkKdS5NLmIobnVs
-bCkKVy5KRShyLmEsci5iLHQsITEscS5kKX0sCnlYOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxv
-PSJxdWVyeVNlbGVjdG9yQWxsIixuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSksbT11LmgKbi50b1N0
-cmluZwpILkRoKG0sbSwiVCIsbykKdD11LlMKcz1uZXcgVy53eihuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5u
-YXYtbGluayIpLHQpCnMuVShzLG5ldyBMLkFPKGIpKQpILkRoKG0sbSwiVCIsbykKcj1uZXcgVy53eihu
-LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yZWdpb24iKSx0KQppZihyLmdoKHIpIT09MCl7cT1uLnF1ZXJ5U2Vs
-ZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0iKQpxLnRvU3RyaW5nCnIuVShyLG5ldyBMLkhvKHEuZ2V0QXR0
-cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcocSkpLlMoInBhdGgiKSkpKX1ILkRoKG0sbSwi
-VCIsbykKcD1uZXcgVy53eihuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5wb3N0LWxpbmsiKSx0KQpwLlUocCxu
-ZXcgTC5JQygpKX0sClE2OmZ1bmN0aW9uKGEsYil7dmFyIHQ9dS5OCnJldHVybiBXLnFEKEwuUTQoYSxi
-KSxudWxsLFAuRUYoWyJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04
-Il0sdCx0KSl9LAp0eTpmdW5jdGlvbihhKXt2YXIgdD11Lk4KcmV0dXJuIFcucUQoTC5RNChhLFAuRmwo
-dCx0KSksIlBPU1QiLFAuRUYoWyJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0
-PVVURi04Il0sdCx0KSkuVzcobmV3IEwuTDEoKSx1LnIpfSwKYUs6ZnVuY3Rpb24oYSl7dmFyIHQ9UC5o
-SyhhKS5naFkoKS5xKDAsImxpbmUiKQpyZXR1cm4gdD09bnVsbD9udWxsOkguSHAodCxudWxsKX0sCkc2
-OmZ1bmN0aW9uKGEpe3ZhciB0PVAuaEsoYSkuZ2hZKCkucSgwLCJvZmZzZXQiKQpyZXR1cm4gdD09bnVs
-bD9udWxsOkguSHAodCxudWxsKX0sCnQyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbj17
-fSxtPXUuaC5iKFcucWMoYS5jdXJyZW50VGFyZ2V0KSkKYS5wcmV2ZW50RGVmYXVsdCgpCnQ9bi5hPW0u
-Z2V0QXR0cmlidXRlKCJocmVmIikKaWYoSi56bCh0LCI/Iikpe3M9Qy54Qi5Oaih0LDAsQy54Qi5PWSh0
-LCI/IikpCm4uYT1zCnI9c31lbHNlIHI9dAppZihjIT1udWxsKXtxPSQublUoKQpyPW4uYT1xLm81KDAs
-RC5ucihxLnRNKGMpLHIpKX1wPUwuRzYodCkKbz1MLmFLKHQpCmlmKHAhPW51bGwpTC5hZihyLHAsbyxi
-LG5ldyBMLm5UKG4scCxvKSkKZWxzZSBMLmFmKHIsbnVsbCxudWxsLGIsbmV3IEwuQloobikpfSwKdW06
-ZnVuY3Rpb24oYSl7cmV0dXJuIEwuUVModS5WLmIoYSkpfSwKUVM6ZnVuY3Rpb24oYSl7dmFyIHQ9MCxz
-PVAuRlgodS56KSxyPTEscSxwPVtdLG8sbixtLGwsawp2YXIgJGFzeW5jJHVtPVAubHooZnVuY3Rpb24o
-YixjKXtpZihiPT09MSl7cT1jCnQ9cn13aGlsZSh0cnVlKXN3aXRjaCh0KXtjYXNlIDA6bD11LmguYShX
-LnFjKGEuY3VycmVudFRhcmdldCkpLmdldEF0dHJpYnV0ZSgiaHJlZiIpCmEucHJldmVudERlZmF1bHQo
-KQpyPTMKdD02CnJldHVybiBQLmpRKEwudHkobCksJGFzeW5jJHVtKQpjYXNlIDY6dS5hXy5hKEouR3Io
-Vy51Vihkb2N1bWVudC5kZWZhdWx0VmlldykpKS5yZWxvYWQoKQpyPTEKdD01CmJyZWFrCmNhc2UgMzpy
-PTIKaz1xCm89SC5SdShrKQpuPUgudHMoaykKTC5xSigiaGFuZGxlUG9zdExpbmtDbGljazogIitILmQo
-byksbikKd2luZG93LmFsZXJ0KCJDb3VsZCBub3QgbG9hZCAiK0guZChsKSsiICgiK0guZChvKSsiKS4i
-KQp0PTUKYnJlYWsKY2FzZSAyOnQ9MQpicmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxzKQpjYXNl
-IDE6cmV0dXJuIFAuZjMocSxzKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkdW0scyl9LAp2VTpmdW5jdGlv
-bigpe3ZhciB0PWRvY3VtZW50LHM9dS5oCkguRGgocyxzLCJUIiwicXVlcnlTZWxlY3RvckFsbCIpCnQ9
-bmV3IFcud3oodC5xdWVyeVNlbGVjdG9yQWxsKCIuY29kZSIpLHUuUykKdC5VKHQsbmV3IEwuR0goKSl9
-LApoWDpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9dS5OCkwuUTYoYSxQLkVGKFsicmVnaW9uIiwicmVnaW9u
-Iiwib2Zmc2V0IixILmQoYildLHQsdCkpLlc3KG5ldyBMLkRUKGEsYixjKSx1LlApLk9BKG5ldyBMLmVI
-KGEpKX0sCkc3OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQKaWYoIUouaHcoYSwiLmRhcnQiKSl7TC5C
-RShhLG5ldyBCLnFwKCIiLCIiLCIiLEMuQ00pLGQpCkwuQlgoYSxudWxsKQppZihlIT1udWxsKWUuJDAo
-KQpyZXR1cm59dD11Lk4KTC5RNihhLFAuRUYoWyJpbmxpbmUiLCJ0cnVlIl0sdCx0KSkuVzcobmV3IEwu
-eXUoYSxkLGIsYyxlKSx1LlApLk9BKG5ldyBMLnpEKGEpKX0sCkdlOmZ1bmN0aW9uKCl7dmFyIHQ9Ii9f
-cHJldmlldy9uYXZpZ2F0aW9uVHJlZS5qc29uIgpMLlE2KHQsQy5XTykuVzcobmV3IEwuVFcoKSx1LlAp
-Lk9BKG5ldyBMLnhyKHQpKX0sCnFKOmZ1bmN0aW9uKGEsYil7dmFyIHQKd2luZG93CmlmKHR5cGVvZiBj
-b25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS5lcnJvcihhKQp3aW5kb3cKdD1ILmQoYikK
-aWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKHQpfSwKcU86
-ZnVuY3Rpb24oYSl7dmFyIHQ9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPUMuQ0QuelEoJC5maSgp
-Lm9mZnNldEhlaWdodCkscj13aW5kb3cuaW5uZXJIZWlnaHQscT1DLkNELnpRKCQuRFcoKS5vZmZzZXRI
-ZWlnaHQpCmlmKHR5cGVvZiByIT09Im51bWJlciIpcmV0dXJuIHIuSE4oKQppZih0LmJvdHRvbT5yLShx
-KzE0KSlKLmRoKGEpCmVsc2UgaWYodC50b3A8cysxNClKLmRoKGEpfSwKZkc6ZnVuY3Rpb24oYSxiKXt2
-YXIgdCxzLHIKaWYoYSE9bnVsbCl7dD1kb2N1bWVudApzPXQuZ2V0RWxlbWVudEJ5SWQoIm8iK0guZChh
-KSkKcj10LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5kKGIpKQppZihzIT1udWxsKXtMLnFPKHMpCkou
-ZFIocykuQSgwLCJ0YXJnZXQiKX1lbHNlIGlmKHIhPW51bGwpTC5xTyhyLnBhcmVudEVsZW1lbnQpCmlm
-KHIhPW51bGwpSi5kUih1LmguYShyLnBhcmVudE5vZGUpKS5BKDAsImhpZ2hsaWdodCIpfWVsc2UgTC5x
-TygkLkQ5KCkpfSwKYWY6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHI9TC5HNih3aW5kb3cubG9j
-YXRpb24uaHJlZikscT1MLmFLKHdpbmRvdy5sb2NhdGlvbi5ocmVmKQppZihyIT1udWxsKXt0PWRvY3Vt
-ZW50LmdldEVsZW1lbnRCeUlkKCJvIitILmQocikpCmlmKHQhPW51bGwpSi5kUih0KS5SeigwLCJ0YXJn
-ZXQiKX1pZihxIT1udWxsKXtzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5kKHEpKQpp
-ZihzIT1udWxsKUouZFIocy5wYXJlbnRFbGVtZW50KS5SeigwLCJoaWdobGlnaHQiKX1pZihhPT13aW5k
-b3cubG9jYXRpb24ucGF0aG5hbWUpe0wuZkcoYixjKQplLiQwKCl9ZWxzZSBMLkc3KGEsYixjLGQsZSl9
-LApRNDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj1QLmhLKGEpLHE9dS5OCnE9UC5GbChxLHEpCmZvcih0
-PXIuZ2hZKCksdD10LmdQdSh0KSx0PXQuZ2t6KHQpO3QubSgpOyl7cz10LmdSKHQpCnEuWSgwLHMuYSxz
-LmIpfWZvcih0PWIuZ1B1KGIpLHQ9dC5na3oodCk7dC5tKCk7KXtzPXQuZ1IodCkKcS5ZKDAscy5hLHMu
-Yil9cS5ZKDAsImF1dGhUb2tlbiIsJC5VRSgpKQpyZXR1cm4gci5ubSgwLHEpLncoMCl9LApUMTpmdW5j
-dGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9JC5oTCgpCkoubDUobCwiIikKaWYoYT09bnVsbCl7
-dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIikKdC50ZXh0Q29udGVudD0iU2VlIGRldGFpbHMgYWJv
-dXQgYSBwcm9wb3NlZCBlZGl0LiIKQy5MdC5zREQodCxILlZNKFsicGxhY2Vob2xkZXIiXSx1LnMpKQpK
-LmRoKHUuaC5iKGwuYXBwZW5kQ2hpbGQodCkpKQpyZXR1cm59cz1hLmQKdD0kLm5VKCkKcj10LnRNKHMp
-CnE9YS5iCnA9ZG9jdW1lbnQKbz10LkhQKHMsSi5UMChwLnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4
-dENvbnRlbnQpKQpuPWEuYwp0PXAuY3JlYXRlRWxlbWVudCgicCIpCm09dS5oLmIobC5hcHBlbmRDaGls
-ZCh0KSkKbS5hcHBlbmRDaGlsZChwLmNyZWF0ZVRleHROb2RlKEguZChxKSsiIGF0ICIrSC5kKG8pKyI6
-IitILmQobikrIi4iKSkKSi5kaChtKQpMLkNDKGEsbCxyKQpMLkZ6KGEsbCl9LApMSDpmdW5jdGlvbihh
-LGIsYyl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmPSQueVAoKQpKLmw1KGYsIiIpCmlm
-KGIuZ2goYik9PT0wKXt0PWRvY3VtZW50CnM9dC5jcmVhdGVFbGVtZW50KCJwIikKdS5oLmIoZi5hcHBl
-bmRDaGlsZChzKSkuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZSgiTm8gcHJvcG9zZWQgZWRpdHMi
-KSl9ZWxzZSBmb3IoZj1iLmdQdShiKSxmPWYuZ2t6KGYpLHQ9dS5pLHM9dS5RLHI9cy5DKCJ+KDEpIiks
-cT11Lk0scz1zLmQscD11Lmg7Zi5tKCk7KXtvPWYuZ1IoZikKbj0kLnlQKCkKbT1kb2N1bWVudApsPW0u
-Y3JlYXRlRWxlbWVudCgicCIpCnAuYihuLmFwcGVuZENoaWxkKGwpKS5hcHBlbmRDaGlsZChtLmNyZWF0
-ZVRleHROb2RlKEguZChvLmEpKyI6IikpCmw9bS5jcmVhdGVFbGVtZW50KCJ1bCIpCms9cC5iKG4uYXBw
-ZW5kQ2hpbGQobCkpCmZvcihvPUouSVQoby5iKTtvLm0oKTspe249by5nUihvKQpsPW0uY3JlYXRlRWxl
-bWVudCgibGkiKQpqPXAuYihrLmFwcGVuZENoaWxkKGwpKQpKLmRSKGopLkEoMCwiZWRpdCIpCmw9bS5j
-cmVhdGVFbGVtZW50KCJhIikKaT10LmIoai5hcHBlbmRDaGlsZChsKSkKaS5jbGFzc0xpc3QuYWRkKCJl
-ZGl0LWxpbmsiKQpoPW4uYwpsPUguZChoKQppLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5l
-dyBXLmk3KGkpKS5TKCJvZmZzZXQiKSxsKQpnPW4uYQpsPUguZChnKQppLnNldEF0dHJpYnV0ZSgiZGF0
-YS0iK25ldyBXLlN5KG5ldyBXLmk3KGkpKS5TKCJsaW5lIiksbCkKaS5hcHBlbmRDaGlsZChtLmNyZWF0
-ZVRleHROb2RlKCJsaW5lICIrSC5kKGcpKSkKbD1yLmIobmV3IEwuRUUoaCxnLGEpKQpxLmIobnVsbCkK
-Vy5KRShpLCJjbGljayIsbCwhMSxzKQpqLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoIjogIitI
-LmQobi5iKSkpfX1pZihjKUwuVDEobnVsbCl9LApGcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyPXdp
-bmRvdy5sb2NhdGlvbixxPVAuaEsoKHImJkMuRXgpLmdEcihyKStILmQoYSkpCnI9dS5OCnI9UC5GbChy
-LHIpCmlmKGIhPW51bGwpci5ZKDAsIm9mZnNldCIsSC5kKGIpKQppZihjIT1udWxsKXIuWSgwLCJsaW5l
-IixILmQoYykpCnIuWSgwLCJhdXRoVG9rZW4iLCQuVUUoKSkKcT1xLm5tKDAscikKcj13aW5kb3cuaGlz
-dG9yeQp0PXUuegpzPXEudygwKQpyLnRvU3RyaW5nCnIucHVzaFN0YXRlKG5ldyBQLkJmKFtdLFtdKS5Q
-dihQLkZsKHQsdCkpLCIiLHMpfSwKRW46ZnVuY3Rpb24oYSl7dmFyIHQ9Si5iYihkb2N1bWVudC5xdWVy
-eVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50LCIvIikKaWYoQy54Qi5uQyhhLHQpKXJldHVybiBD
-LnhCLnluKGEsdC5sZW5ndGgpCmVsc2UgcmV0dXJuIGF9LApCWDpmdW5jdGlvbihhLGIpe3ZhciB0LHMs
-cj17fQpyLmE9YQphPUwuRW4oYSkKci5hPWEKJC5EOSgpLnRleHRDb250ZW50PWEKdD1kb2N1bWVudApz
-PXUuaApILkRoKHMscywiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQp0PW5ldyBXLnd6KHQucXVlcnlTZWxl
-Y3RvckFsbCgiLm5hdi1wYW5lbCAubmF2LWxpbmsiKSx1LlMpCnQuVSh0LG5ldyBMLlZTKHIpKX0sCkJF
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD0iLnJlZ2lvbnMiLHM9ZG9jdW1lbnQscj1zLnF1ZXJ5U2VsZWN0
-b3IodCkscT1zLnF1ZXJ5U2VsZWN0b3IoIi5jb2RlIikKSi50SChyLGIuYSwkLktHKCkpCkoudEgocSxi
-LmIsJC5LRygpKQpMLkxIKGEsYi5kLGMpCkwudlUoKQpMLnlYKCIuY29kZSIsITApCkwueVgodCwhMCl9
-LAp0WDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaT1kb2N1bWVudCxoPWku
-Y3JlYXRlRWxlbWVudCgidWwiKSxnPXUuaCxmPWcuYihhLmFwcGVuZENoaWxkKGgpKQpmb3IoaD1iLmxl
-bmd0aCx0PXUuTSxzPTA7czxiLmxlbmd0aDtiLmxlbmd0aD09PWh8fCgwLEgubGspKGIpLCsrcyl7cj1i
-W3NdCnE9aS5jcmVhdGVFbGVtZW50KCJsaSIpCnA9Zy5iKGYuYXBwZW5kQ2hpbGQocSkpCnE9Si5SRShw
-KQppZihyLmE9PT1DLlkyKXtxLmdERChwKS5BKDAsImRpciIpCnE9aS5jcmVhdGVFbGVtZW50KCJzcGFu
-IikKbz1nLmIocC5hcHBlbmRDaGlsZChxKSkKcT1KLlJFKG8pCnEuZ0REKG8pLkEoMCwiYXJyb3ciKQpx
-LnNoZihvLCImI3gyNUJDOyIpCnE9aS5jcmVhdGVFbGVtZW50KCJzcGFuIikKSi5sNShnLmIocC5hcHBl
-bmRDaGlsZChxKSksIiYjeDFGNEMxOyIpCnAuYXBwZW5kQ2hpbGQoaS5jcmVhdGVUZXh0Tm9kZShyLmIp
-KQpMLnRYKHAsci5jKQpMLmt6KG8pfWVsc2V7cS5zaGYocCwiJiN4MUY0QzQ7IikKcT1pLmNyZWF0ZUVs
-ZW1lbnQoImEiKQpuPWcuYihwLmFwcGVuZENoaWxkKHEpKQpxPUouUkUobikKcS5nREQobikuQSgwLCJu
-YXYtbGluayIpCm4uc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcobikpLlMoIm5h
-bWUiKSxyLmQpCm4uc2V0QXR0cmlidXRlKCJocmVmIixyLmUpCm4uYXBwZW5kQ2hpbGQoaS5jcmVhdGVU
-ZXh0Tm9kZShyLmIpKQpxPXEuZ1ZsKG4pCm09cS4kdGkKbD1tLkMoIn4oMSkiKS5iKG5ldyBMLlREKCkp
-CnQuYihudWxsKQpXLkpFKHEuYSxxLmIsbCwhMSxtLmQpCms9ci5mCmlmKHR5cGVvZiBrIT09Im51bWJl
-ciIpcmV0dXJuIGsub3MoKQppZihrPjApe3E9aS5jcmVhdGVFbGVtZW50KCJzcGFuIikKaj1nLmIocC5h
-cHBlbmRDaGlsZChxKSkKSi5kUihqKS5BKDAsImVkaXQtY291bnQiKQpxPSIiK2srIiAiCmlmKGs9PT0x
-KW09ImVkaXQiCmVsc2UgbT0iZWRpdHMiCmouc2V0QXR0cmlidXRlKCJ0aXRsZSIscSttKQpqLmFwcGVu
-ZENoaWxkKGkuY3JlYXRlVGV4dE5vZGUoQy5qbi53KGspKSl9fX19LApGejpmdW5jdGlvbihhLGIpe3Zh
-ciB0LHMscixxLHAsbyxuLG0sbCxrLGosaT1hLmEKaWYoaSE9bnVsbCl7dD1kb2N1bWVudApzPXQuY3Jl
-YXRlRWxlbWVudCgicCIpCnI9dS5oCnE9ci5iKGIuYXBwZW5kQ2hpbGQocykpCmZvcihzPWkubGVuZ3Ro
-LHA9dS5zLG89dS5YLG49MDtuPGkubGVuZ3RoO2kubGVuZ3RoPT09c3x8KDAsSC5saykoaSksKytuKXtt
-PWlbbl0KbD10LmNyZWF0ZUVsZW1lbnQoImEiKQprPXIuYihxLmFwcGVuZENoaWxkKGwpKQprLmFwcGVu
-ZENoaWxkKHQuY3JlYXRlVGV4dE5vZGUobS5hKSkKay5zZXRBdHRyaWJ1dGUoImhyZWYiLG0uYikKbD1v
-LmIoSC5WTShbInBvc3QtbGluayIsImJlZm9yZS1hcHBseSJdLHApKQpqPUouZFIoaykKai5WMSgwKQpq
-LkZWKDAsbCl9fX0sCkNDOmZ1bmN0aW9uKGEzLGE0LGE1KXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxq
-LGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyPW51bGwKZm9yKHQ9YTMuZSxzPXQubGVuZ3RoLHI9dS5z
-LHE9dS5YLHA9dS5oLG89dS5pLG49MDtuPHQubGVuZ3RoO3QubGVuZ3RoPT09c3x8KDAsSC5saykodCks
-KytuKXttPXRbbl0KbD1kb2N1bWVudAprPWwuY3JlYXRlRWxlbWVudCgicCIpCmo9cS5iKEguVk0oWyJ0
-cmFjZSJdLHIpKQppPUouZFIoaykKaS5WMSgwKQppLkZWKDAsaikKaD1hNC5hcHBlbmRDaGlsZChrKQpr
-PWwuY3JlYXRlRWxlbWVudCgic3BhbiIpCmo9cS5iKEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scikp
-Cmk9Si5kUihrKQppLlYxKDApCmkuRlYoMCxqKQprLmFwcGVuZENoaWxkKGwuY3JlYXRlVGV4dE5vZGUo
-bS5hKSkKaC5hcHBlbmRDaGlsZChrKQpoLmFwcGVuZENoaWxkKGwuY3JlYXRlVGV4dE5vZGUoIjoiKSkK
-az1sLmNyZWF0ZUVsZW1lbnQoInVsIikKaj1xLmIoSC5WTShbInRyYWNlIl0scikpCmk9Si5kUihrKQpp
-LlYxKDApCmkuRlYoMCxqKQpnPWguYXBwZW5kQ2hpbGQoaykKZm9yKGs9bS5iLGo9ay5sZW5ndGgsZj0w
-O2Y8ay5sZW5ndGg7ay5sZW5ndGg9PT1qfHwoMCxILmxrKShrKSwrK2Ype2U9a1tmXQpkPWwuY3JlYXRl
-RWxlbWVudCgibGkiKQpKLmw1KGQsIiYjeDI3NEY7ICIpCmM9cC5iKGcuYXBwZW5kQ2hpbGQoZCkpCmQ9
-bC5jcmVhdGVFbGVtZW50KCJzcGFuIikKYj1xLmIoSC5WTShbImZ1bmN0aW9uIl0scikpCmk9Si5kUihk
-KQppLlYxKDApCmkuRlYoMCxiKQpiPWUuYgpMLmtEKGQsYj09bnVsbD8idW5rbm93biI6YikKYy5hcHBl
-bmRDaGlsZChkKQphPWUuYwppZihhIT1udWxsKXtjLmFwcGVuZENoaWxkKGwuY3JlYXRlVGV4dE5vZGUo
-IiAoIikpCmEwPWEuYgpkPWwuY3JlYXRlRWxlbWVudCgiYSIpCm8uYihkKQpkLmFwcGVuZENoaWxkKGwu
-Y3JlYXRlVGV4dE5vZGUoSC5kKGEuYykrIjoiK0guZChhMCkpKQphMT1hLmEKYj0kLm5VKCkKZC5zZXRB
-dHRyaWJ1dGUoImhyZWYiLGIubzUoMCxiLnE3KDAsYTUsYTEsYTIsYTIsYTIsYTIsYTIsYTIpKSkKZC5j
-bGFzc0xpc3QuYWRkKCJuYXYtbGluayIpCmMuYXBwZW5kQ2hpbGQoZCkKYy5hcHBlbmRDaGlsZChsLmNy
-ZWF0ZVRleHROb2RlKCIpIikpfWMuYXBwZW5kQ2hpbGQobC5jcmVhdGVUZXh0Tm9kZSgiOiAiKSkKZD1l
-LmEKTC5rRChjLGQ9PW51bGw/InVua25vd24iOmQpfX19LAprRDpmdW5jdGlvbihhLGIpe3ZhciB0LHMs
-cj1ILlZNKGIuc3BsaXQoIi4iKSx1LnMpLHE9Qy5ObS5ndEgocikscD1kb2N1bWVudAphLmFwcGVuZENo
-aWxkKHAuY3JlYXRlVGV4dE5vZGUocSkpCmZvcihxPUgucUMociwxLG51bGwsdS5OKSxxPW5ldyBILmE3
-KHEscS5naChxKSxxLiR0aS5DKCJhNzxhTC5FPiIpKSx0PUouUkUoYSk7cS5tKCk7KXtzPXEuZAp0Lm56
-KGEsImJlZm9yZWVuZCIsIiYjODIwMzsuIixudWxsLG51bGwpCmEuYXBwZW5kQ2hpbGQocC5jcmVhdGVU
-ZXh0Tm9kZShzKSl9fSwKZTpmdW5jdGlvbiBlKCl7fSwKVlc6ZnVuY3Rpb24gVlcoYSxiLGMpe3RoaXMu
-YT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKb1o6ZnVuY3Rpb24gb1ooKXt9LApqcjpmdW5jdGlvbiBqcigp
-e30sCnFsOmZ1bmN0aW9uIHFsKCl7fSwKeTg6ZnVuY3Rpb24geTgoKXt9LApMOmZ1bmN0aW9uIEwoKXt9
-LApXeDpmdW5jdGlvbiBXeChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQU86ZnVuY3Rpb24gQU8oYSl7
-dGhpcy5hPWF9LApkTjpmdW5jdGlvbiBkTihhKXt0aGlzLmE9YX0sCkhvOmZ1bmN0aW9uIEhvKGEpe3Ro
-aXMuYT1hfSwKeHo6ZnVuY3Rpb24geHooYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCklDOmZ1bmN0aW9u
-IElDKCl7fSwKTDE6ZnVuY3Rpb24gTDEoKXt9LApuVDpmdW5jdGlvbiBuVChhLGIsYyl7dGhpcy5hPWEK
-dGhpcy5iPWIKdGhpcy5jPWN9LApCWjpmdW5jdGlvbiBCWihhKXt0aGlzLmE9YX0sCkdIOmZ1bmN0aW9u
-IEdIKCl7fSwKRFQ6ZnVuY3Rpb24gRFQoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwK
-ZUg6ZnVuY3Rpb24gZUgoYSl7dGhpcy5hPWF9LAp5dTpmdW5jdGlvbiB5dShhLGIsYyxkLGUpe3ZhciBf
-PXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWV9LAp6RDpmdW5jdGlvbiB6RChhKXt0aGlz
-LmE9YX0sClRXOmZ1bmN0aW9uIFRXKCl7fSwKeHI6ZnVuY3Rpb24geHIoYSl7dGhpcy5hPWF9LApFRTpm
-dW5jdGlvbiBFRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApRTDpmdW5jdGlvbiBR
-TChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKVlM6ZnVuY3Rpb24gVlMoYSl7dGhpcy5hPWF9LApURDpm
-dW5jdGlvbiBURCgpe30sClhBOmZ1bmN0aW9uIFhBKCl7fSwKbUs6ZnVuY3Rpb24oYSl7dmFyIHQscyxy
-LHEscCxvLG49SC5WTShbXSx1LmZoKQpmb3IodD1KLklUKHUuUi5iKGEpKTt0Lm0oKTspe3M9dC5nUih0
-KQpyPUouVTYocykKcT1MLnAyKEgueShyLnEocywidHlwZSIpKSkKcD1ILnkoci5xKHMsIm5hbWUiKSkK
-bz1yLnEocywic3VidHJlZSIpCm89bz09bnVsbD9udWxsOkwubUsobykKQy5ObS5BKG4sbmV3IEwuWloo
-cSxwLG8sSC55KHIucShzLCJwYXRoIikpLEgueShyLnEocywiaHJlZiIpKSxILlNjKHIucShzLCJlZGl0
-Q291bnQiKSkpKX1yZXR1cm4gbn0sCnAyOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlImRpcmVjdG9y
-eSI6cmV0dXJuIEMuWTIKY2FzZSJmaWxlIjpyZXR1cm4gQy5yZgpkZWZhdWx0OnRocm93IEguYihQLlBW
-KCJVbnJlY29nbml6ZWQgbmF2aWdhdGlvbiB0cmVlIG5vZGUgdHlwZTogIitILmQoYSkpKX19LApaWjpm
-dW5jdGlvbiBaWihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApf
-LmU9ZQpfLmY9Zn0sCkJjOmZ1bmN0aW9uIEJjKGEpe3RoaXMuYj1hfSwKSVY6ZnVuY3Rpb24gSVYoYSxi
-LGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9YgpfLmY9YwpfLnI9ZH19LE09ewpZRjpmdW5jdGlvbihh
-LGIpe3ZhciB0LHMscixxLHAsbyxuCmZvcih0PWIubGVuZ3RoLHM9MTtzPHQ7KytzKXtpZihiW3NdPT1u
-dWxsfHxiW3MtMV0hPW51bGwpY29udGludWUKZm9yKDt0Pj0xO3Q9cil7cj10LTEKaWYoYltyXSE9bnVs
-bClicmVha31xPW5ldyBQLlJuKCIiKQpwPWErIigiCnEuYT1wCm89SC5xQyhiLDAsdCxILnQ2KGIpLmQp
-Cm49by4kdGkKbj1wK25ldyBILkE4KG8sbi5DKCJxVShhTC5FKSIpLmIobmV3IE0uTm8oKSksbi5DKCJB
-ODxhTC5FLHFVPiIpKS56VigwLCIsICIpCnEuYT1uCnEuYT1uKygiKTogcGFydCAiKyhzLTEpKyIgd2Fz
-IG51bGwsIGJ1dCBwYXJ0ICIrcysiIHdhcyBub3QuIikKdGhyb3cgSC5iKFAueFkocS53KDApKSl9fSwK
-bEk6ZnVuY3Rpb24gbEkoYSl7dGhpcy5hPWF9LApNaTpmdW5jdGlvbiBNaSgpe30sCnE3OmZ1bmN0aW9u
-IHE3KCl7fSwKTm86ZnVuY3Rpb24gTm8oKXt9fSxYPXsKQ0w6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIs
-cSxwLG89Yi54WihhKQpiLmhLKGEpCmlmKG8hPW51bGwpYT1KLktWKGEsby5sZW5ndGgpCnQ9dS5zCnM9
-SC5WTShbXSx0KQpyPUguVk0oW10sdCkKdD1hLmxlbmd0aAppZih0IT09MCYmYi5yNChDLnhCLldkKGEs
-MCkpKXtpZigwPj10KXJldHVybiBILk9IKGEsMCkKQy5ObS5BKHIsYVswXSkKcT0xfWVsc2V7Qy5ObS5B
-KHIsIiIpCnE9MH1mb3IocD1xO3A8dDsrK3ApaWYoYi5yNChDLnhCLldkKGEscCkpKXtDLk5tLkEocyxD
-LnhCLk5qKGEscSxwKSkKQy5ObS5BKHIsYVtwXSkKcT1wKzF9aWYocTx0KXtDLk5tLkEocyxDLnhCLnlu
-KGEscSkpCkMuTm0uQShyLCIiKX1yZXR1cm4gbmV3IFguV0QoYixvLHMscil9LApXRDpmdW5jdGlvbiBX
-RChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1jCl8uZT1kfSwKcVI6ZnVuY3Rpb24g
-cVIoYSl7dGhpcy5hPWF9LApJNzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFguZHYoYSl9LApkdjpmdW5j
-dGlvbiBkdihhKXt0aGlzLmE9YX19LE89ewpSaDpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbyxuLG0s
-bCxrLGosaT1udWxsCmlmKFAudW8oKS5nRmkoKSE9PSJmaWxlIilyZXR1cm4gJC5FYigpCnQ9UC51bygp
-CmlmKCFDLnhCLlRjKHQuZ0lpKHQpLCIvIikpcmV0dXJuICQuRWIoKQpzPVAuUGkoaSwwLDApCnI9UC56
-UihpLDAsMCkKcT1QLk9lKGksMCwwLCExKQpwPVAubGUoaSwwLDAsaSkKbz1QLnRHKGksMCwwKQpuPVAu
-d0IoaSxzKQptPXM9PT0iZmlsZSIKaWYocT09bnVsbCl0PXIubGVuZ3RoIT09MHx8biE9bnVsbHx8bQpl
-bHNlIHQ9ITEKaWYodClxPSIiCnQ9cT09bnVsbApsPSF0Cms9UC5rYSgiYS9iIiwwLDMsaSxzLGwpCmo9
-cy5sZW5ndGg9PT0wCmlmKGomJnQmJiFDLnhCLm5DKGssIi8iKSlrPVAud0Yoaywhanx8bCkKZWxzZSBr
-PVAueGUoaykKaWYobmV3IFAuRG4ocyxyLHQmJkMueEIubkMoaywiLy8iKT8iIjpxLG4sayxwLG8pLnQ0
-KCk9PT0iYVxcYiIpcmV0dXJuICQuS2soKQpyZXR1cm4gJC5iRCgpfSwKT086ZnVuY3Rpb24gT08oKXt9
-fSxFPXtPRjpmdW5jdGlvbiBPRihhLGIsYyl7dGhpcy5kPWEKdGhpcy5lPWIKdGhpcy5mPWN9fSxGPXty
-dTpmdW5jdGlvbiBydShhLGIsYyxkKXt2YXIgXz10aGlzCl8uZD1hCl8uZT1iCl8uZj1jCl8ucj1kfX0s
-RD17ClJYOmZ1bmN0aW9uKCl7dmFyIHQscyxyPVAudW8oKQppZihKLlJNKHIsJC5JNikpcmV0dXJuICQu
-RmYKJC5JNj1yCmlmKCQuSGsoKT09JC5FYigpKXJldHVybiAkLkZmPXIuWkkoIi4iKS53KDApCmVsc2V7
-dD1yLnQ0KCkKcz10Lmxlbmd0aC0xCnJldHVybiAkLkZmPXM9PT0wP3Q6Qy54Qi5Oaih0LDAscyl9fSwK
-bnI6ZnVuY3Rpb24oYSxiKXt2YXIgdD1udWxsCnJldHVybiAkLm5VKCkucTcoMCxhLGIsdCx0LHQsdCx0
-LHQpfX0KdmFyIHc9W0MsSCxKLFAsVyxVLEIsVCxMLE0sWCxPLEUsRixEXQpodW5rSGVscGVycy5zZXRG
-dW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkodykKdmFyICQ9e30KSC5lby5wcm90b3R5cGU9e30KSi52Qi5w
-cm90b3R5cGU9ewpETjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09Yn0sCmdpOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBILmVRKGEpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5kKEguTShh
-KSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1Lm8uYihiKQp0aHJvdyBILmIoUC5scihhLGIuZ1dhKCks
-Yi5nbmQoKSxiLmdWbSgpKSl9fQpKLnlFLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0
-cmluZyhhKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhPzUxOTAxODoyMTgxNTl9LAokaWEyOjF9Ckou
-WUUucHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09Yn0sCnc6ZnVuY3Rpb24o
-YSl7cmV0dXJuIm51bGwifSwKZ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDB9LAplNzpmdW5jdGlvbihhLGIp
-e3JldHVybiB0aGlzLlNqKGEsdS5vLmIoYikpfSwKJGljODoxfQpKLk1GLnByb3RvdHlwZT17CmdpOmZ1
-bmN0aW9uKGEpe3JldHVybiAwfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGl2bTox
-fQpKLmlDLnByb3RvdHlwZT17fQpKLmtkLnByb3RvdHlwZT17fQpKLmM1LnByb3RvdHlwZT17Cnc6ZnVu
-Y3Rpb24oYSl7dmFyIHQ9YVskLncoKV0KaWYodD09bnVsbClyZXR1cm4gdGhpcy50KGEpCnJldHVybiJK
-YXZhU2NyaXB0IGZ1bmN0aW9uIGZvciAiK0guZChKLmoodCkpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm57
-ZnVuYzoxLG9wdDpbLCwsLCwsLCwsLCwsLCwsLF19fSwKJGlFSDoxfQpKLmpkLnByb3RvdHlwZT17CkE6
-ZnVuY3Rpb24oYSxiKXtILnQ2KGEpLmQuYihiKQppZighIWEuZml4ZWQkbGVuZ3RoKUguVmooUC5MNCgi
-YWRkIikpCmEucHVzaChiKX0sClc0OmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoISFhLmZpeGVkJGxlbmd0
-aClILlZqKFAuTDQoInJlbW92ZUF0IikpCnQ9YS5sZW5ndGgKaWYoYj49dCl0aHJvdyBILmIoUC54KGIs
-bnVsbCkpCnJldHVybiBhLnNwbGljZShiLDEpWzBdfSwKb0Y6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMs
-cgpILnQ2KGEpLkMoImNYPDE+IikuYihjKQppZighIWEuZml4ZWQkbGVuZ3RoKUguVmooUC5MNCgiaW5z
-ZXJ0QWxsIikpCnQ9YS5sZW5ndGgKUC53QShiLDAsdCwiaW5kZXgiKQpzPWMubGVuZ3RoCnRoaXMuc2go
-YSx0K3MpCnI9YitzCnRoaXMuWVcoYSxyLGEubGVuZ3RoLGEsYikKdGhpcy52ZyhhLGIscixjKX0sCm12
-OmZ1bmN0aW9uKGEpe2lmKCEhYS5maXhlZCRsZW5ndGgpSC5WaihQLkw0KCJyZW1vdmVMYXN0IikpCmlm
-KGEubGVuZ3RoPT09MCl0aHJvdyBILmIoSC5IWShhLC0xKSkKcmV0dXJuIGEucG9wKCl9LApGVjpmdW5j
-dGlvbihhLGIpe3ZhciB0CkgudDYoYSkuQygiY1g8MT4iKS5iKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgp
-SC5WaihQLkw0KCJhZGRBbGwiKSkKZm9yKHQ9Si5JVChiKTt0Lm0oKTspYS5wdXNoKHQuZ1IodCkpfSwK
-VTpmdW5jdGlvbihhLGIpe3ZhciB0LHMKSC50NihhKS5DKCJ+KDEpIikuYihiKQp0PWEubGVuZ3RoCmZv
-cihzPTA7czx0Oysrcyl7Yi4kMShhW3NdKQppZihhLmxlbmd0aCE9PXQpdGhyb3cgSC5iKFAuYTQoYSkp
-fX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILnQ2KGEpCnJldHVybiBuZXcgSC5BOChhLHQuSyhj
-KS5DKCIxKDIpIikuYihiKSx0LkMoIkA8MT4iKS5LKGMpLkMoIkE4PDEsMj4iKSl9LAp6VjpmdW5jdGlv
-bihhLGIpe3ZhciB0LHM9bmV3IEFycmF5KGEubGVuZ3RoKQpzLmZpeGVkJGxlbmd0aD1BcnJheQpmb3Io
-dD0wO3Q8YS5sZW5ndGg7Kyt0KXRoaXMuWShzLHQsSC5kKGFbdF0pKQpyZXR1cm4gcy5qb2luKGIpfSwK
-TjA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyCmQuYihiKQpILnQ2KGEpLksoZCkuQygiMSgxLDIp
-IikuYihjKQp0PWEubGVuZ3RoCmZvcihzPWIscj0wO3I8dDsrK3Ipe3M9Yy4kMihzLGFbcl0pCmlmKGEu
-bGVuZ3RoIT09dCl0aHJvdyBILmIoUC5hNChhKSl9cmV0dXJuIHN9LApXOmZ1bmN0aW9uKGEsYil7aWYo
-YjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJldHVybiBhW2JdfSwKRDY6ZnVuY3Rpb24o
-YSxiLGMpe2lmKGI8MHx8Yj5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShiLDAsYS5sZW5ndGgsInN0YXJ0
-IixudWxsKSkKaWYoYzxifHxjPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGMsYixhLmxlbmd0aCwiZW5k
-IixudWxsKSkKaWYoYj09PWMpcmV0dXJuIEguVk0oW10sSC50NihhKSkKcmV0dXJuIEguVk0oYS5zbGlj
-ZShiLGMpLEgudDYoYSkpfSwKZ3RIOmZ1bmN0aW9uKGEpe2lmKGEubGVuZ3RoPjApcmV0dXJuIGFbMF0K
-dGhyb3cgSC5iKEguV3AoKSl9LApnclo6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKaWYodD4wKXJl
-dHVybiBhW3QtMV0KdGhyb3cgSC5iKEguV3AoKSl9LApZVzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0
-LHMscj1ILnQ2KGEpCnIuQygiY1g8MT4iKS5iKGQpCmlmKCEhYS5pbW11dGFibGUkbGlzdClILlZqKFAu
-TDQoInNldFJhbmdlIikpClAuakIoYixjLGEubGVuZ3RoKQp0PWMtYgppZih0PT09MClyZXR1cm4KUC5r
-MShlLCJza2lwQ291bnQiKQpyLkMoInpNPDE+IikuYihkKQpyPUouVTYoZCkKaWYoZSt0PnIuZ2goZCkp
-dGhyb3cgSC5iKEguYXIoKSkKaWYoZTxiKWZvcihzPXQtMTtzPj0wOy0tcylhW2Irc109ci5xKGQsZStz
-KQplbHNlIGZvcihzPTA7czx0OysrcylhW2Irc109ci5xKGQsZStzKX0sCnZnOmZ1bmN0aW9uKGEsYixj
-LGQpe3JldHVybiB0aGlzLllXKGEsYixjLGQsMCl9LApWcjpmdW5jdGlvbihhLGIpe3ZhciB0LHMKSC50
-NihhKS5DKCJhMigxKSIpLmIoYikKdD1hLmxlbmd0aApmb3Iocz0wO3M8dDsrK3Mpe2lmKEgub1QoYi4k
-MShhW3NdKSkpcmV0dXJuITAKaWYoYS5sZW5ndGghPT10KXRocm93IEguYihQLmE0KGEpKX1yZXR1cm4h
-MX0sCnRnOmZ1bmN0aW9uKGEsYil7dmFyIHQKZm9yKHQ9MDt0PGEubGVuZ3RoOysrdClpZihKLlJNKGFb
-dF0sYikpcmV0dXJuITAKcmV0dXJuITF9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLldFKGEsIlsiLCJd
-Iil9LApna3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBKLm0xKGEsYS5sZW5ndGgsSC50NihhKS5DKCJt
-MTwxPiIpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKGEpfSwKZ2g6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGEubGVuZ3RofSwKc2g6ZnVuY3Rpb24oYSxiKXtpZighIWEuZml4ZWQkbGVuZ3RoKUguVmooUC5M
-NCgic2V0IGxlbmd0aCIpKQppZihiPDApdGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIs
-bnVsbCkpCmEubGVuZ3RoPWJ9LApxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj1hLmxlbmd0aHx8
-YjwwKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC5T
-YyhiKQpILnQ2KGEpLmQuYihjKQppZighIWEuaW1tdXRhYmxlJGxpc3QpSC5WaihQLkw0KCJpbmRleGVk
-IHNldCIpKQppZighSC5vayhiKSl0aHJvdyBILmIoSC5IWShhLGIpKQppZihiPj1hLmxlbmd0aHx8Yjww
-KXRocm93IEguYihILkhZKGEsYikpCmFbYl09Y30sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9CkouUG8u
-cHJvdG90eXBlPXt9CkoubTEucHJvdG90eXBlPXsKZ1I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZH0s
-Cm06ZnVuY3Rpb24oKXt2YXIgdCxzPXRoaXMscj1zLmEscT1yLmxlbmd0aAppZihzLmIhPT1xKXRocm93
-IEguYihILmxrKHIpKQp0PXMuYwppZih0Pj1xKXtzLnNNKG51bGwpCnJldHVybiExfXMuc00oclt0XSk7
-KytzLmMKcmV0dXJuITB9LApzTTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlB
-bjoxfQpKLnFJLnByb3RvdHlwZT17Cnl1OmZ1bmN0aW9uKGEpe3ZhciB0CmlmKGE+PS0yMTQ3NDgzNjQ4
-JiZhPD0yMTQ3NDgzNjQ3KXJldHVybiBhfDAKaWYoaXNGaW5pdGUoYSkpe3Q9YTwwP01hdGguY2VpbChh
-KTpNYXRoLmZsb29yKGEpCnJldHVybiB0KzB9dGhyb3cgSC5iKFAuTDQoIiIrYSsiLnRvSW50KCkiKSl9
-LAp6UTpmdW5jdGlvbihhKXtpZihhPjApe2lmKGEhPT0xLzApcmV0dXJuIE1hdGgucm91bmQoYSl9ZWxz
-ZSBpZihhPi0xLzApcmV0dXJuIDAtTWF0aC5yb3VuZCgwLWEpCnRocm93IEguYihQLkw0KCIiK2ErIi5y
-b3VuZCgpIikpfSwKRDg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscQppZihiPDJ8fGI+MzYpdGhyb3cg
-SC5iKFAuVEUoYiwyLDM2LCJyYWRpeCIsbnVsbCkpCnQ9YS50b1N0cmluZyhiKQppZihDLnhCLk8yKHQs
-dC5sZW5ndGgtMSkhPT00MSlyZXR1cm4gdApzPS9eKFtcZGEtel0rKSg/OlwuKFtcZGEtel0rKSk/XChl
-XCsoXGQrKVwpJC8uZXhlYyh0KQppZihzPT1udWxsKUguVmooUC5MNCgiVW5leHBlY3RlZCB0b1N0cmlu
-ZyByZXN1bHQ6ICIrdCkpCnI9cy5sZW5ndGgKaWYoMT49cilyZXR1cm4gSC5PSChzLDEpCnQ9c1sxXQpp
-ZigzPj1yKXJldHVybiBILk9IKHMsMykKcT0rc1szXQpyPXNbMl0KaWYociE9bnVsbCl7dCs9cgpxLT1y
-Lmxlbmd0aH1yZXR1cm4gdCtDLnhCLkl4KCIwIixxKX0sCnc6ZnVuY3Rpb24oYSl7aWYoYT09PTAmJjEv
-YTwwKXJldHVybiItMC4wIgplbHNlIHJldHVybiIiK2F9LApnaTpmdW5jdGlvbihhKXt2YXIgdCxzLHIs
-cSxwPWF8MAppZihhPT09cClyZXR1cm4gNTM2ODcwOTExJnAKdD1NYXRoLmFicyhhKQpzPU1hdGgubG9n
-KHQpLzAuNjkzMTQ3MTgwNTU5OTQ1M3wwCnI9TWF0aC5wb3coMixzKQpxPXQ8MT90L3I6ci90CnJldHVy
-biA1MzY4NzA5MTEmKChxKjkwMDcxOTkyNTQ3NDA5OTJ8MCkrKHEqMzU0MjI0MzE4MTE3NjUyMXwwKSkq
-NTk5MTk3K3MqMTI1OX0sCnpZOmZ1bmN0aW9uKGEsYil7dmFyIHQ9YSViCmlmKHQ9PT0wKXJldHVybiAw
-CmlmKHQ+MClyZXR1cm4gdAppZihiPDApcmV0dXJuIHQtYgplbHNlIHJldHVybiB0K2J9LAp3RzpmdW5j
-dGlvbihhLGIpe3ZhciB0CmlmKGE+MCl0PXRoaXMucDMoYSxiKQplbHNle3Q9Yj4zMT8zMTpiCnQ9YT4+
-dD4+PjB9cmV0dXJuIHR9LApiZjpmdW5jdGlvbihhLGIpe2lmKGI8MCl0aHJvdyBILmIoSC50TChiKSkK
-cmV0dXJuIHRoaXMucDMoYSxiKX0sCnAzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI+MzE/MDphPj4+Yn0s
-CiRpQ1A6MSwKJGlGSzoxfQpKLnVyLnByb3RvdHlwZT17JGlLTjoxfQpKLlZBLnByb3RvdHlwZT17fQpK
-LkRyLnByb3RvdHlwZT17Ck8yOmZ1bmN0aW9uKGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikp
-CmlmKGI+PWEubGVuZ3RoKUguVmooSC5IWShhLGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKV2Q6
-ZnVuY3Rpb24oYSxiKXtpZihiPj1hLmxlbmd0aCl0aHJvdyBILmIoSC5IWShhLGIpKQpyZXR1cm4gYS5j
-aGFyQ29kZUF0KGIpfSwKZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgudW4oYixhLDApfSwKVDpm
-dW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nIil0aHJvdyBILmIoUC5MMyhiLG51bGwsbnVs
-bCkpCnJldHVybiBhK2J9LApUYzpmdW5jdGlvbihhLGIpe3ZhciB0PWIubGVuZ3RoLHM9YS5sZW5ndGgK
-aWYodD5zKXJldHVybiExCnJldHVybiBiPT09dGhpcy55bihhLHMtdCl9LAppNzpmdW5jdGlvbihhLGIs
-YyxkKXt2YXIgdCxzCmM9UC5qQihiLGMsYS5sZW5ndGgpCnQ9YS5zdWJzdHJpbmcoMCxiKQpzPWEuc3Vi
-c3RyaW5nKGMpCnJldHVybiB0K2Qrc30sClFpOmZ1bmN0aW9uKGEsYixjKXt2YXIgdAppZighSC5vayhj
-KSlILlZqKEgudEwoYykpCmlmKHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIGMuSigpCmlmKGM8MHx8
-Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKdD1jK2IubGVu
-Z3RoCmlmKHQ+YS5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIGI9PT1hLnN1YnN0cmluZyhjLHQpfSwKbkM6
-ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5RaShhLGIsMCl9LApOajpmdW5jdGlvbihhLGIsYyl7aWYo
-IUgub2soYikpSC5WaihILnRMKGIpKQppZihjPT1udWxsKWM9YS5sZW5ndGgKaWYodHlwZW9mIGIhPT0i
-bnVtYmVyIilyZXR1cm4gYi5KKCkKaWYoYjwwKXRocm93IEguYihQLngoYixudWxsKSkKaWYoYj5jKXRo
-cm93IEguYihQLngoYixudWxsKSkKaWYoYz5hLmxlbmd0aCl0aHJvdyBILmIoUC54KGMsbnVsbCkpCnJl
-dHVybiBhLnN1YnN0cmluZyhiLGMpfSwKeW46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5OaihhLGIs
-bnVsbCl9LApoYzpmdW5jdGlvbihhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpfSwKYlM6ZnVuY3Rpb24o
-YSl7dmFyIHQscyxyLHE9YS50cmltKCkscD1xLmxlbmd0aAppZihwPT09MClyZXR1cm4gcQppZih0aGlz
-LldkKHEsMCk9PT0xMzMpe3Q9Si5tbShxLDEpCmlmKHQ9PT1wKXJldHVybiIifWVsc2UgdD0wCnM9cC0x
-CnI9dGhpcy5PMihxLHMpPT09MTMzP0ouYzEocSxzKTpwCmlmKHQ9PT0wJiZyPT09cClyZXR1cm4gcQpy
-ZXR1cm4gcS5zdWJzdHJpbmcodCxyKX0sCkl4OmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZigwPj1iKXJl
-dHVybiIiCmlmKGI9PT0xfHxhLmxlbmd0aD09PTApcmV0dXJuIGEKaWYoYiE9PWI+Pj4wKXRocm93IEgu
-YihDLkVxKQpmb3IodD1hLHM9IiI7ITA7KXtpZigoYiYxKT09PTEpcz10K3MKYj1iPj4+MQppZihiPT09
-MClicmVhawp0Kz10fXJldHVybiBzfSwKWFU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKGM8MHx8Yz5h
-Lmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKdD1hLmluZGV4T2Yo
-YixjKQpyZXR1cm4gdH0sCk9ZOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWFUoYSxiLDApfSwKUGs6
-ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMKaWYoYz09bnVsbCljPWEubGVuZ3RoCmVsc2UgaWYoYzwwfHxj
-PmEubGVuZ3RoKXRocm93IEguYihQLlRFKGMsMCxhLmxlbmd0aCxudWxsLG51bGwpKQp0PWIubGVuZ3Ro
-CnM9YS5sZW5ndGgKaWYoYyt0PnMpYz1zLXQKcmV0dXJuIGEubGFzdEluZGV4T2YoYixjKX0sCmNuOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUGsoYSxiLG51bGwpfSwKSXM6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0PWEubGVuZ3RoCmlmKGM+dCl0aHJvdyBILmIoUC5URShjLDAsdCxudWxsLG51bGwpKQpyZXR1cm4g
-SC5tMihhLGIsYyl9LAp0ZzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLklzKGEsYiwwKX0sCnc6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIGF9LApnaTpmdW5jdGlvbihhKXt2YXIgdCxzLHIKZm9yKHQ9YS5sZW5ndGgs
-cz0wLHI9MDtyPHQ7KytyKXtzPTUzNjg3MDkxMSZzK2EuY2hhckNvZGVBdChyKQpzPTUzNjg3MDkxMSZz
-KygoNTI0Mjg3JnMpPDwxMCkKc149cz4+Nn1zPTUzNjg3MDkxMSZzKygoNjcxMDg4NjMmcyk8PDMpCnNe
-PXM+PjExCnJldHVybiA1MzY4NzA5MTEmcysoKDE2MzgzJnMpPDwxNSl9LApnaDpmdW5jdGlvbihhKXty
-ZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj1hLmxlbmd0aHx8ITEp
-dGhyb3cgSC5iKEguSFkoYSxiKSkKcmV0dXJuIGFbYl19LAokaXZYOjEsCiRpcVU6MX0KSC5xai5wcm90
-b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxi
-KXtyZXR1cm4gQy54Qi5PMih0aGlzLmEsSC5TYyhiKSl9fQpILmJRLnByb3RvdHlwZT17fQpILmFMLnBy
-b3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXt2YXIgdD10aGlzCnJldHVybiBuZXcgSC5hNyh0LHQuZ2go
-dCksSC5MaCh0KS5DKCJhNzxhTC5FPiIpKX0sCnpWOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHE9dGhp
-cyxwPXEuZ2gocSkKaWYoYi5sZW5ndGghPT0wKXtpZihwPT09MClyZXR1cm4iIgp0PUguZChxLlcoMCww
-KSkKaWYocCE9PXEuZ2gocSkpdGhyb3cgSC5iKFAuYTQocSkpCmZvcihzPXQscj0xO3I8cDsrK3Ipe3M9
-cytiK0guZChxLlcoMCxyKSkKaWYocCE9PXEuZ2gocSkpdGhyb3cgSC5iKFAuYTQocSkpfXJldHVybiBz
-LmNoYXJDb2RlQXQoMCk9PTA/czpzfWVsc2V7Zm9yKHI9MCxzPSIiO3I8cDsrK3Ipe3MrPUguZChxLlco
-MCxyKSkKaWYocCE9PXEuZ2gocSkpdGhyb3cgSC5iKFAuYTQocSkpfXJldHVybiBzLmNoYXJDb2RlQXQo
-MCk9PTA/czpzfX0sCmV2OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuR0coMCxILkxoKHRoaXMpLkMo
-ImEyKGFMLkUpIikuYihiKSl9LApFMjpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQpyZXR1
-cm4gbmV3IEguQTgodGhpcyx0LksoYykuQygiMShhTC5FKSIpLmIoYiksdC5DKCJAPGFMLkU+IikuSyhj
-KS5DKCJBODwxLDI+IikpfX0KSC5uSC5wcm90b3R5cGU9ewpnVUQ6ZnVuY3Rpb24oKXt2YXIgdD1KLkht
-KHRoaXMuYSkscz10aGlzLmMKaWYocz09bnVsbHx8cz50KXJldHVybiB0CnJldHVybiBzfSwKZ0FzOmZ1
-bmN0aW9uKCl7dmFyIHQ9Si5IbSh0aGlzLmEpLHM9dGhpcy5iCmlmKHM+dClyZXR1cm4gdApyZXR1cm4g
-c30sCmdoOmZ1bmN0aW9uKGEpe3ZhciB0LHM9Si5IbSh0aGlzLmEpLHI9dGhpcy5iCmlmKHI+PXMpcmV0
-dXJuIDAKdD10aGlzLmMKaWYodD09bnVsbHx8dD49cylyZXR1cm4gcy1yCmlmKHR5cGVvZiB0IT09Im51
-bWJlciIpcmV0dXJuIHQuSE4oKQpyZXR1cm4gdC1yfSwKVzpmdW5jdGlvbihhLGIpe3ZhciB0LHM9dGhp
-cyxyPXMuZ0FzKCkrYgppZihiPj0wKXt0PXMuZ1VEKCkKaWYodHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1
-cm4gSC5wWSh0KQp0PXI+PXR9ZWxzZSB0PSEwCmlmKHQpdGhyb3cgSC5iKFAuQ2YoYixzLCJpbmRleCIs
-bnVsbCxudWxsKSkKcmV0dXJuIEouR0Eocy5hLHIpfX0KSC5hNy5wcm90b3R5cGU9ewpnUjpmdW5jdGlv
-bihhKXtyZXR1cm4gdGhpcy5kfSwKbTpmdW5jdGlvbigpe3ZhciB0LHM9dGhpcyxyPXMuYSxxPUouVTYo
-cikscD1xLmdoKHIpCmlmKHMuYiE9PXApdGhyb3cgSC5iKFAuYTQocikpCnQ9cy5jCmlmKHQ+PXApe3Mu
-c0kobnVsbCkKcmV0dXJuITF9cy5zSShxLlcocix0KSk7KytzLmMKcmV0dXJuITB9LApzSTpmdW5jdGlv
-bihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlBbjoxfQpILmkxLnByb3RvdHlwZT17Cmdrejpm
-dW5jdGlvbihhKXt2YXIgdD1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5NSChKLklUKHRoaXMuYSksdGhp
-cy5iLHQuQygiQDwxPiIpLksodC5jaFsxXSkuQygiTUg8MSwyPiIpKX0sCmdoOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBKLkhtKHRoaXMuYSl9fQpILnh5LnByb3RvdHlwZT17JGliUToxfQpILk1ILnByb3RvdHlwZT17
-Cm06ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5iCmlmKHMubSgpKXt0LnNJKHQuYy4kMShzLmdSKHMp
-KSkKcmV0dXJuITB9dC5zSShudWxsKQpyZXR1cm4hMX0sCmdSOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz
-LmF9LApzSTpmdW5jdGlvbihhKXt0aGlzLmE9dGhpcy4kdGkuY2hbMV0uYihhKX19CkguQTgucHJvdG90
-eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSG0odGhpcy5hKX0sClc6ZnVuY3Rpb24oYSxiKXty
-ZXR1cm4gdGhpcy5iLiQxKEouR0EodGhpcy5hLGIpKX19CkguVTUucHJvdG90eXBlPXsKZ2t6OmZ1bmN0
-aW9uKGEpe3JldHVybiBuZXcgSC5TTyhKLklUKHRoaXMuYSksdGhpcy5iLHRoaXMuJHRpLkMoIlNPPDE+
-IikpfX0KSC5TTy5wcm90b3R5cGU9ewptOmZ1bmN0aW9uKCl7dmFyIHQscwpmb3IodD10aGlzLmEscz10
-aGlzLmI7dC5tKCk7KWlmKEgub1Qocy4kMSh0LmdSKHQpKSkpcmV0dXJuITAKcmV0dXJuITF9LApnUjpm
-dW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQuZ1IodCl9fQpILlNVLnByb3RvdHlwZT17fQpI
-LlJlLnByb3RvdHlwZT17Clk6ZnVuY3Rpb24oYSxiLGMpe0guU2MoYikKSC5MaCh0aGlzKS5DKCJSZS5F
-IikuYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIp
-KX19CkguWEMucHJvdG90eXBlPXt9Ckgud3YucHJvdG90eXBlPXsKZ2k6ZnVuY3Rpb24oYSl7dmFyIHQ9
-dGhpcy5faGFzaENvZGUKaWYodCE9bnVsbClyZXR1cm4gdAp0PTUzNjg3MDkxMSY2NjQ1OTcqSi5oZih0
-aGlzLmEpCnRoaXMuX2hhc2hDb2RlPXQKcmV0dXJuIHR9LAp3OmZ1bmN0aW9uKGEpe3JldHVybidTeW1i
-b2woIicrSC5kKHRoaXMuYSkrJyIpJ30sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4h
-MQpyZXR1cm4gYiBpbnN0YW5jZW9mIEgud3YmJnRoaXMuYT09Yi5hfSwKJGlHRDoxfQpILlBELnByb3Rv
-dHlwZT17fQpILldVLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAubk8odGhpcyl9LApZ
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILkxoKHRoaXMpCnQuZC5iKGIpCnQuY2hbMV0uYihjKQpyZXR1
-cm4gSC5kYygpfSwKZ1B1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnE0KGEsSC5MaCh0aGlzKS5DKCJO
-MzwxLDI+IikpfSwKcTQ6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzCnJldHVybiBQLmwwKGZ1bmN0aW9u
-KCl7dmFyIHM9YQp2YXIgcj0wLHE9MSxwLG8sbixtCnJldHVybiBmdW5jdGlvbiAkYXN5bmMkZ1B1KGMs
-ZCl7aWYoYz09PTEpe3A9ZApyPXF9d2hpbGUodHJ1ZSlzd2l0Y2gocil7Y2FzZSAwOm89dC5ndih0KSxv
-PW8uZ2t6KG8pLG49SC5MaCh0KSxuPW4uQygiQDwxPiIpLksobi5jaFsxXSkuQygiTjM8MSwyPiIpCmNh
-c2UgMjppZighby5tKCkpe3I9MwpicmVha31tPW8uZ1IobykKcj00CnJldHVybiBuZXcgUC5OMyhtLHQu
-cSgwLG0pLG4pCmNhc2UgNDpyPTIKYnJlYWsKY2FzZSAzOnJldHVybiBQLlRoKCkKY2FzZSAxOnJldHVy
-biBQLlltKHApfX19LGIpfSwKJGlaMDoxfQpILkxQLnByb3RvdHlwZT17CmdoOmZ1bmN0aW9uKGEpe3Jl
-dHVybiB0aGlzLmF9LAp4NDpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4h
-MQppZigiX19wcm90b19fIj09PWIpcmV0dXJuITEKcmV0dXJuIHRoaXMuYi5oYXNPd25Qcm9wZXJ0eShi
-KX0sCnE6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy54NCgwLGIpKXJldHVybiBudWxsCnJldHVybiB0aGlz
-LkQoYil9LApEOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJbSC55KGEpXX0sClU6ZnVuY3Rpb24oYSxi
-KXt2YXIgdCxzLHIscSxwPUguTGgodGhpcykKcC5DKCJ+KDEsMikiKS5iKGIpCnQ9dGhpcy5jCmZvcihz
-PXQubGVuZ3RoLHA9cC5jaFsxXSxyPTA7cjxzOysrcil7cT10W3JdCmIuJDIocSxwLmIodGhpcy5EKHEp
-KSl9fSwKZ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlhSKHRoaXMsSC5MaCh0aGlzKS5DKCJYUjwx
-PiIpKX19CkguWFIucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYS5jCnJldHVy
-biBuZXcgSi5tMSh0LHQubGVuZ3RoLEgudDYodCkuQygibTE8MT4iKSl9LApnaDpmdW5jdGlvbihhKXty
-ZXR1cm4gdGhpcy5hLmMubGVuZ3RofX0KSC5MSS5wcm90b3R5cGU9ewpnV2E6ZnVuY3Rpb24oKXt2YXIg
-dD10aGlzLmEKcmV0dXJuIHR9LApnbmQ6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwPXRoaXMKaWYocC5j
-PT09MSlyZXR1cm4gQy5kbgp0PXAuZApzPXQubGVuZ3RoLXAuZS5sZW5ndGgtcC5mCmlmKHM9PT0wKXJl
-dHVybiBDLmRuCnI9W10KZm9yKHE9MDtxPHM7KytxKXtpZihxPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0
-LHEpCnIucHVzaCh0W3FdKX1yZXR1cm4gSi56QyhyKX0sCmdWbTpmdW5jdGlvbigpe3ZhciB0LHMscixx
-LHAsbyxuLG0sbD10aGlzCmlmKGwuYyE9PTApcmV0dXJuIEMuRHgKdD1sLmUKcz10Lmxlbmd0aApyPWwu
-ZApxPXIubGVuZ3RoLXMtbC5mCmlmKHM9PT0wKXJldHVybiBDLkR4CnA9bmV3IEguTjUodS5lbykKZm9y
-KG89MDtvPHM7KytvKXtpZihvPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LG8pCm49dFtvXQptPXErbwpp
-ZihtPDB8fG0+PXIubGVuZ3RoKXJldHVybiBILk9IKHIsbSkKcC5ZKDAsbmV3IEgud3YobiksclttXSl9
-cmV0dXJuIG5ldyBILlBEKHAsdS5nRil9LAokaXZROjF9CkguQ2oucHJvdG90eXBlPXsKJDI6ZnVuY3Rp
-b24oYSxiKXt2YXIgdApILnkoYSkKdD10aGlzLmEKdC5iPXQuYisiJCIrSC5kKGEpCkMuTm0uQSh0aGlz
-LmIsYSkKQy5ObS5BKHRoaXMuYyxiKTsrK3QuYX0sCiRTOjEzfQpILmY5LnByb3RvdHlwZT17CnFTOmZ1
-bmN0aW9uKGEpe3ZhciB0LHMscj10aGlzLHE9bmV3IFJlZ0V4cChyLmEpLmV4ZWMoYSkKaWYocT09bnVs
-bClyZXR1cm4gbnVsbAp0PU9iamVjdC5jcmVhdGUobnVsbCkKcz1yLmIKaWYocyE9PS0xKXQuYXJndW1l
-bnRzPXFbcysxXQpzPXIuYwppZihzIT09LTEpdC5hcmd1bWVudHNFeHByPXFbcysxXQpzPXIuZAppZihz
-IT09LTEpdC5leHByPXFbcysxXQpzPXIuZQppZihzIT09LTEpdC5tZXRob2Q9cVtzKzFdCnM9ci5mCmlm
-KHMhPT0tMSl0LnJlY2VpdmVyPXFbcysxXQpyZXR1cm4gdH19CkguVzAucHJvdG90eXBlPXsKdzpmdW5j
-dGlvbihhKXt2YXIgdD10aGlzLmIKaWYodD09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIr
-SC5kKHRoaXMuYSkKcmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIit0
-KyInIG9uIG51bGwifX0KSC5hei5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcyxy
-PSJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9kIG5vdCBmb3VuZDogJyIscT1zLmIKaWYocT09bnVsbCly
-ZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIrSC5kKHMuYSkKdD1zLmMKaWYodD09bnVsbClyZXR1cm4g
-citxKyInICgiK0guZChzLmEpKyIpIgpyZXR1cm4gcitxKyInIG9uICciK3QrIicgKCIrSC5kKHMuYSkr
-IikifX0KSC52Vi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdC5s
-ZW5ndGg9PT0wPyJFcnJvciI6IkVycm9yOiAiK3R9fQpILmJxLnByb3RvdHlwZT17fQpILkFtLnByb3Rv
-dHlwZT17CiQxOmZ1bmN0aW9uKGEpe2lmKHUuYlUuYyhhKSlpZihhLiR0aHJvd25Kc0Vycm9yPT1udWxs
-KWEuJHRocm93bkpzRXJyb3I9dGhpcy5hCnJldHVybiBhfSwKJFM6NH0KSC5YTy5wcm90b3R5cGU9ewp3
-OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5iCmlmKHMhPW51bGwpcmV0dXJuIHMKcz10aGlzLmEKdD1z
-IT09bnVsbCYmdHlwZW9mIHM9PT0ib2JqZWN0Ij9zLnN0YWNrOm51bGwKcmV0dXJuIHRoaXMuYj10PT1u
-dWxsPyIiOnR9LAokaUd6OjF9CkguVHAucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlz
-LmNvbnN0cnVjdG9yLHM9dD09bnVsbD9udWxsOnQubmFtZQpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHM9
-PW51bGw/InVua25vd24iOnMpKyInIn0sCiRpRUg6MSwKZ1FsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9
-LAokQzoiJDEiLAokUjoxLAokRDpudWxsfQpILmxjLnByb3RvdHlwZT17fQpILnp4LnByb3RvdHlwZT17
-Cnc6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy4kc3RhdGljX25hbWUKaWYodD09bnVsbClyZXR1cm4iQ2xv
-c3VyZSBvZiB1bmtub3duIHN0YXRpYyBtZXRob2QiCnJldHVybiJDbG9zdXJlICciK0guTlEodCkrIici
-fX0KSC5yVC5wcm90b3R5cGU9ewpETjpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMKaWYoYj09bnVsbCly
-ZXR1cm4hMQppZih0PT09YilyZXR1cm4hMAppZighKGIgaW5zdGFuY2VvZiBILnJUKSlyZXR1cm4hMQpy
-ZXR1cm4gdC5hPT09Yi5hJiZ0LmI9PT1iLmImJnQuYz09PWIuY30sCmdpOmZ1bmN0aW9uKGEpe3ZhciB0
-LHM9dGhpcy5jCmlmKHM9PW51bGwpdD1ILmVRKHRoaXMuYSkKZWxzZSB0PXR5cGVvZiBzIT09Im9iamVj
-dCI/Si5oZihzKTpILmVRKHMpCnJldHVybih0XkguZVEodGhpcy5iKSk+Pj4wfSwKdzpmdW5jdGlvbihh
-KXt2YXIgdD10aGlzLmMKaWYodD09bnVsbCl0PXRoaXMuYQpyZXR1cm4iQ2xvc3VyZSAnIitILmQodGhp
-cy5kKSsiJyBvZiAiKygiSW5zdGFuY2Ugb2YgJyIrSC5kKEguTSh0KSkrIiciKX19CkguRXEucHJvdG90
-eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUnVudGltZUVycm9yOiAiK0guZCh0aGlzLmEpfX0KSC5r
-WS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJBc3NlcnRpb24gZmFpbGVkOiAiK1AucCh0
-aGlzLmEpfX0KSC5ONS5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKZ3Y6
-ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmk1KHRoaXMsSC5MaCh0aGlzKS5DKCJpNTwxPiIpKX0sCng0
-OmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZih0eXBlb2YgYj09InN0cmluZyIpe3Q9dGhpcy5iCmlmKHQ9
-PW51bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMuWHUodCxiKX1lbHNle3M9dGhpcy5DWChiKQpyZXR1cm4g
-c319LApDWDpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmQKaWYodD09bnVsbClyZXR1cm4hMQpyZXR1cm4g
-dGhpcy5GKHRoaXMuSCh0LEouaGYoYSkmMHgzZmZmZmZmKSxhKT49MH0sCnE6ZnVuY3Rpb24oYSxiKXt2
-YXIgdCxzLHIscSxwPXRoaXMsbz1udWxsCmlmKHR5cGVvZiBiPT0ic3RyaW5nIil7dD1wLmIKaWYodD09
-bnVsbClyZXR1cm4gbwpzPXAuaih0LGIpCnI9cz09bnVsbD9vOnMuYgpyZXR1cm4gcn1lbHNlIGlmKHR5
-cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3E9cC5jCmlmKHE9PW51bGwpcmV0dXJu
-IG8Kcz1wLmoocSxiKQpyPXM9PW51bGw/bzpzLmIKcmV0dXJuIHJ9ZWxzZSByZXR1cm4gcC5rKGIpfSwK
-azpmdW5jdGlvbihhKXt2YXIgdCxzLHI9dGhpcy5kCmlmKHI9PW51bGwpcmV0dXJuIG51bGwKdD10aGlz
-LkgocixKLmhmKGEpJjB4M2ZmZmZmZikKcz10aGlzLkYodCxhKQppZihzPDApcmV0dXJuIG51bGwKcmV0
-dXJuIHRbc10uYn0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuPXRoaXMsbT1ILkxo
-KG4pCm0uZC5iKGIpCm0uY2hbMV0uYihjKQppZih0eXBlb2YgYj09InN0cmluZyIpe3Q9bi5iCm4uRyh0
-PT1udWxsP24uYj1uLmwoKTp0LGIsYyl9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2Zm
-ZmZmZik9PT1iKXtzPW4uYwpuLkcocz09bnVsbD9uLmM9bi5sKCk6cyxiLGMpfWVsc2V7cj1uLmQKaWYo
-cj09bnVsbClyPW4uZD1uLmwoKQpxPUouaGYoYikmMHgzZmZmZmZmCnA9bi5IKHIscSkKaWYocD09bnVs
-bCluLkUocixxLFtuLk8oYixjKV0pCmVsc2V7bz1uLkYocCxiKQppZihvPj0wKXBbb10uYj1jCmVsc2Ug
-cC5wdXNoKG4uTyhiLGMpKX19fSwKVTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj10aGlzCkguTGgociku
-QygifigxLDIpIikuYihiKQp0PXIuZQpzPXIucgpmb3IoO3QhPW51bGw7KXtiLiQyKHQuYSx0LmIpCmlm
-KHMhPT1yLnIpdGhyb3cgSC5iKFAuYTQocikpCnQ9dC5jfX0sCkc6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
-LHM9dGhpcyxyPUguTGgocykKci5kLmIoYikKci5jaFsxXS5iKGMpCnQ9cy5qKGEsYikKaWYodD09bnVs
-bClzLkUoYSxiLHMuTyhiLGMpKQplbHNlIHQuYj1jfSwKWDpmdW5jdGlvbigpe3RoaXMucj10aGlzLnIr
-MSY2NzEwODg2M30sCk86ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMscj1ILkxoKHMpLHE9bmV3IEgu
-dmgoci5kLmIoYSksci5jaFsxXS5iKGIpKQppZihzLmU9PW51bGwpcy5lPXMuZj1xCmVsc2V7dD1zLmYK
-cS5kPXQKcy5mPXQuYz1xfSsrcy5hCnMuWCgpCnJldHVybiBxfSwKRjpmdW5jdGlvbihhLGIpe3ZhciB0
-LHMKaWYoYT09bnVsbClyZXR1cm4tMQp0PWEubGVuZ3RoCmZvcihzPTA7czx0OysrcylpZihKLlJNKGFb
-c10uYSxiKSlyZXR1cm4gcwpyZXR1cm4tMX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAubk8odGhpcyl9
-LApqOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbYl19LApIOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbYl19
-LApFOmZ1bmN0aW9uKGEsYixjKXthW2JdPWN9LApWOmZ1bmN0aW9uKGEsYil7ZGVsZXRlIGFbYl19LApY
-dTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmooYSxiKSE9bnVsbH0sCmw6ZnVuY3Rpb24oKXt2YXIg
-dD0iPG5vbi1pZGVudGlmaWVyLWtleT4iLHM9T2JqZWN0LmNyZWF0ZShudWxsKQp0aGlzLkUocyx0LHMp
-CnRoaXMuVihzLHQpCnJldHVybiBzfSwKJGlGbzoxfQpILnZoLnByb3RvdHlwZT17fQpILmk1LnByb3Rv
-dHlwZT17CmdoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuYX0sCmdrejpmdW5jdGlvbihhKXt2YXIg
-dD10aGlzLmEscz1uZXcgSC5ONih0LHQucix0aGlzLiR0aS5DKCJONjwxPiIpKQpzLmM9dC5lCnJldHVy
-biBzfX0KSC5ONi5wcm90b3R5cGU9ewpnUjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kfSwKbTpmdW5j
-dGlvbigpe3ZhciB0PXRoaXMscz10LmEKaWYodC5iIT09cy5yKXRocm93IEguYihQLmE0KHMpKQplbHNl
-e3M9dC5jCmlmKHM9PW51bGwpe3Quc04obnVsbCkKcmV0dXJuITF9ZWxzZXt0LnNOKHMuYSkKdC5jPXQu
-Yy5jCnJldHVybiEwfX19LApzTjpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlB
-bjoxfQpILmRDLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoYSl9LAokUzo0
-fQpILndOLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYShhLGIpfSwKJFM6
-NDV9CkguVlgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYShILnkoYSkpfSwK
-JFM6Mjh9CkguVlIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5h
-KyIvIit0aGlzLmIuZmxhZ3N9LApnSGM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5jCmlmKHMhPW51
-bGwpcmV0dXJuIHMKcz10LmIKcmV0dXJuIHQuYz1ILnY0KHQuYSxzLm11bHRpbGluZSwhcy5pZ25vcmVD
-YXNlLHMudW5pY29kZSxzLmRvdEFsbCwhMCl9LApkZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5L
-Vyh0aGlzLGIsMCl9LApVWjpmdW5jdGlvbihhLGIpe3ZhciB0LHM9dGhpcy5nSGMoKQpzLmxhc3RJbmRl
-eD1iCnQ9cy5leGVjKGEpCmlmKHQ9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIG5ldyBILkVLKHQpfSwK
-JGl2WDoxLAokaXdMOjF9CkguRUsucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3ZhciB0CkguU2Mo
-YikKdD10aGlzLmIKaWYoYj49dC5sZW5ndGgpcmV0dXJuIEguT0godCxiKQpyZXR1cm4gdFtiXX0sCiRp
-T2Q6MSwKJGlpYjoxfQpILktXLnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEgu
-UGIodGhpcy5hLHRoaXMuYix0aGlzLmMpfX0KSC5QYi5wcm90b3R5cGU9ewpnUjpmdW5jdGlvbihhKXty
-ZXR1cm4gdGhpcy5kfSwKbTpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcyxvPXAuYgppZihvPT1u
-dWxsKXJldHVybiExCnQ9cC5jCmlmKHQ8PW8ubGVuZ3RoKXtzPXAuYQpyPXMuVVoobyx0KQppZihyIT1u
-dWxsKXtwLmQ9cgpvPXIuYgp0PW8uaW5kZXgKcT10K29bMF0ubGVuZ3RoCmlmKHQ9PT1xKXtpZihzLmIu
-dW5pY29kZSl7bz1wLmMKdD1vKzEKcz1wLmIKaWYodDxzLmxlbmd0aCl7bz1KLnJZKHMpLk8yKHMsbykK
-aWYobz49NTUyOTYmJm88PTU2MzE5KXtvPUMueEIuTzIocyx0KQpvPW8+PTU2MzIwJiZvPD01NzM0M31l
-bHNlIG89ITF9ZWxzZSBvPSExfWVsc2Ugbz0hMQpxPShvP3ErMTpxKSsxfXAuYz1xCnJldHVybiEwfX1w
-LmI9cC5kPW51bGwKcmV0dXJuITF9LAokaUFuOjF9CkgudFEucHJvdG90eXBlPXsKcTpmdW5jdGlvbihh
-LGIpe0guU2MoYikKaWYoYiE9PTApSC5WaihQLngoYixudWxsKSkKcmV0dXJuIHRoaXMuY30sCiRpT2Q6
-MX0KSC51bi5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlNkKHRoaXMuYSx0
-aGlzLmIsdGhpcy5jKX19CkguU2QucHJvdG90eXBlPXsKbTpmdW5jdGlvbigpe3ZhciB0LHMscj10aGlz
-LHE9ci5jLHA9ci5iLG89cC5sZW5ndGgsbj1yLmEsbT1uLmxlbmd0aAppZihxK28+bSl7ci5kPW51bGwK
-cmV0dXJuITF9dD1uLmluZGV4T2YocCxxKQppZih0PDApe3IuYz1tKzEKci5kPW51bGwKcmV0dXJuITF9
-cz10K28Kci5kPW5ldyBILnRRKHQscCkKci5jPXM9PT1yLmM/cysxOnMKcmV0dXJuITB9LApnUjpmdW5j
-dGlvbihhKXtyZXR1cm4gdGhpcy5kfSwKJGlBbjoxfQpILldaLnByb3RvdHlwZT17JGlXWjoxfQpILkVU
-LnByb3RvdHlwZT17JGlFVDoxLCRpQVM6MX0KSC5kZi5wcm90b3R5cGU9eyRpV3k6MX0KSC5iMC5wcm90
-b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LAokaVhqOjF9CkguRGcucHJvdG90
-eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2Jd
-fSwKWTpmdW5jdGlvbihhLGIsYyl7SC5TYyhiKQpILklnKGMpCkgub2QoYixhLGEubGVuZ3RoKQphW2Jd
-PWN9LAokaWJROjEsCiRpY1g6MSwKJGl6TToxfQpILlBnLnByb3RvdHlwZT17Clk6ZnVuY3Rpb24oYSxi
-LGMpe0guU2MoYikKSC5TYyhjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGliUToxLAokaWNY
-OjEsCiRpek06MX0KSC54ai5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQpILm9kKGIs
-YSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILmRFLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtI
-LlNjKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguWkEucHJvdG90eXBlPXsKcTpm
-dW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC53Zi5w
-cm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJu
-IGFbYl19fQpILlBxLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCkgub2QoYixhLGEu
-bGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZUUucHJvdG90eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJu
-IGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVy
-biBhW2JdfX0KSC5WNi5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApx
-OmZ1bmN0aW9uKGEsYil7SC5TYyhiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LAokaVY2
-OjEsCiRpbjY6MX0KSC5SRy5wcm90b3R5cGU9e30KSC5WUC5wcm90b3R5cGU9e30KSC5XQi5wcm90b3R5
-cGU9e30KSC5aRy5wcm90b3R5cGU9e30KSC5KYy5wcm90b3R5cGU9ewpDOmZ1bmN0aW9uKGEpe3JldHVy
-biBILmNFKHYudHlwZVVuaXZlcnNlLHRoaXMsYSl9LApLOmZ1bmN0aW9uKGEpe3JldHVybiBILnY1KHYu
-dHlwZVVuaXZlcnNlLHRoaXMsYSl9fQpILkcucHJvdG90eXBlPXt9CkgudTkucHJvdG90eXBlPXsKdzpm
-dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfX0KSC5oei5wcm90b3R5cGU9e30KSC5pTS5wcm90b3R5cGU9
-e30KUC50aC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEscz10LmEKdC5hPW51
-bGwKcy4kMCgpfSwKJFM6MTh9ClAuaGEucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscwp0
-aGlzLmEuYT11Lk0uYihhKQp0PXRoaXMuYgpzPXRoaXMuYwp0LmZpcnN0Q2hpbGQ/dC5yZW1vdmVDaGls
-ZChzKTp0LmFwcGVuZENoaWxkKHMpfSwKJFM6Mzl9ClAuVnMucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24o
-KXt0aGlzLmEuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjB9ClAuRnQucHJvdG90eXBlPXsKJDA6ZnVu
-Y3Rpb24oKXt0aGlzLmEuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjB9ClAuVzMucHJvdG90eXBlPXsK
-Q1k6ZnVuY3Rpb24oYSxiKXtpZihzZWxmLnNldFRpbWVvdXQhPW51bGwpc2VsZi5zZXRUaW1lb3V0KEgu
-dFIobmV3IFAueUgodGhpcyxiKSwwKSxhKQplbHNlIHRocm93IEguYihQLkw0KCJgc2V0VGltZW91dCgp
-YCBub3QgZm91bmQuIikpfX0KUC55SC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYi4kMCgp
-fSwKJEM6IiQwIiwKJFI6MCwKJFM6Mn0KUC5paC5wcm90b3R5cGU9ewphTTpmdW5jdGlvbihhLGIpe3Zh
-ciB0LHMscj10aGlzLiR0aQpyLkMoIjEvIikuYihiKQp0PSF0aGlzLmJ8fHIuQygiYjg8MT4iKS5jKGIp
-CnM9dGhpcy5hCmlmKHQpcy5YZihiKQplbHNlIHMuWDIoci5kLmIoYikpfSwKdzA6ZnVuY3Rpb24oYSxi
-KXt2YXIgdD10aGlzLmEKaWYodGhpcy5iKXQuWkwoYSxiKQplbHNlIHQuTmsoYSxiKX19ClAuV00ucHJv
-dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS4kMigwLGEpfSwKJFM6MTB9ClAuU1gu
-cHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuJDIoMSxuZXcgSC5icShhLHUubC5iKGIp
-KSl9LAokQzoiJDIiLAokUjoyLAokUzo0MH0KUC5Hcy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIp
-e3RoaXMuYShILlNjKGEpLGIpfSwKJFM6NDN9ClAuRnkucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXty
-ZXR1cm4iSXRlcmF0aW9uTWFya2VyKCIrdGhpcy5iKyIsICIrSC5kKHRoaXMuYSkrIikifSwKZ253OmZ1
-bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9fQpQLkdWLnByb3RvdHlwZT17CmdSOmZ1bmN0aW9uKGEpe3Zh
-ciB0PXRoaXMuYwppZih0PT1udWxsKXJldHVybiB0aGlzLmIKcmV0dXJuIHRoaXMuJHRpLmQuYih0LmdS
-KHQpKX0sCm06ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwPXRoaXMKZm9yKDshMDspe3Q9cC5jCmlmKHQh
-PW51bGwpaWYodC5tKCkpcmV0dXJuITAKZWxzZSBwLmM9bnVsbApzPWZ1bmN0aW9uKGEsYixjKXt2YXIg
-byxuPWIKd2hpbGUodHJ1ZSl0cnl7cmV0dXJuIGEobixvKX1jYXRjaChtKXtvPW0Kbj1jfX0ocC5hLDAs
-MSkKaWYocyBpbnN0YW5jZW9mIFAuRnkpe3I9cy5iCmlmKHI9PT0yKXt0PXAuZAppZih0PT1udWxsfHx0
-Lmxlbmd0aD09PTApe3Auc0VDKG51bGwpCnJldHVybiExfWlmKDA+PXQubGVuZ3RoKXJldHVybiBILk9I
-KHQsLTEpCnAuYT10LnBvcCgpCmNvbnRpbnVlfWVsc2V7dD1zLmEKaWYocj09PTMpdGhyb3cgdAplbHNl
-e3E9Si5JVCh0KQppZihxIGluc3RhbmNlb2YgUC5HVil7dD1wLmQKaWYodD09bnVsbCl0PXAuZD1bXQpD
-Lk5tLkEodCxwLmEpCnAuYT1xLmEKY29udGludWV9ZWxzZXtwLmM9cQpjb250aW51ZX19fX1lbHNle3Au
-c0VDKHMpCnJldHVybiEwfX1yZXR1cm4hMX0sCnNFQzpmdW5jdGlvbihhKXt0aGlzLmI9dGhpcy4kdGku
-ZC5iKGEpfSwKJGlBbjoxfQpQLnE0LnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3
-IFAuR1YodGhpcy5hKCksdGhpcy4kdGkuQygiR1Y8MT4iKSl9fQpQLmI4LnByb3RvdHlwZT17fQpQLlBm
-LnByb3RvdHlwZT17CncwOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYT09bnVsbClhPW5ldyBQLm4oKQp0
-PXRoaXMuYQppZih0LmEhPT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQi
-KSkKdC5OayhhLGIpfSwKcG06ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudzAoYSxudWxsKX19ClAuWmYu
-cHJvdG90eXBlPXsKYU06ZnVuY3Rpb24oYSxiKXt2YXIgdAp0aGlzLiR0aS5DKCIxLyIpLmIoYikKdD10
-aGlzLmEKaWYodC5hIT09MCl0aHJvdyBILmIoUC5QVigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikp
-CnQuWGYoYil9fQpQLkZlLnByb3RvdHlwZT17CkhSOmZ1bmN0aW9uKGEpe2lmKCh0aGlzLmMmMTUpIT09
-NilyZXR1cm4hMApyZXR1cm4gdGhpcy5iLmIuYnYodS5hbC5iKHRoaXMuZCksYS5hLHUuY0osdS5LKX0s
-Ckt3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuZSxzPXUueixyPXUuSyxxPXRoaXMuJHRpLkMoIjIvIiks
-cD10aGlzLmIuYgppZih1LmFnLmModCkpcmV0dXJuIHEuYihwLnJwKHQsYS5hLGEuYixzLHIsdS5sKSkK
-ZWxzZSByZXR1cm4gcS5iKHAuYnYodS55LmIodCksYS5hLHMscikpfX0KUC52cy5wcm90b3R5cGU9ewpT
-cTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9dGhpcy4kdGkKcS5LKGMpLkMoIjEvKDIpIikuYihh
-KQp0PSQuWDMKaWYodCE9PUMuTlUpe2MuQygiQDwwLz4iKS5LKHEuZCkuQygiMSgyKSIpLmIoYSkKaWYo
-YiE9bnVsbCliPVAuVkgoYix0KX1zPW5ldyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQpyPWI9PW51bGw/
-MTozCnRoaXMueGYobmV3IFAuRmUocyxyLGEsYixxLkMoIkA8MT4iKS5LKGMpLkMoIkZlPDEsMj4iKSkp
-CnJldHVybiBzfSwKVzc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5TcShhLG51bGwsYil9LApRZDpm
-dW5jdGlvbihhLGIsYyl7dmFyIHQscz10aGlzLiR0aQpzLksoYykuQygiMS8oMikiKS5iKGEpCnQ9bmV3
-IFAudnMoJC5YMyxjLkMoInZzPDA+IikpCnRoaXMueGYobmV3IFAuRmUodCwoYj09bnVsbD8xOjMpfDE2
-LGEsYixzLkMoIkA8MT4iKS5LKGMpLkMoIkZlPDEsMj4iKSkpCnJldHVybiB0fSwKT0E6ZnVuY3Rpb24o
-YSl7dmFyIHQscyxyCnUuYmYuYihudWxsKQp0PXRoaXMuJHRpCnM9JC5YMwpyPW5ldyBQLnZzKHMsdCkK
-aWYocyE9PUMuTlUpYT1QLlZIKGEscykKdGhpcy54ZihuZXcgUC5GZShyLDIsbnVsbCxhLHQuQygiQDwx
-PiIpLksodC5kKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gcn0sCnhmOmZ1bmN0aW9uKGEpe3ZhciB0LHM9
-dGhpcyxyPXMuYQppZihyPD0xKXthLmE9dS54LmIocy5jKQpzLmM9YX1lbHNle2lmKHI9PT0yKXt0PXUu
-Xy5iKHMuYykKcj10LmEKaWYocjw0KXt0LnhmKGEpCnJldHVybn1zLmE9cgpzLmM9dC5jfVAuVGsobnVs
-bCxudWxsLHMuYix1Lk0uYihuZXcgUC5kYShzLGEpKSl9fSwKalE6ZnVuY3Rpb24oYSl7dmFyIHQscyxy
-LHEscCxvPXRoaXMsbj17fQpuLmE9YQppZihhPT1udWxsKXJldHVybgp0PW8uYQppZih0PD0xKXtzPXUu
-eC5iKG8uYykKcj1vLmM9YQppZihzIT1udWxsKXtmb3IoO3E9ci5hLHEhPW51bGw7cj1xKTtyLmE9c319
-ZWxzZXtpZih0PT09Mil7cD11Ll8uYihvLmMpCnQ9cC5hCmlmKHQ8NCl7cC5qUShhKQpyZXR1cm59by5h
-PXQKby5jPXAuY31uLmE9by5OOChhKQpQLlRrKG51bGwsbnVsbCxvLmIsdS5NLmIobmV3IFAub1Eobixv
-KSkpfX0sCmFoOmZ1bmN0aW9uKCl7dmFyIHQ9dS54LmIodGhpcy5jKQp0aGlzLmM9bnVsbApyZXR1cm4g
-dGhpcy5OOCh0KX0sCk44OmZ1bmN0aW9uKGEpe3ZhciB0LHMscgpmb3IodD1hLHM9bnVsbDt0IT1udWxs
-O3M9dCx0PXIpe3I9dC5hCnQuYT1zfXJldHVybiBzfSwKSEg6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlz
-LHI9cy4kdGkKci5DKCIxLyIpLmIoYSkKaWYoci5DKCJiODwxPiIpLmMoYSkpaWYoci5jKGEpKVAuQTko
-YSxzKQplbHNlIFAuazMoYSxzKQplbHNle3Q9cy5haCgpCnIuZC5iKGEpCnMuYT00CnMuYz1hClAuSFoo
-cyx0KX19LApYMjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMKcy4kdGkuZC5iKGEpCnQ9cy5haCgpCnMu
-YT00CnMuYz1hClAuSFoocyx0KX0sClpMOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzCnUubC5iKGIp
-CnQ9cy5haCgpCnMuYT04CnMuYz1uZXcgUC5DdyhhLGIpClAuSFoocyx0KX0sClhmOmZ1bmN0aW9uKGEp
-e3ZhciB0PXRoaXMscz10LiR0aQpzLkMoIjEvIikuYihhKQppZihzLkMoImI4PDE+IikuYyhhKSl7dC5j
-VShhKQpyZXR1cm59dC5hPTEKUC5UayhudWxsLG51bGwsdC5iLHUuTS5iKG5ldyBQLnJIKHQsYSkpKX0s
-CmNVOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMoImI4PDE+IikuYihhKQppZihzLmMo
-YSkpe2lmKGEuYT09PTgpe3QuYT0xClAuVGsobnVsbCxudWxsLHQuYix1Lk0uYihuZXcgUC5LRih0LGEp
-KSl9ZWxzZSBQLkE5KGEsdCkKcmV0dXJufVAuazMoYSx0KX0sCk5rOmZ1bmN0aW9uKGEsYil7dGhpcy5h
-PTEKUC5UayhudWxsLG51bGwsdGhpcy5iLHUuTS5iKG5ldyBQLlpMKHRoaXMsYSxiKSkpfSwKJGliODox
-fQpQLmRhLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5IWih0aGlzLmEsdGhpcy5iKX0sCiRTOjB9
-ClAub1EucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkhaKHRoaXMuYix0aGlzLmEuYSl9LAokUzow
-fQpQLnBWLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQp0LmE9MAp0LkhIKGEp
-fSwKJFM6MTh9ClAuVTcucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt1LmwuYihiKQp0aGlzLmEu
-WkwoYSxiKX0sCiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiQyKGEsbnVsbCl9LAokQzoiJDIiLAok
-RDpmdW5jdGlvbigpe3JldHVybltudWxsXX0sCiRTOjI2fQpQLnZyLnByb3RvdHlwZT17CiQwOmZ1bmN0
-aW9uKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KUC5ySC5wcm90b3R5cGU9ewokMDpm
-dW5jdGlvbigpe3ZhciB0PXRoaXMuYQp0LlgyKHQuJHRpLmQuYih0aGlzLmIpKX0sCiRTOjB9ClAuS0Yu
-cHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkE5KHRoaXMuYix0aGlzLmEpfSwKJFM6MH0KUC5aTC5w
-cm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS5aTCh0aGlzLmIsdGhpcy5jKX0sCiRTOjB9ClAu
-UlQucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbj10aGlzLG09bnVsbAp0
-cnl7cj1uLmMKbT1yLmIuYi56eih1LmZPLmIoci5kKSx1LnopfWNhdGNoKHEpe3Q9SC5SdShxKQpzPUgu
-dHMocSkKaWYobi5kKXtyPXUubi5iKG4uYS5hLmMpLmEKcD10CnA9cj09bnVsbD9wPT1udWxsOnI9PT1w
-CnI9cH1lbHNlIHI9ITEKcD1uLmIKaWYocilwLmI9dS5uLmIobi5hLmEuYykKZWxzZSBwLmI9bmV3IFAu
-Q3codCxzKQpwLmE9ITAKcmV0dXJufWlmKHUuYy5jKG0pKXtpZihtIGluc3RhbmNlb2YgUC52cyYmbS5h
-Pj00KXtpZihtLmE9PT04KXtyPW4uYgpyLmI9dS5uLmIobS5jKQpyLmE9ITB9cmV0dXJufW89bi5hLmEK
-cj1uLmIKci5iPW0uVzcobmV3IFAualoobyksdS56KQpyLmE9ITF9fSwKJFM6Mn0KUC5qWi5wcm90b3R5
-cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKJFM6MzB9ClAucnEucHJvdG90eXBlPXsK
-JDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMKdHJ5e3I9bS5iCnE9ci4kdGkKcD1x
-LmQKbz1wLmIobS5jKQptLmEuYj1yLmIuYi5idihxLkMoIjIvKDEpIikuYihyLmQpLG8scS5DKCIyLyIp
-LHApfWNhdGNoKG4pe3Q9SC5SdShuKQpzPUgudHMobikKcj1tLmEKci5iPW5ldyBQLkN3KHQscykKci5h
-PSEwfX0sCiRTOjJ9ClAuUlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8s
-bixtLGw9dGhpcwp0cnl7dD11Lm4uYihsLmEuYS5jKQpxPWwuYwppZihILm9UKHEuSFIodCkpJiZxLmUh
-PW51bGwpe3A9bC5iCnAuYj1xLkt3KHQpCnAuYT0hMX19Y2F0Y2gobyl7cz1ILlJ1KG8pCnI9SC50cyhv
-KQpxPXUubi5iKGwuYS5hLmMpCnA9cS5hCm49cwptPWwuYgppZihwPT1udWxsP249PW51bGw6cD09PW4p
-bS5iPXEKZWxzZSBtLmI9bmV3IFAuQ3cocyxyKQptLmE9ITB9fSwKJFM6Mn0KUC5PTS5wcm90b3R5cGU9
-e30KUC5xaC5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXt2YXIgdCxzLHI9dGhpcyxxPXt9LHA9bmV3
-IFAudnMoJC5YMyx1LmZKKQpxLmE9MAp0PUguTGgocikKcz10LkMoIn4oMSkiKS5iKG5ldyBQLkI1KHEs
-cikpCnUuTS5iKG5ldyBQLlBJKHEscCkpClcuSkUoci5hLHIuYixzLCExLHQuZCkKcmV0dXJuIHB9fQpQ
-LkI1LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guTGgodGhpcy5iKS5kLmIoYSk7Kyt0aGlzLmEu
-YX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5iKS5DKCJjOCgxKSIpfX0KUC5QSS5wcm90
-b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYi5ISCh0aGlzLmEuYSl9LAokUzowfQpQLk1PLnByb3Rv
-dHlwZT17fQpQLmtULnByb3RvdHlwZT17fQpQLnhJLnByb3RvdHlwZT17fQpQLkN3LnByb3RvdHlwZT17
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLmEpfSwKJGlYUzoxfQpQLm0wLnByb3RvdHlwZT17
-JGlKQjoxfQpQLnBLLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHQscz10aGlzLmEscj1zLmEK
-cz1yPT1udWxsP3MuYT1uZXcgUC5uKCk6cgpyPXRoaXMuYgppZihyPT1udWxsKXRocm93IEguYihzKQp0
-PUguYihzKQp0LnN0YWNrPXIudygwKQp0aHJvdyB0fSwKJFM6MH0KUC5KaS5wcm90b3R5cGU9ewpiSDpm
-dW5jdGlvbihhKXt2YXIgdCxzLHIscT1udWxsCnUuTS5iKGEpCnRyeXtpZihDLk5VPT09JC5YMyl7YS4k
-MCgpCnJldHVybn1QLlQ4KHEscSx0aGlzLGEsdS5IKX1jYXRjaChyKXt0PUguUnUocikKcz1ILnRzKHIp
-ClAuTDIocSxxLHRoaXMsdCx1LmwuYihzKSl9fSwKRGw6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixx
-PW51bGwKYy5DKCJ+KDApIikuYihhKQpjLmIoYikKdHJ5e2lmKEMuTlU9PT0kLlgzKXthLiQxKGIpCnJl
-dHVybn1QLnl2KHEscSx0aGlzLGEsYix1LkgsYyl9Y2F0Y2gocil7dD1ILlJ1KHIpCnM9SC50cyhyKQpQ
-LkwyKHEscSx0aGlzLHQsdS5sLmIocykpfX0sClJUOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLmhq
-KHRoaXMsYi5DKCIwKCkiKS5iKGEpLGIpfSwKR1k6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlZwKHRo
-aXMsdS5NLmIoYSkpfSwKUHk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAuT1IodGhpcyxiLkMoIn4o
-MCkiKS5iKGEpLGIpfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsfSwKeno6ZnVuY3Rpb24oYSxi
-KXtiLkMoIjAoKSIpLmIoYSkKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDAoKQpyZXR1cm4gUC5UOChu
-dWxsLG51bGwsdGhpcyxhLGIpfSwKYnY6ZnVuY3Rpb24oYSxiLGMsZCl7Yy5DKCJAPDA+IikuSyhkKS5D
-KCIxKDIpIikuYihhKQpkLmIoYikKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDEoYikKcmV0dXJuIFAu
-eXYobnVsbCxudWxsLHRoaXMsYSxiLGMsZCl9LApycDpmdW5jdGlvbihhLGIsYyxkLGUsZil7ZC5DKCJA
-PDA+IikuSyhlKS5LKGYpLkMoIjEoMiwzKSIpLmIoYSkKZS5iKGIpCmYuYihjKQppZigkLlgzPT09Qy5O
-VSlyZXR1cm4gYS4kMihiLGMpCnJldHVybiBQLlF4KG51bGwsbnVsbCx0aGlzLGEsYixjLGQsZSxmKX0s
-CkxqOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiLkMoIkA8MD4iKS5LKGMpLksoZCkuQygiMSgyLDMp
-IikuYihhKX19ClAuaGoucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnp6KHRo
-aXMuYix0aGlzLmMpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLkMoIjAoKSIpfX0KUC5WcC5w
-cm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuYkgodGhpcy5iKX0sCiRTOjJ9ClAu
-T1IucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5jCnJldHVybiB0aGlzLmEuRGwo
-dGhpcy5iLHQuYihhKSx0KX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5DKCJ+KDApIil9fQpQ
-LmI2LnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXt2YXIgdD10aGlzLHM9bmV3IFAubG0odCx0LnIs
-SC5MaCh0KS5DKCJsbTwxPiIpKQpzLmM9dC5lCnJldHVybiBzfSwKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJu
-IHRoaXMuYX0sCnRnOmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZih0eXBlb2YgYj09InN0cmluZyImJmIh
-PT0iX19wcm90b19fIil7dD10aGlzLmIKaWYodD09bnVsbClyZXR1cm4hMQpyZXR1cm4gdS5KLmIodFti
-XSkhPW51bGx9ZWxzZXtzPXRoaXMuUFIoYikKcmV0dXJuIHN9fSwKUFI6ZnVuY3Rpb24oYSl7dmFyIHQ9
-dGhpcy5kCmlmKHQ9PW51bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMuREYodFt0aGlzLnJrKGEpXSxhKT49
-MH0sCkE6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9dGhpcwpILkxoKHIpLmQuYihiKQppZih0eXBlb2Yg
-Yj09InN0cmluZyImJmIhPT0iX19wcm90b19fIil7dD1yLmIKcmV0dXJuIHIuY1codD09bnVsbD9yLmI9
-UC5UMigpOnQsYil9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjEwNzM3NDE4MjMpPT09Yil7
-cz1yLmMKcmV0dXJuIHIuY1cocz09bnVsbD9yLmM9UC5UMigpOnMsYil9ZWxzZSByZXR1cm4gci5CNygw
-LGIpfSwKQjc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscT10aGlzCkguTGgocSkuZC5iKGIpCnQ9cS5k
-CmlmKHQ9PW51bGwpdD1xLmQ9UC5UMigpCnM9cS5yayhiKQpyPXRbc10KaWYocj09bnVsbCl0W3NdPVtx
-LmRnKGIpXQplbHNle2lmKHEuREYocixiKT49MClyZXR1cm4hMQpyLnB1c2gocS5kZyhiKSl9cmV0dXJu
-ITB9LApSejpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMKaWYodHlwZW9mIGI9PSJzdHJpbmciJiZiIT09
-Il9fcHJvdG9fXyIpcmV0dXJuIHQuSDQodC5iLGIpCmVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIiJiYo
-YiYxMDczNzQxODIzKT09PWIpcmV0dXJuIHQuSDQodC5jLGIpCmVsc2UgcmV0dXJuIHQucWcoMCxiKX0s
-CnFnOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscD10aGlzLG89cC5kCmlmKG89PW51bGwpcmV0dXJu
-ITEKdD1wLnJrKGIpCnM9b1t0XQpyPXAuREYocyxiKQppZihyPDApcmV0dXJuITEKcT1zLnNwbGljZShy
-LDEpWzBdCmlmKDA9PT1zLmxlbmd0aClkZWxldGUgb1t0XQpwLkdTKHEpCnJldHVybiEwfSwKY1c6ZnVu
-Y3Rpb24oYSxiKXtILkxoKHRoaXMpLmQuYihiKQppZih1LkouYihhW2JdKSE9bnVsbClyZXR1cm4hMQph
-W2JdPXRoaXMuZGcoYikKcmV0dXJuITB9LApINDpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGE9PW51bGwp
-cmV0dXJuITEKdD11LkouYihhW2JdKQppZih0PT1udWxsKXJldHVybiExCnRoaXMuR1ModCkKZGVsZXRl
-IGFbYl0KcmV0dXJuITB9LApYQTpmdW5jdGlvbigpe3RoaXMucj0xMDczNzQxODIzJnRoaXMucisxfSwK
-ZGc6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLHI9bmV3IFAuYm4oSC5MaChzKS5kLmIoYSkpCmlmKHMu
-ZT09bnVsbClzLmU9cy5mPXIKZWxzZXt0PXMuZgpyLmM9dApzLmY9dC5iPXJ9KytzLmEKcy5YQSgpCnJl
-dHVybiByfSwKR1M6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcyxzPWEuYyxyPWEuYgppZihzPT1udWxsKXQu
-ZT1yCmVsc2Ugcy5iPXIKaWYocj09bnVsbCl0LmY9cwplbHNlIHIuYz1zOy0tdC5hCnQuWEEoKX0sCnJr
-OmZ1bmN0aW9uKGEpe3JldHVybiBKLmhmKGEpJjEwNzM3NDE4MjN9LApERjpmdW5jdGlvbihhLGIpe3Zh
-ciB0LHMKaWYoYT09bnVsbClyZXR1cm4tMQp0PWEubGVuZ3RoCmZvcihzPTA7czx0OysrcylpZihKLlJN
-KGFbc10uYSxiKSlyZXR1cm4gcwpyZXR1cm4tMX19ClAuYm4ucHJvdG90eXBlPXt9ClAubG0ucHJvdG90
-eXBlPXsKZ1I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZH0sCm06ZnVuY3Rpb24oKXt2YXIgdD10aGlz
-LHM9dC5hCmlmKHQuYiE9PXMucil0aHJvdyBILmIoUC5hNChzKSkKZWxzZXtzPXQuYwppZihzPT1udWxs
-KXt0LnNCYihudWxsKQpyZXR1cm4hMX1lbHNle3Quc0JiKHQuJHRpLmQuYihzLmEpKQp0LmM9dC5jLmIK
-cmV0dXJuITB9fX0sCnNCYjpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlBbjox
-fQpQLm1XLnByb3RvdHlwZT17fQpQLkxVLnByb3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXpNOjF9ClAu
-bEQucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5hNyhhLHRoaXMuZ2goYSks
-SC56SyhhKS5DKCJhNzxsRC5FPiIpKX0sClc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5xKGEsYil9
-LApVOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILnpLKGEpLkMoIn4obEQuRSkiKS5iKGIpCnQ9dGhpcy5n
-aChhKQpmb3Iocz0wO3M8dDsrK3Mpe2IuJDEodGhpcy5xKGEscykpCmlmKHQhPT10aGlzLmdoKGEpKXRo
-cm93IEguYihQLmE0KGEpKX19LApFMjpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC56SyhhKQpyZXR1cm4g
-bmV3IEguQTgoYSx0LksoYykuQygiMShsRC5FKSIpLmIoYiksdC5DKCJAPGxELkU+IikuSyhjKS5DKCJB
-ODwxLDI+IikpfSwKZHU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQKSC56SyhhKS5DKCJsRC5FIikuYihk
-KQpQLmpCKGIsYyx0aGlzLmdoKGEpKQpmb3IodD1iO3Q8YzsrK3QpdGhpcy5ZKGEsdCxkKX0sCnc6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX19ClAuaWwucHJvdG90eXBlPXt9ClAucmEucHJv
-dG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMuYQppZighcy5hKXRoaXMuYi5hKz0i
-LCAiCnMuYT0hMQpzPXRoaXMuYgp0PXMuYSs9SC5kKGEpCnMuYT10KyI6ICIKcy5hKz1ILmQoYil9LAok
-UzoxfQpQLllrLnByb3RvdHlwZT17ClU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzCkgueksoYSkuQygifihZ
-ay5LLFlrLlYpIikuYihiKQpmb3IodD1KLklUKHRoaXMuZ3YoYSkpO3QubSgpOyl7cz10LmdSKHQpCmIu
-JDIocyx0aGlzLnEoYSxzKSl9fSwKZ1B1OmZ1bmN0aW9uKGEpe3JldHVybiBKLk0xKHRoaXMuZ3YoYSks
-bmV3IFAueVEoYSksSC56SyhhKS5DKCJOMzxZay5LLFlrLlY+IikpfSwKZ2g6ZnVuY3Rpb24oYSl7cmV0
-dXJuIEouSG0odGhpcy5ndihhKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKGEpfSwKJGlaMDox
-fQpQLnlRLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYSxzPUgueksodCkKcy5D
-KCJZay5LIikuYihhKQpyZXR1cm4gbmV3IFAuTjMoYSxKLncyKHQsYSkscy5DKCJAPFlrLks+IikuSyhz
-LkMoIllrLlYiKSkuQygiTjM8MSwyPiIpKX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEgueksodGhpcy5h
-KS5DKCJOMzxZay5LLFlrLlY+KFlrLkspIil9fQpQLktQLnByb3RvdHlwZT17Clk6ZnVuY3Rpb24oYSxi
-LGMpe3ZhciB0PUguTGgodGhpcykKdC5kLmIoYikKdC5jaFsxXS5iKGMpCnRocm93IEguYihQLkw0KCJD
-YW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKSl9fQpQLlBuLnByb3RvdHlwZT17CnE6ZnVuY3Rp
-b24oYSxiKXtyZXR1cm4gSi53Mih0aGlzLmEsYil9LApZOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILkxo
-KHRoaXMpCkouQjIodGhpcy5hLHQuZC5iKGIpLHQuY2hbMV0uYihjKSl9LApVOmZ1bmN0aW9uKGEsYil7
-Si5oRSh0aGlzLmEsSC5MaCh0aGlzKS5DKCJ+KDEsMikiKS5iKGIpKX0sCmdoOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBKLkhtKHRoaXMuYSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBKLmoodGhpcy5hKX0sCmdQdTpm
-dW5jdGlvbihhKXtyZXR1cm4gSi5RTSh0aGlzLmEpfSwKJGlaMDoxfQpQLkdqLnByb3RvdHlwZT17fQpQ
-LmxmLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0iKX19ClAu
-UksucHJvdG90eXBlPXskaWJROjEsJGljWDoxLCRpeHU6MX0KUC5Ydi5wcm90b3R5cGU9ewpGVjpmdW5j
-dGlvbihhLGIpe3ZhciB0CmZvcih0PUouSVQoSC5MaCh0aGlzKS5DKCJjWDwxPiIpLmIoYikpO3QubSgp
-Oyl0aGlzLkEoMCx0LmdSKHQpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0i
-KX0sCnpWOmZ1bmN0aW9uKGEsYil7dmFyIHQscz1QLnJqKHRoaXMsdGhpcy5yLEguTGgodGhpcykuZCkK
-aWYoIXMubSgpKXJldHVybiIiCmlmKGI9PT0iIil7dD0iIgpkbyB0Kz1ILmQocy5kKQp3aGlsZShzLm0o
-KSl9ZWxzZXt0PUguZChzLmQpCmZvcig7cy5tKCk7KXQ9dCtiK0guZChzLmQpfXJldHVybiB0LmNoYXJD
-b2RlQXQoMCk9PTA/dDp0fSwKJGliUToxLAokaWNYOjEsCiRpeHU6MX0KUC5uWS5wcm90b3R5cGU9e30K
-UC5XWS5wcm90b3R5cGU9e30KUC5SVS5wcm90b3R5cGU9e30KUC51dy5wcm90b3R5cGU9ewpxOmZ1bmN0
-aW9uKGEsYil7dmFyIHQscz10aGlzLmIKaWYocz09bnVsbClyZXR1cm4gdGhpcy5jLnEoMCxiKQplbHNl
-IGlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gbnVsbAplbHNle3Q9c1tiXQpyZXR1cm4gdHlwZW9m
-IHQ9PSJ1bmRlZmluZWQiP3RoaXMuZmIoYik6dH19LApnaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5i
-PT1udWxsP3RoaXMuYy5hOnRoaXMuQ2YoKS5sZW5ndGh9LApndjpmdW5jdGlvbihhKXt2YXIgdAppZih0
-aGlzLmI9PW51bGwpe3Q9dGhpcy5jCnJldHVybiBuZXcgSC5pNSh0LEguTGgodCkuQygiaTU8MT4iKSl9
-cmV0dXJuIG5ldyBQLmk4KHRoaXMpfSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyPXRoaXMKaWYo
-ci5iPT1udWxsKXIuYy5ZKDAsYixjKQplbHNlIGlmKHIueDQoMCxiKSl7dD1yLmIKdFtiXT1jCnM9ci5h
-CmlmKHM9PW51bGw/dCE9bnVsbDpzIT09dClzW2JdPW51bGx9ZWxzZSByLlhLKCkuWSgwLGIsYyl9LAp4
-NDpmdW5jdGlvbihhLGIpe2lmKHRoaXMuYj09bnVsbClyZXR1cm4gdGhpcy5jLng0KDAsYikKcmV0dXJu
-IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYil9LApVOmZ1bmN0aW9u
-KGEsYil7dmFyIHQscyxyLHEscD10aGlzCnUuVC5iKGIpCmlmKHAuYj09bnVsbClyZXR1cm4gcC5jLlUo
-MCxiKQp0PXAuQ2YoKQpmb3Iocz0wO3M8dC5sZW5ndGg7KytzKXtyPXRbc10KcT1wLmJbcl0KaWYodHlw
-ZW9mIHE9PSJ1bmRlZmluZWQiKXtxPVAuUWUocC5hW3JdKQpwLmJbcl09cX1iLiQyKHIscSkKaWYodCE9
-PXAuYyl0aHJvdyBILmIoUC5hNChwKSl9fSwKQ2Y6ZnVuY3Rpb24oKXt2YXIgdD11LmouYih0aGlzLmMp
-CmlmKHQ9PW51bGwpdD10aGlzLmM9SC5WTShPYmplY3Qua2V5cyh0aGlzLmEpLHUucykKcmV0dXJuIHR9
-LApYSzpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbz10aGlzCmlmKG8uYj09bnVsbClyZXR1cm4gby5j
-CnQ9UC5GbCh1Lk4sdS56KQpzPW8uQ2YoKQpmb3Iocj0wO3E9cy5sZW5ndGgscjxxOysrcil7cD1zW3Jd
-CnQuWSgwLHAsby5xKDAscCkpfWlmKHE9PT0wKUMuTm0uQShzLG51bGwpCmVsc2UgQy5ObS5zaChzLDAp
-Cm8uYT1vLmI9bnVsbApyZXR1cm4gby5jPXR9LApmYjpmdW5jdGlvbihhKXt2YXIgdAppZighT2JqZWN0
-LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYSxhKSlyZXR1cm4gbnVsbAp0PVAuUWUo
-dGhpcy5hW2FdKQpyZXR1cm4gdGhpcy5iW2FdPXR9fQpQLmk4LnByb3RvdHlwZT17CmdoOmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdC5naCh0KX0sClc6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlz
-LmEKaWYodC5iPT1udWxsKXQ9dC5ndih0KS5XKDAsYikKZWxzZXt0PXQuQ2YoKQppZihiPDB8fGI+PXQu
-bGVuZ3RoKXJldHVybiBILk9IKHQsYikKdD10W2JdfXJldHVybiB0fSwKZ2t6OmZ1bmN0aW9uKGEpe3Zh
-ciB0PXRoaXMuYQppZih0LmI9PW51bGwpe3Q9dC5ndih0KQp0PXQuZ2t6KHQpfWVsc2V7dD10LkNmKCkK
-dD1uZXcgSi5tMSh0LHQubGVuZ3RoLEgudDYodCkuQygibTE8MT4iKSl9cmV0dXJuIHR9fQpQLkNWLnBy
-b3RvdHlwZT17CnlyOmZ1bmN0aW9uKGEsYTAsYTEsYTIpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGos
-aSxoLGcsZixlLGQsYyxiPSJJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggIgphMj1QLmpCKGEx
-LGEyLGEwLmxlbmd0aCkKdD0kLlY3KCkKZm9yKHM9YTEscj1zLHE9bnVsbCxwPS0xLG89LTEsbj0wO3M8
-YTI7cz1tKXttPXMrMQpsPUMueEIuV2QoYTAscykKaWYobD09PTM3KXtrPW0rMgppZihrPD1hMil7aj1I
-Lm9vKEMueEIuV2QoYTAsbSkpCmk9SC5vbyhDLnhCLldkKGEwLG0rMSkpCmg9aioxNitpLShpJjI1NikK
-aWYoaD09PTM3KWg9LTEKbT1rfWVsc2UgaD0tMX1lbHNlIGg9bAppZigwPD1oJiZoPD0xMjcpe2lmKGg8
-MHx8aD49dC5sZW5ndGgpcmV0dXJuIEguT0godCxoKQpnPXRbaF0KaWYoZz49MCl7aD1DLnhCLk8yKCJB
-QkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4
-OSsvIixnKQppZihoPT09bCljb250aW51ZQpsPWh9ZWxzZXtpZihnPT09LTEpe2lmKHA8MCl7Zj1xPT1u
-dWxsP251bGw6cS5hLmxlbmd0aAppZihmPT1udWxsKWY9MApwPWYrKHMtcikKbz1zfSsrbgppZihsPT09
-NjEpY29udGludWV9bD1ofWlmKGchPT0tMil7aWYocT09bnVsbClxPW5ldyBQLlJuKCIiKQpxLmErPUMu
-eEIuTmooYTAscixzKQpxLmErPUguTHcobCkKcj1tCmNvbnRpbnVlfX10aHJvdyBILmIoUC5ycigiSW52
-YWxpZCBiYXNlNjQgZGF0YSIsYTAscykpfWlmKHEhPW51bGwpe2Y9cS5hKz1DLnhCLk5qKGEwLHIsYTIp
-CmU9Zi5sZW5ndGgKaWYocD49MClQLnhNKGEwLG8sYTIscCxuLGUpCmVsc2V7ZD1DLmpuLnpZKGUtMSw0
-KSsxCmlmKGQ9PT0xKXRocm93IEguYihQLnJyKGIsYTAsYTIpKQpmb3IoO2Q8NDspe2YrPSI9IgpxLmE9
-ZjsrK2R9fWY9cS5hCnJldHVybiBDLnhCLmk3KGEwLGExLGEyLGYuY2hhckNvZGVBdCgwKT09MD9mOmYp
-fWM9YTItYTEKaWYocD49MClQLnhNKGEwLG8sYTIscCxuLGMpCmVsc2V7ZD1DLmpuLnpZKGMsNCkKaWYo
-ZD09PTEpdGhyb3cgSC5iKFAucnIoYixhMCxhMikpCmlmKGQ+MSlhMD1DLnhCLmk3KGEwLGEyLGEyLGQ9
-PT0yPyI9PSI6Ij0iKX1yZXR1cm4gYTB9fQpQLnZBLnByb3RvdHlwZT17fQpQLlVrLnByb3RvdHlwZT17
-fQpQLndJLnByb3RvdHlwZT17fQpQLlppLnByb3RvdHlwZT17fQpQLmJ5LnByb3RvdHlwZT17CnBXOmZ1
-bmN0aW9uKGEsYixjKXt2YXIgdAp1LmVwLmIoYykKdD1QLkJTKGIsdGhpcy5nSGUoKS5hKQpyZXR1cm4g
-dH0sCmdIZTpmdW5jdGlvbigpe3JldHVybiBDLkEzfX0KUC5NeC5wcm90b3R5cGU9e30KUC51NS5wcm90
-b3R5cGU9ewpnWkU6ZnVuY3Rpb24oKXtyZXR1cm4gQy5Ra319ClAuRTMucHJvdG90eXBlPXsKV0o6ZnVu
-Y3Rpb24oYSl7dmFyIHQscyxyPVAuakIoMCxudWxsLGEubGVuZ3RoKSxxPXItMAppZihxPT09MClyZXR1
-cm4gbmV3IFVpbnQ4QXJyYXkoMCkKdD1uZXcgVWludDhBcnJheShxKjMpCnM9bmV3IFAuUncodCkKaWYo
-cy5HeChhLDAscikhPT1yKXMuTzYoSi5hNihhLHItMSksMCkKcmV0dXJuIG5ldyBVaW50OEFycmF5KHQu
-c3ViYXJyYXkoMCxILnJNKDAscy5iLHQubGVuZ3RoKSkpfX0KUC5Sdy5wcm90b3R5cGU9ewpPNjpmdW5j
-dGlvbihhLGIpe3ZhciB0LHM9dGhpcyxyPXMuYyxxPXMuYixwPXErMSxvPXIubGVuZ3RoCmlmKChiJjY0
-NTEyKT09PTU2MzIwKXt0PTY1NTM2KygoYSYxMDIzKTw8MTApfGImMTAyMwpzLmI9cAppZihxPj1vKXJl
-dHVybiBILk9IKHIscSkKcltxXT0yNDB8dD4+PjE4CnE9cy5iPXArMQppZihwPj1vKXJldHVybiBILk9I
-KHIscCkKcltwXT0xMjh8dD4+PjEyJjYzCnA9cy5iPXErMQppZihxPj1vKXJldHVybiBILk9IKHIscSkK
-cltxXT0xMjh8dD4+PjYmNjMKcy5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT0xMjh8
-dCY2MwpyZXR1cm4hMH1lbHNle3MuYj1wCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTIyNHxh
-Pj4+MTIKcT1zLmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguT0gocixwKQpyW3BdPTEyOHxhPj4+NiY2Mwpz
-LmI9cSsxCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTEyOHxhJjYzCnJldHVybiExfX0sCkd4
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMKaWYoYiE9PWMmJihDLnhCLk8y
-KGEsYy0xKSY2NDUxMik9PT01NTI5NiktLWMKZm9yKHQ9bS5jLHM9dC5sZW5ndGgscj1iO3I8YzsrK3Ip
-e3E9Qy54Qi5XZChhLHIpCmlmKHE8PTEyNyl7cD1tLmIKaWYocD49cylicmVhawptLmI9cCsxCnRbcF09
-cX1lbHNlIGlmKChxJjY0NTEyKT09PTU1Mjk2KXtpZihtLmIrMz49cylicmVhawpvPXIrMQppZihtLk82
-KHEsQy54Qi5XZChhLG8pKSlyPW99ZWxzZSBpZihxPD0yMDQ3KXtwPW0uYgpuPXArMQppZihuPj1zKWJy
-ZWFrCm0uYj1uCmlmKHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTE5MnxxPj4+NgptLmI9bisxCnRb
-bl09MTI4fHEmNjN9ZWxzZXtwPW0uYgppZihwKzI+PXMpYnJlYWsKbj1tLmI9cCsxCmlmKHA+PXMpcmV0
-dXJuIEguT0godCxwKQp0W3BdPTIyNHxxPj4+MTIKcD1tLmI9bisxCmlmKG4+PXMpcmV0dXJuIEguT0go
-dCxuKQp0W25dPTEyOHxxPj4+NiY2MwptLmI9cCsxCmlmKHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3Bd
-PTEyOHxxJjYzfX1yZXR1cm4gcn19ClAuR1kucHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7dmFyIHQs
-cyxyLHEscCxvLG4sbSxsCnUuTC5iKGEpCnQ9UC5reSghMSxhLDAsbnVsbCkKaWYodCE9bnVsbClyZXR1
-cm4gdApzPVAuakIoMCxudWxsLEouSG0oYSkpCnI9UC5jUChhLDAscykKaWYocj4wKXtxPVAuSE0oYSww
-LHIpCmlmKHI9PT1zKXJldHVybiBxCnA9bmV3IFAuUm4ocSkKbz1yCm49ITF9ZWxzZXtvPTAKcD1udWxs
-Cm49ITB9aWYocD09bnVsbClwPW5ldyBQLlJuKCIiKQptPW5ldyBQLmJ6KCExLHApCm0uYz1uCm0uTUUo
-YSxvLHMpCmlmKG0uZT4wKXtILlZqKFAucnIoIlVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2Ui
-LGEscykpCnAuYSs9SC5Mdyg2NTUzMykKbS5mPW0uZT1tLmQ9MH1sPXAuYQpyZXR1cm4gbC5jaGFyQ29k
-ZUF0KDApPT0wP2w6bH19ClAuYnoucHJvdG90eXBlPXsKTUU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMs
-cixxLHAsbyxuLG0sbCxrLGosaSxoPXRoaXMsZz0iQmFkIFVURi04IGVuY29kaW5nIDB4Igp1LkwuYihh
-KQp0PWguZApzPWguZQpyPWguZgpoLmY9aC5lPWguZD0wCiRsYWJlbDAkMDpmb3IocT1KLlU2KGEpLHA9
-aC5iLG89YjshMDtvPWopeyRsYWJlbDEkMTppZihzPjApe2Rve2lmKG89PT1jKWJyZWFrICRsYWJlbDAk
-MApuPXEucShhLG8pCmlmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0dXJuIG4uek0oKQppZigobiYxOTIp
-IT09MTI4KXttPVAucnIoZytDLmpuLkQ4KG4sMTYpLGEsbykKdGhyb3cgSC5iKG0pfWVsc2V7dD0odDw8
-NnxuJjYzKT4+PjA7LS1zOysrb319d2hpbGUocz4wKQptPXItMQppZihtPDB8fG0+PTQpcmV0dXJuIEgu
-T0goQy5HYixtKQppZih0PD1DLkdiW21dKXttPVAucnIoIk92ZXJsb25nIGVuY29kaW5nIG9mIDB4IitD
-LmpuLkQ4KHQsMTYpLGEsby1yLTEpCnRocm93IEguYihtKX1pZih0PjExMTQxMTEpe209UC5ycigiQ2hh
-cmFjdGVyIG91dHNpZGUgdmFsaWQgVW5pY29kZSByYW5nZTogMHgiK0Muam4uRDgodCwxNiksYSxvLXIt
-MSkKdGhyb3cgSC5iKG0pfWlmKCFoLmN8fHQhPT02NTI3OSlwLmErPUguTHcodCkKaC5jPSExfWZvciht
-PW88YzttOyl7bD1QLmNQKGEsbyxjKQppZihsPjApe2guYz0hMQprPW8rbApwLmErPVAuSE0oYSxvLGsp
-CmlmKGs9PT1jKWJyZWFrfWVsc2Ugaz1vCmo9aysxCm49cS5xKGEsaykKaWYodHlwZW9mIG4hPT0ibnVt
-YmVyIilyZXR1cm4gbi5KKCkKaWYobjwwKXtpPVAucnIoIk5lZ2F0aXZlIFVURi04IGNvZGUgdW5pdDog
-LTB4IitDLmpuLkQ4KC1uLDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfWVsc2V7aWYoKG4mMjI0KT09PTE5
-Mil7dD1uJjMxCnM9MQpyPTEKY29udGludWUgJGxhYmVsMCQwfWlmKChuJjI0MCk9PT0yMjQpe3Q9biYx
-NQpzPTIKcj0yCmNvbnRpbnVlICRsYWJlbDAkMH1pZigobiYyNDgpPT09MjQwJiZuPDI0NSl7dD1uJjcK
-cz0zCnI9Mwpjb250aW51ZSAkbGFiZWwwJDB9aT1QLnJyKGcrQy5qbi5EOChuLDE2KSxhLGotMSkKdGhy
-b3cgSC5iKGkpfX1icmVhayAkbGFiZWwwJDB9aWYocz4wKXtoLmQ9dApoLmU9cwpoLmY9cn19fQpQLldG
-LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCnUuZm8uYihhKQp0PXRoaXMuYgpz
-PXRoaXMuYQp0LmErPXMuYQpyPXQuYSs9SC5kKGEuYSkKdC5hPXIrIjogIgp0LmErPVAucChiKQpzLmE9
-IiwgIn0sCiRTOjQ3fQpQLmEyLnByb3RvdHlwZT17fQpQLmlQLnByb3RvdHlwZT17CkROOmZ1bmN0aW9u
-KGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuaVAmJnRoaXMuYT09
-PWIuYSYmdGhpcy5iPT09Yi5ifSwKWGs6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMuYQppZihNYXRo
-LmFicyhzKTw9ODY0ZTEzKXQ9ITEKZWxzZSB0PSEwCmlmKHQpdGhyb3cgSC5iKFAueFkoIkRhdGVUaW1l
-IGlzIG91dHNpZGUgdmFsaWQgcmFuZ2U6ICIrcykpfSwKZ2k6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5h
-CnJldHVybih0XkMuam4ud0codCwzMCkpJjEwNzM3NDE4MjN9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRo
-aXMscz1QLkdxKEgudEoodCkpLHI9UC5oMChILk5TKHQpKSxxPVAuaDAoSC5qQSh0KSkscD1QLmgwKEgu
-S0wodCkpLG89UC5oMChILmNoKHQpKSxuPVAuaDAoSC5KZCh0KSksbT1QLlZ4KEgubzEodCkpCmlmKHQu
-YilyZXR1cm4gcysiLSIrcisiLSIrcSsiICIrcCsiOiIrbysiOiIrbisiLiIrbSsiWiIKZWxzZSByZXR1
-cm4gcysiLSIrcisiLSIrcSsiICIrcCsiOiIrbysiOiIrbisiLiIrbX19ClAuQ1AucHJvdG90eXBlPXt9
-ClAuWFMucHJvdG90eXBlPXt9ClAuQzYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlz
-LmEKaWYodCE9bnVsbClyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLnAodCkKcmV0dXJuIkFzc2Vy
-dGlvbiBmYWlsZWQifX0KUC5uLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlRocm93IG9m
-IG51bGwuIn19ClAudS5wcm90b3R5cGU9ewpnWjpmdW5jdGlvbigpe3JldHVybiJJbnZhbGlkIGFyZ3Vt
-ZW50IisoIXRoaXMuYT8iKHMpIjoiIil9LApndTpmdW5jdGlvbigpe3JldHVybiIifSwKdzpmdW5jdGlv
-bihhKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1wLmMsbj1vIT1udWxsPyIgKCIrbysiKSI6IiIKbz1wLmQK
-dD1vPT1udWxsPyIiOiI6ICIrSC5kKG8pCnM9cC5nWigpK24rdAppZighcC5hKXJldHVybiBzCnI9cC5n
-dSgpCnE9UC5wKHAuYikKcmV0dXJuIHMrcisiOiAiK3F9fQpQLmJKLnByb3RvdHlwZT17CmdaOmZ1bmN0
-aW9uKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcy5lCmlm
-KHI9PW51bGwpe3I9dGhpcy5mCnQ9ciE9bnVsbD8iOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIr
-SC5kKHIpOiIifWVsc2V7cz10aGlzLmYKaWYocz09bnVsbCl0PSI6IE5vdCBncmVhdGVyIHRoYW4gb3Ig
-ZXF1YWwgdG8gIitILmQocikKZWxzZSBpZihzPnIpdD0iOiBOb3QgaW4gcmFuZ2UgIitILmQocikrIi4u
-IitILmQocykrIiwgaW5jbHVzaXZlIgplbHNlIHQ9czxyPyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVt
-cHR5IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICIrSC5kKHIpfXJldHVybiB0fX0KUC5lWS5wcm90b3R5
-cGU9ewpnWjpmdW5jdGlvbigpe3JldHVybiJSYW5nZUVycm9yIn0sCmd1OmZ1bmN0aW9uKCl7dmFyIHQs
-cz1ILlNjKHRoaXMuYikKaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5KKCkKaWYoczwwKXJl
-dHVybiI6IGluZGV4IG11c3Qgbm90IGJlIG5lZ2F0aXZlIgp0PXRoaXMuZgppZih0PT09MClyZXR1cm4i
-OiBubyBpbmRpY2VzIGFyZSB2YWxpZCIKcmV0dXJuIjogaW5kZXggc2hvdWxkIGJlIGxlc3MgdGhhbiAi
-K0guZCh0KX0sCmdoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmZ9fQpQLm1wLnByb3RvdHlwZT17Cnc6
-ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxsPXRoaXMsaz17fSxqPW5ldyBQLlJuKCIiKQpr
-LmE9IiIKZm9yKHQ9bC5jLHM9dC5sZW5ndGgscj0wLHE9IiIscD0iIjtyPHM7KytyLHA9IiwgIil7bz10
-W3JdCmouYT1xK3AKcT1qLmErPVAucChvKQprLmE9IiwgIn1sLmQuVSgwLG5ldyBQLldGKGssaikpCm49
-UC5wKGwuYSkKbT1qLncoMCkKdD0iTm9TdWNoTWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICci
-K0guZChsLmIuYSkrIidcblJlY2VpdmVyOiAiK24rIlxuQXJndW1lbnRzOiBbIittKyJdIgpyZXR1cm4g
-dH19ClAudWIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0
-aW9uOiAiK3RoaXMuYX19ClAuZHMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEK
-cmV0dXJuIHQhPW51bGw/IlVuaW1wbGVtZW50ZWRFcnJvcjogIit0OiJVbmltcGxlbWVudGVkRXJyb3Ii
-fX0KUC5sai5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJCYWQgc3RhdGU6ICIrdGhpcy5h
-fX0KUC5VVi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQppZih0PT1udWxsKXJl
-dHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uLiIKcmV0dXJuIkNvbmN1
-cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb246ICIrUC5wKHQpKyIuIn19ClAuazUucHJv
-dG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LAokaVhTOjF9ClAuS1ku
-cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iU3RhY2sgT3ZlcmZsb3cifSwKJGlYUzoxfQpQ
-LmMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQ9PW51bGw/IlJl
-YWRpbmcgc3RhdGljIHZhcmlhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24iOiJSZWFkaW5nIHN0
-YXRpYyB2YXJpYWJsZSAnIit0KyInIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24ifX0KUC5DRC5wcm90
-b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJFeGNlcHRpb246ICIrdGhpcy5hfX0KUC5hRS5wcm90
-b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoPXRoaXMuYSxn
-PWghPW51bGwmJiIiIT09aD8iRm9ybWF0RXhjZXB0aW9uOiAiK0guZChoKToiRm9ybWF0RXhjZXB0aW9u
-IixmPXRoaXMuYyxlPXRoaXMuYgppZih0eXBlb2YgZT09InN0cmluZyIpe2lmKGYhPW51bGwpaD1mPDB8
-fGY+ZS5sZW5ndGgKZWxzZSBoPSExCmlmKGgpZj1udWxsCmlmKGY9PW51bGwpe3Q9ZS5sZW5ndGg+Nzg/
-Qy54Qi5OaihlLDAsNzUpKyIuLi4iOmUKcmV0dXJuIGcrIlxuIit0fWZvcihzPTEscj0wLHE9ITEscD0w
-O3A8ZjsrK3Ape289Qy54Qi5XZChlLHApCmlmKG89PT0xMCl7aWYociE9PXB8fCFxKSsrcwpyPXArMQpx
-PSExfWVsc2UgaWYobz09PTEzKXsrK3MKcj1wKzEKcT0hMH19Zz1zPjE/ZysoIiAoYXQgbGluZSAiK3Mr
-IiwgY2hhcmFjdGVyICIrKGYtcisxKSsiKVxuIik6ZysoIiAoYXQgY2hhcmFjdGVyICIrKGYrMSkrIilc
-biIpCm49ZS5sZW5ndGgKZm9yKHA9ZjtwPG47KytwKXtvPUMueEIuTzIoZSxwKQppZihvPT09MTB8fG89
-PT0xMyl7bj1wCmJyZWFrfX1pZihuLXI+NzgpaWYoZi1yPDc1KXttPXIrNzUKbD1yCms9IiIKaj0iLi4u
-In1lbHNle2lmKG4tZjw3NSl7bD1uLTc1Cm09bgpqPSIifWVsc2V7bD1mLTM2Cm09ZiszNgpqPSIuLi4i
-fWs9Ii4uLiJ9ZWxzZXttPW4KbD1yCms9IiIKaj0iIn1pPUMueEIuTmooZSxsLG0pCnJldHVybiBnK2sr
-aStqKyJcbiIrQy54Qi5JeCgiICIsZi1sK2subGVuZ3RoKSsiXlxuIn1lbHNlIHJldHVybiBmIT1udWxs
-P2crKCIgKGF0IG9mZnNldCAiK0guZChmKSsiKSIpOmd9fQpQLkVILnByb3RvdHlwZT17fQpQLktOLnBy
-b3RvdHlwZT17fQpQLmNYLnByb3RvdHlwZT17CkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILkxoKHRo
-aXMpCnJldHVybiBILksxKHRoaXMsdC5LKGMpLkMoIjEoY1guRSkiKS5iKGIpLHQuQygiY1guRSIpLGMp
-fSwKZXY6ZnVuY3Rpb24oYSxiKXt2YXIgdD1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5VNSh0aGlzLHQu
-QygiYTIoY1guRSkiKS5iKGIpLHQuQygiVTU8Y1guRT4iKSl9LApnaDpmdW5jdGlvbihhKXt2YXIgdCxz
-PXRoaXMuZ2t6KHRoaXMpCmZvcih0PTA7cy5tKCk7KSsrdApyZXR1cm4gdH0sCmdsMDpmdW5jdGlvbihh
-KXtyZXR1cm4hdGhpcy5na3oodGhpcykubSgpfSwKZ3I4OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5n
-a3oodGhpcykKaWYoIXMubSgpKXRocm93IEguYihILldwKCkpCnQ9cy5nUihzKQppZihzLm0oKSl0aHJv
-dyBILmIoSC5kVSgpKQpyZXR1cm4gdH0sClc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIKUC5rMShiLCJp
-bmRleCIpCmZvcih0PXRoaXMuZ2t6KHRoaXMpLHM9MDt0Lm0oKTspe3I9dC5nUih0KQppZihiPT09cyly
-ZXR1cm4gcjsrK3N9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLCJpbmRleCIsbnVsbCxzKSl9LAp3OmZ1bmN0
-aW9uKGEpe3JldHVybiBQLkVQKHRoaXMsIigiLCIpIil9fQpQLkFuLnByb3RvdHlwZT17fQpQLnpNLnBy
-b3RvdHlwZT17JGliUToxLCRpY1g6MX0KUC5aMC5wcm90b3R5cGU9e30KUC5OMy5wcm90b3R5cGU9ewp3
-OmZ1bmN0aW9uKGEpe3JldHVybiJNYXBFbnRyeSgiK0guZCh0aGlzLmEpKyI6ICIrSC5kKHRoaXMuYikr
-IikifSwKZ0czOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LApnbnc6ZnVuY3Rpb24oYSl7cmV0dXJu
-IHRoaXMuYn19ClAuYzgucHJvdG90eXBlPXsKZ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuay5wcm90b3R5
-cGUuZ2kuY2FsbCh0aGlzLHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4ibnVsbCJ9fQpQLkZLLnBy
-b3RvdHlwZT17fQpQLmsucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQLmssJGlrOjEsCkROOmZ1bmN0aW9u
-KGEsYil7cmV0dXJuIHRoaXM9PT1ifSwKZ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIEguZVEodGhpcyl9LAp3
-OmZ1bmN0aW9uKGEpe3JldHVybiJJbnN0YW5jZSBvZiAnIitILmQoSC5NKHRoaXMpKSsiJyJ9LAplNzpm
-dW5jdGlvbihhLGIpe3Uuby5iKGIpCnRocm93IEguYihQLmxyKHRoaXMsYi5nV2EoKSxiLmduZCgpLGIu
-Z1ZtKCkpKX0sCnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudyh0aGlzKX19ClAuT2QucHJv
-dG90eXBlPXt9ClAuaWIucHJvdG90eXBlPXskaU9kOjF9ClAueHUucHJvdG90eXBlPXt9ClAuR3oucHJv
-dG90eXBlPXt9ClAucVUucHJvdG90eXBlPXskaXZYOjF9ClAuUm4ucHJvdG90eXBlPXsKZ2g6ZnVuY3Rp
-b24oYSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQpyZXR1
-cm4gdC5jaGFyQ29kZUF0KDApPT0wP3Q6dH0sCiRpQkw6MX0KUC5HRC5wcm90b3R5cGU9e30KUC5uMS5w
-cm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxCnUuZi5iKGEpCkgueShiKQp0PUou
-clkoYikuT1koYiwiPSIpCmlmKHQ9PT0tMSl7aWYoYiE9PSIiKUouQjIoYSxQLmt1KGIsMCxiLmxlbmd0
-aCx0aGlzLmEsITApLCIiKX1lbHNlIGlmKHQhPT0wKXtzPUMueEIuTmooYiwwLHQpCnI9Qy54Qi55bihi
-LHQrMSkKcT10aGlzLmEKSi5CMihhLFAua3UocywwLHMubGVuZ3RoLHEsITApLFAua3UociwwLHIubGVu
-Z3RoLHEsITApKX1yZXR1cm4gYX0sCiRTOjI0fQpQLmNTLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEs
-Yil7dGhyb3cgSC5iKFAucnIoIklsbGVnYWwgSVB2NCBhZGRyZXNzLCAiK2EsdGhpcy5hLGIpKX0sCiRT
-OjQ4fQpQLlZDLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhyb3cgSC5iKFAucnIoIklsbGVn
-YWwgSVB2NiBhZGRyZXNzLCAiK2EsdGhpcy5hLGIpKX0sCiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz
-LiQyKGEsbnVsbCl9LAokUzozMX0KUC5KVC5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0
-CmlmKGItYT40KXRoaXMuYS4kMigiYW4gSVB2NiBwYXJ0IGNhbiBvbmx5IGNvbnRhaW4gYSBtYXhpbXVt
-IG9mIDQgaGV4IGRpZ2l0cyIsYSkKdD1QLlFBKEMueEIuTmoodGhpcy5iLGEsYiksbnVsbCwxNikKaWYo
-dHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4gdC5KKCkKaWYodDwwfHx0PjY1NTM1KXRoaXMuYS4kMigi
-ZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAweDAuLjB4RkZGRmAiLGEpCnJldHVybiB0
-fSwKJFM6MzV9ClAuRG4ucHJvdG90eXBlPXsKZ2t1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYn0sCmdK
-ZjpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmMKaWYodD09bnVsbClyZXR1cm4iIgppZihDLnhCLm5DKHQs
-IlsiKSlyZXR1cm4gQy54Qi5Oaih0LDEsdC5sZW5ndGgtMSkKcmV0dXJuIHR9LApndHA6ZnVuY3Rpb24o
-YSl7dmFyIHQ9dGhpcy5kCmlmKHQ9PW51bGwpcmV0dXJuIFAud0sodGhpcy5hKQpyZXR1cm4gdH0sCmd0
-UDpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmYKcmV0dXJuIHQ9PW51bGw/IiI6dH0sCmdLYTpmdW5jdGlv
-bigpe3ZhciB0PXRoaXMucgpyZXR1cm4gdD09bnVsbD8iIjp0fSwKbm06ZnVuY3Rpb24oYSxiKXt2YXIg
-dCxzLHIscSxwLG8sbixtLGw9dGhpcwp1LlguYihudWxsKQp1LmIuYihiKQp0PWwuYQpzPXQ9PT0iZmls
-ZSIKcj1sLmIKcT1sLmQKcD1sLmMKaWYoIShwIT1udWxsKSlwPXIubGVuZ3RoIT09MHx8cSE9bnVsbHx8
-cz8iIjpudWxsCm89bC5lCmlmKCFzKW49cCE9bnVsbCYmby5sZW5ndGghPT0wCmVsc2Ugbj0hMAppZihu
-JiYhQy54Qi5uQyhvLCIvIikpbz0iLyIrbwptPVAubGUobnVsbCwwLDAsYikKcmV0dXJuIG5ldyBQLkRu
-KHQscixwLHEsbyxtLGwucil9LApnRmo6ZnVuY3Rpb24oKXt2YXIgdCxzPXRoaXMueAppZihzIT1udWxs
-KXJldHVybiBzCnQ9dGhpcy5lCmlmKHQubGVuZ3RoIT09MCYmQy54Qi5XZCh0LDApPT09NDcpdD1DLnhC
-LnluKHQsMSkKcz10PT09IiI/Qy54RDpQLkFGKG5ldyBILkE4KEguVk0odC5zcGxpdCgiLyIpLHUucyks
-dS5kTy5iKFAuUEgoKSksdS5kbyksdS5OKQp0aGlzLnNvNihzKQpyZXR1cm4gc30sCmdoWTpmdW5jdGlv
-bigpe3ZhciB0LHM9dGhpcwppZihzLlE9PW51bGwpe3Q9cy5mCnMuc1JIKG5ldyBQLkdqKFAuV1godD09
-bnVsbD8iIjp0KSx1LlcpKX1yZXR1cm4gcy5RfSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxw
-LG8KZm9yKHQ9MCxzPTA7Qy54Qi5RaShiLCIuLi8iLHMpOyl7cys9MzsrK3R9cj1DLnhCLmNuKGEsIi8i
-KQp3aGlsZSghMCl7aWYoIShyPjAmJnQ+MCkpYnJlYWsKcT1DLnhCLlBrKGEsIi8iLHItMSkKaWYocTww
-KWJyZWFrCnA9ci1xCm89cCE9PTIKaWYoIW98fHA9PT0zKWlmKEMueEIuTzIoYSxxKzEpPT09NDYpbz0h
-b3x8Qy54Qi5PMihhLHErMik9PT00NgplbHNlIG89ITEKZWxzZSBvPSExCmlmKG8pYnJlYWs7LS10CnI9
-cX1yZXR1cm4gQy54Qi5pNyhhLHIrMSxudWxsLEMueEIueW4oYixzLTMqdCkpfSwKWkk6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMubVMoUC5oSyhhKSl9LAptUzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8s
-bixtLGwsaz10aGlzLGo9bnVsbAppZihhLmdGaSgpLmxlbmd0aCE9PTApe3Q9YS5nRmkoKQppZihhLmdj
-aigpKXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPWEuZ3hBKCk/YS5ndHAoYSk6an1lbHNle3E9agpyPXEK
-cz0iIn1wPVAueGUoYS5nSWkoYSkpCm89YS5nUUQoKT9hLmd0UChhKTpqfWVsc2V7dD1rLmEKaWYoYS5n
-Y2ooKSl7cz1hLmdrdSgpCnI9YS5nSmYoYSkKcT1QLndCKGEuZ3hBKCk/YS5ndHAoYSk6aix0KQpwPVAu
-eGUoYS5nSWkoYSkpCm89YS5nUUQoKT9hLmd0UChhKTpqfWVsc2V7cz1rLmIKcj1rLmMKcT1rLmQKaWYo
-YS5nSWkoYSk9PT0iIil7cD1rLmUKbz1hLmdRRCgpP2EuZ3RQKGEpOmsuZn1lbHNle2lmKGEuZ3RUKCkp
-cD1QLnhlKGEuZ0lpKGEpKQplbHNle249ay5lCmlmKG4ubGVuZ3RoPT09MClpZihyPT1udWxsKXA9dC5s
-ZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2UgcD1QLnhlKCIvIithLmdJaShhKSkK
-ZWxzZXttPWsuSmgobixhLmdJaShhKSkKbD10Lmxlbmd0aD09PTAKaWYoIWx8fHIhPW51bGx8fEMueEIu
-bkMobiwiLyIpKXA9UC54ZShtKQplbHNlIHA9UC53RihtLCFsfHxyIT1udWxsKX19bz1hLmdRRCgpP2Eu
-Z3RQKGEpOmp9fX1yZXR1cm4gbmV3IFAuRG4odCxzLHIscSxwLG8sYS5nWjgoKT9hLmdLYSgpOmopfSwK
-Z2NqOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYyE9bnVsbH0sCmd4QTpmdW5jdGlvbigpe3JldHVybiB0
-aGlzLmQhPW51bGx9LApnUUQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mIT1udWxsfSwKZ1o4OmZ1bmN0
-aW9uKCl7cmV0dXJuIHRoaXMuciE9bnVsbH0sCmd0VDpmdW5jdGlvbigpe3JldHVybiBDLnhCLm5DKHRo
-aXMuZSwiLyIpfSwKdDQ6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcyxxPXIuYQppZihxIT09IiImJnEh
-PT0iZmlsZSIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSAi
-K0guZChxKSsiIFVSSSIpKQpxPXIuZgppZigocT09bnVsbD8iIjpxKSE9PSIiKXRocm93IEguYihQLkw0
-KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBxdWVyeSBjb21wb25l
-bnQiKSkKcT1yLnIKaWYoKHE9PW51bGw/IiI6cSkhPT0iIil0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4
-dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50IikpCnQ9
-JC5PeCgpCmlmKEgub1QodCkpcT1QLm1uKHIpCmVsc2V7aWYoci5jIT1udWxsJiZyLmdKZihyKSE9PSIi
-KUguVmooUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93cyBmaWxlIHBhdGggZnJvbSBhIGZp
-bGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5IikpCnM9ci5nRmooKQpQLmtFKHMsITEpCnE9UC52ZyhDLnhC
-Lm5DKHIuZSwiLyIpPyIvIjoiIixzLCIvIikKcT1xLmNoYXJDb2RlQXQoMCk9PTA/cTpxfXJldHVybiBx
-fSwKdzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT10aGlzLHA9cS55CmlmKHA9PW51bGwpe3A9cS5hCnQ9
-cC5sZW5ndGghPT0wP3ArIjoiOiIiCnM9cS5jCnI9cz09bnVsbAppZighcnx8cD09PSJmaWxlIil7cD10
-KyIvLyIKdD1xLmIKaWYodC5sZW5ndGghPT0wKXA9cCt0KyJAIgppZighcilwKz1zCnQ9cS5kCmlmKHQh
-PW51bGwpcD1wKyI6IitILmQodCl9ZWxzZSBwPXQKcCs9cS5lCnQ9cS5mCmlmKHQhPW51bGwpcD1wKyI/
-Iit0CnQ9cS5yCmlmKHQhPW51bGwpcD1wKyIjIit0CnA9cS55PXAuY2hhckNvZGVBdCgwKT09MD9wOnB9
-cmV0dXJuIHB9LApETjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj10aGlzCmlmKGI9PW51bGwpcmV0dXJu
-ITEKaWYocj09PWIpcmV0dXJuITAKaWYodS5ELmMoYikpaWYoci5hPT1iLmdGaSgpKWlmKHIuYyE9bnVs
-bD09PWIuZ2NqKCkpaWYoci5iPT1iLmdrdSgpKWlmKHIuZ0pmKHIpPT1iLmdKZihiKSlpZihyLmd0cChy
-KT09Yi5ndHAoYikpaWYoci5lPT09Yi5nSWkoYikpe3Q9ci5mCnM9dD09bnVsbAppZighcz09PWIuZ1FE
-KCkpe2lmKHMpdD0iIgppZih0PT09Yi5ndFAoYikpe3Q9ci5yCnM9dD09bnVsbAppZighcz09PWIuZ1o4
-KCkpe2lmKHMpdD0iIgp0PXQ9PT1iLmdLYSgpfWVsc2UgdD0hMX1lbHNlIHQ9ITF9ZWxzZSB0PSExfWVs
-c2UgdD0hMQplbHNlIHQ9ITEKZWxzZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEKZWxzZSB0PSExCmVs
-c2UgdD0hMQpyZXR1cm4gdH0sCmdpOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuegpyZXR1cm4gdD09bnVs
-bD90aGlzLno9Qy54Qi5naSh0aGlzLncoMCkpOnR9LApzbzY6ZnVuY3Rpb24oYSl7dGhpcy54PXUuYS5i
-KGEpfSwKc1JIOmZ1bmN0aW9uKGEpe3RoaXMuUT11LmYuYihhKX0sCiRpaUQ6MSwKZ0ZpOmZ1bmN0aW9u
-KCl7cmV0dXJuIHRoaXMuYX0sCmdJaTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lfX0KUC5lMS5wcm90
-b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5ycigiSW52YWxpZCBwb3J0Iix0aGlzLmEs
-dGhpcy5iKzEpKX0sCiRTOjE1fQpQLk5ZLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PSJJ
-bGxlZ2FsIHBhdGggY2hhcmFjdGVyICIKSC55KGEpCmlmKEouemwoYSwiLyIpKWlmKHRoaXMuYSl0aHJv
-dyBILmIoUC54WSh0K2EpKQplbHNlIHRocm93IEguYihQLkw0KHQrYSkpfSwKJFM6MTV9ClAuUloucHJv
-dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuZVAoQy5aSixhLEMueE0sITEpfSwKJFM6NX0K
-UC5NRS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYixzPXRoaXMuYQp0LmEr
-PXMuYQpzLmE9IiYiCnM9dC5hKz1ILmQoUC5lUChDLkYzLGEsQy54TSwhMCkpCmlmKGIhPW51bGwmJmIu
-bGVuZ3RoIT09MCl7dC5hPXMrIj0iCnQuYSs9SC5kKFAuZVAoQy5GMyxiLEMueE0sITApKX19LAokUzox
-Nn0KUC55NS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0LHMKSC55KGEpCmlmKGI9PW51
-bGx8fHR5cGVvZiBiPT0ic3RyaW5nIil0aGlzLmEuJDIoYSxILnkoYikpCmVsc2UgZm9yKHQ9Si5JVCh1
-LlIuYihiKSkscz10aGlzLmE7dC5tKCk7KXMuJDIoYSxILnkodC5nUih0KSkpfSwKJFM6MTN9ClAuUEUu
-cHJvdG90eXBlPXsKZ2xSOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10aGlzLG89bnVsbCxuPXAuYwpp
-ZihuIT1udWxsKXJldHVybiBuCm49cC5iCmlmKDA+PW4ubGVuZ3RoKXJldHVybiBILk9IKG4sMCkKdD1w
-LmEKbj1uWzBdKzEKcz1DLnhCLlhVKHQsIj8iLG4pCnI9dC5sZW5ndGgKaWYocz49MCl7cT1QLnVPKHQs
-cysxLHIsQy5WQywhMSkKcj1zfWVsc2UgcT1vCnJldHVybiBwLmM9bmV3IFAucWUoImRhdGEiLG8sbyxv
-LFAudU8odCxuLHIsQy5XZCwhMSkscSxvKX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLmIKaWYo
-MD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywwKQp0PXRoaXMuYQpyZXR1cm4gc1swXT09PS0xPyJkYXRh
-OiIrdDp0fX0KUC5xMy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFVpbnQ4QXJy
-YXkoOTYpfSwKJFM6MjJ9ClAueUkucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlz
-LmEKaWYoYT49dC5sZW5ndGgpcmV0dXJuIEguT0godCxhKQp0PXRbYV0KSi5DTSh0LDAsOTYsYikKcmV0
-dXJuIHR9LAokUzo0OX0KUC5jNi5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxy
-LHEKZm9yKHQ9Yi5sZW5ndGgscz1hLmxlbmd0aCxyPTA7cjx0Oysrcil7cT1DLnhCLldkKGIscileOTYK
-aWYocT49cylyZXR1cm4gSC5PSChhLHEpCmFbcV09Y319fQpQLnFkLnByb3RvdHlwZT17CiQzOmZ1bmN0
-aW9uKGEsYixjKXt2YXIgdCxzLHIscQpmb3IodD1DLnhCLldkKGIsMCkscz1DLnhCLldkKGIsMSkscj1h
-Lmxlbmd0aDt0PD1zOysrdCl7cT0odF45Nik+Pj4wCmlmKHE+PXIpcmV0dXJuIEguT0goYSxxKQphW3Fd
-PWN9fX0KUC5VZi5wcm90b3R5cGU9ewpnY2o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jPjB9LApneEE6
-ZnVuY3Rpb24oKXt2YXIgdCxzCmlmKHRoaXMuYz4wKXt0PXRoaXMuZAppZih0eXBlb2YgdCE9PSJudW1i
-ZXIiKXJldHVybiB0LlQoKQpzPXRoaXMuZQppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBILnBZ
-KHMpCnM9dCsxPHMKdD1zfWVsc2UgdD0hMQpyZXR1cm4gdH0sCmdRRDpmdW5jdGlvbigpe3ZhciB0PXRo
-aXMuZgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQpyZXR1cm4gdDx0aGlzLnJ9LApn
-Wjg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yPHRoaXMuYS5sZW5ndGh9LApnTnc6ZnVuY3Rpb24oKXty
-ZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uQyh0aGlzLmEsImZpbGUiKX0sCmdXWjpmdW5jdGlvbigpe3Jl
-dHVybiB0aGlzLmI9PT00JiZDLnhCLm5DKHRoaXMuYSwiaHR0cCIpfSwKZ1JlOmZ1bmN0aW9uKCl7cmV0
-dXJuIHRoaXMuYj09PTUmJkMueEIubkModGhpcy5hLCJodHRwcyIpfSwKZ3RUOmZ1bmN0aW9uKCl7cmV0
-dXJuIEMueEIuUWkodGhpcy5hLCIvIix0aGlzLmUpfSwKZ0ZpOmZ1bmN0aW9uKCl7dmFyIHQscz10aGlz
-LHI9InBhY2thZ2UiLHE9cy5iCmlmKHE8PTApcmV0dXJuIiIKdD1zLngKaWYodCE9bnVsbClyZXR1cm4g
-dAppZihzLmdXWigpKXE9cy54PSJodHRwIgplbHNlIGlmKHMuZ1JlKCkpe3MueD0iaHR0cHMiCnE9Imh0
-dHBzIn1lbHNlIGlmKHMuZ053KCkpe3MueD0iZmlsZSIKcT0iZmlsZSJ9ZWxzZSBpZihxPT09NyYmQy54
-Qi5uQyhzLmEscikpe3MueD1yCnE9cn1lbHNle3E9Qy54Qi5OaihzLmEsMCxxKQpzLng9cX1yZXR1cm4g
-cX0sCmdrdTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYyxzPXRoaXMuYiszCnJldHVybiB0PnM/Qy54Qi5O
-aih0aGlzLmEscyx0LTEpOiIifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYwpyZXR1cm4gdD4w
-P0MueEIuTmoodGhpcy5hLHQsdGhpcy5kKToiIn0sCmd0cDpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMK
-aWYocy5neEEoKSl7dD1zLmQKaWYodHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4gdC5UKCkKcmV0dXJu
-IFAuUUEoQy54Qi5OaihzLmEsdCsxLHMuZSksbnVsbCxudWxsKX1pZihzLmdXWigpKXJldHVybiA4MApp
-ZihzLmdSZSgpKXJldHVybiA0NDMKcmV0dXJuIDB9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIu
-TmoodGhpcy5hLHRoaXMuZSx0aGlzLmYpfSwKZ3RQOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuZixzPXRo
-aXMucgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQpyZXR1cm4gdDxzP0MueEIuTmoo
-dGhpcy5hLHQrMSxzKToiIn0sCmdLYTpmdW5jdGlvbigpe3ZhciB0PXRoaXMucixzPXRoaXMuYQpyZXR1
-cm4gdDxzLmxlbmd0aD9DLnhCLnluKHMsdCsxKToiIn0sCmdGajpmdW5jdGlvbigpe3ZhciB0LHMscj10
-aGlzLmUscT10aGlzLmYscD10aGlzLmEKaWYoQy54Qi5RaShwLCIvIixyKSl7aWYodHlwZW9mIHIhPT0i
-bnVtYmVyIilyZXR1cm4gci5UKCk7KytyfWlmKHI9PXEpcmV0dXJuIEMueEQKdD1ILlZNKFtdLHUucykK
-cz1yCndoaWxlKCEwKXtpZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLkooKQppZih0eXBlb2Yg
-cSE9PSJudW1iZXIiKXJldHVybiBILnBZKHEpCmlmKCEoczxxKSlicmVhawppZihDLnhCLk8yKHAscyk9
-PT00Nyl7Qy5ObS5BKHQsQy54Qi5OaihwLHIscykpCnI9cysxfSsrc31DLk5tLkEodCxDLnhCLk5qKHAs
-cixxKSkKcmV0dXJuIFAuQUYodCx1Lk4pfSwKZ2hZOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxzPXQuZgpp
-Zih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLkooKQppZihzPj10LnIpcmV0dXJuIEMuV08KcmV0
-dXJuIG5ldyBQLkdqKFAuV1godC5ndFAodCkpLHUuVyl9LAprWDpmdW5jdGlvbihhKXt2YXIgdCxzPXRo
-aXMuZAppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLlQoKQp0PXMrMQpyZXR1cm4gdCthLmxl
-bmd0aD09PXRoaXMuZSYmQy54Qi5RaSh0aGlzLmEsYSx0KX0sCk45OmZ1bmN0aW9uKCl7dmFyIHQ9dGhp
-cyxzPXQucixyPXQuYQppZihzPj1yLmxlbmd0aClyZXR1cm4gdApyZXR1cm4gbmV3IFAuVWYoQy54Qi5O
-aihyLDAscyksdC5iLHQuYyx0LmQsdC5lLHQuZixzLHQueCl9LApubTpmdW5jdGlvbihhLGIpe3ZhciB0
-LHMscixxLHAsbyxuLG0sbCxrLGo9dGhpcyxpPW51bGwKdS5YLmIobnVsbCkKdS5iLmIoYikKdD1qLmdG
-aSgpCnM9dD09PSJmaWxlIgpyPWouYwpxPXI+MD9DLnhCLk5qKGouYSxqLmIrMyxyKToiIgpwPWouZ3hB
-KCk/ai5ndHAoaik6aQpyPWouYwppZihyPjApbz1DLnhCLk5qKGouYSxyLGouZCkKZWxzZSBvPXEubGVu
-Z3RoIT09MHx8cCE9bnVsbHx8cz8iIjppCnI9ai5hCm49Qy54Qi5OaihyLGouZSxqLmYpCmlmKCFzKW09
-byE9bnVsbCYmbi5sZW5ndGghPT0wCmVsc2UgbT0hMAppZihtJiYhQy54Qi5uQyhuLCIvIikpbj0iLyIr
-bgpsPVAubGUoaSwwLDAsYikKbT1qLnIKaz1tPHIubGVuZ3RoP0MueEIueW4ocixtKzEpOmkKcmV0dXJu
-IG5ldyBQLkRuKHQscSxvLHAsbixsLGspfSwKWkk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubVMoUC5o
-SyhhKSl9LAptUzpmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgUC5VZilyZXR1cm4gdGhpcy51MSh0
-aGlzLGEpCnJldHVybiB0aGlzLnZzKCkubVMoYSl9LAp1MTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixx
-LHAsbyxuLG0sbCxrLGosaSxoLGcsZixlPWIuYgppZihlPjApcmV0dXJuIGIKdD1iLmMKaWYodD4wKXtz
-PWEuYgppZihzPD0wKXJldHVybiBiCmlmKGEuZ053KCkpcj1iLmUhPWIuZgplbHNlIGlmKGEuZ1daKCkp
-cj0hYi5rWCgiODAiKQplbHNlIHI9IWEuZ1JlKCl8fCFiLmtYKCI0NDMiKQppZihyKXtxPXMrMQpwPUMu
-eEIuTmooYS5hLDAscSkrQy54Qi55bihiLmEsZSsxKQplPWIuZAppZih0eXBlb2YgZSE9PSJudW1iZXIi
-KXJldHVybiBlLlQoKQpvPWIuZQppZih0eXBlb2YgbyE9PSJudW1iZXIiKXJldHVybiBvLlQoKQpuPWIu
-ZgppZih0eXBlb2YgbiE9PSJudW1iZXIiKXJldHVybiBuLlQoKQpyZXR1cm4gbmV3IFAuVWYocCxzLHQr
-cSxlK3EsbytxLG4rcSxiLnIrcSxhLngpfWVsc2UgcmV0dXJuIHRoaXMudnMoKS5tUyhiKX1tPWIuZQpl
-PWIuZgppZihtPT1lKXt0PWIucgppZih0eXBlb2YgZSE9PSJudW1iZXIiKXJldHVybiBlLkooKQppZihl
-PHQpe3M9YS5mCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuSE4oKQpxPXMtZQpyZXR1cm4g
-bmV3IFAuVWYoQy54Qi5OaihhLmEsMCxzKStDLnhCLnluKGIuYSxlKSxhLmIsYS5jLGEuZCxhLmUsZStx
-LHQrcSxhLngpfWU9Yi5hCmlmKHQ8ZS5sZW5ndGgpe3M9YS5yCnJldHVybiBuZXcgUC5VZihDLnhCLk5q
-KGEuYSwwLHMpK0MueEIueW4oZSx0KSxhLmIsYS5jLGEuZCxhLmUsYS5mLHQrKHMtdCksYS54KX1yZXR1
-cm4gYS5OOSgpfXQ9Yi5hCmlmKEMueEIuUWkodCwiLyIsbSkpe3M9YS5lCmlmKHR5cGVvZiBzIT09Im51
-bWJlciIpcmV0dXJuIHMuSE4oKQppZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBILnBZKG0pCnE9
-cy1tCnA9Qy54Qi5OaihhLmEsMCxzKStDLnhCLnluKHQsbSkKaWYodHlwZW9mIGUhPT0ibnVtYmVyIily
-ZXR1cm4gZS5UKCkKcmV0dXJuIG5ldyBQLlVmKHAsYS5iLGEuYyxhLmQscyxlK3EsYi5yK3EsYS54KX1s
-PWEuZQprPWEuZgppZihsPT1rJiZhLmM+MCl7Zm9yKDtDLnhCLlFpKHQsIi4uLyIsbSk7KXtpZih0eXBl
-b2YgbSE9PSJudW1iZXIiKXJldHVybiBtLlQoKQptKz0zfWlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0
-dXJuIGwuSE4oKQppZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBILnBZKG0pCnE9bC1tKzEKcD1D
-LnhCLk5qKGEuYSwwLGwpKyIvIitDLnhCLnluKHQsbSkKaWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1
-cm4gZS5UKCkKcmV0dXJuIG5ldyBQLlVmKHAsYS5iLGEuYyxhLmQsbCxlK3EsYi5yK3EsYS54KX1qPWEu
-YQpmb3IoaT1sO0MueEIuUWkoaiwiLi4vIixpKTspe2lmKHR5cGVvZiBpIT09Im51bWJlciIpcmV0dXJu
-IGkuVCgpCmkrPTN9aD0wCndoaWxlKCEwKXtpZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBtLlQo
-KQpnPW0rMwppZih0eXBlb2YgZSE9PSJudW1iZXIiKXJldHVybiBILnBZKGUpCmlmKCEoZzw9ZSYmQy54
-Qi5RaSh0LCIuLi8iLG0pKSlicmVhazsrK2gKbT1nfWY9IiIKd2hpbGUoITApe2lmKHR5cGVvZiBrIT09
-Im51bWJlciIpcmV0dXJuIGsub3MoKQppZih0eXBlb2YgaSE9PSJudW1iZXIiKXJldHVybiBILnBZKGkp
-CmlmKCEoaz5pKSlicmVhazstLWsKaWYoQy54Qi5PMihqLGspPT09NDcpe2lmKGg9PT0wKXtmPSIvIgpi
-cmVha30tLWgKZj0iLyJ9fWlmKGs9PT1pJiZhLmI8PTAmJiFDLnhCLlFpKGosIi8iLGwpKXttLT1oKjMK
-Zj0iIn1xPWstbStmLmxlbmd0aApyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihqLDAsaykrZitDLnhCLnlu
-KHQsbSksYS5iLGEuYyxhLmQsbCxlK3EsYi5yK3EsYS54KX0sCnQ0OmZ1bmN0aW9uKCl7dmFyIHQscyxy
-LHEscD10aGlzCmlmKHAuYj49MCYmIXAuZ053KCkpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0
-IGEgZmlsZSBwYXRoIGZyb20gYSAiK0guZChwLmdGaSgpKSsiIFVSSSIpKQp0PXAuZgpzPXAuYQppZih0
-eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQppZih0PHMubGVuZ3RoKXtpZih0PHAucil0aHJv
-dyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgcXVl
-cnkgY29tcG9uZW50IikpCnRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBm
-cm9tIGEgVVJJIHdpdGggYSBmcmFnbWVudCBjb21wb25lbnQiKSl9cj0kLk94KCkKaWYoSC5vVChyKSl0
-PVAubW4ocCkKZWxzZXtxPXAuZAppZih0eXBlb2YgcSE9PSJudW1iZXIiKXJldHVybiBILnBZKHEpCmlm
-KHAuYzxxKUguVmooUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93cyBmaWxlIHBhdGggZnJv
-bSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5IikpCnQ9Qy54Qi5OaihzLHAuZSx0KX1yZXR1cm4g
-dH0sCmdpOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMueQpyZXR1cm4gdD09bnVsbD90aGlzLnk9Qy54Qi5n
-aSh0aGlzLmEpOnR9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKaWYodGhpcz09
-PWIpcmV0dXJuITAKcmV0dXJuIHUuRC5jKGIpJiZ0aGlzLmE9PT1iLncoMCl9LAp2czpmdW5jdGlvbigp
-e3ZhciB0PXRoaXMscz1udWxsLHI9dC5nRmkoKSxxPXQuZ2t1KCkscD10LmM+MD90LmdKZih0KTpzLG89
-dC5neEEoKT90Lmd0cCh0KTpzLG49dC5hLG09dC5mLGw9Qy54Qi5OaihuLHQuZSxtKSxrPXQucgppZih0
-eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBtLkooKQptPW08az90Lmd0UCh0KTpzCnJldHVybiBuZXcg
-UC5EbihyLHEscCxvLGwsbSxrPG4ubGVuZ3RoP3QuZ0thKCk6cyl9LAp3OmZ1bmN0aW9uKGEpe3JldHVy
-biB0aGlzLmF9LAokaWlEOjF9ClAucWUucHJvdG90eXBlPXt9ClcucUUucHJvdG90eXBlPXt9ClcuWWUu
-cHJvdG90eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5HaC5wcm90b3R5cGU9
-ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaUdoOjF9ClcuZlkucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfX0KVy5uQi5wcm90b3R5cGU9eyRpbkI6MX0KVy5B
-ei5wcm90b3R5cGU9eyRpQXo6MX0KVy5QVS5wcm90b3R5cGU9ewpnbnc6ZnVuY3Rpb24oYSl7cmV0dXJu
-IGEudmFsdWV9fQpXLlFQLnByb3RvdHlwZT17JGlRUDoxfQpXLklGLnByb3RvdHlwZT17CmdudzpmdW5j
-dGlvbihhKXtyZXR1cm4gYS52YWx1ZX19ClcubngucHJvdG90eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGEubGVuZ3RofX0KVy5SZC5wcm90b3R5cGU9ewpnbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFs
-dWV9fQpXLmtSLnByb3RvdHlwZT17JGlrUjoxfQpXLlRmLnByb3RvdHlwZT17CmdoOmZ1bmN0aW9uKGEp
-e3JldHVybiBhLmxlbmd0aH19ClcubHcucHJvdG90eXBlPXskaWx3OjF9Clcub0oucHJvdG90eXBlPXsK
-Z2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5pZC5wcm90b3R5cGU9e30KVy5Cdy5wcm90
-b3R5cGU9e30KVy5vNC5wcm90b3R5cGU9e30KVy5IUy5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXty
-ZXR1cm4gYS5sZW5ndGh9fQpXLlZvLnByb3RvdHlwZT17CmdudzpmdW5jdGlvbihhKXtyZXR1cm4gYS52
-YWx1ZX19ClcuRmgucHJvdG90eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5j
-eC5wcm90b3R5cGU9ewpnbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9fQpXLlNiLnByb3RvdHlw
-ZT17CnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVtILlNjKGIpXX0sCmdoOmZ1bmN0aW9uKGEpe3JldHVy
-biBhLmxlbmd0aH19ClcuUUYucHJvdG90eXBlPXt9ClcuTmgucHJvdG90eXBlPXsKdzpmdW5jdGlvbihh
-KXtyZXR1cm4gU3RyaW5nKGEpfX0KVy5Gdi5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4g
-YS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3Ro
-KXRocm93IEguYihQLkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlv
-bihhLGIsYyl7SC5TYyhiKQp1LnEuYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVt
-ZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sClc6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVu
-Z3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGljWDoxLAok
-aXpNOjF9ClcuSUIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUmVjdGFuZ2xlICgiK0gu
-ZChhLmxlZnQpKyIsICIrSC5kKGEudG9wKSsiKSAiK0guZCh0aGlzLmdQKGEpKSsiIHggIitILmQodGhp
-cy5nTChhKSl9LApETjpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGI9PW51bGwpcmV0dXJuITEKaWYodS5x
-LmMoYikpaWYoYS5sZWZ0PT09Yi5sZWZ0KWlmKGEudG9wPT09Yi50b3Ape3Q9Si5SRShiKQp0PXRoaXMu
-Z1AoYSk9PT10LmdQKGIpJiZ0aGlzLmdMKGEpPT09dC5nTChiKX1lbHNlIHQ9ITEKZWxzZSB0PSExCmVs
-c2UgdD0hMQpyZXR1cm4gdH0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBXLnJFKEMuQ0QuZ2koYS5sZWZ0
-KSxDLkNELmdpKGEudG9wKSxDLkNELmdpKHRoaXMuZ1AoYSkpLEMuQ0QuZ2kodGhpcy5nTChhKSkpfSwK
-Z0w6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaGVpZ2h0fSwKZ1A6ZnVuY3Rpb24oYSl7cmV0dXJuIGEud2lk
-dGh9LAokaXRuOjF9ClcuWWwucHJvdG90eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3Ro
-fSwKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKaWYoYj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBI
-LmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMp
-e0guU2MoYikKSC55KGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgYXNzaWduIGVsZW1lbnQgb2YgaW1t
-dXRhYmxlIExpc3QuIikpfSwKVzpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJu
-IEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCiRpYlE6MSwKJGlYajoxLAokaWNYOjEsCiRpek06MX0KVy5u
-Ny5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApnbnc6ZnVuY3Rpb24o
-YSl7cmV0dXJuIGEudmFsdWV9fQpXLnd6LnByb3RvdHlwZT17CmdoOmZ1bmN0aW9uKGEpe3JldHVybiB0
-aGlzLmEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe3ZhciB0CkguU2MoYikKdD10aGlzLmEKaWYoYjww
-fHxiPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LGIpCnJldHVybiB0aGlzLiR0aS5kLmIodFtiXSl9LApZ
-OmZ1bmN0aW9uKGEsYixjKXtILlNjKGIpCnRoaXMuJHRpLmQuYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fu
-bm90IG1vZGlmeSBsaXN0IikpfX0KVy5jdi5wcm90b3R5cGU9ewpnUWc6ZnVuY3Rpb24oYSl7cmV0dXJu
-IG5ldyBXLmk3KGEpfSwKZ0REOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVy5JNChhKX0sCnNERDpmdW5j
-dGlvbihhLGIpe3ZhciB0CnUuWC5iKGIpCnQ9dGhpcy5nREQoYSkKdC5WMSgwKQp0LkZWKDAsYil9LAp3
-OmZ1bmN0aW9uKGEpe3JldHVybiBhLmxvY2FsTmFtZX0sCnRuOmZ1bmN0aW9uKGEpe3ZhciB0PSEhYS5z
-Y3JvbGxJbnRvVmlld0lmTmVlZGVkCmlmKHQpYS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCkKZWxzZSBh
-LnNjcm9sbEludG9WaWV3KCl9LApuejpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0LHM9dGhpcy5yNihh
-LGMsZCxlKQpzd2l0Y2goYi50b0xvd2VyQ2FzZSgpKXtjYXNlImJlZm9yZWJlZ2luIjphLnBhcmVudE5v
-ZGUuaW5zZXJ0QmVmb3JlKHMsYSkKYnJlYWsKY2FzZSJhZnRlcmJlZ2luIjp0PWEuY2hpbGROb2Rlcwph
-Lmluc2VydEJlZm9yZShzLHQubGVuZ3RoPjA/dFswXTpudWxsKQpicmVhawpjYXNlImJlZm9yZWVuZCI6
-YS5hcHBlbmRDaGlsZChzKQpicmVhawpjYXNlImFmdGVyZW5kIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVm
-b3JlKHMsYS5uZXh0U2libGluZykKYnJlYWsKZGVmYXVsdDpILlZqKFAueFkoIkludmFsaWQgcG9zaXRp
-b24gIitiKSl9fSwKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyLHEKaWYoYz09bnVsbCl7aWYo
-ZD09bnVsbCl7dD0kLmx0CmlmKHQ9PW51bGwpe3Q9SC5WTShbXSx1Lm0pCnM9bmV3IFcudkQodCkKQy5O
-bS5BKHQsVy5UdyhudWxsKSkKQy5ObS5BKHQsVy5CbCgpKQokLmx0PXMKZD1zfWVsc2UgZD10fXQ9JC5F
-VQppZih0PT1udWxsKXt0PW5ldyBXLktvKGQpCiQuRVU9dApjPXR9ZWxzZXt0LmE9ZApjPXR9fWVsc2Ug
-aWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgidmFsaWRhdG9yIGNhbiBvbmx5IGJlIHBhc3NlZCBpZiB0
-cmVlU2FuaXRpemVyIGlzIG51bGwiKSkKaWYoJC54bz09bnVsbCl7dD1kb2N1bWVudApzPXQuaW1wbGVt
-ZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKQokLnhvPXMKJC5CTz1zLmNyZWF0ZVJhbmdlKCkK
-cz0kLnhvLmNyZWF0ZUVsZW1lbnQoImJhc2UiKQp1LmNSLmIocykKcy5ocmVmPXQuYmFzZVVSSQokLnhv
-LmhlYWQuYXBwZW5kQ2hpbGQocyl9dD0kLnhvCmlmKHQuYm9keT09bnVsbCl7cz10LmNyZWF0ZUVsZW1l
-bnQoImJvZHkiKQp0LmJvZHk9dS5rLmIocyl9dD0kLnhvCmlmKHUuay5jKGEpKXI9dC5ib2R5CmVsc2V7
-cj10LmNyZWF0ZUVsZW1lbnQoYS50YWdOYW1lKQokLnhvLmJvZHkuYXBwZW5kQ2hpbGQocil9aWYoImNy
-ZWF0ZUNvbnRleHR1YWxGcmFnbWVudCIgaW4gd2luZG93LlJhbmdlLnByb3RvdHlwZSYmIUMuTm0udGco
-Qy5TcSxhLnRhZ05hbWUpKXskLkJPLnNlbGVjdE5vZGVDb250ZW50cyhyKQpxPSQuQk8uY3JlYXRlQ29u
-dGV4dHVhbEZyYWdtZW50KGIpfWVsc2V7ci5pbm5lckhUTUw9YgpxPSQueG8uY3JlYXRlRG9jdW1lbnRG
-cmFnbWVudCgpCmZvcig7dD1yLmZpcnN0Q2hpbGQsdCE9bnVsbDspcS5hcHBlbmRDaGlsZCh0KX10PSQu
-eG8uYm9keQppZihyPT1udWxsP3QhPW51bGw6ciE9PXQpSi5MdChyKQpjLlBuKHEpCmRvY3VtZW50LmFk
-b3B0Tm9kZShxKQpyZXR1cm4gcX0sCkFIOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5yNihhLGIs
-YyxudWxsKX0sCnNoZjpmdW5jdGlvbihhLGIpe3RoaXMuWUMoYSxiKX0sCnBrOmZ1bmN0aW9uKGEsYixj
-KXthLnRleHRDb250ZW50PW51bGwKYS5hcHBlbmRDaGlsZCh0aGlzLnI2KGEsYixudWxsLGMpKX0sCllD
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKZ1ZsOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBuZXcgVy5ldShhLCJjbGljayIsITEsdS5RKX0sCiRpY3Y6MSwKZ25zOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBhLnRhZ05hbWV9fQpXLkN2LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB1Lmgu
-Yyh1LkEuYihhKSl9LAokUzoyNX0KVy5RSS5wcm90b3R5cGU9eyRpUUk6MX0KVy5lYS5wcm90b3R5cGU9
-eyRpZWE6MX0KVy5EMC5wcm90b3R5cGU9ewpPbjpmdW5jdGlvbihhLGIsYyxkKXt1LkYuYihjKQppZihj
-IT1udWxsKXRoaXMubihhLGIsYyxkKX0sCkI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLk9uKGEs
-YixjLG51bGwpfSwKbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS5hZGRFdmVudExpc3RlbmVyKGIs
-SC50Uih1LkYuYihjKSwxKSxkKX0sCiRpRDA6MX0KVy5UNS5wcm90b3R5cGU9eyRpVDU6MX0KVy5YVi5w
-cm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7
-SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIsYSxudWxsLG51
-bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC5TYyhiKQp1Lk8uYihjKQp0
-aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0s
-Clc6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJu
-IGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGljWDoxLAokaXpNOjEsCiRpWFY6MX0KVy53Si5wcm90b3R5
-cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLmg0LnByb3RvdHlwZT17CmdoOmZ1
-bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClcuR08ucHJvdG90eXBlPXskaUdPOjF9ClcuSkMucHJv
-dG90eXBlPXsKZ253OmZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfX0KVy5ici5wcm90b3R5cGU9ewpn
-aDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLnhuLnByb3RvdHlwZT17CmdoOmZ1bmN0aW9u
-KGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCmlmKGI+Pj4wIT09Ynx8
-Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19
-LApZOmZ1bmN0aW9uKGEsYixjKXtILlNjKGIpCnUuQS5iKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3Qg
-YXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxlIExpc3QuIikpfSwKVzpmdW5jdGlvbihhLGIpe2lmKGI8
-MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCiRpYlE6MSwKJGlYajox
-LAokaWNYOjEsCiRpek06MX0KVy5WYi5wcm90b3R5cGU9e30KVy5PNy5wcm90b3R5cGU9ewplbzpmdW5j
-dGlvbihhLGIsYyxkKXtyZXR1cm4gYS5vcGVuKGIsYywhMCl9LAokaU83OjF9ClcuYlUucHJvdG90eXBl
-PXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuc2V0UmVxdWVzdEhlYWRlcihILnkoYSksSC55KGIpKX0s
-CiRTOjEyfQpXLmhILnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAKdS5wLmIo
-YSkKdD10aGlzLmEKcz10LnN0YXR1cwppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLnRCKCkK
-cj1zPj0yMDAmJnM8MzAwCnE9cz4zMDcmJnM8NDAwCnM9cnx8cz09PTB8fHM9PT0zMDR8fHEKcD10aGlz
-LmIKaWYocylwLmFNKDAsdCkKZWxzZSBwLnBtKGEpfSwKJFM6Mjd9Clcud2EucHJvdG90eXBlPXt9Clcu
-U2cucHJvdG90eXBlPXskaVNnOjF9ClcuSksucHJvdG90eXBlPXsKZ253OmZ1bmN0aW9uKGEpe3JldHVy
-biBhLnZhbHVlfSwKZ1B1OmZ1bmN0aW9uKGEpe3JldHVybiBhLndlYmtpdEVudHJpZXN9fQpXLkhMLnBy
-b3RvdHlwZT17CmdHMzpmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9fQpXLndQLnByb3RvdHlwZT17Cmdu
-dzpmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX19ClcudTgucHJvdG90eXBlPXsKZ0RyOmZ1bmN0aW9u
-KGEpe2lmKCJvcmlnaW4iIGluIGEpcmV0dXJuIGEub3JpZ2luCnJldHVybiBILmQoYS5wcm90b2NvbCkr
-Ii8vIitILmQoYS5ob3N0KX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCiRpdTg6MX0K
-Vy56Ni5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLmxLLnByb3Rv
-dHlwZT17JGlsSzoxfQpXLlFiLnByb3RvdHlwZT17CmdudzpmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1
-ZX19ClcuUzAucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiBQLm1SKGEuZ2V0KEgueShi
-KSkpfSwKVTpmdW5jdGlvbihhLGIpe3ZhciB0LHMKdS5ULmIoYikKdD1hLmVudHJpZXMoKQpmb3IoOyEw
-Oyl7cz10Lm5leHQoKQppZihzLmRvbmUpcmV0dXJuCmIuJDIocy52YWx1ZVswXSxQLm1SKHMudmFsdWVb
-MV0pKX19LApndjpmdW5jdGlvbihhKXt2YXIgdD1ILlZNKFtdLHUucykKdGhpcy5VKGEsbmV3IFcuRkEo
-dCkpCnJldHVybiB0fSwKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2l6ZX0sClk6ZnVuY3Rpb24oYSxi
-LGMpe3Rocm93IEguYihQLkw0KCJOb3Qgc3VwcG9ydGVkIikpfSwKJGlaMDoxfQpXLkZBLnByb3RvdHlw
-ZT17CiQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMuTm0uQSh0aGlzLmEsYSl9LAokUzo4fQpXLnoyLnBy
-b3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5tUihhLmdldChILnkoYikpKX0sClU6ZnVu
-Y3Rpb24oYSxiKXt2YXIgdCxzCnUuVC5iKGIpCnQ9YS5lbnRyaWVzKCkKZm9yKDshMDspe3M9dC5uZXh0
-KCkKaWYocy5kb25lKXJldHVybgpiLiQyKHMudmFsdWVbMF0sUC5tUihzLnZhbHVlWzFdKSl9fSwKZ3Y6
-ZnVuY3Rpb24oYSl7dmFyIHQ9SC5WTShbXSx1LnMpCnRoaXMuVShhLG5ldyBXLnVxKHQpKQpyZXR1cm4g
-dH0sCmdoOmZ1bmN0aW9uKGEpe3JldHVybiBhLnNpemV9LApZOmZ1bmN0aW9uKGEsYixjKXt0aHJvdyBI
-LmIoUC5MNCgiTm90IHN1cHBvcnRlZCIpKX0sCiRpWjA6MX0KVy51cS5wcm90b3R5cGU9ewokMjpmdW5j
-dGlvbihhLGIpe3JldHVybiBDLk5tLkEodGhpcy5hLGEpfSwKJFM6OH0KVy5BVy5wcm90b3R5cGU9eyRp
-QVc6MX0KVy5ETS5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1
-bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNm
-KGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC5TYyhi
-KQp1LmNJLmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFi
-bGUgTGlzdC4iKSl9LApXOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5P
-SChhLGIpCnJldHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLkFqLnBy
-b3RvdHlwZT17JGlBajoxfQpXLmU3LnByb3RvdHlwZT17CmdyODpmdW5jdGlvbihhKXt2YXIgdD10aGlz
-LmEscz10LmNoaWxkTm9kZXMubGVuZ3RoCmlmKHM9PT0wKXRocm93IEguYihQLlBWKCJObyBlbGVtZW50
-cyIpKQppZihzPjEpdGhyb3cgSC5iKFAuUFYoIk1vcmUgdGhhbiBvbmUgZWxlbWVudCIpKQpyZXR1cm4g
-dC5maXJzdENoaWxkfSwKRlY6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscQp1LmVoLmIoYikKdD1iLmEK
-cz10aGlzLmEKaWYodCE9PXMpZm9yKHI9dC5jaGlsZE5vZGVzLmxlbmd0aCxxPTA7cTxyOysrcSlzLmFw
-cGVuZENoaWxkKHQuZmlyc3RDaGlsZCkKcmV0dXJufSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQKSC5T
-YyhiKQp0PXRoaXMuYQp0LnJlcGxhY2VDaGlsZCh1LkEuYihjKSxDLnQ1LnEodC5jaGlsZE5vZGVzLGIp
-KX0sCmdrejpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEuY2hpbGROb2RlcwpyZXR1cm4gbmV3IFcuVzko
-dCx0Lmxlbmd0aCxILnpLKHQpLkMoIlc5PEdtLkU+IikpfSwKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
-aXMuYS5jaGlsZE5vZGVzLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCnJldHVybiBDLnQ1
-LnEodGhpcy5hLmNoaWxkTm9kZXMsYil9fQpXLnVILnByb3RvdHlwZT17CndnOmZ1bmN0aW9uKGEpe3Zh
-ciB0PWEucGFyZW50Tm9kZQppZih0IT1udWxsKXQucmVtb3ZlQ2hpbGQoYSl9LApENDpmdW5jdGlvbihh
-KXt2YXIgdApmb3IoO3Q9YS5maXJzdENoaWxkLHQhPW51bGw7KWEucmVtb3ZlQ2hpbGQodCl9LAp3OmZ1
-bmN0aW9uKGEpe3ZhciB0PWEubm9kZVZhbHVlCnJldHVybiB0PT1udWxsP3RoaXMuVUcoYSk6dH0sCiRp
-dUg6MX0KVy5CSC5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1
-bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNm
-KGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC5TYyhi
-KQp1LkEuYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGltbXV0YWJs
-ZSBMaXN0LiIpKX0sClc6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9I
-KGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGljWDoxLAokaXpNOjF9ClcuUWwucHJv
-dG90eXBlPXsKZ253OmZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfX0KVy5HWC5wcm90b3R5cGU9ewpn
-bnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9fQpXLlNOLnByb3RvdHlwZT17fQpXLkhELnByb3Rv
-dHlwZT17CmdudzpmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX19ClcuY2wucHJvdG90eXBlPXskaWNs
-OjEsCmdoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClcuRXYucHJvdG90eXBlPXsKZ2g6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKaWYoYj4+PjAh
-PT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4g
-YVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe0guU2MoYikKdS5oZS5iKGMpCnRocm93IEguYihQLkw0KCJD
-YW5ub3QgYXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxlIExpc3QuIikpfSwKVzpmdW5jdGlvbihhLGIp
-e2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCiRpYlE6MSwK
-JGlYajoxLAokaWNYOjEsCiRpek06MX0KVy5Mci5wcm90b3R5cGU9ewpnbnc6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGEudmFsdWV9fQpXLktSLnByb3RvdHlwZT17CmdudzpmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1
-ZX19ClcuZXcucHJvdG90eXBlPXskaWV3OjF9ClcucDgucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIp
-e3JldHVybiBQLm1SKGEuZ2V0KEgueShiKSkpfSwKVTpmdW5jdGlvbihhLGIpe3ZhciB0LHMKdS5ULmIo
-YikKdD1hLmVudHJpZXMoKQpmb3IoOyEwOyl7cz10Lm5leHQoKQppZihzLmRvbmUpcmV0dXJuCmIuJDIo
-cy52YWx1ZVswXSxQLm1SKHMudmFsdWVbMV0pKX19LApndjpmdW5jdGlvbihhKXt2YXIgdD1ILlZNKFtd
-LHUucykKdGhpcy5VKGEsbmV3IFcuaWkodCkpCnJldHVybiB0fSwKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJu
-IGEuc2l6ZX0sClk6ZnVuY3Rpb24oYSxiLGMpe3Rocm93IEguYihQLkw0KCJOb3Qgc3VwcG9ydGVkIikp
-fSwKJGlaMDoxfQpXLmlpLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMuTm0uQSh0
-aGlzLmEsYSl9LAokUzo4fQpXLmxwLnByb3RvdHlwZT17CmdoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxl
-bmd0aH0sCmdudzpmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX19ClcuU1YucHJvdG90eXBlPXskaVNW
-OjF9ClcuTWsucHJvdG90eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5j
-dGlvbihhLGIpe0guU2MoYikKaWYoYj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIoUC5DZihi
-LGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe0guU2MoYikK
-dS5mWS5iKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgYXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxl
-IExpc3QuIikpfSwKVzpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0go
-YSxiKQpyZXR1cm4gYVtiXX0sCiRpYlE6MSwKJGlYajoxLAokaWNYOjEsCiRpek06MX0KVy5ZNC5wcm90
-b3R5cGU9eyRpWTQ6MX0KVy5Obi5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5n
-dGh9LApxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93
-IEguYihQLkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIs
-Yyl7SC5TYyhiKQp1LmY3LmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBv
-ZiBpbW11dGFibGUgTGlzdC4iKSl9LApXOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aCly
-ZXR1cm4gSC5PSChhLGIpCnJldHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6TTox
-fQpXLmw4LnByb3RvdHlwZT17JGlsODoxLApnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpX
-LkFzLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRJdGVtKEgueShiKSl9LApZ
-OmZ1bmN0aW9uKGEsYixjKXthLnNldEl0ZW0oYixjKX0sClU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzCnUu
-VS5iKGIpCmZvcih0PTA7ITA7Kyt0KXtzPWEua2V5KHQpCmlmKHM9PW51bGwpcmV0dXJuCmIuJDIocyxh
-LmdldEl0ZW0ocykpfX0sCmd2OmZ1bmN0aW9uKGEpe3ZhciB0PUguVk0oW10sdS5zKQp0aGlzLlUoYSxu
-ZXcgVy53USh0KSkKcmV0dXJuIHR9LApnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LAokaVow
-OjF9Clcud1EucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gQy5ObS5BKHRoaXMuYSxh
-KX0sCiRTOjE2fQpXLmJrLnByb3RvdHlwZT17CmdHMzpmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9fQpX
-LldXLnByb3RvdHlwZT17JGlXVzoxfQpXLlRiLnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQp
-e3ZhciB0LHMKaWYoImNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCIgaW4gd2luZG93LlJhbmdlLnByb3Rv
-dHlwZSlyZXR1cm4gdGhpcy5EVyhhLGIsYyxkKQp0PVcuVTkoIjx0YWJsZT4iK0guZChiKSsiPC90YWJs
-ZT4iLGMsZCkKcz1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKcy50b1N0cmluZwp0LnRv
-U3RyaW5nCm5ldyBXLmU3KHMpLkZWKDAsbmV3IFcuZTcodCkpCnJldHVybiBzfX0KVy5Jdi5wcm90b3R5
-cGU9ewpyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHIscQppZigiY3JlYXRlQ29udGV4dHVhbEZy
-YWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlKXJldHVybiB0aGlzLkRXKGEsYixjLGQpCnQ9
-ZG9jdW1lbnQKcz10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQp0PUMuSWUucjYodC5jcmVhdGVFbGVt
-ZW50KCJ0YWJsZSIpLGIsYyxkKQp0LnRvU3RyaW5nCnQ9bmV3IFcuZTcodCkKcj10LmdyOCh0KQpyLnRv
-U3RyaW5nCnQ9bmV3IFcuZTcocikKcT10LmdyOCh0KQpzLnRvU3RyaW5nCnEudG9TdHJpbmcKbmV3IFcu
-ZTcocykuRlYoMCxuZXcgVy5lNyhxKSkKcmV0dXJuIHN9fQpXLkJULnByb3RvdHlwZT17CnI2OmZ1bmN0
-aW9uKGEsYixjLGQpe3ZhciB0LHMscgppZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5k
-b3cuUmFuZ2UucHJvdG90eXBlKXJldHVybiB0aGlzLkRXKGEsYixjLGQpCnQ9ZG9jdW1lbnQKcz10LmNy
-ZWF0ZURvY3VtZW50RnJhZ21lbnQoKQp0PUMuSWUucjYodC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLGIs
-YyxkKQp0LnRvU3RyaW5nCnQ9bmV3IFcuZTcodCkKcj10LmdyOCh0KQpzLnRvU3RyaW5nCnIudG9TdHJp
-bmcKbmV3IFcuZTcocykuRlYoMCxuZXcgVy5lNyhyKSkKcmV0dXJuIHN9fQpXLmZYLnByb3RvdHlwZT17
-CnBrOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzCmEudGV4dENvbnRlbnQ9bnVsbAp0PWEuY29udGVudAp0
-LnRvU3RyaW5nCkouYlQodCkKcz10aGlzLnI2KGEsYixudWxsLGMpCmEuY29udGVudC5hcHBlbmRDaGls
-ZChzKX0sCllDOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKJGlmWDoxfQpX
-LkZCLnByb3RvdHlwZT17CmdudzpmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX19ClcuQTEucHJvdG90
-eXBlPXskaUExOjF9ClcuTU4ucHJvdG90eXBlPXskaU1OOjF9ClcuWDAucHJvdG90eXBlPXsKZ2g6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKaWYoYj4+PjAh
-PT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4g
-YVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe0guU2MoYikKdS5jNy5iKGMpCnRocm93IEguYihQLkw0KCJD
-YW5ub3QgYXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxlIExpc3QuIikpfSwKVzpmdW5jdGlvbihhLGIp
-e2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCiRpYlE6MSwK
-JGlYajoxLAokaWNYOjEsCiRpek06MX0KVy5uSi5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1
-cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVu
-Z3RoKXRocm93IEguYihQLkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5j
-dGlvbihhLGIsYyl7SC5TYyhiKQp1LmEwLmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24g
-ZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9LApXOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1h
-Lmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJldHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6
-MSwKJGl6TToxfQpXLm16LnByb3RvdHlwZT17CmdoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19
-ClcuYTMucHJvdG90eXBlPXskaWEzOjF9ClcuY2kucHJvdG90eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKaWYoYj4+PjAhPT1ifHxiPj1hLmxl
-bmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYVtiXX0sClk6ZnVu
-Y3Rpb24oYSxiLGMpe0guU2MoYikKdS5hSy5iKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgYXNzaWdu
-IGVsZW1lbnQgb2YgaW1tdXRhYmxlIExpc3QuIikpfSwKVzpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49
-YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCiRpYlE6MSwKJGlYajoxLAokaWNY
-OjEsCiRpek06MX0KVy5jbi5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9
-fQpXLnc2LnByb3RvdHlwZT17fQpXLkZqLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0
-cmluZyhhKX19ClcudkYucHJvdG90eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0K
-Vy5PaS5wcm90b3R5cGU9ewpnbVc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubG9jYXRpb259LAokaU9pOjEs
-CiRpdjY6MX0KVy5DbS5wcm90b3R5cGU9eyRpQ206MX0KVy5DUS5wcm90b3R5cGU9eyRpQ1E6MSwKZ253
-OmZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfX0KVy5QUi5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihh
-KXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+
-PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwK
-WTpmdW5jdGlvbihhLGIsYyl7SC5TYyhiKQp1Lmc1LmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBh
-c3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9LApXOmZ1bmN0aW9uKGEsYil7aWYoYjww
-fHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJldHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEs
-CiRpY1g6MSwKJGl6TToxfQpXLnc0LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlJlY3Rh
-bmdsZSAoIitILmQoYS5sZWZ0KSsiLCAiK0guZChhLnRvcCkrIikgIitILmQoYS53aWR0aCkrIiB4ICIr
-SC5kKGEuaGVpZ2h0KX0sCkROOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYj09bnVsbClyZXR1cm4hMQpp
-Zih1LnEuYyhiKSlpZihhLmxlZnQ9PT1iLmxlZnQpaWYoYS50b3A9PT1iLnRvcCl7dD1KLlJFKGIpCnQ9
-YS53aWR0aD09PXQuZ1AoYikmJmEuaGVpZ2h0PT09dC5nTChiKX1lbHNlIHQ9ITEKZWxzZSB0PSExCmVs
-c2UgdD0hMQpyZXR1cm4gdH0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBXLnJFKEMuQ0QuZ2koYS5sZWZ0
-KSxDLkNELmdpKGEudG9wKSxDLkNELmdpKGEud2lkdGgpLEMuQ0QuZ2koYS5oZWlnaHQpKX0sCmdMOmZ1
-bmN0aW9uKGEpe3JldHVybiBhLmhlaWdodH0sCmdQOmZ1bmN0aW9uKGEpe3JldHVybiBhLndpZHRofX0K
-Vy5GMi5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9u
-KGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIsYSxu
-dWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC5TYyhiKQp1LmRQ
-LmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlz
-dC4iKSl9LApXOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIp
-CnJldHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLnJoLnByb3RvdHlw
-ZT17CmdoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIp
-CmlmKGI+Pj4wIT09Ynx8Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxs
-KSkKcmV0dXJuIGFbYl19LApZOmZ1bmN0aW9uKGEsYixjKXtILlNjKGIpCnUuQS5iKGMpCnRocm93IEgu
-YihQLkw0KCJDYW5ub3QgYXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxlIExpc3QuIikpfSwKVzpmdW5j
-dGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpyZXR1cm4gYVtiXX0s
-CiRpYlE6MSwKJGlYajoxLAokaWNYOjEsCiRpek06MX0KVy5MTy5wcm90b3R5cGU9ewpnaDpmdW5jdGlv
-bihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8
-fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2Jd
-fSwKWTpmdW5jdGlvbihhLGIsYyl7SC5TYyhiKQp1LmdmLmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5v
-dCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9LApXOmZ1bmN0aW9uKGEsYil7aWYo
-YjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJldHVybiBhW2JdfSwKJGliUToxLAokaVhq
-OjEsCiRpY1g6MSwKJGl6TToxfQpXLmIxLnByb3RvdHlwZT17CmdoOmZ1bmN0aW9uKGEpe3JldHVybiBh
-Lmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCmlmKGI+Pj4wIT09Ynx8Yj49YS5sZW5ndGgp
-dGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19LApZOmZ1bmN0aW9u
-KGEsYixjKXtILlNjKGIpCnUuZ24uYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVt
-ZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sClc6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVu
-Z3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGljWDoxLAok
-aXpNOjF9ClcuYVQucHJvdG90eXBlPXsKVTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAKdS5VLmIo
-YikKZm9yKHQ9dGhpcy5ndih0aGlzKSxzPXQubGVuZ3RoLHI9dGhpcy5hLHE9MDtxPHQubGVuZ3RoO3Qu
-bGVuZ3RoPT09c3x8KDAsSC5saykodCksKytxKXtwPXRbcV0KYi4kMihwLHIuZ2V0QXR0cmlidXRlKHAp
-KX19LApndjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwPXRoaXMuYS5hdHRyaWJ1dGVzLG89SC5WTShb
-XSx1LnMpCmZvcih0PXAubGVuZ3RoLHM9dS5oOSxyPTA7cjx0Oysrcil7aWYocj49cC5sZW5ndGgpcmV0
-dXJuIEguT0gocCxyKQpxPXMuYihwW3JdKQppZihxLm5hbWVzcGFjZVVSST09bnVsbClDLk5tLkEobyxx
-Lm5hbWUpfXJldHVybiBvfX0KVy5pNy5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRo
-aXMuYS5nZXRBdHRyaWJ1dGUoSC55KGIpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYS5zZXRBdHRy
-aWJ1dGUoYixjKX0sCmdoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmd2KHRoaXMpLmxlbmd0aH19Clcu
-U3kucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEuYS5nZXRBdHRyaWJ1dGUo
-ImRhdGEtIit0aGlzLlMoSC55KGIpKSl9LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmEuYS5zZXRBdHRy
-aWJ1dGUoImRhdGEtIit0aGlzLlMoYiksYyl9LApVOmZ1bmN0aW9uKGEsYil7dGhpcy5hLlUoMCxuZXcg
-Vy5LUyh0aGlzLHUuVS5iKGIpKSl9LApndjpmdW5jdGlvbihhKXt2YXIgdD1ILlZNKFtdLHUucykKdGhp
-cy5hLlUoMCxuZXcgVy5BMyh0aGlzLHQpKQpyZXR1cm4gdH0sCmdoOmZ1bmN0aW9uKGEpe3JldHVybiB0
-aGlzLmd2KHRoaXMpLmxlbmd0aH0sCnhxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj1ILlZNKGEuc3BsaXQo
-Ii0iKSx1LnMpCmZvcih0PTE7dDxyLmxlbmd0aDsrK3Qpe3M9clt0XQppZihzLmxlbmd0aD4wKUMuTm0u
-WShyLHQsc1swXS50b1VwcGVyQ2FzZSgpK0ouS1YocywxKSl9cmV0dXJuIEMuTm0uelYociwiIil9LApT
-OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAKZm9yKHQ9YS5sZW5ndGgscz0wLHI9IiI7czx0Oysrcyl7
-cT1hW3NdCnA9cS50b0xvd2VyQ2FzZSgpCnI9KHEhPT1wJiZzPjA/cisiLSI6cikrcH1yZXR1cm4gci5j
-aGFyQ29kZUF0KDApPT0wP3I6cn19ClcuS1MucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtpZihK
-LnJZKGEpLm5DKGEsImRhdGEtIikpdGhpcy5iLiQyKHRoaXMuYS54cShDLnhCLnluKGEsNSkpLGIpfSwK
-JFM6MTJ9ClcuQTMucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtpZihKLnJZKGEpLm5DKGEsImRh
-dGEtIikpQy5ObS5BKHRoaXMuYix0aGlzLmEueHEoQy54Qi55bihhLDUpKSl9LAokUzoxMn0KVy5JNC5w
-cm90b3R5cGU9ewpERzpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9UC5Mcyh1Lk4pCmZvcih0PXRoaXMu
-YS5jbGFzc05hbWUuc3BsaXQoIiAiKSxzPXQubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUouVDAodFtyXSkK
-aWYocS5sZW5ndGghPT0wKXAuQSgwLHEpfXJldHVybiBwfSwKcDU6ZnVuY3Rpb24oYSl7dGhpcy5hLmNs
-YXNzTmFtZT11LkMuYihhKS56VigwLCIgIil9LApnaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNs
-YXNzTGlzdC5sZW5ndGh9LApWMTpmdW5jdGlvbihhKXt0aGlzLmEuY2xhc3NOYW1lPSIifSwKdGc6ZnVu
-Y3Rpb24oYSxiKXt2YXIgdD10aGlzLmEuY2xhc3NMaXN0LmNvbnRhaW5zKGIpCnJldHVybiB0fSwKQTpm
-dW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYS5jbGFzc0xpc3Qscz10LmNvbnRhaW5zKGIpCnQuYWRkKGIp
-CnJldHVybiFzfSwKUno6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzLmEuY2xhc3NMaXN0LHM9dC5jb250
-YWlucyhiKQp0LnJlbW92ZShiKQpyZXR1cm4gc30sCkZWOmZ1bmN0aW9uKGEsYil7Vy5UTih0aGlzLmEs
-dS5YLmIoYikpfX0KVy5Gay5wcm90b3R5cGU9e30KVy5STy5wcm90b3R5cGU9e30KVy5ldS5wcm90b3R5
-cGU9e30KVy54Qy5wcm90b3R5cGU9e30KVy52Ti5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1
-cm4gdGhpcy5hLiQxKHUuQi5iKGEpKX0sCiRTOjI5fQpXLkpRLnByb3RvdHlwZT17CkNZOmZ1bmN0aW9u
-KGEpe3ZhciB0CmlmKCQub3IuYT09PTApe2Zvcih0PTA7dDwyNjI7Kyt0KSQub3IuWSgwLEMuY21bdF0s
-Vy5wUygpKQpmb3IodD0wO3Q8MTI7Kyt0KSQub3IuWSgwLEMuQklbdF0sVy5WNCgpKX19LAppMDpmdW5j
-dGlvbihhKXtyZXR1cm4gJC5BTigpLnRnKDAsVy5yUyhhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7dmFy
-IHQ9JC5vci5xKDAsSC5kKFcuclMoYSkpKyI6OiIrYikKaWYodD09bnVsbCl0PSQub3IucSgwLCIqOjoi
-K2IpCmlmKHQ9PW51bGwpcmV0dXJuITEKcmV0dXJuIEgueGQodC4kNChhLGIsYyx0aGlzKSl9LAokaWtG
-OjF9ClcuR20ucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVy5XOShhLHRoaXMu
-Z2goYSksSC56SyhhKS5DKCJXOTxHbS5FPiIpKX19ClcudkQucHJvdG90eXBlPXsKaTA6ZnVuY3Rpb24o
-YSl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLlV2KGEpKX0sCkViOmZ1bmN0aW9uKGEsYixjKXty
-ZXR1cm4gQy5ObS5Wcih0aGlzLmEsbmV3IFcuRWcoYSxiLGMpKX0sCiRpa0Y6MX0KVy5Vdi5wcm90b3R5
-cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5lLmIoYSkuaTAodGhpcy5hKX0sCiRTOjE3fQpXLkVn
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB1LmUuYihhKS5FYih0aGlzLmEsdGhpcy5i
-LHRoaXMuYyl9LAokUzoxN30KVy5tNi5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihhLGIsYyxkKXt2YXIg
-dCxzLHIKdGhpcy5hLkZWKDAsYykKdD1iLmV2KDAsbmV3IFcuRW8oKSkKcz1iLmV2KDAsbmV3IFcuV2so
-KSkKdGhpcy5iLkZWKDAsdCkKcj10aGlzLmMKci5GVigwLEMueEQpCnIuRlYoMCxzKX0sCmkwOmZ1bmN0
-aW9uKGEpe3JldHVybiB0aGlzLmEudGcoMCxXLnJTKGEpKX0sCkViOmZ1bmN0aW9uKGEsYixjKXt2YXIg
-dD10aGlzLHM9Vy5yUyhhKSxyPXQuYwppZihyLnRnKDAsSC5kKHMpKyI6OiIrYikpcmV0dXJuIHQuZC5E
-dChjKQplbHNlIGlmKHIudGcoMCwiKjo6IitiKSlyZXR1cm4gdC5kLkR0KGMpCmVsc2V7cj10LmIKaWYo
-ci50ZygwLEguZChzKSsiOjoiK2IpKXJldHVybiEwCmVsc2UgaWYoci50ZygwLCIqOjoiK2IpKXJldHVy
-biEwCmVsc2UgaWYoci50ZygwLEguZChzKSsiOjoqIikpcmV0dXJuITAKZWxzZSBpZihyLnRnKDAsIio6
-OioiKSlyZXR1cm4hMH1yZXR1cm4hMX0sCiRpa0Y6MX0KVy5Fby5wcm90b3R5cGU9ewokMTpmdW5jdGlv
-bihhKXtyZXR1cm4hQy5ObS50ZyhDLkJJLEgueShhKSl9LAokUzo5fQpXLldrLnByb3RvdHlwZT17CiQx
-OmZ1bmN0aW9uKGEpe3JldHVybiBDLk5tLnRnKEMuQkksSC55KGEpKX0sCiRTOjl9ClcuY3QucHJvdG90
-eXBlPXsKRWI6ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuakYoYSxiLGMpKXJldHVybiEwCmlmKGI9PT0i
-dGVtcGxhdGUiJiZjPT09IiIpcmV0dXJuITAKaWYoYS5nZXRBdHRyaWJ1dGUoInRlbXBsYXRlIik9PT0i
-IilyZXR1cm4gdGhpcy5lLnRnKDAsYikKcmV0dXJuITF9fQpXLklBLnByb3RvdHlwZT17CiQxOmZ1bmN0
-aW9uKGEpe3JldHVybiJURU1QTEFURTo6IitILmQoSC55KGEpKX0sCiRTOjV9ClcuT3cucHJvdG90eXBl
-PXsKaTA6ZnVuY3Rpb24oYSl7dmFyIHQKaWYodS5ldy5jKGEpKXJldHVybiExCnQ9dS5nNy5jKGEpCmlm
-KHQmJlcuclMoYSk9PT0iZm9yZWlnbk9iamVjdCIpcmV0dXJuITEKaWYodClyZXR1cm4hMApyZXR1cm4h
-MX0sCkViOmZ1bmN0aW9uKGEsYixjKXtpZihiPT09ImlzInx8Qy54Qi5uQyhiLCJvbiIpKXJldHVybiEx
-CnJldHVybiB0aGlzLmkwKGEpfSwKJGlrRjoxfQpXLlc5LnByb3RvdHlwZT17Cm06ZnVuY3Rpb24oKXt2
-YXIgdD10aGlzLHM9dC5jKzEscj10LmIKaWYoczxyKXt0LnNwKEoudzIodC5hLHMpKQp0LmM9cwpyZXR1
-cm4hMH10LnNwKG51bGwpCnQuYz1yCnJldHVybiExfSwKZ1I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-ZH0sCnNwOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5kLmIoYSl9LAokaUFuOjF9ClcuZFcucHJv
-dG90eXBlPXsKZ21XOmZ1bmN0aW9uKGEpe3JldHVybiBXLnpYKHRoaXMuYS5sb2NhdGlvbil9LAokaUQw
-OjEsCiRpdjY6MX0KVy5GYi5wcm90b3R5cGU9e30KVy5rRi5wcm90b3R5cGU9e30KVy5tay5wcm90b3R5
-cGU9eyRpV1E6MX0KVy5Lby5wcm90b3R5cGU9ewpQbjpmdW5jdGlvbihhKXtuZXcgVy5mbSh0aGlzKS4k
-MihhLG51bGwpfSwKRVA6ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKUouTHQoYSkKZWxzZSBiLnJlbW92
-ZUNoaWxkKGEpfSwKSTQ6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG89ITAsbj1udWxsLG09bnVs
-bAp0cnl7bj1KLmlnKGEpCm09bi5hLmdldEF0dHJpYnV0ZSgiaXMiKQp1LmguYihhKQp0PWZ1bmN0aW9u
-KGMpe2lmKCEoYy5hdHRyaWJ1dGVzIGluc3RhbmNlb2YgTmFtZWROb2RlTWFwKSlyZXR1cm4gdHJ1ZQp2
-YXIgbD1jLmNoaWxkTm9kZXMKaWYoYy5sYXN0Q2hpbGQmJmMubGFzdENoaWxkIT09bFtsLmxlbmd0aC0x
-XSlyZXR1cm4gdHJ1ZQppZihjLmNoaWxkcmVuKWlmKCEoYy5jaGlsZHJlbiBpbnN0YW5jZW9mIEhUTUxD
-b2xsZWN0aW9ufHxjLmNoaWxkcmVuIGluc3RhbmNlb2YgTm9kZUxpc3QpKXJldHVybiB0cnVlCnZhciBr
-PTAKaWYoYy5jaGlsZHJlbilrPWMuY2hpbGRyZW4ubGVuZ3RoCmZvcih2YXIgaj0wO2o8aztqKyspe3Zh
-ciBpPWMuY2hpbGRyZW5bal0KaWYoaS5pZD09J2F0dHJpYnV0ZXMnfHxpLm5hbWU9PSdhdHRyaWJ1dGVz
-J3x8aS5pZD09J2xhc3RDaGlsZCd8fGkubmFtZT09J2xhc3RDaGlsZCd8fGkuaWQ9PSdjaGlsZHJlbid8
-fGkubmFtZT09J2NoaWxkcmVuJylyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9KGEpCm89SC5vVCh0KT8h
-MDohKGEuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCl9Y2F0Y2gocSl7SC5SdShxKX1z
-PSJlbGVtZW50IHVucHJpbnRhYmxlIgp0cnl7cz1KLmooYSl9Y2F0Y2gocSl7SC5SdShxKX10cnl7cj1X
-LnJTKGEpCnRoaXMua1IodS5oLmIoYSksYixvLHMscix1LkcuYihuKSxILnkobSkpfWNhdGNoKHEpe2lm
-KEguUnUocSkgaW5zdGFuY2VvZiBQLnUpdGhyb3cgcQplbHNle3RoaXMuRVAoYSxiKQp3aW5kb3cKcD0i
-UmVtb3ZpbmcgY29ycnVwdGVkIGVsZW1lbnQgIitILmQocykKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRl
-ZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4ocCl9fX0sCmtSOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcp
-e3ZhciB0LHMscixxLHAsbyxuPXRoaXMKaWYoYyl7bi5FUChhLGIpCndpbmRvdwp0PSJSZW1vdmluZyBl
-bGVtZW50IGR1ZSB0byBjb3JydXB0ZWQgYXR0cmlidXRlcyBvbiA8IitkKyI+IgppZih0eXBlb2YgY29u
-c29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2Fybih0KQpyZXR1cm59aWYoIW4uYS5pMChh
-KSl7bi5FUChhLGIpCndpbmRvdwp0PSJSZW1vdmluZyBkaXNhbGxvd2VkIGVsZW1lbnQgPCIrSC5kKGUp
-KyI+IGZyb20gIitILmQoYikKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25z
-b2xlLndhcm4odCkKcmV0dXJufWlmKGchPW51bGwpaWYoIW4uYS5FYihhLCJpcyIsZykpe24uRVAoYSxi
-KQp3aW5kb3cKdD0iUmVtb3ZpbmcgZGlzYWxsb3dlZCB0eXBlIGV4dGVuc2lvbiA8IitILmQoZSkrJyBp
-cz0iJytnKyciPicKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndh
-cm4odCkKcmV0dXJufXQ9Zi5ndihmKQpzPUguVk0odC5zbGljZSgwKSxILnQ2KHQpLkMoImpkPDE+Iikp
-CmZvcihyPWYuZ3YoZikubGVuZ3RoLTEsdD1mLmE7cj49MDstLXIpe2lmKHI+PXMubGVuZ3RoKXJldHVy
-biBILk9IKHMscikKcT1zW3JdCnA9bi5hCm89Si5jSChxKQpILnkocSkKaWYoIXAuRWIoYSxvLHQuZ2V0
-QXR0cmlidXRlKHEpKSl7d2luZG93CnA9IlJlbW92aW5nIGRpc2FsbG93ZWQgYXR0cmlidXRlIDwiK0gu
-ZChlKSsiICIrcSsnPSInK0guZCh0LmdldEF0dHJpYnV0ZShxKSkrJyI+JwppZih0eXBlb2YgY29uc29s
-ZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihwKQp0LnJlbW92ZUF0dHJpYnV0ZShxKX19
-aWYodS5hVy5jKGEpKW4uUG4oYS5jb250ZW50KX0sCiRpb246MX0KVy5mbS5wcm90b3R5cGU9ewokMjpm
-dW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHA9dGhpcy5hCnN3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6
-cC5JNChhLGIpCmJyZWFrCmNhc2UgODpjYXNlIDExOmNhc2UgMzpjYXNlIDQ6YnJlYWsKZGVmYXVsdDpw
-LkVQKGEsYil9dD1hLmxhc3RDaGlsZApmb3IocD11LkE7bnVsbCE9dDspe3M9bnVsbAp0cnl7cz10LnBy
-ZXZpb3VzU2libGluZ31jYXRjaChyKXtILlJ1KHIpCnE9cC5iKHQpCmEucmVtb3ZlQ2hpbGQocSkKdD1u
-dWxsCnM9YS5sYXN0Q2hpbGR9aWYodCE9bnVsbCl0aGlzLiQyKHQsYSkKdD1wLmIocyl9fSwKJFM6NDF9
-ClcuTGUucHJvdG90eXBlPXt9ClcuSlUucHJvdG90eXBlPXt9ClcueFgucHJvdG90eXBlPXt9ClcudmUu
-cHJvdG90eXBlPXt9ClcuYkcucHJvdG90eXBlPXt9ClcudEkucHJvdG90eXBlPXt9ClcuZmcucHJvdG90
-eXBlPXt9ClcuWjcucHJvdG90eXBlPXt9ClcuSFcucHJvdG90eXBlPXt9ClcubEcucHJvdG90eXBlPXt9
-ClcucXMucHJvdG90eXBlPXt9ClcuY3MucHJvdG90eXBlPXt9ClcuS0IucHJvdG90eXBlPXt9ClcuSzcu
-cHJvdG90eXBlPXt9ClcuckIucHJvdG90eXBlPXt9ClcuZlQucHJvdG90eXBlPXt9ClcuZjcucHJvdG90
-eXBlPXt9ClcuYmcucHJvdG90eXBlPXt9Clcub0gucHJvdG90eXBlPXt9ClcuQ0UucHJvdG90eXBlPXt9
-ClcuYUQucHJvdG90eXBlPXt9ClcuWngucHJvdG90eXBlPXt9ClcuT1gucHJvdG90eXBlPXt9ClcuVWou
-cHJvdG90eXBlPXt9Clcuak0ucHJvdG90eXBlPXt9ClcuUVYucHJvdG90eXBlPXt9ClcuQXcucHJvdG90
-eXBlPXt9ClcudHIucHJvdG90eXBlPXt9ClcuTzMucHJvdG90eXBlPXt9ClcuT3YucHJvdG90eXBlPXt9
-ClcuY08ucHJvdG90eXBlPXt9ClcuWUQucHJvdG90eXBlPXt9ClcuRHgucHJvdG90eXBlPXt9ClcuWFcu
-cHJvdG90eXBlPXt9Clcub2EucHJvdG90eXBlPXt9ClcuWFUucHJvdG90eXBlPXt9ClcuUnkucHJvdG90
-eXBlPXt9ClcuenYucHJvdG90eXBlPXt9ClcubnoucHJvdG90eXBlPXt9ClAuaTYucHJvdG90eXBlPXsK
-Vkg6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLmEscj1zLmxlbmd0aApmb3IodD0wO3Q8cjsrK3QpaWYo
-c1t0XT09PWEpcmV0dXJuIHQKQy5ObS5BKHMsYSkKQy5ObS5BKHRoaXMuYixudWxsKQpyZXR1cm4gcn0s
-ClB2OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPXRoaXMscD17fQppZihhPT1udWxsKXJldHVybiBhCmlm
-KEgubChhKSlyZXR1cm4gYQppZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKaWYodHlwZW9mIGE9
-PSJzdHJpbmciKXJldHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQLmlQKXJldHVybiBuZXcgRGF0ZShhLmEp
-CmlmKHUuZnYuYyhhKSl0aHJvdyBILmIoUC5TWSgic3RydWN0dXJlZCBjbG9uZSBvZiBSZWdFeHAiKSkK
-aWYodS5PLmMoYSkpcmV0dXJuIGEKaWYodS5kLmMoYSkpcmV0dXJuIGEKaWYodS5iWC5jKGEpKXJldHVy
-biBhCmlmKHUuSS5jKGEpKXJldHVybiBhCmlmKHUuYlouYyhhKXx8dS5kRC5jKGEpfHx1LmJLLmMoYSkp
-cmV0dXJuIGEKaWYodS5HLmMoYSkpe3Q9cS5WSChhKQpzPXEuYgppZih0Pj1zLmxlbmd0aClyZXR1cm4g
-SC5PSChzLHQpCnI9cC5hPXNbdF0KaWYociE9bnVsbClyZXR1cm4gcgpyPXt9CnAuYT1yCkMuTm0uWShz
-LHQscikKSi5oRShhLG5ldyBQLmxSKHAscSkpCnJldHVybiBwLmF9aWYodS5qLmMoYSkpe3Q9cS5WSChh
-KQpwPXEuYgppZih0Pj1wLmxlbmd0aClyZXR1cm4gSC5PSChwLHQpCnI9cFt0XQppZihyIT1udWxsKXJl
-dHVybiByCnJldHVybiBxLmVrKGEsdCl9aWYodS5lSC5jKGEpKXt0PXEuVkgoYSkKcz1xLmIKaWYodD49
-cy5sZW5ndGgpcmV0dXJuIEguT0gocyx0KQpyPXAuYj1zW3RdCmlmKHIhPW51bGwpcmV0dXJuIHIKcj17
-fQpwLmI9cgpDLk5tLlkocyx0LHIpCnEuaW0oYSxuZXcgUC5qZyhwLHEpKQpyZXR1cm4gcC5ifXRocm93
-IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9mIG90aGVyIHR5cGUiKSl9LAplazpmdW5jdGlvbihh
-LGIpe3ZhciB0LHM9Si5VNihhKSxyPXMuZ2goYSkscT1uZXcgQXJyYXkocikKQy5ObS5ZKHRoaXMuYixi
-LHEpCmZvcih0PTA7dDxyOysrdClDLk5tLlkocSx0LHRoaXMuUHYocy5xKGEsdCkpKQpyZXR1cm4gcX19
-ClAubFIucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYVthXT10aGlzLmIuUHYoYil9
-LAokUzoxfQpQLmpnLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLmJbYV09dGhpcy5i
-LlB2KGIpfSwKJFM6MX0KUC5hSi5wcm90b3R5cGU9ewpWSDpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMu
-YSxyPXMubGVuZ3RoCmZvcih0PTA7dDxyOysrdClpZihzW3RdPT09YSlyZXR1cm4gdApDLk5tLkEocyxh
-KQpDLk5tLkEodGhpcy5iLG51bGwpCnJldHVybiByfSwKUHY6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEs
-cCxvLG4sbSxsLGs9dGhpcyxqPXt9CmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoSC5sKGEpKXJldHVybiBh
-CmlmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gYQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJu
-IGEKaWYoYSBpbnN0YW5jZW9mIERhdGUpe3Q9YS5nZXRUaW1lKCkKcz1uZXcgUC5pUCh0LCEwKQpzLlhr
-KHQsITApCnJldHVybiBzfWlmKGEgaW5zdGFuY2VvZiBSZWdFeHApdGhyb3cgSC5iKFAuU1koInN0cnVj
-dHVyZWQgY2xvbmUgb2YgUmVnRXhwIikpCmlmKHR5cGVvZiBQcm9taXNlIT0idW5kZWZpbmVkIiYmYSBp
-bnN0YW5jZW9mIFByb21pc2UpcmV0dXJuIFAuVTgoYSx1LnopCnI9T2JqZWN0LmdldFByb3RvdHlwZU9m
-KGEpCmlmKHI9PT1PYmplY3QucHJvdG90eXBlfHxyPT09bnVsbCl7cT1rLlZIKGEpCnM9ay5iCmlmKHE+
-PXMubGVuZ3RoKXJldHVybiBILk9IKHMscSkKcD1qLmE9c1txXQppZihwIT1udWxsKXJldHVybiBwCm89
-dS56CnA9UC5GbChvLG8pCmouYT1wCkMuTm0uWShzLHEscCkKay5IcChhLG5ldyBQLks1KGosaykpCnJl
-dHVybiBqLmF9aWYoYSBpbnN0YW5jZW9mIEFycmF5KXtuPWEKcT1rLlZIKG4pCnM9ay5iCmlmKHE+PXMu
-bGVuZ3RoKXJldHVybiBILk9IKHMscSkKcD1zW3FdCmlmKHAhPW51bGwpcmV0dXJuIHAKbz1KLlU2KG4p
-Cm09by5naChuKQpDLk5tLlkocyxxLG4pCmZvcihsPTA7bDxtOysrbClvLlkobixsLGsuUHYoby5xKG4s
-bCkpKQpyZXR1cm4gbn1yZXR1cm4gYX19ClAuSzUucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2
-YXIgdD10aGlzLmEuYSxzPXRoaXMuYi5QdihiKQpKLkIyKHQsYSxzKQpyZXR1cm4gc30sCiRTOjMzfQpQ
-LkJmLnByb3RvdHlwZT17CmltOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEKdS5ZLmIoYikKZm9yKHQ9
-T2JqZWN0LmtleXMoYSkscz10Lmxlbmd0aCxyPTA7cjxzOysrcil7cT10W3JdCmIuJDIocSxhW3FdKX19
-fQpQLnpnLnByb3RvdHlwZT17CkhwOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEKdS5ZLmIoYikKZm9y
-KHQ9T2JqZWN0LmtleXMoYSkscz10Lmxlbmd0aCxyPTA7cjx0Lmxlbmd0aDt0Lmxlbmd0aD09PXN8fCgw
-LEgubGspKHQpLCsrcil7cT10W3JdCmIuJDIocSxhW3FdKX19fQpQLmRNLnByb3RvdHlwZT17ClZMOmZ1
-bmN0aW9uKGEpe3ZhciB0CkgueShhKQp0PSQuaEcoKS5iCmlmKHR5cGVvZiBhIT0ic3RyaW5nIilILlZq
-KEgudEwoYSkpCmlmKHQudGVzdChhKSlyZXR1cm4gYQp0aHJvdyBILmIoUC5MMyhhLCJ2YWx1ZSIsIk5v
-dCBhIHZhbGlkIGNsYXNzIHRva2VuIikpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ERygpLnpW
-KDAsIiAiKX0sCmdrejpmdW5jdGlvbihhKXt2YXIgdD10aGlzLkRHKCkKcmV0dXJuIFAucmoodCx0LnIs
-SC5MaCh0KS5kKX0sCmdoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkRHKCkuYX0sCnRnOmZ1bmN0aW9u
-KGEsYil7dGhpcy5WTChiKQpyZXR1cm4gdGhpcy5ERygpLnRnKDAsYil9LApBOmZ1bmN0aW9uKGEsYil7
-dGhpcy5WTChiKQpyZXR1cm4gSC54ZCh0aGlzLk9TKDAsbmV3IFAuR0UoYikpKX0sClJ6OmZ1bmN0aW9u
-KGEsYil7dmFyIHQscwp0aGlzLlZMKGIpCnQ9dGhpcy5ERygpCnM9dC5SeigwLGIpCnRoaXMucDUodCkK
-cmV0dXJuIHN9LApGVjpmdW5jdGlvbihhLGIpe3RoaXMuT1MoMCxuZXcgUC5ONyh0aGlzLHUuWC5iKGIp
-KSl9LApWMTpmdW5jdGlvbihhKXt0aGlzLk9TKDAsbmV3IFAudVEoKSl9LApPUzpmdW5jdGlvbihhLGIp
-e3ZhciB0LHMKdS5jaC5iKGIpCnQ9dGhpcy5ERygpCnM9Yi4kMSh0KQp0aGlzLnA1KHQpCnJldHVybiBz
-fX0KUC5HRS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5DLmIoYSkuQSgwLHRoaXMu
-YSl9LAokUzozNH0KUC5ONy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmIscz1I
-LnQ2KHQpCnJldHVybiB1LkMuYihhKS5GVigwLG5ldyBILkE4KHQscy5DKCJxVSgxKSIpLmIodGhpcy5h
-Lmd1TSgpKSxzLkMoIkE4PDEscVU+IikpKX0sCiRTOjE0fQpQLnVRLnByb3RvdHlwZT17CiQxOmZ1bmN0
-aW9uKGEpe3UuQy5iKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEuZD1hLmU9YS5mPW51bGwKYS5hPTAKYS5Y
-QSgpfXJldHVybiBudWxsfSwKJFM6MTR9ClAuVzIucHJvdG90eXBlPXsKZ0czOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBhLmtleX19ClAuZTMucHJvdG90eXBlPXsKZ253OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC56
-ZyhbXSxbXSkuUHYoYS52YWx1ZSl9fQpQLmhGLnByb3RvdHlwZT17JGloRjoxfQpQLkJWLnByb3RvdHlw
-ZT17CmdHMzpmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9LApnbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEu
-dmFsdWV9fQpQLlBDLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0CnUuWi5iKGEpCnQ9ZnVu
-Y3Rpb24oYixjLGQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiKGMsZCx0aGlzLEFycmF5LnByb3Rv
-dHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpKX19KFAuUjQsYSwhMSkKUC5EbSh0LCQudygpLGEpCnJl
-dHVybiB0fSwKJFM6NH0KUC5tdC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IHRo
-aXMuYShhKX0sCiRTOjR9ClAuTnoucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQ
-LnI3KGEpfSwKJFM6MzZ9ClAubnAucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQ
-LlR6KGEsdS5hbSl9LAokUzozN30KUC5VdC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4g
-bmV3IFAuRTQoYSl9LAokUzozOH0KUC5FNC5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7aWYodHlw
-ZW9mIGIhPSJzdHJpbmciJiZ0eXBlb2YgYiE9Im51bWJlciIpdGhyb3cgSC5iKFAueFkoInByb3BlcnR5
-IGlzIG5vdCBhIFN0cmluZyBvciBudW0iKSkKcmV0dXJuIFAuTDcodGhpcy5hW2JdKX0sClk6ZnVuY3Rp
-b24oYSxiLGMpe2lmKHR5cGVvZiBiIT0ic3RyaW5nIiYmdHlwZW9mIGIhPSJudW1iZXIiKXRocm93IEgu
-YihQLnhZKCJwcm9wZXJ0eSBpcyBub3QgYSBTdHJpbmcgb3IgbnVtIikpCnRoaXMuYVtiXT1QLndZKGMp
-fSwKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2Yg
-UC5FNCYmdGhpcy5hPT09Yi5hfSwKdzpmdW5jdGlvbihhKXt2YXIgdCxzCnRyeXt0PVN0cmluZyh0aGlz
-LmEpCnJldHVybiB0fWNhdGNoKHMpe0guUnUocykKdD10aGlzLnhiKDApCnJldHVybiB0fX0sClY3OmZ1
-bmN0aW9uKGEsYil7dmFyIHQscz10aGlzLmEKaWYoYj09bnVsbCl0PW51bGwKZWxzZXt0PUgudDYoYikK
-dD1QLkNIKG5ldyBILkE4KGIsdC5DKCJAKDEpIikuYihQLmlHKCkpLHQuQygiQTg8MSxAPiIpKSwhMCx1
-LnopfXJldHVybiBQLkw3KHNbYV0uYXBwbHkocyx0KSl9LApnaTpmdW5jdGlvbihhKXtyZXR1cm4gMH19
-ClAucjcucHJvdG90eXBlPXt9ClAuVHoucHJvdG90eXBlPXsKY1A6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhp
-cyxzPWE8MHx8YT49dC5naCh0KQppZihzKXRocm93IEguYihQLlRFKGEsMCx0LmdoKHQpLG51bGwsbnVs
-bCkpfSwKcTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiPT0ibnVtYmVyIiYmYj09PUMuam4ueXUoYikp
-dGhpcy5jUChILlNjKGIpKQpyZXR1cm4gdGhpcy4kdGkuZC5iKHRoaXMuVXIoMCxiKSl9LApZOmZ1bmN0
-aW9uKGEsYixjKXt0aGlzLiR0aS5kLmIoYykKaWYodHlwZW9mIGI9PSJudW1iZXIiJiZiPT09Qy5DRC55
-dShiKSl0aGlzLmNQKEguU2MoYikpCnRoaXMuZTQoMCxiLGMpfSwKZ2g6ZnVuY3Rpb24oYSl7dmFyIHQ9
-dGhpcy5hLmxlbmd0aAppZih0eXBlb2YgdD09PSJudW1iZXIiJiZ0Pj4+MD09PXQpcmV0dXJuIHQKdGhy
-b3cgSC5iKFAuUFYoIkJhZCBKc0FycmF5IGxlbmd0aCIpKX0sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9
-ClAuY28ucHJvdG90eXBlPXt9ClAudksucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
-aXMuYS5hTSgwLHRoaXMuYi5DKCIwLyIpLmIoYSkpfSwKJFM6MTB9ClAucFUucHJvdG90eXBlPXsKJDE6
-ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5wbShhKX0sCiRTOjEwfQpQLklOLnByb3RvdHlwZT17fQpQ
-LnRuLnByb3RvdHlwZT17fQpQLnVqLnByb3RvdHlwZT17CmdudzpmdW5jdGlvbihhKXtyZXR1cm4gYS52
-YWx1ZX19ClAueDAucHJvdG90eXBlPXskaXgwOjEsCmdudzpmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1
-ZX19ClAucTYucHJvdG90eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5j
-dGlvbihhLGIpe0guU2MoYikKaWYoYj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIoUC5DZihi
-LGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYS5nZXRJdGVtKGIpfSwKWTpmdW5jdGlvbihhLGIsYyl7
-SC5TYyhiKQp1LmJHLmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBp
-bW11dGFibGUgTGlzdC4iKSl9LApXOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucShhLGIpfSwKJGli
-UToxLAokaWNYOjEsCiRpek06MX0KUC51UC5wcm90b3R5cGU9eyRpdVA6MSwKZ253OmZ1bmN0aW9uKGEp
-e3JldHVybiBhLnZhbHVlfX0KUC5mei5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5s
-ZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRo
-cm93IEguYihQLkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhLmdldEl0ZW0oYil9LApZOmZ1
-bmN0aW9uKGEsYixjKXtILlNjKGIpCnUuY2suYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2ln
-biBlbGVtZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sClc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhp
-cy5xKGEsYil9LAokaWJROjEsCiRpY1g6MSwKJGl6TToxfQpQLkVELnByb3RvdHlwZT17CmdoOmZ1bmN0
-aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClAubmQucHJvdG90eXBlPXskaW5kOjF9ClAuS3EucHJvdG90
-eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guU2Mo
-YikKaWYoYj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51
-bGwpKQpyZXR1cm4gYS5nZXRJdGVtKGIpfSwKWTpmdW5jdGlvbihhLGIsYyl7SC5TYyhiKQpILnkoYykK
-dGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9
-LApXOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucShhLGIpfSwKJGliUToxLAokaWNYOjEsCiRpek06
-MX0KUC5LZS5wcm90b3R5cGU9ewpERzpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcy5hLmdldEF0
-dHJpYnV0ZSgiY2xhc3MiKSxvPVAuTHModS5OKQppZihwPT1udWxsKXJldHVybiBvCmZvcih0PXAuc3Bs
-aXQoIiAiKSxzPXQubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUouVDAodFtyXSkKaWYocS5sZW5ndGghPT0w
-KW8uQSgwLHEpfXJldHVybiBvfSwKcDU6ZnVuY3Rpb24oYSl7dGhpcy5hLnNldEF0dHJpYnV0ZSgiY2xh
-c3MiLGEuelYoMCwiICIpKX19ClAuZDUucHJvdG90eXBlPXsKZ0REOmZ1bmN0aW9uKGEpe3JldHVybiBu
-ZXcgUC5LZShhKX0sCnNoZjpmdW5jdGlvbihhLGIpe3RoaXMuWUMoYSxiKX0sCnI2OmZ1bmN0aW9uKGEs
-YixjLGQpe3ZhciB0LHMscixxLHAsbwppZihkPT1udWxsKXt0PUguVk0oW10sdS5tKQpkPW5ldyBXLnZE
-KHQpCkMuTm0uQSh0LFcuVHcobnVsbCkpCkMuTm0uQSh0LFcuQmwoKSkKQy5ObS5BKHQsbmV3IFcuT3co
-KSl9Yz1uZXcgVy5LbyhkKQpzPSc8c3ZnIHZlcnNpb249IjEuMSI+JytILmQoYikrIjwvc3ZnPiIKdD1k
-b2N1bWVudApyPXQuYm9keQpxPShyJiZDLlJZKS5BSChyLHMsYykKcD10LmNyZWF0ZURvY3VtZW50RnJh
-Z21lbnQoKQpxLnRvU3RyaW5nCnQ9bmV3IFcuZTcocSkKbz10LmdyOCh0KQpmb3IoO3Q9by5maXJzdENo
-aWxkLHQhPW51bGw7KXAuYXBwZW5kQ2hpbGQodCkKcmV0dXJuIHB9LApuejpmdW5jdGlvbihhLGIsYyxk
-LGUpe3Rocm93IEguYihQLkw0KCJDYW5ub3QgaW52b2tlIGluc2VydEFkamFjZW50SHRtbCBvbiBTVkcu
-IikpfSwKZ1ZsOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVy5ldShhLCJjbGljayIsITEsdS5RKX0sCiRp
-ZDU6MX0KUC56WS5wcm90b3R5cGU9eyRpelk6MX0KUC5OQy5wcm90b3R5cGU9ewpnaDpmdW5jdGlvbihh
-KXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+
-PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhLmdldEl0
-ZW0oYil9LApZOmZ1bmN0aW9uKGEsYixjKXtILlNjKGIpCnUuY00uYihjKQp0aHJvdyBILmIoUC5MNCgi
-Q2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sClc6ZnVuY3Rpb24oYSxi
-KXtyZXR1cm4gdGhpcy5xKGEsYil9LAokaWJROjEsCiRpY1g6MSwKJGl6TToxfQpQLmZVLnByb3RvdHlw
-ZT17fQpQLkdDLnByb3RvdHlwZT17fQpQLmpHLnByb3RvdHlwZT17fQpQLmpTLnByb3RvdHlwZT17fQpQ
-LnhXLnByb3RvdHlwZT17fQpQLmRTLnByb3RvdHlwZT17fQpQLndqLnByb3RvdHlwZT17fQpQLk1ZLnBy
-b3RvdHlwZT17fQpQLm42LnByb3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXpNOjEsJGlBUzoxfQpQLnIy
-LnByb3RvdHlwZT17CmdoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClAuck8ucHJvdG90eXBl
-PXsKZ253OmZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfX0KUC56OC5wcm90b3R5cGU9ewpxOmZ1bmN0
-aW9uKGEsYil7cmV0dXJuIFAubVIoYS5nZXQoSC55KGIpKSl9LApVOmZ1bmN0aW9uKGEsYil7dmFyIHQs
-cwp1LlQuYihiKQp0PWEuZW50cmllcygpCmZvcig7ITA7KXtzPXQubmV4dCgpCmlmKHMuZG9uZSlyZXR1
-cm4KYi4kMihzLnZhbHVlWzBdLFAubVIocy52YWx1ZVsxXSkpfX0sCmd2OmZ1bmN0aW9uKGEpe3ZhciB0
-PUguVk0oW10sdS5zKQp0aGlzLlUoYSxuZXcgUC5xZih0KSkKcmV0dXJuIHR9LApnaDpmdW5jdGlvbihh
-KXtyZXR1cm4gYS5zaXplfSwKWTpmdW5jdGlvbihhLGIsYyl7dGhyb3cgSC5iKFAuTDQoIk5vdCBzdXBw
-b3J0ZWQiKSl9LAokaVowOjF9ClAucWYucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-Qy5ObS5BKHRoaXMuYSxhKX0sCiRTOjh9ClAuZm8ucHJvdG90eXBlPXsKZ2g6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGEubGVuZ3RofX0KUC5WOC5wcm90b3R5cGU9e30KUC5Hbi5wcm90b3R5cGU9ewpnaDpmdW5jdGlv
-bihhKXtyZXR1cm4gYS5sZW5ndGh9fQpQLlUzLnByb3RvdHlwZT17fQpQLkZuLnByb3RvdHlwZT17Cmdo
-OmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCmlmKGI+
-Pj4wIT09Ynx8Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0
-dXJuIFAubVIoYS5pdGVtKGIpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe0guU2MoYikKdS5HLmIoYykKdGhy
-b3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9LApX
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucShhLGIpfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0K
-UC5tby5wcm90b3R5cGU9e30KUC5LZy5wcm90b3R5cGU9e30KVS5kMi5wcm90b3R5cGU9e30KVS5TZS5w
-cm90b3R5cGU9e30KVS5NbC5wcm90b3R5cGU9e30KVS55RC5wcm90b3R5cGU9ewpnUHU6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuYn19ClUud2IucHJvdG90eXBlPXt9CkIuajgucHJvdG90eXBlPXt9CkIucXAu
-cHJvdG90eXBlPXt9ClQubVEucHJvdG90eXBlPXt9CkwuZS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
-KXt2YXIgdCxzLHIscSxwLG8sbgp1LkIuYihhKQp0PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpzPUwu
-RzYod2luZG93LmxvY2F0aW9uLmhyZWYpCnI9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKTC5HZSgp
-CmlmKHQhPT0iLyImJnQhPT1KLlQwKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENv
-bnRlbnQpKUwuRzcodCxzLHIsITAsbmV3IEwuVlcodCxzLHIpKQpxPWRvY3VtZW50CnA9Si5xRihxLnF1
-ZXJ5U2VsZWN0b3IoIi5hcHBseS1taWdyYXRpb24iKSkKbz1wLiR0aQpuPW8uQygifigxKSIpLmIobmV3
-IEwub1ooKSkKdS5NLmIobnVsbCkKVy5KRShwLmEscC5iLG4sITEsby5kKQpxPUoucUYocS5xdWVyeVNl
-bGVjdG9yKCIucmVydW4tbWlncmF0aW9uIikpCm89cS4kdGkKVy5KRShxLmEscS5iLG8uQygifigxKSIp
-LmIobmV3IEwueTgoKSksITEsby5kKX0sCiRTOjIwfQpMLlZXLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9u
-KCl7TC5Gcih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LAokUzowfQpMLm9aLnByb3RvdHlwZT17CiQxOmZ1
-bmN0aW9uKGEpe3UuVi5iKGEpCmlmKEgub1Qod2luZG93LmNvbmZpcm0oIlRoaXMgd2lsbCBhcHBseSB0
-aGUgY2hhbmdlcyB5b3UndmUgcHJldmlld2VkIHRvIHlvdXIgd29ya2luZyBkaXJlY3RvcnkuIEl0IGlz
-IHJlY29tbWVuZGVkIHlvdSBjb21taXQgYW55IGNoYW5nZXMgeW91IG1hZGUgYmVmb3JlIGRvaW5nIHRo
-aXMuIikpKUwudHkoIi9hcHBseS1taWdyYXRpb24iKS5XNyhuZXcgTC5qcigpLHUuUCkuT0EobmV3IEwu
-cWwoKSl9LAokUzo2fQpMLmpyLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0CnUuci5iKGEp
-CnQ9ZG9jdW1lbnQuYm9keQp0LmNsYXNzTGlzdC5yZW1vdmUoInByb3Bvc2VkIikKdC5jbGFzc0xpc3Qu
-YWRkKCJhcHBsaWVkIil9LAokUzo3fQpMLnFsLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7TC5x
-SigiYXBwbHkgbWlncmF0aW9uIGVycm9yOiAiK0guZChhKSxiKQp3aW5kb3cuYWxlcnQoIkNvdWxkIG5v
-dCBhcHBseSBtaWdyYXRpb24gKCIrSC5kKGEpKyIpLiIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MX0KTC55
-OC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54bih1LlYuYihhKSl9LAp4bjpm
-dW5jdGlvbihhKXt2YXIgdD0wLHM9UC5GWCh1LlApLHI9MSxxLHA9W10sbyxuLG0sbAp2YXIgJGFzeW5j
-JCQxPVAubHooZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cT1jCnQ9cn13aGlsZSh0cnVlKXN3aXRjaCh0
-KXtjYXNlIDA6cj0zCmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicmVydW5uaW5nIikKdD02CnJl
-dHVybiBQLmpRKEwudHkoIi9yZXJ1bi1taWdyYXRpb24iKSwkYXN5bmMkJDEpCmNhc2UgNjp3aW5kb3cu
-bG9jYXRpb24ucmVsb2FkKCkKcC5wdXNoKDUpCnQ9NApicmVhawpjYXNlIDM6cj0yCmw9cQpvPUguUnUo
-bCkKbj1ILnRzKGwpCkwucUooInJlcnVuIG1pZ3JhdGlvbjogIitILmQobyksbikKd2luZG93LmFsZXJ0
-KCJGYWlsZWQgdG8gcmVydW4gbWlncmF0aW9uOiAiK0guZChvKSsiLiIpCnAucHVzaCg1KQp0PTQKYnJl
-YWsKY2FzZSAyOnA9WzFdCmNhc2UgNDpyPTEKZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJy
-ZXJ1bm5pbmciKQp0PXAucG9wKCkKYnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51bGwscykKY2FzZSAx
-OnJldHVybiBQLmYzKHEscyl9fSkKcmV0dXJuIFAuREkoJGFzeW5jJCQxLHMpfSwKJFM6NDJ9CkwuTC5w
-cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIKdS5CLmIoYSkKdD13aW5kb3cubG9jYXRp
-b24ucGF0aG5hbWUKcz1MLkc2KHdpbmRvdy5sb2NhdGlvbi5ocmVmKQpyPUwuYUsod2luZG93LmxvY2F0
-aW9uLmhyZWYpCmlmKHQubGVuZ3RoPjEpTC5HNyh0LHMsciwhMSxudWxsKQplbHNle0wuQkUodCxuZXcg
-Qi5xcCgiIiwiIiwiIixDLkNNKSwhMCkKTC5CWCgiJm5ic3A7IixudWxsKX19LAokUzoyMH0KTC5XeC5w
-cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT0iY29sbGFwc2VkIgp1LlYuYihhKQp0
-PXRoaXMuYQpzPUouUkUodCkKcj10aGlzLmIKaWYoIXMuZ0REKHQpLnRnKDAscSkpe3MuZ0REKHQpLkEo
-MCxxKQpKLmRSKHIpLkEoMCxxKX1lbHNle3MuZ0REKHQpLlJ6KDAscSkKSi5kUihyKS5SeigwLHEpfX0s
-CiRTOjZ9CkwuQU8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9Si5xRih1LmguYihhKSks
-cz10LiR0aSxyPXMuQygifigxKSIpLmIobmV3IEwuZE4odGhpcy5hKSkKdS5NLmIobnVsbCkKVy5KRSh0
-LmEsdC5iLHIsITEscy5kKX0sCiRTOjN9CkwuZE4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFy
-IHQKdS5WLmIoYSkKdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0YWJsZVtkYXRhLXBhdGhdIikKdC50
-b1N0cmluZwpMLnQyKGEsdGhpcy5hLHQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcu
-aTcodCkpLlMoInBhdGgiKSkpfSwKJFM6Nn0KTC5Iby5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2
-YXIgdCxzLHIKdS5oLmIoYSkKdD1KLnFGKGEpCnM9dC4kdGkKcj1zLkMoIn4oMSkiKS5iKG5ldyBMLnh6
-KGEsdGhpcy5hKSkKdS5NLmIobnVsbCkKVy5KRSh0LmEsdC5iLHIsITEscy5kKX0sCiRTOjN9CkwueHou
-cHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscz1udWxsCnUuVi5iKGEpCnQ9dGhpcy5hCkwu
-aFgodGhpcy5iLFAuUUEodC5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyh0KSku
-Uygib2Zmc2V0IikpLHMscyksUC5RQSh0LmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBX
-Lmk3KHQpKS5TKCJsaW5lIikpLHMscykpfSwKJFM6Nn0KTC5JQy5wcm90b3R5cGU9ewokMTpmdW5jdGlv
-bihhKXt2YXIgdD1KLnFGKHUuaC5iKGEpKSxzPXQuJHRpCnMuQygifigxKSIpLmIoTC5IMCgpKQp1Lk0u
-YihudWxsKQpXLkpFKHQuYSx0LmIsTC5IMCgpLCExLHMuZCl9LAokUzozfQpMLkwxLnByb3RvdHlwZT17
-CiQxOmZ1bmN0aW9uKGEpe3ZhciB0CnUuci5iKGEpCnQ9YS5zdGF0dXMKaWYodD09PTIwMClyZXR1cm4g
-YQplbHNlIHRocm93IEguYigiUmVxdWVzdCBmYWlsZWQ7IHN0YXR1cyBvZiAiK0guZCh0KSl9LAokUzo0
-NH0KTC5uVC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wuRnIodGhpcy5hLmEsdGhpcy5iLHRoaXMu
-Yyl9LAokUzowfQpMLkJaLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih0aGlzLmEuYSxudWxs
-LG51bGwpfSwKJFM6MH0KTC5HSC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt1LmguYihhKQokLnpC
-KCkudG9TdHJpbmcKdS52LmIoJC5vdygpLnEoMCwiaGxqcyIpKS5WNygiaGlnaGxpZ2h0QmxvY2siLFth
-XSl9LAokUzozfQpMLkRULnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMKdS5yLmIoYSkK
-dD1hLnN0YXR1cwppZih0PT09MjAwKXt0PUMuQ3QucFcoMCxhLnJlc3BvbnNlVGV4dCxudWxsKQpzPUou
-VTYodCkKTC5UMShuZXcgVS5kMihVLmpmKHMucSh0LCJlZGl0cyIpKSxILnkocy5xKHQsImV4cGxhbmF0
-aW9uIikpLEguU2Mocy5xKHQsImxpbmUiKSksSC55KHMucSh0LCJwYXRoIikpLFUuTmQocy5xKHQsInRy
-YWNlcyIpKSkpCkwuRnIodGhpcy5hLHRoaXMuYix0aGlzLmMpCkwueVgoIi5lZGl0LXBhbmVsIC5wYW5l
-bC1jb250ZW50IiwhMSl9ZWxzZSB3aW5kb3cuYWxlcnQoIlJlcXVlc3QgZmFpbGVkOyBzdGF0dXMgb2Yg
-IitILmQodCkpfSwKJFM6N30KTC5lSC5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe0wucUooImxv
-YWRSZWdpb25FeHBsYW5hdGlvbjogIitILmQoYSksYikKd2luZG93LmFsZXJ0KCJDb3VsZCBub3QgbG9h
-ZCAiK0guZCh0aGlzLmEpKyIgKCIrSC5kKGEpKyIpLiIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MX0KTC55
-dS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzLHI9dGhpcwp1LnIuYihhKQp0PWEuc3Rh
-dHVzCmlmKHQ9PT0yMDApe3M9ci5hCkwuQkUocyxCLllmKHUuYi5iKEMuQ3QucFcoMCxhLnJlc3BvbnNl
-VGV4dCxudWxsKSkpLHIuYikKdD1yLmMKTC5mRyh0LHIuZCkKTC5CWChDLnhCLnRnKHMsIj8iKT9DLnhC
-Lk5qKHMsMCxDLnhCLk9ZKHMsIj8iKSk6cyx0KQp0PXIuZQppZih0IT1udWxsKXQuJDAoKX1lbHNlIHdp
-bmRvdy5hbGVydCgiUmVxdWVzdCBmYWlsZWQ7IHN0YXR1cyBvZiAiK0guZCh0KSl9LAokUzo3fQpMLnpE
-LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7TC5xSigibG9hZEZpbGU6ICIrSC5kKGEpLGIpCndp
-bmRvdy5hbGVydCgiQ291bGQgbm90IGxvYWQgIit0aGlzLmErIiAoIitILmQoYSkrIikuIil9LAokQzoi
-JDIiLAokUjoyLAokUzoxfQpMLlRXLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscgp1
-LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0yMDApe3M9Qy5DdC5wVygwLGEucmVzcG9uc2VUZXh0LG51
-bGwpCnI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm5hdi10cmVlIikKSi5sNShyLCIiKQpMLnRYKHIs
-TC5tSyhzKSl9ZWxzZSB3aW5kb3cuYWxlcnQoIlJlcXVlc3QgZmFpbGVkOyBzdGF0dXMgb2YgIitILmQo
-dCkpfSwKJFM6N30KTC54ci5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe0wucUooImxvYWROYXZp
-Z2F0aW9uVHJlZTogIitILmQoYSksYikKd2luZG93LmFsZXJ0KCJDb3VsZCBub3QgbG9hZCAiK3RoaXMu
-YSsiICgiK0guZChhKSsiKS4iKX0sCiRDOiIkMiIsCiRSOjIsCiRTOjF9CkwuRUUucHJvdG90eXBlPXsK
-JDE6ZnVuY3Rpb24oYSl7dmFyIHQscwp1LlYuYihhKQp0PXRoaXMuYQpzPXRoaXMuYgpMLmFmKHdpbmRv
-dy5sb2NhdGlvbi5wYXRobmFtZSx0LHMsITAsbmV3IEwuUUwodCxzKSkKTC5oWCh0aGlzLmMsdCxzKX0s
-CiRTOjZ9CkwuUUwucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHdpbmRvdy5sb2NhdGlvbi5w
-YXRobmFtZSx0aGlzLmEsdGhpcy5iKX0sCiRTOjB9CkwuVlMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24o
-YSl7dmFyIHQscz0ic2VsZWN0ZWQtZmlsZSIKdS5oLmIoYSkKYS50b1N0cmluZwp0PUouUkUoYSkKaWYo
-YS5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhhKSkuUygibmFtZSIpKT09PXRo
-aXMuYS5hKXQuZ0REKGEpLkEoMCxzKQplbHNlIHQuZ0REKGEpLlJ6KDAscyl9LAokUzozfQpMLlRELnBy
-b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBMLnQyKHUuVi5iKGEpLCEwLG51bGwpfSwKJFM6
-MjF9CkwuWEEucHJvdG90eXBlPXsKRWI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiEwfSwKaTA6ZnVuY3Rp
-b24oYSl7cmV0dXJuITB9LAokaWtGOjF9CkwuWloucHJvdG90eXBlPXt9CkwuQmMucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ifX0KTS5sSS5wcm90b3R5cGU9ewpXTzpmdW5jdGlvbihh
-LGIpe3ZhciB0LHM9bnVsbApNLllGKCJhYnNvbHV0ZSIsSC5WTShbYixudWxsLG51bGwsbnVsbCxudWxs
-LG51bGwsbnVsbF0sdS5zKSkKdD10aGlzLmEKdD10LllyKGIpPjAmJiF0LmhLKGIpCmlmKHQpcmV0dXJu
-IGIKdD1ELlJYKCkKcmV0dXJuIHRoaXMucTcoMCx0LGIscyxzLHMscyxzLHMpfSwKdE06ZnVuY3Rpb24o
-YSl7dmFyIHQscyxyPVguQ0woYSx0aGlzLmEpCnIuSVYoKQp0PXIuZApzPXQubGVuZ3RoCmlmKHM9PT0w
-KXt0PXIuYgpyZXR1cm4gdD09bnVsbD8iLiI6dH1pZihzPT09MSl7dD1yLmIKcmV0dXJuIHQ9PW51bGw/
-Ii4iOnR9aWYoMD49cylyZXR1cm4gSC5PSCh0LC0xKQp0LnBvcCgpCkMuTm0ubXYoci5lKQpyLklWKCkK
-cmV0dXJuIHIudygwKX0sCnE3OmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXt2YXIgdD1ILlZNKFti
-LGMsZCxlLGYsZyxoLGldLHUucykKTS5ZRigiam9pbiIsdCkKcmV0dXJuIHRoaXMuSVAobmV3IEguVTUo
-dCx1LmJCLmIobmV3IE0uTWkoKSksdS5jYykpfSwKSVA6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxv
-LG4sbSxsCnUuWC5iKGEpCmZvcih0PWEuJHRpLHM9dC5DKCJhMihjWC5FKSIpLmIobmV3IE0ucTcoKSks
-cj1hLmdreihhKSx0PW5ldyBILlNPKHIscyx0LkMoIlNPPGNYLkU+IikpLHM9dGhpcy5hLHE9ITEscD0h
-MSxvPSIiO3QubSgpOyl7bj1yLmdSKHIpCmlmKHMuaEsobikmJnApe209WC5DTChuLHMpCmw9by5jaGFy
-Q29kZUF0KDApPT0wP286bwpvPUMueEIuTmoobCwwLHMuU3AobCwhMCkpCm0uYj1vCmlmKHMuZHMobykp
-Qy5ObS5ZKG0uZSwwLHMuZ21JKCkpCm89bS53KDApfWVsc2UgaWYocy5ZcihuKT4wKXtwPSFzLmhLKG4p
-Cm89SC5kKG4pfWVsc2V7aWYoIShuLmxlbmd0aD4wJiZzLlVkKG5bMF0pKSlpZihxKW8rPXMuZ21JKCkK
-bys9SC5kKG4pfXE9cy5kcyhuKX1yZXR1cm4gby5jaGFyQ29kZUF0KDApPT0wP286b30sCm81OmZ1bmN0
-aW9uKGEsYil7dmFyIHQKaWYoIXRoaXMueTMoYikpcmV0dXJuIGIKdD1YLkNMKGIsdGhpcy5hKQp0LnJS
-KDApCnJldHVybiB0LncoMCl9LAp5MzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsawph
-LnRvU3RyaW5nCnQ9dGhpcy5hCnM9dC5ZcihhKQppZihzIT09MCl7aWYodD09PSQuS2soKSlmb3Iocj0w
-O3I8czsrK3IpaWYoQy54Qi5XZChhLHIpPT09NDcpcmV0dXJuITAKcT1zCnA9NDd9ZWxzZXtxPTAKcD1u
-dWxsfWZvcihvPW5ldyBILnFqKGEpLmEsbj1vLmxlbmd0aCxyPXEsbT1udWxsO3I8bjsrK3IsbT1wLHA9
-bCl7bD1DLnhCLk8yKG8scikKaWYodC5yNChsKSl7aWYodD09PSQuS2soKSYmbD09PTQ3KXJldHVybiEw
-CmlmKHAhPW51bGwmJnQucjQocCkpcmV0dXJuITAKaWYocD09PTQ2KWs9bT09bnVsbHx8bT09PTQ2fHx0
-LnI0KG0pCmVsc2Ugaz0hMQppZihrKXJldHVybiEwfX1pZihwPT1udWxsKXJldHVybiEwCmlmKHQucjQo
-cCkpcmV0dXJuITAKaWYocD09PTQ2KXQ9bT09bnVsbHx8dC5yNChtKXx8bT09PTQ2CmVsc2UgdD0hMQpp
-Zih0KXJldHVybiEwCnJldHVybiExfSwKSFA6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG89dGhp
-cyxuPSdVbmFibGUgdG8gZmluZCBhIHBhdGggdG8gIicKYj1vLldPKDAsYikKdD1vLmEKaWYodC5Zcihi
-KTw9MCYmdC5ZcihhKT4wKXJldHVybiBvLm81KDAsYSkKaWYodC5ZcihhKTw9MHx8dC5oSyhhKSlhPW8u
-V08oMCxhKQppZih0LllyKGEpPD0wJiZ0LllyKGIpPjApdGhyb3cgSC5iKFguSTcobitILmQoYSkrJyIg
-ZnJvbSAiJytILmQoYikrJyIuJykpCnM9WC5DTChiLHQpCnMuclIoMCkKcj1YLkNMKGEsdCkKci5yUigw
-KQpxPXMuZAppZihxLmxlbmd0aD4wJiZKLlJNKHFbMF0sIi4iKSlyZXR1cm4gci53KDApCnE9cy5iCnA9
-ci5iCmlmKHEhPXApcT1xPT1udWxsfHxwPT1udWxsfHwhdC5OYyhxLHApCmVsc2UgcT0hMQppZihxKXJl
-dHVybiByLncoMCkKd2hpbGUoITApe3E9cy5kCmlmKHEubGVuZ3RoPjApe3A9ci5kCnE9cC5sZW5ndGg+
-MCYmdC5OYyhxWzBdLHBbMF0pfWVsc2UgcT0hMQppZighcSlicmVhawpDLk5tLlc0KHMuZCwwKQpDLk5t
-Llc0KHMuZSwxKQpDLk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKX1xPXMuZAppZihxLmxlbmd0aD4w
-JiZKLlJNKHFbMF0sIi4uIikpdGhyb3cgSC5iKFguSTcobitILmQoYSkrJyIgZnJvbSAiJytILmQoYikr
-JyIuJykpCnE9dS5OCkMuTm0ub0Yoci5kLDAsUC5POChzLmQubGVuZ3RoLCIuLiIscSkpCkMuTm0uWShy
-LmUsMCwiIikKQy5ObS5vRihyLmUsMSxQLk84KHMuZC5sZW5ndGgsdC5nbUkoKSxxKSkKdD1yLmQKcT10
-Lmxlbmd0aAppZihxPT09MClyZXR1cm4iLiIKaWYocT4xJiZKLlJNKEMuTm0uZ3JaKHQpLCIuIikpe3Q9
-ci5kCmlmKDA+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsLTEpCnQucG9wKCkKdD1yLmUKQy5ObS5tdih0
-KQpDLk5tLm12KHQpCkMuTm0uQSh0LCIiKX1yLmI9IiIKci5JVigpCnJldHVybiByLncoMCl9fQpNLk1p
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBILnkoYSkhPW51bGx9LAokUzo5fQpNLnE3
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBILnkoYSkhPT0iIn0sCiRTOjl9Ck0uTm8u
-cHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7SC55KGEpCnJldHVybiBhPT1udWxsPyJudWxsIjonIicr
-YSsnIid9LAokUzo1fQpCLkx1LnByb3RvdHlwZT17CnhaOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5Z
-cihhKQppZihzPjApcmV0dXJuIEoubGQoYSwwLHMpCmlmKHRoaXMuaEsoYSkpe2lmKDA+PWEubGVuZ3Ro
-KXJldHVybiBILk9IKGEsMCkKdD1hWzBdfWVsc2UgdD1udWxsCnJldHVybiB0fSwKTmM6ZnVuY3Rpb24o
-YSxiKXtyZXR1cm4gYT09Yn19ClguV0QucHJvdG90eXBlPXsKSVY6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9
-dGhpcwp3aGlsZSghMCl7dD1yLmQKaWYoISh0Lmxlbmd0aCE9PTAmJkouUk0oQy5ObS5ncloodCksIiIp
-KSlicmVhawp0PXIuZAppZigwPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LC0xKQp0LnBvcCgpCkMuTm0u
-bXYoci5lKX10PXIuZQpzPXQubGVuZ3RoCmlmKHM+MClDLk5tLlkodCxzLTEsIiIpfSwKclI6ZnVuY3Rp
-b24oYSl7dmFyIHQscyxyLHEscCxvLG4sbT10aGlzLGw9SC5WTShbXSx1LnMpCmZvcih0PW0uZCxzPXQu
-bGVuZ3RoLHI9MCxxPTA7cTx0Lmxlbmd0aDt0Lmxlbmd0aD09PXN8fCgwLEgubGspKHQpLCsrcSl7cD10
-W3FdCm89Si5pYShwKQppZighKG8uRE4ocCwiLiIpfHxvLkROKHAsIiIpKSlpZihvLkROKHAsIi4uIikp
-aWYobC5sZW5ndGg+MClsLnBvcCgpCmVsc2UgKytyCmVsc2UgQy5ObS5BKGwscCl9aWYobS5iPT1udWxs
-KUMuTm0ub0YobCwwLFAuTzgociwiLi4iLHUuTikpCmlmKGwubGVuZ3RoPT09MCYmbS5iPT1udWxsKUMu
-Tm0uQShsLCIuIikKbj1QLmRIKGwubGVuZ3RoLG5ldyBYLnFSKG0pLCEwLHUuTikKdD1tLmIKdD10IT1u
-dWxsJiZsLmxlbmd0aD4wJiZtLmEuZHModCk/bS5hLmdtSSgpOiIiCkgudDYobikuZC5iKHQpCmlmKCEh
-bi5maXhlZCRsZW5ndGgpSC5WaihQLkw0KCJpbnNlcnQiKSkKbi5zcGxpY2UoMCwwLHQpCm0uc25KKGwp
-Cm0uc1BoKG4pCnQ9bS5iCmlmKHQhPW51bGwmJm0uYT09PSQuS2soKSl7dC50b1N0cmluZwptLmI9SC55
-cyh0LCIvIiwiXFwiKX1tLklWKCl9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscj10aGlzLHE9ci5iCnE9
-cSE9bnVsbD9xOiIiCmZvcih0PTA7dDxyLmQubGVuZ3RoOysrdCl7cz1yLmUKaWYodD49cy5sZW5ndGgp
-cmV0dXJuIEguT0gocyx0KQpzPXErSC5kKHNbdF0pCnE9ci5kCmlmKHQ+PXEubGVuZ3RoKXJldHVybiBI
-Lk9IKHEsdCkKcT1zK0guZChxW3RdKX1xKz1ILmQoQy5ObS5nclooci5lKSkKcmV0dXJuIHEuY2hhckNv
-ZGVBdCgwKT09MD9xOnF9LApzbko6ZnVuY3Rpb24oYSl7dGhpcy5kPXUuYS5iKGEpfSwKc1BoOmZ1bmN0
-aW9uKGEpe3RoaXMuZT11LmEuYihhKX19ClgucVIucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0
-dXJuIHRoaXMuYS5hLmdtSSgpfSwKJFM6NDZ9ClguZHYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXty
-ZXR1cm4iUGF0aEV4Y2VwdGlvbjogIit0aGlzLmF9fQpPLk9PLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuZ29jKHRoaXMpfX0KRS5PRi5wcm90b3R5cGU9ewpVZDpmdW5jdGlvbihhKXty
-ZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwKZHM6ZnVu
-Y3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKcmV0dXJuIHQhPT0wJiZDLnhCLk8yKGEsdC0xKSE9PTQ3fSwK
-U3A6ZnVuY3Rpb24oYSxiKXtpZihhLmxlbmd0aCE9PTAmJkMueEIuV2QoYSwwKT09PTQ3KXJldHVybiAx
-CnJldHVybiAwfSwKWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSzpmdW5jdGlv
-bihhKXtyZXR1cm4hMX0sCmdvYzpmdW5jdGlvbigpe3JldHVybiJwb3NpeCJ9LApnbUk6ZnVuY3Rpb24o
-KXtyZXR1cm4iLyJ9fQpGLnJ1LnByb3RvdHlwZT17ClVkOmZ1bmN0aW9uKGEpe3JldHVybiBDLnhCLnRn
-KGEsIi8iKX0sCnI0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09NDd9LApkczpmdW5jdGlvbihhKXt2YXIg
-dD1hLmxlbmd0aAppZih0PT09MClyZXR1cm4hMQppZihDLnhCLk8yKGEsdC0xKSE9PTQ3KXJldHVybiEw
-CnJldHVybiBDLnhCLlRjKGEsIjovLyIpJiZ0aGlzLllyKGEpPT09dH0sClNwOmZ1bmN0aW9uKGEsYil7
-dmFyIHQscyxyLHEscD1hLmxlbmd0aAppZihwPT09MClyZXR1cm4gMAppZihDLnhCLldkKGEsMCk9PT00
-NylyZXR1cm4gMQpmb3IodD0wO3Q8cDsrK3Qpe3M9Qy54Qi5XZChhLHQpCmlmKHM9PT00NylyZXR1cm4g
-MAppZihzPT09NTgpe2lmKHQ9PT0wKXJldHVybiAwCnI9Qy54Qi5YVShhLCIvIixDLnhCLlFpKGEsIi8v
-Iix0KzEpP3QrMzp0KQppZihyPD0wKXJldHVybiBwCmlmKCFifHxwPHIrMylyZXR1cm4gcgppZighQy54
-Qi5uQyhhLCJmaWxlOi8vIikpcmV0dXJuIHIKaWYoIUIuWXUoYSxyKzEpKXJldHVybiByCnE9ciszCnJl
-dHVybiBwPT09cT9xOnIrNH19cmV0dXJuIDB9LApZcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChh
-LCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aCE9PTAmJkMueEIuV2QoYSwwKT09PTQ3
-fSwKZ29jOmZ1bmN0aW9uKCl7cmV0dXJuInVybCJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9fQpM
-LklWLnByb3RvdHlwZT17ClVkOmZ1bmN0aW9uKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0OmZ1
-bmN0aW9uKGEpe3JldHVybiBhPT09NDd8fGE9PT05Mn0sCmRzOmZ1bmN0aW9uKGEpe3ZhciB0PWEubGVu
-Z3RoCmlmKHQ9PT0wKXJldHVybiExCnQ9Qy54Qi5PMihhLHQtMSkKcmV0dXJuISh0PT09NDd8fHQ9PT05
-Mil9LApTcDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj1hLmxlbmd0aAppZihyPT09MClyZXR1cm4gMAp0
-PUMueEIuV2QoYSwwKQppZih0PT09NDcpcmV0dXJuIDEKaWYodD09PTkyKXtpZihyPDJ8fEMueEIuV2Qo
-YSwxKSE9PTkyKXJldHVybiAxCnM9Qy54Qi5YVShhLCJcXCIsMikKaWYocz4wKXtzPUMueEIuWFUoYSwi
-XFwiLHMrMSkKaWYocz4wKXJldHVybiBzfXJldHVybiByfWlmKHI8MylyZXR1cm4gMAppZighQi5PUyh0
-KSlyZXR1cm4gMAppZihDLnhCLldkKGEsMSkhPT01OClyZXR1cm4gMApyPUMueEIuV2QoYSwyKQppZigh
-KHI9PT00N3x8cj09PTkyKSlyZXR1cm4gMApyZXR1cm4gM30sCllyOmZ1bmN0aW9uKGEpe3JldHVybiB0
-aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWXIoYSk9PT0xfSwKT3Q6ZnVu
-Y3Rpb24oYSxiKXt2YXIgdAppZihhPT09YilyZXR1cm4hMAppZihhPT09NDcpcmV0dXJuIGI9PT05Mgpp
-ZihhPT09OTIpcmV0dXJuIGI9PT00NwppZigoYV5iKSE9PTMyKXJldHVybiExCnQ9YXwzMgpyZXR1cm4g
-dD49OTcmJnQ8PTEyMn0sCk5jOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCmlmKGE9PWIpcmV0dXJuITAK
-dD1hLmxlbmd0aAppZih0IT09Yi5sZW5ndGgpcmV0dXJuITEKZm9yKHM9Si5yWShiKSxyPTA7cjx0Oysr
-cilpZighdGhpcy5PdChDLnhCLldkKGEscikscy5XZChiLHIpKSlyZXR1cm4hMQpyZXR1cm4hMH0sCmdv
-YzpmdW5jdGlvbigpe3JldHVybiJ3aW5kb3dzIn0sCmdtSTpmdW5jdGlvbigpe3JldHVybiJcXCJ9fTso
-ZnVuY3Rpb24gYWxpYXNlcygpe3ZhciB0PUoudkIucHJvdG90eXBlCnQuVUc9dC53CnQuU2o9dC5lNwp0
-PUouTUYucHJvdG90eXBlCnQudD10LncKdD1QLmNYLnByb3RvdHlwZQp0LkdHPXQuZXYKdD1QLmsucHJv
-dG90eXBlCnQueGI9dC53CnQ9Vy5jdi5wcm90b3R5cGUKdC5EVz10LnI2CnQ9Vy5tNi5wcm90b3R5cGUK
-dC5qRj10LkViCnQ9UC5FNC5wcm90b3R5cGUKdC5Vcj10LnEKdC5lND10Lll9KSgpOyhmdW5jdGlvbiBp
-bnN0YWxsVGVhck9mZnMoKXt2YXIgdD1odW5rSGVscGVycy5fc3RhdGljXzEscz1odW5rSGVscGVycy5f
-c3RhdGljXzAscj1odW5rSGVscGVycy5pbnN0YWxsSW5zdGFuY2VUZWFyT2ZmLHE9aHVua0hlbHBlcnMu
-aW5zdGFsbFN0YXRpY1RlYXJPZmYscD1odW5rSGVscGVycy5faW5zdGFuY2VfMXUKdChQLCJFWCIsIlpW
-IiwxMSkKdChQLCJ5dCIsInFHIiwxMSkKdChQLCJxVyIsIkJ6IiwxMSkKcyhQLCJVSSIsImVOIiwyKQpy
-KFAuUGYucHJvdG90eXBlLCJnWUoiLDAsMSxudWxsLFsiJDIiLCIkMSJdLFsidzAiLCJwbSJdLDIzLDAp
-CnQoUCwiUEgiLCJNdCIsNSkKcShXLCJwUyIsNCxudWxsLFsiJDQiXSxbIlV3Il0sMTksMCkKcShXLCJW
-NCIsNCxudWxsLFsiJDQiXSxbIm5aIl0sMTksMCkKcChQLmRNLnByb3RvdHlwZSwiZ3VNIiwiVkwiLDUp
-CnQoUCwiaUciLCJ3WSIsNCkKdChQLCJ3MCIsIkw3IiwzMikKdChMLCJIMCIsInVtIiwyMSl9KSgpOyhm
-dW5jdGlvbiBpbmhlcml0YW5jZSgpe3ZhciB0PWh1bmtIZWxwZXJzLm1peGluLHM9aHVua0hlbHBlcnMu
-aW5oZXJpdCxyPWh1bmtIZWxwZXJzLmluaGVyaXRNYW55CnMoUC5rLG51bGwpCnIoUC5rLFtILmVvLEou
-dkIsSi5tMSxQLm5ZLFAuY1gsSC5hNyxQLkFuLEguU1UsSC5SZSxILnd2LFAuUG4sSC5XVSxILkxJLEgu
-VHAsSC5mOSxQLlhTLEguYnEsSC5YTyxQLllrLEgudmgsSC5ONixILlZSLEguRUssSC5QYixILnRRLEgu
-U2QsSC5KYyxILkcsUC5XMyxQLmloLFAuRnksUC5HVixQLmI4LFAuUGYsUC5GZSxQLnZzLFAuT00sUC5x
-aCxQLk1PLFAua1QsUC54SSxQLkN3LFAubTAsUC5YdixQLmJuLFAubG0sUC5sRCxQLktQLFAubGYsUC5X
-WSxQLlVrLFAuUncsUC5ieixQLmEyLFAuaVAsUC5GSyxQLms1LFAuS1ksUC5DRCxQLmFFLFAuRUgsUC56
-TSxQLlowLFAuTjMsUC5jOCxQLk9kLFAuaWIsUC5HeixQLnFVLFAuUm4sUC5HRCxQLkRuLFAuUEUsUC5V
-ZixXLmlkLFcuRmssVy5KUSxXLkdtLFcudkQsVy5tNixXLk93LFcuVzksVy5kVyxXLkZiLFcua0YsVy5t
-ayxXLktvLFAuaTYsUC5hSixQLkU0LFAuSU4sUC5uNixVLmQyLFUuU2UsVS5NbCxVLnlELFUud2IsQi5q
-OCxCLnFwLFQubVEsTC5YQSxMLlpaLEwuQmMsTS5sSSxPLk9PLFguV0QsWC5kdl0pCnIoSi52QixbSi55
-RSxKLllFLEouTUYsSi5qZCxKLnFJLEouRHIsSC5XWixILkVULFcuRDAsVy5ZZSxXLkF6LFcuUFUsVy5C
-dyxXLm80LFcubHcsVy5MZSxXLlNiLFcuTmgsVy5KVSxXLklCLFcudmUsVy5uNyxXLlFJLFcuZWEsVy50
-SSxXLkdPLFcuSkMsVy5icixXLlo3LFcuU2csVy51OCxXLno2LFcubEcsVy5xcyxXLkFXLFcuY3MsVy5L
-NyxXLmNsLFcuZlQsVy5iZyxXLlk0LFcuYUQsVy5sOCxXLk9YLFcuV1csVy5VaixXLm16LFcuYTMsVy50
-cixXLmNuLFcuRmosVy5PdixXLllELFcuWFcsVy5YVSxXLnp2LFAuVzIsUC5oRixQLkJWLFAudWosUC54
-MCxQLmZVLFAudVAsUC5qRyxQLkVELFAueFcsUC56WSxQLndqLFAucjIsUC5yTyxQLlUzLFAubW9dKQpy
-KEouTUYsW0ouaUMsSi5rZCxKLmM1XSkKcyhKLlBvLEouamQpCnIoSi5xSSxbSi51cixKLlZBXSkKcyhQ
-LkxVLFAublkpCnIoUC5MVSxbSC5YQyxXLnd6LFcuZTddKQpzKEgucWosSC5YQykKcihQLmNYLFtILmJR
-LEguaTEsSC5VNSxILlhSLFAubVcsSC51bl0pCnIoSC5iUSxbSC5hTCxILmk1LFAueHVdKQpyKEguYUws
-W0gubkgsSC5BOCxQLmk4XSkKcyhILnh5LEguaTEpCnIoUC5BbixbSC5NSCxILlNPXSkKcyhQLlJVLFAu
-UG4pCnMoUC5HaixQLlJVKQpzKEguUEQsUC5HaikKcyhILkxQLEguV1UpCnIoSC5UcCxbSC5DaixILkFt
-LEgubGMsSC5kQyxILndOLEguVlgsUC50aCxQLmhhLFAuVnMsUC5GdCxQLnlILFAuV00sUC5TWCxQLkdz
-LFAuZGEsUC5vUSxQLnBWLFAuVTcsUC52cixQLnJILFAuS0YsUC5aTCxQLlJULFAualosUC5ycSxQLlJX
-LFAuQjUsUC5QSSxQLnBLLFAuaGosUC5WcCxQLk9SLFAucmEsUC55USxQLldGLFAubjEsUC5jUyxQLlZD
-LFAuSlQsUC5lMSxQLk5ZLFAuUlosUC5NRSxQLnk1LFAucTMsUC55SSxQLmM2LFAucWQsVy5DdixXLmJV
-LFcuaEgsVy5GQSxXLnVxLFcuaWksVy53USxXLktTLFcuQTMsVy52TixXLlV2LFcuRWcsVy5FbyxXLldr
-LFcuSUEsVy5mbSxQLmxSLFAuamcsUC5LNSxQLkdFLFAuTjcsUC51USxQLlBDLFAubXQsUC5OeixQLm5w
-LFAuVXQsUC52SyxQLnBVLFAucWYsTC5lLEwuVlcsTC5vWixMLmpyLEwucWwsTC55OCxMLkwsTC5XeCxM
-LkFPLEwuZE4sTC5IbyxMLnh6LEwuSUMsTC5MMSxMLm5ULEwuQlosTC5HSCxMLkRULEwuZUgsTC55dSxM
-LnpELEwuVFcsTC54cixMLkVFLEwuUUwsTC5WUyxMLlRELE0uTWksTS5xNyxNLk5vLFgucVJdKQpyKFAu
-WFMsW0guVzAsSC5heixILnZWLEguRXEsUC5DNixILnU5LFAubixQLnUsUC5tcCxQLnViLFAuZHMsUC5s
-aixQLlVWLFAuY10pCnIoSC5sYyxbSC56eCxILnJUXSkKcyhILmtZLFAuQzYpCnMoUC5pbCxQLllrKQpy
-KFAuaWwsW0guTjUsUC51dyxXLmFULFcuU3ldKQpyKFAubVcsW0guS1csUC5xNF0pCnIoSC5FVCxbSC5k
-ZixILmIwXSkKcihILmIwLFtILlJHLEguV0JdKQpzKEguVlAsSC5SRykKcyhILkRnLEguVlApCnMoSC5a
-RyxILldCKQpzKEguUGcsSC5aRykKcihILlBnLFtILnhqLEguZEUsSC5aQSxILndmLEguUHEsSC5lRSxI
-LlY2XSkKcihILnU5LFtILmh6LEguaU1dKQpzKFAuWmYsUC5QZikKcyhQLkppLFAubTApCnMoUC5iNixQ
-Llh2KQpzKFAuUkssUC5XWSkKcihQLlVrLFtQLkNWLFAuWmksUC5ieV0pCnMoUC53SSxQLmtUKQpyKFAu
-d0ksW1AudkEsUC5NeCxQLkUzLFAuR1ldKQpzKFAudTUsUC5aaSkKcihQLkZLLFtQLkNQLFAuS05dKQpy
-KFAudSxbUC5iSixQLmVZXSkKcyhQLnFlLFAuRG4pCnIoVy5EMCxbVy51SCxXLndKLFcud2EsVy5sSyxX
-LkxyLFcuU1YsVy5vSCxXLkExLFcuTU4sVy5RVixXLnZGLFcuT2ksVy5DbSxQLmZvLFAuVjhdKQpyKFcu
-dUgsW1cuY3YsVy5ueCxXLlFGLFcuQ1FdKQpyKFcuY3YsW1cucUUsUC5kNV0pCnIoVy5xRSxbVy5HaCxX
-LmZZLFcubkIsVy5RUCxXLklGLFcuY3gsVy5oNCxXLkpLLFcud1AsVy5RYixXLlFsLFcuR1gsVy5TTixX
-LkhELFcuS1IsVy5scCxXLlRiLFcuSXYsVy5CVCxXLmZYLFcuRkJdKQpyKFcuQncsW1cuUmQsVy5rUixX
-LkhTLFcuRmhdKQpzKFcuVGYsVy5vNCkKcyhXLm9KLFcuTGUpCnMoVy5WbyxXLmtSKQpzKFcueFgsVy5K
-VSkKcyhXLkZ2LFcueFgpCnMoVy5iRyxXLnZlKQpzKFcuWWwsVy5iRykKcyhXLlQ1LFcuQXopCnMoVy5m
-ZyxXLnRJKQpzKFcuWFYsVy5mZykKcyhXLkhXLFcuWjcpCnMoVy54bixXLkhXKQpzKFcuVmIsVy5RRikK
-cyhXLk83LFcud2EpCnIoVy5lYSxbVy53NixXLmV3LFcuYmtdKQpyKFcudzYsW1cuSEwsVy5Bal0pCnMo
-Vy5TMCxXLmxHKQpzKFcuejIsVy5xcykKcyhXLktCLFcuY3MpCnMoVy5ETSxXLktCKQpzKFcuckIsVy5L
-NykKcyhXLkJILFcuckIpCnMoVy5mNyxXLmZUKQpzKFcuRXYsVy5mNykKcyhXLnA4LFcuYmcpCnMoVy5D
-RSxXLm9IKQpzKFcuTWssVy5DRSkKcyhXLlp4LFcuYUQpCnMoVy5ObixXLlp4KQpzKFcuQXMsVy5PWCkK
-cyhXLmpNLFcuVWopCnMoVy5YMCxXLmpNKQpzKFcuQXcsVy5RVikKcyhXLm5KLFcuQXcpCnMoVy5PMyxX
-LnRyKQpzKFcuY2ksVy5PMykKcyhXLmNPLFcuT3YpCnMoVy5QUixXLmNPKQpzKFcudzQsVy5JQikKcyhX
-LkR4LFcuWUQpCnMoVy5GMixXLkR4KQpzKFcub2EsVy5YVykKcyhXLnJoLFcub2EpCnMoVy5SeSxXLlhV
-KQpzKFcuTE8sVy5SeSkKcyhXLm56LFcuenYpCnMoVy5iMSxXLm56KQpzKFcuaTcsVy5hVCkKcyhQLmRN
-LFAuUkspCnIoUC5kTSxbVy5JNCxQLktlXSkKcyhXLlJPLFAucWgpCnMoVy5ldSxXLlJPKQpzKFcueEMs
-UC5NTykKcyhXLmN0LFcubTYpCnMoUC5CZixQLmk2KQpzKFAuemcsUC5hSikKcyhQLmUzLFAuVzIpCnIo
-UC5FNCxbUC5yNyxQLmNvXSkKcyhQLlR6LFAuY28pCnMoUC50bixQLklOKQpzKFAuR0MsUC5mVSkKcyhQ
-LnE2LFAuR0MpCnMoUC5qUyxQLmpHKQpzKFAuZnosUC5qUykKcyhQLm5kLFAuZDUpCnMoUC5kUyxQLnhX
-KQpzKFAuS3EsUC5kUykKcyhQLk1ZLFAud2opCnMoUC5OQyxQLk1ZKQpzKFAuejgsUC5VMykKcyhQLkdu
-LFAuVjgpCnMoUC5LZyxQLm1vKQpzKFAuRm4sUC5LZykKcyhCLkx1LE8uT08pCnIoQi5MdSxbRS5PRixG
-LnJ1LEwuSVZdKQp0KEguWEMsSC5SZSkKdChILlJHLFAubEQpCnQoSC5WUCxILlNVKQp0KEguV0IsUC5s
-RCkKdChILlpHLEguU1UpCnQoUC5uWSxQLmxEKQp0KFAuV1ksUC5sZikKdChQLlJVLFAuS1ApCnQoVy5M
-ZSxXLmlkKQp0KFcuSlUsUC5sRCkKdChXLnhYLFcuR20pCnQoVy52ZSxQLmxEKQp0KFcuYkcsVy5HbSkK
-dChXLnRJLFAubEQpCnQoVy5mZyxXLkdtKQp0KFcuWjcsUC5sRCkKdChXLkhXLFcuR20pCnQoVy5sRyxQ
-LllrKQp0KFcucXMsUC5ZaykKdChXLmNzLFAubEQpCnQoVy5LQixXLkdtKQp0KFcuSzcsUC5sRCkKdChX
-LnJCLFcuR20pCnQoVy5mVCxQLmxEKQp0KFcuZjcsVy5HbSkKdChXLmJnLFAuWWspCnQoVy5vSCxQLmxE
-KQp0KFcuQ0UsVy5HbSkKdChXLmFELFAubEQpCnQoVy5aeCxXLkdtKQp0KFcuT1gsUC5ZaykKdChXLlVq
-LFAubEQpCnQoVy5qTSxXLkdtKQp0KFcuUVYsUC5sRCkKdChXLkF3LFcuR20pCnQoVy50cixQLmxEKQp0
-KFcuTzMsVy5HbSkKdChXLk92LFAubEQpCnQoVy5jTyxXLkdtKQp0KFcuWUQsUC5sRCkKdChXLkR4LFcu
-R20pCnQoVy5YVyxQLmxEKQp0KFcub2EsVy5HbSkKdChXLlhVLFAubEQpCnQoVy5SeSxXLkdtKQp0KFcu
-enYsUC5sRCkKdChXLm56LFcuR20pCnQoUC5jbyxQLmxEKQp0KFAuZlUsUC5sRCkKdChQLkdDLFcuR20p
-CnQoUC5qRyxQLmxEKQp0KFAualMsVy5HbSkKdChQLnhXLFAubEQpCnQoUC5kUyxXLkdtKQp0KFAud2os
-UC5sRCkKdChQLk1ZLFcuR20pCnQoUC5VMyxQLllrKQp0KFAubW8sUC5sRCkKdChQLktnLFcuR20pfSko
-KQp2YXIgdj17dHlwZVVuaXZlcnNlOntlQzpuZXcgTWFwKCksdFI6e30sZVQ6e30sdFBWOnt9LHNFQTpb
-XX0sbWFuZ2xlZEdsb2JhbE5hbWVzOntLTjoiaW50IixDUDoiZG91YmxlIixGSzoibnVtIixxVToiU3Ry
-aW5nIixhMjoiYm9vbCIsYzg6Ik51bGwiLHpNOiJMaXN0In0sbWFuZ2xlZE5hbWVzOnt9LGdldFR5cGVG
-cm9tTmFtZTpnZXRHbG9iYWxGcm9tTmFtZSxtZXRhZGF0YTpbXSx0eXBlczpbImM4KCkiLCJjOChALEAp
-IiwifigpIiwiYzgoY3YpIiwiQChAKSIsInFVKHFVKSIsImM4KEFqKSIsImM4KE83KSIsIn4ocVUsQCki
-LCJhMihxVSkiLCJ+KEApIiwifih+KCkpIiwiYzgocVUscVUpIiwiYzgocVUsQCkiLCJ+KHh1PHFVPiki
-LCJjOChxVSkiLCJ+KHFVLHFVKSIsImEyKGtGKSIsImM4KEApIiwiYTIoY3YscVUscVUsSlEpIiwiYzgo
-ZWEpIiwifihBaikiLCJuNihLTikiLCJ+KGtbR3pdKSIsIlowPHFVLHFVPihaMDxxVSxxVT4scVUpIiwi
-YTIodUgpIiwiYzgoQFtHel0pIiwiYzgoZXcpIiwiQChxVSkiLCJAKGVhKSIsInZzPEA+KEApIiwifihx
-VVtAXSkiLCJrKEApIiwiQChALEApIiwiYTIoeHU8cVU+KSIsIktOKEtOLEtOKSIsInI3KEApIiwiVHo8
-QD4oQCkiLCJFNChAKSIsImM4KH4oKSkiLCJjOChALEd6KSIsIn4odUgsdUgpIiwiYjg8Yzg+KEFqKSIs
-ImM4KEtOLEApIiwiTzcoTzcpIiwiQChALHFVKSIsInFVKEtOKSIsImM4KEdELEApIiwifihxVSxLTiki
-LCJuNihALEApIl0saW50ZXJjZXB0b3JzQnlUYWc6bnVsbCxsZWFmVGFnczpudWxsfQpILnhiKHYudHlw
-ZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3siYzUiOiJNRiIsImlDIjoiTUYiLCJrZCI6Ik1GIiwicngiOiJl
-YSIsImU1IjoiZWEiLCJEWCI6IlY4IiwiYzAiOiJEMCIsImZ5IjoiRDAiLCJjZyI6IkQwIiwiWTAiOiJk
-NSIsInRwIjoiZDUiLCJ2MCI6ImV3IiwiTXIiOiJxRSIsImVMIjoicUUiLCJJMCI6InVIIiwiaHMiOiJ1
-SCIsIlhnIjoiUUYiLCJ5YyI6IkFqIiwiajYiOiJNTiIsInk0IjoidzYiLCJhUCI6IkNtIiwieGMiOiJu
-eCIsImtKIjoibngiLCJqNyI6IndhIiwiUUgiOiJ4biIsIncxIjoiUUkiLCJINiI6Imx3IiwiSEUiOiJX
-VyIsInpVIjoiRGciLCJ5RSI6eyJhMiI6W119LCJZRSI6eyJjOCI6W119LCJNRiI6eyJ2bSI6W10sIkVI
-IjpbXX0sImpkIjp7InpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJQbyI6eyJqZCI6WyIx
-Il0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJtMSI6eyJBbiI6WyIxIl19LCJxSSI6
-eyJDUCI6W10sIkZLIjpbXX0sInVyIjp7IktOIjpbXSwiQ1AiOltdLCJGSyI6W119LCJWQSI6eyJDUCI6
-W10sIkZLIjpbXX0sIkRyIjp7InFVIjpbXSwidlgiOltdfSwicWoiOnsiUmUiOlsiS04iXSwibEQiOlsi
-S04iXSwiek0iOlsiS04iXSwiYlEiOlsiS04iXSwiY1giOlsiS04iXSwibEQuRSI6IktOIiwiUmUuRSI6
-IktOIn0sImJRIjp7ImNYIjpbIjEiXX0sImFMIjp7ImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibkgiOnsi
-YUwiOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXSwiYUwuRSI6IjEiLCJjWC5FIjoiMSJ9LCJhNyI6
-eyJBbiI6WyIxIl19LCJpMSI6eyJjWCI6WyIyIl0sImNYLkUiOiIyIn0sInh5Ijp7ImkxIjpbIjEiLCIy
-Il0sImJRIjpbIjIiXSwiY1giOlsiMiJdLCJjWC5FIjoiMiJ9LCJNSCI6eyJBbiI6WyIyIl19LCJBOCI6
-eyJhTCI6WyIyIl0sImJRIjpbIjIiXSwiY1giOlsiMiJdLCJhTC5FIjoiMiIsImNYLkUiOiIyIn0sIlU1
-Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiU08iOnsiQW4iOlsiMSJdfSwiWEMiOnsiUmUiOlsiMSJd
-LCJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ3diI6eyJHRCI6W119
-LCJQRCI6eyJHaiI6WyIxIiwiMiJdLCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwiMiJdLCJLUCI6WyIx
-IiwiMiJdLCJaMCI6WyIxIiwiMiJdfSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0sIkxQIjp7IldVIjpbIjEi
-LCIyIl0sIlowIjpbIjEiLCIyIl19LCJYUiI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkxJIjp7InZR
-IjpbXX0sIlcwIjp7IlhTIjpbXX0sImF6Ijp7IlhTIjpbXX0sInZWIjp7IlhTIjpbXX0sIlhPIjp7Ikd6
-IjpbXX0sIlRwIjp7IkVIIjpbXX0sImxjIjp7IkVIIjpbXX0sInp4Ijp7IkVIIjpbXX0sInJUIjp7IkVI
-IjpbXX0sIkVxIjp7IlhTIjpbXX0sImtZIjp7IlhTIjpbXX0sIk41Ijp7IkZvIjpbIjEiLCIyIl0sIllr
-IjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl0sIllrLksiOiIxIiwiWWsuViI6IjIifSwiaTUiOnsiYlEi
-OlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIk42Ijp7IkFuIjpbIjEiXX0sIlZSIjp7IndMIjpb
-XSwidlgiOltdfSwiRUsiOnsiaWIiOltdLCJPZCI6W119LCJLVyI6eyJjWCI6WyJpYiJdLCJjWC5FIjoi
-aWIifSwiUGIiOnsiQW4iOlsiaWIiXX0sInRRIjp7Ik9kIjpbXX0sInVuIjp7ImNYIjpbIk9kIl0sImNY
-LkUiOiJPZCJ9LCJTZCI6eyJBbiI6WyJPZCJdfSwiRVQiOnsiQVMiOltdfSwiZGYiOnsiRVQiOltdLCJX
-eSI6W10sIkFTIjpbXX0sImIwIjp7IlhqIjpbIkAiXSwiRVQiOltdLCJBUyI6W119LCJEZyI6eyJsRCI6
-WyJDUCJdLCJYaiI6WyJAIl0sInpNIjpbIkNQIl0sIkVUIjpbXSwiYlEiOlsiQ1AiXSwiU1UiOlsiQ1Ai
-XSwiQVMiOltdLCJjWCI6WyJDUCJdLCJsRC5FIjoiQ1AifSwiUGciOnsibEQiOlsiS04iXSwiek0iOlsi
-S04iXSwiWGoiOlsiQCJdLCJFVCI6W10sImJRIjpbIktOIl0sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1gi
-OlsiS04iXX0sInhqIjp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJi
-USI6WyJLTiJdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJkRSI6
-eyJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpbXSwiYlEiOlsiS04iXSwiU1Ui
-OlsiS04iXSwiQVMiOltdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiWkEiOnsibEQiOlsiS04iXSwi
-ek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sImJRIjpbIktOIl0sIlNVIjpbIktOIl0sIkFTIjpb
-XSwiY1giOlsiS04iXSwibEQuRSI6IktOIn0sIndmIjp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhq
-IjpbIkAiXSwiRVQiOltdLCJiUSI6WyJLTiJdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0s
-ImxELkUiOiJLTiJ9LCJQcSI6eyJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpb
-XSwiYlEiOlsiS04iXSwiU1UiOlsiS04iXSwiQVMiOltdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwi
-ZUUiOnsibEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sImJRIjpbIktOIl0s
-IlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktOIn0sIlY2Ijp7Im42IjpbXSwi
-bEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sImJRIjpbIktOIl0sIlNVIjpb
-IktOIl0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktOIn0sInU5Ijp7IlhTIjpbXX0sImh6Ijp7
-IlhTIjpbXX0sImlNIjp7IlhTIjpbXX0sIkdWIjp7IkFuIjpbIjEiXX0sInE0Ijp7ImNYIjpbIjEiXSwi
-Y1guRSI6IjEifSwiWmYiOnsiUGYiOlsiMSJdfSwidnMiOnsiYjgiOlsiMSJdfSwiQ3ciOnsiWFMiOltd
-fSwibTAiOnsiSkIiOltdfSwiSmkiOnsiSkIiOltdfSwiYjYiOnsiWHYiOlsiMSJdLCJ4dSI6WyIxIl0s
-ImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibG0iOnsiQW4iOlsiMSJdfSwibVciOnsiY1giOlsiMSJdfSwi
-TFUiOnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwiaWwiOnsiWWsi
-OlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIllrIjp7IlowIjpbIjEiLCIyIl19LCJQbiI6eyJaMCI6
-WyIxIiwiMiJdfSwiR2oiOnsiUlUiOlsiMSIsIjIiXSwiUG4iOlsiMSIsIjIiXSwiS1AiOlsiMSIsIjIi
-XSwiWjAiOlsiMSIsIjIiXX0sIlJLIjp7ImxmIjpbIjEiXSwieHUiOlsiMSJdLCJiUSI6WyIxIl0sImNY
-IjpbIjEiXX0sIlh2Ijp7Inh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ1dyI6eyJZayI6
-WyJxVSIsIkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0sImk4Ijp7ImFM
-IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUiOiJxVSJ9LCJD
-ViI6eyJVayI6WyJ6TTxLTj4iLCJxVSJdLCJVay5TIjoiek08S04+In0sInZBIjp7IndJIjpbInpNPEtO
-PiIsInFVIl19LCJaaSI6eyJVayI6WyJxVSIsInpNPEtOPiJdfSwiYnkiOnsiVWsiOlsiayIsInFVIl0s
-IlVrLlMiOiJrIn0sIk14Ijp7IndJIjpbInFVIiwiayJdfSwidTUiOnsiVWsiOlsicVUiLCJ6TTxLTj4i
-XSwiVWsuUyI6InFVIn0sIkUzIjp7IndJIjpbInFVIiwiek08S04+Il19LCJHWSI6eyJ3SSI6WyJ6TTxL
-Tj4iLCJxVSJdfSwiQ1AiOnsiRksiOltdfSwiQzYiOnsiWFMiOltdfSwibiI6eyJYUyI6W119LCJ1Ijp7
-IlhTIjpbXX0sImJKIjp7IlhTIjpbXX0sImVZIjp7IlhTIjpbXX0sIm1wIjp7IlhTIjpbXX0sInViIjp7
-IlhTIjpbXX0sImRzIjp7IlhTIjpbXX0sImxqIjp7IlhTIjpbXX0sIlVWIjp7IlhTIjpbXX0sIms1Ijp7
-IlhTIjpbXX0sIktZIjp7IlhTIjpbXX0sImMiOnsiWFMiOltdfSwiS04iOnsiRksiOltdfSwiek0iOnsi
-YlEiOlsiMSJdLCJjWCI6WyIxIl19LCJpYiI6eyJPZCI6W119LCJ4dSI6eyJiUSI6WyIxIl0sImNYIjpb
-IjEiXX0sInFVIjp7InZYIjpbXX0sIlJuIjp7IkJMIjpbXX0sIkRuIjp7ImlEIjpbXX0sIlVmIjp7ImlE
-IjpbXX0sInFlIjp7ImlEIjpbXX0sInFFIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJHaCI6eyJj
-diI6W10sInVIIjpbXSwiRDAiOltdfSwiZlkiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIm5CIjp7
-ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJRUCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiSUYi
-OnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIm54Ijp7InVIIjpbXSwiRDAiOltdfSwiVm8iOnsia1Ii
-OltdfSwiY3giOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlFGIjp7InVIIjpbXSwiRDAiOltdfSwi
-RnYiOnsiR20iOlsidG48Rks+Il0sImxEIjpbInRuPEZLPiJdLCJYaiI6WyJ0bjxGSz4iXSwiek0iOlsi
-dG48Rks+Il0sImJRIjpbInRuPEZLPiJdLCJjWCI6WyJ0bjxGSz4iXSwiR20uRSI6InRuPEZLPiIsImxE
-LkUiOiJ0bjxGSz4ifSwiSUIiOnsidG4iOlsiRksiXX0sIllsIjp7IkdtIjpbInFVIl0sImxEIjpbInFV
-Il0sInpNIjpbInFVIl0sIlhqIjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sIkdtLkUiOiJx
-VSIsImxELkUiOiJxVSJ9LCJ3eiI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6
-WyIxIl0sImxELkUiOiIxIn0sImN2Ijp7InVIIjpbXSwiRDAiOltdfSwiVDUiOnsiQXoiOltdfSwiWFYi
-OnsiR20iOlsiVDUiXSwibEQiOlsiVDUiXSwiWGoiOlsiVDUiXSwiek0iOlsiVDUiXSwiYlEiOlsiVDUi
-XSwiY1giOlsiVDUiXSwiR20uRSI6IlQ1IiwibEQuRSI6IlQ1In0sIndKIjp7IkQwIjpbXX0sImg0Ijp7
-ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJ4biI6eyJHbSI6WyJ1SCJdLCJsRCI6WyJ1SCJdLCJ6TSI6
-WyJ1SCJdLCJYaiI6WyJ1SCJdLCJiUSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJHbS5FIjoidUgiLCJsRC5F
-IjoidUgifSwiVmIiOnsidUgiOltdLCJEMCI6W119LCJPNyI6eyJEMCI6W119LCJ3YSI6eyJEMCI6W119
-LCJKSyI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiSEwiOnsiZWEiOltdfSwid1AiOnsiY3YiOltd
-LCJ1SCI6W10sIkQwIjpbXX0sImxLIjp7IkQwIjpbXX0sIlFiIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6
-W119LCJTMCI6eyJZayI6WyJxVSIsIkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYi
-OiJAIn0sInoyIjp7IllrIjpbInFVIiwiQCJdLCJaMCI6WyJxVSIsIkAiXSwiWWsuSyI6InFVIiwiWWsu
-ViI6IkAifSwiRE0iOnsiR20iOlsiQVciXSwibEQiOlsiQVciXSwiWGoiOlsiQVciXSwiek0iOlsiQVci
-XSwiYlEiOlsiQVciXSwiY1giOlsiQVciXSwiR20uRSI6IkFXIiwibEQuRSI6IkFXIn0sIkFqIjp7ImVh
-IjpbXX0sImU3Ijp7ImxEIjpbInVIIl0sInpNIjpbInVIIl0sImJRIjpbInVIIl0sImNYIjpbInVIIl0s
-ImxELkUiOiJ1SCJ9LCJ1SCI6eyJEMCI6W119LCJCSCI6eyJHbSI6WyJ1SCJdLCJsRCI6WyJ1SCJdLCJ6
-TSI6WyJ1SCJdLCJYaiI6WyJ1SCJdLCJiUSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJHbS5FIjoidUgiLCJs
-RC5FIjoidUgifSwiUWwiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIkdYIjp7ImN2IjpbXSwidUgi
-OltdLCJEMCI6W119LCJTTiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiSEQiOnsiY3YiOltdLCJ1
-SCI6W10sIkQwIjpbXX0sIkV2Ijp7IkdtIjpbImNsIl0sImxEIjpbImNsIl0sInpNIjpbImNsIl0sIlhq
-IjpbImNsIl0sImJRIjpbImNsIl0sImNYIjpbImNsIl0sIkdtLkUiOiJjbCIsImxELkUiOiJjbCJ9LCJM
-ciI6eyJEMCI6W119LCJLUiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiZXciOnsiZWEiOltdfSwi
-cDgiOnsiWWsiOlsicVUiLCJAIl0sIlowIjpbInFVIiwiQCJdLCJZay5LIjoicVUiLCJZay5WIjoiQCJ9
-LCJscCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiU1YiOnsiRDAiOltdfSwiTWsiOnsiR20iOlsi
-U1YiXSwibEQiOlsiU1YiXSwiek0iOlsiU1YiXSwiWGoiOlsiU1YiXSwiRDAiOltdLCJiUSI6WyJTViJd
-LCJjWCI6WyJTViJdLCJHbS5FIjoiU1YiLCJsRC5FIjoiU1YifSwiTm4iOnsiR20iOlsiWTQiXSwibEQi
-OlsiWTQiXSwiek0iOlsiWTQiXSwiWGoiOlsiWTQiXSwiYlEiOlsiWTQiXSwiY1giOlsiWTQiXSwiR20u
-RSI6Ilk0IiwibEQuRSI6Ilk0In0sIkFzIjp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJd
-LCJZay5LIjoicVUiLCJZay5WIjoicVUifSwiYmsiOnsiZWEiOltdfSwiVGIiOnsiY3YiOltdLCJ1SCI6
-W10sIkQwIjpbXX0sIkl2Ijp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJCVCI6eyJjdiI6W10sInVI
-IjpbXSwiRDAiOltdfSwiZlgiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIkZCIjp7ImN2IjpbXSwi
-dUgiOltdLCJEMCI6W119LCJBMSI6eyJEMCI6W119LCJNTiI6eyJEMCI6W119LCJYMCI6eyJHbSI6WyJN
-TiJdLCJsRCI6WyJNTiJdLCJYaiI6WyJNTiJdLCJ6TSI6WyJNTiJdLCJiUSI6WyJNTiJdLCJjWCI6WyJN
-TiJdLCJHbS5FIjoiTU4iLCJsRC5FIjoiTU4ifSwibkoiOnsiR20iOlsiQTEiXSwibEQiOlsiQTEiXSwi
-WGoiOlsiQTEiXSwiek0iOlsiQTEiXSwiRDAiOltdLCJiUSI6WyJBMSJdLCJjWCI6WyJBMSJdLCJHbS5F
-IjoiQTEiLCJsRC5FIjoiQTEifSwiY2kiOnsiR20iOlsiYTMiXSwibEQiOlsiYTMiXSwiek0iOlsiYTMi
-XSwiWGoiOlsiYTMiXSwiYlEiOlsiYTMiXSwiY1giOlsiYTMiXSwiR20uRSI6ImEzIiwibEQuRSI6ImEz
-In0sInc2Ijp7ImVhIjpbXX0sInZGIjp7IkQwIjpbXX0sIk9pIjp7InY2IjpbXSwiRDAiOltdfSwiQ20i
-OnsiRDAiOltdfSwiQ1EiOnsidUgiOltdLCJEMCI6W119LCJQUiI6eyJHbSI6WyJsdyJdLCJsRCI6WyJs
-dyJdLCJ6TSI6WyJsdyJdLCJYaiI6WyJsdyJdLCJiUSI6WyJsdyJdLCJjWCI6WyJsdyJdLCJHbS5FIjoi
-bHciLCJsRC5FIjoibHcifSwidzQiOnsidG4iOlsiRksiXX0sIkYyIjp7IkdtIjpbIkdPIl0sImxEIjpb
-IkdPIl0sIlhqIjpbIkdPIl0sInpNIjpbIkdPIl0sImJRIjpbIkdPIl0sImNYIjpbIkdPIl0sIkdtLkUi
-OiJHTyIsImxELkUiOiJHTyJ9LCJyaCI6eyJHbSI6WyJ1SCJdLCJsRCI6WyJ1SCJdLCJ6TSI6WyJ1SCJd
-LCJYaiI6WyJ1SCJdLCJiUSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJHbS5FIjoidUgiLCJsRC5FIjoidUgi
-fSwiTE8iOnsiR20iOlsibDgiXSwibEQiOlsibDgiXSwiek0iOlsibDgiXSwiWGoiOlsibDgiXSwiYlEi
-OlsibDgiXSwiY1giOlsibDgiXSwiR20uRSI6Imw4IiwibEQuRSI6Imw4In0sImIxIjp7IkdtIjpbIldX
-Il0sImxEIjpbIldXIl0sIlhqIjpbIldXIl0sInpNIjpbIldXIl0sImJRIjpbIldXIl0sImNYIjpbIldX
-Il0sIkdtLkUiOiJXVyIsImxELkUiOiJXVyJ9LCJhVCI6eyJZayI6WyJxVSIsInFVIl0sIlowIjpbInFV
-IiwicVUiXX0sImk3Ijp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5LIjoicVUi
-LCJZay5WIjoicVUifSwiU3kiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl0sIllrLksi
-OiJxVSIsIllrLlYiOiJxVSJ9LCJJNCI6eyJsZiI6WyJxVSJdLCJ4dSI6WyJxVSJdLCJiUSI6WyJxVSJd
-LCJjWCI6WyJxVSJdfSwiUk8iOnsicWgiOlsiMSJdfSwiZXUiOnsiUk8iOlsiMSJdLCJxaCI6WyIxIl19
-LCJ4QyI6eyJNTyI6WyIxIl19LCJKUSI6eyJrRiI6W119LCJ2RCI6eyJrRiI6W119LCJtNiI6eyJrRiI6
-W119LCJjdCI6eyJrRiI6W119LCJPdyI6eyJrRiI6W119LCJXOSI6eyJBbiI6WyIxIl19LCJkVyI6eyJ2
-NiI6W10sIkQwIjpbXX0sIm1rIjp7IldRIjpbXX0sIktvIjp7Im9uIjpbXX0sImRNIjp7ImxmIjpbInFV
-Il0sInh1IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl19LCJyNyI6eyJFNCI6W119LCJUeiI6
-eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJFNCI6W10sImNYIjpbIjEiXSwibEQuRSI6
-IjEifSwicTYiOnsiR20iOlsieDAiXSwibEQiOlsieDAiXSwiek0iOlsieDAiXSwiYlEiOlsieDAiXSwi
-Y1giOlsieDAiXSwiR20uRSI6IngwIiwibEQuRSI6IngwIn0sImZ6Ijp7IkdtIjpbInVQIl0sImxEIjpb
-InVQIl0sInpNIjpbInVQIl0sImJRIjpbInVQIl0sImNYIjpbInVQIl0sIkdtLkUiOiJ1UCIsImxELkUi
-OiJ1UCJ9LCJuZCI6eyJkNSI6W10sImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJLcSI6eyJHbSI6WyJx
-VSJdLCJsRCI6WyJxVSJdLCJ6TSI6WyJxVSJdLCJiUSI6WyJxVSJdLCJjWCI6WyJxVSJdLCJHbS5FIjoi
-cVUiLCJsRC5FIjoicVUifSwiS2UiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwi
-Y1giOlsicVUiXX0sImQ1Ijp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJOQyI6eyJHbSI6WyJ6WSJd
-LCJsRCI6WyJ6WSJdLCJ6TSI6WyJ6WSJdLCJiUSI6WyJ6WSJdLCJjWCI6WyJ6WSJdLCJHbS5FIjoielki
-LCJsRC5FIjoielkifSwibjYiOnsiek0iOlsiS04iXSwiYlEiOlsiS04iXSwiQVMiOltdLCJjWCI6WyJL
-TiJdfSwiejgiOnsiWWsiOlsicVUiLCJAIl0sIlowIjpbInFVIiwiQCJdLCJZay5LIjoicVUiLCJZay5W
-IjoiQCJ9LCJmbyI6eyJEMCI6W119LCJWOCI6eyJEMCI6W119LCJHbiI6eyJEMCI6W119LCJGbiI6eyJH
-bSI6WyJaMDxALEA+Il0sImxEIjpbIlowPEAsQD4iXSwiek0iOlsiWjA8QCxAPiJdLCJiUSI6WyJaMDxA
-LEA+Il0sImNYIjpbIlowPEAsQD4iXSwiR20uRSI6IlowPEAsQD4iLCJsRC5FIjoiWjA8QCxAPiJ9LCJY
-QSI6eyJrRiI6W119LCJPRiI6eyJMdSI6W119LCJydSI6eyJMdSI6W119LCJJViI6eyJMdSI6W119fScp
-KQpILkZGKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3siYlEiOjEsIlhDIjoxLCJNTyI6MSwia1Qi
-OjIsIm1XIjoxLCJMVSI6MSwiaWwiOjIsIlJLIjoxLCJuWSI6MSwiV1kiOjEsImNvIjoxLCJJTiI6MX0n
-KSkKdmFyIHU9KGZ1bmN0aW9uIHJ0aWkoKXt2YXIgdD1ILllRCnJldHVybntpOnQoIkdoIiksbjp0KCJD
-dyIpLGNSOnQoIm5CIiksZDp0KCJBeiIpLGs6dCgiUVAiKSxnRjp0KCJQRDxHRCxAPiIpLGc1OnQoImx3
-IiksZ3c6dCgiYlE8QD4iKSxoOnQoImN2IiksYlU6dCgiWFMiKSxCOnQoImVhIiksYVM6dCgiRDAiKSxP
-OnQoIlQ1IiksYlg6dCgiWFYiKSxaOnQoIkVIIiksYzp0KCJiODxAPiIpLGRQOnQoIkdPIikscjp0KCJP
-NyIpLEk6dCgiU2ciKSxvOnQoInZRIiksZWg6dCgiY1g8dUg+IiksWDp0KCJjWDxxVT4iKSxSOnQoImNY
-PEA+IiksZkE6dCgiamQ8U2U+IiksZ2k6dCgiamQ8ajg+IiksZmg6dCgiamQ8Wlo+IiksbTp0KCJqZDxr
-Rj4iKSxzOnQoImpkPHFVPiIpLGhoOnQoImpkPHlEPiIpLGFKOnQoImpkPHdiPiIpLHU6dCgiamQ8QD4i
-KSx0OnQoImpkPEtOPiIpLGVIOnQoInZtIiksZzp0KCJjNSIpLGFVOnQoIlhqPEA+IiksYW06dCgiVHo8
-QD4iKSxlbzp0KCJONTxHRCxAPiIpLHY6dCgiRTQiKSxkejp0KCJoRiIpLGJHOnQoIngwIiksZjQ6dCgi
-ek08ajg+IiksYTp0KCJ6TTxxVT4iKSxqOnQoInpNPEA+IiksTDp0KCJ6TTxLTj4iKSxhXzp0KCJ1OCIp
-LGY6dCgiWjA8cVUscVU+IiksYjp0KCJaMDxxVSxAPiIpLEc6dCgiWjA8QCxAPiIpLGR2OnQoIkE4PHFV
-LHFVPiIpLGRvOnQoIkE4PHFVLEA+IiksYks6dCgibEsiKSxjSTp0KCJBVyIpLFY6dCgiQWoiKSxiWjp0
-KCJXWiIpLGREOnQoIkVUIiksYm06dCgiVjYiKSxBOnQoInVIIiksZTp0KCJrRiIpLFA6dCgiYzgiKSxj
-azp0KCJ1UCIpLEs6dCgiayIpLGhlOnQoImNsIikscDp0KCJldyIpLHE6dCgidG48Rks+IiksZnY6dCgi
-d0wiKSxhdjp0KCJKYyIpLGV3OnQoIm5kIiksQzp0KCJ4dTxxVT4iKSxmWTp0KCJTViIpLGY3OnQoIlk0
-IiksZ2Y6dCgibDgiKSxsOnQoIkd6IiksTjp0KCJxVSIpLGRHOnQoInFVKHFVKSIpLGduOnQoIldXIiks
-Zzc6dCgiZDUiKSxmbzp0KCJHRCIpLGFXOnQoImZYIiksYTA6dCgiQTEiKSxjNzp0KCJNTiIpLGFLOnQo
-ImEzIiksY006dCgielkiKSx3OnQoIkFTIiksZ2M6dCgibjYiKSxhazp0KCJrZCIpLFc6dCgiR2o8cVUs
-cVU+IiksRDp0KCJpRCIpLGNjOnQoIlU1PHFVPiIpLGc0OnQoIk9pIiksY2k6dCgidjYiKSxnMjp0KCJD
-bSIpLGJqOnQoIlpmPE83PiIpLGg5OnQoIkNRIiksYWM6dCgiZTciKSxROnQoImV1PEFqPiIpLFM6dCgi
-d3o8Y3Y+IikseDp0KCJGZTxALEA+IiksYW86dCgidnM8Tzc+IiksXzp0KCJ2czxAPiIpLGZKOnQoInZz
-PEtOPiIpLEU6dCgiSlEiKSxKOnQoImJuIiksY0o6dCgiYTIiKSxhbDp0KCJhMihrKSIpLGJCOnQoImEy
-KHFVKSIpLGJmOnQoImEyKEApIiksejp0KCJAIiksZk86dCgiQCgpIiksRjp0KCJAKGVhKSIpLHk6dCgi
-QChrKSIpLGVwOnQoIkAoayxrKSIpLGFnOnQoIkAoayxHeikiKSxjaDp0KCJAKHh1PHFVPikiKSxkTzp0
-KCJAKHFVKSIpLFk6dCgiQChALEApIiksZWc6dCgiS04iKSxIOnQoIn4iKSxNOnQoIn4oKSIpLGFuOnQo
-In4oZXcpIiksVTp0KCJ+KHFVLHFVKSIpLFQ6dCgifihxVSxAKSIpfX0pKCk7KGZ1bmN0aW9uIGNvbnN0
-YW50cygpe3ZhciB0PWh1bmtIZWxwZXJzLm1ha2VDb25zdExpc3QKQy5SWT1XLlFQLnByb3RvdHlwZQpD
-LkJaPVcuVmIucHJvdG90eXBlCkMuRHQ9Vy5PNy5wcm90b3R5cGUKQy5Paz1KLnZCLnByb3RvdHlwZQpD
-Lk5tPUouamQucHJvdG90eXBlCkMuam49Si51ci5wcm90b3R5cGUKQy5qTj1KLllFLnByb3RvdHlwZQpD
-LkNEPUoucUkucHJvdG90eXBlCkMueEI9Si5Eci5wcm90b3R5cGUKQy5ERz1KLmM1LnByb3RvdHlwZQpD
-LkV4PVcudTgucHJvdG90eXBlCkMudDU9Vy5CSC5wcm90b3R5cGUKQy5MdD1XLlNOLnByb3RvdHlwZQpD
-LlpRPUouaUMucHJvdG90eXBlCkMuSWU9Vy5UYi5wcm90b3R5cGUKQy52Qj1KLmtkLnByb3RvdHlwZQpD
-Lm9sPVcuT2kucHJvdG90eXBlCkMueTg9bmV3IFAudkEoKQpDLmg5PW5ldyBQLkNWKCkKQy5PND1mdW5j
-dGlvbiBnZXRUYWdGYWxsYmFjayhvKSB7CiAgdmFyIHMgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5n
-LmNhbGwobyk7CiAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7Cn0KQy5ZcT1mdW5j
-dGlvbigpIHsKICB2YXIgdG9TdHJpbmdGdW5jdGlvbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7
-CiAgZnVuY3Rpb24gZ2V0VGFnKG8pIHsKICAgIHZhciBzID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxsKG8p
-OwogICAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7CiAgfQogIGZ1bmN0aW9uIGdl
-dFVua25vd25UYWcob2JqZWN0LCB0YWcpIHsKICAgIGlmICgvXkhUTUxbQS1aXS4qRWxlbWVudCQvLnRl
-c3QodGFnKSkgewogICAgICB2YXIgbmFtZSA9IHRvU3RyaW5nRnVuY3Rpb24uY2FsbChvYmplY3QpOwog
-ICAgICBpZiAobmFtZSA9PSAiW29iamVjdCBPYmplY3RdIikgcmV0dXJuIG51bGw7CiAgICAgIHJldHVy
-biAiSFRNTEVsZW1lbnQiOwogICAgfQogIH0KICBmdW5jdGlvbiBnZXRVbmtub3duVGFnR2VuZXJpY0Jy
-b3dzZXIob2JqZWN0LCB0YWcpIHsKICAgIGlmIChzZWxmLkhUTUxFbGVtZW50ICYmIG9iamVjdCBpbnN0
-YW5jZW9mIEhUTUxFbGVtZW50KSByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAgIHJldHVybiBnZXRVbmtu
-b3duVGFnKG9iamVjdCwgdGFnKTsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnKHRhZykgewog
-ICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaWYgKHR5
-cGVvZiB3aW5kb3dbdGFnXSA9PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgICB2YXIgY29uc3Ry
-dWN0b3IgPSB3aW5kb3dbdGFnXTsKICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT0gImZ1bmN0aW9u
-IikgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlOwogIH0KICBmdW5j
-dGlvbiBkaXNjcmltaW5hdG9yKHRhZykgeyByZXR1cm4gbnVsbDsgfQogIHZhciBpc0Jyb3dzZXIgPSB0
-eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiOwogIHJldHVybiB7CiAgICBnZXRUYWc6IGdldFRhZywK
-ICAgIGdldFVua25vd25UYWc6IGlzQnJvd3NlciA/IGdldFVua25vd25UYWdHZW5lcmljQnJvd3NlciA6
-IGdldFVua25vd25UYWcsCiAgICBwcm90b3R5cGVGb3JUYWc6IHByb3RvdHlwZUZvclRhZywKICAgIGRp
-c2NyaW1pbmF0b3I6IGRpc2NyaW1pbmF0b3IgfTsKfQpDLndiPWZ1bmN0aW9uKGdldFRhZ0ZhbGxiYWNr
-KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGhvb2tzKSB7CiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPSAi
-b2JqZWN0IikgcmV0dXJuIGhvb2tzOwogICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKICAg
-IGlmICh1YS5pbmRleE9mKCJEdW1wUmVuZGVyVHJlZSIpID49IDApIHJldHVybiBob29rczsKICAgIGlm
-ICh1YS5pbmRleE9mKCJDaHJvbWUiKSA+PSAwKSB7CiAgICAgIGZ1bmN0aW9uIGNvbmZpcm0ocCkgewog
-ICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93ID09ICJvYmplY3QiICYmIHdpbmRvd1twXSAmJiB3aW5k
-b3dbcF0ubmFtZSA9PSBwOwogICAgICB9CiAgICAgIGlmIChjb25maXJtKCJXaW5kb3ciKSAmJiBjb25m
-aXJtKCJIVE1MRWxlbWVudCIpKSByZXR1cm4gaG9va3M7CiAgICB9CiAgICBob29rcy5nZXRUYWcgPSBn
-ZXRUYWdGYWxsYmFjazsKICB9Owp9CkMuS1U9ZnVuY3Rpb24oaG9va3MpIHsKICBpZiAodHlwZW9mIGRh
-cnRFeHBlcmltZW50YWxGaXh1cEdldFRhZyAhPSAiZnVuY3Rpb24iKSByZXR1cm4gaG9va3M7CiAgaG9v
-a3MuZ2V0VGFnID0gZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnKGhvb2tzLmdldFRhZyk7Cn0KQy5m
-UT1mdW5jdGlvbihob29rcykgewogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHByb3Rv
-dHlwZUZvclRhZyA9IGhvb2tzLnByb3RvdHlwZUZvclRhZzsKICBmdW5jdGlvbiBnZXRUYWdGaXhlZChv
-KSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgaWYgKHRhZyA9PSAiRG9jdW1lbnQiKSB7CiAg
-ICAgIGlmICghIW8ueG1sVmVyc2lvbikgcmV0dXJuICIhRG9jdW1lbnQiOwogICAgICByZXR1cm4gIiFI
-VE1MRG9jdW1lbnQiOwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBl
-Rm9yVGFnRml4ZWQodGFnKSB7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHJldHVybiBudWxsOwog
-ICAgcmV0dXJuIHByb3RvdHlwZUZvclRhZyh0YWcpOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdG
-aXhlZDsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBwcm90b3R5cGVGb3JUYWdGaXhlZDsKfQpDLmRr
-PWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9i
-amVjdCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogIiI7CiAgaWYgKHVzZXJBZ2VudC5pbmRleE9mKCJG
-aXJlZm94IikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFnOwog
-IHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIsCiAgICAiRGF0
-YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiR2VvR2VvbG9jYXRpb24iOiAiR2VvbG9jYXRpb24i
-LAogICAgIkxvY2F0aW9uIjogIiFMb2NhdGlvbiIsCiAgICAiV29ya2VyTWVzc2FnZUV2ZW50IjogIk1l
-c3NhZ2VFdmVudCIsCiAgICAiWE1MRG9jdW1lbnQiOiAiIURvY3VtZW50In07CiAgZnVuY3Rpb24gZ2V0
-VGFnRmlyZWZveChvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgcmV0dXJuIHF1aWNrTWFw
-W3RhZ10gfHwgdGFnOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdGaXJlZm94Owp9CkMueGk9ZnVu
-Y3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0
-IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAiIjsKICBpZiAodXNlckFnZW50LmluZGV4T2YoIlRyaWRl
-bnQvIikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFnOwogIHZh
-ciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIsCiAgICAiRGF0YVRy
-YW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiSFRNTERERWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAg
-ICAiSFRNTERURWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiSFRNTFBocmFzZUVsZW1lbnQiOiAi
-SFRNTEVsZW1lbnQiLAogICAgIlBvc2l0aW9uIjogIkdlb3Bvc2l0aW9uIgogIH07CiAgZnVuY3Rpb24g
-Z2V0VGFnSUUobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIHZhciBuZXdUYWcgPSBxdWlj
-a01hcFt0YWddOwogICAgaWYgKG5ld1RhZykgcmV0dXJuIG5ld1RhZzsKICAgIGlmICh0YWcgPT0gIk9i
-amVjdCIpIHsKICAgICAgaWYgKHdpbmRvdy5EYXRhVmlldyAmJiAobyBpbnN0YW5jZW9mIHdpbmRvdy5E
-YXRhVmlldykpIHJldHVybiAiRGF0YVZpZXciOwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAgZnVu
-Y3Rpb24gcHJvdG90eXBlRm9yVGFnSUUodGFnKSB7CiAgICB2YXIgY29uc3RydWN0b3IgPSB3aW5kb3db
-dGFnXTsKICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBj
-b25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0lFOwogIGhvb2tz
-LnByb3RvdHlwZUZvclRhZyA9IHByb3RvdHlwZUZvclRhZ0lFOwp9CkMuaTc9ZnVuY3Rpb24oaG9va3Mp
-IHsgcmV0dXJuIGhvb2tzOyB9CgpDLkN0PW5ldyBQLmJ5KCkKQy5FcT1uZXcgUC5rNSgpCkMueE09bmV3
-IFAudTUoKQpDLlFrPW5ldyBQLkUzKCkKQy5OVT1uZXcgUC5KaSgpCkMuQTM9bmV3IFAuTXgobnVsbCkK
-Qy5HYj1ILlZNKHQoWzEyNywyMDQ3LDY1NTM1LDExMTQxMTFdKSx1LnQpCkMuYWs9SC5WTSh0KFswLDAs
-MzI3NzYsMzM3OTIsMSwxMDI0MCwwLDBdKSx1LnQpCkMuY209SC5WTSh0KFsiKjo6Y2xhc3MiLCIqOjpk
-aXIiLCIqOjpkcmFnZ2FibGUiLCIqOjpoaWRkZW4iLCIqOjppZCIsIio6OmluZXJ0IiwiKjo6aXRlbXBy
-b3AiLCIqOjppdGVtcmVmIiwiKjo6aXRlbXNjb3BlIiwiKjo6bGFuZyIsIio6OnNwZWxsY2hlY2siLCIq
-Ojp0aXRsZSIsIio6OnRyYW5zbGF0ZSIsIkE6OmFjY2Vzc2tleSIsIkE6OmNvb3JkcyIsIkE6OmhyZWZs
-YW5nIiwiQTo6bmFtZSIsIkE6OnNoYXBlIiwiQTo6dGFiaW5kZXgiLCJBOjp0YXJnZXQiLCJBOjp0eXBl
-IiwiQVJFQTo6YWNjZXNza2V5IiwiQVJFQTo6YWx0IiwiQVJFQTo6Y29vcmRzIiwiQVJFQTo6bm9ocmVm
-IiwiQVJFQTo6c2hhcGUiLCJBUkVBOjp0YWJpbmRleCIsIkFSRUE6OnRhcmdldCIsIkFVRElPOjpjb250
-cm9scyIsIkFVRElPOjpsb29wIiwiQVVESU86Om1lZGlhZ3JvdXAiLCJBVURJTzo6bXV0ZWQiLCJBVURJ
-Tzo6cHJlbG9hZCIsIkJETzo6ZGlyIiwiQk9EWTo6YWxpbmsiLCJCT0RZOjpiZ2NvbG9yIiwiQk9EWTo6
-bGluayIsIkJPRFk6OnRleHQiLCJCT0RZOjp2bGluayIsIkJSOjpjbGVhciIsIkJVVFRPTjo6YWNjZXNz
-a2V5IiwiQlVUVE9OOjpkaXNhYmxlZCIsIkJVVFRPTjo6bmFtZSIsIkJVVFRPTjo6dGFiaW5kZXgiLCJC
-VVRUT046OnR5cGUiLCJCVVRUT046OnZhbHVlIiwiQ0FOVkFTOjpoZWlnaHQiLCJDQU5WQVM6OndpZHRo
-IiwiQ0FQVElPTjo6YWxpZ24iLCJDT0w6OmFsaWduIiwiQ09MOjpjaGFyIiwiQ09MOjpjaGFyb2ZmIiwi
-Q09MOjpzcGFuIiwiQ09MOjp2YWxpZ24iLCJDT0w6OndpZHRoIiwiQ09MR1JPVVA6OmFsaWduIiwiQ09M
-R1JPVVA6OmNoYXIiLCJDT0xHUk9VUDo6Y2hhcm9mZiIsIkNPTEdST1VQOjpzcGFuIiwiQ09MR1JPVVA6
-OnZhbGlnbiIsIkNPTEdST1VQOjp3aWR0aCIsIkNPTU1BTkQ6OmNoZWNrZWQiLCJDT01NQU5EOjpjb21t
-YW5kIiwiQ09NTUFORDo6ZGlzYWJsZWQiLCJDT01NQU5EOjpsYWJlbCIsIkNPTU1BTkQ6OnJhZGlvZ3Jv
-dXAiLCJDT01NQU5EOjp0eXBlIiwiREFUQTo6dmFsdWUiLCJERUw6OmRhdGV0aW1lIiwiREVUQUlMUzo6
-b3BlbiIsIkRJUjo6Y29tcGFjdCIsIkRJVjo6YWxpZ24iLCJETDo6Y29tcGFjdCIsIkZJRUxEU0VUOjpk
-aXNhYmxlZCIsIkZPTlQ6OmNvbG9yIiwiRk9OVDo6ZmFjZSIsIkZPTlQ6OnNpemUiLCJGT1JNOjphY2Nl
-cHQiLCJGT1JNOjphdXRvY29tcGxldGUiLCJGT1JNOjplbmN0eXBlIiwiRk9STTo6bWV0aG9kIiwiRk9S
-TTo6bmFtZSIsIkZPUk06Om5vdmFsaWRhdGUiLCJGT1JNOjp0YXJnZXQiLCJGUkFNRTo6bmFtZSIsIkgx
-OjphbGlnbiIsIkgyOjphbGlnbiIsIkgzOjphbGlnbiIsIkg0OjphbGlnbiIsIkg1OjphbGlnbiIsIkg2
-OjphbGlnbiIsIkhSOjphbGlnbiIsIkhSOjpub3NoYWRlIiwiSFI6OnNpemUiLCJIUjo6d2lkdGgiLCJI
-VE1MOjp2ZXJzaW9uIiwiSUZSQU1FOjphbGlnbiIsIklGUkFNRTo6ZnJhbWVib3JkZXIiLCJJRlJBTUU6
-OmhlaWdodCIsIklGUkFNRTo6bWFyZ2luaGVpZ2h0IiwiSUZSQU1FOjptYXJnaW53aWR0aCIsIklGUkFN
-RTo6d2lkdGgiLCJJTUc6OmFsaWduIiwiSU1HOjphbHQiLCJJTUc6OmJvcmRlciIsIklNRzo6aGVpZ2h0
-IiwiSU1HOjpoc3BhY2UiLCJJTUc6OmlzbWFwIiwiSU1HOjpuYW1lIiwiSU1HOjp1c2VtYXAiLCJJTUc6
-OnZzcGFjZSIsIklNRzo6d2lkdGgiLCJJTlBVVDo6YWNjZXB0IiwiSU5QVVQ6OmFjY2Vzc2tleSIsIklO
-UFVUOjphbGlnbiIsIklOUFVUOjphbHQiLCJJTlBVVDo6YXV0b2NvbXBsZXRlIiwiSU5QVVQ6OmF1dG9m
-b2N1cyIsIklOUFVUOjpjaGVja2VkIiwiSU5QVVQ6OmRpc2FibGVkIiwiSU5QVVQ6OmlucHV0bW9kZSIs
-IklOUFVUOjppc21hcCIsIklOUFVUOjpsaXN0IiwiSU5QVVQ6Om1heCIsIklOUFVUOjptYXhsZW5ndGgi
-LCJJTlBVVDo6bWluIiwiSU5QVVQ6Om11bHRpcGxlIiwiSU5QVVQ6Om5hbWUiLCJJTlBVVDo6cGxhY2Vo
-b2xkZXIiLCJJTlBVVDo6cmVhZG9ubHkiLCJJTlBVVDo6cmVxdWlyZWQiLCJJTlBVVDo6c2l6ZSIsIklO
-UFVUOjpzdGVwIiwiSU5QVVQ6OnRhYmluZGV4IiwiSU5QVVQ6OnR5cGUiLCJJTlBVVDo6dXNlbWFwIiwi
-SU5QVVQ6OnZhbHVlIiwiSU5TOjpkYXRldGltZSIsIktFWUdFTjo6ZGlzYWJsZWQiLCJLRVlHRU46Omtl
-eXR5cGUiLCJLRVlHRU46Om5hbWUiLCJMQUJFTDo6YWNjZXNza2V5IiwiTEFCRUw6OmZvciIsIkxFR0VO
-RDo6YWNjZXNza2V5IiwiTEVHRU5EOjphbGlnbiIsIkxJOjp0eXBlIiwiTEk6OnZhbHVlIiwiTElOSzo6
-c2l6ZXMiLCJNQVA6Om5hbWUiLCJNRU5VOjpjb21wYWN0IiwiTUVOVTo6bGFiZWwiLCJNRU5VOjp0eXBl
-IiwiTUVURVI6OmhpZ2giLCJNRVRFUjo6bG93IiwiTUVURVI6Om1heCIsIk1FVEVSOjptaW4iLCJNRVRF
-Ujo6dmFsdWUiLCJPQkpFQ1Q6OnR5cGVtdXN0bWF0Y2giLCJPTDo6Y29tcGFjdCIsIk9MOjpyZXZlcnNl
-ZCIsIk9MOjpzdGFydCIsIk9MOjp0eXBlIiwiT1BUR1JPVVA6OmRpc2FibGVkIiwiT1BUR1JPVVA6Omxh
-YmVsIiwiT1BUSU9OOjpkaXNhYmxlZCIsIk9QVElPTjo6bGFiZWwiLCJPUFRJT046OnNlbGVjdGVkIiwi
-T1BUSU9OOjp2YWx1ZSIsIk9VVFBVVDo6Zm9yIiwiT1VUUFVUOjpuYW1lIiwiUDo6YWxpZ24iLCJQUkU6
-OndpZHRoIiwiUFJPR1JFU1M6Om1heCIsIlBST0dSRVNTOjptaW4iLCJQUk9HUkVTUzo6dmFsdWUiLCJT
-RUxFQ1Q6OmF1dG9jb21wbGV0ZSIsIlNFTEVDVDo6ZGlzYWJsZWQiLCJTRUxFQ1Q6Om11bHRpcGxlIiwi
-U0VMRUNUOjpuYW1lIiwiU0VMRUNUOjpyZXF1aXJlZCIsIlNFTEVDVDo6c2l6ZSIsIlNFTEVDVDo6dGFi
-aW5kZXgiLCJTT1VSQ0U6OnR5cGUiLCJUQUJMRTo6YWxpZ24iLCJUQUJMRTo6Ymdjb2xvciIsIlRBQkxF
-Ojpib3JkZXIiLCJUQUJMRTo6Y2VsbHBhZGRpbmciLCJUQUJMRTo6Y2VsbHNwYWNpbmciLCJUQUJMRTo6
-ZnJhbWUiLCJUQUJMRTo6cnVsZXMiLCJUQUJMRTo6c3VtbWFyeSIsIlRBQkxFOjp3aWR0aCIsIlRCT0RZ
-OjphbGlnbiIsIlRCT0RZOjpjaGFyIiwiVEJPRFk6OmNoYXJvZmYiLCJUQk9EWTo6dmFsaWduIiwiVEQ6
-OmFiYnIiLCJURDo6YWxpZ24iLCJURDo6YXhpcyIsIlREOjpiZ2NvbG9yIiwiVEQ6OmNoYXIiLCJURDo6
-Y2hhcm9mZiIsIlREOjpjb2xzcGFuIiwiVEQ6OmhlYWRlcnMiLCJURDo6aGVpZ2h0IiwiVEQ6Om5vd3Jh
-cCIsIlREOjpyb3dzcGFuIiwiVEQ6OnNjb3BlIiwiVEQ6OnZhbGlnbiIsIlREOjp3aWR0aCIsIlRFWFRB
-UkVBOjphY2Nlc3NrZXkiLCJURVhUQVJFQTo6YXV0b2NvbXBsZXRlIiwiVEVYVEFSRUE6OmNvbHMiLCJU
-RVhUQVJFQTo6ZGlzYWJsZWQiLCJURVhUQVJFQTo6aW5wdXRtb2RlIiwiVEVYVEFSRUE6Om5hbWUiLCJU
-RVhUQVJFQTo6cGxhY2Vob2xkZXIiLCJURVhUQVJFQTo6cmVhZG9ubHkiLCJURVhUQVJFQTo6cmVxdWly
-ZWQiLCJURVhUQVJFQTo6cm93cyIsIlRFWFRBUkVBOjp0YWJpbmRleCIsIlRFWFRBUkVBOjp3cmFwIiwi
-VEZPT1Q6OmFsaWduIiwiVEZPT1Q6OmNoYXIiLCJURk9PVDo6Y2hhcm9mZiIsIlRGT09UOjp2YWxpZ24i
-LCJUSDo6YWJiciIsIlRIOjphbGlnbiIsIlRIOjpheGlzIiwiVEg6OmJnY29sb3IiLCJUSDo6Y2hhciIs
-IlRIOjpjaGFyb2ZmIiwiVEg6OmNvbHNwYW4iLCJUSDo6aGVhZGVycyIsIlRIOjpoZWlnaHQiLCJUSDo6
-bm93cmFwIiwiVEg6OnJvd3NwYW4iLCJUSDo6c2NvcGUiLCJUSDo6dmFsaWduIiwiVEg6OndpZHRoIiwi
-VEhFQUQ6OmFsaWduIiwiVEhFQUQ6OmNoYXIiLCJUSEVBRDo6Y2hhcm9mZiIsIlRIRUFEOjp2YWxpZ24i
-LCJUUjo6YWxpZ24iLCJUUjo6Ymdjb2xvciIsIlRSOjpjaGFyIiwiVFI6OmNoYXJvZmYiLCJUUjo6dmFs
-aWduIiwiVFJBQ0s6OmRlZmF1bHQiLCJUUkFDSzo6a2luZCIsIlRSQUNLOjpsYWJlbCIsIlRSQUNLOjpz
-cmNsYW5nIiwiVUw6OmNvbXBhY3QiLCJVTDo6dHlwZSIsIlZJREVPOjpjb250cm9scyIsIlZJREVPOjpo
-ZWlnaHQiLCJWSURFTzo6bG9vcCIsIlZJREVPOjptZWRpYWdyb3VwIiwiVklERU86Om11dGVkIiwiVklE
-RU86OnByZWxvYWQiLCJWSURFTzo6d2lkdGgiXSksdS5zKQpDLlZDPUguVk0odChbMCwwLDY1NDkwLDQ1
-MDU1LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdS50KQpDLm1LPUguVk0odChbMCwwLDI2NjI0LDEw
-MjMsNjU1MzQsMjA0Nyw2NTUzNCwyMDQ3XSksdS50KQpDLlNxPUguVk0odChbIkhFQUQiLCJBUkVBIiwi
-QkFTRSIsIkJBU0VGT05UIiwiQlIiLCJDT0wiLCJDT0xHUk9VUCIsIkVNQkVEIiwiRlJBTUUiLCJGUkFN
-RVNFVCIsIkhSIiwiSU1BR0UiLCJJTUciLCJJTlBVVCIsIklTSU5ERVgiLCJMSU5LIiwiTUVUQSIsIlBB
-UkFNIiwiU09VUkNFIiwiU1RZTEUiLCJUSVRMRSIsIldCUiJdKSx1LnMpCkMueEQ9SC5WTSh0KFtdKSx1
-LnMpCkMuZG49SC5WTSh0KFtdKSx1LnUpCkMudG89SC5WTSh0KFswLDAsMzI3MjIsMTIyODcsNjU1MzQs
-MzQ4MTUsNjU1MzQsMTg0MzFdKSx1LnQpCkMuRjM9SC5WTSh0KFswLDAsMjQ1NzYsMTAyMyw2NTUzNCwz
-NDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5lYT1ILlZNKHQoWzAsMCwzMjc1NCwxMTI2Myw2NTUzNCwz
-NDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5aSj1ILlZNKHQoWzAsMCwzMjcyMiwxMjI4Nyw2NTUzNSwz
-NDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5XZD1ILlZNKHQoWzAsMCw2NTQ5MCwxMjI4Nyw2NTUzNSwz
-NDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5ReD1ILlZNKHQoWyJiaW5kIiwiaWYiLCJyZWYiLCJyZXBl
-YXQiLCJzeW50YXgiXSksdS5zKQpDLkJJPUguVk0odChbIkE6OmhyZWYiLCJBUkVBOjpocmVmIiwiQkxP
-Q0tRVU9URTo6Y2l0ZSIsIkJPRFk6OmJhY2tncm91bmQiLCJDT01NQU5EOjppY29uIiwiREVMOjpjaXRl
-IiwiRk9STTo6YWN0aW9uIiwiSU1HOjpzcmMiLCJJTlBVVDo6c3JjIiwiSU5TOjpjaXRlIiwiUTo6Y2l0
-ZSIsIlZJREVPOjpwb3N0ZXIiXSksdS5zKQpDLkNNPW5ldyBILkxQKDAse30sQy54RCxILllRKCJMUDxx
-VSx6TTxqOD4+IikpCkMuV089bmV3IEguTFAoMCx7fSxDLnhELEguWVEoIkxQPHFVLHFVPiIpKQpDLmhV
-PUguVk0odChbXSksSC5ZUSgiamQ8R0Q+IikpCkMuRHg9bmV3IEguTFAoMCx7fSxDLmhVLEguWVEoIkxQ
-PEdELEA+IikpCkMuWTI9bmV3IEwuQmMoIk5hdmlnYXRpb25UcmVlTm9kZVR5cGUuZGlyZWN0b3J5IikK
-Qy5yZj1uZXcgTC5CYygiTmF2aWdhdGlvblRyZWVOb2RlVHlwZS5maWxlIikKQy5UZT1uZXcgSC53digi
-Y2FsbCIpCkMud1E9bmV3IFAuRnkobnVsbCwyKX0pKCk7KGZ1bmN0aW9uIHN0YXRpY0ZpZWxkcygpeyQu
-eWo9MAokLm1KPW51bGwKJC5QND1udWxsCiQuTkY9bnVsbAokLlRYPW51bGwKJC54Nz1udWxsCiQubnc9
-bnVsbAokLnZ2PW51bGwKJC5Cdj1udWxsCiQuUzY9bnVsbAokLms4PW51bGwKJC5tZz1udWxsCiQuVUQ9
-ITEKJC5YMz1DLk5VCiQueGc9W10KJC54bz1udWxsCiQuQk89bnVsbAokLmx0PW51bGwKJC5FVT1udWxs
-CiQub3I9UC5GbCh1Lk4sdS5aKQokLkk2PW51bGwKJC5GZj1udWxsfSkoKTsoZnVuY3Rpb24gbGF6eUlu
-aXRpYWxpemVycygpe3ZhciB0PWh1bmtIZWxwZXJzLmxhenkKdCgkLCJmYSIsInciLGZ1bmN0aW9uKCl7
-cmV0dXJuIEguWWcoIl8kZGFydF9kYXJ0Q2xvc3VyZSIpfSkKdCgkLCJZMiIsIlVOIixmdW5jdGlvbigp
-e3JldHVybiBILllnKCJfJGRhcnRfanMiKX0pCnQoJCwiVTIiLCJTbiIsZnVuY3Rpb24oKXtyZXR1cm4g
-SC5jTShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJlY2VpdmVyJCJ9fSkpfSkKdCgk
-LCJ4cSIsImxxIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoeyRtZXRob2QkOm51bGwsCnRvU3Ry
-aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnQoJCwiUjEiLCJOOSIsZnVuY3Rp
-b24oKXtyZXR1cm4gSC5jTShILlM3KG51bGwpKX0pCnQoJCwiZk4iLCJpSSIsZnVuY3Rpb24oKXtyZXR1
-cm4gSC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRzRXhwciQ9JyRhcmd1bWVudHMkJwp0cnl7bnVs
-bC4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0p
-CnQoJCwicWkiLCJLZiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHZvaWQgMCkpfSkKdCgkLCJy
-WiIsIlpoIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFyICRhcmd1bWVudHNFeHBy
-JD0nJGFyZ3VtZW50cyQnCnRyeXsodm9pZCAwKS4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNo
-KHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0pCnQoJCwia3EiLCJyTiIsZnVuY3Rpb24oKXtyZXR1cm4g
-SC5jTShILk1qKG51bGwpKX0pCnQoJCwidHQiLCJjMyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5j
-dGlvbigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0pCnQo
-JCwiZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKHZvaWQgMCkpfSkKdCgkLCJBNyIs
-InIxIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2b2lkIDApLiRtZXRob2Qk
-fWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0pCnQoJCwiV2MiLCJ1dCIsZnVuY3Rpb24oKXty
-ZXR1cm4gUC5PaigpfSkKdCgkLCJraCIsInJmIixmdW5jdGlvbigpe3JldHVybiBQLldJKCl9KQp0KCQs
-ImJ0IiwiVjciLGZ1bmN0aW9uKCl7cmV0dXJuIEguRFEoSC5YRihILlZNKFstMiwtMiwtMiwtMiwtMiwt
-MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwt
-MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMSwtMiwtMiwtMiwtMiwtMiw2MiwtMiw2
-MiwtMiw2Myw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMiwtMiwtMiwtMSwtMiwtMiwtMiww
-LDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIz
-LDI0LDI1LC0yLC0yLC0yLC0yLDYzLC0yLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3
-LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0yLC0yLC0yLC0yLC0yXSx1
-LnQpKSl9KQp0KCQsIk01IiwiT3giLGZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBwcm9jZXNzIT0idW5k
-ZWZpbmVkIiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT0iW29iamVjdCBw
-cm9jZXNzXSImJnByb2Nlc3MucGxhdGZvcm09PSJ3aW4zMiJ9KQp0KCQsIm1mIiwiejQiLGZ1bmN0aW9u
-KCl7cmV0dXJuIFAubnUoIl5bXFwtXFwuMC05QS1aX2Eten5dKiQiKX0pCnQoJCwiSkciLCJ2WiIsZnVu
-Y3Rpb24oKXtyZXR1cm4gUC51eCgpfSkKdCgkLCJTQyIsIkFOIixmdW5jdGlvbigpe3JldHVybiBQLnRN
-KFsiQSIsIkFCQlIiLCJBQ1JPTllNIiwiQUREUkVTUyIsIkFSRUEiLCJBUlRJQ0xFIiwiQVNJREUiLCJB
-VURJTyIsIkIiLCJCREkiLCJCRE8iLCJCSUciLCJCTE9DS1FVT1RFIiwiQlIiLCJCVVRUT04iLCJDQU5W
-QVMiLCJDQVBUSU9OIiwiQ0VOVEVSIiwiQ0lURSIsIkNPREUiLCJDT0wiLCJDT0xHUk9VUCIsIkNPTU1B
-TkQiLCJEQVRBIiwiREFUQUxJU1QiLCJERCIsIkRFTCIsIkRFVEFJTFMiLCJERk4iLCJESVIiLCJESVYi
-LCJETCIsIkRUIiwiRU0iLCJGSUVMRFNFVCIsIkZJR0NBUFRJT04iLCJGSUdVUkUiLCJGT05UIiwiRk9P
-VEVSIiwiRk9STSIsIkgxIiwiSDIiLCJIMyIsIkg0IiwiSDUiLCJINiIsIkhFQURFUiIsIkhHUk9VUCIs
-IkhSIiwiSSIsIklGUkFNRSIsIklNRyIsIklOUFVUIiwiSU5TIiwiS0JEIiwiTEFCRUwiLCJMRUdFTkQi
-LCJMSSIsIk1BUCIsIk1BUksiLCJNRU5VIiwiTUVURVIiLCJOQVYiLCJOT0JSIiwiT0wiLCJPUFRHUk9V
-UCIsIk9QVElPTiIsIk9VVFBVVCIsIlAiLCJQUkUiLCJQUk9HUkVTUyIsIlEiLCJTIiwiU0FNUCIsIlNF
-Q1RJT04iLCJTRUxFQ1QiLCJTTUFMTCIsIlNPVVJDRSIsIlNQQU4iLCJTVFJJS0UiLCJTVFJPTkciLCJT
-VUIiLCJTVU1NQVJZIiwiU1VQIiwiVEFCTEUiLCJUQk9EWSIsIlREIiwiVEVYVEFSRUEiLCJURk9PVCIs
-IlRIIiwiVEhFQUQiLCJUSU1FIiwiVFIiLCJUUkFDSyIsIlRUIiwiVSIsIlVMIiwiVkFSIiwiVklERU8i
-LCJXQlIiXSx1Lk4pfSkKdCgkLCJWUSIsImhHIixmdW5jdGlvbigpe3JldHVybiBQLm51KCJeXFxTKyQi
-KX0pCnQoJCwid08iLCJvdyIsZnVuY3Rpb24oKXtyZXR1cm4gdS52LmIoUC5ORChzZWxmKSl9KQp0KCQs
-Imt0IiwiUjgiLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFydF9kYXJ0T2JqZWN0Iil9KQp0KCQs
-IkxGIiwia0kiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIERhcnRPYmplY3QoYSl7dGhpcy5vPWF9
-fSkKdCgkLCJxdCIsInpCIixmdW5jdGlvbigpe3JldHVybiBuZXcgVC5tUSgpfSkKdCgkLCJPbCIsIlVF
-IixmdW5jdGlvbigpe3JldHVybiBQLmhLKEMub2wuZ21XKFcueDMoKSkuaHJlZikuZ2hZKCkucSgwLCJh
-dXRoVG9rZW4iKX0pCnQoJCwiaFQiLCJ5UCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2Vs
-ZWN0b3IoIi5lZGl0LWxpc3QgLnBhbmVsLWNvbnRlbnQiKX0pCnQoJCwiVzYiLCJoTCIsZnVuY3Rpb24o
-KXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0LXBhbmVsIC5wYW5lbC1jb250ZW50Iil9
-KQp0KCQsIlRSIiwiRFciLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCJmb290
-ZXIiKX0pCnQoJCwiRVkiLCJmaSIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3Io
-ImhlYWRlciIpfSkKdCgkLCJhZCIsIkQ5IixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxl
-Y3RvcigiI3VuaXQtbmFtZSIpfSkKdCgkLCJtcSIsIktHIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5Y
-QSgpfSkKdCgkLCJtTSIsIm5VIixmdW5jdGlvbigpe3JldHVybiBuZXcgTS5sSSgkLkhrKCkpfSkKdCgk
-LCJlOSIsImJEIixmdW5jdGlvbigpe3JldHVybiBuZXcgRS5PRihQLm51KCIvIiksUC5udSgiW14vXSQi
-KSxQLm51KCJeLyIpKX0pCnQoJCwiWUsiLCJLayIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwuSVYoUC5u
-dSgiWy9cXFxcXSIpLFAubnUoIlteL1xcXFxdJCIpLFAubnUoIl4oXFxcXFxcXFxbXlxcXFxdK1xcXFxb
-XlxcXFwvXSt8W2EtekEtWl06Wy9cXFxcXSkiKSxQLm51KCJeWy9cXFxcXSg/IVsvXFxcXF0pIikpfSkK
-dCgkLCJhQyIsIkViIixmdW5jdGlvbigpe3JldHVybiBuZXcgRi5ydShQLm51KCIvIiksUC5udSgiKF5b
-YS16QS1aXVstKy5hLXpBLVpcXGRdKjovL3xbXi9dKSQiKSxQLm51KCJbYS16QS1aXVstKy5hLXpBLVpc
-XGRdKjovL1teL10qIiksUC5udSgiXi8iKSl9KQp0KCQsImxzIiwiSGsiLGZ1bmN0aW9uKCl7cmV0dXJu
-IE8uUmgoKX0pfSkoKTsoZnVuY3Rpb24gbmF0aXZlU3VwcG9ydCgpeyFmdW5jdGlvbigpe3ZhciB0PWZ1
-bmN0aW9uKGEpe3ZhciBuPXt9Cm5bYV09MQpyZXR1cm4gT2JqZWN0LmtleXMoaHVua0hlbHBlcnMuY29u
-dmVydFRvRmFzdE9iamVjdChuKSlbMF19CnYuZ2V0SXNvbGF0ZVRhZz1mdW5jdGlvbihhKXtyZXR1cm4g
-dCgiX19fZGFydF8iK2Erdi5pc29sYXRlVGFnKX0KdmFyIHM9Il9fX2RhcnRfaXNvbGF0ZV90YWdzXyIK
-dmFyIHI9T2JqZWN0W3NdfHwoT2JqZWN0W3NdPU9iamVjdC5jcmVhdGUobnVsbCkpCnZhciBxPSJfWnhZ
-eFgiCmZvcih2YXIgcD0wOztwKyspe3ZhciBvPXQocSsiXyIrcCsiXyIpCmlmKCEobyBpbiByKSl7cltv
-XT0xCnYuaXNvbGF0ZVRhZz1vCmJyZWFrfX12LmRpc3BhdGNoUHJvcGVydHlOYW1lPXYuZ2V0SXNvbGF0
-ZVRhZygiZGlzcGF0Y2hfcmVjb3JkIil9KCkKaHVua0hlbHBlcnMuc2V0T3JVcGRhdGVJbnRlcmNlcHRv
-cnNCeVRhZyh7QW5pbWF0aW9uRWZmZWN0UmVhZE9ubHk6Si52QixBbmltYXRpb25FZmZlY3RUaW1pbmc6
-Si52QixBbmltYXRpb25FZmZlY3RUaW1pbmdSZWFkT25seTpKLnZCLEFuaW1hdGlvblRpbWVsaW5lOkou
-dkIsQW5pbWF0aW9uV29ya2xldEdsb2JhbFNjb3BlOkoudkIsQXV0aGVudGljYXRvckFzc2VydGlvblJl
-c3BvbnNlOkoudkIsQXV0aGVudGljYXRvckF0dGVzdGF0aW9uUmVzcG9uc2U6Si52QixBdXRoZW50aWNh
-dG9yUmVzcG9uc2U6Si52QixCYWNrZ3JvdW5kRmV0Y2hGZXRjaDpKLnZCLEJhY2tncm91bmRGZXRjaE1h
-bmFnZXI6Si52QixCYWNrZ3JvdW5kRmV0Y2hTZXR0bGVkRmV0Y2g6Si52QixCYXJQcm9wOkoudkIsQmFy
-Y29kZURldGVjdG9yOkoudkIsQm9keTpKLnZCLEJ1ZGdldFN0YXRlOkoudkIsQ2FjaGVTdG9yYWdlOkou
-dkIsQ2FudmFzR3JhZGllbnQ6Si52QixDYW52YXNQYXR0ZXJuOkoudkIsQ2FudmFzUmVuZGVyaW5nQ29u
-dGV4dDJEOkoudkIsQ2xpZW50OkoudkIsQ2xpZW50czpKLnZCLENvb2tpZVN0b3JlOkoudkIsQ29vcmRp
-bmF0ZXM6Si52QixDcmVkZW50aWFsOkoudkIsQ3JlZGVudGlhbFVzZXJEYXRhOkoudkIsQ3JlZGVudGlh
-bHNDb250YWluZXI6Si52QixDcnlwdG86Si52QixDcnlwdG9LZXk6Si52QixDU1M6Si52QixDU1NWYXJp
-YWJsZVJlZmVyZW5jZVZhbHVlOkoudkIsQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5OkoudkIsRGF0YVRyYW5z
-ZmVyOkoudkIsRGF0YVRyYW5zZmVySXRlbTpKLnZCLERlcHJlY2F0ZWRTdG9yYWdlSW5mbzpKLnZCLERl
-cHJlY2F0ZWRTdG9yYWdlUXVvdGE6Si52QixEZXByZWNhdGlvblJlcG9ydDpKLnZCLERldGVjdGVkQmFy
-Y29kZTpKLnZCLERldGVjdGVkRmFjZTpKLnZCLERldGVjdGVkVGV4dDpKLnZCLERldmljZUFjY2VsZXJh
-dGlvbjpKLnZCLERldmljZVJvdGF0aW9uUmF0ZTpKLnZCLERpcmVjdG9yeVJlYWRlcjpKLnZCLERvY3Vt
-ZW50T3JTaGFkb3dSb290OkoudkIsRG9jdW1lbnRUaW1lbGluZTpKLnZCLERPTUVycm9yOkoudkIsRE9N
-SW1wbGVtZW50YXRpb246Si52QixJdGVyYXRvcjpKLnZCLERPTU1hdHJpeDpKLnZCLERPTU1hdHJpeFJl
-YWRPbmx5OkoudkIsRE9NUGFyc2VyOkoudkIsRE9NUG9pbnQ6Si52QixET01Qb2ludFJlYWRPbmx5Okou
-dkIsRE9NUXVhZDpKLnZCLERPTVN0cmluZ01hcDpKLnZCLEV4dGVybmFsOkoudkIsRmFjZURldGVjdG9y
-OkoudkIsRmVkZXJhdGVkQ3JlZGVudGlhbDpKLnZCLERPTUZpbGVTeXN0ZW06Si52QixGb250RmFjZTpK
-LnZCLEZvbnRGYWNlU291cmNlOkoudkIsRm9ybURhdGE6Si52QixHYW1lcGFkUG9zZTpKLnZCLEdlb2xv
-Y2F0aW9uOkoudkIsUG9zaXRpb246Si52QixIZWFkZXJzOkoudkIsSFRNTEh5cGVybGlua0VsZW1lbnRV
-dGlsczpKLnZCLElkbGVEZWFkbGluZTpKLnZCLEltYWdlQml0bWFwOkoudkIsSW1hZ2VCaXRtYXBSZW5k
-ZXJpbmdDb250ZXh0OkoudkIsSW1hZ2VDYXB0dXJlOkoudkIsSW5wdXREZXZpY2VDYXBhYmlsaXRpZXM6
-Si52QixJbnRlcnNlY3Rpb25PYnNlcnZlcjpKLnZCLEludGVyc2VjdGlvbk9ic2VydmVyRW50cnk6Si52
-QixJbnRlcnZlbnRpb25SZXBvcnQ6Si52QixLZXlmcmFtZUVmZmVjdDpKLnZCLEtleWZyYW1lRWZmZWN0
-UmVhZE9ubHk6Si52QixNZWRpYUNhcGFiaWxpdGllczpKLnZCLE1lZGlhQ2FwYWJpbGl0aWVzSW5mbzpK
-LnZCLE1lZGlhRGV2aWNlSW5mbzpKLnZCLE1lZGlhRXJyb3I6Si52QixNZWRpYUtleVN0YXR1c01hcDpK
-LnZCLE1lZGlhS2V5U3lzdGVtQWNjZXNzOkoudkIsTWVkaWFLZXlzOkoudkIsTWVkaWFLZXlzUG9saWN5
-OkoudkIsTWVkaWFNZXRhZGF0YTpKLnZCLE1lZGlhU2Vzc2lvbjpKLnZCLE1lZGlhU2V0dGluZ3NSYW5n
-ZTpKLnZCLE1lbW9yeUluZm86Si52QixNZXNzYWdlQ2hhbm5lbDpKLnZCLE1ldGFkYXRhOkoudkIsTXV0
-YXRpb25PYnNlcnZlcjpKLnZCLFdlYktpdE11dGF0aW9uT2JzZXJ2ZXI6Si52QixNdXRhdGlvblJlY29y
-ZDpKLnZCLE5hdmlnYXRpb25QcmVsb2FkTWFuYWdlcjpKLnZCLE5hdmlnYXRvcjpKLnZCLE5hdmlnYXRv
-ckF1dG9tYXRpb25JbmZvcm1hdGlvbjpKLnZCLE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTpKLnZC
-LE5hdmlnYXRvckNvb2tpZXM6Si52QixOYXZpZ2F0b3JVc2VyTWVkaWFFcnJvcjpKLnZCLE5vZGVGaWx0
-ZXI6Si52QixOb2RlSXRlcmF0b3I6Si52QixOb25Eb2N1bWVudFR5cGVDaGlsZE5vZGU6Si52QixOb25F
-bGVtZW50UGFyZW50Tm9kZTpKLnZCLE5vbmNlZEVsZW1lbnQ6Si52QixPZmZzY3JlZW5DYW52YXNSZW5k
-ZXJpbmdDb250ZXh0MkQ6Si52QixPdmVyY29uc3RyYWluZWRFcnJvcjpKLnZCLFBhaW50UmVuZGVyaW5n
-Q29udGV4dDJEOkoudkIsUGFpbnRTaXplOkoudkIsUGFpbnRXb3JrbGV0R2xvYmFsU2NvcGU6Si52QixQ
-YXNzd29yZENyZWRlbnRpYWw6Si52QixQYXRoMkQ6Si52QixQYXltZW50QWRkcmVzczpKLnZCLFBheW1l
-bnRJbnN0cnVtZW50czpKLnZCLFBheW1lbnRNYW5hZ2VyOkoudkIsUGF5bWVudFJlc3BvbnNlOkoudkIs
-UGVyZm9ybWFuY2VFbnRyeTpKLnZCLFBlcmZvcm1hbmNlTG9uZ1Rhc2tUaW1pbmc6Si52QixQZXJmb3Jt
-YW5jZU1hcms6Si52QixQZXJmb3JtYW5jZU1lYXN1cmU6Si52QixQZXJmb3JtYW5jZU5hdmlnYXRpb246
-Si52QixQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmc6Si52QixQZXJmb3JtYW5jZU9ic2VydmVyOkou
-dkIsUGVyZm9ybWFuY2VPYnNlcnZlckVudHJ5TGlzdDpKLnZCLFBlcmZvcm1hbmNlUGFpbnRUaW1pbmc6
-Si52QixQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nOkoudkIsUGVyZm9ybWFuY2VTZXJ2ZXJUaW1pbmc6
-Si52QixQZXJmb3JtYW5jZVRpbWluZzpKLnZCLFBlcm1pc3Npb25zOkoudkIsUGhvdG9DYXBhYmlsaXRp
-ZXM6Si52QixQb3NpdGlvbkVycm9yOkoudkIsUHJlc2VudGF0aW9uOkoudkIsUHJlc2VudGF0aW9uUmVj
-ZWl2ZXI6Si52QixQdWJsaWNLZXlDcmVkZW50aWFsOkoudkIsUHVzaE1hbmFnZXI6Si52QixQdXNoTWVz
-c2FnZURhdGE6Si52QixQdXNoU3Vic2NyaXB0aW9uOkoudkIsUHVzaFN1YnNjcmlwdGlvbk9wdGlvbnM6
-Si52QixSYW5nZTpKLnZCLFJlbGF0ZWRBcHBsaWNhdGlvbjpKLnZCLFJlcG9ydEJvZHk6Si52QixSZXBv
-cnRpbmdPYnNlcnZlcjpKLnZCLFJlc2l6ZU9ic2VydmVyOkoudkIsUmVzaXplT2JzZXJ2ZXJFbnRyeTpK
-LnZCLFJUQ0NlcnRpZmljYXRlOkoudkIsUlRDSWNlQ2FuZGlkYXRlOkoudkIsbW96UlRDSWNlQ2FuZGlk
-YXRlOkoudkIsUlRDTGVnYWN5U3RhdHNSZXBvcnQ6Si52QixSVENSdHBDb250cmlidXRpbmdTb3VyY2U6
-Si52QixSVENSdHBSZWNlaXZlcjpKLnZCLFJUQ1J0cFNlbmRlcjpKLnZCLFJUQ1Nlc3Npb25EZXNjcmlw
-dGlvbjpKLnZCLG1velJUQ1Nlc3Npb25EZXNjcmlwdGlvbjpKLnZCLFJUQ1N0YXRzUmVzcG9uc2U6Si52
-QixTY3JlZW46Si52QixTY3JvbGxTdGF0ZTpKLnZCLFNjcm9sbFRpbWVsaW5lOkoudkIsU2VsZWN0aW9u
-OkoudkIsU2hhcmVkQXJyYXlCdWZmZXI6Si52QixTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOkou
-dkIsU3BlZWNoU3ludGhlc2lzVm9pY2U6Si52QixTdGF0aWNSYW5nZTpKLnZCLFN0b3JhZ2VNYW5hZ2Vy
-OkoudkIsU3R5bGVNZWRpYTpKLnZCLFN0eWxlUHJvcGVydHlNYXA6Si52QixTdHlsZVByb3BlcnR5TWFw
-UmVhZG9ubHk6Si52QixTeW5jTWFuYWdlcjpKLnZCLFRhc2tBdHRyaWJ1dGlvblRpbWluZzpKLnZCLFRl
-eHREZXRlY3RvcjpKLnZCLFRleHRNZXRyaWNzOkoudkIsVHJhY2tEZWZhdWx0OkoudkIsVHJlZVdhbGtl
-cjpKLnZCLFRydXN0ZWRIVE1MOkoudkIsVHJ1c3RlZFNjcmlwdFVSTDpKLnZCLFRydXN0ZWRVUkw6Si52
-QixVbmRlcmx5aW5nU291cmNlQmFzZTpKLnZCLFVSTFNlYXJjaFBhcmFtczpKLnZCLFZSQ29vcmRpbmF0
-ZVN5c3RlbTpKLnZCLFZSRGlzcGxheUNhcGFiaWxpdGllczpKLnZCLFZSRXllUGFyYW1ldGVyczpKLnZC
-LFZSRnJhbWVEYXRhOkoudkIsVlJGcmFtZU9mUmVmZXJlbmNlOkoudkIsVlJQb3NlOkoudkIsVlJTdGFn
-ZUJvdW5kczpKLnZCLFZSU3RhZ2VCb3VuZHNQb2ludDpKLnZCLFZSU3RhZ2VQYXJhbWV0ZXJzOkoudkIs
-VmFsaWRpdHlTdGF0ZTpKLnZCLFZpZGVvUGxheWJhY2tRdWFsaXR5OkoudkIsVmlkZW9UcmFjazpKLnZC
-LFZUVFJlZ2lvbjpKLnZCLFdpbmRvd0NsaWVudDpKLnZCLFdvcmtsZXRBbmltYXRpb246Si52QixXb3Jr
-bGV0R2xvYmFsU2NvcGU6Si52QixYUGF0aEV2YWx1YXRvcjpKLnZCLFhQYXRoRXhwcmVzc2lvbjpKLnZC
-LFhQYXRoTlNSZXNvbHZlcjpKLnZCLFhQYXRoUmVzdWx0OkoudkIsWE1MU2VyaWFsaXplcjpKLnZCLFhT
-TFRQcm9jZXNzb3I6Si52QixCbHVldG9vdGg6Si52QixCbHVldG9vdGhDaGFyYWN0ZXJpc3RpY1Byb3Bl
-cnRpZXM6Si52QixCbHVldG9vdGhSZW1vdGVHQVRUU2VydmVyOkoudkIsQmx1ZXRvb3RoUmVtb3RlR0FU
-VFNlcnZpY2U6Si52QixCbHVldG9vdGhVVUlEOkoudkIsQnVkZ2V0U2VydmljZTpKLnZCLENhY2hlOkou
-dkIsRE9NRmlsZVN5c3RlbVN5bmM6Si52QixEaXJlY3RvcnlFbnRyeVN5bmM6Si52QixEaXJlY3RvcnlS
-ZWFkZXJTeW5jOkoudkIsRW50cnlTeW5jOkoudkIsRmlsZUVudHJ5U3luYzpKLnZCLEZpbGVSZWFkZXJT
-eW5jOkoudkIsRmlsZVdyaXRlclN5bmM6Si52QixIVE1MQWxsQ29sbGVjdGlvbjpKLnZCLE1vam86Si52
-QixNb2pvSGFuZGxlOkoudkIsTW9qb1dhdGNoZXI6Si52QixORkM6Si52QixQYWdlUG9wdXBDb250cm9s
-bGVyOkoudkIsUmVwb3J0OkoudkIsUmVxdWVzdDpKLnZCLFJlc3BvbnNlOkoudkIsU3VidGxlQ3J5cHRv
-OkoudkIsVVNCQWx0ZXJuYXRlSW50ZXJmYWNlOkoudkIsVVNCQ29uZmlndXJhdGlvbjpKLnZCLFVTQkRl
-dmljZTpKLnZCLFVTQkVuZHBvaW50OkoudkIsVVNCSW5UcmFuc2ZlclJlc3VsdDpKLnZCLFVTQkludGVy
-ZmFjZTpKLnZCLFVTQklzb2Nocm9ub3VzSW5UcmFuc2ZlclBhY2tldDpKLnZCLFVTQklzb2Nocm9ub3Vz
-SW5UcmFuc2ZlclJlc3VsdDpKLnZCLFVTQklzb2Nocm9ub3VzT3V0VHJhbnNmZXJQYWNrZXQ6Si52QixV
-U0JJc29jaHJvbm91c091dFRyYW5zZmVyUmVzdWx0OkoudkIsVVNCT3V0VHJhbnNmZXJSZXN1bHQ6Si52
-QixXb3JrZXJMb2NhdGlvbjpKLnZCLFdvcmtlck5hdmlnYXRvcjpKLnZCLFdvcmtsZXQ6Si52QixJREJG
-YWN0b3J5OkoudkIsSURCSW5kZXg6Si52QixJREJPYmplY3RTdG9yZTpKLnZCLElEQk9ic2VydmVyOkou
-dkIsSURCT2JzZXJ2ZXJDaGFuZ2VzOkoudkIsU1ZHQW5pbWF0ZWRBbmdsZTpKLnZCLFNWR0FuaW1hdGVk
-Qm9vbGVhbjpKLnZCLFNWR0FuaW1hdGVkRW51bWVyYXRpb246Si52QixTVkdBbmltYXRlZEludGVnZXI6
-Si52QixTVkdBbmltYXRlZExlbmd0aDpKLnZCLFNWR0FuaW1hdGVkTGVuZ3RoTGlzdDpKLnZCLFNWR0Fu
-aW1hdGVkTnVtYmVyOkoudkIsU1ZHQW5pbWF0ZWROdW1iZXJMaXN0OkoudkIsU1ZHQW5pbWF0ZWRQcmVz
-ZXJ2ZUFzcGVjdFJhdGlvOkoudkIsU1ZHQW5pbWF0ZWRSZWN0OkoudkIsU1ZHQW5pbWF0ZWRTdHJpbmc6
-Si52QixTVkdBbmltYXRlZFRyYW5zZm9ybUxpc3Q6Si52QixTVkdNYXRyaXg6Si52QixTVkdQb2ludDpK
-LnZCLFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86Si52QixTVkdSZWN0OkoudkIsU1ZHVW5pdFR5cGVzOkou
-dkIsQXVkaW9MaXN0ZW5lcjpKLnZCLEF1ZGlvVHJhY2s6Si52QixBdWRpb1dvcmtsZXRHbG9iYWxTY29w
-ZTpKLnZCLEF1ZGlvV29ya2xldFByb2Nlc3NvcjpKLnZCLFBlcmlvZGljV2F2ZTpKLnZCLFdlYkdMQWN0
-aXZlSW5mbzpKLnZCLEFOR0xFSW5zdGFuY2VkQXJyYXlzOkoudkIsQU5HTEVfaW5zdGFuY2VkX2FycmF5
-czpKLnZCLFdlYkdMQnVmZmVyOkoudkIsV2ViR0xDYW52YXM6Si52QixXZWJHTENvbG9yQnVmZmVyRmxv
-YXQ6Si52QixXZWJHTENvbXByZXNzZWRUZXh0dXJlQVNUQzpKLnZCLFdlYkdMQ29tcHJlc3NlZFRleHR1
-cmVBVEM6Si52QixXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXRjOkoudkIsV2ViR0xDb21wcmVzc2Vk
-VGV4dHVyZUVUQzE6Si52QixXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMTpKLnZCLFdlYkdMQ29t
-cHJlc3NlZFRleHR1cmVFVEM6Si52QixXZWJHTENvbXByZXNzZWRUZXh0dXJlUFZSVEM6Si52QixXRUJH
-TF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGM6Si52QixXZWJHTENvbXByZXNzZWRUZXh0dXJlUzNUQzpK
-LnZCLFdFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjOkoudkIsV2ViR0xDb21wcmVzc2VkVGV4dHVy
-ZVMzVENzUkdCOkoudkIsV2ViR0xEZWJ1Z1JlbmRlcmVySW5mbzpKLnZCLFdFQkdMX2RlYnVnX3JlbmRl
-cmVyX2luZm86Si52QixXZWJHTERlYnVnU2hhZGVyczpKLnZCLFdFQkdMX2RlYnVnX3NoYWRlcnM6Si52
-QixXZWJHTERlcHRoVGV4dHVyZTpKLnZCLFdFQkdMX2RlcHRoX3RleHR1cmU6Si52QixXZWJHTERyYXdC
-dWZmZXJzOkoudkIsV0VCR0xfZHJhd19idWZmZXJzOkoudkIsRVhUc1JHQjpKLnZCLEVYVF9zUkdCOkou
-dkIsRVhUQmxlbmRNaW5NYXg6Si52QixFWFRfYmxlbmRfbWlubWF4OkoudkIsRVhUQ29sb3JCdWZmZXJG
-bG9hdDpKLnZCLEVYVENvbG9yQnVmZmVySGFsZkZsb2F0OkoudkIsRVhURGlzam9pbnRUaW1lclF1ZXJ5
-OkoudkIsRVhURGlzam9pbnRUaW1lclF1ZXJ5V2ViR0wyOkoudkIsRVhURnJhZ0RlcHRoOkoudkIsRVhU
-X2ZyYWdfZGVwdGg6Si52QixFWFRTaGFkZXJUZXh0dXJlTE9EOkoudkIsRVhUX3NoYWRlcl90ZXh0dXJl
-X2xvZDpKLnZCLEVYVFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYzpKLnZCLEVYVF90ZXh0dXJlX2ZpbHRl
-cl9hbmlzb3Ryb3BpYzpKLnZCLFdlYkdMRnJhbWVidWZmZXI6Si52QixXZWJHTEdldEJ1ZmZlclN1YkRh
-dGFBc3luYzpKLnZCLFdlYkdMTG9zZUNvbnRleHQ6Si52QixXZWJHTEV4dGVuc2lvbkxvc2VDb250ZXh0
-OkoudkIsV0VCR0xfbG9zZV9jb250ZXh0OkoudkIsT0VTRWxlbWVudEluZGV4VWludDpKLnZCLE9FU19l
-bGVtZW50X2luZGV4X3VpbnQ6Si52QixPRVNTdGFuZGFyZERlcml2YXRpdmVzOkoudkIsT0VTX3N0YW5k
-YXJkX2Rlcml2YXRpdmVzOkoudkIsT0VTVGV4dHVyZUZsb2F0OkoudkIsT0VTX3RleHR1cmVfZmxvYXQ6
-Si52QixPRVNUZXh0dXJlRmxvYXRMaW5lYXI6Si52QixPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXI6Si52
-QixPRVNUZXh0dXJlSGFsZkZsb2F0OkoudkIsT0VTX3RleHR1cmVfaGFsZl9mbG9hdDpKLnZCLE9FU1Rl
-eHR1cmVIYWxmRmxvYXRMaW5lYXI6Si52QixPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcjpKLnZC
-LE9FU1ZlcnRleEFycmF5T2JqZWN0OkoudkIsT0VTX3ZlcnRleF9hcnJheV9vYmplY3Q6Si52QixXZWJH
-TFByb2dyYW06Si52QixXZWJHTFF1ZXJ5OkoudkIsV2ViR0xSZW5kZXJidWZmZXI6Si52QixXZWJHTFJl
-bmRlcmluZ0NvbnRleHQ6Si52QixXZWJHTDJSZW5kZXJpbmdDb250ZXh0OkoudkIsV2ViR0xTYW1wbGVy
-OkoudkIsV2ViR0xTaGFkZXI6Si52QixXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdDpKLnZCLFdlYkdM
-U3luYzpKLnZCLFdlYkdMVGV4dHVyZTpKLnZCLFdlYkdMVGltZXJRdWVyeUVYVDpKLnZCLFdlYkdMVHJh
-bnNmb3JtRmVlZGJhY2s6Si52QixXZWJHTFVuaWZvcm1Mb2NhdGlvbjpKLnZCLFdlYkdMVmVydGV4QXJy
-YXlPYmplY3Q6Si52QixXZWJHTFZlcnRleEFycmF5T2JqZWN0T0VTOkoudkIsV2ViR0w6Si52QixXZWJH
-TDJSZW5kZXJpbmdDb250ZXh0QmFzZTpKLnZCLERhdGFiYXNlOkoudkIsU1FMRXJyb3I6Si52QixTUUxS
-ZXN1bHRTZXQ6Si52QixTUUxUcmFuc2FjdGlvbjpKLnZCLEFycmF5QnVmZmVyOkguV1osQXJyYXlCdWZm
-ZXJWaWV3OkguRVQsRGF0YVZpZXc6SC5kZixGbG9hdDMyQXJyYXk6SC5EZyxGbG9hdDY0QXJyYXk6SC5E
-ZyxJbnQxNkFycmF5OkgueGosSW50MzJBcnJheTpILmRFLEludDhBcnJheTpILlpBLFVpbnQxNkFycmF5
-Okgud2YsVWludDMyQXJyYXk6SC5QcSxVaW50OENsYW1wZWRBcnJheTpILmVFLENhbnZhc1BpeGVsQXJy
-YXk6SC5lRSxVaW50OEFycmF5OkguVjYsSFRNTEF1ZGlvRWxlbWVudDpXLnFFLEhUTUxCUkVsZW1lbnQ6
-Vy5xRSxIVE1MQ2FudmFzRWxlbWVudDpXLnFFLEhUTUxDb250ZW50RWxlbWVudDpXLnFFLEhUTUxETGlz
-dEVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUxpc3RFbGVtZW50OlcucUUsSFRNTERldGFpbHNFbGVtZW50Olcu
-cUUsSFRNTERpYWxvZ0VsZW1lbnQ6Vy5xRSxIVE1MRGl2RWxlbWVudDpXLnFFLEhUTUxFbWJlZEVsZW1l
-bnQ6Vy5xRSxIVE1MRmllbGRTZXRFbGVtZW50OlcucUUsSFRNTEhSRWxlbWVudDpXLnFFLEhUTUxIZWFk
-RWxlbWVudDpXLnFFLEhUTUxIZWFkaW5nRWxlbWVudDpXLnFFLEhUTUxIdG1sRWxlbWVudDpXLnFFLEhU
-TUxJRnJhbWVFbGVtZW50OlcucUUsSFRNTEltYWdlRWxlbWVudDpXLnFFLEhUTUxMYWJlbEVsZW1lbnQ6
-Vy5xRSxIVE1MTGVnZW5kRWxlbWVudDpXLnFFLEhUTUxMaW5rRWxlbWVudDpXLnFFLEhUTUxNYXBFbGVt
-ZW50OlcucUUsSFRNTE1lZGlhRWxlbWVudDpXLnFFLEhUTUxNZW51RWxlbWVudDpXLnFFLEhUTUxNZXRh
-RWxlbWVudDpXLnFFLEhUTUxNb2RFbGVtZW50OlcucUUsSFRNTE9MaXN0RWxlbWVudDpXLnFFLEhUTUxP
-YmplY3RFbGVtZW50OlcucUUsSFRNTE9wdEdyb3VwRWxlbWVudDpXLnFFLEhUTUxQaWN0dXJlRWxlbWVu
-dDpXLnFFLEhUTUxQcmVFbGVtZW50OlcucUUsSFRNTFF1b3RlRWxlbWVudDpXLnFFLEhUTUxTY3JpcHRF
-bGVtZW50OlcucUUsSFRNTFNoYWRvd0VsZW1lbnQ6Vy5xRSxIVE1MU2xvdEVsZW1lbnQ6Vy5xRSxIVE1M
-U291cmNlRWxlbWVudDpXLnFFLEhUTUxTcGFuRWxlbWVudDpXLnFFLEhUTUxTdHlsZUVsZW1lbnQ6Vy5x
-RSxIVE1MVGFibGVDYXB0aW9uRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNlbGxFbGVtZW50OlcucUUsSFRN
-TFRhYmxlRGF0YUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6Vy5xRSxI
-VE1MVGFibGVDb2xFbGVtZW50OlcucUUsSFRNTFRpbWVFbGVtZW50OlcucUUsSFRNTFRpdGxlRWxlbWVu
-dDpXLnFFLEhUTUxUcmFja0VsZW1lbnQ6Vy5xRSxIVE1MVUxpc3RFbGVtZW50OlcucUUsSFRNTFVua25v
-d25FbGVtZW50OlcucUUsSFRNTFZpZGVvRWxlbWVudDpXLnFFLEhUTUxEaXJlY3RvcnlFbGVtZW50Olcu
-cUUsSFRNTEZvbnRFbGVtZW50OlcucUUsSFRNTEZyYW1lRWxlbWVudDpXLnFFLEhUTUxGcmFtZVNldEVs
-ZW1lbnQ6Vy5xRSxIVE1MTWFycXVlZUVsZW1lbnQ6Vy5xRSxIVE1MRWxlbWVudDpXLnFFLEFjY2Vzc2li
-bGVOb2RlTGlzdDpXLlllLEhUTUxBbmNob3JFbGVtZW50OlcuR2gsSFRNTEFyZWFFbGVtZW50OlcuZlks
-SFRNTEJhc2VFbGVtZW50OlcubkIsQmxvYjpXLkF6LEJsdWV0b290aFJlbW90ZUdBVFREZXNjcmlwdG9y
-OlcuUFUsSFRNTEJvZHlFbGVtZW50OlcuUVAsSFRNTEJ1dHRvbkVsZW1lbnQ6Vy5JRixDREFUQVNlY3Rp
-b246Vy5ueCxDaGFyYWN0ZXJEYXRhOlcubngsQ29tbWVudDpXLm54LFByb2Nlc3NpbmdJbnN0cnVjdGlv
-bjpXLm54LFRleHQ6Vy5ueCxDU1NLZXl3b3JkVmFsdWU6Vy5SZCxDU1NOdW1lcmljVmFsdWU6Vy5rUixD
-U1NQZXJzcGVjdGl2ZTpXLlRmLENTU0NoYXJzZXRSdWxlOlcubHcsQ1NTQ29uZGl0aW9uUnVsZTpXLmx3
-LENTU0ZvbnRGYWNlUnVsZTpXLmx3LENTU0dyb3VwaW5nUnVsZTpXLmx3LENTU0ltcG9ydFJ1bGU6Vy5s
-dyxDU1NLZXlmcmFtZVJ1bGU6Vy5sdyxNb3pDU1NLZXlmcmFtZVJ1bGU6Vy5sdyxXZWJLaXRDU1NLZXlm
-cmFtZVJ1bGU6Vy5sdyxDU1NLZXlmcmFtZXNSdWxlOlcubHcsTW96Q1NTS2V5ZnJhbWVzUnVsZTpXLmx3
-LFdlYktpdENTU0tleWZyYW1lc1J1bGU6Vy5sdyxDU1NNZWRpYVJ1bGU6Vy5sdyxDU1NOYW1lc3BhY2VS
-dWxlOlcubHcsQ1NTUGFnZVJ1bGU6Vy5sdyxDU1NSdWxlOlcubHcsQ1NTU3R5bGVSdWxlOlcubHcsQ1NT
-U3VwcG9ydHNSdWxlOlcubHcsQ1NTVmlld3BvcnRSdWxlOlcubHcsQ1NTU3R5bGVEZWNsYXJhdGlvbjpX
-Lm9KLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOlcub0osQ1NTMlByb3BlcnRpZXM6Vy5vSixDU1NJbWFnZVZh
-bHVlOlcuQncsQ1NTUG9zaXRpb25WYWx1ZTpXLkJ3LENTU1Jlc291cmNlVmFsdWU6Vy5CdyxDU1NVUkxJ
-bWFnZVZhbHVlOlcuQncsQ1NTU3R5bGVWYWx1ZTpXLkJ3LENTU01hdHJpeENvbXBvbmVudDpXLm80LENT
-U1JvdGF0aW9uOlcubzQsQ1NTU2NhbGU6Vy5vNCxDU1NTa2V3OlcubzQsQ1NTVHJhbnNsYXRpb246Vy5v
-NCxDU1NUcmFuc2Zvcm1Db21wb25lbnQ6Vy5vNCxDU1NUcmFuc2Zvcm1WYWx1ZTpXLkhTLENTU1VuaXRW
-YWx1ZTpXLlZvLENTU1VucGFyc2VkVmFsdWU6Vy5GaCxIVE1MRGF0YUVsZW1lbnQ6Vy5jeCxEYXRhVHJh
-bnNmZXJJdGVtTGlzdDpXLlNiLFhNTERvY3VtZW50OlcuUUYsRG9jdW1lbnQ6Vy5RRixET01FeGNlcHRp
-b246Vy5OaCxDbGllbnRSZWN0TGlzdDpXLkZ2LERPTVJlY3RMaXN0OlcuRnYsRE9NUmVjdFJlYWRPbmx5
-OlcuSUIsRE9NU3RyaW5nTGlzdDpXLllsLERPTVRva2VuTGlzdDpXLm43LEVsZW1lbnQ6Vy5jdixEaXJl
-Y3RvcnlFbnRyeTpXLlFJLEVudHJ5OlcuUUksRmlsZUVudHJ5OlcuUUksQWJvcnRQYXltZW50RXZlbnQ6
-Vy5lYSxBbmltYXRpb25FdmVudDpXLmVhLEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6Vy5lYSxBcHBsaWNh
-dGlvbkNhY2hlRXJyb3JFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaENsaWNrRXZlbnQ6Vy5lYSxCYWNr
-Z3JvdW5kRmV0Y2hFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaEZhaWxFdmVudDpXLmVhLEJhY2tncm91
-bmRGZXRjaGVkRXZlbnQ6Vy5lYSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZlbnQ6Vy5lYSxCZWZvcmVVbmxv
-YWRFdmVudDpXLmVhLEJsb2JFdmVudDpXLmVhLENhbk1ha2VQYXltZW50RXZlbnQ6Vy5lYSxDbGlwYm9h
-cmRFdmVudDpXLmVhLENsb3NlRXZlbnQ6Vy5lYSxDdXN0b21FdmVudDpXLmVhLERldmljZU1vdGlvbkV2
-ZW50OlcuZWEsRGV2aWNlT3JpZW50YXRpb25FdmVudDpXLmVhLEVycm9yRXZlbnQ6Vy5lYSxFeHRlbmRh
-YmxlRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OlcuZWEsRmV0Y2hFdmVudDpXLmVhLEZv
-bnRGYWNlU2V0TG9hZEV2ZW50OlcuZWEsRm9yZWlnbkZldGNoRXZlbnQ6Vy5lYSxHYW1lcGFkRXZlbnQ6
-Vy5lYSxIYXNoQ2hhbmdlRXZlbnQ6Vy5lYSxJbnN0YWxsRXZlbnQ6Vy5lYSxNZWRpYUVuY3J5cHRlZEV2
-ZW50OlcuZWEsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6Vy5lYSxNZWRpYVF1ZXJ5TGlzdEV2ZW50OlcuZWEs
-TWVkaWFTdHJlYW1FdmVudDpXLmVhLE1lZGlhU3RyZWFtVHJhY2tFdmVudDpXLmVhLE1lc3NhZ2VFdmVu
-dDpXLmVhLE1JRElDb25uZWN0aW9uRXZlbnQ6Vy5lYSxNSURJTWVzc2FnZUV2ZW50OlcuZWEsTXV0YXRp
-b25FdmVudDpXLmVhLE5vdGlmaWNhdGlvbkV2ZW50OlcuZWEsUGFnZVRyYW5zaXRpb25FdmVudDpXLmVh
-LFBheW1lbnRSZXF1ZXN0RXZlbnQ6Vy5lYSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2ZW50OlcuZWEsUG9w
-U3RhdGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVFdmVudDpXLmVhLFBy
-ZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OlcuZWEsUHJvbWlzZVJlamVjdGlvbkV2ZW50Olcu
-ZWEsUHVzaEV2ZW50OlcuZWEsUlRDRGF0YUNoYW5uZWxFdmVudDpXLmVhLFJUQ0RUTUZUb25lQ2hhbmdl
-RXZlbnQ6Vy5lYSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50OlcuZWEsUlRDVHJhY2tFdmVudDpXLmVh
-LFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6Vy5lYSxTZW5zb3JFcnJvckV2ZW50OlcuZWEsU3Bl
-ZWNoUmVjb2duaXRpb25FcnJvcjpXLmVhLFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6Vy5lYSxTcGVlY2hT
-eW50aGVzaXNFdmVudDpXLmVhLFN5bmNFdmVudDpXLmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9u
-RXZlbnQ6Vy5lYSxXZWJLaXRUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJE
-aXNwbGF5RXZlbnQ6Vy5lYSxWUlNlc3Npb25FdmVudDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZl
-bnQ6Vy5lYSxVU0JDb25uZWN0aW9uRXZlbnQ6Vy5lYSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxB
-dWRpb1Byb2Nlc3NpbmdFdmVudDpXLmVhLE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdl
-YkdMQ29udGV4dEV2ZW50OlcuZWEsRXZlbnQ6Vy5lYSxJbnB1dEV2ZW50OlcuZWEsQWJzb2x1dGVPcmll
-bnRhdGlvblNlbnNvcjpXLkQwLEFjY2VsZXJvbWV0ZXI6Vy5EMCxBY2Nlc3NpYmxlTm9kZTpXLkQwLEFt
-YmllbnRMaWdodFNlbnNvcjpXLkQwLEFuaW1hdGlvbjpXLkQwLEFwcGxpY2F0aW9uQ2FjaGU6Vy5EMCxE
-T01BcHBsaWNhdGlvbkNhY2hlOlcuRDAsT2ZmbGluZVJlc291cmNlTGlzdDpXLkQwLEJhY2tncm91bmRG
-ZXRjaFJlZ2lzdHJhdGlvbjpXLkQwLEJhdHRlcnlNYW5hZ2VyOlcuRDAsQnJvYWRjYXN0Q2hhbm5lbDpX
-LkQwLENhbnZhc0NhcHR1cmVNZWRpYVN0cmVhbVRyYWNrOlcuRDAsRXZlbnRTb3VyY2U6Vy5EMCxGaWxl
-UmVhZGVyOlcuRDAsRm9udEZhY2VTZXQ6Vy5EMCxHeXJvc2NvcGU6Vy5EMCxMaW5lYXJBY2NlbGVyYXRp
-b25TZW5zb3I6Vy5EMCxNYWduZXRvbWV0ZXI6Vy5EMCxNZWRpYURldmljZXM6Vy5EMCxNZWRpYUtleVNl
-c3Npb246Vy5EMCxNZWRpYVF1ZXJ5TGlzdDpXLkQwLE1lZGlhUmVjb3JkZXI6Vy5EMCxNZWRpYVNvdXJj
-ZTpXLkQwLE1lZGlhU3RyZWFtOlcuRDAsTWVkaWFTdHJlYW1UcmFjazpXLkQwLE1JRElBY2Nlc3M6Vy5E
-MCxNSURJSW5wdXQ6Vy5EMCxNSURJT3V0cHV0OlcuRDAsTUlESVBvcnQ6Vy5EMCxOZXR3b3JrSW5mb3Jt
-YXRpb246Vy5EMCxOb3RpZmljYXRpb246Vy5EMCxPZmZzY3JlZW5DYW52YXM6Vy5EMCxPcmllbnRhdGlv
-blNlbnNvcjpXLkQwLFBheW1lbnRSZXF1ZXN0OlcuRDAsUGVyZm9ybWFuY2U6Vy5EMCxQZXJtaXNzaW9u
-U3RhdHVzOlcuRDAsUHJlc2VudGF0aW9uQ29ubmVjdGlvbjpXLkQwLFByZXNlbnRhdGlvbkNvbm5lY3Rp
-b25MaXN0OlcuRDAsUHJlc2VudGF0aW9uUmVxdWVzdDpXLkQwLFJlbGF0aXZlT3JpZW50YXRpb25TZW5z
-b3I6Vy5EMCxSZW1vdGVQbGF5YmFjazpXLkQwLFJUQ0RhdGFDaGFubmVsOlcuRDAsRGF0YUNoYW5uZWw6
-Vy5EMCxSVENEVE1GU2VuZGVyOlcuRDAsUlRDUGVlckNvbm5lY3Rpb246Vy5EMCx3ZWJraXRSVENQZWVy
-Q29ubmVjdGlvbjpXLkQwLG1velJUQ1BlZXJDb25uZWN0aW9uOlcuRDAsU2NyZWVuT3JpZW50YXRpb246
-Vy5EMCxTZW5zb3I6Vy5EMCxTZXJ2aWNlV29ya2VyOlcuRDAsU2VydmljZVdvcmtlckNvbnRhaW5lcjpX
-LkQwLFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb246Vy5EMCxTaGFyZWRXb3JrZXI6Vy5EMCxTcGVlY2hS
-ZWNvZ25pdGlvbjpXLkQwLFNwZWVjaFN5bnRoZXNpczpXLkQwLFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5j
-ZTpXLkQwLFZSOlcuRDAsVlJEZXZpY2U6Vy5EMCxWUkRpc3BsYXk6Vy5EMCxWUlNlc3Npb246Vy5EMCxW
-aXN1YWxWaWV3cG9ydDpXLkQwLFdlYlNvY2tldDpXLkQwLFdvcmtlcjpXLkQwLFdvcmtlclBlcmZvcm1h
-bmNlOlcuRDAsQmx1ZXRvb3RoRGV2aWNlOlcuRDAsQmx1ZXRvb3RoUmVtb3RlR0FUVENoYXJhY3Rlcmlz
-dGljOlcuRDAsQ2xpcGJvYXJkOlcuRDAsTW9qb0ludGVyZmFjZUludGVyY2VwdG9yOlcuRDAsVVNCOlcu
-RDAsSURCRGF0YWJhc2U6Vy5EMCxJREJPcGVuREJSZXF1ZXN0OlcuRDAsSURCVmVyc2lvbkNoYW5nZVJl
-cXVlc3Q6Vy5EMCxJREJSZXF1ZXN0OlcuRDAsSURCVHJhbnNhY3Rpb246Vy5EMCxBbmFseXNlck5vZGU6
-Vy5EMCxSZWFsdGltZUFuYWx5c2VyTm9kZTpXLkQwLEF1ZGlvQnVmZmVyU291cmNlTm9kZTpXLkQwLEF1
-ZGlvRGVzdGluYXRpb25Ob2RlOlcuRDAsQXVkaW9Ob2RlOlcuRDAsQXVkaW9TY2hlZHVsZWRTb3VyY2VO
-b2RlOlcuRDAsQXVkaW9Xb3JrbGV0Tm9kZTpXLkQwLEJpcXVhZEZpbHRlck5vZGU6Vy5EMCxDaGFubmVs
-TWVyZ2VyTm9kZTpXLkQwLEF1ZGlvQ2hhbm5lbE1lcmdlcjpXLkQwLENoYW5uZWxTcGxpdHRlck5vZGU6
-Vy5EMCxBdWRpb0NoYW5uZWxTcGxpdHRlcjpXLkQwLENvbnN0YW50U291cmNlTm9kZTpXLkQwLENvbnZv
-bHZlck5vZGU6Vy5EMCxEZWxheU5vZGU6Vy5EMCxEeW5hbWljc0NvbXByZXNzb3JOb2RlOlcuRDAsR2Fp
-bk5vZGU6Vy5EMCxBdWRpb0dhaW5Ob2RlOlcuRDAsSUlSRmlsdGVyTm9kZTpXLkQwLE1lZGlhRWxlbWVu
-dEF1ZGlvU291cmNlTm9kZTpXLkQwLE1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGU6Vy5EMCxN
-ZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZTpXLkQwLE9zY2lsbGF0b3JOb2RlOlcuRDAsT3NjaWxsYXRv
-cjpXLkQwLFBhbm5lck5vZGU6Vy5EMCxBdWRpb1Bhbm5lck5vZGU6Vy5EMCx3ZWJraXRBdWRpb1Bhbm5l
-ck5vZGU6Vy5EMCxTY3JpcHRQcm9jZXNzb3JOb2RlOlcuRDAsSmF2YVNjcmlwdEF1ZGlvTm9kZTpXLkQw
-LFN0ZXJlb1Bhbm5lck5vZGU6Vy5EMCxXYXZlU2hhcGVyTm9kZTpXLkQwLEV2ZW50VGFyZ2V0OlcuRDAs
-RmlsZTpXLlQ1LEZpbGVMaXN0OlcuWFYsRmlsZVdyaXRlcjpXLndKLEhUTUxGb3JtRWxlbWVudDpXLmg0
-LEdhbWVwYWQ6Vy5HTyxHYW1lcGFkQnV0dG9uOlcuSkMsSGlzdG9yeTpXLmJyLEhUTUxDb2xsZWN0aW9u
-OlcueG4sSFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb246Vy54bixIVE1MT3B0aW9uc0NvbGxlY3Rpb246
-Vy54bixIVE1MRG9jdW1lbnQ6Vy5WYixYTUxIdHRwUmVxdWVzdDpXLk83LFhNTEh0dHBSZXF1ZXN0VXBs
-b2FkOlcud2EsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0YTpXLlNnLEhUTUxJ
-bnB1dEVsZW1lbnQ6Vy5KSyxLZXlib2FyZEV2ZW50OlcuSEwsSFRNTExJRWxlbWVudDpXLndQLExvY2F0
-aW9uOlcudTgsTWVkaWFMaXN0OlcuejYsTWVzc2FnZVBvcnQ6Vy5sSyxIVE1MTWV0ZXJFbGVtZW50Olcu
-UWIsTUlESUlucHV0TWFwOlcuUzAsTUlESU91dHB1dE1hcDpXLnoyLE1pbWVUeXBlOlcuQVcsTWltZVR5
-cGVBcnJheTpXLkRNLE1vdXNlRXZlbnQ6Vy5BaixEcmFnRXZlbnQ6Vy5BaixQb2ludGVyRXZlbnQ6Vy5B
-aixXaGVlbEV2ZW50OlcuQWosRG9jdW1lbnRGcmFnbWVudDpXLnVILFNoYWRvd1Jvb3Q6Vy51SCxEb2N1
-bWVudFR5cGU6Vy51SCxOb2RlOlcudUgsTm9kZUxpc3Q6Vy5CSCxSYWRpb05vZGVMaXN0OlcuQkgsSFRN
-TE9wdGlvbkVsZW1lbnQ6Vy5RbCxIVE1MT3V0cHV0RWxlbWVudDpXLkdYLEhUTUxQYXJhZ3JhcGhFbGVt
-ZW50OlcuU04sSFRNTFBhcmFtRWxlbWVudDpXLkhELFBsdWdpbjpXLmNsLFBsdWdpbkFycmF5OlcuRXYs
-UHJlc2VudGF0aW9uQXZhaWxhYmlsaXR5OlcuTHIsSFRNTFByb2dyZXNzRWxlbWVudDpXLktSLFByb2dy
-ZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6Vy5ldyxSVENTdGF0c1JlcG9ydDpXLnA4
-LEhUTUxTZWxlY3RFbGVtZW50OlcubHAsU291cmNlQnVmZmVyOlcuU1YsU291cmNlQnVmZmVyTGlzdDpX
-Lk1rLFNwZWVjaEdyYW1tYXI6Vy5ZNCxTcGVlY2hHcmFtbWFyTGlzdDpXLk5uLFNwZWVjaFJlY29nbml0
-aW9uUmVzdWx0OlcubDgsU3RvcmFnZTpXLkFzLFN0b3JhZ2VFdmVudDpXLmJrLENTU1N0eWxlU2hlZXQ6
-Vy5XVyxTdHlsZVNoZWV0OlcuV1csSFRNTFRhYmxlRWxlbWVudDpXLlRiLEhUTUxUYWJsZVJvd0VsZW1l
-bnQ6Vy5JdixIVE1MVGFibGVTZWN0aW9uRWxlbWVudDpXLkJULEhUTUxUZW1wbGF0ZUVsZW1lbnQ6Vy5m
-WCxIVE1MVGV4dEFyZWFFbGVtZW50OlcuRkIsVGV4dFRyYWNrOlcuQTEsVGV4dFRyYWNrQ3VlOlcuTU4s
-VlRUQ3VlOlcuTU4sVGV4dFRyYWNrQ3VlTGlzdDpXLlgwLFRleHRUcmFja0xpc3Q6Vy5uSixUaW1lUmFu
-Z2VzOlcubXosVG91Y2g6Vy5hMyxUb3VjaExpc3Q6Vy5jaSxUcmFja0RlZmF1bHRMaXN0OlcuY24sQ29t
-cG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixUZXh0RXZlbnQ6Vy53NixUb3VjaEV2ZW50
-OlcudzYsVUlFdmVudDpXLnc2LFVSTDpXLkZqLFZpZGVvVHJhY2tMaXN0OlcudkYsV2luZG93OlcuT2ks
-RE9NV2luZG93OlcuT2ksRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxTZXJ2aWNlV29ya2Vy
-R2xvYmFsU2NvcGU6Vy5DbSxTaGFyZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFdvcmtlckdsb2JhbFNj
-b3BlOlcuQ20sQXR0cjpXLkNRLENTU1J1bGVMaXN0OlcuUFIsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6
-Vy53NCxHYW1lcGFkTGlzdDpXLkYyLE5hbWVkTm9kZU1hcDpXLnJoLE1vek5hbWVkQXR0ck1hcDpXLnJo
-LFNwZWVjaFJlY29nbml0aW9uUmVzdWx0TGlzdDpXLkxPLFN0eWxlU2hlZXRMaXN0OlcuYjEsSURCQ3Vy
-c29yOlAuVzIsSURCQ3Vyc29yV2l0aFZhbHVlOlAuZTMsSURCS2V5UmFuZ2U6UC5oRixJREJPYnNlcnZh
-dGlvbjpQLkJWLFNWR0FuZ2xlOlAudWosU1ZHTGVuZ3RoOlAueDAsU1ZHTGVuZ3RoTGlzdDpQLnE2LFNW
-R051bWJlcjpQLnVQLFNWR051bWJlckxpc3Q6UC5meixTVkdQb2ludExpc3Q6UC5FRCxTVkdTY3JpcHRF
-bGVtZW50OlAubmQsU1ZHU3RyaW5nTGlzdDpQLktxLFNWR0FFbGVtZW50OlAuZDUsU1ZHQW5pbWF0ZUVs
-ZW1lbnQ6UC5kNSxTVkdBbmltYXRlTW90aW9uRWxlbWVudDpQLmQ1LFNWR0FuaW1hdGVUcmFuc2Zvcm1F
-bGVtZW50OlAuZDUsU1ZHQW5pbWF0aW9uRWxlbWVudDpQLmQ1LFNWR0NpcmNsZUVsZW1lbnQ6UC5kNSxT
-VkdDbGlwUGF0aEVsZW1lbnQ6UC5kNSxTVkdEZWZzRWxlbWVudDpQLmQ1LFNWR0Rlc2NFbGVtZW50OlAu
-ZDUsU1ZHRGlzY2FyZEVsZW1lbnQ6UC5kNSxTVkdFbGxpcHNlRWxlbWVudDpQLmQ1LFNWR0ZFQmxlbmRF
-bGVtZW50OlAuZDUsU1ZHRkVDb2xvck1hdHJpeEVsZW1lbnQ6UC5kNSxTVkdGRUNvbXBvbmVudFRyYW5z
-ZmVyRWxlbWVudDpQLmQ1LFNWR0ZFQ29tcG9zaXRlRWxlbWVudDpQLmQ1LFNWR0ZFQ29udm9sdmVNYXRy
-aXhFbGVtZW50OlAuZDUsU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50OlAuZDUsU1ZHRkVEaXNwbGFj
-ZW1lbnRNYXBFbGVtZW50OlAuZDUsU1ZHRkVEaXN0YW50TGlnaHRFbGVtZW50OlAuZDUsU1ZHRkVGbG9v
-ZEVsZW1lbnQ6UC5kNSxTVkdGRUZ1bmNBRWxlbWVudDpQLmQ1LFNWR0ZFRnVuY0JFbGVtZW50OlAuZDUs
-U1ZHRkVGdW5jR0VsZW1lbnQ6UC5kNSxTVkdGRUZ1bmNSRWxlbWVudDpQLmQ1LFNWR0ZFR2F1c3NpYW5C
-bHVyRWxlbWVudDpQLmQ1LFNWR0ZFSW1hZ2VFbGVtZW50OlAuZDUsU1ZHRkVNZXJnZUVsZW1lbnQ6UC5k
-NSxTVkdGRU1lcmdlTm9kZUVsZW1lbnQ6UC5kNSxTVkdGRU1vcnBob2xvZ3lFbGVtZW50OlAuZDUsU1ZH
-RkVPZmZzZXRFbGVtZW50OlAuZDUsU1ZHRkVQb2ludExpZ2h0RWxlbWVudDpQLmQ1LFNWR0ZFU3BlY3Vs
-YXJMaWdodGluZ0VsZW1lbnQ6UC5kNSxTVkdGRVNwb3RMaWdodEVsZW1lbnQ6UC5kNSxTVkdGRVRpbGVF
-bGVtZW50OlAuZDUsU1ZHRkVUdXJidWxlbmNlRWxlbWVudDpQLmQ1LFNWR0ZpbHRlckVsZW1lbnQ6UC5k
-NSxTVkdGb3JlaWduT2JqZWN0RWxlbWVudDpQLmQ1LFNWR0dFbGVtZW50OlAuZDUsU1ZHR2VvbWV0cnlF
-bGVtZW50OlAuZDUsU1ZHR3JhcGhpY3NFbGVtZW50OlAuZDUsU1ZHSW1hZ2VFbGVtZW50OlAuZDUsU1ZH
-TGluZUVsZW1lbnQ6UC5kNSxTVkdMaW5lYXJHcmFkaWVudEVsZW1lbnQ6UC5kNSxTVkdNYXJrZXJFbGVt
-ZW50OlAuZDUsU1ZHTWFza0VsZW1lbnQ6UC5kNSxTVkdNZXRhZGF0YUVsZW1lbnQ6UC5kNSxTVkdQYXRo
-RWxlbWVudDpQLmQ1LFNWR1BhdHRlcm5FbGVtZW50OlAuZDUsU1ZHUG9seWdvbkVsZW1lbnQ6UC5kNSxT
-VkdQb2x5bGluZUVsZW1lbnQ6UC5kNSxTVkdSYWRpYWxHcmFkaWVudEVsZW1lbnQ6UC5kNSxTVkdSZWN0
-RWxlbWVudDpQLmQ1LFNWR1NldEVsZW1lbnQ6UC5kNSxTVkdTdG9wRWxlbWVudDpQLmQ1LFNWR1N0eWxl
-RWxlbWVudDpQLmQ1LFNWR1NWR0VsZW1lbnQ6UC5kNSxTVkdTd2l0Y2hFbGVtZW50OlAuZDUsU1ZHU3lt
-Ym9sRWxlbWVudDpQLmQ1LFNWR1RTcGFuRWxlbWVudDpQLmQ1LFNWR1RleHRDb250ZW50RWxlbWVudDpQ
-LmQ1LFNWR1RleHRFbGVtZW50OlAuZDUsU1ZHVGV4dFBhdGhFbGVtZW50OlAuZDUsU1ZHVGV4dFBvc2l0
-aW9uaW5nRWxlbWVudDpQLmQ1LFNWR1RpdGxlRWxlbWVudDpQLmQ1LFNWR1VzZUVsZW1lbnQ6UC5kNSxT
-VkdWaWV3RWxlbWVudDpQLmQ1LFNWR0dyYWRpZW50RWxlbWVudDpQLmQ1LFNWR0NvbXBvbmVudFRyYW5z
-ZmVyRnVuY3Rpb25FbGVtZW50OlAuZDUsU1ZHRkVEcm9wU2hhZG93RWxlbWVudDpQLmQ1LFNWR01QYXRo
-RWxlbWVudDpQLmQ1LFNWR0VsZW1lbnQ6UC5kNSxTVkdUcmFuc2Zvcm06UC56WSxTVkdUcmFuc2Zvcm1M
-aXN0OlAuTkMsQXVkaW9CdWZmZXI6UC5yMixBdWRpb1BhcmFtOlAuck8sQXVkaW9QYXJhbU1hcDpQLno4
-LEF1ZGlvVHJhY2tMaXN0OlAuZm8sQXVkaW9Db250ZXh0OlAuVjgsd2Via2l0QXVkaW9Db250ZXh0OlAu
-VjgsQmFzZUF1ZGlvQ29udGV4dDpQLlY4LE9mZmxpbmVBdWRpb0NvbnRleHQ6UC5HbixTUUxSZXN1bHRT
-ZXRSb3dMaXN0OlAuRm59KQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtBbmltYXRpb25F
-ZmZlY3RSZWFkT25seTp0cnVlLEFuaW1hdGlvbkVmZmVjdFRpbWluZzp0cnVlLEFuaW1hdGlvbkVmZmVj
-dFRpbWluZ1JlYWRPbmx5OnRydWUsQW5pbWF0aW9uVGltZWxpbmU6dHJ1ZSxBbmltYXRpb25Xb3JrbGV0
-R2xvYmFsU2NvcGU6dHJ1ZSxBdXRoZW50aWNhdG9yQXNzZXJ0aW9uUmVzcG9uc2U6dHJ1ZSxBdXRoZW50
-aWNhdG9yQXR0ZXN0YXRpb25SZXNwb25zZTp0cnVlLEF1dGhlbnRpY2F0b3JSZXNwb25zZTp0cnVlLEJh
-Y2tncm91bmRGZXRjaEZldGNoOnRydWUsQmFja2dyb3VuZEZldGNoTWFuYWdlcjp0cnVlLEJhY2tncm91
-bmRGZXRjaFNldHRsZWRGZXRjaDp0cnVlLEJhclByb3A6dHJ1ZSxCYXJjb2RlRGV0ZWN0b3I6dHJ1ZSxC
-b2R5OnRydWUsQnVkZ2V0U3RhdGU6dHJ1ZSxDYWNoZVN0b3JhZ2U6dHJ1ZSxDYW52YXNHcmFkaWVudDp0
-cnVlLENhbnZhc1BhdHRlcm46dHJ1ZSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6dHJ1ZSxDbGllbnQ6
-dHJ1ZSxDbGllbnRzOnRydWUsQ29va2llU3RvcmU6dHJ1ZSxDb29yZGluYXRlczp0cnVlLENyZWRlbnRp
-YWw6dHJ1ZSxDcmVkZW50aWFsVXNlckRhdGE6dHJ1ZSxDcmVkZW50aWFsc0NvbnRhaW5lcjp0cnVlLENy
-eXB0bzp0cnVlLENyeXB0b0tleTp0cnVlLENTUzp0cnVlLENTU1ZhcmlhYmxlUmVmZXJlbmNlVmFsdWU6
-dHJ1ZSxDdXN0b21FbGVtZW50UmVnaXN0cnk6dHJ1ZSxEYXRhVHJhbnNmZXI6dHJ1ZSxEYXRhVHJhbnNm
-ZXJJdGVtOnRydWUsRGVwcmVjYXRlZFN0b3JhZ2VJbmZvOnRydWUsRGVwcmVjYXRlZFN0b3JhZ2VRdW90
-YTp0cnVlLERlcHJlY2F0aW9uUmVwb3J0OnRydWUsRGV0ZWN0ZWRCYXJjb2RlOnRydWUsRGV0ZWN0ZWRG
-YWNlOnRydWUsRGV0ZWN0ZWRUZXh0OnRydWUsRGV2aWNlQWNjZWxlcmF0aW9uOnRydWUsRGV2aWNlUm90
-YXRpb25SYXRlOnRydWUsRGlyZWN0b3J5UmVhZGVyOnRydWUsRG9jdW1lbnRPclNoYWRvd1Jvb3Q6dHJ1
-ZSxEb2N1bWVudFRpbWVsaW5lOnRydWUsRE9NRXJyb3I6dHJ1ZSxET01JbXBsZW1lbnRhdGlvbjp0cnVl
-LEl0ZXJhdG9yOnRydWUsRE9NTWF0cml4OnRydWUsRE9NTWF0cml4UmVhZE9ubHk6dHJ1ZSxET01QYXJz
-ZXI6dHJ1ZSxET01Qb2ludDp0cnVlLERPTVBvaW50UmVhZE9ubHk6dHJ1ZSxET01RdWFkOnRydWUsRE9N
-U3RyaW5nTWFwOnRydWUsRXh0ZXJuYWw6dHJ1ZSxGYWNlRGV0ZWN0b3I6dHJ1ZSxGZWRlcmF0ZWRDcmVk
-ZW50aWFsOnRydWUsRE9NRmlsZVN5c3RlbTp0cnVlLEZvbnRGYWNlOnRydWUsRm9udEZhY2VTb3VyY2U6
-dHJ1ZSxGb3JtRGF0YTp0cnVlLEdhbWVwYWRQb3NlOnRydWUsR2VvbG9jYXRpb246dHJ1ZSxQb3NpdGlv
-bjp0cnVlLEhlYWRlcnM6dHJ1ZSxIVE1MSHlwZXJsaW5rRWxlbWVudFV0aWxzOnRydWUsSWRsZURlYWRs
-aW5lOnRydWUsSW1hZ2VCaXRtYXA6dHJ1ZSxJbWFnZUJpdG1hcFJlbmRlcmluZ0NvbnRleHQ6dHJ1ZSxJ
-bWFnZUNhcHR1cmU6dHJ1ZSxJbnB1dERldmljZUNhcGFiaWxpdGllczp0cnVlLEludGVyc2VjdGlvbk9i
-c2VydmVyOnRydWUsSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeTp0cnVlLEludGVydmVudGlvblJlcG9y
-dDp0cnVlLEtleWZyYW1lRWZmZWN0OnRydWUsS2V5ZnJhbWVFZmZlY3RSZWFkT25seTp0cnVlLE1lZGlh
-Q2FwYWJpbGl0aWVzOnRydWUsTWVkaWFDYXBhYmlsaXRpZXNJbmZvOnRydWUsTWVkaWFEZXZpY2VJbmZv
-OnRydWUsTWVkaWFFcnJvcjp0cnVlLE1lZGlhS2V5U3RhdHVzTWFwOnRydWUsTWVkaWFLZXlTeXN0ZW1B
-Y2Nlc3M6dHJ1ZSxNZWRpYUtleXM6dHJ1ZSxNZWRpYUtleXNQb2xpY3k6dHJ1ZSxNZWRpYU1ldGFkYXRh
-OnRydWUsTWVkaWFTZXNzaW9uOnRydWUsTWVkaWFTZXR0aW5nc1JhbmdlOnRydWUsTWVtb3J5SW5mbzp0
-cnVlLE1lc3NhZ2VDaGFubmVsOnRydWUsTWV0YWRhdGE6dHJ1ZSxNdXRhdGlvbk9ic2VydmVyOnRydWUs
-V2ViS2l0TXV0YXRpb25PYnNlcnZlcjp0cnVlLE11dGF0aW9uUmVjb3JkOnRydWUsTmF2aWdhdGlvblBy
-ZWxvYWRNYW5hZ2VyOnRydWUsTmF2aWdhdG9yOnRydWUsTmF2aWdhdG9yQXV0b21hdGlvbkluZm9ybWF0
-aW9uOnRydWUsTmF2aWdhdG9yQ29uY3VycmVudEhhcmR3YXJlOnRydWUsTmF2aWdhdG9yQ29va2llczp0
-cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRydWUsTm9kZUZpbHRlcjp0cnVlLE5vZGVJdGVyYXRv
-cjp0cnVlLE5vbkRvY3VtZW50VHlwZUNoaWxkTm9kZTp0cnVlLE5vbkVsZW1lbnRQYXJlbnROb2RlOnRy
-dWUsTm9uY2VkRWxlbWVudDp0cnVlLE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDp0cnVl
-LE92ZXJjb25zdHJhaW5lZEVycm9yOnRydWUsUGFpbnRSZW5kZXJpbmdDb250ZXh0MkQ6dHJ1ZSxQYWlu
-dFNpemU6dHJ1ZSxQYWludFdvcmtsZXRHbG9iYWxTY29wZTp0cnVlLFBhc3N3b3JkQ3JlZGVudGlhbDp0
-cnVlLFBhdGgyRDp0cnVlLFBheW1lbnRBZGRyZXNzOnRydWUsUGF5bWVudEluc3RydW1lbnRzOnRydWUs
-UGF5bWVudE1hbmFnZXI6dHJ1ZSxQYXltZW50UmVzcG9uc2U6dHJ1ZSxQZXJmb3JtYW5jZUVudHJ5OnRy
-dWUsUGVyZm9ybWFuY2VMb25nVGFza1RpbWluZzp0cnVlLFBlcmZvcm1hbmNlTWFyazp0cnVlLFBlcmZv
-cm1hbmNlTWVhc3VyZTp0cnVlLFBlcmZvcm1hbmNlTmF2aWdhdGlvbjp0cnVlLFBlcmZvcm1hbmNlTmF2
-aWdhdGlvblRpbWluZzp0cnVlLFBlcmZvcm1hbmNlT2JzZXJ2ZXI6dHJ1ZSxQZXJmb3JtYW5jZU9ic2Vy
-dmVyRW50cnlMaXN0OnRydWUsUGVyZm9ybWFuY2VQYWludFRpbWluZzp0cnVlLFBlcmZvcm1hbmNlUmVz
-b3VyY2VUaW1pbmc6dHJ1ZSxQZXJmb3JtYW5jZVNlcnZlclRpbWluZzp0cnVlLFBlcmZvcm1hbmNlVGlt
-aW5nOnRydWUsUGVybWlzc2lvbnM6dHJ1ZSxQaG90b0NhcGFiaWxpdGllczp0cnVlLFBvc2l0aW9uRXJy
-b3I6dHJ1ZSxQcmVzZW50YXRpb246dHJ1ZSxQcmVzZW50YXRpb25SZWNlaXZlcjp0cnVlLFB1YmxpY0tl
-eUNyZWRlbnRpYWw6dHJ1ZSxQdXNoTWFuYWdlcjp0cnVlLFB1c2hNZXNzYWdlRGF0YTp0cnVlLFB1c2hT
-dWJzY3JpcHRpb246dHJ1ZSxQdXNoU3Vic2NyaXB0aW9uT3B0aW9uczp0cnVlLFJhbmdlOnRydWUsUmVs
-YXRlZEFwcGxpY2F0aW9uOnRydWUsUmVwb3J0Qm9keTp0cnVlLFJlcG9ydGluZ09ic2VydmVyOnRydWUs
-UmVzaXplT2JzZXJ2ZXI6dHJ1ZSxSZXNpemVPYnNlcnZlckVudHJ5OnRydWUsUlRDQ2VydGlmaWNhdGU6
-dHJ1ZSxSVENJY2VDYW5kaWRhdGU6dHJ1ZSxtb3pSVENJY2VDYW5kaWRhdGU6dHJ1ZSxSVENMZWdhY3lT
-dGF0c1JlcG9ydDp0cnVlLFJUQ1J0cENvbnRyaWJ1dGluZ1NvdXJjZTp0cnVlLFJUQ1J0cFJlY2VpdmVy
-OnRydWUsUlRDUnRwU2VuZGVyOnRydWUsUlRDU2Vzc2lvbkRlc2NyaXB0aW9uOnRydWUsbW96UlRDU2Vz
-c2lvbkRlc2NyaXB0aW9uOnRydWUsUlRDU3RhdHNSZXNwb25zZTp0cnVlLFNjcmVlbjp0cnVlLFNjcm9s
-bFN0YXRlOnRydWUsU2Nyb2xsVGltZWxpbmU6dHJ1ZSxTZWxlY3Rpb246dHJ1ZSxTaGFyZWRBcnJheUJ1
-ZmZlcjp0cnVlLFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6dHJ1ZSxTcGVlY2hTeW50aGVzaXNW
-b2ljZTp0cnVlLFN0YXRpY1JhbmdlOnRydWUsU3RvcmFnZU1hbmFnZXI6dHJ1ZSxTdHlsZU1lZGlhOnRy
-dWUsU3R5bGVQcm9wZXJ0eU1hcDp0cnVlLFN0eWxlUHJvcGVydHlNYXBSZWFkb25seTp0cnVlLFN5bmNN
-YW5hZ2VyOnRydWUsVGFza0F0dHJpYnV0aW9uVGltaW5nOnRydWUsVGV4dERldGVjdG9yOnRydWUsVGV4
-dE1ldHJpY3M6dHJ1ZSxUcmFja0RlZmF1bHQ6dHJ1ZSxUcmVlV2Fsa2VyOnRydWUsVHJ1c3RlZEhUTUw6
-dHJ1ZSxUcnVzdGVkU2NyaXB0VVJMOnRydWUsVHJ1c3RlZFVSTDp0cnVlLFVuZGVybHlpbmdTb3VyY2VC
-YXNlOnRydWUsVVJMU2VhcmNoUGFyYW1zOnRydWUsVlJDb29yZGluYXRlU3lzdGVtOnRydWUsVlJEaXNw
-bGF5Q2FwYWJpbGl0aWVzOnRydWUsVlJFeWVQYXJhbWV0ZXJzOnRydWUsVlJGcmFtZURhdGE6dHJ1ZSxW
-UkZyYW1lT2ZSZWZlcmVuY2U6dHJ1ZSxWUlBvc2U6dHJ1ZSxWUlN0YWdlQm91bmRzOnRydWUsVlJTdGFn
-ZUJvdW5kc1BvaW50OnRydWUsVlJTdGFnZVBhcmFtZXRlcnM6dHJ1ZSxWYWxpZGl0eVN0YXRlOnRydWUs
-VmlkZW9QbGF5YmFja1F1YWxpdHk6dHJ1ZSxWaWRlb1RyYWNrOnRydWUsVlRUUmVnaW9uOnRydWUsV2lu
-ZG93Q2xpZW50OnRydWUsV29ya2xldEFuaW1hdGlvbjp0cnVlLFdvcmtsZXRHbG9iYWxTY29wZTp0cnVl
-LFhQYXRoRXZhbHVhdG9yOnRydWUsWFBhdGhFeHByZXNzaW9uOnRydWUsWFBhdGhOU1Jlc29sdmVyOnRy
-dWUsWFBhdGhSZXN1bHQ6dHJ1ZSxYTUxTZXJpYWxpemVyOnRydWUsWFNMVFByb2Nlc3Nvcjp0cnVlLEJs
-dWV0b290aDp0cnVlLEJsdWV0b290aENoYXJhY3RlcmlzdGljUHJvcGVydGllczp0cnVlLEJsdWV0b290
-aFJlbW90ZUdBVFRTZXJ2ZXI6dHJ1ZSxCbHVldG9vdGhSZW1vdGVHQVRUU2VydmljZTp0cnVlLEJsdWV0
-b290aFVVSUQ6dHJ1ZSxCdWRnZXRTZXJ2aWNlOnRydWUsQ2FjaGU6dHJ1ZSxET01GaWxlU3lzdGVtU3lu
-Yzp0cnVlLERpcmVjdG9yeUVudHJ5U3luYzp0cnVlLERpcmVjdG9yeVJlYWRlclN5bmM6dHJ1ZSxFbnRy
-eVN5bmM6dHJ1ZSxGaWxlRW50cnlTeW5jOnRydWUsRmlsZVJlYWRlclN5bmM6dHJ1ZSxGaWxlV3JpdGVy
-U3luYzp0cnVlLEhUTUxBbGxDb2xsZWN0aW9uOnRydWUsTW9qbzp0cnVlLE1vam9IYW5kbGU6dHJ1ZSxN
-b2pvV2F0Y2hlcjp0cnVlLE5GQzp0cnVlLFBhZ2VQb3B1cENvbnRyb2xsZXI6dHJ1ZSxSZXBvcnQ6dHJ1
-ZSxSZXF1ZXN0OnRydWUsUmVzcG9uc2U6dHJ1ZSxTdWJ0bGVDcnlwdG86dHJ1ZSxVU0JBbHRlcm5hdGVJ
-bnRlcmZhY2U6dHJ1ZSxVU0JDb25maWd1cmF0aW9uOnRydWUsVVNCRGV2aWNlOnRydWUsVVNCRW5kcG9p
-bnQ6dHJ1ZSxVU0JJblRyYW5zZmVyUmVzdWx0OnRydWUsVVNCSW50ZXJmYWNlOnRydWUsVVNCSXNvY2hy
-b25vdXNJblRyYW5zZmVyUGFja2V0OnRydWUsVVNCSXNvY2hyb25vdXNJblRyYW5zZmVyUmVzdWx0OnRy
-dWUsVVNCSXNvY2hyb25vdXNPdXRUcmFuc2ZlclBhY2tldDp0cnVlLFVTQklzb2Nocm9ub3VzT3V0VHJh
-bnNmZXJSZXN1bHQ6dHJ1ZSxVU0JPdXRUcmFuc2ZlclJlc3VsdDp0cnVlLFdvcmtlckxvY2F0aW9uOnRy
-dWUsV29ya2VyTmF2aWdhdG9yOnRydWUsV29ya2xldDp0cnVlLElEQkZhY3Rvcnk6dHJ1ZSxJREJJbmRl
-eDp0cnVlLElEQk9iamVjdFN0b3JlOnRydWUsSURCT2JzZXJ2ZXI6dHJ1ZSxJREJPYnNlcnZlckNoYW5n
-ZXM6dHJ1ZSxTVkdBbmltYXRlZEFuZ2xlOnRydWUsU1ZHQW5pbWF0ZWRCb29sZWFuOnRydWUsU1ZHQW5p
-bWF0ZWRFbnVtZXJhdGlvbjp0cnVlLFNWR0FuaW1hdGVkSW50ZWdlcjp0cnVlLFNWR0FuaW1hdGVkTGVu
-Z3RoOnRydWUsU1ZHQW5pbWF0ZWRMZW5ndGhMaXN0OnRydWUsU1ZHQW5pbWF0ZWROdW1iZXI6dHJ1ZSxT
-VkdBbmltYXRlZE51bWJlckxpc3Q6dHJ1ZSxTVkdBbmltYXRlZFByZXNlcnZlQXNwZWN0UmF0aW86dHJ1
-ZSxTVkdBbmltYXRlZFJlY3Q6dHJ1ZSxTVkdBbmltYXRlZFN0cmluZzp0cnVlLFNWR0FuaW1hdGVkVHJh
-bnNmb3JtTGlzdDp0cnVlLFNWR01hdHJpeDp0cnVlLFNWR1BvaW50OnRydWUsU1ZHUHJlc2VydmVBc3Bl
-Y3RSYXRpbzp0cnVlLFNWR1JlY3Q6dHJ1ZSxTVkdVbml0VHlwZXM6dHJ1ZSxBdWRpb0xpc3RlbmVyOnRy
-dWUsQXVkaW9UcmFjazp0cnVlLEF1ZGlvV29ya2xldEdsb2JhbFNjb3BlOnRydWUsQXVkaW9Xb3JrbGV0
-UHJvY2Vzc29yOnRydWUsUGVyaW9kaWNXYXZlOnRydWUsV2ViR0xBY3RpdmVJbmZvOnRydWUsQU5HTEVJ
-bnN0YW5jZWRBcnJheXM6dHJ1ZSxBTkdMRV9pbnN0YW5jZWRfYXJyYXlzOnRydWUsV2ViR0xCdWZmZXI6
-dHJ1ZSxXZWJHTENhbnZhczp0cnVlLFdlYkdMQ29sb3JCdWZmZXJGbG9hdDp0cnVlLFdlYkdMQ29tcHJl
-c3NlZFRleHR1cmVBU1RDOnRydWUsV2ViR0xDb21wcmVzc2VkVGV4dHVyZUFUQzp0cnVlLFdFQkdMX2Nv
-bXByZXNzZWRfdGV4dHVyZV9hdGM6dHJ1ZSxXZWJHTENvbXByZXNzZWRUZXh0dXJlRVRDMTp0cnVlLFdF
-QkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxOnRydWUsV2ViR0xDb21wcmVzc2VkVGV4dHVyZUVUQzp0
-cnVlLFdlYkdMQ29tcHJlc3NlZFRleHR1cmVQVlJUQzp0cnVlLFdFQkdMX2NvbXByZXNzZWRfdGV4dHVy
-ZV9wdnJ0Yzp0cnVlLFdlYkdMQ29tcHJlc3NlZFRleHR1cmVTM1RDOnRydWUsV0VCR0xfY29tcHJlc3Nl
-ZF90ZXh0dXJlX3MzdGM6dHJ1ZSxXZWJHTENvbXByZXNzZWRUZXh0dXJlUzNUQ3NSR0I6dHJ1ZSxXZWJH
-TERlYnVnUmVuZGVyZXJJbmZvOnRydWUsV0VCR0xfZGVidWdfcmVuZGVyZXJfaW5mbzp0cnVlLFdlYkdM
-RGVidWdTaGFkZXJzOnRydWUsV0VCR0xfZGVidWdfc2hhZGVyczp0cnVlLFdlYkdMRGVwdGhUZXh0dXJl
-OnRydWUsV0VCR0xfZGVwdGhfdGV4dHVyZTp0cnVlLFdlYkdMRHJhd0J1ZmZlcnM6dHJ1ZSxXRUJHTF9k
-cmF3X2J1ZmZlcnM6dHJ1ZSxFWFRzUkdCOnRydWUsRVhUX3NSR0I6dHJ1ZSxFWFRCbGVuZE1pbk1heDp0
-cnVlLEVYVF9ibGVuZF9taW5tYXg6dHJ1ZSxFWFRDb2xvckJ1ZmZlckZsb2F0OnRydWUsRVhUQ29sb3JC
-dWZmZXJIYWxmRmxvYXQ6dHJ1ZSxFWFREaXNqb2ludFRpbWVyUXVlcnk6dHJ1ZSxFWFREaXNqb2ludFRp
-bWVyUXVlcnlXZWJHTDI6dHJ1ZSxFWFRGcmFnRGVwdGg6dHJ1ZSxFWFRfZnJhZ19kZXB0aDp0cnVlLEVY
-VFNoYWRlclRleHR1cmVMT0Q6dHJ1ZSxFWFRfc2hhZGVyX3RleHR1cmVfbG9kOnRydWUsRVhUVGV4dHVy
-ZUZpbHRlckFuaXNvdHJvcGljOnRydWUsRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljOnRydWUs
-V2ViR0xGcmFtZWJ1ZmZlcjp0cnVlLFdlYkdMR2V0QnVmZmVyU3ViRGF0YUFzeW5jOnRydWUsV2ViR0xM
-b3NlQ29udGV4dDp0cnVlLFdlYkdMRXh0ZW5zaW9uTG9zZUNvbnRleHQ6dHJ1ZSxXRUJHTF9sb3NlX2Nv
-bnRleHQ6dHJ1ZSxPRVNFbGVtZW50SW5kZXhVaW50OnRydWUsT0VTX2VsZW1lbnRfaW5kZXhfdWludDp0
-cnVlLE9FU1N0YW5kYXJkRGVyaXZhdGl2ZXM6dHJ1ZSxPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXM6dHJ1
-ZSxPRVNUZXh0dXJlRmxvYXQ6dHJ1ZSxPRVNfdGV4dHVyZV9mbG9hdDp0cnVlLE9FU1RleHR1cmVGbG9h
-dExpbmVhcjp0cnVlLE9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcjp0cnVlLE9FU1RleHR1cmVIYWxmRmxv
-YXQ6dHJ1ZSxPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0OnRydWUsT0VTVGV4dHVyZUhhbGZGbG9hdExpbmVh
-cjp0cnVlLE9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyOnRydWUsT0VTVmVydGV4QXJyYXlPYmpl
-Y3Q6dHJ1ZSxPRVNfdmVydGV4X2FycmF5X29iamVjdDp0cnVlLFdlYkdMUHJvZ3JhbTp0cnVlLFdlYkdM
-UXVlcnk6dHJ1ZSxXZWJHTFJlbmRlcmJ1ZmZlcjp0cnVlLFdlYkdMUmVuZGVyaW5nQ29udGV4dDp0cnVl
-LFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ6dHJ1ZSxXZWJHTFNhbXBsZXI6dHJ1ZSxXZWJHTFNoYWRlcjp0
-cnVlLFdlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0OnRydWUsV2ViR0xTeW5jOnRydWUsV2ViR0xUZXh0
-dXJlOnRydWUsV2ViR0xUaW1lclF1ZXJ5RVhUOnRydWUsV2ViR0xUcmFuc2Zvcm1GZWVkYmFjazp0cnVl
-LFdlYkdMVW5pZm9ybUxvY2F0aW9uOnRydWUsV2ViR0xWZXJ0ZXhBcnJheU9iamVjdDp0cnVlLFdlYkdM
-VmVydGV4QXJyYXlPYmplY3RPRVM6dHJ1ZSxXZWJHTDp0cnVlLFdlYkdMMlJlbmRlcmluZ0NvbnRleHRC
-YXNlOnRydWUsRGF0YWJhc2U6dHJ1ZSxTUUxFcnJvcjp0cnVlLFNRTFJlc3VsdFNldDp0cnVlLFNRTFRy
-YW5zYWN0aW9uOnRydWUsQXJyYXlCdWZmZXI6dHJ1ZSxBcnJheUJ1ZmZlclZpZXc6ZmFsc2UsRGF0YVZp
-ZXc6dHJ1ZSxGbG9hdDMyQXJyYXk6dHJ1ZSxGbG9hdDY0QXJyYXk6dHJ1ZSxJbnQxNkFycmF5OnRydWUs
-SW50MzJBcnJheTp0cnVlLEludDhBcnJheTp0cnVlLFVpbnQxNkFycmF5OnRydWUsVWludDMyQXJyYXk6
-dHJ1ZSxVaW50OENsYW1wZWRBcnJheTp0cnVlLENhbnZhc1BpeGVsQXJyYXk6dHJ1ZSxVaW50OEFycmF5
-OmZhbHNlLEhUTUxBdWRpb0VsZW1lbnQ6dHJ1ZSxIVE1MQlJFbGVtZW50OnRydWUsSFRNTENhbnZhc0Vs
-ZW1lbnQ6dHJ1ZSxIVE1MQ29udGVudEVsZW1lbnQ6dHJ1ZSxIVE1MRExpc3RFbGVtZW50OnRydWUsSFRN
-TERhdGFMaXN0RWxlbWVudDp0cnVlLEhUTUxEZXRhaWxzRWxlbWVudDp0cnVlLEhUTUxEaWFsb2dFbGVt
-ZW50OnRydWUsSFRNTERpdkVsZW1lbnQ6dHJ1ZSxIVE1MRW1iZWRFbGVtZW50OnRydWUsSFRNTEZpZWxk
-U2V0RWxlbWVudDp0cnVlLEhUTUxIUkVsZW1lbnQ6dHJ1ZSxIVE1MSGVhZEVsZW1lbnQ6dHJ1ZSxIVE1M
-SGVhZGluZ0VsZW1lbnQ6dHJ1ZSxIVE1MSHRtbEVsZW1lbnQ6dHJ1ZSxIVE1MSUZyYW1lRWxlbWVudDp0
-cnVlLEhUTUxJbWFnZUVsZW1lbnQ6dHJ1ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExlZ2VuZEVs
-ZW1lbnQ6dHJ1ZSxIVE1MTGlua0VsZW1lbnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhUTUxNZWRp
-YUVsZW1lbnQ6dHJ1ZSxIVE1MTWVudUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1ZSxIVE1M
-TW9kRWxlbWVudDp0cnVlLEhUTUxPTGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MT2JqZWN0RWxlbWVudDp0cnVl
-LEhUTUxPcHRHcm91cEVsZW1lbnQ6dHJ1ZSxIVE1MUGljdHVyZUVsZW1lbnQ6dHJ1ZSxIVE1MUHJlRWxl
-bWVudDp0cnVlLEhUTUxRdW90ZUVsZW1lbnQ6dHJ1ZSxIVE1MU2NyaXB0RWxlbWVudDp0cnVlLEhUTUxT
-aGFkb3dFbGVtZW50OnRydWUsSFRNTFNsb3RFbGVtZW50OnRydWUsSFRNTFNvdXJjZUVsZW1lbnQ6dHJ1
-ZSxIVE1MU3BhbkVsZW1lbnQ6dHJ1ZSxIVE1MU3R5bGVFbGVtZW50OnRydWUsSFRNTFRhYmxlQ2FwdGlv
-bkVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZURhdGFDZWxsRWxl
-bWVudDp0cnVlLEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50OnRydWUsSFRNTFRhYmxlQ29sRWxlbWVu
-dDp0cnVlLEhUTUxUaW1lRWxlbWVudDp0cnVlLEhUTUxUaXRsZUVsZW1lbnQ6dHJ1ZSxIVE1MVHJhY2tF
-bGVtZW50OnRydWUsSFRNTFVMaXN0RWxlbWVudDp0cnVlLEhUTUxVbmtub3duRWxlbWVudDp0cnVlLEhU
-TUxWaWRlb0VsZW1lbnQ6dHJ1ZSxIVE1MRGlyZWN0b3J5RWxlbWVudDp0cnVlLEhUTUxGb250RWxlbWVu
-dDp0cnVlLEhUTUxGcmFtZUVsZW1lbnQ6dHJ1ZSxIVE1MRnJhbWVTZXRFbGVtZW50OnRydWUsSFRNTE1h
-cnF1ZWVFbGVtZW50OnRydWUsSFRNTEVsZW1lbnQ6ZmFsc2UsQWNjZXNzaWJsZU5vZGVMaXN0OnRydWUs
-SFRNTEFuY2hvckVsZW1lbnQ6dHJ1ZSxIVE1MQXJlYUVsZW1lbnQ6dHJ1ZSxIVE1MQmFzZUVsZW1lbnQ6
-dHJ1ZSxCbG9iOmZhbHNlLEJsdWV0b290aFJlbW90ZUdBVFREZXNjcmlwdG9yOnRydWUsSFRNTEJvZHlF
-bGVtZW50OnRydWUsSFRNTEJ1dHRvbkVsZW1lbnQ6dHJ1ZSxDREFUQVNlY3Rpb246dHJ1ZSxDaGFyYWN0
-ZXJEYXRhOnRydWUsQ29tbWVudDp0cnVlLFByb2Nlc3NpbmdJbnN0cnVjdGlvbjp0cnVlLFRleHQ6dHJ1
-ZSxDU1NLZXl3b3JkVmFsdWU6dHJ1ZSxDU1NOdW1lcmljVmFsdWU6ZmFsc2UsQ1NTUGVyc3BlY3RpdmU6
-dHJ1ZSxDU1NDaGFyc2V0UnVsZTp0cnVlLENTU0NvbmRpdGlvblJ1bGU6dHJ1ZSxDU1NGb250RmFjZVJ1
-bGU6dHJ1ZSxDU1NHcm91cGluZ1J1bGU6dHJ1ZSxDU1NJbXBvcnRSdWxlOnRydWUsQ1NTS2V5ZnJhbWVS
-dWxlOnRydWUsTW96Q1NTS2V5ZnJhbWVSdWxlOnRydWUsV2ViS2l0Q1NTS2V5ZnJhbWVSdWxlOnRydWUs
-Q1NTS2V5ZnJhbWVzUnVsZTp0cnVlLE1vekNTU0tleWZyYW1lc1J1bGU6dHJ1ZSxXZWJLaXRDU1NLZXlm
-cmFtZXNSdWxlOnRydWUsQ1NTTWVkaWFSdWxlOnRydWUsQ1NTTmFtZXNwYWNlUnVsZTp0cnVlLENTU1Bh
-Z2VSdWxlOnRydWUsQ1NTUnVsZTp0cnVlLENTU1N0eWxlUnVsZTp0cnVlLENTU1N1cHBvcnRzUnVsZTp0
-cnVlLENTU1ZpZXdwb3J0UnVsZTp0cnVlLENTU1N0eWxlRGVjbGFyYXRpb246dHJ1ZSxNU1N0eWxlQ1NT
-UHJvcGVydGllczp0cnVlLENTUzJQcm9wZXJ0aWVzOnRydWUsQ1NTSW1hZ2VWYWx1ZTp0cnVlLENTU1Bv
-c2l0aW9uVmFsdWU6dHJ1ZSxDU1NSZXNvdXJjZVZhbHVlOnRydWUsQ1NTVVJMSW1hZ2VWYWx1ZTp0cnVl
-LENTU1N0eWxlVmFsdWU6ZmFsc2UsQ1NTTWF0cml4Q29tcG9uZW50OnRydWUsQ1NTUm90YXRpb246dHJ1
-ZSxDU1NTY2FsZTp0cnVlLENTU1NrZXc6dHJ1ZSxDU1NUcmFuc2xhdGlvbjp0cnVlLENTU1RyYW5zZm9y
-bUNvbXBvbmVudDpmYWxzZSxDU1NUcmFuc2Zvcm1WYWx1ZTp0cnVlLENTU1VuaXRWYWx1ZTp0cnVlLENT
-U1VucGFyc2VkVmFsdWU6dHJ1ZSxIVE1MRGF0YUVsZW1lbnQ6dHJ1ZSxEYXRhVHJhbnNmZXJJdGVtTGlz
-dDp0cnVlLFhNTERvY3VtZW50OnRydWUsRG9jdW1lbnQ6ZmFsc2UsRE9NRXhjZXB0aW9uOnRydWUsQ2xp
-ZW50UmVjdExpc3Q6dHJ1ZSxET01SZWN0TGlzdDp0cnVlLERPTVJlY3RSZWFkT25seTpmYWxzZSxET01T
-dHJpbmdMaXN0OnRydWUsRE9NVG9rZW5MaXN0OnRydWUsRWxlbWVudDpmYWxzZSxEaXJlY3RvcnlFbnRy
-eTp0cnVlLEVudHJ5OnRydWUsRmlsZUVudHJ5OnRydWUsQWJvcnRQYXltZW50RXZlbnQ6dHJ1ZSxBbmlt
-YXRpb25FdmVudDp0cnVlLEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6dHJ1ZSxBcHBsaWNhdGlvbkNhY2hl
-RXJyb3JFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaENsaWNrRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0
-Y2hFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaEZhaWxFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaGVk
-RXZlbnQ6dHJ1ZSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZlbnQ6dHJ1ZSxCZWZvcmVVbmxvYWRFdmVudDp0
-cnVlLEJsb2JFdmVudDp0cnVlLENhbk1ha2VQYXltZW50RXZlbnQ6dHJ1ZSxDbGlwYm9hcmRFdmVudDp0
-cnVlLENsb3NlRXZlbnQ6dHJ1ZSxDdXN0b21FdmVudDp0cnVlLERldmljZU1vdGlvbkV2ZW50OnRydWUs
-RGV2aWNlT3JpZW50YXRpb25FdmVudDp0cnVlLEVycm9yRXZlbnQ6dHJ1ZSxFeHRlbmRhYmxlRXZlbnQ6
-dHJ1ZSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OnRydWUsRmV0Y2hFdmVudDp0cnVlLEZvbnRGYWNlU2V0
-TG9hZEV2ZW50OnRydWUsRm9yZWlnbkZldGNoRXZlbnQ6dHJ1ZSxHYW1lcGFkRXZlbnQ6dHJ1ZSxIYXNo
-Q2hhbmdlRXZlbnQ6dHJ1ZSxJbnN0YWxsRXZlbnQ6dHJ1ZSxNZWRpYUVuY3J5cHRlZEV2ZW50OnRydWUs
-TWVkaWFLZXlNZXNzYWdlRXZlbnQ6dHJ1ZSxNZWRpYVF1ZXJ5TGlzdEV2ZW50OnRydWUsTWVkaWFTdHJl
-YW1FdmVudDp0cnVlLE1lZGlhU3RyZWFtVHJhY2tFdmVudDp0cnVlLE1lc3NhZ2VFdmVudDp0cnVlLE1J
-RElDb25uZWN0aW9uRXZlbnQ6dHJ1ZSxNSURJTWVzc2FnZUV2ZW50OnRydWUsTXV0YXRpb25FdmVudDp0
-cnVlLE5vdGlmaWNhdGlvbkV2ZW50OnRydWUsUGFnZVRyYW5zaXRpb25FdmVudDp0cnVlLFBheW1lbnRS
-ZXF1ZXN0RXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2ZW50OnRydWUsUG9wU3RhdGVFdmVu
-dDp0cnVlLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVFdmVudDp0cnVlLFByZXNlbnRhdGlv
-bkNvbm5lY3Rpb25DbG9zZUV2ZW50OnRydWUsUHJvbWlzZVJlamVjdGlvbkV2ZW50OnRydWUsUHVzaEV2
-ZW50OnRydWUsUlRDRGF0YUNoYW5uZWxFdmVudDp0cnVlLFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6dHJ1
-ZSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50OnRydWUsUlRDVHJhY2tFdmVudDp0cnVlLFNlY3VyaXR5
-UG9saWN5VmlvbGF0aW9uRXZlbnQ6dHJ1ZSxTZW5zb3JFcnJvckV2ZW50OnRydWUsU3BlZWNoUmVjb2du
-aXRpb25FcnJvcjp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6dHJ1ZSxTcGVlY2hTeW50aGVzaXNF
-dmVudDp0cnVlLFN5bmNFdmVudDp0cnVlLFRyYWNrRXZlbnQ6dHJ1ZSxUcmFuc2l0aW9uRXZlbnQ6dHJ1
-ZSxXZWJLaXRUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxWUkRldmljZUV2ZW50OnRydWUsVlJEaXNwbGF5RXZl
-bnQ6dHJ1ZSxWUlNlc3Npb25FdmVudDp0cnVlLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6dHJ1ZSxV
-U0JDb25uZWN0aW9uRXZlbnQ6dHJ1ZSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6dHJ1ZSxBdWRpb1Byb2Nl
-c3NpbmdFdmVudDp0cnVlLE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDp0cnVlLFdlYkdMQ29udGV4
-dEV2ZW50OnRydWUsRXZlbnQ6ZmFsc2UsSW5wdXRFdmVudDpmYWxzZSxBYnNvbHV0ZU9yaWVudGF0aW9u
-U2Vuc29yOnRydWUsQWNjZWxlcm9tZXRlcjp0cnVlLEFjY2Vzc2libGVOb2RlOnRydWUsQW1iaWVudExp
-Z2h0U2Vuc29yOnRydWUsQW5pbWF0aW9uOnRydWUsQXBwbGljYXRpb25DYWNoZTp0cnVlLERPTUFwcGxp
-Y2F0aW9uQ2FjaGU6dHJ1ZSxPZmZsaW5lUmVzb3VyY2VMaXN0OnRydWUsQmFja2dyb3VuZEZldGNoUmVn
-aXN0cmF0aW9uOnRydWUsQmF0dGVyeU1hbmFnZXI6dHJ1ZSxCcm9hZGNhc3RDaGFubmVsOnRydWUsQ2Fu
-dmFzQ2FwdHVyZU1lZGlhU3RyZWFtVHJhY2s6dHJ1ZSxFdmVudFNvdXJjZTp0cnVlLEZpbGVSZWFkZXI6
-dHJ1ZSxGb250RmFjZVNldDp0cnVlLEd5cm9zY29wZTp0cnVlLExpbmVhckFjY2VsZXJhdGlvblNlbnNv
-cjp0cnVlLE1hZ25ldG9tZXRlcjp0cnVlLE1lZGlhRGV2aWNlczp0cnVlLE1lZGlhS2V5U2Vzc2lvbjp0
-cnVlLE1lZGlhUXVlcnlMaXN0OnRydWUsTWVkaWFSZWNvcmRlcjp0cnVlLE1lZGlhU291cmNlOnRydWUs
-TWVkaWFTdHJlYW06dHJ1ZSxNZWRpYVN0cmVhbVRyYWNrOnRydWUsTUlESUFjY2Vzczp0cnVlLE1JRElJ
-bnB1dDp0cnVlLE1JRElPdXRwdXQ6dHJ1ZSxNSURJUG9ydDp0cnVlLE5ldHdvcmtJbmZvcm1hdGlvbjp0
-cnVlLE5vdGlmaWNhdGlvbjp0cnVlLE9mZnNjcmVlbkNhbnZhczp0cnVlLE9yaWVudGF0aW9uU2Vuc29y
-OnRydWUsUGF5bWVudFJlcXVlc3Q6dHJ1ZSxQZXJmb3JtYW5jZTp0cnVlLFBlcm1pc3Npb25TdGF0dXM6
-dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uOnRydWUsUHJlc2VudGF0aW9uQ29ubmVjdGlvbkxpc3Q6
-dHJ1ZSxQcmVzZW50YXRpb25SZXF1ZXN0OnRydWUsUmVsYXRpdmVPcmllbnRhdGlvblNlbnNvcjp0cnVl
-LFJlbW90ZVBsYXliYWNrOnRydWUsUlRDRGF0YUNoYW5uZWw6dHJ1ZSxEYXRhQ2hhbm5lbDp0cnVlLFJU
-Q0RUTUZTZW5kZXI6dHJ1ZSxSVENQZWVyQ29ubmVjdGlvbjp0cnVlLHdlYmtpdFJUQ1BlZXJDb25uZWN0
-aW9uOnRydWUsbW96UlRDUGVlckNvbm5lY3Rpb246dHJ1ZSxTY3JlZW5PcmllbnRhdGlvbjp0cnVlLFNl
-bnNvcjp0cnVlLFNlcnZpY2VXb3JrZXI6dHJ1ZSxTZXJ2aWNlV29ya2VyQ29udGFpbmVyOnRydWUsU2Vy
-dmljZVdvcmtlclJlZ2lzdHJhdGlvbjp0cnVlLFNoYXJlZFdvcmtlcjp0cnVlLFNwZWVjaFJlY29nbml0
-aW9uOnRydWUsU3BlZWNoU3ludGhlc2lzOnRydWUsU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlOnRydWUs
-VlI6dHJ1ZSxWUkRldmljZTp0cnVlLFZSRGlzcGxheTp0cnVlLFZSU2Vzc2lvbjp0cnVlLFZpc3VhbFZp
-ZXdwb3J0OnRydWUsV2ViU29ja2V0OnRydWUsV29ya2VyOnRydWUsV29ya2VyUGVyZm9ybWFuY2U6dHJ1
-ZSxCbHVldG9vdGhEZXZpY2U6dHJ1ZSxCbHVldG9vdGhSZW1vdGVHQVRUQ2hhcmFjdGVyaXN0aWM6dHJ1
-ZSxDbGlwYm9hcmQ6dHJ1ZSxNb2pvSW50ZXJmYWNlSW50ZXJjZXB0b3I6dHJ1ZSxVU0I6dHJ1ZSxJREJE
-YXRhYmFzZTp0cnVlLElEQk9wZW5EQlJlcXVlc3Q6dHJ1ZSxJREJWZXJzaW9uQ2hhbmdlUmVxdWVzdDp0
-cnVlLElEQlJlcXVlc3Q6dHJ1ZSxJREJUcmFuc2FjdGlvbjp0cnVlLEFuYWx5c2VyTm9kZTp0cnVlLFJl
-YWx0aW1lQW5hbHlzZXJOb2RlOnRydWUsQXVkaW9CdWZmZXJTb3VyY2VOb2RlOnRydWUsQXVkaW9EZXN0
-aW5hdGlvbk5vZGU6dHJ1ZSxBdWRpb05vZGU6dHJ1ZSxBdWRpb1NjaGVkdWxlZFNvdXJjZU5vZGU6dHJ1
-ZSxBdWRpb1dvcmtsZXROb2RlOnRydWUsQmlxdWFkRmlsdGVyTm9kZTp0cnVlLENoYW5uZWxNZXJnZXJO
-b2RlOnRydWUsQXVkaW9DaGFubmVsTWVyZ2VyOnRydWUsQ2hhbm5lbFNwbGl0dGVyTm9kZTp0cnVlLEF1
-ZGlvQ2hhbm5lbFNwbGl0dGVyOnRydWUsQ29uc3RhbnRTb3VyY2VOb2RlOnRydWUsQ29udm9sdmVyTm9k
-ZTp0cnVlLERlbGF5Tm9kZTp0cnVlLER5bmFtaWNzQ29tcHJlc3Nvck5vZGU6dHJ1ZSxHYWluTm9kZTp0
-cnVlLEF1ZGlvR2Fpbk5vZGU6dHJ1ZSxJSVJGaWx0ZXJOb2RlOnRydWUsTWVkaWFFbGVtZW50QXVkaW9T
-b3VyY2VOb2RlOnRydWUsTWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZTp0cnVlLE1lZGlhU3Ry
-ZWFtQXVkaW9Tb3VyY2VOb2RlOnRydWUsT3NjaWxsYXRvck5vZGU6dHJ1ZSxPc2NpbGxhdG9yOnRydWUs
-UGFubmVyTm9kZTp0cnVlLEF1ZGlvUGFubmVyTm9kZTp0cnVlLHdlYmtpdEF1ZGlvUGFubmVyTm9kZTp0
-cnVlLFNjcmlwdFByb2Nlc3Nvck5vZGU6dHJ1ZSxKYXZhU2NyaXB0QXVkaW9Ob2RlOnRydWUsU3RlcmVv
-UGFubmVyTm9kZTp0cnVlLFdhdmVTaGFwZXJOb2RlOnRydWUsRXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0
-cnVlLEZpbGVMaXN0OnRydWUsRmlsZVdyaXRlcjp0cnVlLEhUTUxGb3JtRWxlbWVudDp0cnVlLEdhbWVw
-YWQ6dHJ1ZSxHYW1lcGFkQnV0dG9uOnRydWUsSGlzdG9yeTp0cnVlLEhUTUxDb2xsZWN0aW9uOnRydWUs
-SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb246dHJ1ZSxIVE1MT3B0aW9uc0NvbGxlY3Rpb246dHJ1ZSxI
-VE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVzdDp0cnVlLFhNTEh0dHBSZXF1ZXN0VXBsb2FkOnRy
-dWUsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpmYWxzZSxJbWFnZURhdGE6dHJ1ZSxIVE1MSW5wdXRF
-bGVtZW50OnRydWUsS2V5Ym9hcmRFdmVudDp0cnVlLEhUTUxMSUVsZW1lbnQ6dHJ1ZSxMb2NhdGlvbjp0
-cnVlLE1lZGlhTGlzdDp0cnVlLE1lc3NhZ2VQb3J0OnRydWUsSFRNTE1ldGVyRWxlbWVudDp0cnVlLE1J
-RElJbnB1dE1hcDp0cnVlLE1JRElPdXRwdXRNYXA6dHJ1ZSxNaW1lVHlwZTp0cnVlLE1pbWVUeXBlQXJy
-YXk6dHJ1ZSxNb3VzZUV2ZW50OnRydWUsRHJhZ0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hl
-ZWxFdmVudDp0cnVlLERvY3VtZW50RnJhZ21lbnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRU
-eXBlOnRydWUsTm9kZTpmYWxzZSxOb2RlTGlzdDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MT3B0
-aW9uRWxlbWVudDp0cnVlLEhUTUxPdXRwdXRFbGVtZW50OnRydWUsSFRNTFBhcmFncmFwaEVsZW1lbnQ6
-dHJ1ZSxIVE1MUGFyYW1FbGVtZW50OnRydWUsUGx1Z2luOnRydWUsUGx1Z2luQXJyYXk6dHJ1ZSxQcmVz
-ZW50YXRpb25BdmFpbGFiaWxpdHk6dHJ1ZSxIVE1MUHJvZ3Jlc3NFbGVtZW50OnRydWUsUHJvZ3Jlc3NF
-dmVudDp0cnVlLFJlc291cmNlUHJvZ3Jlc3NFdmVudDp0cnVlLFJUQ1N0YXRzUmVwb3J0OnRydWUsSFRN
-TFNlbGVjdEVsZW1lbnQ6dHJ1ZSxTb3VyY2VCdWZmZXI6dHJ1ZSxTb3VyY2VCdWZmZXJMaXN0OnRydWUs
-U3BlZWNoR3JhbW1hcjp0cnVlLFNwZWVjaEdyYW1tYXJMaXN0OnRydWUsU3BlZWNoUmVjb2duaXRpb25S
-ZXN1bHQ6dHJ1ZSxTdG9yYWdlOnRydWUsU3RvcmFnZUV2ZW50OnRydWUsQ1NTU3R5bGVTaGVldDp0cnVl
-LFN0eWxlU2hlZXQ6dHJ1ZSxIVE1MVGFibGVFbGVtZW50OnRydWUsSFRNTFRhYmxlUm93RWxlbWVudDp0
-cnVlLEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OnRydWUsSFRNTFRlbXBsYXRlRWxlbWVudDp0cnVlLEhU
-TUxUZXh0QXJlYUVsZW1lbnQ6dHJ1ZSxUZXh0VHJhY2s6dHJ1ZSxUZXh0VHJhY2tDdWU6dHJ1ZSxWVFRD
-dWU6dHJ1ZSxUZXh0VHJhY2tDdWVMaXN0OnRydWUsVGV4dFRyYWNrTGlzdDp0cnVlLFRpbWVSYW5nZXM6
-dHJ1ZSxUb3VjaDp0cnVlLFRvdWNoTGlzdDp0cnVlLFRyYWNrRGVmYXVsdExpc3Q6dHJ1ZSxDb21wb3Np
-dGlvbkV2ZW50OnRydWUsRm9jdXNFdmVudDp0cnVlLFRleHRFdmVudDp0cnVlLFRvdWNoRXZlbnQ6dHJ1
-ZSxVSUV2ZW50OmZhbHNlLFVSTDp0cnVlLFZpZGVvVHJhY2tMaXN0OnRydWUsV2luZG93OnRydWUsRE9N
-V2luZG93OnRydWUsRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29ya2VyR2xv
-YmFsU2NvcGU6dHJ1ZSxTaGFyZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2JhbFNjb3Bl
-OnRydWUsQXR0cjp0cnVlLENTU1J1bGVMaXN0OnRydWUsQ2xpZW50UmVjdDp0cnVlLERPTVJlY3Q6dHJ1
-ZSxHYW1lcGFkTGlzdDp0cnVlLE5hbWVkTm9kZU1hcDp0cnVlLE1vek5hbWVkQXR0ck1hcDp0cnVlLFNw
-ZWVjaFJlY29nbml0aW9uUmVzdWx0TGlzdDp0cnVlLFN0eWxlU2hlZXRMaXN0OnRydWUsSURCQ3Vyc29y
-OmZhbHNlLElEQkN1cnNvcldpdGhWYWx1ZTp0cnVlLElEQktleVJhbmdlOnRydWUsSURCT2JzZXJ2YXRp
-b246dHJ1ZSxTVkdBbmdsZTp0cnVlLFNWR0xlbmd0aDp0cnVlLFNWR0xlbmd0aExpc3Q6dHJ1ZSxTVkdO
-dW1iZXI6dHJ1ZSxTVkdOdW1iZXJMaXN0OnRydWUsU1ZHUG9pbnRMaXN0OnRydWUsU1ZHU2NyaXB0RWxl
-bWVudDp0cnVlLFNWR1N0cmluZ0xpc3Q6dHJ1ZSxTVkdBRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVFbGVt
-ZW50OnRydWUsU1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlVHJhbnNmb3JtRWxl
-bWVudDp0cnVlLFNWR0FuaW1hdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdDaXJjbGVFbGVtZW50OnRydWUsU1ZH
-Q2xpcFBhdGhFbGVtZW50OnRydWUsU1ZHRGVmc0VsZW1lbnQ6dHJ1ZSxTVkdEZXNjRWxlbWVudDp0cnVl
-LFNWR0Rpc2NhcmRFbGVtZW50OnRydWUsU1ZHRWxsaXBzZUVsZW1lbnQ6dHJ1ZSxTVkdGRUJsZW5kRWxl
-bWVudDp0cnVlLFNWR0ZFQ29sb3JNYXRyaXhFbGVtZW50OnRydWUsU1ZHRkVDb21wb25lbnRUcmFuc2Zl
-ckVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbXBvc2l0ZUVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbnZvbHZlTWF0cml4
-RWxlbWVudDp0cnVlLFNWR0ZFRGlmZnVzZUxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFRGlzcGxhY2Vt
-ZW50TWFwRWxlbWVudDp0cnVlLFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudDp0cnVlLFNWR0ZFRmxvb2RF
-bGVtZW50OnRydWUsU1ZHRkVGdW5jQUVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNCRWxlbWVudDp0cnVlLFNW
-R0ZFRnVuY0dFbGVtZW50OnRydWUsU1ZHRkVGdW5jUkVsZW1lbnQ6dHJ1ZSxTVkdGRUdhdXNzaWFuQmx1
-ckVsZW1lbnQ6dHJ1ZSxTVkdGRUltYWdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VFbGVtZW50OnRydWUs
-U1ZHRkVNZXJnZU5vZGVFbGVtZW50OnRydWUsU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDp0cnVlLFNWR0ZF
-T2Zmc2V0RWxlbWVudDp0cnVlLFNWR0ZFUG9pbnRMaWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRVNwZWN1bGFy
-TGlnaHRpbmdFbGVtZW50OnRydWUsU1ZHRkVTcG90TGlnaHRFbGVtZW50OnRydWUsU1ZHRkVUaWxlRWxl
-bWVudDp0cnVlLFNWR0ZFVHVyYnVsZW5jZUVsZW1lbnQ6dHJ1ZSxTVkdGaWx0ZXJFbGVtZW50OnRydWUs
-U1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQ6dHJ1ZSxTVkdHRWxlbWVudDp0cnVlLFNWR0dlb21ldHJ5RWxl
-bWVudDp0cnVlLFNWR0dyYXBoaWNzRWxlbWVudDp0cnVlLFNWR0ltYWdlRWxlbWVudDp0cnVlLFNWR0xp
-bmVFbGVtZW50OnRydWUsU1ZHTGluZWFyR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHTWFya2VyRWxlbWVu
-dDp0cnVlLFNWR01hc2tFbGVtZW50OnRydWUsU1ZHTWV0YWRhdGFFbGVtZW50OnRydWUsU1ZHUGF0aEVs
-ZW1lbnQ6dHJ1ZSxTVkdQYXR0ZXJuRWxlbWVudDp0cnVlLFNWR1BvbHlnb25FbGVtZW50OnRydWUsU1ZH
-UG9seWxpbmVFbGVtZW50OnRydWUsU1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHUmVjdEVs
-ZW1lbnQ6dHJ1ZSxTVkdTZXRFbGVtZW50OnRydWUsU1ZHU3RvcEVsZW1lbnQ6dHJ1ZSxTVkdTdHlsZUVs
-ZW1lbnQ6dHJ1ZSxTVkdTVkdFbGVtZW50OnRydWUsU1ZHU3dpdGNoRWxlbWVudDp0cnVlLFNWR1N5bWJv
-bEVsZW1lbnQ6dHJ1ZSxTVkdUU3BhbkVsZW1lbnQ6dHJ1ZSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6dHJ1
-ZSxTVkdUZXh0RWxlbWVudDp0cnVlLFNWR1RleHRQYXRoRWxlbWVudDp0cnVlLFNWR1RleHRQb3NpdGlv
-bmluZ0VsZW1lbnQ6dHJ1ZSxTVkdUaXRsZUVsZW1lbnQ6dHJ1ZSxTVkdVc2VFbGVtZW50OnRydWUsU1ZH
-Vmlld0VsZW1lbnQ6dHJ1ZSxTVkdHcmFkaWVudEVsZW1lbnQ6dHJ1ZSxTVkdDb21wb25lbnRUcmFuc2Zl
-ckZ1bmN0aW9uRWxlbWVudDp0cnVlLFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnQ6dHJ1ZSxTVkdNUGF0aEVs
-ZW1lbnQ6dHJ1ZSxTVkdFbGVtZW50OmZhbHNlLFNWR1RyYW5zZm9ybTp0cnVlLFNWR1RyYW5zZm9ybUxp
-c3Q6dHJ1ZSxBdWRpb0J1ZmZlcjp0cnVlLEF1ZGlvUGFyYW06dHJ1ZSxBdWRpb1BhcmFtTWFwOnRydWUs
-QXVkaW9UcmFja0xpc3Q6dHJ1ZSxBdWRpb0NvbnRleHQ6dHJ1ZSx3ZWJraXRBdWRpb0NvbnRleHQ6dHJ1
-ZSxCYXNlQXVkaW9Db250ZXh0OmZhbHNlLE9mZmxpbmVBdWRpb0NvbnRleHQ6dHJ1ZSxTUUxSZXN1bHRT
-ZXRSb3dMaXN0OnRydWV9KQpILmIwLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXci
-CkguUkcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5WUC4kbmF0aXZlU3Vw
-ZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILkRnLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJh
-eUJ1ZmZlclZpZXciCkguV0IuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5a
-Ry4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlBnLiRuYXRpdmVTdXBlcmNs
-YXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciClcub0guJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkV2ZW50VGFy
-Z2V0IgpXLkNFLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJFdmVudFRhcmdldCIKVy5RVi4kbmF0aXZlU3Vw
-ZXJjbGFzc1RhZz0iRXZlbnRUYXJnZXQiClcuQXcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkV2ZW50VGFy
-Z2V0In0pKCkKY29udmVydEFsbFRvRmFzdE9iamVjdCh3KQpjb252ZXJ0VG9GYXN0T2JqZWN0KCQpOyhm
-dW5jdGlvbihhKXtpZih0eXBlb2YgZG9jdW1lbnQ9PT0idW5kZWZpbmVkIil7YShudWxsKQpyZXR1cm59
-aWYodHlwZW9mIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQhPSd1bmRlZmluZWQnKXthKGRvY3VtZW50LmN1
-cnJlbnRTY3JpcHQpCnJldHVybn12YXIgdD1kb2N1bWVudC5zY3JpcHRzCmZ1bmN0aW9uIG9uTG9hZChi
-KXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrcil0W3JdLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQi
-LG9uTG9hZCxmYWxzZSkKYShiLnRhcmdldCl9Zm9yKHZhciBzPTA7czx0Lmxlbmd0aDsrK3MpdFtzXS5h
-ZGRFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2UpfSkoZnVuY3Rpb24oYSl7di5jdXJyZW50
-U2NyaXB0PWEKaWYodHlwZW9mIGRhcnRNYWluUnVubmVyPT09ImZ1bmN0aW9uIilkYXJ0TWFpblJ1bm5l
-cihMLkRlLFtdKQplbHNlIEwuRGUoW10pfSl9KSgpCi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pZ3JhdGlv
-bi5qcy5tYXAK
-''';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
index 0997d44..e9009a3 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
@@ -8,7 +8,6 @@
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart'
     hide AnalysisGetNavigationParams;
-import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
@@ -17,6 +16,7 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
+import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
 
 class DefinitionHandler
     extends MessageHandler<TextDocumentPositionParams, List<Location>> {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart
index bb721de..418e84d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart
@@ -10,6 +10,9 @@
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/source/line_info.dart';
 
 class FoldingHandler
     extends MessageHandler<FoldingRangeParams, List<FoldingRange>> {
@@ -24,16 +27,36 @@
   @override
   Future<ErrorOr<List<FoldingRange>>> handle(
       FoldingRangeParams params, CancellationToken token) async {
-    if (!isDartDocument(params.textDocument)) {
-      return success(const []);
-    }
-
     final path = pathOfDoc(params.textDocument);
-    final unit = await path.mapResult(requireUnresolvedUnit);
 
-    return unit.mapResult((unit) {
-      final lineInfo = unit.lineInfo;
-      final regions = DartUnitFoldingComputer(lineInfo, unit.unit).compute();
+    return path.mapResult((path) async {
+      final partialResults = <List<FoldingRegion>>[];
+      LineInfo lineInfo;
+
+      final unit = server.getParsedUnit(path);
+      if (unit?.state == ResultState.VALID) {
+        lineInfo = unit.lineInfo;
+
+        final regions = DartUnitFoldingComputer(lineInfo, unit.unit).compute();
+        partialResults.insert(0, regions);
+      }
+
+      // Still try to obtain line info for invalid or non-Dart files, as plugins
+      // could contribute to those.
+      lineInfo ??= server.getLineInfo(path);
+
+      if (lineInfo == null) {
+        // Line information would be required to translate folding results to
+        // LSP.
+        return success(const []);
+      }
+
+      final notificationManager = server.notificationManager;
+      final pluginResults = notificationManager.folding.getResults(path);
+      partialResults.addAll(pluginResults);
+
+      final regions =
+          notificationManager.merger.mergeFoldingRegions(partialResults);
 
       return success(
         regions.map((region) => toFoldingRange(lineInfo, region)).toList(),
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
index eeee66f..7df227a 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
@@ -4,88 +4,10 @@
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
-import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 
-/// Helper for reading client dynamic registrations which may be ommitted by the
-/// client.
-class ClientDynamicRegistrations {
-  /// All dynamic registrations supported by the Dart LSP server.
-  ///
-  /// Anything listed here and supported by the client will not send a static
-  /// registration but intead dynamically register (usually only for a subset of
-  /// files such as for .dart/pubspec.yaml/etc).
-  ///
-  /// When adding new capabilities that will be registered dynamically, the
-  /// test_dynamicRegistration_XXX tests in `lsp/initialization_test.dart` should
-  /// also be updated to ensure no double-registrations.
-  static const supported = [
-    Method.textDocument_didOpen,
-    Method.textDocument_didChange,
-    Method.textDocument_didClose,
-    Method.textDocument_completion,
-    Method.textDocument_hover,
-    Method.textDocument_signatureHelp,
-    Method.textDocument_references,
-    Method.textDocument_documentHighlight,
-    Method.textDocument_formatting,
-    Method.textDocument_onTypeFormatting,
-    Method.textDocument_definition,
-    Method.textDocument_codeAction,
-    Method.textDocument_rename,
-    Method.textDocument_foldingRange,
-  ];
-  final ClientCapabilities _capabilities;
-
-  ClientDynamicRegistrations(this._capabilities);
-
-  bool get codeActions =>
-      _capabilities.textDocument?.foldingRange?.dynamicRegistration ?? false;
-
-  bool get completion =>
-      _capabilities.textDocument?.completion?.dynamicRegistration ?? false;
-
-  bool get definition =>
-      _capabilities.textDocument?.definition?.dynamicRegistration ?? false;
-
-  bool get documentHighlights =>
-      _capabilities.textDocument?.documentHighlight?.dynamicRegistration ??
-      false;
-
-  bool get documentSymbol =>
-      _capabilities.textDocument?.documentSymbol?.dynamicRegistration ?? false;
-
-  bool get folding =>
-      _capabilities.textDocument?.foldingRange?.dynamicRegistration ?? false;
-
-  bool get formatting =>
-      _capabilities.textDocument?.formatting?.dynamicRegistration ?? false;
-
-  bool get hover =>
-      _capabilities.textDocument?.hover?.dynamicRegistration ?? false;
-
-  bool get implementation =>
-      _capabilities.textDocument?.implementation?.dynamicRegistration ?? false;
-
-  bool get references =>
-      _capabilities.textDocument?.references?.dynamicRegistration ?? false;
-
-  bool get rename =>
-      _capabilities.textDocument?.rename?.dynamicRegistration ?? false;
-
-  bool get signatureHelp =>
-      _capabilities.textDocument?.signatureHelp?.dynamicRegistration ?? false;
-
-  bool get textSync =>
-      _capabilities.textDocument?.synchronization?.dynamicRegistration ?? false;
-
-  bool get typeFormatting =>
-      _capabilities.textDocument?.onTypeFormatting?.dynamicRegistration ??
-      false;
-}
-
 class InitializeMessageHandler
     extends MessageHandler<InitializeParams, InitializeResult> {
   InitializeMessageHandler(LspAnalysisServer server) : super(server);
@@ -131,92 +53,8 @@
       openWorkspacePaths,
     );
 
-    final codeActionLiteralSupport =
-        params.capabilities.textDocument?.codeAction?.codeActionLiteralSupport;
-
-    final renameOptionsSupport =
-        params.capabilities.textDocument?.rename?.prepareSupport ?? false;
-
-    final dynamicRegistrations =
-        ClientDynamicRegistrations(params.capabilities);
-
-    // When adding new capabilities to the server that may apply to specific file
-    // types, it's important to update
-    // [IntializedMessageHandler._performDynamicRegistration()] to notify
-    // supporting clients of this. This avoids clients needing to hard-code the
-    // list of what files types we support (and allows them to avoid sending
-    // requests where we have only partial support for some types).
-    server.capabilities = ServerCapabilities(
-        dynamicRegistrations.textSync
-            ? null
-            : Either2<TextDocumentSyncOptions, num>.t1(TextDocumentSyncOptions(
-                // The open/close and sync kind flags are registered dynamically if the
-                // client supports them, so these static registrations are based on whether
-                // the client supports dynamic registration.
-                true,
-                TextDocumentSyncKind.Incremental,
-                false,
-                false,
-                null,
-              )),
-        dynamicRegistrations.hover ? null : true, // hoverProvider
-        dynamicRegistrations.completion
-            ? null
-            : CompletionOptions(
-                true, // resolveProvider
-                dartCompletionTriggerCharacters,
-              ),
-        dynamicRegistrations.signatureHelp
-            ? null
-            : SignatureHelpOptions(
-                dartSignatureHelpTriggerCharacters,
-              ),
-        dynamicRegistrations.definition ? null : true, // definitionProvider
-        null,
-        dynamicRegistrations.implementation
-            ? null
-            : true, // implementationProvider
-        dynamicRegistrations.references ? null : true, // referencesProvider
-        dynamicRegistrations.documentHighlights
-            ? null
-            : true, // documentHighlightProvider
-        dynamicRegistrations.documentSymbol
-            ? null
-            : true, // documentSymbolProvider
-        true, // workspaceSymbolProvider
-        // "The `CodeActionOptions` return type is only valid if the client
-        // signals code action literal support via the property
-        // `textDocument.codeAction.codeActionLiteralSupport`."
-        dynamicRegistrations.codeActions
-            ? null
-            : codeActionLiteralSupport != null
-                ? Either2<bool, CodeActionOptions>.t2(
-                    CodeActionOptions(DartCodeActionKind.serverSupportedKinds))
-                : Either2<bool, CodeActionOptions>.t1(true),
-        null,
-        dynamicRegistrations.formatting
-            ? null
-            : true, // documentFormattingProvider
-        false, // documentRangeFormattingProvider
-        dynamicRegistrations.typeFormatting
-            ? null
-            : DocumentOnTypeFormattingOptions(
-                dartTypeFormattingCharacters.first,
-                dartTypeFormattingCharacters.skip(1).toList()),
-        dynamicRegistrations.rename
-            ? null
-            : renameOptionsSupport
-                ? Either2<bool, RenameOptions>.t2(RenameOptions(true))
-                : Either2<bool, RenameOptions>.t1(true),
-        null,
-        null,
-        dynamicRegistrations.folding ? null : true, // foldingRangeProvider
-        null, // declarationProvider
-        ExecuteCommandOptions(Commands.serverSupportedCommands),
-        ServerCapabilitiesWorkspace(
-            ServerCapabilitiesWorkspaceFolders(true, true)),
-        null);
-
+    server.capabilities = server.capabilitiesComputer
+        .computeServerCapabilities(params.capabilities);
     return success(InitializeResult(server.capabilities));
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
index 854eaf5..f1cbeba 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
-import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
@@ -28,7 +27,7 @@
       server,
     );
 
-    _performDynamicRegistration();
+    server.capabilitiesComputer.performDynamicRegistration();
 
     if (!server.initializationOptions.onlyAnalyzeProjectsWithOpenFiles) {
       server.setAnalysisRoots(openWorkspacePaths);
@@ -36,146 +35,4 @@
 
     return success();
   }
-
-  /// If the client supports dynamic registrations we can tell it what methods
-  /// we support for which documents. For example, this allows us to ask for
-  /// file edits for .dart as well as pubspec.yaml but only get hover/completion
-  /// calls for .dart. This functionality may not be supported by the client, in
-  /// which case they will use the ServerCapabilities to know which methods we
-  /// support and it will be up to them to decide which file types they will
-  /// send requests for.
-  Future<void> _performDynamicRegistration() async {
-    final dartFiles = DocumentFilter('dart', 'file', null);
-    final pubspecFile = DocumentFilter('yaml', 'file', '**/pubspec.yaml');
-    final analysisOptionsFile =
-        DocumentFilter('yaml', 'file', '**/analysis_options.yaml');
-    final allTypes = [dartFiles, pubspecFile, analysisOptionsFile];
-
-    // TODO(dantup): When we support plugins, we will need to collect their
-    // requirements too. For example, the Angular plugin might wish to add HTML
-    // `DocumentFilter('html', 'file', null)` to many of these requests.
-
-    var _lastRegistrationId = 1;
-    final registrations = <Registration>[];
-
-    /// Helper for creating registrations with IDs.
-    void register(bool condition, Method method, [ToJsonable options]) {
-      if (condition == true) {
-        registrations.add(Registration(
-            (_lastRegistrationId++).toString(), method.toJson(), options));
-      }
-    }
-
-    final textCapabilities = server.clientCapabilities?.textDocument;
-
-    register(
-      textCapabilities?.synchronization?.dynamicRegistration,
-      Method.textDocument_didOpen,
-      TextDocumentRegistrationOptions(allTypes),
-    );
-    register(
-      textCapabilities?.synchronization?.dynamicRegistration,
-      Method.textDocument_didClose,
-      TextDocumentRegistrationOptions(allTypes),
-    );
-    register(
-      textCapabilities?.synchronization?.dynamicRegistration,
-      Method.textDocument_didChange,
-      TextDocumentChangeRegistrationOptions(
-          TextDocumentSyncKind.Incremental, allTypes),
-    );
-    register(
-      server.clientCapabilities?.textDocument?.completion?.dynamicRegistration,
-      Method.textDocument_completion,
-      CompletionRegistrationOptions(
-        dartCompletionTriggerCharacters,
-        null,
-        true,
-        [dartFiles],
-      ),
-    );
-    register(
-      textCapabilities?.hover?.dynamicRegistration,
-      Method.textDocument_hover,
-      TextDocumentRegistrationOptions([dartFiles]),
-    );
-    register(
-      textCapabilities?.signatureHelp?.dynamicRegistration,
-      Method.textDocument_signatureHelp,
-      SignatureHelpRegistrationOptions(
-          dartSignatureHelpTriggerCharacters, [dartFiles]),
-    );
-    register(
-      server.clientCapabilities?.textDocument?.references?.dynamicRegistration,
-      Method.textDocument_references,
-      TextDocumentRegistrationOptions([dartFiles]),
-    );
-    register(
-      textCapabilities?.documentHighlight?.dynamicRegistration,
-      Method.textDocument_documentHighlight,
-      TextDocumentRegistrationOptions([dartFiles]),
-    );
-    register(
-      textCapabilities?.documentSymbol?.dynamicRegistration,
-      Method.textDocument_documentSymbol,
-      TextDocumentRegistrationOptions([dartFiles]),
-    );
-    register(
-      server.clientCapabilities?.textDocument?.formatting?.dynamicRegistration,
-      Method.textDocument_formatting,
-      TextDocumentRegistrationOptions([dartFiles]),
-    );
-    register(
-      textCapabilities?.onTypeFormatting?.dynamicRegistration,
-      Method.textDocument_onTypeFormatting,
-      DocumentOnTypeFormattingRegistrationOptions(
-        dartTypeFormattingCharacters.first,
-        dartTypeFormattingCharacters.skip(1).toList(),
-        [dartFiles],
-      ),
-    );
-    register(
-      server.clientCapabilities?.textDocument?.definition?.dynamicRegistration,
-      Method.textDocument_definition,
-      TextDocumentRegistrationOptions([dartFiles]),
-    );
-    register(
-      textCapabilities?.implementation?.dynamicRegistration,
-      Method.textDocument_implementation,
-      TextDocumentRegistrationOptions([dartFiles]),
-    );
-    register(
-      server.clientCapabilities?.textDocument?.codeAction?.dynamicRegistration,
-      Method.textDocument_codeAction,
-      CodeActionRegistrationOptions(
-          [dartFiles], DartCodeActionKind.serverSupportedKinds),
-    );
-    register(
-      textCapabilities?.rename?.dynamicRegistration,
-      Method.textDocument_rename,
-      RenameRegistrationOptions(true, [dartFiles]),
-    );
-    register(
-      textCapabilities?.foldingRange?.dynamicRegistration,
-      Method.textDocument_foldingRange,
-      TextDocumentRegistrationOptions([dartFiles]),
-    );
-
-    // Only send the registration request if we have at least one (since
-    // otherwise we don't know that the client supports registerCapability).
-    if (registrations.isNotEmpty) {
-      final registrationResponse = await server.sendRequest(
-        Method.client_registerCapability,
-        RegistrationParams(registrations),
-      );
-
-      if (registrationResponse.error != null) {
-        server.logErrorToClient(
-          'Failed to register capabilities with client: '
-          '(${registrationResponse.error.code}) '
-          '${registrationResponse.error.message}',
-        );
-      }
-    }
-  }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
index be37eac..bf4094e 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
@@ -6,7 +6,6 @@
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
-import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
@@ -17,6 +16,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
+import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
 
 class ReferencesHandler
     extends MessageHandler<ReferenceParams, List<Location>> {
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index c91a44c..cecd4f4 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -11,6 +11,7 @@
 import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/analysis_server_abstract.dart';
+import 'package:analysis_server/src/channel/channel.dart';
 import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/computer/computer_closingLabels.dart';
 import 'package:analysis_server/src/computer/computer_outline.dart';
@@ -23,7 +24,9 @@
 import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/lsp/server_capabilities_computer.dart';
 import 'package:analysis_server/src/plugin/notification_manager.dart';
+import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
@@ -42,6 +45,7 @@
 import 'package:analyzer/src/dart/analysis/status.dart' as nd;
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:watcher/watcher.dart';
 
 /// Instances of the class [LspAnalysisServer] implement an LSP-based server
@@ -81,6 +85,7 @@
   /// Capabilities of the server. Will be null prior to initialization as
   /// the server capabilities depend on the client capabilities.
   ServerCapabilities capabilities;
+  ServerCapabilitiesComputer capabilitiesComputer;
 
   LspPerformance performanceStats = LspPerformance();
 
@@ -88,6 +93,8 @@
   /// automatically.
   bool willExit = false;
 
+  StreamSubscription _pluginChangeSubscription;
+
   /// Initialize a newly created server to send and receive messages to the
   /// given [channel].
   LspAnalysisServer(
@@ -99,14 +106,19 @@
     InstrumentationService instrumentationService, {
     DiagnosticServer diagnosticServer,
   }) : super(
-            options,
-            sdkManager,
-            diagnosticServer,
-            crashReportingAttachmentsBuilder,
-            baseResourceProvider,
-            instrumentationService,
-            NullNotificationManager()) {
+          options,
+          sdkManager,
+          diagnosticServer,
+          crashReportingAttachmentsBuilder,
+          baseResourceProvider,
+          instrumentationService,
+          NotificationManager(
+            const NoOpServerCommunicationChannel(),
+            baseResourceProvider.pathContext,
+          ),
+        ) {
     messageHandler = UninitializedStateMessageHandler(this);
+    capabilitiesComputer = ServerCapabilitiesComputer(this);
 
     final contextManagerCallbacks =
         LspServerContextManagerCallbacks(this, resourceProvider);
@@ -116,6 +128,8 @@
     analysisDriverScheduler.start();
 
     channel.listen(handleMessage, onDone: done, onError: socketError);
+    _pluginChangeSubscription =
+        pluginManager.pluginsChanged.listen((_) => _onPluginsChanged());
   }
 
   /// The capabilities of the LSP client. Will be null prior to initialization.
@@ -127,6 +141,16 @@
   /// specific server functionality. Will be null prior to initialization.
   LspInitializationOptions get initializationOptions => _initializationOptions;
 
+  @override
+  set pluginManager(PluginManager value) {
+    // we exchange the plugin manager in tests
+    super.pluginManager = value;
+    _pluginChangeSubscription?.cancel();
+
+    _pluginChangeSubscription =
+        pluginManager.pluginsChanged.listen((_) => _onPluginsChanged());
+  }
+
   RefactoringWorkspace get refactoringWorkspace => _refactoringWorkspace ??=
       RefactoringWorkspace(driverMap.values, searchEngine);
 
@@ -134,7 +158,7 @@
     final didAdd = priorityFiles.add(path);
     assert(didAdd);
     if (didAdd) {
-      _updateDriversPriorityFiles();
+      _updateDriversAndPluginsPriorityFiles();
     }
   }
 
@@ -315,7 +339,7 @@
     final didRemove = priorityFiles.remove(path);
     assert(didRemove);
     if (didRemove) {
-      _updateDriversPriorityFiles();
+      _updateDriversAndPluginsPriorityFiles();
     }
   }
 
@@ -398,6 +422,7 @@
     declarationsTracker?.discardContexts();
     final uniquePaths = HashSet<String>.of(includedPaths ?? const []);
     contextManager.setRoots(uniquePaths.toList(), [], {});
+    notificationManager.setAnalysisRoots(includedPaths, []);
     addContextsToDeclarationsTracker();
   }
 
@@ -457,6 +482,7 @@
     Future(() {
       channel.close();
     });
+    _pluginChangeSubscription?.cancel();
 
     return Future.value();
   }
@@ -491,9 +517,32 @@
     notifyFlutterWidgetDescriptions(path);
   }
 
-  void _updateDriversPriorityFiles() {
+  void _onPluginsChanged() {
+    capabilitiesComputer.performDynamicRegistration();
+  }
+
+  void _updateDriversAndPluginsPriorityFiles() {
+    final priorityFilesList = priorityFiles.toList();
     driverMap.values.forEach((driver) {
-      driver.priorityFiles = priorityFiles.toList();
+      driver.priorityFiles = priorityFilesList;
+    });
+
+    final pluginPriorities =
+        plugin.AnalysisSetPriorityFilesParams(priorityFilesList);
+    pluginManager.setAnalysisSetPriorityFilesParams(pluginPriorities);
+
+    // Plugins send most of their analysis results via notifications, but with
+    // LSP we're supposed to have them available per request. Assume that we'll
+    // only receive requests for files that are currently open.
+    final pluginSubscriptions = plugin.AnalysisSetSubscriptionsParams({
+      for (final service in plugin.AnalysisService.VALUES)
+        service: priorityFilesList,
+    });
+    pluginManager.setAnalysisSetSubscriptionsParams(pluginSubscriptions);
+
+    notificationManager.setSubscriptions({
+      for (final service in protocol.AnalysisService.VALUES)
+        service: priorityFiles
     });
   }
 }
@@ -665,7 +714,19 @@
   }
 }
 
-class NullNotificationManager implements NotificationManager {
+class NoOpServerCommunicationChannel implements ServerCommunicationChannel {
+  const NoOpServerCommunicationChannel();
+
   @override
-  dynamic noSuchMethod(Invocation invocation) {}
+  void close() {}
+
+  @override
+  void listen(void Function(protocol.Request request) onRequest,
+      {Function onError, void Function() onDone}) {}
+
+  @override
+  void sendNotification(protocol.Notification notification) {}
+
+  @override
+  void sendResponse(protocol.Response response) {}
 }
diff --git a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
new file mode 100644
index 0000000..a359d36
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
@@ -0,0 +1,371 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+/// Helper for reading client dynamic registrations which may be ommitted by the
+/// client.
+class ClientDynamicRegistrations {
+  /// All dynamic registrations supported by the Dart LSP server.
+  ///
+  /// Anything listed here and supported by the client will not send a static
+  /// registration but intead dynamically register (usually only for a subset of
+  /// files such as for .dart/pubspec.yaml/etc).
+  ///
+  /// When adding new capabilities that will be registered dynamically, the
+  /// test_dynamicRegistration_XXX tests in `lsp/initialization_test.dart` should
+  /// also be updated to ensure no double-registrations.
+  static const supported = [
+    Method.textDocument_didOpen,
+    Method.textDocument_didChange,
+    Method.textDocument_didClose,
+    Method.textDocument_completion,
+    Method.textDocument_hover,
+    Method.textDocument_signatureHelp,
+    Method.textDocument_references,
+    Method.textDocument_documentHighlight,
+    Method.textDocument_formatting,
+    Method.textDocument_onTypeFormatting,
+    Method.textDocument_definition,
+    Method.textDocument_codeAction,
+    Method.textDocument_rename,
+    Method.textDocument_foldingRange,
+  ];
+  final ClientCapabilities _capabilities;
+
+  ClientDynamicRegistrations(this._capabilities);
+
+  bool get codeActions =>
+      _capabilities.textDocument?.foldingRange?.dynamicRegistration ?? false;
+
+  bool get completion =>
+      _capabilities.textDocument?.completion?.dynamicRegistration ?? false;
+
+  bool get definition =>
+      _capabilities.textDocument?.definition?.dynamicRegistration ?? false;
+
+  bool get documentHighlights =>
+      _capabilities.textDocument?.documentHighlight?.dynamicRegistration ??
+      false;
+
+  bool get documentSymbol =>
+      _capabilities.textDocument?.documentSymbol?.dynamicRegistration ?? false;
+
+  bool get folding =>
+      _capabilities.textDocument?.foldingRange?.dynamicRegistration ?? false;
+
+  bool get formatting =>
+      _capabilities.textDocument?.formatting?.dynamicRegistration ?? false;
+
+  bool get hover =>
+      _capabilities.textDocument?.hover?.dynamicRegistration ?? false;
+
+  bool get implementation =>
+      _capabilities.textDocument?.implementation?.dynamicRegistration ?? false;
+
+  bool get references =>
+      _capabilities.textDocument?.references?.dynamicRegistration ?? false;
+
+  bool get rename =>
+      _capabilities.textDocument?.rename?.dynamicRegistration ?? false;
+
+  bool get signatureHelp =>
+      _capabilities.textDocument?.signatureHelp?.dynamicRegistration ?? false;
+
+  bool get textSync =>
+      _capabilities.textDocument?.synchronization?.dynamicRegistration ?? false;
+
+  bool get typeFormatting =>
+      _capabilities.textDocument?.onTypeFormatting?.dynamicRegistration ??
+      false;
+}
+
+class ServerCapabilitiesComputer {
+  final LspAnalysisServer _server;
+
+  /// Map from method name to current registration data.
+  Map<String, Registration> _currentRegistrations = {};
+  var _lastRegistrationId = 0;
+
+  ServerCapabilitiesComputer(this._server);
+
+  ServerCapabilities computeServerCapabilities(
+      ClientCapabilities clientCapabilities) {
+    final codeActionLiteralSupport =
+        clientCapabilities.textDocument?.codeAction?.codeActionLiteralSupport;
+
+    final renameOptionsSupport =
+        clientCapabilities.textDocument?.rename?.prepareSupport ?? false;
+
+    final dynamicRegistrations = ClientDynamicRegistrations(clientCapabilities);
+
+    // When adding new capabilities to the server that may apply to specific file
+    // types, it's important to update
+    // [IntializedMessageHandler._performDynamicRegistration()] to notify
+    // supporting clients of this. This avoids clients needing to hard-code the
+    // list of what files types we support (and allows them to avoid sending
+    // requests where we have only partial support for some types).
+    return ServerCapabilities(
+        dynamicRegistrations.textSync
+            ? null
+            : Either2<TextDocumentSyncOptions, num>.t1(TextDocumentSyncOptions(
+                // The open/close and sync kind flags are registered dynamically if the
+                // client supports them, so these static registrations are based on whether
+                // the client supports dynamic registration.
+                true,
+                TextDocumentSyncKind.Incremental,
+                false,
+                false,
+                null,
+              )),
+        dynamicRegistrations.hover ? null : true, // hoverProvider
+        dynamicRegistrations.completion
+            ? null
+            : CompletionOptions(
+                true, // resolveProvider
+                dartCompletionTriggerCharacters,
+              ),
+        dynamicRegistrations.signatureHelp
+            ? null
+            : SignatureHelpOptions(
+                dartSignatureHelpTriggerCharacters,
+              ),
+        dynamicRegistrations.definition ? null : true, // definitionProvider
+        null,
+        dynamicRegistrations.implementation
+            ? null
+            : true, // implementationProvider
+        dynamicRegistrations.references ? null : true, // referencesProvider
+        dynamicRegistrations.documentHighlights
+            ? null
+            : true, // documentHighlightProvider
+        dynamicRegistrations.documentSymbol
+            ? null
+            : true, // documentSymbolProvider
+        true, // workspaceSymbolProvider
+        // "The `CodeActionOptions` return type is only valid if the client
+        // signals code action literal support via the property
+        // `textDocument.codeAction.codeActionLiteralSupport`."
+        dynamicRegistrations.codeActions
+            ? null
+            : codeActionLiteralSupport != null
+                ? Either2<bool, CodeActionOptions>.t2(
+                    CodeActionOptions(DartCodeActionKind.serverSupportedKinds))
+                : Either2<bool, CodeActionOptions>.t1(true),
+        null,
+        dynamicRegistrations.formatting
+            ? null
+            : true, // documentFormattingProvider
+        false, // documentRangeFormattingProvider
+        dynamicRegistrations.typeFormatting
+            ? null
+            : DocumentOnTypeFormattingOptions(
+                dartTypeFormattingCharacters.first,
+                dartTypeFormattingCharacters.skip(1).toList()),
+        dynamicRegistrations.rename
+            ? null
+            : renameOptionsSupport
+                ? Either2<bool, RenameOptions>.t2(RenameOptions(true))
+                : Either2<bool, RenameOptions>.t1(true),
+        null,
+        null,
+        dynamicRegistrations.folding ? null : true, // foldingRangeProvider
+        null, // declarationProvider
+        ExecuteCommandOptions(Commands.serverSupportedCommands),
+        ServerCapabilitiesWorkspace(
+            ServerCapabilitiesWorkspaceFolders(true, true)),
+        null);
+  }
+
+  /// If the client supports dynamic registrations we can tell it what methods
+  /// we support for which documents. For example, this allows us to ask for
+  /// file edits for .dart as well as pubspec.yaml but only get hover/completion
+  /// calls for .dart. This functionality may not be supported by the client, in
+  /// which case they will use the ServerCapabilities to know which methods we
+  /// support and it will be up to them to decide which file types they will
+  /// send requests for.
+  Future<void> performDynamicRegistration() async {
+    final dartFiles = DocumentFilter('dart', 'file', null);
+    final pubspecFile = DocumentFilter('yaml', 'file', '**/pubspec.yaml');
+    final analysisOptionsFile =
+        DocumentFilter('yaml', 'file', '**/analysis_options.yaml');
+
+    final pluginTypes = _server.pluginManager.plugins
+        .expand((plugin) => plugin.currentSession?.interestingFiles ?? const [])
+        // All published plugins use something like `*.extension` as
+        // interestingFiles. Prefix a `**/` so that the glob matches nested
+        // folders as well.
+        .map((glob) => DocumentFilter(null, 'file', '**/$glob'));
+
+    final allTypes = [
+      dartFiles,
+      pubspecFile,
+      analysisOptionsFile,
+      ...pluginTypes
+    ];
+
+    final registrations = <Registration>[];
+
+    /// Helper for creating registrations with IDs.
+    void register(bool condition, Method method, [ToJsonable options]) {
+      if (condition == true) {
+        registrations.add(Registration(
+            (_lastRegistrationId++).toString(), method.toJson(), options));
+      }
+    }
+
+    final textCapabilities = _server.clientCapabilities?.textDocument;
+
+    register(
+      textCapabilities?.synchronization?.dynamicRegistration,
+      Method.textDocument_didOpen,
+      TextDocumentRegistrationOptions(allTypes),
+    );
+    register(
+      textCapabilities?.synchronization?.dynamicRegistration,
+      Method.textDocument_didClose,
+      TextDocumentRegistrationOptions(allTypes),
+    );
+    register(
+      textCapabilities?.synchronization?.dynamicRegistration,
+      Method.textDocument_didChange,
+      TextDocumentChangeRegistrationOptions(
+          TextDocumentSyncKind.Incremental, allTypes),
+    );
+    register(
+      _server.clientCapabilities?.textDocument?.completion?.dynamicRegistration,
+      Method.textDocument_completion,
+      CompletionRegistrationOptions(
+        dartCompletionTriggerCharacters,
+        null,
+        true,
+        [dartFiles],
+      ),
+    );
+    register(
+      textCapabilities?.hover?.dynamicRegistration,
+      Method.textDocument_hover,
+      TextDocumentRegistrationOptions([dartFiles]),
+    );
+    register(
+      textCapabilities?.signatureHelp?.dynamicRegistration,
+      Method.textDocument_signatureHelp,
+      SignatureHelpRegistrationOptions(
+          dartSignatureHelpTriggerCharacters, [dartFiles]),
+    );
+    register(
+      _server.clientCapabilities?.textDocument?.references?.dynamicRegistration,
+      Method.textDocument_references,
+      TextDocumentRegistrationOptions([dartFiles]),
+    );
+    register(
+      textCapabilities?.documentHighlight?.dynamicRegistration,
+      Method.textDocument_documentHighlight,
+      TextDocumentRegistrationOptions([dartFiles]),
+    );
+    register(
+      textCapabilities?.documentSymbol?.dynamicRegistration,
+      Method.textDocument_documentSymbol,
+      TextDocumentRegistrationOptions([dartFiles]),
+    );
+    register(
+      _server.clientCapabilities?.textDocument?.formatting?.dynamicRegistration,
+      Method.textDocument_formatting,
+      TextDocumentRegistrationOptions([dartFiles]),
+    );
+    register(
+      textCapabilities?.onTypeFormatting?.dynamicRegistration,
+      Method.textDocument_onTypeFormatting,
+      DocumentOnTypeFormattingRegistrationOptions(
+        dartTypeFormattingCharacters.first,
+        dartTypeFormattingCharacters.skip(1).toList(),
+        [dartFiles],
+      ),
+    );
+    register(
+      _server.clientCapabilities?.textDocument?.definition?.dynamicRegistration,
+      Method.textDocument_definition,
+      TextDocumentRegistrationOptions([dartFiles]),
+    );
+    register(
+      textCapabilities?.implementation?.dynamicRegistration,
+      Method.textDocument_implementation,
+      TextDocumentRegistrationOptions([dartFiles]),
+    );
+    register(
+      _server.clientCapabilities?.textDocument?.codeAction?.dynamicRegistration,
+      Method.textDocument_codeAction,
+      CodeActionRegistrationOptions(
+          [dartFiles], DartCodeActionKind.serverSupportedKinds),
+    );
+    register(
+      textCapabilities?.rename?.dynamicRegistration,
+      Method.textDocument_rename,
+      RenameRegistrationOptions(true, [dartFiles]),
+    );
+    register(
+      textCapabilities?.foldingRange?.dynamicRegistration,
+      Method.textDocument_foldingRange,
+      TextDocumentRegistrationOptions(allTypes),
+    );
+
+    await _applyRegistrations(registrations);
+  }
+
+  Future<void> _applyRegistrations(List<Registration> registrations) async {
+    final newRegistrationsByMethod = {
+      for (final registration in registrations)
+        registration.method: registration
+    };
+
+    final additionalRegistrations = List.of(registrations);
+    final removedRegistrations = <Unregistration>[];
+
+    // compute a diff of old and new registrations to send the unregister or
+    // another register request. We assume that we'll only ever have one
+    // registration per LSP method name.
+    for (final entry in _currentRegistrations.entries) {
+      final method = entry.key;
+      final registration = entry.value;
+
+      final newRegistrationForMethod = newRegistrationsByMethod[method];
+      final entryRemovedOrChanged = newRegistrationForMethod?.registerOptions !=
+          registration.registerOptions;
+
+      if (entryRemovedOrChanged) {
+        removedRegistrations
+            .add(Unregistration(registration.id, registration.method));
+      } else {
+        additionalRegistrations.remove(newRegistrationForMethod);
+      }
+    }
+
+    _currentRegistrations = newRegistrationsByMethod;
+
+    if (removedRegistrations.isNotEmpty) {
+      await _server.sendRequest(Method.client_unregisterCapability,
+          UnregistrationParams(removedRegistrations));
+    }
+
+    // Only send the registration request if we have at least one (since
+    // otherwise we don't know that the client supports registerCapability).
+    if (additionalRegistrations.isNotEmpty) {
+      final registrationResponse = await _server.sendRequest(
+        Method.client_registerCapability,
+        RegistrationParams(additionalRegistrations),
+      );
+
+      if (registrationResponse.error != null) {
+        _server.logErrorToClient(
+          'Failed to register capabilities with client: '
+          '(${registrationResponse.error.code}) '
+          '${registrationResponse.error.message}',
+        );
+      }
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 9a0fadc..7890009 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -21,8 +21,6 @@
 
 Future<void> scheduleImplementedNotification(
     AnalysisServer server, Iterable<String> files) async {
-  // TODO(brianwilkerson) Determine whether this await is necessary.
-  await null;
   var searchEngine = server.searchEngine;
   if (searchEngine == null) {
     return;
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
index de68843..785e77b 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
@@ -195,8 +195,6 @@
   /// used to interact with the plugin, or `null` if the plugin could not be
   /// run.
   Future<PluginSession> start(String byteStorePath, String sdkPath) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     if (currentSession != null) {
       throw StateError('Cannot start a plugin that is already running.');
     }
@@ -281,6 +279,8 @@
   /// plugin has been started.
   final Map<String, dynamic> _overlayState = <String, dynamic>{};
 
+  final StreamController<void> _pluginsChanged = StreamController.broadcast();
+
   /// Initialize a newly created plugin manager. The notifications from the
   /// running plugins will be handled by the given [notificationManager].
   PluginManager(this.resourceProvider, this.byteStorePath, this.sdkPath,
@@ -289,13 +289,14 @@
   /// Return a list of all of the plugins that are currently known.
   List<PluginInfo> get plugins => _pluginMap.values.toList();
 
+  /// Stream emitting an event when known [plugins] change.
+  Stream<void> get pluginsChanged => _pluginsChanged.stream;
+
   /// Add the plugin with the given [path] to the list of plugins that should be
   /// used when analyzing code for the given [contextRoot]. If the plugin had
   /// not yet been started, then it will be started by this method.
   Future<void> addPluginToContextRoot(
       analyzer.ContextRoot contextRoot, String path) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var plugin = _pluginMap[path];
     var isNew = plugin == null;
     if (isNew) {
@@ -317,6 +318,7 @@
           var session = await plugin.start(byteStorePath, sdkPath);
           session?.onDone?.then((_) {
             _pluginMap.remove(path);
+            _notifyPluginsChanged();
           });
         } catch (exception, stackTrace) {
           // Record the exception (for debugging purposes) and record the fact
@@ -325,6 +327,8 @@
           isNew = false;
         }
       }
+
+      _notifyPluginsChanged();
     }
     plugin.addContextRoot(contextRoot);
     if (isNew) {
@@ -364,8 +368,6 @@
   /// response.
   Future<List<Future<Response>>> broadcastWatchEvent(
       watcher.WatchEvent watchEvent) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var filePath = watchEvent.path;
 
     /// Return `true` if the given glob [pattern] matches the file being
@@ -469,6 +471,7 @@
       plugin.removeContextRoot(contextRoot);
       if (plugin is DiscoveredPluginInfo && plugin.contextRoots.isEmpty) {
         _pluginMap.remove(plugin.path);
+        _notifyPluginsChanged();
         try {
           plugin.stop();
         } catch (e, st) {
@@ -481,8 +484,6 @@
 
   /// Restart all currently running plugins.
   Future<void> restartPlugins() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     for (var plugin in _pluginMap.values.toList()) {
       if (plugin.currentSession != null) {
         //
@@ -708,6 +709,8 @@
     return packagesFile;
   }
 
+  void _notifyPluginsChanged() => _pluginsChanged.add(null);
+
   /// Return the names of packages that are listed as dependencies in the given
   /// [pubspecFile].
   Iterable<String> _readDependecies(File pubspecFile) {
@@ -893,8 +896,6 @@
   /// the given [byteStorePath]. Return `true` if the plugin is compatible and
   /// running.
   Future<bool> start(String byteStorePath, String sdkPath) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     if (channel != null) {
       throw StateError('Cannot start a plugin that is already running.');
     }
diff --git a/pkg/analysis_server/lib/src/search/element_references.dart b/pkg/analysis_server/lib/src/search/element_references.dart
index 4b34793..ba332d9 100644
--- a/pkg/analysis_server/lib/src/search/element_references.dart
+++ b/pkg/analysis_server/lib/src/search/element_references.dart
@@ -19,8 +19,6 @@
   /// Computes [SearchResult]s for [element] references.
   Future<List<SearchResult>> compute(
       Element element, bool withPotential) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var results = <SearchResult>[];
 
     // Add element references.
@@ -40,8 +38,6 @@
   /// Returns a [Future] completing with a [List] of references to [element] or
   /// to the corresponding hierarchy [Element]s.
   Future<List<SearchResult>> _findElementsReferences(Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var allResults = <SearchResult>[];
     var refElements = await _getRefElements(element);
     for (var refElement in refElements) {
@@ -54,8 +50,6 @@
   /// Returns a [Future] completing with a [List] of references to [element].
   Future<List<SearchResult>> _findSingleElementReferences(
       Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var matches = await searchEngine.searchReferences(element);
     matches = SearchMatch.withNotNullElement(matches);
     return matches.map(toResult).toList();
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index 5ddaa75..e3ad323 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -32,8 +32,6 @@
         searchEngine = server.searchEngine;
 
   Future findElementReferences(protocol.Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params =
         protocol.SearchFindElementReferencesParams.fromRequest(request);
     var file = params.file;
@@ -65,8 +63,6 @@
   }
 
   Future findMemberDeclarations(protocol.Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params =
         protocol.SearchFindMemberDeclarationsParams.fromRequest(request);
     await server.onAnalysisComplete;
@@ -81,8 +77,6 @@
   }
 
   Future findMemberReferences(protocol.Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params = protocol.SearchFindMemberReferencesParams.fromRequest(request);
     await server.onAnalysisComplete;
     // respond
@@ -96,8 +90,6 @@
   }
 
   Future findTopLevelDeclarations(protocol.Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params =
         protocol.SearchFindTopLevelDeclarationsParams.fromRequest(request);
     try {
@@ -122,8 +114,6 @@
 
   /// Implement the `search.getDeclarations` request.
   Future getDeclarations(protocol.Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params =
         protocol.SearchGetElementDeclarationsParams.fromRequest(request);
 
@@ -203,8 +193,6 @@
 
   /// Implement the `search.getTypeHierarchy` request.
   Future getTypeHierarchy(protocol.Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var params = protocol.SearchGetTypeHierarchyParams.fromRequest(request);
     var file = params.file;
     // prepare element
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 3d14a00..91c6074 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -613,9 +613,6 @@
           serveResult = isolateAnalysisServer.serveIsolate(sendPort);
         }
         serveResult.then((_) async {
-          // TODO(brianwilkerson) Determine whether this await is necessary.
-          await null;
-
           if (serve_http) {
             httpServer.close();
           }
diff --git a/pkg/analysis_server/lib/src/server/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart
index b1d8d36..394cb9a 100644
--- a/pkg/analysis_server/lib/src/server/http_server.dart
+++ b/pkg/analysis_server/lib/src/server/http_server.dart
@@ -41,8 +41,6 @@
 
   /// Return the port this server is bound to.
   Future<int> get boundPort async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return (await _serverFuture)?.port;
   }
 
@@ -63,8 +61,6 @@
 
   /// Begin serving HTTP requests over the given port.
   Future<int> serveHttp([int initialPort]) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     if (_serverFuture != null) {
       return boundPort;
     }
@@ -87,8 +83,6 @@
 
   /// Handle a GET request received by the HTTP server.
   Future<void> _handleGetRequest(HttpRequest request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     getHandler ??= DiagnosticsSite(socketServer, _printBuffer);
     // TODO(brianwilkerson) Determine if await is necessary, if so, change the
     // return type of [AbstractGetHandler.handleGetRequest] to `Future<void>`.
@@ -98,8 +92,6 @@
   /// Attach a listener to a newly created HTTP server.
   void _handleServer(HttpServer httpServer) {
     httpServer.listen((HttpRequest request) async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
       var updateValues = request.headers[HttpHeaders.upgradeHeader];
       if (request.method == 'GET') {
         await _handleGetRequest(request);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
index da7524d..db8e83f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
@@ -26,12 +26,10 @@
     if (directive is NamespaceDirective) {
       var library = directive.uriElement as LibraryElement;
       if (library != null) {
-        var builder = LibraryElementSuggestionBuilder(
-            request, CompletionSuggestionKind.IDENTIFIER, false, false);
         for (var element in library.exportNamespace.definedNames.values) {
-          element.accept(builder);
+          builder.suggestElement(element,
+              kind: CompletionSuggestionKind.IDENTIFIER);
         }
-        return builder.suggestions;
       }
     }
     return const <CompletionSuggestion>[];
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 19d6d70..1eb2d01 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
@@ -32,7 +32,7 @@
       return const <CompletionSuggestion>[];
     }
 
-    memberBuilder = MemberSuggestionBuilder(request);
+    memberBuilder = MemberSuggestionBuilder(request, builder);
 
     // Recompute the target because resolution might have changed it.
     var expression = request.dotTarget;
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 7be25c6..d7c061b 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
@@ -40,7 +40,7 @@
     var classOrMixin = member.parent;
     if (classOrMixin is ClassOrMixinDeclaration &&
         classOrMixin.declaredElement != null) {
-      memberBuilder = MemberSuggestionBuilder(request);
+      memberBuilder = MemberSuggestionBuilder(request, builder);
       return _computeSuggestionsForClass(classOrMixin.declaredElement, request);
     }
     return const <CompletionSuggestion>[];
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 bbe61ce..6d08f63 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
@@ -7,6 +7,7 @@
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
+import 'package:analysis_server/src/utilities/extensions/ast.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -63,10 +64,6 @@
   int get lowKeyword =>
       request.useNewRelevance ? 400 : DART_RELEVANCE_KEYWORD - 1;
 
-  bool isEmptyBody(FunctionBody body) =>
-      body is EmptyFunctionBody ||
-      (body is BlockFunctionBody && body.beginToken.isSynthetic);
-
   @override
   void visitArgumentList(ArgumentList node) {
     if (request is DartCompletionRequestImpl) {
@@ -151,7 +148,7 @@
       }
     }
     _addStatementKeywords(node);
-    if (_inCatchClause(node)) {
+    if (node.inCatchClause) {
       _addSuggestion(Keyword.RETHROW, relevance: lowKeyword);
     }
   }
@@ -168,7 +165,7 @@
       _addClassBodyKeywords();
       var index = node.members.indexOf(entity);
       var previous = index > 0 ? node.members[index - 1] : null;
-      if (previous is MethodDeclaration && isEmptyBody(previous.body)) {
+      if (previous is MethodDeclaration && previous.body.isEmpty) {
         _addSuggestion(Keyword.ASYNC);
         _addSuggestion2(ASYNC_STAR);
         _addSuggestion2(SYNC_STAR);
@@ -235,7 +232,7 @@
     if (entity == null || entity is Declaration) {
       if (previousMember is FunctionDeclaration &&
           previousMember.functionExpression is FunctionExpression &&
-          isEmptyBody(previousMember.functionExpression.body)) {
+          previousMember.functionExpression.body.isEmpty) {
         _addSuggestion(Keyword.ASYNC, relevance: highKeyword);
         _addSuggestion2(ASYNC_STAR, relevance: highKeyword);
         _addSuggestion2(SYNC_STAR, relevance: highKeyword);
@@ -521,7 +518,7 @@
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
     if (entity == node.body) {
-      if (isEmptyBody(node.body)) {
+      if (node.body.isEmpty) {
         _addClassBodyKeywords();
         _addSuggestion(Keyword.ASYNC);
         _addSuggestion2(ASYNC_STAR);
@@ -569,7 +566,7 @@
       _addClassBodyKeywords();
       var index = node.members.indexOf(entity);
       var previous = index > 0 ? node.members[index - 1] : null;
-      if (previous is MethodDeclaration && isEmptyBody(previous.body)) {
+      if (previous is MethodDeclaration && previous.body.isEmpty) {
         _addSuggestion(Keyword.ASYNC);
         _addSuggestion2(ASYNC_STAR);
         _addSuggestion2(SYNC_STAR);
@@ -772,10 +769,10 @@
       Keyword.NULL,
       Keyword.TRUE,
     ]);
-    if (_inClassMemberBody(node)) {
+    if (node.inClassMemberBody) {
       _addSuggestions([Keyword.SUPER, Keyword.THIS]);
     }
-    if (_inAsyncMethodOrFunction(node)) {
+    if (node.inAsyncMethodOrFunction) {
       _addSuggestion(Keyword.AWAIT);
     }
   }
@@ -836,20 +833,20 @@
   }
 
   void _addStatementKeywords(AstNode node) {
-    if (_inClassMemberBody(node)) {
+    if (node.inClassMemberBody) {
       _addSuggestions([Keyword.SUPER, Keyword.THIS]);
     }
-    if (_inAsyncMethodOrFunction(node)) {
+    if (node.inAsyncMethodOrFunction) {
       _addSuggestion(Keyword.AWAIT);
-    } else if (_inAsyncStarOrSyncStarMethodOrFunction(node)) {
+    } else if (node.inAsyncStarOrSyncStarMethodOrFunction) {
       _addSuggestion(Keyword.AWAIT);
       _addSuggestion(Keyword.YIELD);
       _addSuggestion2(YIELD_STAR);
     }
-    if (_inLoop(node)) {
+    if (node.inLoop) {
       _addSuggestions([Keyword.BREAK, Keyword.CONTINUE]);
     }
-    if (_inSwitch(node)) {
+    if (node.inSwitch) {
       _addSuggestions([Keyword.BREAK]);
     }
     if (_isEntityAfterIfWithoutElse(node)) {
@@ -892,48 +889,6 @@
     });
   }
 
-  bool _inAsyncMethodOrFunction(AstNode node) {
-    var body = node.thisOrAncestorOfType<FunctionBody>();
-    return body != null && body.isAsynchronous && body.star == null;
-  }
-
-  bool _inAsyncStarOrSyncStarMethodOrFunction(AstNode node) {
-    var body = node.thisOrAncestorOfType<FunctionBody>();
-    return body != null && body.keyword != null && body.star != null;
-  }
-
-  bool _inCatchClause(Block node) =>
-      node.thisOrAncestorOfType<CatchClause>() != null;
-
-  bool _inClassMemberBody(AstNode node) {
-    while (true) {
-      var body = node.thisOrAncestorOfType<FunctionBody>();
-      if (body == null) {
-        return false;
-      }
-      var parent = body.parent;
-      if (parent is ConstructorDeclaration || parent is MethodDeclaration) {
-        return true;
-      }
-      node = parent;
-    }
-  }
-
-  bool _inDoLoop(AstNode node) =>
-      node.thisOrAncestorOfType<DoStatement>() != null;
-
-  bool _inForLoop(AstNode node) =>
-      node.thisOrAncestorMatching((p) => p is ForStatement) != null;
-
-  bool _inLoop(AstNode node) =>
-      _inDoLoop(node) || _inForLoop(node) || _inWhileLoop(node);
-
-  bool _inSwitch(AstNode node) =>
-      node.thisOrAncestorOfType<SwitchStatement>() != null;
-
-  bool _inWhileLoop(AstNode node) =>
-      node.thisOrAncestorOfType<WhileStatement>() != null;
-
   bool _isEntityAfterIfWithoutElse(AstNode node) {
     var block = node?.thisOrAncestorOfType<Block>();
     if (block == null) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
index 24e45fc..f011a42 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
@@ -31,7 +31,7 @@
         if (containingLibrary != null) {
           var imports = containingLibrary.imports;
           if (imports != null) {
-            return _buildSuggestions(request, elem, imports);
+            return _buildSuggestions(request, builder, elem, imports);
           }
         }
       }
@@ -39,35 +39,50 @@
     return const <CompletionSuggestion>[];
   }
 
-  List<CompletionSuggestion> _buildSuggestions(DartCompletionRequest request,
-      PrefixElement elem, List<ImportElement> imports) {
+  List<CompletionSuggestion> _buildSuggestions(
+      DartCompletionRequest request,
+      SuggestionBuilder builder,
+      PrefixElement elem,
+      List<ImportElement> imports) {
     var parent = request.target.containingNode.parent;
-    var isConstructor = parent.parent is ConstructorName;
     var typesOnly = parent is TypeName;
-    var instCreation = typesOnly && isConstructor;
-    var builder = LibraryElementSuggestionBuilder(
-        request, CompletionSuggestionKind.INVOCATION, typesOnly, instCreation);
+    var isConstructor = parent.parent is ConstructorName;
     for (var importElem in imports) {
       if (importElem.prefix?.name == elem.name) {
         var library = importElem.importedLibrary;
         if (library != null) {
-          // Suggest elements from the imported library.
           for (var element in importElem.namespace.definedNames.values) {
-            element.accept(builder);
+            if (typesOnly && isConstructor) {
+              // Suggest constructors from the imported libraries.
+              if (element is ClassElement) {
+                for (var constructor in element.constructors) {
+                  if (!constructor.isPrivate) {
+                    builder.suggestConstructor(constructor,
+                        kind: CompletionSuggestionKind.INVOCATION);
+                  }
+                }
+              }
+            } else {
+              if (element is ClassElement ||
+                  element is ExtensionElement ||
+                  element is FunctionTypeAliasElement) {
+                builder.suggestElement(element,
+                    kind: CompletionSuggestionKind.INVOCATION);
+              } else if (!typesOnly &&
+                  (element is FunctionElement ||
+                      element is PropertyAccessorElement)) {
+                builder.suggestElement(element,
+                    kind: CompletionSuggestionKind.INVOCATION);
+              }
+            }
           }
-          // If the import is 'deferred' then suggest 'loadLibrary'.
-          if (importElem.isDeferred) {
-            var function = library.loadLibraryFunction;
-            var useNewRelevance = request.useNewRelevance;
-            var relevance = useNewRelevance
-                ? Relevance.loadLibrary
-                : DART_RELEVANCE_DEFAULT;
-            builder.suggestions.add(createSuggestion(request, function,
-                relevance: relevance, useNewRelevance: useNewRelevance));
+          // If the import is `deferred` then suggest `loadLibrary`.
+          if (!typesOnly && importElem.isDeferred) {
+            builder.suggestLoadLibraryFunction(library.loadLibraryFunction);
           }
         }
       }
     }
-    return builder.suggestions;
+    return const <CompletionSuggestion>[];
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
index c837cb4..c9e4d19 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
@@ -36,13 +36,15 @@
       if (completion != null && completion.isNotEmpty) {
         var libraryElement = element.importedLibrary;
         if (libraryElement != null) {
-          var relevance =
-              useNewRelevance ? Relevance.prefix : DART_RELEVANCE_DEFAULT;
+          var relevance = useNewRelevance
+              ? Relevance.prefix
+              : (libraryElement.hasDeprecated
+                  ? DART_RELEVANCE_LOW
+                  : DART_RELEVANCE_DEFAULT);
           var suggestion = createSuggestion(request, libraryElement,
               completion: completion,
               kind: CompletionSuggestionKind.IDENTIFIER,
-              relevance: relevance,
-              useNewRelevance: useNewRelevance);
+              relevance: relevance);
           if (suggestion != null) {
             suggestions.add(suggestion);
           }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
index 81d91a5..007b8df 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
@@ -136,11 +136,12 @@
       if (name != null && name.isNotEmpty) {
         completion = '$completion.$name';
       }
+      if (!useNewRelevance && element.hasDeprecated) {
+        relevance = DART_RELEVANCE_LOW;
+      }
 
       var suggestion = createSuggestion(request, element,
-          completion: completion,
-          relevance: relevance,
-          useNewRelevance: useNewRelevance);
+          completion: completion, relevance: relevance);
       if (suggestion != null) {
         suggestions.add(suggestion);
       }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index 2f2f80c..8f8e024 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -54,39 +54,39 @@
   void visitClassElement(ClassElement element) {
     if (optype.includeTypeNameSuggestions) {
       // if includeTypeNameSuggestions, then use the filter
-      var useNewRelevance = request.useNewRelevance;
       int relevance;
-      if (useNewRelevance) {
+      if (request.useNewRelevance) {
         relevance = _relevanceForType(element.thisType);
+      } else if (element.hasDeprecated) {
+        relevance = DART_RELEVANCE_LOW;
       } else {
         relevance = optype.typeNameSuggestionsFilter(
             _instantiateClassElement(element), DART_RELEVANCE_DEFAULT);
       }
       if (relevance != null) {
-        addSuggestion(element,
-            prefix: prefix,
-            relevance: relevance,
-            useNewRelevance: useNewRelevance);
+        addSuggestion(element, prefix: prefix, relevance: relevance);
       }
     }
     if (optype.includeConstructorSuggestions) {
-      var useNewRelevance = request.useNewRelevance;
       int relevance;
-      if (useNewRelevance) {
+      if (request.useNewRelevance) {
         relevance = _relevanceForType(element.thisType);
+      } else if (element.hasDeprecated) {
+        relevance = DART_RELEVANCE_LOW;
       } else {
         relevance = optype.returnValueSuggestionsFilter(
             _instantiateClassElement(element), DART_RELEVANCE_DEFAULT);
       }
-      _addConstructorSuggestions(element, relevance, useNewRelevance);
+      _addConstructorSuggestions(element, relevance);
     }
     if (optype.includeReturnValueSuggestions) {
       if (element.isEnum) {
         var enumName = element.displayName;
-        var useNewRelevance = request.useNewRelevance;
         int relevance;
-        if (useNewRelevance) {
+        if (request.useNewRelevance) {
           relevance = _relevanceForType(element.thisType);
+        } else if (element.hasDeprecated) {
+          relevance = DART_RELEVANCE_LOW;
         } else {
           relevance = optype.returnValueSuggestionsFilter(
               _instantiateClassElement(element), DART_RELEVANCE_DEFAULT);
@@ -96,8 +96,7 @@
             addSuggestion(field,
                 prefix: prefix,
                 relevance: relevance,
-                elementCompletion: '$enumName.${field.name}',
-                useNewRelevance: useNewRelevance);
+                elementCompletion: '$enumName.${field.name}');
           }
         }
       }
@@ -117,17 +116,14 @@
   @override
   void visitExtensionElement(ExtensionElement element) {
     if (optype.includeReturnValueSuggestions) {
-      var useNewRelevance = request.useNewRelevance;
       int relevance;
-      if (useNewRelevance) {
+      if (request.useNewRelevance) {
         relevance = _relevanceForType(element.extendedType);
       } else {
-        relevance = DART_RELEVANCE_DEFAULT;
+        relevance =
+            element.hasDeprecated ? DART_RELEVANCE_LOW : DART_RELEVANCE_DEFAULT;
       }
-      addSuggestion(element,
-          prefix: prefix,
-          relevance: relevance,
-          useNewRelevance: useNewRelevance);
+      addSuggestion(element, prefix: prefix, relevance: relevance);
     }
     element.visitChildren(this);
   }
@@ -142,28 +138,23 @@
       return;
     }
     var returnType = element.returnType;
-    var useNewRelevance = request.useNewRelevance;
     int relevance;
-    if (useNewRelevance) {
+    if (request.useNewRelevance) {
       relevance = _relevanceForType(returnType);
     } else {
-      relevance = element.library == containingLibrary
-          ? DART_RELEVANCE_LOCAL_FUNCTION
-          : DART_RELEVANCE_DEFAULT;
+      relevance = element.hasDeprecated
+          ? DART_RELEVANCE_LOW
+          : (element.library == containingLibrary
+              ? DART_RELEVANCE_LOCAL_FUNCTION
+              : DART_RELEVANCE_DEFAULT);
     }
     if (returnType != null && returnType.isVoid) {
       if (optype.includeVoidReturnSuggestions) {
-        addSuggestion(element,
-            prefix: prefix,
-            relevance: relevance,
-            useNewRelevance: useNewRelevance);
+        addSuggestion(element, prefix: prefix, relevance: relevance);
       }
     } else {
       if (optype.includeReturnValueSuggestions) {
-        addSuggestion(element,
-            prefix: prefix,
-            relevance: relevance,
-            useNewRelevance: useNewRelevance);
+        addSuggestion(element, prefix: prefix, relevance: relevance);
       }
     }
   }
@@ -171,21 +162,19 @@
   @override
   void visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
     if (optype.includeTypeNameSuggestions) {
-      var useNewRelevance = request.useNewRelevance;
       int relevance;
-      if (useNewRelevance) {
+      if (request.useNewRelevance) {
         // TODO(brianwilkerson) Figure out whether there are any features that
         //  ought to be used here and what the right default value is.
         relevance = 400;
       } else {
-        relevance = element.library == containingLibrary
-            ? DART_RELEVANCE_LOCAL_FUNCTION
-            : DART_RELEVANCE_DEFAULT;
+        relevance = element.hasDeprecated
+            ? DART_RELEVANCE_LOW
+            : (element.library == containingLibrary
+                ? DART_RELEVANCE_LOCAL_FUNCTION
+                : DART_RELEVANCE_DEFAULT);
       }
-      addSuggestion(element,
-          prefix: prefix,
-          relevance: relevance,
-          useNewRelevance: useNewRelevance);
+      addSuggestion(element, prefix: prefix, relevance: relevance);
     }
   }
 
@@ -199,10 +188,11 @@
   @override
   void visitPropertyAccessorElement(PropertyAccessorElement element) {
     if (optype.includeReturnValueSuggestions) {
-      var useNewRelevance = request.useNewRelevance;
       int relevance;
-      if (useNewRelevance) {
+      if (request.useNewRelevance) {
         relevance = _relevanceForType(element.returnType);
+      } else if (element.hasDeprecated) {
+        relevance = DART_RELEVANCE_LOW;
       } else {
         if (element.library == containingLibrary) {
           if (element.enclosingElement is ClassElement) {
@@ -214,35 +204,29 @@
           relevance = DART_RELEVANCE_DEFAULT;
         }
       }
-      addSuggestion(element,
-          prefix: prefix,
-          relevance: relevance,
-          useNewRelevance: useNewRelevance);
+      addSuggestion(element, prefix: prefix, relevance: relevance);
     }
   }
 
   @override
   void visitTopLevelVariableElement(TopLevelVariableElement element) {
     if (optype.includeReturnValueSuggestions) {
-      var useNewRelevance = request.useNewRelevance;
       int relevance;
-      if (useNewRelevance) {
+      if (request.useNewRelevance) {
         relevance = _relevanceForType(element.type);
       } else {
-        relevance = element.library == containingLibrary
-            ? DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE
-            : DART_RELEVANCE_DEFAULT;
+        relevance = element.hasDeprecated
+            ? DART_RELEVANCE_LOW
+            : (element.library == containingLibrary
+                ? DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE
+                : DART_RELEVANCE_DEFAULT);
       }
-      addSuggestion(element,
-          prefix: prefix,
-          relevance: relevance,
-          useNewRelevance: useNewRelevance);
+      addSuggestion(element, prefix: prefix, relevance: relevance);
     }
   }
 
   /// Add constructor suggestions for the given class.
-  void _addConstructorSuggestions(
-      ClassElement classElem, int relevance, bool useNewRelevance) {
+  void _addConstructorSuggestions(ClassElement classElem, int relevance) {
     var className = classElem.name;
     for (var constructor in classElem.constructors) {
       if (constructor.isPrivate) {
@@ -252,15 +236,14 @@
         continue;
       }
 
+      var completion = constructor.displayName;
+      completion = completion.isNotEmpty ? '$className.$completion' : className;
+      if (prefix != null && prefix.isNotEmpty) {
+        completion = '$prefix.$completion';
+      }
       var suggestion = createSuggestion(request, constructor,
-          relevance: relevance, useNewRelevance: useNewRelevance);
+          completion: completion, relevance: relevance);
       if (suggestion != null) {
-        var name = suggestion.completion;
-        name = name.isNotEmpty ? '$className.$name' : className;
-        if (prefix != null && prefix.isNotEmpty) {
-          name = '$prefix.$name';
-        }
-        suggestion.completion = name;
         suggestion.selectionOffset = suggestion.completion.length;
         suggestions.add(suggestion);
       }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
index 3472d5d..04b783e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
@@ -32,8 +32,7 @@
         if (type != null) {
           var element = type.element;
           if (element is ClassElement) {
-            return _buildSuggestions(
-                request, libraryElement, element, request.useNewRelevance);
+            return _buildSuggestions(request, libraryElement, element);
           }
         }
       }
@@ -42,20 +41,20 @@
   }
 
   List<CompletionSuggestion> _buildSuggestions(DartCompletionRequest request,
-      LibraryElement libElem, ClassElement classElem, bool useNewRelevance) {
+      LibraryElement libElem, ClassElement classElem) {
     var isLocalClassDecl = classElem.library == libElem;
     var suggestions = <CompletionSuggestion>[];
     for (var constructor in classElem.constructors) {
       if (isLocalClassDecl || !constructor.isPrivate) {
         var name = constructor.name;
         if (name != null) {
-          var relevance = useNewRelevance
+          var relevance = request.useNewRelevance
               ? Relevance.namedConstructor
-              : DART_RELEVANCE_DEFAULT;
+              : (constructor.hasDeprecated
+                  ? DART_RELEVANCE_LOW
+                  : DART_RELEVANCE_DEFAULT);
           var suggestion = createSuggestion(request, constructor,
-              completion: name,
-              relevance: relevance,
-              useNewRelevance: useNewRelevance);
+              completion: name, relevance: relevance);
           if (suggestion != null) {
             suggestions.add(suggestion);
           }
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 28c0d6f..b6760de 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
@@ -10,11 +10,13 @@
     hide 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/utilities/extensions/ast.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
@@ -26,14 +28,24 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request, SuggestionBuilder builder) async {
-    var targetId = _getTargetId(request.target);
-    if (targetId == null) {
-      return const <CompletionSuggestion>[];
-    }
-    var classDecl = targetId.thisOrAncestorOfType<ClassOrMixinDeclaration>();
+    var target = request.target;
+    var containingNode = target.containingNode;
+    var classDecl =
+        containingNode.thisOrAncestorOfType<ClassOrMixinDeclaration>();
     if (classDecl == null) {
       return const <CompletionSuggestion>[];
     }
+    if (containingNode.inClassMemberBody) {
+      return const <CompletionSuggestion>[];
+    }
+
+    var comment = containingNode.thisOrAncestorOfType<Comment>();
+    if (target.isCommentText || comment != null) {
+      return const <CompletionSuggestion>[];
+    }
+
+    var sourceRange = _getTargetSourceRange(target);
+    sourceRange ??= range.startOffsetEndOffset(request.offset, 0);
 
     var inheritance = InheritanceManager3();
 
@@ -53,7 +65,7 @@
       if (element.returnType != null) {
         var invokeSuper = interface.isSuperImplemented(name);
         var suggestion =
-            await _buildSuggestion(request, targetId, element, invokeSuper);
+            await _buildSuggestion(request, sourceRange, element, invokeSuper);
         if (suggestion != null) {
           suggestions.add(suggestion);
         }
@@ -62,17 +74,17 @@
     return suggestions;
   }
 
-  /// Build a suggestion to replace [targetId] in the given [request] with an
+  /// Build a suggestion to replace [sourceRange] in the given [request] with an
   /// override of the given [element].
   Future<CompletionSuggestion> _buildSuggestion(
       DartCompletionRequest request,
-      SimpleIdentifier targetId,
+      SourceRange sourceRange,
       ExecutableElement element,
       bool invokeSuper) async {
     var displayTextBuffer = StringBuffer();
     var builder = DartChangeBuilder(request.result.session);
     await builder.addFileEdit(request.result.path, (builder) {
-      builder.addReplacement(range.node(targetId), (builder) {
+      builder.addReplacement(sourceRange, (builder) {
         builder.writeOverride(
           element,
           displayTextBuffer: displayTextBuffer,
@@ -102,7 +114,7 @@
     if (selectionRange == null) {
       return null;
     }
-    var offsetDelta = targetId.offset + replacement.indexOf(completion);
+    var offsetDelta = sourceRange.offset + replacement.indexOf(completion);
     var displayText =
         displayTextBuffer.isNotEmpty ? displayTextBuffer.toString() : null;
     var suggestion = CompletionSuggestion(
@@ -118,24 +130,6 @@
     return suggestion;
   }
 
-  /// If the target looks like a partial identifier inside a class declaration
-  /// then return that identifier, otherwise return `null`.
-  SimpleIdentifier _getTargetId(CompletionTarget target) {
-    var node = target.containingNode;
-    if (node is ClassOrMixinDeclaration) {
-      var entity = target.entity;
-      if (entity is FieldDeclaration) {
-        return _getTargetIdFromVarList(entity.fields);
-      }
-    } else if (node is FieldDeclaration) {
-      var entity = target.entity;
-      if (entity is VariableDeclarationList) {
-        return _getTargetIdFromVarList(entity);
-      }
-    }
-    return null;
-  }
-
   SimpleIdentifier _getTargetIdFromVarList(VariableDeclarationList fields) {
     var variables = fields.variables;
     if (variables.length == 1) {
@@ -157,6 +151,29 @@
     return null;
   }
 
+  /// If the target looks like a partial identifier inside a class declaration
+  /// then return that identifier [SourceRange], otherwise return `null`.
+  SourceRange _getTargetSourceRange(CompletionTarget target) {
+    var containingNode = target.containingNode;
+    if (containingNode is ClassOrMixinDeclaration) {
+      if (target.entity is FieldDeclaration) {
+        var fieldDecl = target.entity as FieldDeclaration;
+        var simpleIdentifier = _getTargetIdFromVarList(fieldDecl.fields);
+        if (simpleIdentifier != null) {
+          return range.node(simpleIdentifier);
+        }
+      }
+    } else if (containingNode is FieldDeclaration) {
+      if (target.entity is VariableDeclarationList) {
+        var simpleIdentifier = _getTargetIdFromVarList(target.entity);
+        if (simpleIdentifier != null) {
+          return range.node(simpleIdentifier);
+        }
+      }
+    }
+    return null;
+  }
+
   /// Return `true` if the given [node] has an `override` annotation.
   bool _hasOverride(AstNode node) {
     if (node is AnnotatedNode) {
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 9f9f584..b970dab 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
@@ -107,9 +107,8 @@
     if (completion == null || completion.isEmpty) {
       return;
     }
-    var relevance = DART_RELEVANCE_DEFAULT;
-    var useNewRelevance = request.useNewRelevance;
-    if (useNewRelevance) {
+    var relevance;
+    if (request.useNewRelevance) {
       var contextType = request.featureComputer
           .contextTypeFeature(request.contextType, elementType);
       var elementKind = request.featureComputer
@@ -119,11 +118,12 @@
           contextType: contextType,
           elementKind: elementKind,
           hasDeprecated: hasDeprecated);
+    } else {
+      relevance =
+          element.hasDeprecated ? DART_RELEVANCE_LOW : DART_RELEVANCE_DEFAULT;
     }
     var suggestion = createSuggestion(request, element,
-        completion: completion,
-        relevance: relevance,
-        useNewRelevance: useNewRelevance);
+        completion: completion, relevance: relevance);
     if (suggestion != null) {
       suggestions.add(suggestion);
     }
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 bdf356d..43ae5ba 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
@@ -13,19 +13,20 @@
 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/analysis/features.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/visitor.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/util/comment.dart';
 import 'package:meta/meta.dart';
 
-/// Return a suggestion based upon the given element or `null` if a suggestion
+/// Return a suggestion based on the given [element], or `null` if a suggestion
 /// is not appropriate for the given element.
 CompletionSuggestion createSuggestion(
     DartCompletionRequest request, Element element,
     {String completion,
     CompletionSuggestionKind kind,
-    int relevance = DART_RELEVANCE_DEFAULT,
-    bool useNewRelevance = false}) {
+    int relevance = DART_RELEVANCE_DEFAULT}) {
   if (element == null) {
     return null;
   }
@@ -34,13 +35,12 @@
     return null;
   }
   completion ??= element.displayName;
-  kind ??= CompletionSuggestionKind.INVOCATION;
-  var isDeprecated = element.hasDeprecated;
-  if (!useNewRelevance && isDeprecated) {
-    relevance = DART_RELEVANCE_LOW;
+  if (completion == null || completion.isEmpty) {
+    return null;
   }
-  var suggestion = CompletionSuggestion(
-      kind, relevance, completion, completion.length, 0, isDeprecated, false);
+  kind ??= CompletionSuggestionKind.INVOCATION;
+  var suggestion = CompletionSuggestion(kind, relevance, completion,
+      completion.length, 0, element.hasDeprecated, false);
 
   // Attach docs.
   var doc = DartUnitHoverComputer.computeDocumentation(
@@ -108,7 +108,6 @@
   CompletionSuggestion addSuggestion(Element element,
       {String prefix,
       int relevance = DART_RELEVANCE_DEFAULT,
-      bool useNewRelevance = false,
       String elementCompletion}) {
     if (element.isPrivate) {
       if (element.library != containingLibrary) {
@@ -127,10 +126,7 @@
       return null;
     }
     var suggestion = createSuggestion(request, element,
-        completion: completion,
-        kind: kind,
-        relevance: relevance,
-        useNewRelevance: useNewRelevance);
+        completion: completion, kind: kind, relevance: relevance);
     if (suggestion != null) {
       if (element.isSynthetic && element is PropertyAccessorElement) {
         String cacheKey;
@@ -173,121 +169,6 @@
   }
 }
 
-/// This class creates suggestions based on top-level elements.
-class LibraryElementSuggestionBuilder extends SimpleElementVisitor<void>
-    with ElementSuggestionBuilder {
-  @override
-  final DartCompletionRequest request;
-
-  @override
-  final CompletionSuggestionKind kind;
-
-  final bool typesOnly;
-
-  final bool instCreation;
-
-  /// Return `true` if the new relevance scores should be produced.
-  final bool useNewRelevance;
-
-  LibraryElementSuggestionBuilder(
-      this.request, this.kind, this.typesOnly, this.instCreation)
-      : useNewRelevance = request.useNewRelevance;
-
-  @override
-  LibraryElement get containingLibrary => request.libraryElement;
-
-  @override
-  void visitClassElement(ClassElement element) {
-    if (instCreation) {
-      element.visitChildren(this);
-    } else {
-      // TODO(brianwilkerson) Determine whether this should be based on features
-      //  (such as the kind of the element) or a constant.
-      var relevance = useNewRelevance ? 750 : DART_RELEVANCE_DEFAULT;
-      addSuggestion(element,
-          relevance: relevance, useNewRelevance: useNewRelevance);
-    }
-  }
-
-  @override
-  void visitConstructorElement(ConstructorElement element) {
-    if (instCreation) {
-      var classElem = element.enclosingElement;
-      if (classElem != null) {
-        var prefix = classElem.name;
-        if (prefix != null && prefix.isNotEmpty) {
-          // TODO(brianwilkerson) Determine whether this should be based on features
-          //  (such as the kind of the element) or a constant.
-          var relevance = useNewRelevance ? 750 : DART_RELEVANCE_DEFAULT;
-          addSuggestion(element,
-              prefix: prefix,
-              relevance: relevance,
-              useNewRelevance: useNewRelevance);
-        }
-      }
-    }
-  }
-
-  @override
-  void visitExtensionElement(ExtensionElement element) {
-    if (!instCreation) {
-      // TODO(brianwilkerson) Determine whether this should be based on features
-      //  (such as the kind of the element) or a constant.
-      var relevance = useNewRelevance ? 750 : DART_RELEVANCE_DEFAULT;
-      addSuggestion(element,
-          relevance: relevance, useNewRelevance: useNewRelevance);
-    }
-  }
-
-  @override
-  void visitFunctionElement(FunctionElement element) {
-    if (!typesOnly) {
-      int relevance;
-      if (useNewRelevance) {
-        // TODO(brianwilkerson) Determine whether this should be based on
-        //  features (such as the kind of the element) or a constant.
-        relevance = element.library == containingLibrary ? 800 : 750;
-      } else {
-        relevance = element.library == containingLibrary
-            ? DART_RELEVANCE_LOCAL_FUNCTION
-            : DART_RELEVANCE_DEFAULT;
-      }
-      addSuggestion(element,
-          relevance: relevance, useNewRelevance: useNewRelevance);
-    }
-  }
-
-  @override
-  void visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
-    if (!instCreation) {
-      // TODO(brianwilkerson) Determine whether this should be based on features
-      //  (such as the kind of the element) or a constant.
-      var relevance = useNewRelevance ? 750 : DART_RELEVANCE_DEFAULT;
-      addSuggestion(element,
-          relevance: relevance, useNewRelevance: useNewRelevance);
-    }
-  }
-
-  @override
-  void visitPropertyAccessorElement(PropertyAccessorElement element) {
-    if (!typesOnly) {
-      var variable = element.variable;
-      int relevance;
-      if (useNewRelevance) {
-        // TODO(brianwilkerson) Determine whether this should be based on
-        //  features (such as the kind of the element) or a constant.
-        relevance = variable.library == containingLibrary ? 800 : 750;
-      } else {
-        relevance = variable.library == containingLibrary
-            ? DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE
-            : DART_RELEVANCE_DEFAULT;
-      }
-      addSuggestion(variable,
-          relevance: relevance, useNewRelevance: useNewRelevance);
-    }
-  }
-}
-
 /// This class provides suggestions based upon the visible instance members in
 /// an interface type.
 class MemberSuggestionBuilder {
@@ -310,6 +191,9 @@
   /// The request for which suggestions are being built.
   final DartCompletionRequest request;
 
+  /// The builder used to build the suggestions.
+  final SuggestionBuilder builder;
+
   /// Map indicating, for each possible completion identifier, whether we have
   /// already generated completions for a getter, setter, or both.  The "both"
   /// case also handles the case where have generated a completion for a method
@@ -323,7 +207,7 @@
   final Map<String, CompletionSuggestion> _suggestionMap =
       <String, CompletionSuggestion>{};
 
-  MemberSuggestionBuilder(this.request);
+  MemberSuggestionBuilder(this.request, this.builder);
 
   Iterable<CompletionSuggestion> get suggestions => _suggestionMap.values;
 
@@ -361,8 +245,7 @@
       if (accessor.isGetter) {
         var variable = accessor.variable;
         int relevance;
-        var useNewRelevance = request.useNewRelevance;
-        if (useNewRelevance) {
+        if (request.useNewRelevance) {
           var featureComputer = request.featureComputer;
           var contextType = featureComputer.contextTypeFeature(
               request.contextType, variable.type);
@@ -380,14 +263,13 @@
         } else {
           relevance = oldRelevance();
         }
-        return _addSuggestion(variable, relevance, useNewRelevance);
+        return _addSuggestion(variable, relevance);
       }
     } else {
       var type =
           accessor.isGetter ? accessor.returnType : accessor.parameters[0].type;
       int relevance;
-      var useNewRelevance = request.useNewRelevance;
-      if (useNewRelevance) {
+      if (request.useNewRelevance) {
         var featureComputer = request.featureComputer;
         var contextType =
             featureComputer.contextTypeFeature(request.contextType, type);
@@ -405,7 +287,7 @@
       } else {
         relevance = oldRelevance();
       }
-      return _addSuggestion(accessor, relevance, useNewRelevance);
+      return _addSuggestion(accessor, relevance);
     }
     return null;
   }
@@ -438,8 +320,7 @@
       return null;
     }
     int relevance;
-    var useNewRelevance = request.useNewRelevance;
-    if (useNewRelevance) {
+    if (request.useNewRelevance) {
       var featureComputer = request.featureComputer;
       var contextType = featureComputer.contextTypeFeature(
           request.contextType, method.returnType);
@@ -457,13 +338,12 @@
     } else {
       relevance = oldRelevance();
     }
-    return _addSuggestion(method, relevance, useNewRelevance, kind: kind);
+    return _addSuggestion(method, relevance, 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,
+  CompletionSuggestion _addSuggestion(Element element, int relevance,
       {CompletionSuggestionKind kind}) {
     var identifier = element.displayName;
 
@@ -503,8 +383,8 @@
       assert(false);
       return null;
     }
-    var suggestion = createSuggestion(request, element,
-        kind: kind, relevance: relevance, useNewRelevance: useNewRelevance);
+    var suggestion =
+        createSuggestion(request, element, kind: kind, relevance: relevance);
     if (suggestion != null) {
       addCompletionSuggestion(suggestion);
     }
@@ -553,7 +433,264 @@
   /// A collection of completion suggestions.
   final List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
 
+  /// A flag indicating whether the [_cachedContextType] has been computed.
+  bool _hasContextType = false;
+
+  /// The context type associated with the completion location, or `null` if
+  /// either the location does not have a context type, or if the context type
+  /// has not yet been computed. In the latter case, [_hasContextType] will be
+  /// `false`.
+  DartType _cachedContextType;
+
   /// Initialize a newly created suggestion builder to build suggestions for the
   /// given [request].
   SuggestionBuilder(this.request);
+
+  DartType get _contextType {
+    if (!_hasContextType) {
+      _hasContextType = true;
+      _cachedContextType = request.featureComputer
+          .computeContextType(request.target.containingNode);
+    }
+    return _cachedContextType;
+  }
+
+  /// Add a suggestion for the [classElement].
+  void suggestClass(ClassElement classElement,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
+    int relevance;
+    if (request.useNewRelevance) {
+      relevance = _computeTopLevelRelevance(classElement,
+          elementType: _instantiateClassElement(classElement));
+    } else if (classElement.hasDeprecated) {
+      relevance = DART_RELEVANCE_LOW;
+    } else {
+      relevance = request.opType.typeNameSuggestionsFilter(
+          _instantiateClassElement(classElement), DART_RELEVANCE_DEFAULT);
+    }
+
+    suggestions.add(createSuggestion(request, classElement,
+        kind: kind, relevance: relevance));
+  }
+
+  /// Add a suggestion for the [constructor]. If a [kind] is provided
+  /// it will be used as the kind for the suggestion.
+  void suggestConstructor(ConstructorElement constructor,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
+    var classElement = constructor.enclosingElement;
+    if (classElement == null) {
+      return;
+    }
+    var prefix = classElement.name;
+    // TODO(brianwilkerson) It shouldn't be necessary to test for an empty
+    //  prefix.
+    if (prefix == null || prefix.isEmpty) {
+      return;
+    }
+
+    var completion = constructor.displayName;
+    if (prefix != null && prefix.isNotEmpty) {
+      if (completion == null || completion.isEmpty) {
+        completion = prefix;
+      } else {
+        completion = '$prefix.$completion';
+      }
+    }
+    if (completion == null || completion.isEmpty) {
+      return null;
+    }
+
+    int relevance;
+    if (request.useNewRelevance) {
+      relevance = _computeTopLevelRelevance(constructor);
+    } else {
+      relevance = constructor.hasDeprecated
+          ? DART_RELEVANCE_LOW
+          : DART_RELEVANCE_DEFAULT;
+    }
+
+    suggestions.add(createSuggestion(request, constructor,
+        completion: completion, kind: kind, relevance: relevance));
+  }
+
+  /// Add a suggestion for the [element].
+  void suggestElement(Element element,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
+    if (element is ClassElement) {
+      suggestClass(element, kind: kind);
+    } else if (element is ConstructorElement) {
+      suggestConstructor(element, kind: kind);
+    } else if (element is ExtensionElement) {
+      suggestExtension(element, kind: kind);
+    } else if (element is FunctionElement &&
+        element.enclosingElement is CompilationUnitElement) {
+      suggestTopLevelFunction(element, kind: kind);
+    } else if (element is FunctionTypeAliasElement) {
+      suggestFunctionTypeAlias(element, kind: kind);
+    } else if (element is PropertyAccessorElement &&
+        element.enclosingElement is CompilationUnitElement) {
+      suggestTopLevelPropertyAccessor(element, kind: kind);
+    } else {
+      throw ArgumentError('Cannot suggest a ${element.runtimeType}');
+    }
+  }
+
+  /// Add a suggestion for the [extension].
+  void suggestExtension(ExtensionElement extension,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
+    int relevance;
+    if (request.useNewRelevance) {
+      relevance = _computeTopLevelRelevance(extension,
+          elementType: extension.extendedType);
+    } else {
+      relevance =
+          extension.hasDeprecated ? DART_RELEVANCE_LOW : DART_RELEVANCE_DEFAULT;
+    }
+
+    suggestions.add(
+        createSuggestion(request, extension, kind: kind, relevance: relevance));
+  }
+
+  /// Add a suggestion for the `call` method defined on functions.
+  void suggestFunctionCall() {
+    const callString = 'call()';
+    final element = protocol.Element(
+        protocol.ElementKind.METHOD, callString, protocol.Element.makeFlags(),
+        location: null,
+        typeParameters: null,
+        parameters: null,
+        returnType: 'void');
+    suggestions.add(CompletionSuggestion(
+      CompletionSuggestionKind.INVOCATION,
+      request.useNewRelevance ? Relevance.callFunction : DART_RELEVANCE_HIGH,
+      callString,
+      callString.length,
+      0,
+      false,
+      false,
+      displayText: callString,
+      element: element,
+      returnType: 'void',
+    ));
+  }
+
+  /// Add a suggestion for the [functionTypeAlias].
+  void suggestFunctionTypeAlias(FunctionTypeAliasElement functionTypeAlias,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
+    int relevance;
+    if (request.useNewRelevance) {
+      relevance =
+          _computeTopLevelRelevance(functionTypeAlias, defaultRelevance: 750);
+    } else {
+      relevance = functionTypeAlias.hasDeprecated
+          ? DART_RELEVANCE_LOW
+          : (functionTypeAlias.library == request.libraryElement
+              ? DART_RELEVANCE_LOCAL_FUNCTION
+              : DART_RELEVANCE_DEFAULT);
+    }
+    suggestions.add(createSuggestion(request, functionTypeAlias,
+        kind: kind, relevance: relevance));
+  }
+
+  /// Add a suggestion for the `loadLibrary` [function] associated with a
+  /// prefix.
+  void suggestLoadLibraryFunction(FunctionElement function) {
+    int relevance;
+    if (request.useNewRelevance) {
+      // TODO(brianwilkerson) This might want to use the context type rather
+      //  than a fixed value.
+      relevance = Relevance.loadLibrary;
+    } else {
+      relevance =
+          function.hasDeprecated ? DART_RELEVANCE_LOW : DART_RELEVANCE_DEFAULT;
+    }
+
+    suggestions.add(createSuggestion(request, function, relevance: relevance));
+  }
+
+  /// Add a suggestion for the top-level [function].
+  void suggestTopLevelFunction(FunctionElement function,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
+    int relevance;
+    if (request.useNewRelevance) {
+      relevance =
+          _computeTopLevelRelevance(function, elementType: function.returnType);
+    } else {
+      relevance = function.hasDeprecated
+          ? DART_RELEVANCE_LOW
+          : (function.library == request.libraryElement
+              ? DART_RELEVANCE_LOCAL_FUNCTION
+              : DART_RELEVANCE_DEFAULT);
+    }
+
+    suggestions.add(
+        createSuggestion(request, function, kind: kind, relevance: relevance));
+  }
+
+  /// Add a suggestion for the top-level property [accessor].
+  void suggestTopLevelPropertyAccessor(PropertyAccessorElement accessor,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
+    if (accessor.isSetter && accessor.isSynthetic) {
+      // TODO(brianwilkerson) Only discard the setter if a suggestion is built
+      //  for the corresponding getter. Currently that's always the case.
+      //  Handling this more generally will require the ability to build
+      //  suggestions for setters and then remove them later when the
+      //  corresponding getter is found.
+      return;
+    }
+    // TODO(brianwilkerson) Should we use the variable only when the [element]
+    //  is synthetic?
+    var variable = accessor.variable;
+    int relevance;
+    if (request.useNewRelevance) {
+      relevance =
+          _computeTopLevelRelevance(variable, elementType: variable.type);
+    } else {
+      relevance = accessor.hasDeprecated
+          ? DART_RELEVANCE_LOW
+          : (variable.library == request.libraryElement
+              ? DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE
+              : DART_RELEVANCE_DEFAULT);
+    }
+
+    suggestions.add(
+        createSuggestion(request, variable, kind: kind, relevance: relevance));
+  }
+
+  /// Return the relevance score for a top-level [element].
+  int _computeTopLevelRelevance(Element element,
+      {int defaultRelevance = 800, DartType elementType}) {
+    // TODO(brianwilkerson) The old relevance computation used a signal based
+    //  on whether the element being suggested was from the same library in
+    //  which completion is being performed. Explore whether that's a useful
+    //  signal.
+    var featureComputer = request.featureComputer;
+    var contextTypeFeature =
+        featureComputer.contextTypeFeature(_contextType, elementType);
+    var elementKind = featureComputer.elementKindFeature(
+        element, request.opType.completionLocation);
+    var hasDeprecated = featureComputer.hasDeprecatedFeature(element);
+    return toRelevance(
+        weightedAverage(
+            [contextTypeFeature, elementKind, hasDeprecated], [0.8, 0.8, 0.2]),
+        defaultRelevance);
+  }
+
+  InterfaceType _instantiateClassElement(ClassElement element) {
+    var typeParameters = element.typeParameters;
+    var typeArguments = const <DartType>[];
+    if (typeParameters.isNotEmpty) {
+      var neverType = request.libraryElement.typeProvider.neverType;
+      typeArguments = List.filled(typeParameters.length, neverType);
+    }
+
+    var nullabilitySuffix = request.featureSet.isEnabled(Feature.non_nullable)
+        ? NullabilitySuffix.none
+        : NullabilitySuffix.star;
+
+    return element.instantiate(
+      typeArguments: typeArguments,
+      nullabilitySuffix: nullabilitySuffix,
+    );
+  }
 }
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 6852927..491bfac 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
@@ -6,13 +6,12 @@
 import 'dart:collection';
 
 import 'package:analysis_server/src/protocol_server.dart'
-    show CompletionSuggestion, CompletionSuggestionKind;
+    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';
 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';
 
 /// A contributor that produces suggestions based on the instance members of a
@@ -101,14 +100,12 @@
 
     // Build the suggestions.
     if (type is InterfaceType) {
-      var builder = _SuggestionBuilder(request);
-      builder.buildSuggestions(type, containingMethodName,
+      var memberBuilder = _SuggestionBuilder(request, builder);
+      memberBuilder.buildSuggestions(type, containingMethodName,
           mixins: mixins, superclassConstraints: superclassConstraints);
-      return builder.suggestions.toList();
-    }
-    if (type is FunctionType) {
-      var builder = _SuggestionBuilder(request);
-      return [builder._createFunctionCallSuggestion()];
+      return memberBuilder.suggestions.toList();
+    } else if (type is FunctionType) {
+      builder.suggestFunctionCall();
     }
 
     return const <CompletionSuggestion>[];
@@ -238,7 +235,8 @@
 /// an interface type.
 class _SuggestionBuilder extends MemberSuggestionBuilder {
   /// Initialize a newly created suggestion builder.
-  _SuggestionBuilder(DartCompletionRequest request) : super(request);
+  _SuggestionBuilder(DartCompletionRequest request, SuggestionBuilder builder)
+      : super(request, builder);
 
   /// Return completion suggestions for 'dot' completions on the given [type].
   /// If the 'dot' completion is a super expression, then [containingMethodName]
@@ -280,33 +278,11 @@
         }
       }
       if (targetType.isDartCoreFunction) {
-        addCompletionSuggestion(_createFunctionCallSuggestion());
+        builder.suggestFunctionCall();
       }
     }
   }
 
-  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
   /// possible completions for an object having type [type].
   List<InterfaceType> _getTypeOrdering(InterfaceType type) {
diff --git a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
index 95ddfce..4d2409c 100644
--- a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
@@ -67,8 +67,6 @@
 
   static Future<PostfixCompletion> expandAssert(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findAssertExpression, (expr) {
       return 'assert(${processor.utils.getNodeText(expr)});';
     }, withBraces: false);
@@ -76,16 +74,12 @@
 
   static Future<PostfixCompletion> expandElse(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => 'if (${processor.makeNegatedBoolExpr(expr)})');
   }
 
   static Future<PostfixCompletion> expandFor(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findIterableExpression, (expr) {
       var value = processor.newVariable('value');
       return 'for (var $value in ${processor.utils.getNodeText(expr)})';
@@ -94,8 +88,6 @@
 
   static Future<PostfixCompletion> expandFori(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findIntExpression, (expr) {
       var index = processor.newVariable('i');
       return 'for (int $index = 0; $index < ${processor.utils.getNodeText(expr)}; $index++)';
@@ -104,16 +96,12 @@
 
   static Future<PostfixCompletion> expandIf(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => 'if (${processor.utils.getNodeText(expr)})');
   }
 
   static Future<PostfixCompletion> expandNegate(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => processor.makeNegatedBoolExpr(expr),
         withBraces: false);
@@ -121,8 +109,6 @@
 
   static Future<PostfixCompletion> expandNotNull(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findObjectExpression, (expr) {
       return expr is NullLiteral
           ? 'if (false)'
@@ -132,8 +118,6 @@
 
   static Future<PostfixCompletion> expandNull(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findObjectExpression, (expr) {
       return expr is NullLiteral
           ? 'if (true)'
@@ -143,8 +127,6 @@
 
   static Future<PostfixCompletion> expandParen(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findObjectExpression,
         (expr) => '(${processor.utils.getNodeText(expr)})',
         withBraces: false);
@@ -152,8 +134,6 @@
 
   static Future<PostfixCompletion> expandReturn(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findObjectExpression,
         (expr) => 'return ${processor.utils.getNodeText(expr)};',
         withBraces: false);
@@ -161,30 +141,22 @@
 
   static Future<PostfixCompletion> expandSwitch(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findObjectExpression,
         (expr) => 'switch (${processor.utils.getNodeText(expr)})');
   }
 
   static Future<PostfixCompletion> expandTry(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expandTry(kind, processor.findStatement, withOn: false);
   }
 
   static Future<PostfixCompletion> expandTryon(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expandTry(kind, processor.findStatement, withOn: true);
   }
 
   static Future<PostfixCompletion> expandWhile(
       PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return processor.expand(kind, processor.findBoolExpression,
         (expr) => 'while (${processor.utils.getNodeText(expr)})');
   }
@@ -300,8 +272,6 @@
   TypeSystem get typeSystem => completionContext.resolveResult.typeSystem;
 
   Future<PostfixCompletion> compute() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     node = _selectedNode();
     if (node == null) {
       return NO_COMPLETION;
@@ -313,8 +283,6 @@
   Future<PostfixCompletion> expand(
       PostfixCompletionKind kind, Function contexter, Function sourcer,
       {bool withBraces = true}) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     AstNode expr = contexter();
     if (expr == null) {
       return null;
@@ -350,8 +318,6 @@
   Future<PostfixCompletion> expandTry(
       PostfixCompletionKind kind, Function contexter,
       {bool withOn = false}) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     AstNode stmt = contexter();
     if (stmt == null) {
       return null;
@@ -455,8 +421,6 @@
   }
 
   Future<bool> isApplicable() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     node = _selectedNode();
     if (node == null) {
       return false;
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index 9b025cd..6b19e69 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -132,8 +132,6 @@
       statementContext.resolveResult.unit.declaredElement;
 
   Future<StatementCompletion> compute() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     node = _selectedNode();
     if (node == null) {
       return NO_COMPLETION;
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 50e59d7..88f78e0 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -107,6 +107,10 @@
       'dart.assist.convert.relativeToPackageImport',
       30,
       "Convert to 'package:' import");
+  static const CONVERT_TO_RELATIVE_IMPORT = AssistKind(
+      'dart.assist.convert.packageToRelativeImport',
+      30,
+      'Convert to a relative import');
   static const CONVERT_TO_SET_LITERAL = AssistKind(
       'dart.assist.convert.toSetLiteral', 30, 'Convert to set literal',
       associatedErrorCodes: <String>['prefer_collection_literals']);
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 8478e7d..8ab9a0f 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -11,14 +11,31 @@
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/base_processor.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/dart/add_diagnostic_property_reference.dart';
 import 'package:analysis_server/src/services/correction/dart/add_return_type.dart';
+import 'package:analysis_server/src/services/correction/dart/add_type_annotation.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_add_all_to_spread.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_conditional_expression_to_if_element.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_quotes.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_expression_function_body.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_generic_function_syntax.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_int_literal.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_list_literal.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_map_literal.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_null_aware.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_package_import.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_relative_import.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_set_literal.dart';
 import 'package:analysis_server/src/services/correction/dart/exchange_operands.dart';
+import 'package:analysis_server/src/services/correction/dart/inline_invocation.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_type_annotation.dart';
+import 'package:analysis_server/src/services/correction/dart/replace_with_var.dart';
 import 'package:analysis_server/src/services/correction/dart/shadow_field.dart';
+import 'package:analysis_server/src/services/correction/dart/sort_child_property_last.dart';
 import 'package:analysis_server/src/services/correction/dart/split_and_condition.dart';
+import 'package:analysis_server/src/services/correction/dart/use_curly_braces.dart';
 import 'package:analysis_server/src/services/correction/name_suggestion.dart';
 import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
 import 'package:analysis_server/src/services/correction/statement_analyzer.dart';
@@ -33,7 +50,6 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
@@ -64,56 +80,22 @@
     if (!setupCompute()) {
       return assists;
     }
-    if (!_containsErrorCode(
-      {LintNames.always_specify_types, LintNames.type_annotate_public_apis},
-    )) {
-      await _addProposals_addTypeAnnotation();
-    }
     await _addProposal_addNotNullAssert();
     await _addProposal_assignToLocalVariable();
     await _addProposal_convertClassToMixin();
     await _addProposal_convertDocumentationIntoBlock();
-    if (!_containsErrorCode(
-      {LintNames.slash_for_doc_comments},
-    )) {
-      await _addProposal_convertDocumentationIntoLine();
-    }
     await _addProposal_convertIntoFinalField();
     await _addProposal_convertIntoGetter();
     await _addProposal_convertPartOfToUri();
     await _addProposal_convertToAsyncFunctionBody();
     await _addProposal_convertToBlockFunctionBody();
-    await _addProposal_convertToDoubleQuotedString();
-    if (!_containsErrorCode(
-      {LintNames.prefer_expression_function_bodies},
-    )) {
-      await _addProposal_convertToExpressionFunctionBody();
-    }
     await _addProposal_convertToFieldParameter();
     await _addProposal_convertToForIndexLoop();
-    if (!_containsErrorCode({LintNames.prefer_generic_function_type_aliases})) {
-      await _addProposal_convertToGenericFunctionSyntax();
-    }
-    if (!_containsErrorCode(
-      {LintNames.prefer_int_literals},
-    )) {
-      await _addProposal_convertToIntLiteral();
-    }
     await _addProposal_convertToIsNot_onIs();
     await _addProposal_convertToIsNot_onNot();
     await _addProposal_convertToIsNotEmpty();
     await _addProposal_convertToMultilineString();
     await _addProposal_convertToNormalParameter();
-    if (!_containsErrorCode(
-      {LintNames.avoid_relative_lib_imports},
-    )) {
-      await _addProposal_convertToPackageImport();
-    }
-    if (!_containsErrorCode(
-      {LintNames.prefer_single_quotes},
-    )) {
-      await _addProposal_convertToSingleQuotedString();
-    }
     await _addProposal_encapsulateField();
     await _addProposal_flutterConvertToChildren();
     await _addProposal_flutterConvertToStatefulWidget();
@@ -127,66 +109,17 @@
     await _addProposal_flutterWrapWidget();
     await _addProposal_flutterWrapWidgets();
     await _addProposal_importAddShow();
-    if (!_containsErrorCode(
-      {LintNames.prefer_inlined_adds},
-    )) {
-      await _addProposal_inlineAdd();
-    }
     await _addProposal_introduceLocalTestedType();
     await _addProposal_invertIf();
     await _addProposal_joinIfStatementInner();
     await _addProposal_joinIfStatementOuter();
     await _addProposal_joinVariableDeclaration_onAssignment();
     await _addProposal_joinVariableDeclaration_onDeclaration();
-    await _addProposal_removeTypeAnnotation();
     await _addProposal_reparentFlutterList();
     await _addProposal_replaceConditionalWithIfElse();
     await _addProposal_replaceIfElseWithConditional();
-    if (!_containsErrorCode({LintNames.omit_local_variable_types})) {
-      await _addProposal_replaceWithVar();
-    }
-    if (!_containsErrorCode(
-      {LintNames.sort_child_properties_last},
-    )) {
-      await _addProposal_sortChildPropertyLast();
-    }
     await _addProposal_splitVariableDeclaration();
     await _addProposal_surroundWith();
-    if (!_containsErrorCode(
-      {LintNames.curly_braces_in_flow_control_structures},
-    )) {
-      await _addProposal_useCurlyBraces();
-    }
-    if (!_containsErrorCode(
-      {LintNames.diagnostic_describe_all_properties},
-    )) {
-      await _addProposal_addDiagnosticPropertyReference();
-    }
-    if (experimentStatus.control_flow_collections) {
-      if (!_containsErrorCode(
-        {LintNames.prefer_if_elements_to_conditional_expressions},
-      )) {
-        await _addProposal_convertConditionalExpressionToIfElement();
-      }
-      if (!_containsErrorCode(
-        {LintNames.prefer_for_elements_to_map_fromIterable},
-      )) {
-        await _addProposal_convertMapFromIterableToForLiteral();
-      }
-    }
-    if (experimentStatus.spread_collections) {
-      final preferSpreadsLintFound =
-          _containsErrorCode({LintNames.prefer_spread_collections});
-      final preferInlinedAddsLintFound =
-          _containsErrorCode({LintNames.prefer_inlined_adds});
-      if (!_containsErrorCode(
-        {LintNames.prefer_spread_collections},
-      )) {
-        await _addProposal_convertAddAllToSpread(
-            preferInlinedAdds: !preferInlinedAddsLintFound,
-            convertToSpreads: !preferSpreadsLintFound);
-      }
-    }
 
     await _addFromProducers();
 
@@ -198,23 +131,39 @@
       return assists;
     }
 
+    var context = CorrectionProducerContext(
+      selectionOffset: selectionOffset,
+      selectionLength: selectionLength,
+      resolvedResult: resolvedResult,
+      workspace: workspace,
+    );
+
+    var setupSuccess = context.setupCompute();
+    if (!setupSuccess) {
+      return assists;
+    }
+
+    Future<void> compute(CorrectionProducer producer) async {
+      producer.configure(context);
+
+      var builder = _newDartChangeBuilder();
+      await producer.compute(builder);
+
+      _addAssistFromBuilder(builder, producer.assistKind,
+          args: producer.assistArguments);
+    }
+
     // Calculate only specific assists for edit.dartFix
     if (assistKind == DartAssistKind.CONVERT_CLASS_TO_MIXIN) {
       await _addProposal_convertClassToMixin();
     } else if (assistKind == DartAssistKind.CONVERT_TO_INT_LITERAL) {
-      await _addProposal_convertToIntLiteral();
+      await compute(ConvertToIntLiteral());
     } else if (assistKind == DartAssistKind.CONVERT_TO_SPREAD) {
-      if (experimentStatus.spread_collections) {
-        await _addProposal_convertAddAllToSpread();
-      }
+      await compute(ConvertAddAllToSpread());
     } else if (assistKind == DartAssistKind.CONVERT_TO_FOR_ELEMENT) {
-      if (experimentStatus.control_flow_collections) {
-        await _addProposal_convertMapFromIterableToForLiteral();
-      }
+      await compute(ConvertMapFromIterableToForLiteral());
     } else if (assistKind == DartAssistKind.CONVERT_TO_IF_ELEMENT) {
-      if (experimentStatus.control_flow_collections) {
-        await _addProposal_convertConditionalExpressionToIfElement();
-      }
+      await compute(ConvertConditionalExpressionToIfElement());
     }
     return assists;
   }
@@ -271,6 +220,43 @@
       {LintNames.always_declare_return_types},
     );
     await computeIfNotErrorCode(
+      AddDiagnosticPropertyReference(),
+      {LintNames.diagnostic_describe_all_properties},
+    );
+    await computeIfNotErrorCode(
+      AddTypeAnnotation(),
+      {LintNames.always_specify_types, LintNames.type_annotate_public_apis},
+    );
+    await computeIfNotErrorCode(
+      ConvertConditionalExpressionToIfElement(),
+      {LintNames.prefer_if_elements_to_conditional_expressions},
+    );
+    await computeIfNotErrorCode(
+      ConvertDocumentationIntoLine(),
+      {LintNames.slash_for_doc_comments},
+    );
+    await computeIfNotErrorCode(
+      ConvertMapFromIterableToForLiteral(),
+      {LintNames.prefer_for_elements_to_map_fromIterable},
+    );
+    await compute(ConvertToDoubleQuotes());
+    await computeIfNotErrorCode(
+      ConvertToSingleQuotes(),
+      {LintNames.prefer_single_quotes},
+    );
+    await computeIfNotErrorCode(
+      ConvertToExpressionFunctionBody(),
+      {LintNames.prefer_expression_function_bodies},
+    );
+    await computeIfNotErrorCode(
+      ConvertToGenericFunctionSyntax(),
+      {LintNames.prefer_generic_function_type_aliases},
+    );
+    await computeIfNotErrorCode(
+      ConvertToIntLiteral(),
+      {LintNames.prefer_int_literals},
+    );
+    await computeIfNotErrorCode(
       ConvertToListLiteral(),
       {LintNames.prefer_collection_literals},
     );
@@ -283,18 +269,41 @@
       {LintNames.prefer_null_aware_operators},
     );
     await computeIfNotErrorCode(
+      ConvertToPackageImport(),
+      {LintNames.avoid_relative_lib_imports},
+    );
+    await computeIfNotErrorCode(
+      ConvertToRelativeImport(),
+      {LintNames.prefer_relative_imports},
+    );
+    await computeIfNotErrorCode(
       ConvertToSetLiteral(),
       {LintNames.prefer_collection_literals},
     );
     await compute(ExchangeOperands());
+    await computeIfNotErrorCode(
+      InlineInvocation(),
+      {LintNames.prefer_inlined_adds},
+    );
+    await compute(RemoveTypeAnnotation());
+    await computeIfNotErrorCode(
+      ReplaceWithVar(),
+      {LintNames.omit_local_variable_types},
+    );
     await compute(ShadowField());
+    await computeIfNotErrorCode(
+      SortChildPropertyLast(),
+      {LintNames.sort_child_properties_last},
+    );
     await compute(SplitAndCondition());
-  }
-
-  Future<void> _addProposal_addDiagnosticPropertyReference() async {
-    final changeBuilder = await createBuilder_addDiagnosticPropertyReference();
-    _addAssistFromBuilder(
-        changeBuilder, DartAssistKind.ADD_DIAGNOSTIC_PROPERTY_REFERENCE);
+    await computeIfNotErrorCode(
+      UseCurlyBraces(),
+      {LintNames.curly_braces_in_flow_control_structures},
+    );
+    await computeIfNotErrorCode(
+      ConvertAddAllToSpread(),
+      {LintNames.prefer_inlined_adds, LintNames.prefer_spread_collections},
+    );
   }
 
   Future<void> _addProposal_addNotNullAssert() async {
@@ -406,20 +415,6 @@
     }
   }
 
-  Future<void> _addProposal_convertAddAllToSpread(
-      {bool preferInlinedAdds = true, bool convertToSpreads = true}) async {
-    final change = await createBuilder_convertAddAllToSpread();
-    if (change != null) {
-      if (change.isLineInvocation && !preferInlinedAdds || !convertToSpreads) {
-        return;
-      }
-      final kind = change.isLineInvocation
-          ? DartAssistKind.INLINE_INVOCATION
-          : DartAssistKind.CONVERT_TO_SPREAD;
-      _addAssistFromBuilder(change.builder, kind, args: change.args);
-    }
-  }
-
   Future<void> _addProposal_convertClassToMixin() async {
     var classDeclaration = node.thisOrAncestorOfType<ClassDeclaration>();
     if (classDeclaration == null) {
@@ -475,12 +470,6 @@
     _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_CLASS_TO_MIXIN);
   }
 
-  Future<void> _addProposal_convertConditionalExpressionToIfElement() async {
-    final changeBuilder =
-        await createBuilder_convertConditionalExpressionToIfElement();
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_TO_IF_ELEMENT);
-  }
-
   Future<void> _addProposal_convertDocumentationIntoBlock() async {
     var comment = node.thisOrAncestorOfType<Comment>();
     if (comment == null || !comment.isDocumentation) {
@@ -512,12 +501,6 @@
         changeBuilder, DartAssistKind.CONVERT_DOCUMENTATION_INTO_BLOCK);
   }
 
-  Future<void> _addProposal_convertDocumentationIntoLine() async {
-    final changeBuilder = await createBuilder_convertDocumentationIntoLine();
-    _addAssistFromBuilder(
-        changeBuilder, DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE);
-  }
-
   Future<void> _addProposal_convertIntoFinalField() async {
     // Find the enclosing getter.
     MethodDeclaration getter;
@@ -635,12 +618,6 @@
     _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_INTO_GETTER);
   }
 
-  Future<void> _addProposal_convertMapFromIterableToForLiteral() async {
-    final changeBuilder =
-        await createBuilder_convertMapFromIterableToForLiteral();
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_TO_FOR_ELEMENT);
-  }
-
   Future<void> _addProposal_convertPartOfToUri() async {
     var directive = node.thisOrAncestorOfType<PartOfDirective>();
     if (directive == null || directive.libraryName == null) {
@@ -659,7 +636,7 @@
   }
 
   Future<void> _addProposal_convertToAsyncFunctionBody() async {
-    var body = getEnclosingFunctionBody();
+    var body = _getEnclosingFunctionBody();
     if (body == null ||
         body is EmptyFunctionBody ||
         body.isAsynchronous ||
@@ -693,7 +670,7 @@
   }
 
   Future<void> _addProposal_convertToBlockFunctionBody() async {
-    var body = getEnclosingFunctionBody();
+    var body = _getEnclosingFunctionBody();
     // prepare expression body
     if (body is! ExpressionFunctionBody || body.isGenerator) {
       _coverageMarker();
@@ -735,16 +712,6 @@
         changeBuilder, DartAssistKind.CONVERT_INTO_BLOCK_BODY);
   }
 
-  Future<void> _addProposal_convertToDoubleQuotedString() async {
-    await _convertQuotes(false, DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING);
-  }
-
-  Future<void> _addProposal_convertToExpressionFunctionBody() async {
-    final changeBuilder = await createBuilder_convertToExpressionFunctionBody();
-    _addAssistFromBuilder(
-        changeBuilder, DartAssistKind.CONVERT_INTO_EXPRESSION_BODY);
-  }
-
   Future<void> _addProposal_convertToFieldParameter() async {
     if (node == null) {
       return;
@@ -917,17 +884,6 @@
     _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_INTO_FOR_INDEX);
   }
 
-  Future<void> _addProposal_convertToGenericFunctionSyntax() async {
-    var changeBuilder = await createBuilder_convertToGenericFunctionSyntax();
-    _addAssistFromBuilder(
-        changeBuilder, DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX);
-  }
-
-  Future<void> _addProposal_convertToIntLiteral() async {
-    final changeBuilder = await createBuilder_convertToIntLiteral();
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_TO_INT_LITERAL);
-  }
-
   Future<void> _addProposal_convertToIsNot_onIs() async {
     // may be child of "is"
     var node = this.node;
@@ -1158,16 +1114,6 @@
     }
   }
 
-  Future<void> _addProposal_convertToPackageImport() async {
-    final changeBuilder = await createBuilder_convertToPackageImport();
-    _addAssistFromBuilder(
-        changeBuilder, DartAssistKind.CONVERT_TO_PACKAGE_IMPORT);
-  }
-
-  Future<void> _addProposal_convertToSingleQuotedString() async {
-    await _convertQuotes(true, DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING);
-  }
-
   Future<void> _addProposal_encapsulateField() async {
     // find FieldDeclaration
     var fieldDeclaration = node.thisOrAncestorOfType<FieldDeclaration>();
@@ -1997,12 +1943,6 @@
     _addAssistFromBuilder(changeBuilder, DartAssistKind.IMPORT_ADD_SHOW);
   }
 
-  Future<void> _addProposal_inlineAdd() async {
-    final changeBuilder = await createBuilder_inlineAdd();
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.INLINE_INVOCATION,
-        args: ['add']);
-  }
-
   Future<void> _addProposal_introduceLocalTestedType() async {
     var node = this.node;
     if (node is IfStatement) {
@@ -2362,13 +2302,6 @@
         changeBuilder, DartAssistKind.JOIN_VARIABLE_DECLARATION);
   }
 
-  Future<void> _addProposal_removeTypeAnnotation() async {
-    // todo (pq): unify w/ fix (and then add a guard to not assist on lints:
-    // avoid_return_types_on_setters, type_init_formals)
-    final changeBuilder = await createBuilder_removeTypeAnnotation();
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.REMOVE_TYPE_ANNOTATION);
-  }
-
   Future<void> _addProposal_reparentFlutterList() async {
     if (node is! ListLiteral) {
       return;
@@ -2581,63 +2514,6 @@
     }
   }
 
-  Future<void> _addProposal_replaceWithVar() async {
-    /// Return `true` if the type in the [node] can be replaced with `var`.
-    bool canConvertVariableDeclarationList(VariableDeclarationList node) {
-      final staticType = node?.type?.type;
-      if (staticType == null || staticType.isDynamic) {
-        return false;
-      }
-      for (final child in node.variables) {
-        var initializer = child.initializer;
-        if (initializer == null || initializer.staticType != staticType) {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    /// Return `true` if the given node can be replaced with `var`.
-    bool canReplaceWithVar() {
-      var parent = node.parent;
-      while (parent != null) {
-        if (parent is VariableDeclarationStatement) {
-          return canConvertVariableDeclarationList(parent.variables);
-        } else if (parent is ForPartsWithDeclarations) {
-          return canConvertVariableDeclarationList(parent.variables);
-        } else if (parent is ForEachPartsWithDeclaration) {
-          var loopVariableType = parent.loopVariable.type;
-          var staticType = loopVariableType?.type;
-          if (staticType == null || staticType.isDynamic) {
-            return false;
-          }
-          final iterableType = parent.iterable.staticType;
-          if (iterableType is InterfaceTypeImpl) {
-            var instantiatedType =
-                iterableType.asInstanceOf(typeProvider.iterableElement);
-            if (instantiatedType?.typeArguments?.first == staticType) {
-              return true;
-            }
-          }
-          return false;
-        }
-        parent = parent.parent;
-      }
-      return false;
-    }
-
-    if (canReplaceWithVar()) {
-      var changeBuilder = await createBuilder_replaceWithVar();
-      _addAssistFromBuilder(changeBuilder, DartAssistKind.REPLACE_WITH_VAR);
-    }
-  }
-
-  Future<void> _addProposal_sortChildPropertyLast() async {
-    final changeBuilder = await createBuilder_sortChildPropertyLast();
-    _addAssistFromBuilder(
-        changeBuilder, DartAssistKind.SORT_CHILD_PROPERTY_LAST);
-  }
-
   Future<void> _addProposal_splitVariableDeclaration() async {
     var variableList = node?.thisOrAncestorOfType<VariableDeclarationList>();
 
@@ -2922,24 +2798,6 @@
     }
   }
 
-  Future<void> _addProposal_useCurlyBraces() async {
-    final changeBuilder = await createBuilder_useCurlyBraces();
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.USE_CURLY_BRACES);
-  }
-
-  Future<void> _addProposals_addTypeAnnotation() async {
-    var changeBuilder =
-        await createBuilder_addTypeAnnotation_DeclaredIdentifier();
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.ADD_TYPE_ANNOTATION);
-
-    changeBuilder =
-        await createBuilder_addTypeAnnotation_SimpleFormalParameter();
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.ADD_TYPE_ANNOTATION);
-
-    changeBuilder = await createBuilder_addTypeAnnotation_VariableDeclaration();
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
   bool _containsErrorCode(Set<String> errorCodes) {
     final fileOffset = node.offset;
     for (var error in context.resolveResult.errors) {
@@ -2998,9 +2856,27 @@
     }
   }
 
-  Future<void> _convertQuotes(bool fromDouble, AssistKind kind) async {
-    final changeBuilder = await createBuilder_convertQuotes(fromDouble);
-    _addAssistFromBuilder(changeBuilder, kind);
+  FunctionBody _getEnclosingFunctionBody() {
+    // This is duplicated from [CorrectionProducer] and should be replaced by
+    // that method when the assists that reference it are converted to be
+    // producers.
+    var closure = node.thisOrAncestorOfType<FunctionExpression>();
+    if (closure != null) {
+      return closure.body;
+    }
+    var function = node.thisOrAncestorOfType<FunctionDeclaration>();
+    if (function != null) {
+      return function.functionExpression.body;
+    }
+    var constructor = node.thisOrAncestorOfType<ConstructorDeclaration>();
+    if (constructor != null) {
+      return constructor.body;
+    }
+    var method = node.thisOrAncestorOfType<MethodDeclaration>();
+    if (method != null) {
+      return method.body;
+    }
+    return null;
   }
 
   /// Returns the text of the given node in the unit.
diff --git a/pkg/analysis_server/lib/src/services/correction/base_processor.dart b/pkg/analysis_server/lib/src/services/correction/base_processor.dart
index ecaaa94..2e797a5 100644
--- a/pkg/analysis_server/lib/src/services/correction/base_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/base_processor.dart
@@ -7,24 +7,13 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
-import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
-import 'package:analyzer_plugin/utilities/range_factory.dart';
 import 'package:meta/meta.dart';
-import 'package:path/path.dart' as path;
 
 /// Base class for common processor functionality.
 abstract class BaseProcessor {
@@ -66,1464 +55,10 @@
       (session.analysisContext.analysisOptions as AnalysisOptionsImpl)
           .experimentStatus;
 
-  Future<ChangeBuilder> createBuilder_addDiagnosticPropertyReference() async {
-    final node = this.node;
-    if (node is! SimpleIdentifier) {
-      _coverageMarker();
-      return null;
-    }
-    SimpleIdentifier name = node;
-    final parent = node.parent;
-
-    DartType type;
-
-    // Getter.
-    if (parent is MethodDeclaration) {
-      var methodDeclaration = parent;
-      var element = methodDeclaration.declaredElement;
-      if (element is PropertyAccessorElement) {
-        var propertyAccessor = element;
-        type = propertyAccessor.returnType;
-      }
-      // Field.
-    } else if (parent is VariableDeclaration) {
-      var variableDeclaration = parent;
-      final element = variableDeclaration.declaredElement;
-      if (element is FieldElement) {
-        var fieldElement = element;
-        type = fieldElement.type;
-      }
-    }
-
-    if (type == null) {
-      return null;
-    }
-
-    var constructorId;
-    var typeArgs;
-    var constructorName = '';
-
-    if (type.element is FunctionTypedElement) {
-      constructorId = 'ObjectFlagProperty';
-      typeArgs = [type];
-      constructorName = '.has';
-    } else if (type.isDartCoreInt) {
-      constructorId = 'IntProperty';
-    } else if (type.isDartCoreDouble) {
-      constructorId = 'DoubleProperty';
-    } else if (type.isDartCoreString) {
-      constructorId = 'StringProperty';
-    } else if (isEnum(type)) {
-      constructorId = 'EnumProperty';
-      typeArgs = [type];
-    } else if (isIterable(type)) {
-      constructorId = 'IterableProperty';
-      typeArgs = (type as InterfaceType).typeArguments;
-    } else if (flutter.isColor(type)) {
-      constructorId = 'ColorProperty';
-    } else if (flutter.isMatrix4(type)) {
-      constructorId = 'TransformProperty';
-    } else {
-      constructorId = 'DiagnosticsProperty';
-      if (!type.isDynamic) {
-        typeArgs = [type];
-      }
-    }
-
-    void writePropertyReference(
-      DartEditBuilder builder, {
-      @required String prefix,
-      @required String builderName,
-    }) {
-      builder.write('$prefix$builderName.add($constructorId');
-      if (typeArgs != null) {
-        builder.write('<');
-        builder.writeTypes(typeArgs);
-        builder.write('>');
-      } else if (type.isDynamic) {
-        TypeAnnotation declType;
-        final decl = node.thisOrAncestorOfType<VariableDeclarationList>();
-        if (decl != null) {
-          declType = decl.type;
-          // getter
-        } else if (parent is MethodDeclaration) {
-          declType = parent.returnType;
-        }
-
-        if (declType != null) {
-          final typeText = utils.getNodeText(declType);
-          if (typeText != 'dynamic') {
-            builder.write('<');
-            builder.write(utils.getNodeText(declType));
-            builder.write('>');
-          }
-        }
-      }
-      builder.writeln("$constructorName('${name.name}', ${name.name}));");
-    }
-
-    final classDeclaration = parent.thisOrAncestorOfType<ClassDeclaration>();
-    final debugFillProperties =
-        classDeclaration.getMethod('debugFillProperties');
-    if (debugFillProperties == null) {
-      final insertOffset =
-          utils.prepareNewMethodLocation(classDeclaration).offset;
-      final changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addInsertion(utils.getLineNext(insertOffset),
-            (DartEditBuilder builder) {
-          final declPrefix =
-              utils.getLinePrefix(classDeclaration.offset) + utils.getIndent(1);
-          final bodyPrefix = declPrefix + utils.getIndent(1);
-
-          builder.writeln('$declPrefix@override');
-          builder.writeln(
-              '${declPrefix}void debugFillProperties(DiagnosticPropertiesBuilder properties) {');
-          builder
-              .writeln('${bodyPrefix}super.debugFillProperties(properties);');
-          writePropertyReference(builder,
-              prefix: bodyPrefix, builderName: 'properties');
-          builder.writeln('$declPrefix}');
-        });
-      });
-      return changeBuilder;
-    }
-
-    final body = debugFillProperties.body;
-    if (body is BlockFunctionBody) {
-      var functionBody = body;
-
-      var offset;
-      var prefix;
-      if (functionBody.block.statements.isEmpty) {
-        offset = functionBody.block.leftBracket.offset;
-        prefix = utils.getLinePrefix(offset) + utils.getIndent(1);
-      } else {
-        offset = functionBody.block.statements.last.endToken.offset;
-        prefix = utils.getLinePrefix(offset);
-      }
-
-      var parameters = debugFillProperties.parameters.parameters;
-      var propertiesBuilderName;
-      for (var parameter in parameters) {
-        if (parameter is SimpleFormalParameter) {
-          final type = parameter.type;
-          if (type is TypeName) {
-            if (type.name.name == 'DiagnosticPropertiesBuilder') {
-              propertiesBuilderName = parameter.identifier.name;
-              break;
-            }
-          }
-        }
-      }
-      if (propertiesBuilderName == null) {
-        return null;
-      }
-
-      final changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addInsertion(utils.getLineNext(offset),
-            (DartEditBuilder builder) {
-          writePropertyReference(builder,
-              prefix: prefix, builderName: propertiesBuilderName);
-        });
-      });
-      return changeBuilder;
-    }
-
-    return null;
-  }
-
-  Future<ChangeBuilder>
-      createBuilder_addTypeAnnotation_DeclaredIdentifier() async {
-    var declaredIdentifier = node.thisOrAncestorOfType<DeclaredIdentifier>();
-    if (declaredIdentifier == null) {
-      var forEach = node.thisOrAncestorMatching((node) =>
-              node is ForStatement && node.forLoopParts is ForEachParts)
-          as ForStatement;
-      ForEachParts forEachParts = forEach?.forLoopParts;
-      var offset = node.offset;
-      if (forEach != null &&
-          forEachParts.iterable != null &&
-          offset < forEachParts.iterable.offset) {
-        declaredIdentifier = forEachParts is ForEachPartsWithDeclaration
-            ? forEachParts.loopVariable
-            : null;
-      }
-    }
-    if (declaredIdentifier == null) {
-      _coverageMarker();
-      return null;
-    }
-    // Ensure that there isn't already a type annotation.
-    if (declaredIdentifier.type != null) {
-      _coverageMarker();
-      return null;
-    }
-    var type = declaredIdentifier.declaredElement.type;
-    if (type is! InterfaceType && type is! FunctionType) {
-      _coverageMarker();
-      return null;
-    }
-    _configureTargetLocation(node);
-
-    var changeBuilder = _newDartChangeBuilder();
-    var validChange = true;
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      var keyword = declaredIdentifier.keyword;
-      if (keyword.keyword == Keyword.VAR) {
-        builder.addReplacement(range.token(keyword), (DartEditBuilder builder) {
-          validChange = builder.writeType(type);
-        });
-      } else {
-        builder.addInsertion(declaredIdentifier.identifier.offset,
-            (DartEditBuilder builder) {
-          validChange = builder.writeType(type);
-          builder.write(' ');
-        });
-      }
-    });
-    return validChange ? changeBuilder : null;
-  }
-
-  Future<ChangeBuilder>
-      createBuilder_addTypeAnnotation_SimpleFormalParameter() async {
-    var node = this.node;
-    // should be the name of a simple parameter
-    if (node is! SimpleIdentifier || node.parent is! SimpleFormalParameter) {
-      _coverageMarker();
-      return null;
-    }
-    SimpleIdentifier name = node;
-    SimpleFormalParameter parameter = node.parent;
-    // the parameter should not have a type
-    if (parameter.type != null) {
-      _coverageMarker();
-      return null;
-    }
-    // prepare the type
-    var type = parameter.declaredElement.type;
-    // TODO(scheglov) If the parameter is in a method declaration, and if the
-    // method overrides a method that has a type for the corresponding
-    // parameter, it would be nice to copy down the type from the overridden
-    // method.
-    if (type is! InterfaceType) {
-      _coverageMarker();
-      return null;
-    }
-    // prepare type source
-    _configureTargetLocation(node);
-
-    var changeBuilder = _newDartChangeBuilder();
-    var validChange = true;
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addInsertion(name.offset, (DartEditBuilder builder) {
-        validChange = builder.writeType(type);
-        builder.write(' ');
-      });
-    });
-    return validChange ? changeBuilder : null;
-  }
-
-  Future<ChangeBuilder>
-      createBuilder_addTypeAnnotation_VariableDeclaration() async {
-    var node = this.node;
-    // prepare VariableDeclarationList
-    var declarationList = node.thisOrAncestorOfType<VariableDeclarationList>();
-    if (declarationList == null) {
-      _coverageMarker();
-      return null;
-    }
-    // may be has type annotation already
-    if (declarationList.type != null) {
-      _coverageMarker();
-      return null;
-    }
-    // prepare single VariableDeclaration
-    List<VariableDeclaration> variables = declarationList.variables;
-    if (variables.length != 1) {
-      _coverageMarker();
-      return null;
-    }
-    var variable = variables[0];
-    // must be not after the name of the variable
-    if (selectionOffset > variable.name.end) {
-      _coverageMarker();
-      return null;
-    }
-    // we need an initializer to get the type from
-    var initializer = variable.initializer;
-    if (initializer == null) {
-      _coverageMarker();
-      return null;
-    }
-    var type = initializer.staticType;
-    // prepare type source
-    if ((type is! InterfaceType || type.isDartCoreNull) &&
-        type is! FunctionType) {
-      _coverageMarker();
-      return null;
-    }
-    _configureTargetLocation(node);
-
-    var changeBuilder = _newDartChangeBuilder();
-    var validChange = true;
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      var keyword = declarationList.keyword;
-      if (keyword?.keyword == Keyword.VAR) {
-        builder.addReplacement(range.token(keyword), (DartEditBuilder builder) {
-          validChange = builder.writeType(type);
-        });
-      } else {
-        builder.addInsertion(variable.offset, (DartEditBuilder builder) {
-          validChange = builder.writeType(type);
-          builder.write(' ');
-        });
-      }
-    });
-    return validChange ? changeBuilder : null;
-  }
-
-  Future<ConvertToSpreadCollectionsChange>
-      createBuilder_convertAddAllToSpread() async {
-    var node = this.node;
-    if (node is! SimpleIdentifier || node.parent is! MethodInvocation) {
-      _coverageMarker();
-      return null;
-    }
-    SimpleIdentifier name = node;
-    MethodInvocation invocation = node.parent;
-    if (name != invocation.methodName ||
-        name.name != 'addAll' ||
-        !invocation.isCascaded ||
-        invocation.argumentList.arguments.length != 1) {
-      _coverageMarker();
-      return null;
-    }
-    var cascade = invocation.thisOrAncestorOfType<CascadeExpression>();
-    var sections = cascade.cascadeSections;
-    var target = cascade.target;
-    if (target is! ListLiteral || sections[0] != invocation) {
-      // TODO(brianwilkerson) Consider extending this to handle set literals.
-      _coverageMarker();
-      return null;
-    }
-
-    bool isEmptyListLiteral(Expression expression) =>
-        expression is ListLiteral && expression.elements.isEmpty;
-
-    ListLiteral list = target;
-    var argument = invocation.argumentList.arguments[0];
-    String elementText;
-    var change = ConvertToSpreadCollectionsChange();
-    List<String> args;
-    if (argument is BinaryExpression &&
-        argument.operator.type == TokenType.QUESTION_QUESTION) {
-      var right = argument.rightOperand;
-      if (isEmptyListLiteral(right)) {
-        // ..addAll(things ?? const [])
-        // ..addAll(things ?? [])
-        elementText = '...?${utils.getNodeText(argument.leftOperand)}';
-      }
-    } else if (experimentStatus.control_flow_collections &&
-        argument is ConditionalExpression) {
-      var elseExpression = argument.elseExpression;
-      if (isEmptyListLiteral(elseExpression)) {
-        // ..addAll(condition ? things : const [])
-        // ..addAll(condition ? things : [])
-        var conditionText = utils.getNodeText(argument.condition);
-        var thenText = utils.getNodeText(argument.thenExpression);
-        elementText = 'if ($conditionText) ...$thenText';
-      }
-    } else if (argument is ListLiteral) {
-      // ..addAll([ ... ])
-      var elements = argument.elements;
-      if (elements.isEmpty) {
-        // TODO(brianwilkerson) Consider adding a cleanup for the empty list
-        //  case. We can essentially remove the whole invocation because it does
-        //  nothing.
-        return null;
-      }
-      var startOffset = elements.first.offset;
-      var endOffset = elements.last.end;
-      elementText = utils.getText(startOffset, endOffset - startOffset);
-      change.isLineInvocation = true;
-      args = ['addAll'];
-    }
-    elementText ??= '...${utils.getNodeText(argument)}';
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      if (list.elements.isNotEmpty) {
-        // ['a']..addAll(['b', 'c']);
-        builder.addSimpleInsertion(list.elements.last.end, ', $elementText');
-      } else {
-        // []..addAll(['b', 'c']);
-        builder.addSimpleInsertion(list.leftBracket.end, elementText);
-      }
-      builder.addDeletion(range.node(invocation));
-    });
-    change.args = args;
-    change.builder = changeBuilder;
-    return change;
-  }
-
-  Future<ChangeBuilder>
-      createBuilder_convertConditionalExpressionToIfElement() async {
-    AstNode node = this.node.thisOrAncestorOfType<ConditionalExpression>();
-    if (node == null) {
-      _coverageMarker();
-      return null;
-    }
-    var nodeToReplace = node;
-    var parent = node.parent;
-    while (parent is ParenthesizedExpression) {
-      nodeToReplace = parent;
-      parent = parent.parent;
-    }
-    if (parent is ListLiteral || (parent is SetOrMapLiteral && parent.isSet)) {
-      ConditionalExpression conditional = node;
-      var condition = conditional.condition.unParenthesized;
-      var thenExpression = conditional.thenExpression.unParenthesized;
-      var elseExpression = conditional.elseExpression.unParenthesized;
-
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addReplacement(range.node(nodeToReplace),
-            (DartEditBuilder builder) {
-          builder.write('if (');
-          builder.write(utils.getNodeText(condition));
-          builder.write(') ');
-          builder.write(utils.getNodeText(thenExpression));
-          builder.write(' else ');
-          builder.write(utils.getNodeText(elseExpression));
-        });
-      });
-      return changeBuilder;
-    }
-
-    return null;
-  }
-
-  Future<ChangeBuilder> createBuilder_convertDocumentationIntoLine() async {
-    var comment = node.thisOrAncestorOfType<Comment>();
-    if (comment == null ||
-        !comment.isDocumentation ||
-        comment.tokens.length != 1) {
-      _coverageMarker();
-      return null;
-    }
-    var token = comment.tokens.first;
-    if (token.type != TokenType.MULTI_LINE_COMMENT) {
-      _coverageMarker();
-      return null;
-    }
-    var text = token.lexeme;
-    var lines = text.split('\n');
-    var prefix = utils.getNodePrefix(comment);
-    var newLines = <String>[];
-    var firstLine = true;
-    var linePrefix = '';
-    for (var line in lines) {
-      if (firstLine) {
-        firstLine = false;
-        var expectedPrefix = '/**';
-        if (!line.startsWith(expectedPrefix)) {
-          _coverageMarker();
-          return null;
-        }
-        line = line.substring(expectedPrefix.length).trim();
-        if (line.isNotEmpty) {
-          newLines.add('/// $line');
-          linePrefix = eol + prefix;
-        }
-      } else {
-        if (line.startsWith(prefix + ' */')) {
-          break;
-        }
-        var expectedPrefix = prefix + ' *';
-        if (!line.startsWith(expectedPrefix)) {
-          _coverageMarker();
-          return null;
-        }
-        line = line.substring(expectedPrefix.length);
-        if (line.isEmpty) {
-          newLines.add('$linePrefix///');
-        } else {
-          newLines.add('$linePrefix///$line');
-        }
-        linePrefix = eol + prefix;
-      }
-    }
-
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addReplacement(range.node(comment), (DartEditBuilder builder) {
-        for (var newLine in newLines) {
-          builder.write(newLine);
-        }
-      });
-    });
-    return changeBuilder;
-  }
-
-  Future<ChangeBuilder>
-      createBuilder_convertMapFromIterableToForLiteral() async {
-    //
-    // Ensure that the selection is inside an invocation of Map.fromIterable.
-    //
-    var creation = node.thisOrAncestorOfType<InstanceCreationExpression>();
-    if (creation == null) {
-      _coverageMarker();
-      return null;
-    }
-    var element = creation.staticElement;
-    if (element == null ||
-        element.name != 'fromIterable' ||
-        element.enclosingElement != typeProvider.mapElement) {
-      _coverageMarker();
-      return null;
-    }
-    //
-    // Ensure that the arguments have the right form.
-    //
-    var arguments = creation.argumentList.arguments;
-    if (arguments.length != 3) {
-      _coverageMarker();
-      return null;
-    }
-    var iterator = arguments[0].unParenthesized;
-    var secondArg = arguments[1];
-    var thirdArg = arguments[2];
-
-    Expression extractBody(FunctionExpression expression) {
-      var body = expression.body;
-      if (body is ExpressionFunctionBody) {
-        return body.expression;
-      } else if (body is BlockFunctionBody) {
-        var statements = body.block.statements;
-        if (statements.length == 1) {
-          var statement = statements[0];
-          if (statement is ReturnStatement) {
-            return statement.expression;
-          }
-        }
-      }
-      return null;
-    }
-
-    FunctionExpression extractClosure(String name, Expression argument) {
-      if (argument is NamedExpression && argument.name.label.name == name) {
-        var expression = argument.expression.unParenthesized;
-        if (expression is FunctionExpression) {
-          var parameters = expression.parameters.parameters;
-          if (parameters.length == 1 && parameters[0].isRequiredPositional) {
-            if (extractBody(expression) != null) {
-              return expression;
-            }
-          }
-        }
-      }
-      return null;
-    }
-
-    var keyClosure =
-        extractClosure('key', secondArg) ?? extractClosure('key', thirdArg);
-    var valueClosure =
-        extractClosure('value', thirdArg) ?? extractClosure('value', secondArg);
-    if (keyClosure == null || valueClosure == null) {
-      _coverageMarker();
-      return null;
-    }
-    //
-    // Compute the loop variable name and convert the key and value closures if
-    // necessary.
-    //
-    SimpleFormalParameter keyParameter = keyClosure.parameters.parameters[0];
-    var keyParameterName = keyParameter.identifier.name;
-    SimpleFormalParameter valueParameter =
-        valueClosure.parameters.parameters[0];
-    var valueParameterName = valueParameter.identifier.name;
-    var keyBody = extractBody(keyClosure);
-    var keyExpressionText = utils.getNodeText(keyBody);
-    var valueBody = extractBody(valueClosure);
-    var valueExpressionText = utils.getNodeText(valueBody);
-
-    String loopVariableName;
-    if (keyParameterName == valueParameterName) {
-      loopVariableName = keyParameterName;
-    } else {
-      var keyFinder = _ParameterReferenceFinder(keyParameter.declaredElement);
-      keyBody.accept(keyFinder);
-
-      var valueFinder =
-          _ParameterReferenceFinder(valueParameter.declaredElement);
-      valueBody.accept(valueFinder);
-
-      String computeUnusedVariableName() {
-        var candidate = 'e';
-        var index = 1;
-        while (keyFinder.referencesName(candidate) ||
-            valueFinder.referencesName(candidate)) {
-          candidate = 'e${index++}';
-        }
-        return candidate;
-      }
-
-      if (valueFinder.isParameterUnreferenced) {
-        if (valueFinder.referencesName(keyParameterName)) {
-          // The name of the value parameter is not used, but we can't use the
-          // name of the key parameter because doing so would hide a variable
-          // referenced in the value expression.
-          loopVariableName = computeUnusedVariableName();
-          keyExpressionText = keyFinder.replaceName(
-              keyExpressionText, loopVariableName, keyBody.offset);
-        } else {
-          loopVariableName = keyParameterName;
-        }
-      } else if (keyFinder.isParameterUnreferenced) {
-        if (keyFinder.referencesName(valueParameterName)) {
-          // The name of the key parameter is not used, but we can't use the
-          // name of the value parameter because doing so would hide a variable
-          // referenced in the key expression.
-          loopVariableName = computeUnusedVariableName();
-          valueExpressionText = valueFinder.replaceName(
-              valueExpressionText, loopVariableName, valueBody.offset);
-        } else {
-          loopVariableName = valueParameterName;
-        }
-      } else {
-        // The names are different and both are used. We need to find a name
-        // that would not change the resolution of any other identifiers in
-        // either the key or value expressions.
-        loopVariableName = computeUnusedVariableName();
-        keyExpressionText = keyFinder.replaceName(
-            keyExpressionText, loopVariableName, keyBody.offset);
-        valueExpressionText = valueFinder.replaceName(
-            valueExpressionText, loopVariableName, valueBody.offset);
-      }
-    }
-    //
-    // Construct the edit.
-    //
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addReplacement(range.node(creation), (DartEditBuilder builder) {
-        builder.write('{ for (var ');
-        builder.write(loopVariableName);
-        builder.write(' in ');
-        builder.write(utils.getNodeText(iterator));
-        builder.write(') ');
-        builder.write(keyExpressionText);
-        builder.write(' : ');
-        builder.write(valueExpressionText);
-        builder.write(' }');
-      });
-    });
-    return changeBuilder;
-  }
-
-  Future<ChangeBuilder> createBuilder_convertQuotes(bool fromDouble) async {
-    if (node is SimpleStringLiteral) {
-      SimpleStringLiteral literal = node;
-      if (fromDouble ? !literal.isSingleQuoted : literal.isSingleQuoted) {
-        var newQuote = literal.isMultiline
-            ? (fromDouble ? "'''" : '"""')
-            : (fromDouble ? "'" : '"');
-        var quoteLength = literal.isMultiline ? 3 : 1;
-        var lexeme = literal.literal.lexeme;
-        if (!lexeme.contains(newQuote)) {
-          var changeBuilder = _newDartChangeBuilder();
-          await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-            builder.addSimpleReplacement(
-                SourceRange(
-                    literal.offset + (literal.isRaw ? 1 : 0), quoteLength),
-                newQuote);
-            builder.addSimpleReplacement(
-                SourceRange(literal.end - quoteLength, quoteLength), newQuote);
-          });
-          return changeBuilder;
-        }
-      }
-    } else if (node is InterpolationString) {
-      StringInterpolation parent = node.parent;
-      if (fromDouble ? !parent.isSingleQuoted : parent.isSingleQuoted) {
-        var newQuote = parent.isMultiline
-            ? (fromDouble ? "'''" : '"""')
-            : (fromDouble ? "'" : '"');
-        var quoteLength = parent.isMultiline ? 3 : 1;
-        var elements = parent.elements;
-        for (var i = 0; i < elements.length; i++) {
-          var element = elements[i];
-          if (element is InterpolationString) {
-            var lexeme = element.contents.lexeme;
-            if (lexeme.contains(newQuote)) {
-              return null;
-            }
-          }
-        }
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          builder.addSimpleReplacement(
-              SourceRange(parent.offset + (parent.isRaw ? 1 : 0), quoteLength),
-              newQuote);
-          builder.addSimpleReplacement(
-              SourceRange(parent.end - quoteLength, quoteLength), newQuote);
-        });
-        return changeBuilder;
-      }
-    }
-    return null;
-  }
-
-  Future<ChangeBuilder> createBuilder_convertToExpressionFunctionBody() async {
-    // prepare current body
-    var body = getEnclosingFunctionBody();
-    if (body is! BlockFunctionBody || body.isGenerator) {
-      _coverageMarker();
-      return null;
-    }
-    // prepare return statement
-    List<Statement> statements = (body as BlockFunctionBody).block.statements;
-    if (statements.length != 1) {
-      _coverageMarker();
-      return null;
-    }
-    var onlyStatement = statements.first;
-    // prepare returned expression
-    Expression returnExpression;
-    if (onlyStatement is ReturnStatement) {
-      returnExpression = onlyStatement.expression;
-    } else if (onlyStatement is ExpressionStatement) {
-      returnExpression = onlyStatement.expression;
-    }
-    if (returnExpression == null) {
-      _coverageMarker();
-      return null;
-    }
-
-    // Return expressions can be quite large, e.g. Flutter build() methods.
-    // It is surprising to see this Quick Assist deep in the function body.
-    if (selectionOffset >= returnExpression.offset) {
-      _coverageMarker();
-      return null;
-    }
-
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addReplacement(range.node(body), (DartEditBuilder builder) {
-        if (body.isAsynchronous) {
-          builder.write('async ');
-        }
-        builder.write('=> ');
-        builder.write(_getNodeText(returnExpression));
-        if (body.parent is! FunctionExpression ||
-            body.parent.parent is FunctionDeclaration) {
-          builder.write(';');
-        }
-      });
-    });
-    return changeBuilder;
-  }
-
-  Future<ChangeBuilder> createBuilder_convertToGenericFunctionSyntax() async {
-    var node = this.node;
-    while (node != null) {
-      if (node is FunctionTypeAlias) {
-        return _createBuilder_convertFunctionTypeAliasToGenericTypeAlias(node);
-      } else if (node is FunctionTypedFormalParameter) {
-        return _createBuilder_convertFunctionTypedFormalParameterToGenericTypeAlias(
-            node);
-      } else if (node is FormalParameterList) {
-        // It would be confusing for this assist to alter a surrounding context
-        // when the selection is inside a parameter list.
-        return null;
-      }
-      node = node.parent;
-    }
-    return null;
-  }
-
-  Future<ChangeBuilder> createBuilder_convertToIntLiteral() async {
-    if (node is! DoubleLiteral) {
-      _coverageMarker();
-      return null;
-    }
-    DoubleLiteral literal = node;
-    int intValue;
-    try {
-      intValue = literal.value?.truncate();
-    } catch (e) {
-      // Double cannot be converted to int
-    }
-    if (intValue == null || intValue != literal.value) {
-      _coverageMarker();
-      return null;
-    }
-
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addReplacement(SourceRange(literal.offset, literal.length),
-          (DartEditBuilder builder) {
-        builder.write('$intValue');
-      });
-    });
-    return changeBuilder;
-  }
-
-  Future<ChangeBuilder> createBuilder_convertToPackageImport() async {
-    var node = this.node;
-    if (node is StringLiteral) {
-      node = node.parent;
-    }
-    if (node is ImportDirective) {
-      var importDirective = node;
-      var uriSource = importDirective.uriSource;
-
-      // Ignore if invalid URI.
-      if (uriSource == null) {
-        return null;
-      }
-
-      var importUri = uriSource.uri;
-      if (importUri.scheme != 'package') {
-        return null;
-      }
-
-      // Don't offer to convert a 'package:' URI to itself.
-      try {
-        if (Uri.parse(importDirective.uriContent).scheme == 'package') {
-          return null;
-        }
-      } on FormatException {
-        return null;
-      }
-
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (builder) {
-        builder.addSimpleReplacement(
-          range.node(importDirective.uri),
-          "'$importUri'",
-        );
-      });
-      return changeBuilder;
-    }
-    return null;
-  }
-
-  Future<ChangeBuilder> createBuilder_convertToRelativeImport() async {
-    var node = this.node;
-    if (node is StringLiteral) {
-      node = node.parent;
-    }
-    if (node is! ImportDirective) {
-      return null;
-    }
-
-    ImportDirective importDirective = node;
-
-    // Ignore if invalid URI.
-    if (importDirective.uriSource == null) {
-      return null;
-    }
-
-    // Ignore if the uri is not a package: uri.
-    var sourceUri = resolvedResult.uri;
-    if (sourceUri.scheme != 'package') {
-      return null;
-    }
-
-    Uri importUri;
-    try {
-      importUri = Uri.parse(importDirective.uriContent);
-    } on FormatException {
-      return null;
-    }
-
-    // Ignore if import uri is not a package: uri.
-    if (importUri.scheme != 'package') {
-      return null;
-    }
-
-    // Verify that the source's uri and the import uri have the same package
-    // name.
-    var sourceSegments = sourceUri.pathSegments;
-    var importSegments = importUri.pathSegments;
-    if (sourceSegments.isEmpty ||
-        importSegments.isEmpty ||
-        sourceSegments.first != importSegments.first) {
-      return null;
-    }
-
-    // We only write posix style paths in import directives.
-    var relativePath = path.posix.relative(
-      importUri.path,
-      from: path.dirname(sourceUri.path),
-    );
-
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (builder) {
-      builder.addSimpleReplacement(
-        range.node(importDirective.uri).getExpanded(-1),
-        relativePath,
-      );
-    });
-    return changeBuilder;
-  }
-
-  Future<ChangeBuilder> createBuilder_inlineAdd() async {
-    var node = this.node;
-    if (node is! SimpleIdentifier || node.parent is! MethodInvocation) {
-      _coverageMarker();
-      return null;
-    }
-    SimpleIdentifier name = node;
-    MethodInvocation invocation = node.parent;
-    if (name != invocation.methodName ||
-        name.name != 'add' ||
-        !invocation.isCascaded ||
-        invocation.argumentList.arguments.length != 1) {
-      _coverageMarker();
-      return null;
-    }
-    var cascade = invocation.thisOrAncestorOfType<CascadeExpression>();
-    var sections = cascade.cascadeSections;
-    var target = cascade.target;
-    if (target is! ListLiteral || sections[0] != invocation) {
-      // TODO(brianwilkerson) Consider extending this to handle set literals.
-      _coverageMarker();
-      return null;
-    }
-    ListLiteral list = target;
-    var argument = invocation.argumentList.arguments[0];
-    var elementText = utils.getNodeText(argument);
-
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      if (list.elements.isNotEmpty) {
-        // ['a']..add(e);
-        builder.addSimpleInsertion(list.elements.last.end, ', $elementText');
-      } else {
-        // []..add(e);
-        builder.addSimpleInsertion(list.leftBracket.end, elementText);
-      }
-      builder.addDeletion(range.node(invocation));
-    });
-    return changeBuilder;
-  }
-
-  /// todo (pq): unify with similar behavior in fix.
-  Future<ChangeBuilder> createBuilder_removeTypeAnnotation() async {
-    var declarationList = node.thisOrAncestorOfType<VariableDeclarationList>();
-    if (declarationList == null) {
-      var declaration = node.thisOrAncestorOfType<DeclaredIdentifier>();
-      if (declaration == null) {
-        _coverageMarker();
-        return null;
-      }
-      var typeNode = declaration.type;
-      if (typeNode == null) {
-        _coverageMarker();
-        return null;
-      }
-      var keyword = declaration.keyword;
-      var variableName = declaration.identifier;
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        var typeRange = range.startStart(typeNode, variableName);
-        if (keyword != null && keyword.lexeme != 'var') {
-          builder.addSimpleReplacement(typeRange, '');
-        } else {
-          builder.addSimpleReplacement(typeRange, 'var ');
-        }
-      });
-      return changeBuilder;
-    }
-    // we need a type
-    var typeNode = declarationList.type;
-    if (typeNode == null) {
-      _coverageMarker();
-      return null;
-    }
-    // ignore if an incomplete variable declaration
-    if (declarationList.variables.length == 1 &&
-        declarationList.variables[0].name.isSynthetic) {
-      _coverageMarker();
-      return null;
-    }
-    // must be not after the name of the variable
-    var firstVariable = declarationList.variables[0];
-    if (selectionOffset > firstVariable.name.end) {
-      _coverageMarker();
-      return null;
-    }
-    // The variable must have an initializer, otherwise there is no other
-    // source for its type.
-    if (firstVariable.initializer == null) {
-      _coverageMarker();
-      return null;
-    }
-    var keyword = declarationList.keyword;
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      var typeRange = range.startStart(typeNode, firstVariable);
-      if (keyword != null && keyword.lexeme != 'var') {
-        builder.addSimpleReplacement(typeRange, '');
-      } else {
-        builder.addSimpleReplacement(typeRange, 'var ');
-      }
-    });
-    return changeBuilder;
-  }
-
-  Future<ChangeBuilder> createBuilder_replaceWithVar() async {
-    var type = node.thisOrAncestorOfType<TypeAnnotation>();
-    if (type == null) {
-      return null;
-    }
-    var parent = type.parent;
-    var grandparent = parent?.parent;
-    if (parent is VariableDeclarationList &&
-        (grandparent is VariableDeclarationStatement ||
-            grandparent is ForPartsWithDeclarations)) {
-      var variables = parent.variables;
-      if (variables.length != 1) {
-        return null;
-      }
-      var initializer = variables[0].initializer;
-      String typeArgumentsText;
-      int typeArgumentsOffset;
-      if (type is NamedType && type.typeArguments != null) {
-        if (initializer is TypedLiteral) {
-          if (initializer.typeArguments == null) {
-            typeArgumentsText = utils.getNodeText(type.typeArguments);
-            typeArgumentsOffset = initializer.offset;
-          }
-        } else if (initializer is InstanceCreationExpression) {
-          if (initializer.constructorName.type.typeArguments == null) {
-            typeArgumentsText = utils.getNodeText(type.typeArguments);
-            typeArgumentsOffset = initializer.constructorName.type.end;
-          }
-        }
-      }
-      if (initializer is SetOrMapLiteral &&
-          initializer.typeArguments == null &&
-          typeArgumentsText == null) {
-        // TODO(brianwilkerson) This is to prevent the fix from converting a
-        //  valid map or set literal into an ambiguous literal. We could apply
-        //  this in more places by examining the elements of the collection.
-        return null;
-      }
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addSimpleReplacement(range.node(type), 'var');
-        if (typeArgumentsText != null) {
-          builder.addSimpleInsertion(typeArgumentsOffset, typeArgumentsText);
-        }
-      });
-      return changeBuilder;
-    } else if (parent is DeclaredIdentifier &&
-        grandparent is ForEachPartsWithDeclaration) {
-      String typeArgumentsText;
-      int typeArgumentsOffset;
-      if (type is NamedType && type.typeArguments != null) {
-        var iterable = grandparent.iterable;
-        if (iterable is TypedLiteral && iterable.typeArguments == null) {
-          typeArgumentsText = utils.getNodeText(type.typeArguments);
-          typeArgumentsOffset = iterable.offset;
-        }
-      }
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addSimpleReplacement(range.node(type), 'var');
-        if (typeArgumentsText != null) {
-          builder.addSimpleInsertion(typeArgumentsOffset, typeArgumentsText);
-        }
-      });
-      return changeBuilder;
-    }
-    return null;
-  }
-
-  Future<ChangeBuilder> createBuilder_sortChildPropertyLast() async {
-    var childProp = flutter.findNamedExpression(node, 'child');
-    childProp ??= flutter.findNamedExpression(node, 'children');
-    if (childProp == null) {
-      return null;
-    }
-
-    var parent = childProp.parent?.parent;
-    if (parent is! InstanceCreationExpression ||
-        !flutter.isWidgetCreation(parent)) {
-      return null;
-    }
-
-    InstanceCreationExpression creationExpression = parent;
-    var args = creationExpression.argumentList;
-
-    var last = args.arguments.last;
-    if (last == childProp) {
-      // Already sorted.
-      return null;
-    }
-
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      var start = childProp.beginToken.previous.end;
-      var end = childProp.endToken.next.end;
-      var childRange = range.startOffsetEndOffset(start, end);
-
-      var childText = utils.getRangeText(childRange);
-      builder.addSimpleReplacement(childRange, '');
-      builder.addSimpleInsertion(last.end + 1, childText);
-
-      changeBuilder.setSelection(Position(file, last.end + 1));
-    });
-
-    return changeBuilder;
-  }
-
-  @protected
-  Future<ChangeBuilder> createBuilder_useCurlyBraces() async {
-    Future<ChangeBuilder> doStatement(DoStatement node) async {
-      var body = node.body;
-      if (body is Block) return null;
-
-      var prefix = utils.getLinePrefix(node.offset);
-      var indent = prefix + utils.getIndent(1);
-
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (builder) {
-        builder.addSimpleReplacement(
-          range.endStart(node.doKeyword, body),
-          ' {$eol$indent',
-        );
-        builder.addSimpleReplacement(
-          range.endStart(body, node.whileKeyword),
-          '$eol$prefix} ',
-        );
-      });
-      return changeBuilder;
-    }
-
-    Future<ChangeBuilder> forStatement(ForStatement node) async {
-      var body = node.body;
-      if (body is Block) return null;
-
-      var prefix = utils.getLinePrefix(node.offset);
-      var indent = prefix + utils.getIndent(1);
-
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (builder) {
-        builder.addSimpleReplacement(
-          range.endStart(node.rightParenthesis, body),
-          ' {$eol$indent',
-        );
-        builder.addSimpleInsertion(body.end, '$eol$prefix}');
-      });
-
-      return changeBuilder;
-    }
-
-    Future<ChangeBuilder> ifStatement(
-        IfStatement node, Statement thenOrElse) async {
-      var prefix = utils.getLinePrefix(node.offset);
-      var indent = prefix + utils.getIndent(1);
-
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (builder) {
-        var thenStatement = node.thenStatement;
-        if (thenStatement is! Block &&
-            (thenOrElse == null || thenOrElse == thenStatement)) {
-          builder.addSimpleReplacement(
-            range.endStart(node.rightParenthesis, thenStatement),
-            ' {$eol$indent',
-          );
-          if (node.elseKeyword != null) {
-            builder.addSimpleReplacement(
-              range.endStart(thenStatement, node.elseKeyword),
-              '$eol$prefix} ',
-            );
-          } else {
-            builder.addSimpleInsertion(thenStatement.end, '$eol$prefix}');
-          }
-        }
-
-        var elseStatement = node.elseStatement;
-        if (elseStatement != null &&
-            elseStatement is! Block &&
-            (thenOrElse == null || thenOrElse == elseStatement)) {
-          builder.addSimpleReplacement(
-            range.endStart(node.elseKeyword, elseStatement),
-            ' {$eol$indent',
-          );
-          builder.addSimpleInsertion(elseStatement.end, '$eol$prefix}');
-        }
-      });
-
-      return changeBuilder;
-    }
-
-    Future<ChangeBuilder> whileStatement(WhileStatement node) async {
-      var body = node.body;
-      if (body is Block) return null;
-
-      var prefix = utils.getLinePrefix(node.offset);
-      var indent = prefix + utils.getIndent(1);
-
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (builder) {
-        builder.addSimpleReplacement(
-          range.endStart(node.rightParenthesis, body),
-          ' {$eol$indent',
-        );
-        builder.addSimpleInsertion(body.end, '$eol$prefix}');
-      });
-      return changeBuilder;
-    }
-
-    var statement = node.thisOrAncestorOfType<Statement>();
-    var parent = statement?.parent;
-
-    if (statement is DoStatement) {
-      return doStatement(statement);
-    } else if (parent is DoStatement) {
-      return doStatement(parent);
-    } else if (statement is ForStatement) {
-      return forStatement(statement);
-    } else if (parent is ForStatement) {
-      return forStatement(parent);
-    } else if (statement is IfStatement) {
-      if (statement.elseKeyword != null &&
-          range.token(statement.elseKeyword).contains(selectionOffset)) {
-        return ifStatement(statement, statement.elseStatement);
-      } else {
-        return ifStatement(statement, null);
-      }
-    } else if (parent is IfStatement) {
-      return ifStatement(parent, statement);
-    } else if (statement is WhileStatement) {
-      return whileStatement(statement);
-    } else if (parent is WhileStatement) {
-      return whileStatement(parent);
-    }
-    return null;
-  }
-
-  FunctionBody getEnclosingFunctionBody() {
-    // TODO(brianwilkerson) Determine whether there is a reason why this method
-    // isn't just "return node.getAncestor((node) => node is FunctionBody);"
-    {
-      var function = node.thisOrAncestorOfType<FunctionExpression>();
-      if (function != null) {
-        return function.body;
-      }
-    }
-    {
-      var function = node.thisOrAncestorOfType<FunctionDeclaration>();
-      if (function != null) {
-        return function.functionExpression.body;
-      }
-    }
-    {
-      var constructor = node.thisOrAncestorOfType<ConstructorDeclaration>();
-      if (constructor != null) {
-        return constructor.body;
-      }
-    }
-    {
-      var method = node.thisOrAncestorOfType<MethodDeclaration>();
-      if (method != null) {
-        return method.body;
-      }
-    }
-    return null;
-  }
-
-  bool isEnum(DartType type) {
-    final element = type.element;
-    return element is ClassElement && element.isEnum;
-  }
-
-  bool isIterable(DartType type) {
-    if (type is! InterfaceType) {
-      return false;
-    }
-
-    ClassElement element = type.element;
-
-    bool isExactIterable(ClassElement element) {
-      return element?.name == 'Iterable' && element.library.isDartCore;
-    }
-
-    if (isExactIterable(element)) {
-      return true;
-    }
-    for (var type in element.allSupertypes) {
-      if (isExactIterable(type.element)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
   @protected
   bool setupCompute() {
     final locator = NodeLocator(selectionOffset, selectionEnd);
     node = locator.searchWithin(resolvedResult.unit);
     return node != null;
   }
-
-  /// Return `true` if all of the parameters in the given list of [parameters]
-  /// have an explicit type annotation.
-  bool _allParametersHaveTypes(FormalParameterList parameters) {
-    for (var parameter in parameters.parameters) {
-      if (parameter is DefaultFormalParameter) {
-        parameter = (parameter as DefaultFormalParameter).parameter;
-      }
-      if (parameter is SimpleFormalParameter) {
-        if (parameter.type == null) {
-          return false;
-        }
-      } else if (parameter is! FunctionTypedFormalParameter) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  /// Configures [utils] using given [target].
-  void _configureTargetLocation(Object target) {
-    utils.targetClassElement = null;
-    if (target is AstNode) {
-      var targetClassDeclaration =
-          target.thisOrAncestorOfType<ClassDeclaration>();
-      if (targetClassDeclaration != null) {
-        utils.targetClassElement = targetClassDeclaration.declaredElement;
-      }
-    }
-  }
-
-  Future<ChangeBuilder>
-      _createBuilder_convertFunctionTypeAliasToGenericTypeAlias(
-          FunctionTypeAlias node) async {
-    if (!_allParametersHaveTypes(node.parameters)) {
-      return null;
-    }
-    String returnType;
-    if (node.returnType != null) {
-      returnType = utils.getNodeText(node.returnType);
-    }
-    var functionName = utils.getRangeText(
-        range.startEnd(node.name, node.typeParameters ?? node.name));
-    var parameters = utils.getNodeText(node.parameters);
-    String replacement;
-    if (returnType == null) {
-      replacement = '$functionName = Function$parameters';
-    } else {
-      replacement = '$functionName = $returnType Function$parameters';
-    }
-    // add change
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addSimpleReplacement(
-          range.startStart(node.typedefKeyword.next, node.semicolon),
-          replacement);
-    });
-    return changeBuilder;
-  }
-
-  Future<ChangeBuilder>
-      _createBuilder_convertFunctionTypedFormalParameterToGenericTypeAlias(
-          FunctionTypedFormalParameter node) async {
-    if (!_allParametersHaveTypes(node.parameters)) {
-      return null;
-    }
-    String returnType;
-    if (node.returnType != null) {
-      returnType = utils.getNodeText(node.returnType);
-    }
-    var functionName = utils.getRangeText(range.startEnd(
-        node.identifier, node.typeParameters ?? node.identifier));
-    var parameters = utils.getNodeText(node.parameters);
-    String replacement;
-    if (returnType == null) {
-      replacement = 'Function$parameters $functionName';
-    } else {
-      replacement = '$returnType Function$parameters $functionName';
-    }
-    // add change
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addSimpleReplacement(range.node(node), replacement);
-    });
-    return changeBuilder;
-  }
-
-  /// Returns the text of the given node in the unit.
-  String /* TODO (pq): make visible */ _getNodeText(AstNode node) =>
-      utils.getNodeText(node);
-
-  DartChangeBuilder _newDartChangeBuilder() =>
-      DartChangeBuilderImpl.forWorkspace(workspace);
-
-  /// This method does nothing, but we invoke it in places where Dart VM
-  /// coverage agent fails to provide coverage information - such as almost
-  /// all "return" statements.
-  ///
-  /// https://code.google.com/p/dart/issues/detail?id=19912
-  static void _coverageMarker() {}
-}
-
-class ConvertToSpreadCollectionsChange {
-  ChangeBuilder builder;
-  List<String> args;
-  bool isLineInvocation = false;
-}
-
-/// A visitor that can be used to find references to a parameter.
-class _ParameterReferenceFinder extends RecursiveAstVisitor<void> {
-  /// The parameter for which references are being sought, or `null` if we are
-  /// just accumulating a list of referenced names.
-  final ParameterElement parameter;
-
-  /// A list of the simple identifiers that reference the [parameter].
-  final List<SimpleIdentifier> references = <SimpleIdentifier>[];
-
-  /// A collection of the names of other simple identifiers that were found. We
-  /// need to know these in order to ensure that the selected loop variable does
-  /// not hide a name from an enclosing scope that is already being referenced.
-  final Set<String> otherNames = <String>{};
-
-  /// Initialize a newly created finder to find references to the [parameter].
-  _ParameterReferenceFinder(this.parameter) : assert(parameter != null);
-
-  /// Return `true` if the parameter is unreferenced in the nodes that have been
-  /// visited.
-  bool get isParameterUnreferenced => references.isEmpty;
-
-  /// Return `true` is the given name (assumed to be different than the name of
-  /// the parameter) is references in the nodes that have been visited.
-  bool referencesName(String name) => otherNames.contains(name);
-
-  /// Replace all of the references to the parameter in the given [source] with
-  /// the [newName]. The [offset] is the offset of the first character of the
-  /// [source] relative to the start of the file.
-  String replaceName(String source, String newName, int offset) {
-    var oldLength = parameter.name.length;
-    for (var i = references.length - 1; i >= 0; i--) {
-      var oldOffset = references[i].offset - offset;
-      source = source.replaceRange(oldOffset, oldOffset + oldLength, newName);
-    }
-    return source;
-  }
-
-  @override
-  void visitSimpleIdentifier(SimpleIdentifier node) {
-    if (node.staticElement == parameter) {
-      references.add(node);
-    } else if (!node.isQualified) {
-      // Only non-prefixed identifiers can be hidden.
-      otherNames.add(node.name);
-    }
-  }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
index 9f7282e..e624242 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
@@ -65,6 +65,28 @@
     _context = context;
   }
 
+  /// Return the function body of the most deeply nested method or function that
+  /// encloses the [node], or `null` if the node is not in a method or function.
+  FunctionBody getEnclosingFunctionBody() {
+    var closure = node.thisOrAncestorOfType<FunctionExpression>();
+    if (closure != null) {
+      return closure.body;
+    }
+    var function = node.thisOrAncestorOfType<FunctionDeclaration>();
+    if (function != null) {
+      return function.functionExpression.body;
+    }
+    var constructor = node.thisOrAncestorOfType<ConstructorDeclaration>();
+    if (constructor != null) {
+      return constructor.body;
+    }
+    var method = node.thisOrAncestorOfType<MethodDeclaration>();
+    if (method != null) {
+      return method.body;
+    }
+    return null;
+  }
+
   /// Return the text of the given [range] in the unit.
   String getRangeText(SourceRange range) {
     return utils.getRangeText(range);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
new file mode 100644
index 0000000..292bee5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
@@ -0,0 +1,211 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:meta/meta.dart';
+
+class AddDiagnosticPropertyReference extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.ADD_DIAGNOSTIC_PROPERTY_REFERENCE;
+
+  @override
+  FixKind get fixKind => DartFixKind.ADD_DIAGNOSTIC_PROPERTY_REFERENCE;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    final node = this.node;
+    if (node is! SimpleIdentifier) {
+      return;
+    }
+    SimpleIdentifier name = node;
+    final parent = node.parent;
+
+    var type = _getReturnType(parent);
+    if (type == null) {
+      return;
+    }
+
+    var constructorId;
+    var typeArgs;
+    var constructorName = '';
+
+    if (type.element is FunctionTypedElement) {
+      constructorId = 'ObjectFlagProperty';
+      typeArgs = [type];
+      constructorName = '.has';
+    } else if (type.isDartCoreInt) {
+      constructorId = 'IntProperty';
+    } else if (type.isDartCoreDouble) {
+      constructorId = 'DoubleProperty';
+    } else if (type.isDartCoreString) {
+      constructorId = 'StringProperty';
+    } else if (_isEnum(type)) {
+      constructorId = 'EnumProperty';
+      typeArgs = [type];
+    } else if (_isIterable(type)) {
+      constructorId = 'IterableProperty';
+      typeArgs = (type as InterfaceType).typeArguments;
+    } else if (flutter.isColor(type)) {
+      constructorId = 'ColorProperty';
+    } else if (flutter.isMatrix4(type)) {
+      constructorId = 'TransformProperty';
+    } else {
+      constructorId = 'DiagnosticsProperty';
+      if (!type.isDynamic) {
+        typeArgs = [type];
+      }
+    }
+
+    void writePropertyReference(
+      DartEditBuilder builder, {
+      @required String prefix,
+      @required String builderName,
+    }) {
+      builder.write('$prefix$builderName.add($constructorId');
+      if (typeArgs != null) {
+        builder.write('<');
+        builder.writeTypes(typeArgs);
+        builder.write('>');
+      } else if (type.isDynamic) {
+        TypeAnnotation declType;
+        final decl = node.thisOrAncestorOfType<VariableDeclarationList>();
+        if (decl != null) {
+          declType = decl.type;
+          // getter
+        } else if (parent is MethodDeclaration) {
+          declType = parent.returnType;
+        }
+
+        if (declType != null) {
+          final typeText = utils.getNodeText(declType);
+          if (typeText != 'dynamic') {
+            builder.write('<');
+            builder.write(utils.getNodeText(declType));
+            builder.write('>');
+          }
+        }
+      }
+      builder.writeln("$constructorName('${name.name}', ${name.name}));");
+    }
+
+    final classDeclaration = parent.thisOrAncestorOfType<ClassDeclaration>();
+    final debugFillProperties =
+        classDeclaration.getMethod('debugFillProperties');
+    if (debugFillProperties == null) {
+      final insertOffset =
+          utils.prepareNewMethodLocation(classDeclaration).offset;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addInsertion(utils.getLineNext(insertOffset),
+            (DartEditBuilder builder) {
+          final declPrefix =
+              utils.getLinePrefix(classDeclaration.offset) + utils.getIndent(1);
+          final bodyPrefix = declPrefix + utils.getIndent(1);
+
+          builder.writeln('$declPrefix@override');
+          builder.writeln(
+              '${declPrefix}void debugFillProperties(DiagnosticPropertiesBuilder properties) {');
+          builder
+              .writeln('${bodyPrefix}super.debugFillProperties(properties);');
+          writePropertyReference(builder,
+              prefix: bodyPrefix, builderName: 'properties');
+          builder.writeln('$declPrefix}');
+        });
+      });
+      return;
+    }
+
+    final body = debugFillProperties.body;
+    if (body is BlockFunctionBody) {
+      var functionBody = body;
+
+      var offset;
+      var prefix;
+      if (functionBody.block.statements.isEmpty) {
+        offset = functionBody.block.leftBracket.offset;
+        prefix = utils.getLinePrefix(offset) + utils.getIndent(1);
+      } else {
+        offset = functionBody.block.statements.last.endToken.offset;
+        prefix = utils.getLinePrefix(offset);
+      }
+
+      var parameters = debugFillProperties.parameters.parameters;
+      var propertiesBuilderName;
+      for (var parameter in parameters) {
+        if (parameter is SimpleFormalParameter) {
+          final type = parameter.type;
+          if (type is TypeName) {
+            if (type.name.name == 'DiagnosticPropertiesBuilder') {
+              propertiesBuilderName = parameter.identifier.name;
+              break;
+            }
+          }
+        }
+      }
+      if (propertiesBuilderName == null) {
+        return null;
+      }
+
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addInsertion(utils.getLineNext(offset),
+            (DartEditBuilder builder) {
+          writePropertyReference(builder,
+              prefix: prefix, builderName: propertiesBuilderName);
+        });
+      });
+    }
+  }
+
+  /// Return the return type of the given [node].
+  DartType _getReturnType(AstNode node) {
+    if (node is MethodDeclaration) {
+      // Getter.
+      var element = node.declaredElement;
+      if (element is PropertyAccessorElement) {
+        return element.returnType;
+      }
+    } else if (node is VariableDeclaration) {
+      // Field.
+      var element = node.declaredElement;
+      if (element is FieldElement) {
+        return element.type;
+      }
+    }
+    return null;
+  }
+
+  bool _isEnum(DartType type) {
+    final element = type.element;
+    return element is ClassElement && element.isEnum;
+  }
+
+  bool _isIterable(DartType type) {
+    if (type is! InterfaceType) {
+      return false;
+    }
+
+    ClassElement element = type.element;
+
+    bool isExactIterable(ClassElement element) {
+      return element?.name == 'Iterable' && element.library.isDartCore;
+    }
+
+    if (isExactIterable(element)) {
+      return true;
+    }
+    for (var type in element.allSupertypes) {
+      if (isExactIterable(type.element)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
new file mode 100644
index 0000000..b8a8824
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
@@ -0,0 +1,198 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class AddTypeAnnotation extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.ADD_TYPE_ANNOTATION;
+
+  @override
+  FixKind get fixKind => DartFixKind.ADD_TYPE_ANNOTATION;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var node = this.node;
+    if (node is SimpleIdentifier) {
+      var parent = node.parent;
+      if (parent is SimpleFormalParameter) {
+        await _forSimpleFormalParameter(builder, node, parent);
+        return;
+      }
+    }
+    while (node != null) {
+      if (node is VariableDeclarationList) {
+        await _forVariableDeclaration(builder, node);
+        return;
+      } else if (node is DeclaredIdentifier) {
+        await _forDeclaredIdentifier(builder, node);
+        return;
+      } else if (node is ForStatement) {
+        var forLoopParts = node.forLoopParts;
+        if (forLoopParts is ForEachParts) {
+          var offset = this.node.offset;
+          if (forLoopParts.iterable != null &&
+              offset < forLoopParts.iterable.offset) {
+            if (forLoopParts is ForEachPartsWithDeclaration) {
+              await _forDeclaredIdentifier(builder, forLoopParts.loopVariable);
+            }
+          }
+        }
+        return;
+      }
+      node = node.parent;
+    }
+  }
+
+  /// Configure the [utils] using the given [target].
+  void _configureTargetLocation(Object target) {
+    utils.targetClassElement = null;
+    if (target is AstNode) {
+      var targetClassDeclaration =
+          target.thisOrAncestorOfType<ClassDeclaration>();
+      if (targetClassDeclaration != null) {
+        utils.targetClassElement = targetClassDeclaration.declaredElement;
+      }
+    }
+  }
+
+  Future<void> _forDeclaredIdentifier(
+      DartChangeBuilder builder, DeclaredIdentifier declaredIdentifier) async {
+    // Ensure that there isn't already a type annotation.
+    if (declaredIdentifier.type != null) {
+      return;
+    }
+    var type = declaredIdentifier.declaredElement.type;
+    if (type is! InterfaceType && type is! FunctionType) {
+      return;
+    }
+    _configureTargetLocation(node);
+
+    Future<bool> applyChange(DartChangeBuilder builder) async {
+      var validChange = true;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        var keyword = declaredIdentifier.keyword;
+        if (keyword.keyword == Keyword.VAR) {
+          builder.addReplacement(range.token(keyword),
+              (DartEditBuilder builder) {
+            validChange = builder.writeType(type);
+          });
+        } else {
+          builder.addInsertion(declaredIdentifier.identifier.offset,
+              (DartEditBuilder builder) {
+            validChange = builder.writeType(type);
+            builder.write(' ');
+          });
+        }
+      });
+      return validChange;
+    }
+
+    if (await applyChange(_temporaryBuilder(builder))) {
+      await applyChange(builder);
+    }
+  }
+
+  Future<void> _forSimpleFormalParameter(DartChangeBuilder builder,
+      SimpleIdentifier name, SimpleFormalParameter parameter) async {
+    // Ensure that there isn't already a type annotation.
+    if (parameter.type != null) {
+      return;
+    }
+    // Prepare the type.
+    var type = parameter.declaredElement.type;
+    // TODO(scheglov) If the parameter is in a method declaration, and if the
+    // method overrides a method that has a type for the corresponding
+    // parameter, it would be nice to copy down the type from the overridden
+    // method.
+    if (type is! InterfaceType) {
+      return;
+    }
+    _configureTargetLocation(node);
+
+    Future<bool> applyChange(DartChangeBuilder builder) async {
+      var validChange = true;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addInsertion(name.offset, (DartEditBuilder builder) {
+          validChange = builder.writeType(type);
+          if (validChange) {
+            builder.write(' ');
+          }
+        });
+      });
+      return validChange;
+    }
+
+    if (await applyChange(_temporaryBuilder(builder))) {
+      await applyChange(builder);
+    }
+  }
+
+  Future<void> _forVariableDeclaration(DartChangeBuilder builder,
+      VariableDeclarationList declarationList) async {
+    // Ensure that there isn't already a type annotation.
+    if (declarationList.type != null) {
+      return;
+    }
+    // Ensure that there is a single VariableDeclaration.
+    List<VariableDeclaration> variables = declarationList.variables;
+    if (variables.length != 1) {
+      return;
+    }
+    var variable = variables[0];
+    // Ensure that the selection is not after the name of the variable.
+    if (selectionOffset > variable.name.end) {
+      return;
+    }
+    // Ensure that there is an initializer to get the type from.
+    var initializer = variable.initializer;
+    if (initializer == null) {
+      return;
+    }
+    var type = initializer.staticType;
+    // prepare type source
+    if ((type is! InterfaceType || type.isDartCoreNull) &&
+        type is! FunctionType) {
+      return;
+    }
+    _configureTargetLocation(node);
+
+    Future<bool> applyChange(DartChangeBuilder builder) async {
+      var validChange = true;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        var keyword = declarationList.keyword;
+        if (keyword?.keyword == Keyword.VAR) {
+          builder.addReplacement(range.token(keyword),
+              (DartEditBuilder builder) {
+            validChange = builder.writeType(type);
+          });
+        } else {
+          builder.addInsertion(variable.offset, (DartEditBuilder builder) {
+            validChange = builder.writeType(type);
+            builder.write(' ');
+          });
+        }
+      });
+      return validChange;
+    }
+
+    if (await applyChange(_temporaryBuilder(builder))) {
+      await applyChange(builder);
+    }
+  }
+
+  DartChangeBuilder _temporaryBuilder(DartChangeBuilder builder) =>
+      DartChangeBuilderImpl.forWorkspace(
+          (builder as DartChangeBuilderImpl).workspace);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_add_all_to_spread.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_add_all_to_spread.dart
new file mode 100644
index 0000000..f1099b6
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_add_all_to_spread.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ConvertAddAllToSpread extends CorrectionProducer {
+  /// The arguments used to compose the message.
+  List<String> args;
+
+  /// A flag indicating whether the change that was built is one that inlines
+  /// the elements of another list into the target list.
+  bool isInlineInvocation = false;
+
+  @override
+  List<Object> get assistArguments => args;
+
+  @override
+  AssistKind get assistKind => isInlineInvocation
+      ? DartAssistKind.INLINE_INVOCATION
+      : DartAssistKind.CONVERT_TO_SPREAD;
+
+  @override
+  List<Object> get fixArguments => args;
+
+  @override
+  FixKind get fixKind => isInlineInvocation
+      ? DartFixKind.INLINE_INVOCATION
+      : DartFixKind.CONVERT_TO_SPREAD;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var node = this.node;
+    if (node is! SimpleIdentifier || node.parent is! MethodInvocation) {
+      return;
+    }
+    SimpleIdentifier name = node;
+    MethodInvocation invocation = node.parent;
+    if (name != invocation.methodName ||
+        name.name != 'addAll' ||
+        !invocation.isCascaded ||
+        invocation.argumentList.arguments.length != 1) {
+      return;
+    }
+    var cascade = invocation.thisOrAncestorOfType<CascadeExpression>();
+    var sections = cascade.cascadeSections;
+    var target = cascade.target;
+    if (target is! ListLiteral || sections[0] != invocation) {
+      // TODO(brianwilkerson) Consider extending this to handle set literals.
+      return;
+    }
+
+    bool isEmptyListLiteral(Expression expression) =>
+        expression is ListLiteral && expression.elements.isEmpty;
+
+    ListLiteral list = target;
+    var argument = invocation.argumentList.arguments[0];
+    String elementText;
+    if (argument is BinaryExpression &&
+        argument.operator.type == TokenType.QUESTION_QUESTION) {
+      var right = argument.rightOperand;
+      if (isEmptyListLiteral(right)) {
+        // ..addAll(things ?? const [])
+        // ..addAll(things ?? [])
+        elementText = '...?${utils.getNodeText(argument.leftOperand)}';
+      }
+    } else if (argument is ConditionalExpression) {
+      var elseExpression = argument.elseExpression;
+      if (isEmptyListLiteral(elseExpression)) {
+        // ..addAll(condition ? things : const [])
+        // ..addAll(condition ? things : [])
+        var conditionText = utils.getNodeText(argument.condition);
+        var thenText = utils.getNodeText(argument.thenExpression);
+        elementText = 'if ($conditionText) ...$thenText';
+      }
+    } else if (argument is ListLiteral) {
+      // ..addAll([ ... ])
+      var elements = argument.elements;
+      if (elements.isEmpty) {
+        // TODO(brianwilkerson) Consider adding a cleanup for the empty list
+        //  case. We can essentially remove the whole invocation because it does
+        //  nothing.
+        return null;
+      }
+      var startOffset = elements.first.offset;
+      var endOffset = elements.last.end;
+      elementText = utils.getText(startOffset, endOffset - startOffset);
+      args = ['addAll'];
+      isInlineInvocation = true;
+    }
+    elementText ??= '...${utils.getNodeText(argument)}';
+
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      if (list.elements.isNotEmpty) {
+        // ['a']..addAll(['b', 'c']);
+        builder.addSimpleInsertion(list.elements.last.end, ', $elementText');
+      } else {
+        // []..addAll(['b', 'c']);
+        builder.addSimpleInsertion(list.leftBracket.end, elementText);
+      }
+      builder.addDeletion(range.node(invocation));
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_conditional_expression_to_if_element.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_conditional_expression_to_if_element.dart
new file mode 100644
index 0000000..1a2e32f
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_conditional_expression_to_if_element.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ConvertConditionalExpressionToIfElement extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.CONVERT_TO_IF_ELEMENT;
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_IF_ELEMENT;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    AstNode node = this.node.thisOrAncestorOfType<ConditionalExpression>();
+    if (node == null) {
+      return null;
+    }
+    var nodeToReplace = node;
+    var parent = node.parent;
+    while (parent is ParenthesizedExpression) {
+      nodeToReplace = parent;
+      parent = parent.parent;
+    }
+    if (parent is ListLiteral || (parent is SetOrMapLiteral && parent.isSet)) {
+      ConditionalExpression conditional = node;
+      var condition = conditional.condition.unParenthesized;
+      var thenExpression = conditional.thenExpression.unParenthesized;
+      var elseExpression = conditional.elseExpression.unParenthesized;
+
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addReplacement(range.node(nodeToReplace),
+            (DartEditBuilder builder) {
+          builder.write('if (');
+          builder.write(utils.getNodeText(condition));
+          builder.write(') ');
+          builder.write(utils.getNodeText(thenExpression));
+          builder.write(' else ');
+          builder.write(utils.getNodeText(elseExpression));
+        });
+      });
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_documentation_into_line.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_documentation_into_line.dart
new file mode 100644
index 0000000..b87f9f6
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_documentation_into_line.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ConvertDocumentationIntoLine extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE;
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_LINE_COMMENT;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var comment = node.thisOrAncestorOfType<Comment>();
+    if (comment == null ||
+        !comment.isDocumentation ||
+        comment.tokens.length != 1) {
+      return null;
+    }
+    var token = comment.tokens.first;
+    if (token.type != TokenType.MULTI_LINE_COMMENT) {
+      return null;
+    }
+    var text = token.lexeme;
+    var lines = text.split('\n');
+    var prefix = utils.getNodePrefix(comment);
+    var newLines = <String>[];
+    var firstLine = true;
+    var linePrefix = '';
+    for (var line in lines) {
+      if (firstLine) {
+        firstLine = false;
+        var expectedPrefix = '/**';
+        if (!line.startsWith(expectedPrefix)) {
+          return null;
+        }
+        line = line.substring(expectedPrefix.length).trim();
+        if (line.isNotEmpty) {
+          newLines.add('/// $line');
+          linePrefix = eol + prefix;
+        }
+      } else {
+        if (line.startsWith(prefix + ' */')) {
+          break;
+        }
+        var expectedPrefix = prefix + ' *';
+        if (!line.startsWith(expectedPrefix)) {
+          return null;
+        }
+        line = line.substring(expectedPrefix.length);
+        if (line.isEmpty) {
+          newLines.add('$linePrefix///');
+        } else {
+          newLines.add('$linePrefix///$line');
+        }
+        linePrefix = eol + prefix;
+      }
+    }
+
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addReplacement(range.node(comment), (DartEditBuilder builder) {
+        for (var newLine in newLines) {
+          builder.write(newLine);
+        }
+      });
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
new file mode 100644
index 0000000..5d3108b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
@@ -0,0 +1,220 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ConvertMapFromIterableToForLiteral extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.CONVERT_TO_FOR_ELEMENT;
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_FOR_ELEMENT;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    //
+    // Ensure that the selection is inside an invocation of Map.fromIterable.
+    //
+    var creation = node.thisOrAncestorOfType<InstanceCreationExpression>();
+    if (creation == null) {
+      return null;
+    }
+    var element = creation.staticElement;
+    if (element == null ||
+        element.name != 'fromIterable' ||
+        element.enclosingElement != typeProvider.mapElement) {
+      return null;
+    }
+    //
+    // Ensure that the arguments have the right form.
+    //
+    var arguments = creation.argumentList.arguments;
+    if (arguments.length != 3) {
+      return null;
+    }
+    var iterator = arguments[0].unParenthesized;
+    var secondArg = arguments[1];
+    var thirdArg = arguments[2];
+
+    Expression extractBody(FunctionExpression expression) {
+      var body = expression.body;
+      if (body is ExpressionFunctionBody) {
+        return body.expression;
+      } else if (body is BlockFunctionBody) {
+        var statements = body.block.statements;
+        if (statements.length == 1) {
+          var statement = statements[0];
+          if (statement is ReturnStatement) {
+            return statement.expression;
+          }
+        }
+      }
+      return null;
+    }
+
+    FunctionExpression extractClosure(String name, Expression argument) {
+      if (argument is NamedExpression && argument.name.label.name == name) {
+        var expression = argument.expression.unParenthesized;
+        if (expression is FunctionExpression) {
+          var parameters = expression.parameters.parameters;
+          if (parameters.length == 1 && parameters[0].isRequiredPositional) {
+            if (extractBody(expression) != null) {
+              return expression;
+            }
+          }
+        }
+      }
+      return null;
+    }
+
+    var keyClosure =
+        extractClosure('key', secondArg) ?? extractClosure('key', thirdArg);
+    var valueClosure =
+        extractClosure('value', thirdArg) ?? extractClosure('value', secondArg);
+    if (keyClosure == null || valueClosure == null) {
+      return null;
+    }
+    //
+    // Compute the loop variable name and convert the key and value closures if
+    // necessary.
+    //
+    SimpleFormalParameter keyParameter = keyClosure.parameters.parameters[0];
+    var keyParameterName = keyParameter.identifier.name;
+    SimpleFormalParameter valueParameter =
+        valueClosure.parameters.parameters[0];
+    var valueParameterName = valueParameter.identifier.name;
+    var keyBody = extractBody(keyClosure);
+    var keyExpressionText = utils.getNodeText(keyBody);
+    var valueBody = extractBody(valueClosure);
+    var valueExpressionText = utils.getNodeText(valueBody);
+
+    String loopVariableName;
+    if (keyParameterName == valueParameterName) {
+      loopVariableName = keyParameterName;
+    } else {
+      var keyFinder = _ParameterReferenceFinder(keyParameter.declaredElement);
+      keyBody.accept(keyFinder);
+
+      var valueFinder =
+          _ParameterReferenceFinder(valueParameter.declaredElement);
+      valueBody.accept(valueFinder);
+
+      String computeUnusedVariableName() {
+        var candidate = 'e';
+        var index = 1;
+        while (keyFinder.referencesName(candidate) ||
+            valueFinder.referencesName(candidate)) {
+          candidate = 'e${index++}';
+        }
+        return candidate;
+      }
+
+      if (valueFinder.isParameterUnreferenced) {
+        if (valueFinder.referencesName(keyParameterName)) {
+          // The name of the value parameter is not used, but we can't use the
+          // name of the key parameter because doing so would hide a variable
+          // referenced in the value expression.
+          loopVariableName = computeUnusedVariableName();
+          keyExpressionText = keyFinder.replaceName(
+              keyExpressionText, loopVariableName, keyBody.offset);
+        } else {
+          loopVariableName = keyParameterName;
+        }
+      } else if (keyFinder.isParameterUnreferenced) {
+        if (keyFinder.referencesName(valueParameterName)) {
+          // The name of the key parameter is not used, but we can't use the
+          // name of the value parameter because doing so would hide a variable
+          // referenced in the key expression.
+          loopVariableName = computeUnusedVariableName();
+          valueExpressionText = valueFinder.replaceName(
+              valueExpressionText, loopVariableName, valueBody.offset);
+        } else {
+          loopVariableName = valueParameterName;
+        }
+      } else {
+        // The names are different and both are used. We need to find a name
+        // that would not change the resolution of any other identifiers in
+        // either the key or value expressions.
+        loopVariableName = computeUnusedVariableName();
+        keyExpressionText = keyFinder.replaceName(
+            keyExpressionText, loopVariableName, keyBody.offset);
+        valueExpressionText = valueFinder.replaceName(
+            valueExpressionText, loopVariableName, valueBody.offset);
+      }
+    }
+    //
+    // Construct the edit.
+    //
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addReplacement(range.node(creation), (DartEditBuilder builder) {
+        builder.write('{ for (var ');
+        builder.write(loopVariableName);
+        builder.write(' in ');
+        builder.write(utils.getNodeText(iterator));
+        builder.write(') ');
+        builder.write(keyExpressionText);
+        builder.write(' : ');
+        builder.write(valueExpressionText);
+        builder.write(' }');
+      });
+    });
+  }
+}
+
+/// A visitor that can be used to find references to a parameter.
+class _ParameterReferenceFinder extends RecursiveAstVisitor<void> {
+  /// The parameter for which references are being sought, or `null` if we are
+  /// just accumulating a list of referenced names.
+  final ParameterElement parameter;
+
+  /// A list of the simple identifiers that reference the [parameter].
+  final List<SimpleIdentifier> references = <SimpleIdentifier>[];
+
+  /// A collection of the names of other simple identifiers that were found. We
+  /// need to know these in order to ensure that the selected loop variable does
+  /// not hide a name from an enclosing scope that is already being referenced.
+  final Set<String> otherNames = <String>{};
+
+  /// Initialize a newly created finder to find references to the [parameter].
+  _ParameterReferenceFinder(this.parameter) : assert(parameter != null);
+
+  /// Return `true` if the parameter is unreferenced in the nodes that have been
+  /// visited.
+  bool get isParameterUnreferenced => references.isEmpty;
+
+  /// Return `true` is the given name (assumed to be different than the name of
+  /// the parameter) is references in the nodes that have been visited.
+  bool referencesName(String name) => otherNames.contains(name);
+
+  /// Replace all of the references to the parameter in the given [source] with
+  /// the [newName]. The [offset] is the offset of the first character of the
+  /// [source] relative to the start of the file.
+  String replaceName(String source, String newName, int offset) {
+    var oldLength = parameter.name.length;
+    for (var i = references.length - 1; i >= 0; i--) {
+      var oldOffset = references[i].offset - offset;
+      source = source.replaceRange(oldOffset, oldOffset + oldLength, newName);
+    }
+    return source;
+  }
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.staticElement == parameter) {
+      references.add(node);
+    } else if (!node.isQualified) {
+      // Only non-prefixed identifiers can be hidden.
+      otherNames.add(node.name);
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_quotes.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_quotes.dart
new file mode 100644
index 0000000..2e661fd
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_quotes.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+abstract class ConvertQuotes extends CorrectionProducer {
+  ConvertQuotes();
+
+  /// Return `true` if this producer is converting from double quotes to single
+  /// quotes, or `false` if it's converting from single quotes to double quotes.
+  bool get fromDouble;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is SimpleStringLiteral) {
+      SimpleStringLiteral literal = node;
+      if (fromDouble ? !literal.isSingleQuoted : literal.isSingleQuoted) {
+        var newQuote = literal.isMultiline
+            ? (fromDouble ? "'''" : '"""')
+            : (fromDouble ? "'" : '"');
+        var quoteLength = literal.isMultiline ? 3 : 1;
+        var lexeme = literal.literal.lexeme;
+        if (!lexeme.contains(newQuote)) {
+          await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+            builder.addSimpleReplacement(
+                SourceRange(
+                    literal.offset + (literal.isRaw ? 1 : 0), quoteLength),
+                newQuote);
+            builder.addSimpleReplacement(
+                SourceRange(literal.end - quoteLength, quoteLength), newQuote);
+          });
+        }
+      }
+    } else if (node is InterpolationString) {
+      StringInterpolation parent = node.parent;
+      if (fromDouble ? !parent.isSingleQuoted : parent.isSingleQuoted) {
+        var newQuote = parent.isMultiline
+            ? (fromDouble ? "'''" : '"""')
+            : (fromDouble ? "'" : '"');
+        var quoteLength = parent.isMultiline ? 3 : 1;
+        var elements = parent.elements;
+        for (var i = 0; i < elements.length; i++) {
+          var element = elements[i];
+          if (element is InterpolationString) {
+            var lexeme = element.contents.lexeme;
+            if (lexeme.contains(newQuote)) {
+              return null;
+            }
+          }
+        }
+        await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+          builder.addSimpleReplacement(
+              SourceRange(parent.offset + (parent.isRaw ? 1 : 0), quoteLength),
+              newQuote);
+          builder.addSimpleReplacement(
+              SourceRange(parent.end - quoteLength, quoteLength), newQuote);
+        });
+      }
+    }
+  }
+}
+
+class ConvertToDoubleQuotes extends ConvertQuotes {
+  ConvertToDoubleQuotes();
+
+  @override
+  AssistKind get assistKind => DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING;
+
+  @override
+  bool get fromDouble => false;
+}
+
+class ConvertToSingleQuotes extends ConvertQuotes {
+  ConvertToSingleQuotes();
+
+  @override
+  AssistKind get assistKind => DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING;
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_SINGLE_QUOTED_STRING;
+
+  @override
+  bool get fromDouble => true;
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_expression_function_body.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_expression_function_body.dart
new file mode 100644
index 0000000..771db27
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_expression_function_body.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ConvertToExpressionFunctionBody extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.CONVERT_INTO_EXPRESSION_BODY;
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_INTO_EXPRESSION_BODY;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    // prepare current body
+    var body = getEnclosingFunctionBody();
+    if (body is! BlockFunctionBody || body.isGenerator) {
+      return;
+    }
+    // prepare return statement
+    List<Statement> statements = (body as BlockFunctionBody).block.statements;
+    if (statements.length != 1) {
+      return;
+    }
+    var onlyStatement = statements.first;
+    // prepare returned expression
+    Expression returnExpression;
+    if (onlyStatement is ReturnStatement) {
+      returnExpression = onlyStatement.expression;
+    } else if (onlyStatement is ExpressionStatement) {
+      returnExpression = onlyStatement.expression;
+    }
+    if (returnExpression == null) {
+      return;
+    }
+
+    // Return expressions can be quite large, e.g. Flutter build() methods.
+    // It is surprising to see this Quick Assist deep in the function body.
+    if (selectionOffset >= returnExpression.offset) {
+      return;
+    }
+
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addReplacement(range.node(body), (DartEditBuilder builder) {
+        if (body.isAsynchronous) {
+          builder.write('async ');
+        }
+        builder.write('=> ');
+        builder.write(utils.getNodeText(returnExpression));
+        if (body.parent is! FunctionExpression ||
+            body.parent.parent is FunctionDeclaration) {
+          builder.write(';');
+        }
+      });
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart
new file mode 100644
index 0000000..bba054b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_generic_function_syntax.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ConvertToGenericFunctionSyntax extends CorrectionProducer {
+  @override
+  AssistKind get assistKind =>
+      DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX;
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_GENERIC_FUNCTION_SYNTAX;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var node = this.node;
+    while (node != null) {
+      if (node is FunctionTypeAlias) {
+        return _convertFunctionTypeAlias(builder, node);
+      } else if (node is FunctionTypedFormalParameter) {
+        return _convertFunctionTypedFormalParameter(builder, node);
+      } else if (node is FormalParameterList) {
+        // It would be confusing for this assist to alter a surrounding context
+        // when the selection is inside a parameter list.
+        return null;
+      }
+      node = node.parent;
+    }
+  }
+
+  /// Return `true` if all of the parameters in the given list of [parameters]
+  /// have an explicit type annotation.
+  bool _allParametersHaveTypes(FormalParameterList parameters) {
+    for (var parameter in parameters.parameters) {
+      if (parameter is DefaultFormalParameter) {
+        parameter = (parameter as DefaultFormalParameter).parameter;
+      }
+      if (parameter is SimpleFormalParameter) {
+        if (parameter.type == null) {
+          return false;
+        }
+      } else if (parameter is! FunctionTypedFormalParameter) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  Future<void> _convertFunctionTypeAlias(
+      DartChangeBuilder builder, FunctionTypeAlias node) async {
+    if (!_allParametersHaveTypes(node.parameters)) {
+      return;
+    }
+    String returnType;
+    if (node.returnType != null) {
+      returnType = utils.getNodeText(node.returnType);
+    }
+    var functionName = utils.getRangeText(
+        range.startEnd(node.name, node.typeParameters ?? node.name));
+    var parameters = utils.getNodeText(node.parameters);
+    String replacement;
+    if (returnType == null) {
+      replacement = '$functionName = Function$parameters';
+    } else {
+      replacement = '$functionName = $returnType Function$parameters';
+    }
+    // add change
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addSimpleReplacement(
+          range.startStart(node.typedefKeyword.next, node.semicolon),
+          replacement);
+    });
+  }
+
+  Future<void> _convertFunctionTypedFormalParameter(
+      DartChangeBuilder builder, FunctionTypedFormalParameter node) async {
+    if (!_allParametersHaveTypes(node.parameters)) {
+      return;
+    }
+    String returnType;
+    if (node.returnType != null) {
+      returnType = utils.getNodeText(node.returnType);
+    }
+    var functionName = utils.getRangeText(range.startEnd(
+        node.identifier, node.typeParameters ?? node.identifier));
+    var parameters = utils.getNodeText(node.parameters);
+    String replacement;
+    if (returnType == null) {
+      replacement = 'Function$parameters $functionName';
+    } else {
+      replacement = '$returnType Function$parameters $functionName';
+    }
+    // add change
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addSimpleReplacement(range.node(node), replacement);
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_int_literal.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_int_literal.dart
new file mode 100644
index 0000000..b4f967c
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_int_literal.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class ConvertToIntLiteral extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.CONVERT_TO_INT_LITERAL;
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_INT_LITERAL;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is! DoubleLiteral) {
+      return;
+    }
+    DoubleLiteral literal = node;
+    int intValue;
+    try {
+      intValue = literal.value?.truncate();
+    } catch (e) {
+      // Double cannot be converted to int
+    }
+    if (intValue == null || intValue != literal.value) {
+      return;
+    }
+
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addReplacement(SourceRange(literal.offset, literal.length),
+          (DartEditBuilder builder) {
+        builder.write('$intValue');
+      });
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.dart
new file mode 100644
index 0000000..22876af
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ConvertToOnType extends CorrectionProducer {
+  @override
+  final List<Object> fixArguments = [];
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_ON_TYPE;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var exceptionParameter = node;
+    if (exceptionParameter is SimpleIdentifier) {
+      var catchClause = exceptionParameter.parent;
+      if (catchClause is CatchClause &&
+          catchClause.exceptionType == null &&
+          catchClause.exceptionParameter == exceptionParameter) {
+        var exceptionTypeName = exceptionParameter.name;
+        fixArguments.add(exceptionTypeName);
+        await builder.addFileEdit(file, (builder) {
+          if (catchClause.stackTraceParameter != null) {
+            builder.addSimpleReplacement(
+              range.startStart(
+                catchClause.catchKeyword,
+                catchClause.stackTraceParameter,
+              ),
+              'on $exceptionTypeName catch (_, ',
+            );
+          } else {
+            builder.addSimpleReplacement(
+              range.startEnd(
+                catchClause.catchKeyword,
+                catchClause.rightParenthesis,
+              ),
+              'on $exceptionTypeName',
+            );
+          }
+        });
+      }
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_package_import.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_package_import.dart
new file mode 100644
index 0000000..a055b5c
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_package_import.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:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ConvertToPackageImport extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.CONVERT_TO_PACKAGE_IMPORT;
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_PACKAGE_IMPORT;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var node = this.node;
+    if (node is StringLiteral) {
+      node = node.parent;
+    }
+    if (node is ImportDirective) {
+      var importDirective = node;
+      var uriSource = importDirective.uriSource;
+
+      // Ignore if invalid URI.
+      if (uriSource == null) {
+        return;
+      }
+
+      var importUri = uriSource.uri;
+      if (importUri.scheme != 'package') {
+        return;
+      }
+
+      // Don't offer to convert a 'package:' URI to itself.
+      try {
+        if (Uri.parse(importDirective.uriContent).scheme == 'package') {
+          return;
+        }
+      } on FormatException {
+        return;
+      }
+
+      await builder.addFileEdit(file, (builder) {
+        builder.addSimpleReplacement(
+          range.node(importDirective.uri),
+          "'$importUri'",
+        );
+      });
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_relative_import.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_relative_import.dart
new file mode 100644
index 0000000..938214b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_relative_import.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:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+import 'package:path/path.dart' as path;
+
+class ConvertToRelativeImport extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.CONVERT_TO_RELATIVE_IMPORT;
+
+  @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_RELATIVE_IMPORT;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var node = this.node;
+    if (node is StringLiteral) {
+      node = node.parent;
+    }
+    if (node is! ImportDirective) {
+      return;
+    }
+
+    ImportDirective importDirective = node;
+
+    // Ignore if invalid URI.
+    if (importDirective.uriSource == null) {
+      return;
+    }
+
+    // Ignore if the uri is not a package: uri.
+    var sourceUri = resolvedResult.uri;
+    if (sourceUri.scheme != 'package') {
+      return;
+    }
+
+    Uri importUri;
+    try {
+      importUri = Uri.parse(importDirective.uriContent);
+    } on FormatException {
+      return;
+    }
+
+    // Ignore if import uri is not a package: uri.
+    if (importUri.scheme != 'package') {
+      return;
+    }
+
+    // Verify that the source's uri and the import uri have the same package
+    // name.
+    var sourceSegments = sourceUri.pathSegments;
+    var importSegments = importUri.pathSegments;
+    if (sourceSegments.isEmpty ||
+        importSegments.isEmpty ||
+        sourceSegments.first != importSegments.first) {
+      return;
+    }
+
+    // We only write posix style paths in import directives.
+    var relativePath = path.posix.relative(
+      importUri.path,
+      from: path.dirname(sourceUri.path),
+    );
+
+    await builder.addFileEdit(file, (builder) {
+      builder.addSimpleReplacement(
+        range.node(importDirective.uri).getExpanded(-1),
+        relativePath,
+      );
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.dart b/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.dart
new file mode 100644
index 0000000..4787df2
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class InlineInvocation extends CorrectionProducer {
+  @override
+  List<Object> get assistArguments => ['add'];
+
+  @override
+  AssistKind get assistKind => DartAssistKind.INLINE_INVOCATION;
+
+  @override
+  List<Object> get fixArguments => ['add'];
+
+  @override
+  FixKind get fixKind => DartFixKind.INLINE_INVOCATION;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var node = this.node;
+    if (node is! SimpleIdentifier || node.parent is! MethodInvocation) {
+      return;
+    }
+    SimpleIdentifier name = node;
+    MethodInvocation invocation = node.parent;
+    if (name != invocation.methodName ||
+        name.name != 'add' ||
+        !invocation.isCascaded ||
+        invocation.argumentList.arguments.length != 1) {
+      return;
+    }
+    var cascade = invocation.thisOrAncestorOfType<CascadeExpression>();
+    var sections = cascade.cascadeSections;
+    var target = cascade.target;
+    if (target is! ListLiteral || sections[0] != invocation) {
+      // TODO(brianwilkerson) Consider extending this to handle set literals.
+      return;
+    }
+    ListLiteral list = target;
+    var argument = invocation.argumentList.arguments[0];
+    var elementText = utils.getNodeText(argument);
+
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      if (list.elements.isNotEmpty) {
+        // ['a']..add(e);
+        builder.addSimpleInsertion(list.elements.last.end, ', $elementText');
+      } else {
+        // []..add(e);
+        builder.addSimpleInsertion(list.leftBracket.end, elementText);
+      }
+      builder.addDeletion(range.node(invocation));
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart
new file mode 100644
index 0000000..023a9cf
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveTypeAnnotation extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.REMOVE_TYPE_ANNOTATION;
+
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_TYPE_ANNOTATION;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    // todo (pq): unify w/ fix (and then add a guard to not assist on lints:
+    //  avoid_return_types_on_setters, type_init_formals)
+    var declarationList = node.thisOrAncestorOfType<VariableDeclarationList>();
+    if (declarationList == null) {
+      await _removeFromDeclaredIdentifier(builder);
+    } else {
+      await _removeFromDeclarationList(builder, declarationList);
+    }
+  }
+
+  Future<void> _removeFromDeclarationList(DartChangeBuilder builder,
+      VariableDeclarationList declarationList) async {
+    // we need a type
+    var typeNode = declarationList.type;
+    if (typeNode == null) {
+      return;
+    }
+    // ignore if an incomplete variable declaration
+    if (declarationList.variables.length == 1 &&
+        declarationList.variables[0].name.isSynthetic) {
+      return;
+    }
+    // must be not after the name of the variable
+    var firstVariable = declarationList.variables[0];
+    if (selectionOffset > firstVariable.name.end) {
+      return;
+    }
+    // The variable must have an initializer, otherwise there is no other
+    // source for its type.
+    if (firstVariable.initializer == null) {
+      return;
+    }
+    var keyword = declarationList.keyword;
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      var typeRange = range.startStart(typeNode, firstVariable);
+      if (keyword != null && keyword.lexeme != 'var') {
+        builder.addSimpleReplacement(typeRange, '');
+      } else {
+        builder.addSimpleReplacement(typeRange, 'var ');
+      }
+    });
+  }
+
+  Future<void> _removeFromDeclaredIdentifier(DartChangeBuilder builder) async {
+    var declaration = node.thisOrAncestorOfType<DeclaredIdentifier>();
+    if (declaration == null) {
+      return;
+    }
+    var typeNode = declaration.type;
+    if (typeNode == null) {
+      return;
+    }
+    var keyword = declaration.keyword;
+    var variableName = declaration.identifier;
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      var typeRange = range.startStart(typeNode, variableName);
+      if (keyword != null && keyword.lexeme != 'var') {
+        builder.addSimpleReplacement(typeRange, '');
+      } else {
+        builder.addSimpleReplacement(typeRange, 'var ');
+      }
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
new file mode 100644
index 0000000..787dcb6
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ReplaceWithVar extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.REPLACE_WITH_VAR;
+
+  @override
+  FixKind get fixKind => DartFixKind.REPLACE_WITH_VAR;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var type = node.thisOrAncestorOfType<TypeAnnotation>();
+    if (type == null) {
+      return;
+    }
+    // TODO(brianwilkerson) Optimize this by removing the duplication between
+    //  [_canReplaceWithVar] and the rest of this method.
+    if (!_canReplaceWithVar()) {
+      return;
+    }
+    var parent = type.parent;
+    var grandparent = parent?.parent;
+    if (parent is VariableDeclarationList &&
+        (grandparent is VariableDeclarationStatement ||
+            grandparent is ForPartsWithDeclarations)) {
+      var variables = parent.variables;
+      if (variables.length != 1) {
+        return;
+      }
+      var initializer = variables[0].initializer;
+      String typeArgumentsText;
+      int typeArgumentsOffset;
+      if (type is NamedType && type.typeArguments != null) {
+        if (initializer is TypedLiteral) {
+          if (initializer.typeArguments == null) {
+            typeArgumentsText = utils.getNodeText(type.typeArguments);
+            typeArgumentsOffset = initializer.offset;
+          }
+        } else if (initializer is InstanceCreationExpression) {
+          if (initializer.constructorName.type.typeArguments == null) {
+            typeArgumentsText = utils.getNodeText(type.typeArguments);
+            typeArgumentsOffset = initializer.constructorName.type.end;
+          }
+        }
+      }
+      if (initializer is SetOrMapLiteral &&
+          initializer.typeArguments == null &&
+          typeArgumentsText == null) {
+        // TODO(brianwilkerson) This is to prevent the fix from converting a
+        //  valid map or set literal into an ambiguous literal. We could apply
+        //  this in more places by examining the elements of the collection.
+        return;
+      }
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addSimpleReplacement(range.node(type), 'var');
+        if (typeArgumentsText != null) {
+          builder.addSimpleInsertion(typeArgumentsOffset, typeArgumentsText);
+        }
+      });
+    } else if (parent is DeclaredIdentifier &&
+        grandparent is ForEachPartsWithDeclaration) {
+      String typeArgumentsText;
+      int typeArgumentsOffset;
+      if (type is NamedType && type.typeArguments != null) {
+        var iterable = grandparent.iterable;
+        if (iterable is TypedLiteral && iterable.typeArguments == null) {
+          typeArgumentsText = utils.getNodeText(type.typeArguments);
+          typeArgumentsOffset = iterable.offset;
+        }
+      }
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addSimpleReplacement(range.node(type), 'var');
+        if (typeArgumentsText != null) {
+          builder.addSimpleInsertion(typeArgumentsOffset, typeArgumentsText);
+        }
+      });
+    }
+  }
+
+  /// Return `true` if the type in the [node] can be replaced with `var`.
+  bool _canConvertVariableDeclarationList(VariableDeclarationList node) {
+    final staticType = node?.type?.type;
+    if (staticType == null || staticType.isDynamic) {
+      return false;
+    }
+    for (final child in node.variables) {
+      var initializer = child.initializer;
+      if (initializer == null || initializer.staticType != staticType) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /// Return `true` if the [node] can be replaced with `var`.
+  bool _canReplaceWithVar() {
+    var parent = node.parent;
+    while (parent != null) {
+      if (parent is VariableDeclarationStatement) {
+        return _canConvertVariableDeclarationList(parent.variables);
+      } else if (parent is ForPartsWithDeclarations) {
+        return _canConvertVariableDeclarationList(parent.variables);
+      } else if (parent is ForEachPartsWithDeclaration) {
+        var loopVariableType = parent.loopVariable.type;
+        var staticType = loopVariableType?.type;
+        if (staticType == null || staticType.isDynamic) {
+          return false;
+        }
+        final iterableType = parent.iterable.staticType;
+        if (iterableType is InterfaceTypeImpl) {
+          var instantiatedType =
+              iterableType.asInstanceOf(typeProvider.iterableElement);
+          if (instantiatedType?.typeArguments?.first == staticType) {
+            return true;
+          }
+        }
+        return false;
+      }
+      parent = parent.parent;
+    }
+    return false;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart b/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart
new file mode 100644
index 0000000..778bc28
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class SortChildPropertyLast extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.SORT_CHILD_PROPERTY_LAST;
+
+  @override
+  FixKind get fixKind => DartFixKind.SORT_CHILD_PROPERTY_LAST;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var childProp = flutter.findNamedExpression(node, 'child');
+    childProp ??= flutter.findNamedExpression(node, 'children');
+    if (childProp == null) {
+      return;
+    }
+
+    var parent = childProp.parent?.parent;
+    if (parent is! InstanceCreationExpression ||
+        !flutter.isWidgetCreation(parent)) {
+      return;
+    }
+
+    InstanceCreationExpression creationExpression = parent;
+    var args = creationExpression.argumentList;
+
+    var last = args.arguments.last;
+    if (last == childProp) {
+      // Already sorted.
+      return;
+    }
+
+    await builder.addFileEdit(file, (DartFileEditBuilder fileEditBuilder) {
+      var start = childProp.beginToken.previous.end;
+      var end = childProp.endToken.next.end;
+      var childRange = range.startOffsetEndOffset(start, end);
+
+      var childText = utils.getRangeText(childRange);
+      fileEditBuilder.addSimpleReplacement(childRange, '');
+      fileEditBuilder.addSimpleInsertion(last.end + 1, childText);
+
+      builder.setSelection(Position(file, last.end + 1));
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.dart
new file mode 100644
index 0000000..53362cc
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.dart
@@ -0,0 +1,138 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class UseCurlyBraces extends CorrectionProducer {
+  @override
+  AssistKind get assistKind => DartAssistKind.USE_CURLY_BRACES;
+
+  @override
+  FixKind get fixKind => DartFixKind.ADD_CURLY_BRACES;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var statement = node.thisOrAncestorOfType<Statement>();
+    var parent = statement?.parent;
+
+    if (statement is DoStatement) {
+      return _doStatement(builder, statement);
+    } else if (parent is DoStatement) {
+      return _doStatement(builder, parent);
+    } else if (statement is ForStatement) {
+      return _forStatement(builder, statement);
+    } else if (parent is ForStatement) {
+      return _forStatement(builder, parent);
+    } else if (statement is IfStatement) {
+      if (statement.elseKeyword != null &&
+          range.token(statement.elseKeyword).contains(selectionOffset)) {
+        return _ifStatement(builder, statement, statement.elseStatement);
+      } else {
+        return _ifStatement(builder, statement, null);
+      }
+    } else if (parent is IfStatement) {
+      return _ifStatement(builder, parent, statement);
+    } else if (statement is WhileStatement) {
+      return _whileStatement(builder, statement);
+    } else if (parent is WhileStatement) {
+      return _whileStatement(builder, parent);
+    }
+  }
+
+  Future<void> _doStatement(DartChangeBuilder builder, DoStatement node) async {
+    var body = node.body;
+    if (body is Block) return null;
+
+    var prefix = utils.getLinePrefix(node.offset);
+    var indent = prefix + utils.getIndent(1);
+
+    await builder.addFileEdit(file, (builder) {
+      builder.addSimpleReplacement(
+        range.endStart(node.doKeyword, body),
+        ' {$eol$indent',
+      );
+      builder.addSimpleReplacement(
+        range.endStart(body, node.whileKeyword),
+        '$eol$prefix} ',
+      );
+    });
+  }
+
+  Future<void> _forStatement(
+      DartChangeBuilder builder, ForStatement node) async {
+    var body = node.body;
+    if (body is Block) return null;
+
+    var prefix = utils.getLinePrefix(node.offset);
+    var indent = prefix + utils.getIndent(1);
+
+    await builder.addFileEdit(file, (builder) {
+      builder.addSimpleReplacement(
+        range.endStart(node.rightParenthesis, body),
+        ' {$eol$indent',
+      );
+      builder.addSimpleInsertion(body.end, '$eol$prefix}');
+    });
+  }
+
+  Future<void> _ifStatement(
+      DartChangeBuilder builder, IfStatement node, Statement thenOrElse) async {
+    var prefix = utils.getLinePrefix(node.offset);
+    var indent = prefix + utils.getIndent(1);
+
+    await builder.addFileEdit(file, (builder) {
+      var thenStatement = node.thenStatement;
+      if (thenStatement is! Block &&
+          (thenOrElse == null || thenOrElse == thenStatement)) {
+        builder.addSimpleReplacement(
+          range.endStart(node.rightParenthesis, thenStatement),
+          ' {$eol$indent',
+        );
+        if (node.elseKeyword != null) {
+          builder.addSimpleReplacement(
+            range.endStart(thenStatement, node.elseKeyword),
+            '$eol$prefix} ',
+          );
+        } else {
+          builder.addSimpleInsertion(thenStatement.end, '$eol$prefix}');
+        }
+      }
+
+      var elseStatement = node.elseStatement;
+      if (elseStatement != null &&
+          elseStatement is! Block &&
+          (thenOrElse == null || thenOrElse == elseStatement)) {
+        builder.addSimpleReplacement(
+          range.endStart(node.elseKeyword, elseStatement),
+          ' {$eol$indent',
+        );
+        builder.addSimpleInsertion(elseStatement.end, '$eol$prefix}');
+      }
+    });
+  }
+
+  Future<void> _whileStatement(
+      DartChangeBuilder builder, WhileStatement node) async {
+    var body = node.body;
+    if (body is Block) return null;
+
+    var prefix = utils.getLinePrefix(node.offset);
+    var indent = prefix + utils.getIndent(1);
+
+    await builder.addFileEdit(file, (builder) {
+      builder.addSimpleReplacement(
+        range.endStart(node.rightParenthesis, body),
+        ' {$eol$indent',
+      );
+      builder.addSimpleInsertion(body.end, '$eol$prefix}');
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 07bf305..68563e5 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -231,6 +231,8 @@
       'dart.fix.convert.toNamedArguments', 50, 'Convert to named arguments');
   static const CONVERT_TO_NULL_AWARE =
       FixKind('dart.fix.convert.toNullAware', 50, "Convert to use '?.'");
+  static const CONVERT_TO_ON_TYPE =
+      FixKind('dart.fix.convert.toOnType', 50, "Convert to 'on {0}'");
   static const CONVERT_TO_PACKAGE_IMPORT = FixKind(
       'dart.fix.convert.toPackageImport', 50, "Convert to 'package:' import");
   static const CONVERT_TO_RELATIVE_IMPORT = FixKind(
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 56b9ab1..b2b500d 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -12,14 +12,28 @@
 import 'package:analysis_server/src/services/completion/dart/utilities.dart';
 import 'package:analysis_server/src/services/correction/base_processor.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/dart/add_diagnostic_property_reference.dart';
 import 'package:analysis_server/src/services/correction/dart/add_field_formal_parameters.dart';
 import 'package:analysis_server/src/services/correction/dart/add_return_type.dart';
+import 'package:analysis_server/src/services/correction/dart/add_type_annotation.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_add_all_to_spread.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_conditional_expression_to_if_element.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_quotes.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_expression_function_body.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_generic_function_syntax.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_int_literal.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_list_literal.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_map_literal.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_null_aware.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_on_type.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_package_import.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_relative_import.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_set_literal.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_where_type.dart';
+import 'package:analysis_server/src/services/correction/dart/inline_invocation.dart';
 import 'package:analysis_server/src/services/correction/dart/inline_typedef.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_dead_if_null.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_if_null_operator.dart';
@@ -28,6 +42,9 @@
 import 'package:analysis_server/src/services/correction/dart/remove_unused_local_variable.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_eight_digit_hex.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_interpolation.dart';
+import 'package:analysis_server/src/services/correction/dart/replace_with_var.dart';
+import 'package:analysis_server/src/services/correction/dart/sort_child_property_last.dart';
+import 'package:analysis_server/src/services/correction/dart/use_curly_braces.dart';
 import 'package:analysis_server/src/services/correction/dart/wrap_in_future.dart';
 import 'package:analysis_server/src/services/correction/dart/wrap_in_text.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
@@ -396,9 +413,6 @@
     if (errorCode == ParserErrorCode.VAR_AS_TYPE_NAME) {
       await _addFix_replaceVarWithDynamic();
     }
-    if (errorCode == ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE) {
-      await _addFix_addTypeAnnotation();
-    }
     if (errorCode == StaticWarningCode.ASSIGNMENT_TO_FINAL) {
       await _addFix_makeFieldNotFinal();
     }
@@ -592,10 +606,6 @@
     // lints
     if (errorCode is LintCode) {
       var name = errorCode.name;
-      if (name == LintNames.always_specify_types ||
-          name == LintNames.type_annotate_public_apis) {
-        await _addFix_addTypeAnnotation();
-      }
       if (name == LintNames.always_require_non_null_named_parameters) {
         await _addFix_addRequiredAnnotation();
       }
@@ -614,9 +624,6 @@
       if (name == LintNames.avoid_redundant_argument_values) {
         await _addFix_removeArgument();
       }
-      if (name == LintNames.avoid_relative_lib_imports) {
-        await _addFix_convertToPackageImport();
-      }
       if (name == LintNames.avoid_return_types_on_setters) {
         await _addFix_removeTypeAnnotation();
       }
@@ -629,12 +636,6 @@
       if (name == LintNames.await_only_futures) {
         await _addFix_removeAwait();
       }
-      if (name == LintNames.curly_braces_in_flow_control_structures) {
-        await _addFix_addCurlyBraces();
-      }
-      if (name == LintNames.diagnostic_describe_all_properties) {
-        await _addFix_addDiagnosticPropertyReference();
-      }
       if (name == LintNames.directives_ordering) {
         await _addFix_sortDirectives();
       }
@@ -659,9 +660,6 @@
       if (name == LintNames.null_closures) {
         await _addFix_replaceNullWithClosure();
       }
-      if (name == LintNames.omit_local_variable_types) {
-        await _addFix_replaceWithVar();
-      }
       if (name == LintNames.prefer_adjacent_string_concatenation) {
         await _addFix_removeOperator();
       }
@@ -671,12 +669,6 @@
       if (errorCode.name == LintNames.prefer_const_declarations) {
         await _addFix_replaceFinalWithConst();
       }
-      if (errorCode.name == LintNames.prefer_expression_function_bodies) {
-        await _addFix_convertToExpressionBody();
-      }
-      if (errorCode.name == LintNames.prefer_for_elements_to_map_fromIterable) {
-        await _addFix_convertMapFromIterableToForLiteral();
-      }
       if (errorCode.name == LintNames.prefer_equal_for_default_values) {
         await _addFix_replaceColonWithEquals();
       }
@@ -686,19 +678,6 @@
       if (name == LintNames.prefer_final_locals) {
         await _addFix_makeVariableFinal();
       }
-      if (name == LintNames.prefer_generic_function_type_aliases) {
-        await _addFix_convertToGenericFunctionSyntax();
-      }
-      if (errorCode.name ==
-          LintNames.prefer_if_elements_to_conditional_expressions) {
-        await _addFix_convertConditionalToIfElement();
-      }
-      if (name == LintNames.prefer_inlined_adds) {
-        await _addFix_convertToInlineAdd();
-      }
-      if (name == LintNames.prefer_int_literals) {
-        await _addFix_convertToIntLiteral();
-      }
       if (name == LintNames.prefer_is_empty) {
         await _addFix_replaceWithIsEmpty();
       }
@@ -715,21 +694,6 @@
       if (errorCode.name == LintNames.prefer_if_null_operators) {
         await _addFix_convertToIfNullOperator();
       }
-      if (name == LintNames.prefer_relative_imports) {
-        await _addFix_convertToRelativeImport();
-      }
-      if (name == LintNames.prefer_single_quotes) {
-        await _addFix_convertSingleQuotes();
-      }
-      if (errorCode.name == LintNames.slash_for_doc_comments) {
-        await _addFix_convertDocumentationIntoLine();
-      }
-      if (name == LintNames.prefer_spread_collections) {
-        await _addFix_convertAddAllToSpread();
-      }
-      if (name == LintNames.sort_child_properties_last) {
-        await _addFix_sortChildPropertiesLast();
-      }
       if (name == LintNames.type_init_formals) {
         await _addFix_removeTypeAnnotation();
       }
@@ -754,9 +718,6 @@
       if (name == LintNames.unnecessary_this) {
         await _addFix_removeThisExpression();
       }
-      if (name == LintNames.use_function_type_syntax_for_parameters) {
-        await _addFix_convertToGenericFunctionSyntax();
-      }
       if (name == LintNames.use_rethrow_when_possible) {
         await _addFix_replaceWithRethrow();
       }
@@ -827,17 +788,6 @@
     }
   }
 
-  Future<void> _addFix_addCurlyBraces() async {
-    final changeBuilder = await createBuilder_useCurlyBraces();
-    _addFixFromBuilder(changeBuilder, DartFixKind.ADD_CURLY_BRACES);
-  }
-
-  Future<void> _addFix_addDiagnosticPropertyReference() async {
-    final changeBuilder = await createBuilder_addDiagnosticPropertyReference();
-    _addFixFromBuilder(
-        changeBuilder, DartFixKind.ADD_DIAGNOSTIC_PROPERTY_REFERENCE);
-  }
-
   Future<void> _addFix_addExplicitCast() async {
     if (coveredNode is! Expression) {
       return;
@@ -1303,19 +1253,6 @@
     _addFixFromBuilder(changeBuilder, DartFixKind.ADD_STATIC);
   }
 
-  Future<void> _addFix_addTypeAnnotation() async {
-    var changeBuilder =
-        await createBuilder_addTypeAnnotation_DeclaredIdentifier();
-    _addFixFromBuilder(changeBuilder, DartFixKind.ADD_TYPE_ANNOTATION);
-
-    changeBuilder =
-        await createBuilder_addTypeAnnotation_SimpleFormalParameter();
-    _addFixFromBuilder(changeBuilder, DartFixKind.ADD_TYPE_ANNOTATION);
-
-    changeBuilder = await createBuilder_addTypeAnnotation_VariableDeclaration();
-    _addFixFromBuilder(changeBuilder, DartFixKind.ADD_TYPE_ANNOTATION);
-  }
-
   Future<void> _addFix_boolInsteadOfBoolean() async {
     var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
@@ -1447,27 +1384,6 @@
     }
   }
 
-  Future<void> _addFix_convertAddAllToSpread() async {
-    final change = await createBuilder_convertAddAllToSpread();
-    if (change != null) {
-      final kind = change.isLineInvocation
-          ? DartFixKind.INLINE_INVOCATION
-          : DartFixKind.CONVERT_TO_SPREAD;
-      _addFixFromBuilder(change.builder, kind, args: change.args);
-    }
-  }
-
-  Future<void> _addFix_convertConditionalToIfElement() async {
-    final changeBuilder =
-        await createBuilder_convertConditionalExpressionToIfElement();
-    _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_TO_IF_ELEMENT);
-  }
-
-  Future<void> _addFix_convertDocumentationIntoLine() async {
-    final changeBuilder = await createBuilder_convertDocumentationIntoLine();
-    _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_TO_LINE_COMMENT);
-  }
-
   Future<void> _addFix_convertFlutterChild() async {
     var named = flutter.findNamedExpression(node, 'child');
     if (named == null) {
@@ -1533,29 +1449,6 @@
     }
   }
 
-  Future<void> _addFix_convertMapFromIterableToForLiteral() async {
-    final changeBuilder =
-        await createBuilder_convertMapFromIterableToForLiteral();
-    _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_TO_FOR_ELEMENT);
-  }
-
-  Future<void> _addFix_convertSingleQuotes() async {
-    final changeBuilder = await createBuilder_convertQuotes(true);
-    _addFixFromBuilder(
-        changeBuilder, DartFixKind.CONVERT_TO_SINGLE_QUOTED_STRING);
-  }
-
-  Future<void> _addFix_convertToExpressionBody() async {
-    final changeBuilder = await createBuilder_convertToExpressionFunctionBody();
-    _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_INTO_EXPRESSION_BODY);
-  }
-
-  Future<void> _addFix_convertToGenericFunctionSyntax() async {
-    var changeBuilder = await createBuilder_convertToGenericFunctionSyntax();
-    _addFixFromBuilder(
-        changeBuilder, DartFixKind.CONVERT_TO_GENERIC_FUNCTION_SYNTAX);
-  }
-
   Future<void> _addFix_convertToIfNullOperator() async {
     var conditional = node.thisOrAncestorOfType<ConditionalExpression>();
     if (conditional == null) {
@@ -1582,17 +1475,6 @@
     _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_TO_IF_NULL);
   }
 
-  Future<void> _addFix_convertToInlineAdd() async {
-    final changeBuilder = await createBuilder_inlineAdd();
-    _addFixFromBuilder(changeBuilder, DartFixKind.INLINE_INVOCATION,
-        args: ['add']);
-  }
-
-  Future<void> _addFix_convertToIntLiteral() async {
-    final changeBuilder = await createBuilder_convertToIntLiteral();
-    _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_TO_INT_LITERAL);
-  }
-
   Future<void> _addFix_convertToNamedArgument() async {
     var argumentList = node;
     if (argumentList is ArgumentList) {
@@ -1669,16 +1551,6 @@
     }
   }
 
-  Future<void> _addFix_convertToPackageImport() async {
-    final changeBuilder = await createBuilder_convertToPackageImport();
-    _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_TO_PACKAGE_IMPORT);
-  }
-
-  Future<void> _addFix_convertToRelativeImport() async {
-    final changeBuilder = await createBuilder_convertToRelativeImport();
-    _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_TO_RELATIVE_IMPORT);
-  }
-
   Future<void> _addFix_createClass() async {
     Element prefixElement;
     String name;
@@ -4115,16 +3987,6 @@
     }
   }
 
-  Future<void> _addFix_replaceWithVar() async {
-    var changeBuilder = await createBuilder_replaceWithVar();
-    _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_WITH_VAR);
-  }
-
-  Future<void> _addFix_sortChildPropertiesLast() async {
-    final changeBuilder = await createBuilder_sortChildPropertyLast();
-    _addFixFromBuilder(changeBuilder, DartFixKind.SORT_CHILD_PROPERTY_LAST);
-  }
-
   Future<void> _addFix_sortDirectives() async {
     var organizer =
         DirectiveOrganizer(resolvedResult.content, unit, resolvedResult.errors);
@@ -4518,6 +4380,8 @@
       await compute(RemoveQuestionMark());
     } else if (errorCode == CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE) {
       await compute(RemoveQuestionMark());
+    } else if (errorCode == ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE) {
+      await compute(AddTypeAnnotation());
     } else if (errorCode == StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE) {
       await compute(WrapInText());
     } else if (errorCode == StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION) {
@@ -4532,26 +4396,67 @@
       var name = errorCode.name;
       if (name == LintNames.always_declare_return_types) {
         await compute(AddReturnType());
+      } else if (name == LintNames.always_specify_types) {
+        await compute(AddTypeAnnotation());
       } else if (name == LintNames.avoid_private_typedef_functions) {
         await compute(InlineTypedef());
+      } else if (name == LintNames.avoid_relative_lib_imports) {
+        await compute(ConvertToPackageImport());
       } else if (name == LintNames.avoid_returning_null_for_future) {
         await compute(WrapInFuture());
+      } else if (name == LintNames.avoid_types_as_parameter_names) {
+        await compute(ConvertToOnType());
+      } else if (name == LintNames.curly_braces_in_flow_control_structures) {
+        await compute(UseCurlyBraces());
+      } else if (name == LintNames.diagnostic_describe_all_properties) {
+        await compute(AddDiagnosticPropertyReference());
+      } else if (name == LintNames.omit_local_variable_types) {
+        await compute(ReplaceWithVar());
       } else if (name == LintNames.prefer_collection_literals) {
         await compute(ConvertToListLiteral());
         await compute(ConvertToMapLiteral());
         await compute(ConvertToSetLiteral());
       } else if (name == LintNames.prefer_contains) {
         await compute(ConvertToContains());
+      } else if (errorCode.name ==
+          LintNames.prefer_expression_function_bodies) {
+        await compute(ConvertToExpressionFunctionBody());
+      } else if (errorCode.name ==
+          LintNames.prefer_for_elements_to_map_fromIterable) {
+        await compute(ConvertMapFromIterableToForLiteral());
+      } else if (name == LintNames.prefer_generic_function_type_aliases) {
+        await compute(ConvertToGenericFunctionSyntax());
+      } else if (errorCode.name ==
+          LintNames.prefer_if_elements_to_conditional_expressions) {
+        await compute(ConvertConditionalExpressionToIfElement());
+      } else if (name == LintNames.prefer_inlined_adds) {
+        await compute(InlineInvocation());
+      } else if (name == LintNames.prefer_int_literals) {
+        await compute(ConvertToIntLiteral());
       } else if (name == LintNames.prefer_interpolation_to_compose_strings) {
         await compute(ReplaceWithInterpolation());
       } else if (name == LintNames.prefer_iterable_whereType) {
         await compute(ConvertToWhereType());
       } else if (name == LintNames.prefer_null_aware_operators) {
         await compute(ConvertToNullAware());
+      } else if (name == LintNames.prefer_relative_imports) {
+        await compute(ConvertToRelativeImport());
+      } else if (name == LintNames.prefer_single_quotes) {
+        await compute(ConvertToSingleQuotes());
+      } else if (name == LintNames.prefer_spread_collections) {
+        await compute(ConvertAddAllToSpread());
+      } else if (errorCode.name == LintNames.slash_for_doc_comments) {
+        await compute(ConvertDocumentationIntoLine());
+      } else if (name == LintNames.sort_child_properties_last) {
+        await compute(SortChildPropertyLast());
+      } else if (name == LintNames.type_annotate_public_apis) {
+        await compute(AddTypeAnnotation());
       } else if (name == LintNames.unnecessary_null_in_if_null_operators) {
         await compute(RemoveIfNullOperator());
       } else if (name == LintNames.use_full_hex_values_for_flutter_colors) {
         await compute(ReplaceWithEightDigitHex());
+      } else if (name == LintNames.use_function_type_syntax_for_parameters) {
+        await compute(ConvertToGenericFunctionSyntax());
       }
     }
   }
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 345d7d7..187c91b 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -23,6 +23,8 @@
       'avoid_return_types_on_setters';
   static const String avoid_returning_null_for_future =
       'avoid_returning_null_for_future';
+  static const String avoid_types_as_parameter_names =
+      'avoid_types_as_parameter_names';
   static const String avoid_types_on_closure_parameters =
       'avoid_types_on_closure_parameters';
   static const String await_only_futures = 'await_only_futures';
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
index 9253e3b..d1436b8 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
@@ -46,8 +46,6 @@
 
   @override
   Future<SourceChange> createChange() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     change = SourceChange(refactoringName);
     // function
     if (element.enclosingElement is CompilationUnitElement) {
@@ -59,8 +57,6 @@
       FieldElement field = element.variable;
       var elements = await getHierarchyMembers(searchEngine, field);
       await Future.forEach(elements, (ClassMemberElement member) async {
-        // TODO(brianwilkerson) Determine whether this await is necessary.
-        await null;
         if (member is FieldElement) {
           var getter = member.getter;
           if (!getter.isSynthetic) {
@@ -84,8 +80,6 @@
 
   Future<void> _updateElementDeclaration(
       PropertyAccessorElement element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     // prepare "get" keyword
     Token getKeyword;
     {
@@ -115,8 +109,6 @@
   }
 
   Future _updateElementReferences(Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var matches = await searchEngine.searchReferences(element);
     var references = getSourceReferences(matches);
     for (var reference in references) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
index 6744118..416e5f2 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
@@ -39,8 +39,6 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     // check Element type
     if (element is FunctionElement) {
       if (element.enclosingElement is! CompilationUnitElement) {
@@ -67,8 +65,6 @@
 
   @override
   Future<SourceChange> createChange() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     change = SourceChange(refactoringName);
     // FunctionElement
     if (element is FunctionElement) {
@@ -80,8 +76,6 @@
       MethodElement method = element;
       var elements = await getHierarchyMembers(searchEngine, method);
       await Future.forEach(elements, (Element element) async {
-        // TODO(brianwilkerson) Determine whether this await is necessary.
-        await null;
         await _updateElementDeclaration(element);
         return _updateElementReferences(element);
       });
@@ -91,8 +85,6 @@
   }
 
   Future<void> _updateElementDeclaration(Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     // prepare parameters
     FormalParameterList parameters;
     {
@@ -119,8 +111,6 @@
   }
 
   Future<void> _updateElementReferences(Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var matches = await searchEngine.searchReferences(element);
     var references = getSourceReferences(matches);
     for (var reference in references) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index 7818889..8aa4a78 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -179,8 +179,6 @@
 
   @override
   Future<RefactoringStatus> checkFinalConditions() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = RefactoringStatus();
     result.addStatus(validateMethodName(name));
     result.addStatus(_checkParameterNames());
@@ -191,8 +189,6 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = RefactoringStatus();
     // selection
     result.addStatus(_checkSelection());
@@ -231,8 +227,6 @@
 
   @override
   Future<SourceChange> createChange() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var change = SourceChange(refactoringName);
     // replace occurrences with method invocation
     for (var occurrence in _occurrences) {
@@ -431,8 +425,6 @@
   /// Checks if created method will shadow or will be shadowed by other
   /// elements.
   Future<RefactoringStatus> _checkPossibleConflicts() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = RefactoringStatus();
     var parent = _parentMember.parent;
     // top-level function
@@ -701,8 +693,6 @@
   /// Prepares information about used variables, which should be turned into
   /// parameters.
   Future<RefactoringStatus> _initializeParameters() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     _parameters.clear();
     _parametersMap.clear();
     _parameterReferencesMap.clear();
@@ -766,8 +756,6 @@
   }
 
   Future<void> _initializeReturnType() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var typeProvider = await resolveResult.typeProvider;
     if (_selectionFunctionExpression != null) {
       variableType = '';
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 843a254..6726707 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -94,8 +94,6 @@
 
   @override
   Future<RefactoringStatus> checkFinalConditions() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = RefactoringStatus();
     result.addStatus(validateClassName(name));
     return result;
@@ -103,8 +101,6 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = RefactoringStatus();
 
     result.addStatus(_checkSelection());
@@ -146,8 +142,6 @@
 
   @override
   Future<SourceChange> createChange() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var changeBuilder = DartChangeBuilder(sessionHelper.session);
     await changeBuilder.addFileEdit(resolveResult.path, (builder) {
       if (_expression != null) {
@@ -241,13 +235,9 @@
   }
 
   Future<RefactoringStatus> _initializeClasses() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = RefactoringStatus();
 
     Future<ClassElement> getClass(String name) async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
       var element = await sessionHelper.getClass(flutter.widgetsUri, name);
       if (element == null) {
         result.addFatalError(
@@ -258,8 +248,6 @@
     }
 
     Future<PropertyAccessorElement> getAccessor(String uri, String name) async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
       var element = await sessionHelper.getTopLevelPropertyAccessor(uri, name);
       if (element == null) {
         result.addFatalError("Unable to find 'required' in $uri");
@@ -280,8 +268,6 @@
   /// Prepare referenced local variables and fields, that should be turned
   /// into the widget class fields and constructor parameters.
   Future<RefactoringStatus> _initializeParameters() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     _ParametersCollector collector;
     if (_expression != null) {
       var localRange = range.node(_expression);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
index f5e2e3f..1ad6b64 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
@@ -63,8 +63,6 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = RefactoringStatus();
     // prepare variable
     {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index a35aa2a..00e267f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -263,8 +263,6 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = RefactoringStatus();
     // prepare method information
     result.addStatus(await _prepareMethod());
@@ -311,8 +309,6 @@
 
   /// Initializes [_methodElement] and related fields.
   Future<RefactoringStatus> _prepareMethod() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     _methodElement = null;
     _methodParameters = null;
     _methodBody = null;
@@ -423,8 +419,6 @@
   _ReferenceProcessor(this.ref, this.reference);
 
   Future<void> init() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     refElement = reference.element;
 
     // prepare CorrectionUtils
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
index b32654d..bb06cec 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
@@ -40,8 +40,6 @@
 
   @override
   Future<RefactoringStatus> checkAllConditions() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = RefactoringStatus();
     result.addStatus(await checkInitialConditions());
     if (result.hasFatalError) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index 371f720..4e4caef 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -104,8 +104,6 @@
 
   @override
   Future<SourceChange> createChange() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var changeName = "$refactoringName '$oldName' to '$newName'";
     change = SourceChange(changeName);
     await fillChange();
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 38fc012..75d6ce5 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -66,8 +66,6 @@
 
   @override
   Future<RefactoringStatus> checkInitialConditions() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var result = await super.checkInitialConditions();
     if (element is MethodElement && (element as MethodElement).isOperator) {
       result.addFatalError('Cannot rename operator.');
@@ -160,8 +158,6 @@
         elementKind = element.kind;
 
   Future<RefactoringStatus> validate() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     // check if there is a member with "newName" in the same ClassElement
     for (var newNameMember in getChildren(elementClass, name)) {
       result.addError(
@@ -292,8 +288,6 @@
 
   /// Fills [elements] with [Element]s to rename.
   Future _prepareElements() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     if (element is ClassMemberElement) {
       elements = await getHierarchyMembers(searchEngine, element);
     } else {
@@ -303,15 +297,11 @@
 
   /// Fills [references] with all references to [elements].
   Future _prepareReferences() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     if (!isRename) {
       return Future.value();
     }
     await _prepareElements();
     await Future.forEach(elements, (Element element) async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
       var elementReferences = await searchEngine.searchReferences(element);
       references.addAll(elementReferences);
     });
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index 9376f8a..1ea0e0d 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -56,8 +56,6 @@
 
   @override
   Future<void> fillChange() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     // prepare references
     var matches = await searchEngine.searchReferences(element);
     var references = getSourceReferences(matches);
@@ -110,8 +108,6 @@
   }
 
   Future<void> _replaceSynthetic() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var classElement = element.enclosingElement;
 
     var result = await AnalysisSessionHelper(session)
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index 0876e3a..1183fcc 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -48,8 +48,6 @@
 
   @override
   Future<void> fillChange() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     // update declaration
     {
       var prefix = element.prefix;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index e6306ba..b3c18ef 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -186,8 +186,6 @@
   }
 
   Future<RefactoringStatus> validate() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     _validateWillConflict();
     if (isRename) {
       references = await searchEngine.searchReferences(element);
@@ -271,8 +269,6 @@
 
   /// Validates if renamed [element] will shadow any [Element] named [name].
   Future _validateWillShadow() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var declarations = await searchEngine.searchMemberDeclarations(name);
     for (var declaration in declarations) {
       var member = declaration.element;
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 59cccd8..9f600f3 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -51,8 +51,6 @@
 /// Returns a [Set] with direct subclasses of [seed].
 Future<Set<ClassElement>> getDirectSubClasses(
     SearchEngine searchEngine, ClassElement seed) async {
-  // TODO(brianwilkerson) Determine whether this await is necessary.
-  await null;
   var matches = await searchEngine.searchSubtypes(seed);
   return matches.map((match) => match.element).cast<ClassElement>().toSet();
 }
@@ -83,8 +81,6 @@
 /// their subclasses.
 Future<Set<ClassMemberElement>> getHierarchyMembers(
     SearchEngine searchEngine, ClassMemberElement member) async {
-  // TODO(brianwilkerson) Determine whether this await is necessary.
-  await null;
   Set<ClassMemberElement> result = HashSet<ClassMemberElement>();
   // extension member
   if (member.enclosingElement is ExtensionElement) {
@@ -125,8 +121,6 @@
 /// corresponding named parameters in the method hierarchy.
 Future<List<ParameterElement>> getHierarchyNamedParameters(
     SearchEngine searchEngine, ParameterElement element) async {
-  // TODO(brianwilkerson) Determine whether this await is necessary.
-  await null;
   if (element.isNamed) {
     var method = element.enclosingElement;
     if (method is MethodElement) {
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 968e7a1..b680a98 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -18,8 +18,6 @@
 
   @override
   Future<Set<String>> membersOfSubtypes(ClassElement type) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var drivers = _drivers.toList();
     var searchedFiles = _createSearchedFiles(drivers);
 
@@ -29,8 +27,6 @@
     var members = <String>{};
 
     Future<void> addMembers(ClassElement type, SubtypeResult subtype) async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
       if (subtype != null && !visitedIds.add(subtype.id)) {
         return;
       }
@@ -57,13 +53,9 @@
 
   @override
   Future<Set<ClassElement>> searchAllSubtypes(ClassElement type) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var allSubtypes = <ClassElement>{};
 
     Future<void> addSubtypes(ClassElement type) async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
       var directResults = await _searchDirectSubtypes(type);
       for (var directResult in directResults) {
         var directSubtype = directResult.enclosingElement as ClassElement;
@@ -79,8 +71,6 @@
 
   @override
   Future<List<SearchMatch>> searchMemberDeclarations(String name) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var allDeclarations = <SearchMatch>[];
     var drivers = _drivers.toList();
     for (var driver in drivers) {
@@ -92,8 +82,6 @@
 
   @override
   Future<List<SearchMatch>> searchMemberReferences(String name) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var allResults = <SearchResult>[];
     var drivers = _drivers.toList();
     var searchedFiles = _createSearchedFiles(drivers);
@@ -107,8 +95,6 @@
 
   @override
   Future<List<SearchMatch>> searchReferences(Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var allResults = <SearchResult>[];
     var drivers = _drivers.toList();
     var searchedFiles = _createSearchedFiles(drivers);
@@ -121,16 +107,12 @@
 
   @override
   Future<List<SearchMatch>> searchSubtypes(ClassElement type) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var results = await _searchDirectSubtypes(type);
     return results.map(SearchMatchImpl.forSearchResult).toList();
   }
 
   @override
   Future<List<SearchMatch>> searchTopLevelDeclarations(String pattern) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var allElements = <Element>{};
     var regExp = RegExp(pattern);
     var drivers = _drivers.toList();
@@ -152,8 +134,6 @@
   }
 
   Future<List<SearchResult>> _searchDirectSubtypes(ClassElement type) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var allResults = <SearchResult>[];
     var drivers = _drivers.toList();
     var searchedFiles = _createSearchedFiles(drivers);
diff --git a/pkg/analysis_server/lib/src/status/element_writer.dart b/pkg/analysis_server/lib/src/status/element_writer.dart
index 929313a..71f5835 100644
--- a/pkg/analysis_server/lib/src/status/element_writer.dart
+++ b/pkg/analysis_server/lib/src/status/element_writer.dart
@@ -145,7 +145,6 @@
       properties['typeParameters'] = element.typeParameters;
     }
     if (element is VariableElement) {
-      properties['constantValue'] = element.constantValue;
       properties['hasImplicitType'] = element.hasImplicitType;
       properties['isConst'] = element.isConst;
       properties['isFinal'] = element.isFinal;
diff --git a/pkg/analysis_server/lib/src/status/pages.dart b/pkg/analysis_server/lib/src/status/pages.dart
index 2a83d87..795b8c9 100644
--- a/pkg/analysis_server/lib/src/status/pages.dart
+++ b/pkg/analysis_server/lib/src/status/pages.dart
@@ -32,8 +32,6 @@
   String get path => '/$id';
 
   Future<void> asyncDiv(void Function() gen, {String classes}) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     if (classes != null) {
       buf.writeln('<div class="$classes">');
     } else {
@@ -60,8 +58,6 @@
   }
 
   Future<String> generate(Map<String, String> params) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     buf.clear();
     // TODO(brianwilkerson) Determine if await is necessary, if so, change the
     // return type of [generatePage] to `Future<void>`.
@@ -155,8 +151,6 @@
   Page createUnknownPage(String unknownPath);
 
   Future<void> handleGetRequest(HttpRequest request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     try {
       var path = request.uri.path;
 
@@ -195,8 +189,6 @@
     Page page, [
     int code = HttpStatus.ok,
   ]) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var response = request.response;
     response.statusCode = code;
     response.headers.contentType = ContentType.html;
@@ -204,10 +196,26 @@
     await response.close();
   }
 
+  Future<void> respondJson(
+    HttpRequest request,
+    Map<String, Object> json, [
+    int code = HttpStatus.ok,
+  ]) async {
+    var response = request.response;
+    response.statusCode = code;
+    response.headers.contentType = ContentType.json;
+    response.write(jsonEncode(json));
+    await response.close();
+  }
+
   Future<void> respondOk(
     HttpRequest request, {
     int code = HttpStatus.ok,
   }) async {
+    if (request.headers.contentType.subType == 'json') {
+      return respondJson(request, {'success': true}, code);
+    }
+
     var response = request.response;
     response.statusCode = code;
     await response.close();
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
new file mode 100644
index 0000000..20a9324
--- /dev/null
+++ b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+
+/// Extensions for [AstNode]s
+extension AstNodeExtensions on AstNode {
+  bool get inAsyncMethodOrFunction {
+    var body = thisOrAncestorOfType<FunctionBody>();
+    return body != null && body.isAsynchronous && body.star == null;
+  }
+
+  bool get inAsyncStarOrSyncStarMethodOrFunction {
+    var body = thisOrAncestorOfType<FunctionBody>();
+    return body != null && body.keyword != null && body.star != null;
+  }
+
+  bool get inCatchClause => thisOrAncestorOfType<CatchClause>() != null;
+
+  bool get inClassMemberBody {
+    var node = this;
+    while (true) {
+      var body = node.thisOrAncestorOfType<FunctionBody>();
+      if (body == null) {
+        return false;
+      }
+      var parent = body.parent;
+      if (parent is ConstructorDeclaration || parent is MethodDeclaration) {
+        return true;
+      }
+      node = parent;
+    }
+  }
+
+  bool get inDoLoop => thisOrAncestorOfType<DoStatement>() != null;
+
+  bool get inForLoop =>
+      thisOrAncestorMatching((p) => p is ForStatement) != null;
+
+  bool get inLoop => inDoLoop || inForLoop || inWhileLoop;
+
+  bool get inSwitch => thisOrAncestorOfType<SwitchStatement>() != null;
+
+  bool get inWhileLoop => thisOrAncestorOfType<WhileStatement>() != null;
+}
+
+/// Extensions for [FunctionBody]s
+extension FunctionBodyExtensions on FunctionBody {
+  bool get isEmpty =>
+      this is EmptyFunctionBody ||
+      (this is BlockFunctionBody && beginToken.isSynthetic);
+}
diff --git a/pkg/analysis_server/lib/src/utilities/mocks.dart b/pkg/analysis_server/lib/src/utilities/mocks.dart
index 1552225..1602ed4 100644
--- a/pkg/analysis_server/lib/src/utilities/mocks.dart
+++ b/pkg/analysis_server/lib/src/utilities/mocks.dart
@@ -148,6 +148,12 @@
   Map<PluginInfo, Future<plugin.Response>> broadcastResults;
 
   @override
+  List<PluginInfo> plugins = [];
+
+  StreamController<void> pluginsChangedController =
+      StreamController.broadcast();
+
+  @override
   String get byteStorePath {
     fail('Unexpected invocation of byteStorePath');
   }
@@ -163,9 +169,7 @@
   }
 
   @override
-  List<PluginInfo> get plugins {
-    fail('Unexpected invocation of plugins');
-  }
+  Stream<void> get pluginsChanged => pluginsChangedController.stream;
 
   @override
   ResourceProvider get resourceProvider {
diff --git a/pkg/analysis_server/test/domain_edit_dartfix_test.dart b/pkg/analysis_server/test/domain_edit_dartfix_test.dart
index 7cff0de..70b8662 100644
--- a/pkg/analysis_server/test/domain_edit_dartfix_test.dart
+++ b/pkg/analysis_server/test/domain_edit_dartfix_test.dart
@@ -68,7 +68,7 @@
 
     var fix = EditDartFix(server, request);
     final response = await fix.compute();
-    fix.nonNullableFixTask?.server?.close();
+    fix.nonNullableFixTask?.shutdownServer();
     expect(response.id, id);
     return response;
   }
diff --git a/pkg/analysis_server/test/lsp/folding_test.dart b/pkg/analysis_server/test/lsp/folding_test.dart
index b27ea0b..49dc5ce 100644
--- a/pkg/analysis_server/test/lsp/folding_test.dart
+++ b/pkg/analysis_server/test/lsp/folding_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
+import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -66,6 +68,65 @@
     expect(regions, unorderedEquals(expectedRegions));
   }
 
+  Future<void> test_fromPlugins_dartFile() async {
+    final pluginAnalyzedFilePath = join(projectFolderPath, 'lib', 'foo.dart');
+    final pluginAnalyzedUri = Uri.file(pluginAnalyzedFilePath);
+
+    const content = '''
+    // [[contributed by fake plugin]]
+
+    class AnnotatedDartClass {[[
+      // content of dart class, contributed by server
+    ]]}
+    ''';
+    final ranges = rangesFromMarkers(content);
+    final withoutMarkers = withoutRangeMarkers(content);
+    newFile(pluginAnalyzedFilePath);
+
+    await initialize();
+    await openFile(pluginAnalyzedUri, withoutMarkers);
+
+    final pluginResult = plugin.AnalysisFoldingParams(
+      pluginAnalyzedFilePath,
+      [plugin.FoldingRegion(plugin.FoldingKind.DIRECTIVES, 7, 26)],
+    );
+    configureTestPlugin(notification: pluginResult.toNotification());
+
+    final res = await getFoldingRegions(pluginAnalyzedUri);
+    expect(
+      res,
+      unorderedEquals([
+        _toFoldingRange(ranges[0], FoldingRangeKind.Imports),
+        _toFoldingRange(ranges[1], null),
+      ]),
+    );
+  }
+
+  Future<void> test_fromPlugins_nonDartFile() async {
+    final pluginAnalyzedFilePath = join(projectFolderPath, 'lib', 'foo.sql');
+    final pluginAnalyzedUri = Uri.file(pluginAnalyzedFilePath);
+    const content = '''
+      CREATE TABLE foo(
+         [[-- some columns]]
+      );
+    ''';
+    final withoutMarkers = withoutRangeMarkers(content);
+    newFile(pluginAnalyzedFilePath, content: withoutMarkers);
+
+    await initialize();
+    await openFile(pluginAnalyzedUri, withoutMarkers);
+
+    final pluginResult = plugin.AnalysisFoldingParams(
+      pluginAnalyzedFilePath,
+      [plugin.FoldingRegion(plugin.FoldingKind.CLASS_BODY, 33, 15)],
+    );
+    configureTestPlugin(notification: pluginResult.toNotification());
+
+    final res = await getFoldingRegions(pluginAnalyzedUri);
+    final expectedRange = rangeFromMarkers(content);
+    expect(res, [_toFoldingRange(expectedRange, null)]);
+  }
+
   Future<void> test_headersImportsComments() async {
     // TODO(dantup): Review why the file header and the method comment ranges
     // are different... one spans only the range to collapse, but the other
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
index 0d0421f..2d132bb 100644
--- a/pkg/analysis_server/test/lsp/initialization_test.dart
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -5,7 +5,8 @@
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
-import 'package:analysis_server/src/lsp/handlers/handler_initialize.dart';
+import 'package:analysis_server/src/lsp/server_capabilities_computer.dart';
+import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -185,6 +186,95 @@
     }
   }
 
+  Future<void> test_dynamicRegistration_unregistersOutdatedAfterChange() async {
+    // Initialize by supporting dynamic registrations everywhere
+    List<Registration> registrations;
+    await handleExpectedRequest<ResponseMessage, RegistrationParams, void>(
+      Method.client_registerCapability,
+      () => initialize(
+          textDocumentCapabilities: withAllSupportedDynamicRegistrations(
+              emptyTextDocumentClientCapabilities)),
+      handler: (registrationParams) =>
+          registrations = registrationParams.registrations,
+    );
+
+    final unregisterRequest =
+        await expectRequest(Method.client_unregisterCapability, () {
+      final plugin = configureTestPlugin();
+      plugin.currentSession = PluginSession(plugin)
+        ..interestingFiles = ['*.foo'];
+      pluginManager.pluginsChangedController.add(null);
+    });
+    final unregistrations =
+        (unregisterRequest.params as UnregistrationParams).unregisterations;
+
+    // folding method should have been unregistered as the server now supports
+    // *.foo files for it as well.
+    final registrationIdForFolding = registrations
+        .singleWhere((r) => r.method == 'textDocument/foldingRange')
+        .id;
+    expect(
+      unregistrations,
+      contains(isA<Unregistration>()
+          .having((r) => r.method, 'method', 'textDocument/foldingRange')
+          .having((r) => r.id, 'id', registrationIdForFolding)),
+    );
+
+    // Renaming documents is a Dart-specific service that should not have been
+    // affected by the plugin change.
+    final registrationIdForRename =
+        registrations.singleWhere((r) => r.method == 'textDocument/rename').id;
+    expect(
+        unregistrations,
+        isNot(contains(isA<Unregistration>()
+            .having((r) => r.id, 'id', registrationIdForRename))));
+  }
+
+  Future<void> test_dynamicRegistration_updatesWithPlugins() async {
+    await initialize(
+      textDocumentCapabilities:
+          extendTextDocumentCapabilities(emptyTextDocumentClientCapabilities, {
+        'foldingRange': {'dynamicRegistration': true},
+      }),
+    );
+
+    // The server will send an unregister request followed by another register
+    // request to change document filter on folding. We need to respond to the
+    // unregister request as the server awaits that.
+    requestsFromServer
+        .firstWhere((r) => r.method == Method.client_unregisterCapability)
+        .then((request) {
+      respondTo(request, null);
+      return (request.params as UnregistrationParams).unregisterations;
+    });
+
+    final request = await expectRequest(Method.client_registerCapability, () {
+      final plugin = configureTestPlugin();
+      plugin.currentSession = PluginSession(plugin)
+        ..interestingFiles = ['*.sql'];
+      pluginManager.pluginsChangedController.add(null);
+    });
+
+    final registrations = (request.params as RegistrationParams).registrations;
+
+    final documentFilterSql = DocumentFilter(null, 'file', '**/*.sql');
+    final documentFilterDart = DocumentFilter('dart', 'file', null);
+    final expectedFoldingRegistration =
+        isA<TextDocumentRegistrationOptions>().having(
+      (o) => o.documentSelector,
+      'documentSelector',
+      containsAll([documentFilterSql, documentFilterDart]),
+    );
+
+    expect(
+      registrations,
+      contains(isA<Registration>()
+          .having((r) => r.method, 'method', 'textDocument/foldingRange')
+          .having((r) => r.registerOptions, 'registerOptions',
+              expectedFoldingRegistration)),
+    );
+  }
+
   Future<void> test_initialize() async {
     final response = await initialize();
     expect(response, isNotNull);
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index ebd7388..b009198 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -49,11 +49,25 @@
   @override
   Stream<Message> get serverToClient => channel.serverToClient;
 
-  void configureTestPlugin({plugin.ResponseResult respondWith}) {
-    PluginInfo info = DiscoveredPluginInfo('a', 'b', 'c', null, null);
-    pluginManager.broadcastResults = <PluginInfo, Future<plugin.Response>>{
-      info: Future.value(respondWith.toResponse('-', 1))
-    };
+  DiscoveredPluginInfo configureTestPlugin({
+    plugin.ResponseResult respondWith,
+    plugin.Notification notification,
+  }) {
+    final info = DiscoveredPluginInfo('a', 'b', 'c', null, null);
+    pluginManager.plugins.add(info);
+
+    if (respondWith != null) {
+      pluginManager.broadcastResults = <PluginInfo, Future<plugin.Response>>{
+        info: Future.value(respondWith.toResponse('-', 1))
+      };
+    }
+
+    if (notification != null) {
+      server.notificationManager
+          .handlePluginNotification(info.pluginId, notification);
+    }
+
+    return info;
   }
 
   /// Sends a request to the server and unwraps the result. Throws if the
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index ff816cc..9fd7549 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
@@ -285,6 +285,69 @@
         selectionLength: 22);
   }
 
+  Future<void> test_no_target_inClass_of_interface() async {
+    addTestSource('''
+class A {
+  void foo() {}
+}
+
+class B implements A {
+  ^
+}
+''');
+    await computeSuggestions();
+    _assertOverride('''
+@override
+  void foo() {
+    // TODO: implement foo
+  }''', displayText: 'foo() { … }', selectionOffset: 51, selectionLength: 0);
+  }
+
+  Future<void> test_no_target_inComment() async {
+    addTestSource('''
+class A {
+  void foo() {}
+}
+
+class B implements A {
+  // comment ^
+  void m() {}
+}
+''');
+    await computeSuggestions();
+    _assertNoOverrideContaining('foo');
+  }
+
+  Future<void> test_no_target_inComment2() async {
+    addTestSource('''
+class A {
+  void foo() {}
+}
+
+class B implements A {
+  /// dartdoc ^
+  void m() {}
+}
+''');
+    await computeSuggestions();
+    _assertNoOverrideContaining('foo');
+  }
+
+  Future<void> test_no_target_inComment3() async {
+    addTestSource('''
+class A {
+  void foo() {}
+}
+
+class B implements A {
+  /// Asdf [St^]
+  void m() {}
+}
+''');
+    await computeSuggestions();
+    _assertNoOverrideContaining('foo');
+  }
+
   Future<void> test_outsideOfWorkspace() async {
     testFile = convertPath('/home/other/lib/a.dart');
     addTestSource('''
diff --git a/pkg/analysis_server/test/src/cider/completion_test.dart b/pkg/analysis_server/test/src/cider/completion_test.dart
index 1d14888..9aedd3f 100644
--- a/pkg/analysis_server/test/src/cider/completion_test.dart
+++ b/pkg/analysis_server/test/src/cider/completion_test.dart
@@ -22,6 +22,7 @@
 class CiderCompletionComputerTest extends CiderServiceTest {
   final CiderCompletionCache _completionCache = CiderCompletionCache();
 
+  CiderCompletionComputer _computer;
   CiderCompletionResult _completionResult;
   List<CompletionSuggestion> _suggestions;
 
@@ -44,7 +45,7 @@
 
     // ignore: deprecated_member_use_from_same_package
     _suggestions = await _newComputer().compute(
-      testPath,
+      convertPath(testPath),
       context.offset,
     );
 
@@ -78,6 +79,22 @@
     _assertNoClass(text: 'Random');
   }
 
+  Future<void> test_compute2_sameSignature_sameResult() async {
+    _createFileResolver();
+    await _compute2(r'''
+var a = ^;
+''');
+    var lastResult = _completionResult;
+
+    // Ask for completion using new resolver and computer.
+    // But the file signature is the same, so the same result.
+    _createFileResolver();
+    await _compute2(r'''
+var a = ^;
+''');
+    expect(_completionResult, same(lastResult));
+  }
+
   Future<void> test_compute2_updateImportedLibrary() async {
     var corePath = convertPath('/sdk/lib/core/core.dart');
 
@@ -139,20 +156,135 @@
     _assertHasClass(text: 'String');
   }
 
+  Future<void> test_filterSort_byPattern_excludeNotMatching() async {
+    await _compute2(r'''
+var a = F^;
+''');
+
+    _assertHasClass(text: 'Future');
+    _assertNoClass(text: 'String');
+  }
+
+  Future<void> test_filterSort_byPattern_location_beforeMethod() async {
+    await _compute2(r'''
+class A {
+  F^
+  void foo() {}
+}
+''');
+
+    _assertHasClass(text: 'Future');
+    _assertNoClass(text: 'String');
+  }
+
+  Future<void> test_filterSort_byPattern_location_functionReturnType() async {
+    await _compute2(r'''
+F^ foo() {}
+''');
+
+    _assertHasClass(text: 'Future');
+    _assertNoClass(text: 'String');
+  }
+
+  Future<void> test_filterSort_byPattern_location_methodReturnType() async {
+    await _compute2(r'''
+class A {
+  F^ foo() {}
+}
+''');
+
+    _assertHasClass(text: 'Future');
+    _assertNoClass(text: 'String');
+  }
+
+  Future<void> test_filterSort_byPattern_location_parameterType() async {
+    await _compute2(r'''
+void foo(F^ a) {}
+''');
+
+    _assertHasClass(text: 'Future');
+    _assertNoClass(text: 'String');
+  }
+
+  Future<void> test_filterSort_byPattern_location_parameterType2() async {
+    await _compute2(r'''
+void foo(^a) {}
+''');
+
+    _assertHasClass(text: 'Future');
+    _assertHasClass(text: 'String');
+  }
+
+  Future<void> test_filterSort_byPattern_location_statement() async {
+    await _compute2(r'''
+main() {
+  F^
+  0;
+}
+''');
+
+    _assertHasClass(text: 'Future');
+    _assertNoClass(text: 'String');
+  }
+
+  Future<void> test_filterSort_byPattern_preferPrefix() async {
+    await _compute2(r'''
+class Foobar {}
+class Falcon {}
+var a = Fo^;
+''');
+
+    _assertOrder([
+      _assertHasClass(text: 'Foobar'),
+      _assertHasClass(text: 'Falcon'),
+    ]);
+  }
+
+  Future<void> test_filterSort_preferLocal() async {
+    await _compute2(r'''
+var a = 0;
+main() {
+  var b = 0;
+  var v = ^;
+}
+''');
+
+    _assertOrder([
+      _assertHasLocalVariable(text: 'b'),
+      _assertHasTopLevelVariable(text: 'a'),
+    ]);
+  }
+
+  Future<void> test_filterSort_sortByName() async {
+    await _compute2(r'''
+main() {
+  var a = 0;
+  var b = 0;
+  var v = ^;
+}
+''');
+
+    _assertOrder([
+      _assertHasLocalVariable(text: 'a'),
+      _assertHasLocalVariable(text: 'b'),
+    ]);
+  }
+
   void _assertComputedImportedLibraries(List<String> expected) {
     expected = expected.map(convertPath).toList();
     expect(
-      _completionResult.computedImportedLibraries,
+      _computer.computedImportedLibraries,
       unorderedEquals(expected),
     );
   }
 
-  void _assertHasClass({@required String text}) {
+  CompletionSuggestion _assertHasClass({@required String text}) {
     var matching = _matchingCompletions(
       text: text,
       elementKind: ElementKind.CLASS,
     );
     expect(matching, hasLength(1), reason: 'Expected exactly one completion');
+    return matching.single;
   }
 
   void _assertHasCompletion({@required String text}) {
@@ -160,6 +292,32 @@
     expect(matching, hasLength(1), reason: 'Expected exactly one completion');
   }
 
+  CompletionSuggestion _assertHasLocalVariable({@required String text}) {
+    var matching = _matchingCompletions(
+      text: text,
+      elementKind: ElementKind.LOCAL_VARIABLE,
+    );
+    expect(
+      matching,
+      hasLength(1),
+      reason: 'Expected exactly one completion in $_suggestions',
+    );
+    return matching.single;
+  }
+
+  CompletionSuggestion _assertHasTopLevelVariable({@required String text}) {
+    var matching = _matchingCompletions(
+      text: text,
+      elementKind: ElementKind.TOP_LEVEL_VARIABLE,
+    );
+    expect(
+      matching,
+      hasLength(1),
+      reason: 'Expected exactly one completion in $_suggestions',
+    );
+    return matching.single;
+  }
+
   void _assertNoClass({@required String text}) {
     var matching = _matchingCompletions(
       text: text,
@@ -168,13 +326,23 @@
     expect(matching, isEmpty, reason: 'Expected zero completions');
   }
 
+  void _assertOrder(List<CompletionSuggestion> suggestions) {
+    var lastIndex = -2;
+    for (var suggestion in suggestions) {
+      var index = _suggestions.indexOf(suggestion);
+      expect(index, isNonNegative, reason: '$suggestion');
+      expect(index, greaterThan(lastIndex), reason: '$suggestion');
+      lastIndex = index;
+    }
+  }
+
   Future _compute2(String content) async {
     var context = _updateFile(content);
 
     _completionResult = await _newComputer().compute2(
-      path: testPath,
+      path: convertPath(testPath),
       line: context.line,
-      character: context.character,
+      column: context.character,
     );
     _suggestions = _completionResult.suggestions;
   }
@@ -202,12 +370,14 @@
   }
 
   CiderCompletionComputer _newComputer() {
-    return CiderCompletionComputer(logger, _completionCache, fileResolver);
+    return _computer = CiderCompletionComputer(
+      logger,
+      _completionCache,
+      fileResolver,
+    );
   }
 
   _CompletionContext _updateFile(String content) {
-    newFile(testPath, content: content);
-
     var offset = content.indexOf('^');
     expect(offset, isPositive, reason: 'Expected to find ^');
     expect(content.indexOf('^', offset + 1), -1, reason: 'Expected only one ^');
@@ -215,6 +385,9 @@
     var lineInfo = LineInfo.fromContent(content);
     var location = lineInfo.getLocation(offset);
 
+    content = content.substring(0, offset) + content.substring(offset + 1);
+    newFile(testPath, content: content);
+
     return _CompletionContext(
       content,
       offset,
diff --git a/pkg/analysis_server/test/src/edit/test_all.dart b/pkg/analysis_server/test/src/edit/test_all.dart
index f63fe71..b91a43d 100644
--- a/pkg/analysis_server/test/src/edit/test_all.dart
+++ b/pkg/analysis_server/test/src/edit/test_all.dart
@@ -5,13 +5,9 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'fix/test_all.dart' as fix;
-import 'nnbd_migration/test_all.dart' as nnbd_migration;
-import 'preview/test_all.dart' as preview;
 
 void main() {
   defineReflectiveSuite(() {
     fix.main();
-    nnbd_migration.main();
-    preview.main();
   }, name: 'edit');
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart
index 3dfe23e..6a2da91 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -12,22 +11,15 @@
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ConvertToIfElementTest);
+    defineReflectiveTests(ConvertToForElementTest);
   });
 }
 
 @reflectiveTest
-class ConvertToIfElementTest extends AssistProcessorTest {
+class ConvertToForElementTest extends AssistProcessorTest {
   @override
   AssistKind get kind => DartAssistKind.CONVERT_TO_FOR_ELEMENT;
 
-  @override
-  void setUp() {
-    createAnalysisOptionsFile(
-        experiments: [EnableString.control_flow_collections]);
-    super.setUp();
-  }
-
   Future<void> test_mapFromIterable_complexKey() async {
     await resolveTestUnit('''
 f(Iterable<int> i) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_on_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_on_type_test.dart
new file mode 100644
index 0000000..41d23a3
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_on_type_test.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToOnTypeTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToOnTypeTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.CONVERT_TO_ON_TYPE;
+
+  @override
+  String get lintCode => LintNames.avoid_types_as_parameter_names;
+
+  Future<void> test_withOnType() async {
+    await resolveTestUnit('''
+void f() {
+  try {
+  } on ArgumentError catch (Object) {
+  }
+}
+''');
+    await assertNoFix(
+      errorFilter: lintNameFilter(
+        LintNames.avoid_types_as_parameter_names,
+      ),
+    );
+  }
+
+  Future<void> test_withoutStackTrace() async {
+    await resolveTestUnit('''
+void f() {
+  try {
+  } catch (ArgumentError) {
+  }
+}
+''');
+    await assertHasFix('''
+void f() {
+  try {
+  } on ArgumentError {
+  }
+}
+''');
+  }
+
+  Future<void> test_withStackTrace() async {
+    await resolveTestUnit('''
+void f() {
+  try {
+  } catch (ArgumentError, st) {
+    st;
+  }
+}
+''');
+    await assertHasFix('''
+void f() {
+  try {
+  } on ArgumentError catch (_, st) {
+    st;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
index d806718..1ed5b4a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -34,6 +34,12 @@
   /// Return the lint code being tested.
   String get lintCode;
 
+  bool Function(AnalysisError) lintNameFilter(String name) {
+    return (e) {
+      return e.errorCode is LintCode && e.errorCode.name == name;
+    };
+  }
+
   @override
   void setUp() {
     super.setUp();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart b/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart
index 8da5969..48d2b28 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart
@@ -11,12 +11,12 @@
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(SortChildPropertiesLastTest);
+    defineReflectiveTests(SortChildPropertyLastTest);
   });
 }
 
 @reflectiveTest
-class SortChildPropertiesLastTest extends FixProcessorLintTest {
+class SortChildPropertyLastTest extends FixProcessorLintTest {
   @override
   FixKind get kind => DartFixKind.SORT_CHILD_PROPERTY_LAST;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 843263f..2c18bb7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -52,6 +52,7 @@
 import 'convert_to_map_literal_test.dart' as convert_to_map_literal;
 import 'convert_to_named_arguments_test.dart' as convert_to_named_arguments;
 import 'convert_to_null_aware_test.dart' as convert_to_null_aware;
+import 'convert_to_on_type_test.dart' as convert_to_on_type;
 import 'convert_to_package_import_test.dart' as convert_to_package_import;
 import 'convert_to_relative_import_test.dart' as convert_to_relative_import;
 import 'convert_to_set_literal_test.dart' as convert_to_set_literal;
@@ -199,6 +200,7 @@
     convert_to_map_literal.main();
     convert_to_named_arguments.main();
     convert_to_null_aware.main();
+    convert_to_on_type.main();
     convert_to_package_import.main();
     convert_to_relative_import.main();
     convert_to_set_literal.main();
diff --git a/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart b/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart
index f1cd4e2..9d4e2bb 100644
--- a/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart
+++ b/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart
@@ -1210,30 +1210,34 @@
   String _argumentListContext(AstNode node) {
     if (node is ArgumentList) {
       var parent = node.parent;
-      if (parent is InstanceCreationExpression) {
+      if (parent is Annotation) {
+        return 'annotation';
+      } else if (parent is ExtensionOverride) {
+        return 'extensionOverride';
+      } else if (parent is FunctionExpressionInvocation) {
+        return 'function';
+      } else if (parent is InstanceCreationExpression) {
         if (flutter.isWidgetType(parent.staticType)) {
           return 'widgetConstructor';
         }
         return 'constructor';
       } else if (parent is MethodInvocation) {
         return 'method';
-      } else if (parent is FunctionExpressionInvocation) {
-        return 'function';
-      } else if (parent is SuperConstructorInvocation ||
-          parent is RedirectingConstructorInvocation) {
+      } else if (parent is RedirectingConstructorInvocation) {
         return 'constructorRedirect';
-      } else if (parent is Annotation) {
-        return 'annotation';
+      } else if (parent is SuperConstructorInvocation) {
+        return 'constructorRedirect';
       }
-    } else if (node is IndexExpression) {
-      return 'index';
     } else if (node is AssignmentExpression ||
         node is BinaryExpression ||
         node is PrefixExpression ||
         node is PostfixExpression) {
       return 'operator';
+    } else if (node is IndexExpression) {
+      return 'index';
     }
-    throw ArgumentError('Unknown parent of ${node.runtimeType}');
+    throw ArgumentError(
+        'Unknown parent of ${node.runtimeType}: ${node.parent.runtimeType}');
   }
 
   /// Return the first child of the [node] that is neither a comment nor an
diff --git a/pkg/analysis_server/tool/lsp_spec/README.md b/pkg/analysis_server/tool/lsp_spec/README.md
index da5c60f..3208c04 100644
--- a/pkg/analysis_server/tool/lsp_spec/README.md
+++ b/pkg/analysis_server/tool/lsp_spec/README.md
@@ -46,7 +46,7 @@
 | window/logMessage | ✅ | | | |
 | telemetry/event | | | | |
 | client/registerCapability | ✅ | ✅ | ✅ | ✅ |
-| client/unregisterCapability | | | | | (unused, capabilities don't change currently)
+| client/unregisterCapability | ✅ | ✅ | ✅ | | Capabilities only change when using analyzer plugins
 | workspace/workspaceFolders | | | | |
 | workspace/didChangeWorkspaceFolders | ✅ | ✅ | ✅ | ✅ |
 | workspace/configuration | | | | |
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 3e0c73e..abb323f 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.39.8-dev
+* Deprecated `VariableElement.constantValue`, it does not guarantee that
+  the value has been computed. Use `computeConstantValue()` instead.
+
 ## 0.39.7
 * Added new error codes: ENUM_CONSTANT_SAME_NAME_AS_ENCLOSING and
   THROW_OF_INVALID_TYPE.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 4841b13..308face 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1735,6 +1735,7 @@
   /// Return `null` if either this variable was not declared with the 'const'
   /// modifier or if the value of this variable could not be computed because of
   /// errors.
+  @Deprecated('Use computeConstantValue() instead')
   DartObject get constantValue;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
index 1456849..a5652ec 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
@@ -106,12 +106,17 @@
   }
 
   static void _cleanUpFolder(String cachePath, int maxSizeBytes) {
+    List<FileSystemEntity> resources;
+    try {
+      resources = Directory(cachePath).listSync(recursive: true);
+    } catch (_) {
+      return;
+    }
+
     // Prepare the list of files and their statistics.
     List<File> files = <File>[];
     Map<File, FileStat> fileStatMap = {};
     int currentSizeBytes = 0;
-    List<FileSystemEntity> resources =
-        Directory(cachePath).listSync(recursive: true);
     for (FileSystemEntity resource in resources) {
       if (resource is File) {
         try {
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index ec2e3e9..559c900 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/element/element.dart'
     show CompilationUnitElement, LibraryElement;
 import 'package:analyzer/exception/exception.dart';
@@ -44,7 +43,7 @@
 
   final PerformanceLog logger;
   final ByteStore byteStore;
-  final AnalysisSession analysisSession;
+  final AnalysisSessionImpl analysisSession;
   final SummaryDataStore externalSummaries;
   final SummaryDataStore store = SummaryDataStore([]);
 
@@ -60,7 +59,7 @@
   var loadedBundles = Set<LibraryCycle>.identity();
 
   LibraryContext({
-    @required AnalysisSession session,
+    @required AnalysisSessionImpl session,
     @required PerformanceLog logger,
     @required ByteStore byteStore,
     @required FileSystemState fsState,
diff --git a/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
index 543e4ba..f14f835 100644
--- a/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
+++ b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
@@ -24,6 +24,15 @@
     _map.remove(element);
   }
 
+  /// Remove hierarchies for classes defined in specified libraries.
+  void removeOfLibraries(Iterable<String> uriStrIterable) {
+    var uriStrSet = uriStrIterable.toSet();
+    _map.removeWhere((element, _) {
+      var uriStr = '${element.librarySource.uri}';
+      return uriStrSet.contains(uriStr);
+    });
+  }
+
   _Hierarchy _getHierarchy(ClassElement element) {
     var hierarchy = _map[element];
 
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 23be79f..2fc7443 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -1021,6 +1021,7 @@
   @override
   VariableElement get baseElement => declaration;
 
+  @Deprecated('Use computeConstantValue() instead')
   @override
   DartObject get constantValue => declaration.constantValue;
 
diff --git a/pkg/analyzer/lib/src/dart/element/top_merge.dart b/pkg/analyzer/lib/src/dart/element/top_merge.dart
index d166d7f..974ad2e 100644
--- a/pkg/analyzer/lib/src/dart/element/top_merge.dart
+++ b/pkg/analyzer/lib/src/dart/element/top_merge.dart
@@ -44,6 +44,11 @@
       return DynamicTypeImpl.instance;
     }
 
+    if (identical(T, NeverTypeImpl.instance) &&
+        identical(S, NeverTypeImpl.instance)) {
+      return NeverTypeImpl.instance;
+    }
+
     // NNBD_TOP_MERGE(void, void) = void
     var T_isVoid = identical(T, VoidTypeImpl.instance);
     var S_isVoid = identical(S, VoidTypeImpl.instance);
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index e0d05e7..30f89ed 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -55,6 +55,9 @@
    */
   final Source source;
 
+  /// Files that reference this file.
+  final List<FileState> referencingFiles = [];
+
   final List<FileState> importedFiles = [];
   final List<FileState> exportedFiles = [];
   final List<FileState> partedFiles = [];
@@ -87,9 +90,32 @@
 
   LineInfo get lineInfo => LineInfo(unlinked2.lineStarts);
 
+  /// The resolved signature of the file, that depends on the [libraryCycle]
+  /// signature, and the content of the file.
+  String get resolvedSignature {
+    var signatureBuilder = ApiSignature();
+    signatureBuilder.addString(path);
+    signatureBuilder.addBytes(libraryCycle.signature);
+
+    var content = getContent();
+    signatureBuilder.addString(content);
+
+    return signatureBuilder.toHex();
+  }
+
   /// Return the [uri] string.
   String get uriStr => uri.toString();
 
+  /// Return the content of the file, the empty string if cannot be read.
+  String getContent() {
+    try {
+      var resource = _fsState._resourceProvider.getFile(path);
+      return resource.readAsStringSync();
+    } catch (_) {
+      return '';
+    }
+  }
+
   void internal_setLibraryCycle(LibraryCycle cycle, String signature) {
     _libraryCycle = cycle;
   }
@@ -129,8 +155,13 @@
   }
 
   void refresh() {
-    _digest = utf8.encode(_fsState.getFileDigest(path));
-    _exists = _digest.isNotEmpty;
+    _fsState.testView.refreshedFiles.add(path);
+
+    _fsState.timers.digest.run(() {
+      _digest = utf8.encode(_fsState.getFileDigest(path));
+      _exists = _digest.isNotEmpty;
+    });
+
     String unlinkedKey = path;
 
     // Prepare bytes of the unlinked bundle - existing or new.
@@ -148,21 +179,22 @@
       }
 
       if (bytes == null || bytes.isEmpty) {
-        String content;
-        try {
-          content = _fsState._resourceProvider.getFile(path).readAsStringSync();
-        } catch (_) {
-          content = '';
-        }
-        var unit = parse(AnalysisErrorListener.NULL_LISTENER, content);
-        _fsState._logger.run('Create unlinked for $path', () {
+        var content = _fsState.timers.read.run(() {
+          return getContent();
+        });
+        var unit = _fsState.timers.parse.run(() {
+          return parse(AnalysisErrorListener.NULL_LISTENER, content);
+        });
+        _fsState.timers.unlinked.run(() {
           var unlinkedBuilder = serializeAstCiderUnlinked(_digest, unit);
           bytes = unlinkedBuilder.toBuffer();
           _fsState._byteStore.put(unlinkedKey, bytes);
         });
 
-        unlinked2 = CiderUnlinkedUnit.fromBuffer(bytes).unlinkedUnit;
-        _prefetchDirectReferences(unlinked2);
+        _fsState.timers.prefetch.run(() {
+          unlinked2 = CiderUnlinkedUnit.fromBuffer(bytes).unlinkedUnit;
+          _prefetchDirectReferences(unlinked2);
+        });
       }
     }
 
@@ -206,7 +238,10 @@
       return _fsState.unresolvedFile;
     }
 
-    return _fsState.getFileForUri(absoluteUri);
+    var file = _fsState.getFileForUri(absoluteUri);
+    file.referencingFiles.add(this);
+
+    return file;
   }
 
   void _prefetchDirectReferences(UnlinkedUnit2 unlinkedUnit2) {
@@ -341,6 +376,10 @@
    */
   FileState _unresolvedFile;
 
+  final FileSystemStateTimers timers = FileSystemStateTimers();
+
+  final FileSystemStateTestView testView = FileSystemStateTestView();
+
   FileSystemState(
     this._logger,
     this._resourceProvider,
@@ -364,6 +403,23 @@
     return _unresolvedFile;
   }
 
+  /// Update the state to reflect the fact that the file with the given [path]
+  /// was changed. Specifically this means that we evict this file and every
+  /// file that referenced it.
+  void changeFile(String path, List<FileState> removedFiles) {
+    var file = _pathToFile.remove(path);
+    if (file == null) {
+      return;
+    }
+
+    removedFiles.add(file);
+    _uriToFile.remove(file.uri);
+
+    for (var reference in file.referencingFiles) {
+      changeFile(reference.path, removedFiles);
+    }
+  }
+
   FileState getFileForPath(String path) {
     var file = _pathToFile[path];
     if (file == null) {
@@ -408,6 +464,60 @@
     }
     return source.fullName;
   }
+
+  void logStatistics() {
+    _logger.writeln(
+      '[files: ${_pathToFile.length}]'
+      '[digest: ${timers.digest.timer.elapsedMilliseconds} ms]'
+      '[read: ${timers.read.timer.elapsedMilliseconds} ms]'
+      '[parse: ${timers.parse.timer.elapsedMilliseconds} ms]'
+      '[unlinked: ${timers.unlinked.timer.elapsedMilliseconds} ms]'
+      '[prefetch: ${timers.prefetch.timer.elapsedMilliseconds} ms]',
+    );
+    timers.reset();
+  }
+}
+
+class FileSystemStateTestView {
+  final List<String> refreshedFiles = [];
+}
+
+class FileSystemStateTimer {
+  final Stopwatch timer = Stopwatch();
+
+  T run<T>(T Function() f) {
+    timer.start();
+    try {
+      return f();
+    } finally {
+      timer.stop();
+    }
+  }
+
+  Future<T> runAsync<T>(T Function() f) async {
+    timer.start();
+    try {
+      return f();
+    } finally {
+      timer.stop();
+    }
+  }
+}
+
+class FileSystemStateTimers {
+  final FileSystemStateTimer digest = FileSystemStateTimer();
+  final FileSystemStateTimer read = FileSystemStateTimer();
+  final FileSystemStateTimer parse = FileSystemStateTimer();
+  final FileSystemStateTimer unlinked = FileSystemStateTimer();
+  final FileSystemStateTimer prefetch = FileSystemStateTimer();
+
+  void reset() {
+    digest.timer.reset();
+    read.timer.reset();
+    parse.timer.reset();
+    unlinked.timer.reset();
+    prefetch.timer.reset();
+  }
 }
 
 /// Information about libraries that reference each other, so form a cycle.
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 57506b2..f6b5fc2 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -41,6 +41,13 @@
 import 'package:meta/meta.dart';
 import 'package:yaml/yaml.dart';
 
+class FileContext {
+  final AnalysisOptionsImpl analysisOptions;
+  final FileState file;
+
+  FileContext(this.analysisOptions, this.file);
+}
+
 class FileResolver {
   final PerformanceLog logger;
   final ResourceProvider resourceProvider;
@@ -62,6 +69,16 @@
 
   final Workspace workspace;
 
+  /// If not `null`, the library context will be reset after the specified
+  /// interval of inactivity. Keeping library context with loaded elements
+  /// significantly improves performance of resolution, because we don't have
+  /// to resynthesize elements, build export scopes for libraries, etc.
+  /// However keeping elements that we don't need anymore, or when the user
+  /// does not work with files, is wasteful.
+  ///
+  /// TODO(scheglov) use it
+  final Duration libraryContextResetDuration;
+
   /// This field gets value only during testing.
   FileResolverTestView testView;
 
@@ -71,20 +88,46 @@
 
   _LibraryContext libraryContext;
 
-  FileResolver(this.logger, this.resourceProvider, this.byteStore,
-      this.sourceFactory, this.getFileDigest, this.prefetchFiles,
-      {@required Workspace workspace})
-      : this.workspace = workspace;
+  FileResolver(
+    this.logger,
+    this.resourceProvider,
+    this.byteStore,
+    this.sourceFactory,
+    this.getFileDigest,
+    this.prefetchFiles, {
+    @required Workspace workspace,
+    this.libraryContextResetDuration,
+  }) : this.workspace = workspace;
 
   FeatureSet get defaultFeatureSet => FeatureSet.fromEnableFlags([]);
 
+  /// Update the resolver to reflect the fact that the file with the given
+  /// [path] was changed. We need to make sure that when this file, of any file
+  /// that directly or indirectly referenced it, is resolved, we used the new
+  /// state of the file.
+  void changeFile(String path) {
+    if (fsState == null) {
+      return;
+    }
+
+    // Remove this file and all files that transitively depend on it.
+    var removedFiles = <FileState>[];
+    fsState.changeFile(path, removedFiles);
+
+    // Remove libraries represented by removed files.
+    // If we need these libraries later, we will relink and reattach them.
+    if (libraryContext != null) {
+      libraryContext.elementFactory.removeLibraries(
+        removedFiles.map((e) => e.uriStr).toList(),
+      );
+    }
+  }
+
   ErrorsResult getErrors(String path) {
     _throwIfNotAbsoluteNormalizedPath(path);
 
     return logger.run('Get errors for $path', () {
-      var fileContext = logger.run('Get file $path', () {
-        return _createFileContext(path);
-      });
+      var fileContext = getFileContext(path, withLog: true);
       var file = fileContext.file;
 
       var errorsSignatureBuilder = ApiSignature();
@@ -127,10 +170,33 @@
     });
   }
 
+  FileContext getFileContext(String path, {bool withLog = false}) {
+    FileContext perform() {
+      var analysisOptions = _getAnalysisOptions(path);
+
+      _createContext(analysisOptions);
+
+      var file = fsState.getFileForPath(path);
+      return FileContext(analysisOptions, file);
+    }
+
+    if (withLog) {
+      return logger.run('Get file $path', () {
+        try {
+          return getFileContext(path);
+        } finally {
+          fsState.logStatistics();
+        }
+      });
+    } else {
+      return perform();
+    }
+  }
+
   String getLibraryLinkedSignature(String path) {
     _throwIfNotAbsoluteNormalizedPath(path);
 
-    var fileContext = _createFileContext(path);
+    var fileContext = getFileContext(path);
     var file = fileContext.file;
     return file.libraryCycle.signatureStr;
   }
@@ -139,9 +205,7 @@
     _throwIfNotAbsoluteNormalizedPath(path);
 
     return logger.run('Resolve $path', () {
-      var fileContext = logger.run('Get file $path', () {
-        return _createFileContext(path);
-      });
+      var fileContext = getFileContext(path, withLog: true);
       var file = fileContext.file;
 
       libraryContext.load2(file);
@@ -234,22 +298,23 @@
     }
 
     if (analysisContext == null) {
-      logger.run('Create AnalysisContext', () {
-        var root = ContextRootImpl(
-          resourceProvider,
-          resourceProvider.getFolder(workspace.root),
-        );
+      var rootFolder = resourceProvider.getFolder(workspace.root);
+      var root = ContextRootImpl(
+        resourceProvider,
+        rootFolder,
+      );
 
-        analysisContext = MicroAnalysisContextImpl(
-          this,
-          root,
-          analysisOptions,
-          DeclaredVariables(),
-          sourceFactory,
-          resourceProvider,
-          workspace: workspace,
-        );
-      });
+      root.included.add(rootFolder);
+
+      analysisContext = MicroAnalysisContextImpl(
+        this,
+        root,
+        analysisOptions,
+        DeclaredVariables(),
+        sourceFactory,
+        resourceProvider,
+        workspace: workspace,
+      );
     }
 
     if (libraryContext == null) {
@@ -265,15 +330,6 @@
     }
   }
 
-  _FileContext _createFileContext(String path) {
-    var analysisOptions = _getAnalysisOptions(path);
-
-    _createContext(analysisOptions);
-
-    var file = fsState.getFileForPath(path);
-    return _FileContext(analysisOptions, file);
-  }
-
   File _findOptionsFile(Folder folder) {
     while (folder != null) {
       File packagesFile =
@@ -359,13 +415,6 @@
   }
 }
 
-class _FileContext {
-  final AnalysisOptionsImpl analysisOptions;
-  final FileState file;
-
-  _FileContext(this.analysisOptions, this.file);
-}
-
 class _LibraryContext {
   final PerformanceLog logger;
   final ResourceProvider resourceProvider;
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 0a4d3d4..a44252f 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -350,6 +350,9 @@
       _errorReporter.reportErrorForToken(
           CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, node.awaitKeyword);
     }
+    if (_isNonNullableByDefault) {
+      _checkForUseOfVoidResult(node.expression);
+    }
     _checkForAwaitInLateLocalVariableInitializer(node);
     super.visitAwaitExpression(node);
   }
@@ -3143,7 +3146,12 @@
       return;
     }
 
-    if (identical(lhs.staticType, NeverTypeImpl.instance)) {
+    if (lhs is IndexExpression &&
+            identical(lhs.realTarget.staticType, NeverTypeImpl.instance) ||
+        lhs is PrefixedIdentifier &&
+            identical(lhs.prefix.staticType, NeverTypeImpl.instance) ||
+        lhs is PropertyAccess &&
+            identical(lhs.realTarget.staticType, NeverTypeImpl.instance)) {
       return;
     }
 
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 1dbeab5..ea4d2dd 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -517,7 +517,9 @@
         _unfinishedNullShorts.removeLast();
         _flowAnalysis.flow.nullAwareAccess_end();
       } while (identical(_unfinishedNullShorts.last, node));
-      node.staticType = typeSystem.makeNullable(node.staticType);
+      if (node is! CascadeExpression) {
+        node.staticType = typeSystem.makeNullable(node.staticType);
+      }
     }
   }
 
@@ -1691,6 +1693,7 @@
     body.accept(this);
     if (catchClauses.isNotEmpty) {
       flow.tryCatchStatement_bodyEnd(body);
+      nullSafetyDeadCodeVerifier?.flowEnd(node.body);
       nullSafetyDeadCodeVerifier.tryStatementEnter(node);
 
       var catchLength = catchClauses.length;
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index 4d4d3a1..374cfb3 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
@@ -18,7 +18,7 @@
 
 class LinkedElementFactory {
   final AnalysisContextImpl analysisContext;
-  final AnalysisSession analysisSession;
+  final AnalysisSessionImpl analysisSession;
   final Reference rootReference;
   final Map<String, LinkedLibraryContext> libraryMap = {};
 
@@ -150,10 +150,26 @@
   /// We have linked the bundle, and need to disconnect its libraries, so
   /// that the client can re-add the bundle, this time read from bytes.
   void removeBundle(LinkedBundleContext context) {
+    // TODO(scheglov) Use removeLibraries()
     for (var uriStr in context.libraryMap.keys) {
       libraryMap.remove(uriStr);
       rootReference.removeChild(uriStr);
     }
+
+    var classHierarchy = analysisSession.classHierarchy;
+    classHierarchy.removeOfLibraries(context.libraryMap.keys);
+  }
+
+  /// Remove libraries with the specified URIs from the reference tree, and
+  /// any session level caches.
+  void removeLibraries(List<String> uriStrList) {
+    for (var uriStr in uriStrList) {
+      libraryMap.remove(uriStr);
+      rootReference.removeChild(uriStr);
+    }
+
+    var classHierarchy = analysisSession.classHierarchy;
+    classHierarchy.removeOfLibraries(uriStrList);
   }
 
   /// Set optional informative data for the unit.
diff --git a/pkg/analyzer/test/id_tests/constant_test.dart b/pkg/analyzer/test/id_tests/constant_test.dart
index 7d6e44f..9a78106 100644
--- a/pkg/analyzer/test/id_tests/constant_test.dart
+++ b/pkg/analyzer/test/id_tests/constant_test.dart
@@ -68,7 +68,7 @@
       if (element is PropertyAccessorElement && element.isSynthetic) {
         var variable = element.variable;
         if (!variable.isSynthetic && variable.isConst) {
-          var value = variable.constantValue;
+          var value = variable.computeConstantValue();
           if (value != null) return _stringify(value);
         }
       }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 45376fd..c9d26a4 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -885,8 +885,8 @@
     var result = await driver.getResult(testFile);
     var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
     var y = AstFinder.getTopLevelVariableElement(result.unit, 'y');
-    expect(x.constantValue.toIntValue(), 2);
-    expect(y.constantValue.toIntValue(), 1);
+    expect(x.computeConstantValue().toIntValue(), 2);
+    expect(y.computeConstantValue().toIntValue(), 1);
   }
 
   test_const_externalConstFactory() async {
@@ -901,7 +901,7 @@
 ''');
     var result = await driver.getResult(testFile);
     var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
-    expect(x.constantValue, isNotNull);
+    expect(x.computeConstantValue(), isNotNull);
   }
 
   test_const_implicitCreation() async {
@@ -967,7 +967,7 @@
 ''');
     var result = await driver.getResult(testFile);
     var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
-    expect(x.constantValue, isNotNull);
+    expect(x.computeConstantValue(), isNotNull);
   }
 
   test_const_simple_topLevelVariable() async {
@@ -976,7 +976,7 @@
 ''');
     var result = await driver.getResult(testFile);
     var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
-    expect(x.constantValue.toIntValue(), 1);
+    expect(x.computeConstantValue().toIntValue(), 1);
   }
 
   test_currentSession() async {
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 7887d88..06e4bb6 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -2212,12 +2212,10 @@
     SimpleIdentifier argument = findNode.simple('C);');
     PropertyAccessorElementImpl getter = argument.staticElement;
     TopLevelVariableElement constant = getter.variable;
-    expect(constant.constantValue, isNull);
 
     DartObject value = constant.computeConstantValue();
     expect(value, isNotNull);
     expect(value.toIntValue(), 42);
-    expect(constant.constantValue, value);
   }
 }
 
diff --git a/pkg/analyzer/test/src/dart/element/top_merge_test.dart b/pkg/analyzer/test/src/dart/element/top_merge_test.dart
index be03653..008ed17 100644
--- a/pkg/analyzer/test/src/dart/element/top_merge_test.dart
+++ b/pkg/analyzer/test/src/dart/element/top_merge_test.dart
@@ -233,6 +233,10 @@
     );
   }
 
+  test_never() {
+    _check(neverNone, neverNone, neverNone);
+  }
+
   test_null() {
     // NNBD_TOP_MERGE(Never*, Null) = Null
     // NNBD_TOP_MERGE(Null, Never*) = Null
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index 3236c52..6166778 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -12,11 +12,102 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(FileResolver_changeFile_Test);
     defineReflectiveTests(FileResolverTest);
   });
 }
 
 @reflectiveTest
+class FileResolver_changeFile_Test extends FileResolutionTest {
+  String aPath;
+  String bPath;
+  String cPath;
+
+  @override
+  void setUp() {
+    super.setUp();
+    aPath = convertPath('/workspace/dart/test/lib/a.dart');
+    bPath = convertPath('/workspace/dart/test/lib/b.dart');
+    cPath = convertPath('/workspace/dart/test/lib/c.dart');
+  }
+
+  test_changeFile_refreshedFiles() async {
+    newFile(aPath, content: r'''
+class A {}
+''');
+
+    newFile(bPath, content: r'''
+class B {}
+''');
+
+    newFile(cPath, content: r'''
+import 'a.dart';
+import 'b.dart';
+''');
+
+    // First time we refresh everything.
+    await fileResolver.resolve(cPath);
+    _assertRefreshedFiles([aPath, bPath, cPath], withSdk: true);
+
+    // Without changes we refresh nothing.
+    await fileResolver.resolve(cPath);
+    _assertRefreshedFiles([]);
+
+    // We already know a.dart, refresh nothing.
+    await fileResolver.resolve(aPath);
+    _assertRefreshedFiles([]);
+
+    // Change a.dart, refresh a.dart and c.dart, but not b.dart
+    fileResolver.changeFile(aPath);
+    await fileResolver.resolve(cPath);
+    _assertRefreshedFiles([aPath, cPath]);
+  }
+
+  test_changeFile_resolution() async {
+    newFile(aPath, content: r'''
+class A {}
+''');
+
+    newFile(bPath, content: r'''
+import 'a.dart';
+A a;
+B b;
+''');
+
+    result = fileResolver.resolve(bPath);
+    assertErrorsInResolvedUnit(result, [
+      error(CompileTimeErrorCode.UNDEFINED_CLASS, 22, 1),
+    ]);
+
+    newFile(aPath, content: r'''
+class A {}
+class B {}
+''');
+    fileResolver.changeFile(aPath);
+
+    result = fileResolver.resolve(bPath);
+    assertErrorsInResolvedUnit(result, []);
+  }
+
+  void _assertRefreshedFiles(List<String> expected, {bool withSdk = false}) {
+    var expectedPlusSdk = expected.toSet();
+
+    if (withSdk) {
+      expectedPlusSdk
+        ..add(convertPath('/sdk/lib/async/async.dart'))
+        ..add(convertPath('/sdk/lib/async/stream.dart'))
+        ..add(convertPath('/sdk/lib/core/core.dart'))
+        ..add(convertPath('/sdk/lib/math/math.dart'));
+    }
+
+    var refreshedFiles = fileResolver.fsState.testView.refreshedFiles;
+    expect(refreshedFiles, unorderedEquals(expectedPlusSdk));
+
+    refreshedFiles.clear();
+  }
+}
+
+@reflectiveTest
 class FileResolverTest extends FileResolutionTest {
   test_analysisOptions_default_fromPackageUri() async {
     newFile('/workspace/dart/analysis_options/lib/default.yaml', content: r'''
diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
index 25c3b3d..9d51f53 100644
--- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -347,6 +347,6 @@
   }
 
   void _assertIntValue(VariableElement element, int value) {
-    expect(element.constantValue.toIntValue(), value);
+    expect(element.computeConstantValue().toIntValue(), value);
   }
 }
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 c6ce42f..096e13c 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -2042,4 +2042,35 @@
 
     assertType(findNode.cascade('a?'), 'A?');
   }
+
+  test_nullShorting_cascade_nullAwareInside() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int? foo() => 0;
+}
+
+main() {
+  A a = A()..foo()?.abs();
+  a;
+}
+''');
+
+    assertMethodInvocation2(
+      findNode.methodInvocation('..foo()'),
+      element: findElement.method('foo'),
+      typeArgumentTypes: [],
+      invokeType: 'int? Function()',
+      type: 'int?',
+    );
+
+    assertMethodInvocation2(
+      findNode.methodInvocation('.abs()'),
+      element: intElement.getMethod('abs'),
+      typeArgumentTypes: [],
+      invokeType: 'int Function()',
+      type: 'int',
+    );
+
+    assertType(findNode.cascade('A()'), 'A');
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 9bceab5..41e7bea 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -94,4 +94,108 @@
 
     assertType(findNode.cascade('a?'), 'A?');
   }
+
+  test_nullShorting_cascade2() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int? get foo => 0;
+}
+
+main() {
+  A a = A()..foo?.isEven;
+  a;
+}
+''');
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('..foo?'),
+      element: findElement.getter('foo'),
+      type: 'int?',
+    );
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('.isEven'),
+      element: intElement.getGetter('isEven'),
+      type: 'bool',
+    );
+
+    assertType(findNode.cascade('A()'), 'A');
+  }
+
+  test_nullShorting_cascade3() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A? get foo => this;
+  A? get bar => this;
+  A? get baz => this;
+}
+
+main() {
+  A a = A()..foo?.bar?.baz;
+  a;
+}
+''');
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('.foo'),
+      element: findElement.getter('foo'),
+      type: 'A?',
+    );
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('.bar'),
+      element: findElement.getter('bar'),
+      type: 'A?',
+    );
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('.baz'),
+      element: findElement.getter('baz'),
+      type: 'A?',
+    );
+
+    assertType(findNode.cascade('A()'), 'A');
+  }
+
+  test_nullShorting_cascade4() async {
+    await assertNoErrorsInCode(r'''
+A? get foo => A();
+
+class A {
+  A get bar => this;
+  A? get baz => this;
+  A get baq => this;
+}
+
+main() {
+  foo?.bar?..baz?.baq;
+}
+''');
+
+    assertSimpleIdentifier(
+      findNode.simple('foo?'),
+      element: findElement.topGet('foo'),
+      type: 'A?',
+    );
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('.bar'),
+      element: findElement.getter('bar'),
+      type: 'A?',
+    );
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('.baz'),
+      element: findElement.getter('baz'),
+      type: 'A?',
+    );
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('.baq'),
+      element: findElement.getter('baq'),
+      type: 'A',
+    );
+
+    assertType(findNode.cascade('foo?'), 'A?');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/dead_code_test.dart b/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
index ae0e08e..088a0a8 100644
--- a/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
@@ -438,6 +438,75 @@
 ''');
   }
 
+  test_flowEnd_forStatement() async {
+    await assertErrorsInCode(r'''
+main() {
+  for (var v in [0, 1, 2]) {
+    v;
+    return;
+    1;
+  }
+  2;
+}
+''', [
+      error(HintCode.DEAD_CODE, 61, 2),
+    ]);
+  }
+
+  test_flowEnd_ifStatement() async {
+    await assertErrorsInCode(r'''
+main(bool a) {
+  if (a) {
+    return;
+    1;
+  }
+  2;
+}
+''', [
+      error(HintCode.DEAD_CODE, 42, 2),
+    ]);
+  }
+
+  test_flowEnd_tryStatement_catchClause() async {
+    await assertErrorsInCode(r'''
+main() {
+  try {
+    1;
+  } catch (_) {
+    return;
+    2;
+  }
+  3;
+}
+''', [
+      error(HintCode.DEAD_CODE, 56, 2),
+    ]);
+  }
+
+  test_flowEnd_tryStatement_finally() async {
+    var expectedErrors = expectedErrorsByNullability(
+      nullable: [
+        error(HintCode.DEAD_CODE, 61, 11),
+      ],
+      legacy: [
+        error(HintCode.DEAD_CODE, 61, 2),
+        error(HintCode.DEAD_CODE, 70, 2),
+      ],
+    );
+    await assertErrorsInCode(r'''
+main() {
+  try {
+    1;
+  } finally {
+    2;
+    return;
+    3;
+  }
+  4;
+}
+''', expectedErrors);
+  }
+
   test_statementAfterAlwaysThrowsFunction() async {
     addMetaPackage();
     await assertErrorsInCode(r'''
@@ -740,6 +809,50 @@
 
 @reflectiveTest
 class DeadCodeWithNullSafetyTest extends DeadCodeTest with WithNullSafetyMixin {
+  test_flowEnd_tryStatement_body() async {
+    await assertErrorsInCode(r'''
+Never foo() => throw 0;
+
+main() {
+  try {
+    foo();
+    1;
+  } catch (_) {
+    2;
+  }
+  3;
+}
+''', [
+      error(HintCode.DEAD_CODE, 57, 2),
+    ]);
+  }
+
+  test_returnTypeNever_function() async {
+    await assertErrorsInCode(r'''
+Never foo() => throw 0;
+
+main() {
+  foo();
+  1;
+}
+''', [
+      error(HintCode.DEAD_CODE, 45, 2),
+    ]);
+  }
+
+  test_returnTypeNever_getter() async {
+    await assertErrorsInCode(r'''
+Never get foo => throw 0;
+
+main() {
+  foo;
+  2;
+}
+''', [
+      error(HintCode.DEAD_CODE, 45, 2),
+    ]);
+  }
+
   @FailingTest(reason: '@alwaysThrows is not supported in flow analysis')
   @override
   test_statementAfterAlwaysThrowsFunction() async {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index d9209a9..312f892 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -44,6 +44,30 @@
 }
 ''');
   }
+
+  test_localLevelVariable_never_null() async {
+    await assertErrorsInCode('''
+void f(Never x) {
+  x = null;
+}
+''', [
+      error(HintCode.DEAD_CODE, 24, 5),
+      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 24, 4),
+    ]);
+  }
+
+  test_topLevelVariable_never_null() async {
+    await assertErrorsInCode('''
+Never x = throw 0;
+
+void f() {
+  x = null;
+}
+''', [
+      error(HintCode.DEAD_CODE, 37, 5),
+      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 37, 4),
+    ]);
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
index 2613cb9..b1cbafc 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
@@ -2,13 +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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../generated/test_support.dart';
+import '../dart/constant/potentially_constant_test.dart';
 import '../dart/resolution/driver_resolution.dart';
 
 main() {
@@ -97,10 +95,10 @@
 
   test_await() async {
     await assertNoErrorsInCode('''
-main() async {
-  void x;
+main(void x) async {
   await x;
-}''');
+}
+''');
   }
 
   test_extensionApplication() async {
@@ -728,12 +726,17 @@
 }
 
 @reflectiveTest
-class UseOfVoidResultTest_NonNullable extends DriverResolutionTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.non_nullable],
-    );
+class UseOfVoidResultTest_NonNullable extends DriverResolutionTest
+    with WithNullSafetyMixin {
+  test_await() async {
+    await assertErrorsInCode('''
+main(void x) async {
+  await x;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 29, 1),
+    ]);
+  }
 
   test_nullCheck() async {
     await assertErrorsInCode(r'''
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index 2887b49..adbccee 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -1362,7 +1362,13 @@
   String _argumentListContext(AstNode node) {
     if (node is ArgumentList) {
       var parent = node.parent;
-      if (parent is InstanceCreationExpression) {
+      if (parent is Annotation) {
+        return 'annotation';
+      } else if (parent is ExtensionOverride) {
+        return 'extensionOverride';
+      } else if (parent is FunctionExpressionInvocation) {
+        return 'function';
+      } else if (parent is InstanceCreationExpression) {
         // TODO(brianwilkerson) Enable this case.
 //        if (flutter.isWidgetType(parent.staticType)) {
 //          return 'widgetConstructor';
@@ -1370,23 +1376,21 @@
         return 'constructor';
       } else if (parent is MethodInvocation) {
         return 'method';
-      } else if (parent is FunctionExpressionInvocation) {
-        return 'function';
-      } else if (parent is SuperConstructorInvocation ||
-          parent is RedirectingConstructorInvocation) {
+      } else if (parent is RedirectingConstructorInvocation) {
         return 'constructorRedirect';
-      } else if (parent is Annotation) {
-        return 'annotation';
+      } else if (parent is SuperConstructorInvocation) {
+        return 'constructorRedirect';
       }
-    } else if (node is IndexExpression) {
-      return 'index';
     } else if (node is AssignmentExpression ||
         node is BinaryExpression ||
         node is PrefixExpression ||
         node is PostfixExpression) {
       return 'operator';
+    } else if (node is IndexExpression) {
+      return 'index';
     }
-    throw ArgumentError('Unknown parent of ${node.runtimeType}');
+    throw ArgumentError(
+        'Unknown parent of ${node.runtimeType}: ${node.parent.runtimeType}');
   }
 
   bool _isEntityPrevTokenSynthetic() {
diff --git a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
similarity index 98%
rename from pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
rename to pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index d9b9a3b..f375d47 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -188,7 +188,7 @@
 
   @override
   void visitExportDirective(ExportDirective node) {
-    ExportElement exportElement = node.element;
+    var exportElement = node.element as ExportElement;
     if (exportElement != null) {
       Element libraryElement = exportElement.exportedLibrary;
       _addUriDirectiveRegion(node, libraryElement);
@@ -198,7 +198,7 @@
 
   @override
   void visitImportDirective(ImportDirective node) {
-    ImportElement importElement = node.element;
+    var importElement = node.element as ImportElement;
     if (importElement != null) {
       Element libraryElement = importElement.importedLibrary;
       _addUriDirectiveRegion(node, libraryElement);
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
index 1613b9d..07ba9b9 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
@@ -1070,6 +1070,19 @@
         completionLocation: 'ExtensionDeclaration_member', typeNames: true);
   }
 
+  Future<void> test_extensionOverride_argumentList() async {
+    // ExtensionDeclaration  CompilationUnit
+    addTestSource('''
+extension E on int {}
+int x = E(^);
+''');
+    await assertOpType(
+        completionLocation: 'ArgumentList_extensionOverride_unnamed',
+        constructors: true,
+        returnValue: true,
+        typeNames: true);
+  }
+
   Future<void> test_fieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
diff --git a/pkg/compiler/lib/src/js_model/js_world.dart b/pkg/compiler/lib/src/js_model/js_world.dart
index bb9a5ca..e510eff 100644
--- a/pkg/compiler/lib/src/js_model/js_world.dart
+++ b/pkg/compiler/lib/src/js_model/js_world.dart
@@ -259,21 +259,21 @@
   @override
   ClassEntity getLubOfInstantiatedSubclasses(ClassEntity cls) {
     if (nativeData.isJsInteropClass(cls)) {
-      return commonElements.jsJavaScriptObjectClass;
+      return getLubOfInstantiatedSubclasses(
+          commonElements.jsJavaScriptObjectClass);
     }
     ClassHierarchyNode hierarchy = classHierarchy.getClassHierarchyNode(cls);
-    return hierarchy != null
-        ? hierarchy.getLubOfInstantiatedSubclasses()
-        : null;
+    return hierarchy?.getLubOfInstantiatedSubclasses();
   }
 
   @override
   ClassEntity getLubOfInstantiatedSubtypes(ClassEntity cls) {
     if (nativeData.isJsInteropClass(cls)) {
-      return commonElements.jsJavaScriptObjectClass;
+      return getLubOfInstantiatedSubtypes(
+          commonElements.jsJavaScriptObjectClass);
     }
     ClassSet classSet = classHierarchy.getClassSet(cls);
-    return classSet != null ? classSet.getLubOfInstantiatedSubtypes() : null;
+    return classSet?.getLubOfInstantiatedSubtypes();
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index a10948d..ba9f5f6 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -705,22 +705,29 @@
     for (TypeVariableType typeVariable
         in _elementEnvironment.getFunctionTypeVariables(function)) {
       HInstruction param;
+      bool erased = false;
       if (elideTypeParameters) {
         // Add elided type parameters.
         param = _computeTypeArgumentDefaultValue(function, typeVariable);
+        erased = true;
       } else if (needsTypeArguments) {
         param = addParameter(
             typeVariable.element, _abstractValueDomain.nonNullType);
       } else {
-        // Unused, so bind to `dynamic`.
-        param = graph.addConstantNull(closedWorld);
+        // Unused, so bind to bound.
+        param = _computeTypeArgumentDefaultValue(function, typeVariable);
+        erased = true;
       }
       Local local = localsHandler.getTypeVariableAsLocal(typeVariable);
       localsHandler.directLocals[local] = param;
-      _functionTypeParameterLocals.add(local);
+      if (!erased) {
+        _functionTypeParameterLocals.add(local);
+      }
     }
   }
 
+  // Locals for function type parameters that can be forwarded, in argument
+  // position order.
   List<Local> _functionTypeParameterLocals = <Local>[];
 
   /// Builds a generative constructor.
@@ -1392,6 +1399,9 @@
     DartType elementType = _elementEnvironment.getAsyncOrSyncStarElementType(
         function.asyncMarker, _returnType);
 
+    // TODO(sra): [elementType] can contain free type variables that are erased
+    // due to no rtiNeed. We will get getter code if these type variables are
+    // substituted with an <any> or <erased> type.
     if (elementType.containsFreeTypeVariables) {
       // Type must be computed in the entry function, where the type variables
       // are in scope, and passed to the body function.
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index c7089b1..3a3e9c4 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -12,8 +12,8 @@
 
 class RunCommand extends DartdevCommand<int> {
   final ArgParser argParser = ArgParser.allowAnything();
-
-  RunCommand({bool verbose = false}) : super('run', '''
+  final bool verbose;
+  RunCommand({this.verbose = false}) : super('run', '''
 Run a Dart file.''');
 
   @override
@@ -25,7 +25,10 @@
     // execute [run] below.  Without this, the 'dart help run' reports the
     // command pub with no commands or flags.
     final command = sdk.dart;
-    final args = ['--help'];
+    final args = [
+      '--help',
+      if (verbose) '--verbose',
+    ];
 
     log.trace('$command ${args.first}');
 
@@ -49,7 +52,7 @@
 
     // Starting in ProcessStartMode.inheritStdio mode means the child process
     // can detect support for ansi chars.
-    var process = await Process.start(sdk.dart, args,
+    final process = await Process.start(sdk.dart, args,
         mode: ProcessStartMode.inheritStdio);
     return process.exitCode;
   }
diff --git a/pkg/dds/lib/dds.dart b/pkg/dds/lib/dds.dart
index 03ced9f..c71a3d6 100644
--- a/pkg/dds/lib/dds.dart
+++ b/pkg/dds/lib/dds.dart
@@ -7,12 +7,14 @@
 library dds;
 
 import 'dart:async';
+import 'dart:collection';
 import 'dart:convert';
 import 'dart:io';
 import 'dart:typed_data';
 
 import 'package:async/async.dart';
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
+import 'package:meta/meta.dart';
 import 'package:pedantic/pedantic.dart';
 import 'package:shelf/shelf.dart';
 import 'package:shelf/shelf_io.dart' as io;
@@ -24,6 +26,8 @@
 part 'src/binary_compatible_peer.dart';
 part 'src/client.dart';
 part 'src/dds_impl.dart';
+part 'src/named_lookup.dart';
+part 'src/rpc_error_codes.dart';
 part 'src/stream_manager.dart';
 
 /// An intermediary between a Dart VM service and its clients that offers
@@ -33,7 +37,8 @@
 /// for details.
 abstract class DartDevelopmentService {
   /// Creates a [DartDevelopmentService] instance which will communicate with a
-  /// VM service.
+  /// VM service. Requires the target VM service to have no other connected
+  /// clients.
   ///
   /// [remoteVmServiceUri] is the address of the VM service that this
   /// development service will communicate with.
@@ -94,3 +99,11 @@
   /// requests.
   bool get isRunning;
 }
+
+class DartDevelopmentServiceException implements Exception {
+  DartDevelopmentServiceException._(this.message);
+
+  String toString() => 'DartDevelopmentServiceException: $message';
+
+  final String message;
+}
diff --git a/pkg/dds/lib/src/client.dart b/pkg/dds/lib/src/client.dart
index 11dac82..a6e39c2 100644
--- a/pkg/dds/lib/src/client.dart
+++ b/pkg/dds/lib/src/client.dart
@@ -30,13 +30,21 @@
   }
 
   /// Send a JSON RPC notification to the client.
-  void sendNotification(String method, [dynamic parameters]) async {
+  void sendNotification(String method, [dynamic parameters]) {
     if (_clientPeer.isClosed) {
       return;
     }
     _clientPeer.sendNotification(method, parameters);
   }
 
+  /// Send a JSON RPC request to the client.
+  Future<dynamic> sendRequest(String method, [dynamic parameters]) async {
+    if (_clientPeer.isClosed) {
+      return null;
+    }
+    return await _clientPeer.sendRequest(method, parameters);
+  }
+
   /// Registers handlers for JSON RPC methods which need to be intercepted by
   /// DDS as well as fallback request forwarder.
   void _registerJsonRpcMethods() {
@@ -52,7 +60,65 @@
       return _success;
     });
 
+    _clientPeer.registerMethod('registerService', (parameters) async {
+      final serviceId = parameters['service'].asString;
+      final alias = parameters['alias'].asString;
+      if (services.containsKey(serviceId)) {
+        throw _RpcErrorCodes.buildRpcException(
+          _RpcErrorCodes.kServiceAlreadyRegistered,
+        );
+      }
+      services[serviceId] = alias;
+      // Notify other clients that a new service extension is available.
+      dds.streamManager.sendServiceRegisteredEvent(
+        this,
+        serviceId,
+        alias,
+      );
+      return _success;
+    });
+
+    // When invoked within a fallback, the next fallback will start executing.
+    // The final fallback forwards the request to the VM service directly.
+    @alwaysThrows
+    nextFallback() => throw json_rpc.RpcException.methodNotFound('');
+
+    // Handle service extension invocations.
+    _clientPeer.registerFallback((parameters) async {
+      hasNamespace(String method) => method.contains('.');
+      getMethod(String method) => method.split('.').last;
+      getNamespace(String method) => method.split('.').first;
+      if (!hasNamespace(parameters.method)) {
+        nextFallback();
+      }
+      // Lookup the client associated with the service extension's namespace.
+      // If the client exists and that client has registered the specified
+      // method, forward the request to that client.
+      final method = getMethod(parameters.method);
+      final namespace = getNamespace(parameters.method);
+      final serviceClient = dds._clients[namespace];
+      if (serviceClient != null && serviceClient.services.containsKey(method)) {
+        return await Future.any(
+          [
+            // Forward the request to the service client or...
+            serviceClient.sendRequest(method, parameters.asMap),
+            // if the service client closes, return an error response.
+            serviceClient._clientPeer.done.then(
+              (_) => throw _RpcErrorCodes.buildRpcException(
+                _RpcErrorCodes.kServiceDisappeared,
+              ),
+            ),
+          ],
+        );
+      }
+      throw json_rpc.RpcException(
+        _RpcErrorCodes.kMethodNotFound,
+        'Unknown service: ${parameters.method}',
+      );
+    });
+
     // Unless otherwise specified, the request is forwarded to the VM service.
+    // NOTE: This must be the last fallback registered.
     _clientPeer.registerFallback((parameters) async =>
         await _vmServicePeer.sendRequest(parameters.method, parameters.asMap));
   }
@@ -62,6 +128,7 @@
   };
 
   final _DartDevelopmentService dds;
+  final Map<String, String> services = {};
   final json_rpc.Peer _vmServicePeer;
   final WebSocketChannel ws;
   json_rpc.Peer _clientPeer;
diff --git a/pkg/dds/lib/src/dds_impl.dart b/pkg/dds/lib/src/dds_impl.dart
index fb2bf74..4cd7b2d 100644
--- a/pkg/dds/lib/src/dds_impl.dart
+++ b/pkg/dds/lib/src/dds_impl.dart
@@ -31,7 +31,23 @@
 
     // Start the DDS server.
     _server = await io.serve(_handlers().handler, host, port);
-    _uri = Uri(scheme: 'http', host: host, port: _server.port);
+
+    final tmpUri = Uri(scheme: 'http', host: host, port: _server.port);
+
+    // Notify the VM service that this client is DDS and that it should close
+    // and refuse connections from other clients. DDS is now acting in place of
+    // the VM service.
+    try {
+      await _vmServiceClient.sendRequest('_yieldControlToDDS', {
+        'uri': tmpUri.toString(),
+      });
+    } on json_rpc.RpcException catch (e) {
+      await _server.close(force: true);
+      // _yieldControlToDDS fails if DDS is not the only VM service client.
+      throw DartDevelopmentServiceException._(e.data['details']);
+    }
+
+    _uri = tmpUri;
   }
 
   /// Stop accepting requests after gracefully handling existing requests.
@@ -91,6 +107,9 @@
     return uri.replace(scheme: 'ws', pathSegments: pathSegments);
   }
 
+  String _getNamespace(_DartDevelopmentServiceClient client) =>
+      _clients.keyOf(client);
+
   Uri get remoteVmServiceUri => _remoteVmServiceUri;
   Uri get remoteVmServiceWsUri => _toWebSocket(_remoteVmServiceUri);
   Uri _remoteVmServiceUri;
@@ -107,7 +126,11 @@
   _StreamManager get streamManager => _streamManager;
   _StreamManager _streamManager;
 
-  final List<_DartDevelopmentServiceClient> _clients = [];
+  // Handles namespace generation for service extensions.
+  static const _kServicePrologue = 's';
+  final NamedLookup<_DartDevelopmentServiceClient> _clients = NamedLookup(
+    prologue: _kServicePrologue,
+  );
 
   json_rpc.Peer _vmServiceClient;
   WebSocketChannel _vmServiceSocket;
diff --git a/pkg/dds/lib/src/named_lookup.dart b/pkg/dds/lib/src/named_lookup.dart
new file mode 100644
index 0000000..4b89633
--- /dev/null
+++ b/pkg/dds/lib/src/named_lookup.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.
+
+// Originally pulled from dart:_vmservice.
+
+part of dds;
+
+/// [Set]-like containers which automatically generate [String] IDs for its
+/// items.
+class NamedLookup<E> with IterableMixin<E> {
+  final IdGenerator _generator;
+  final Map<String, E> _elements = {};
+  final Map<E, String> _ids = {};
+
+  NamedLookup({String prologue = ''})
+      : _generator = IdGenerator(prologue: prologue);
+
+  void add(E e) {
+    final id = _generator.newId();
+    _elements[id] = e;
+    _ids[e] = id;
+  }
+
+  void remove(E e) {
+    final id = _ids.remove(e);
+    _elements.remove(id);
+    _generator.release(id);
+  }
+
+  E operator [](String id) => _elements[id];
+  String keyOf(E e) => _ids[e];
+
+  Iterator<E> get iterator => _ids.keys.iterator;
+}
+
+/// Generator for unique IDs which recycles expired ones.
+class IdGenerator {
+  /// Fixed initial part of the ID
+  final String prologue;
+
+  // IDs in use.
+  final Set<String> _used = {};
+
+  /// IDs to be recycled (use these before generate new ones).
+  final Set<String> _free = {};
+
+  /// Next ID to generate when no recycled IDs are available.
+  int _next = 0;
+
+  IdGenerator({this.prologue = ''});
+
+  /// Returns a new ID (possibly recycled).
+  String newId() {
+    String id;
+    if (_free.isEmpty) {
+      id = prologue + (_next++).toString();
+    } else {
+      id = _free.first;
+    }
+    _free.remove(id);
+    _used.add(id);
+    return id;
+  }
+
+  /// Releases the ID and mark it for recycling.
+  void release(String id) {
+    if (_used.remove(id)) {
+      _free.add(id);
+    }
+  }
+}
diff --git a/pkg/dds/lib/src/rpc_error_codes.dart b/pkg/dds/lib/src/rpc_error_codes.dart
new file mode 100644
index 0000000..84b1f62
--- /dev/null
+++ b/pkg/dds/lib/src/rpc_error_codes.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dds;
+
+abstract class _RpcErrorCodes {
+  static json_rpc.RpcException buildRpcException(int code) {
+    return json_rpc.RpcException(
+      code,
+      errorMessages[code],
+    );
+  }
+
+  // These error codes must be kept in sync with those in vm/json_stream.h and
+  // vmservice.dart.
+  // static const kParseError = -32700;
+  // static const kInvalidRequest = -32600;
+  static const kMethodNotFound = -32601;
+  // static const kInvalidParams = -32602;
+  // static const kInternalError = -32603;
+
+  // static const kExtensionError = -32000;
+
+  static const kFeatureDisabled = 100;
+  // static const kCannotAddBreakpoint = 102;
+  static const kStreamAlreadySubscribed = 103;
+  static const kStreamNotSubscribed = 104;
+  // static const kIsolateMustBeRunnable = 105;
+  // static const kIsolateMustBePaused = 106;
+  // static const kCannotResume = 107;
+  // static const kIsolateIsReloading = 108;
+  // static const kIsolateReloadBarred = 109;
+  // static const kIsolateMustHaveReloaded = 110;
+  static const kServiceAlreadyRegistered = 111;
+  static const kServiceDisappeared = 112;
+  // static const kExpressionCompilationError = 113;
+  // static const kInvalidTimelineRequest = 114;
+
+  // Experimental (used in private rpcs).
+  // static const kFileSystemAlreadyExists = 1001;
+  // static const kFileSystemDoesNotExist = 1002;
+  // static const kFileDoesNotExist = 1003;
+
+  static const errorMessages = {
+    kFeatureDisabled: 'Feature is disabled',
+    kStreamAlreadySubscribed: 'Stream already subscribed',
+    kStreamNotSubscribed: 'Stream not subscribed',
+    kServiceAlreadyRegistered: 'Service already registered',
+    kServiceDisappeared: 'Service has disappeared',
+  };
+}
diff --git a/pkg/dds/lib/src/stream_manager.dart b/pkg/dds/lib/src/stream_manager.dart
index 318cc39..6e2d8dd 100644
--- a/pkg/dds/lib/src/stream_manager.dart
+++ b/pkg/dds/lib/src/stream_manager.dart
@@ -12,11 +12,21 @@
   /// If `data` is of type `Uint8List`, the notification is assumed to be a
   /// binary event and is forwarded directly over the subscriber's websocket.
   /// Otherwise, the event is sent via the JSON RPC client.
-  void streamNotify(String streamId, data) {
+  ///
+  /// If `excludedClient` is provided, the notification will be sent to all
+  /// clients subscribed to `streamId` except for `excludedClient`.
+  void streamNotify(
+    String streamId,
+    data, {
+    _DartDevelopmentServiceClient excludedClient,
+  }) {
     if (streamListeners.containsKey(streamId)) {
       final listeners = streamListeners[streamId];
       final isBinaryData = data is Uint8List;
       for (final listener in listeners) {
+        if (listener == excludedClient) {
+          continue;
+        }
         if (isBinaryData) {
           listener.ws.sink.add(data);
         } else {
@@ -26,6 +36,51 @@
     }
   }
 
+  void sendServiceRegisteredEvent(
+    _DartDevelopmentServiceClient client,
+    String service,
+    String alias,
+  ) {
+    final namespace = dds._getNamespace(client);
+    streamNotify(
+      kServiceStream,
+      {
+        'streamId': kServiceStream,
+        'event': {
+          'type': 'Event',
+          'kind': 'ServiceRegistered',
+          'timestamp': DateTime.now().millisecondsSinceEpoch,
+          'service': service,
+          'method': namespace + '.' + service,
+          'alias': alias,
+        },
+      },
+      excludedClient: client,
+    );
+  }
+
+  void _sendServiceUnregisteredEvents(
+    _DartDevelopmentServiceClient client,
+  ) {
+    final namespace = dds._getNamespace(client);
+    for (final service in client.services.keys) {
+      streamNotify(
+        kServiceStream,
+        {
+          'streamId': kServiceStream,
+          'event': {
+            'type': 'Event',
+            'kind': 'ServiceUnregistered',
+            'timestamp': DateTime.now().millisecondsSinceEpoch,
+            'service': service,
+            'method': namespace + '.' + service,
+          },
+        },
+        excludedClient: client,
+      );
+    }
+  }
+
   /// Start listening for `streamNotify` events from the VM service and forward
   /// them to the clients which have subscribed to the stream.
   void listen() => dds._vmServiceClient.registerMethod(
@@ -88,24 +143,26 @@
   /// Cleanup stream subscriptions for `client` when it has disconnected.
   void clientDisconnect(_DartDevelopmentServiceClient client) {
     for (final streamId in streamListeners.keys.toList()) {
-      streamCancel(client, streamId);
+      streamCancel(client, streamId).catchError(
+        (_) => null,
+        // Ignore 'stream not subscribed' errors.
+        test: (e) => e is json_rpc.RpcException,
+      );
     }
+    // Notify other service clients of service extensions that are being
+    // unregistered.
+    _sendServiceUnregisteredEvents(client);
   }
 
-  // These error codes must be kept in sync with those in vm/json_stream.h and
-  // vmservice.dart.
-  static const kStreamAlreadySubscribed = 103;
-  static const kStreamNotSubscribed = 104;
+  static const kServiceStream = 'Service';
 
-  // Keep these messages in sync with the VM service.
-  static final kStreamAlreadySubscribedException = json_rpc.RpcException(
-    kStreamAlreadySubscribed,
-    'Stream already subscribed',
+  static final kStreamAlreadySubscribedException =
+      _RpcErrorCodes.buildRpcException(
+    _RpcErrorCodes.kStreamAlreadySubscribed,
   );
 
-  static final kStreamNotSubscribedException = json_rpc.RpcException(
-    kStreamNotSubscribed,
-    'Stream not subscribed',
+  static final kStreamNotSubscribedException = _RpcErrorCodes.buildRpcException(
+    _RpcErrorCodes.kStreamNotSubscribed,
   );
 
   final _DartDevelopmentService dds;
diff --git a/pkg/dds/test/smoke_test.dart b/pkg/dds/test/smoke_test.dart
index 6e6c1ed..39468b0 100644
--- a/pkg/dds/test/smoke_test.dart
+++ b/pkg/dds/test/smoke_test.dart
@@ -41,35 +41,78 @@
 }
 
 void main() {
-  test('DDS Smoke Test', () async {
-    final process = await spawnDartProcess('smoke.dart');
-    final dds = await DartDevelopmentService.startDartDevelopmentService(
-      remoteVmServiceUri,
-    );
-    expect(dds.isRunning, true);
+  group('DDS', () {
+    Process process;
+    DartDevelopmentService dds;
 
-    // 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);
+    setUp(() async {
+      process = await spawnDartProcess('smoke.dart');
+    });
 
-    // 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();
+    tearDown(() async {
+      await dds?.shutdown();
+      process?.kill();
+      dds = null;
+      process = null;
+    });
+
+    test('Smoke Test', () async {
+      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: [
+          if (remoteVmServiceUri.pathSegments.isNotEmpty)
+            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);
+    });
+
+    test('startup fails when VM service has existing clients', () async {
+      Uri httpToWebSocketUri(Uri httpUri) {
+        final segments = (httpUri.pathSegments.isNotEmpty)
+            ? (httpUri.pathSegments.toList()..removeLast())
+            : <String>[];
+        segments.add('ws');
+        return httpUri.replace(
+          scheme: 'ws',
+          pathSegments: segments,
+        );
+      }
+
+      final _ = await vmServiceConnectUri(
+        httpToWebSocketUri(remoteVmServiceUri).toString(),
+      );
+      try {
+        dds = await DartDevelopmentService.startDartDevelopmentService(
+          remoteVmServiceUri,
+        );
+        fail(
+            'DDS startup should fail if there are existing VM service clients.');
+      } on DartDevelopmentServiceException catch (e) {
+        expect(e.message,
+            'Existing VM service clients prevent DDS from taking control.');
+      }
+    });
   });
 
   test('Invalid args test', () async {
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index acf7573..cea0477 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -158,7 +158,7 @@
       {void Function(String msg) logger,
       ChangedStructureNotifier changedStructureNotifier}) {
     if (flags.trackWidgetCreation) {
-      _widgetTracker ??= WidgetCreatorTracker();
+      _widgetTracker ??= WidgetCreatorTracker(changedStructureNotifier);
       _widgetTracker.transform(component, libraries);
     }
   }
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 b093430..1f1e98a 100644
--- a/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
@@ -1,9 +1,9 @@
-ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|3716|5|94|Const constructors can't throw exceptions.
-ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|7902|5|97|Const constructors can't throw exceptions.
+ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|3719|5|94|Const constructors can't throw exceptions.
+ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|7908|5|97|Const constructors can't throw exceptions.
 ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|940|5|95|Const constructors can't throw exceptions.
 ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|973|5|94|Const constructors can't throw exceptions.
 ERROR|STATIC_WARNING|ARGUMENT_TYPE_NOT_ASSIGNABLE|lib/io/io.dart|6334|51|12|The argument type 'Object' can't be assigned to the parameter type 'String'.
-ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|3714|3|5|Only redirecting factory constructors can be declared to be 'const'.
-ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|7900|3|5|Only redirecting factory constructors can be declared to be 'const'.
+ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|3717|3|5|Only redirecting factory constructors can be declared to be 'const'.
+ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|7906|3|5|Only redirecting factory constructors can be declared to be 'const'.
 ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|938|3|5|Only redirecting factory constructors can be declared to be 'const'.
 ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|971|3|5|Only redirecting factory constructors can be declared to be 'const'.
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 20acc5d..3da4fa2 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -281,9 +281,14 @@
             await userCode.buildComponent(verify: c.options.verify);
       }
       hierarchy ??= userCode.loader.hierarchy;
-      if (hierarchy != null && userCode.classesChangedStructure != null) {
-        hierarchy.applyMemberChanges(userCode.classesChangedStructure,
-            findDescendants: true);
+      if (hierarchy != null) {
+        if (userCode.classHierarchyChanges != null) {
+          hierarchy.applyTreeChanges([], [], userCode.classHierarchyChanges);
+        }
+        if (userCode.classMemberChanges != null) {
+          hierarchy.applyMemberChanges(userCode.classMemberChanges,
+              findDescendants: true);
+        }
       }
       recordNonFullComponentForTesting(componentWithDill);
 
@@ -789,7 +794,7 @@
         Library lib = builder.library;
         removedLibraries.add(lib);
       }
-      hierarchy.applyTreeChanges(removedLibraries, const []);
+      hierarchy.applyTreeChanges(removedLibraries, const [], const []);
     }
   }
 
@@ -1380,7 +1385,7 @@
         incrementalSerializer?.invalidate(builder.fileUri);
       }
     }
-    hierarchy?.applyTreeChanges(removedLibraries, const []);
+    hierarchy?.applyTreeChanges(removedLibraries, const [], const []);
     if (removedDillBuilders) {
       makeDillLoaderLibrariesUpToDateWithBuildersMap();
     }
@@ -1923,7 +1928,9 @@
 
 class IncrementalKernelTarget extends KernelTarget
     implements ChangedStructureNotifier {
-  Set<Class> classesChangedStructure;
+  Set<Class> classHierarchyChanges;
+  Set<Class> classMemberChanges;
+
   IncrementalKernelTarget(FileSystem fileSystem, bool includeComments,
       DillTarget dillTarget, UriTranslator uriTranslator)
       : super(fileSystem, includeComments, dillTarget, uriTranslator);
@@ -1931,8 +1938,14 @@
   ChangedStructureNotifier get changedStructureNotifier => this;
 
   @override
-  void forClass(Class c) {
-    classesChangedStructure ??= new Set<Class>();
-    classesChangedStructure.add(c);
+  void registerClassMemberChange(Class c) {
+    classMemberChanges ??= new Set<Class>();
+    classMemberChanges.add(c);
+  }
+
+  @override
+  void registerClassHierarchyChange(Class cls) {
+    classHierarchyChanges ??= <Class>{};
+    classHierarchyChanges.add(cls);
   }
 }
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 4688b62..fa7ea0c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -1073,7 +1073,8 @@
         loader.coreTypes,
         loader.libraries,
         new KernelDiagnosticReporter(loader),
-        logger: (String msg) => ticker.logMs(msg));
+        logger: (String msg) => ticker.logMs(msg),
+        changedStructureNotifier: changedStructureNotifier);
 
     TypeEnvironment environment =
         new TypeEnvironment(loader.coreTypes, loader.hierarchy);
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 2f37d76..75eacd7 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
@@ -799,15 +799,25 @@
       Member bestSoFar = members.first;
       DartType bestSoFarType =
           forSetters ? bestSoFar.setterType : bestSoFar.getterType;
-      bestSoFarType = Substitution.fromSupertype(
-              hierarchy.getClassAsInstanceOf(cls, bestSoFar.enclosingClass))
-          .substituteType(bestSoFarType);
+      Supertype supertype =
+          hierarchy.getClassAsInstanceOf(cls, bestSoFar.enclosingClass);
+      assert(
+          supertype != null,
+          "No supertype of enclosing class ${bestSoFar.enclosingClass} for "
+          "$bestSoFar found for $cls.");
+      bestSoFarType =
+          Substitution.fromSupertype(supertype).substituteType(bestSoFarType);
       for (int i = 1; i < members.length; ++i) {
         Member candidate = members[i];
         DartType candidateType =
             forSetters ? candidate.setterType : candidate.getterType;
-        Substitution substitution = Substitution.fromSupertype(
-            hierarchy.getClassAsInstanceOf(cls, candidate.enclosingClass));
+        Supertype supertype =
+            hierarchy.getClassAsInstanceOf(cls, candidate.enclosingClass);
+        assert(
+            supertype != null,
+            "No supertype of enclosing class ${candidate.enclosingClass} for "
+            "$candidate found for $cls.");
+        Substitution substitution = Substitution.fromSupertype(supertype);
         candidateType = substitution.substituteType(candidateType);
         memberTypes.add(candidateType);
         bool isMoreSpecific = forSetters
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 ad7173c..92f6450 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -926,7 +926,7 @@
       hierarchy.onAmbiguousSupertypes = onAmbiguousSupertypes;
       Component component = computeFullComponent();
       hierarchy.coreTypes = coreTypes;
-      hierarchy.applyTreeChanges(const [], component.libraries,
+      hierarchy.applyTreeChanges(const [], component.libraries, const [],
           reissueAmbiguousSupertypesFor: component);
     }
     for (AmbiguousTypesRecord record in ambiguousTypesRecords) {
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 c8b7fa4..d2628dd 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
@@ -2967,7 +2967,8 @@
     FunctionType functionType = getFunctionTypeForImplicitCall(calleeType);
 
     List<VariableDeclaration> locallyHoistedExpressions;
-    if (hoistedExpressions == null) {
+    if (hoistedExpressions == null && !isTopLevel) {
+      // We don't hoist in top-level inference.
       hoistedExpressions = locallyHoistedExpressions = <VariableDeclaration>[];
     }
     if (arguments.positional.isNotEmpty || arguments.named.isNotEmpty) {
@@ -3006,7 +3007,7 @@
         isImplicitCall: true,
         implicitInvocationPropertyName: getter.name);
 
-    if (isExpressionInvocation) {
+    if (!isTopLevel && isExpressionInvocation) {
       Expression error = helper.buildProblem(
           templateImplicitCallOfNonMethod.withArguments(
               receiverType, isNonNullableByDefault),
@@ -3080,7 +3081,8 @@
     FunctionType functionType = getFunctionTypeForImplicitCall(calleeType);
 
     List<VariableDeclaration> locallyHoistedExpressions;
-    if (hoistedExpressions == null) {
+    if (hoistedExpressions == null && !isTopLevel) {
+      // We don't hoist in top-level inference.
       hoistedExpressions = locallyHoistedExpressions = <VariableDeclaration>[];
     }
     if (arguments.positional.isNotEmpty || arguments.named.isNotEmpty) {
@@ -3120,7 +3122,7 @@
         hoistedExpressions: hoistedExpressions,
         implicitInvocationPropertyName: field.name);
 
-    if (isExpressionInvocation) {
+    if (!isTopLevel && isExpressionInvocation) {
       Expression error = helper.buildProblem(
           templateImplicitCallOfNonMethod.withArguments(
               receiverType, isNonNullableByDefault),
diff --git a/pkg/front_end/test/ast_nodes_has_to_string_test.dart b/pkg/front_end/test/ast_nodes_has_to_string_test.dart
index efab92a0..dd3cbf7 100644
--- a/pkg/front_end/test/ast_nodes_has_to_string_test.dart
+++ b/pkg/front_end/test/ast_nodes_has_to_string_test.dart
@@ -18,7 +18,7 @@
 
   {
     Uri input = Platform.script.resolve("../tool/_fasta/compile.dart");
-    CompilerOptions options = helper.getOptions(targetName: "VM");
+    CompilerOptions options = helper.getOptions();
     helper.TestIncrementalCompiler compiler =
         new helper.TestIncrementalCompiler(
             options,
diff --git a/pkg/front_end/test/crashing_test_case_minimizer.dart b/pkg/front_end/test/crashing_test_case_minimizer.dart
new file mode 100644
index 0000000..797bded
--- /dev/null
+++ b/pkg/front_end/test/crashing_test_case_minimizer.dart
@@ -0,0 +1,344 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. 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' show utf8;
+
+import 'dart:io' show BytesBuilder, File;
+
+import 'dart:typed_data' show Uint8List;
+
+import 'package:_fe_analyzer_shared/src/parser/parser.dart' show Parser;
+
+import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
+    show ScannerConfiguration, Token;
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
+
+import 'package:front_end/src/api_prototype/compiler_options.dart'
+    show CompilerOptions, DiagnosticMessage;
+
+import 'package:front_end/src/api_prototype/memory_file_system.dart'
+    show MemoryFileSystem;
+
+import 'package:front_end/src/base/processed_options.dart'
+    show ProcessedOptions;
+
+import 'package:front_end/src/compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+
+import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
+
+import 'package:front_end/src/fasta/incremental_compiler.dart'
+    show IncrementalCompiler;
+
+import 'package:kernel/ast.dart' show Component;
+
+import 'parser_test_listener.dart' show ParserTestListener;
+
+import 'parser_suite.dart' as parser_suite;
+
+import 'incremental_load_from_dill_suite.dart' show getOptions;
+
+Uri sdkRoot = computePlatformBinariesLocation(forceBuildDir: true);
+Uri base = Uri.parse("org-dartlang-test:///");
+Uri sdkSummary = base.resolve("vm_platform.dill");
+Uri platformUri = sdkRoot.resolve("vm_platform_strong.dill");
+
+main(List<String> arguments) async {
+  String filename;
+  bool nnbd = false;
+  for (String arg in arguments) {
+    if (arg.startsWith("--")) {
+      if (arg == "--nnbd") {
+        nnbd = true;
+      } else {
+        throw "Unknown option $arg";
+      }
+    } else if (filename != null) {
+      throw "Already got '$filename', '$arg' is also a filename; "
+          "can only get one";
+    } else {
+      filename = arg;
+    }
+  }
+  if (filename == null) {
+    throw "Need file to operate on";
+  }
+  File file = new File(filename);
+  if (!file.existsSync()) throw "File $filename doesn't exist.";
+
+  await tryToMinimize(file, nnbd);
+}
+
+Future tryToMinimize(File file, bool nnbd) async {
+  Uint8List data;
+  try {
+    String parsedString = getFileAsStringContent(file, nnbd);
+    data = utf8.encode(parsedString);
+  } catch (e) {
+    // If this crash it's a crash in the scanner/parser. It's good to minimize
+    // that too.
+    data = file.readAsBytesSync();
+  }
+
+  print("Got data");
+
+  Uri main = base.resolve("main.dart");
+
+  CompilerContext compilerContext = setupCompilerContext(main);
+  Component initialComponent = await getInitialComponent(compilerContext);
+  MemoryFileSystem fs = compilerContext.options.fileSystem;
+
+  print("Compiled initially (without data)");
+
+  // First assure it actually crash on the input.
+  if (!await crashesOnCompile(
+      fs, main, data, compilerContext, initialComponent)) {
+    throw "Input doesn't crash the compiler: ${dataToText(data)}";
+  }
+  print("Step #1: We did crash on the input!");
+
+  // Try to delete lines.
+  Uint8List latestCrashData =
+      await deleteLines(data, fs, main, compilerContext, initialComponent);
+  print("We're now at ${latestCrashData.length} bytes.");
+
+  // Now try to delete 'arbitrarily' (for any given start offset do an
+  // exponential binary search).
+  int prevLength = latestCrashData.length;
+  while (true) {
+    latestCrashData = await binarySearchDeleteData(
+        latestCrashData, fs, main, compilerContext, initialComponent);
+
+    if (latestCrashData.length == prevLength) {
+      // No progress.
+      break;
+    } else {
+      print("We're now at ${latestCrashData.length} bytes");
+      prevLength = latestCrashData.length;
+    }
+  }
+
+  print("Got it down to ${latestCrashData.length} bytes: "
+      "${dataToText(latestCrashData)}");
+  try {
+    String utfDecoded = utf8.decode(latestCrashData, allowMalformed: true);
+    print("That's '$utfDecoded' as text");
+  } catch (e) {
+    print("(which crashes when trying to decode as utf8)");
+  }
+}
+
+Uint8List sublist(Uint8List data, int start, int end) {
+  Uint8List result = new Uint8List(end - start);
+  result.setRange(0, result.length, data, start);
+  return result;
+}
+
+String dataToText(Uint8List data) {
+  StringBuffer sb = new StringBuffer();
+  String comma = "[";
+  for (int i = 0; i < data.length; i++) {
+    sb.write(comma);
+    sb.write(data[i]);
+    comma = ", ";
+    if (i > 100) break;
+  }
+  if (data.length > 100) {
+    sb.write("...");
+  }
+  sb.write("]");
+  return sb.toString();
+}
+
+Future<Uint8List> binarySearchDeleteData(
+    Uint8List latestCrashData,
+    MemoryFileSystem fs,
+    Uri main,
+    CompilerContext compilerContext,
+    Component initialComponent) async {
+  int offset = 0;
+  while (offset < latestCrashData.length) {
+    print("Working at offset $offset of ${latestCrashData.length}");
+    BytesBuilder builder = new BytesBuilder();
+    builder.add(sublist(latestCrashData, 0, offset));
+    builder.add(sublist(latestCrashData, offset + 1, latestCrashData.length));
+    Uint8List candidate = builder.takeBytes();
+    if (!await crashesOnCompile(
+        fs, main, candidate, compilerContext, initialComponent)) {
+      // Deleting 1 char didn't crash; don't try to delete anymore starting
+      // here.
+      offset++;
+      continue;
+    }
+
+    // Find how long we can go.
+    int crashingAt = 1;
+    int noLongerCrashingAt;
+    while (true) {
+      int deleteChars = 2 * crashingAt;
+      if (offset + deleteChars > latestCrashData.length) {
+        deleteChars = latestCrashData.length - offset;
+      }
+      builder = new BytesBuilder();
+      builder.add(sublist(latestCrashData, 0, offset));
+      builder.add(sublist(
+          latestCrashData, offset + deleteChars, latestCrashData.length));
+      candidate = builder.takeBytes();
+      if (!await crashesOnCompile(
+          fs, main, candidate, compilerContext, initialComponent)) {
+        noLongerCrashingAt = deleteChars;
+        break;
+      }
+      crashingAt = deleteChars;
+      if (crashingAt + offset == latestCrashData.length) break;
+    }
+
+    if (noLongerCrashingAt == null) {
+      // We can delete the rest.
+      latestCrashData = candidate;
+      continue;
+    }
+
+    // Binary search between [crashingAt] and [noLongerCrashingAt].
+    while (crashingAt < noLongerCrashingAt) {
+      int mid = noLongerCrashingAt -
+          ((noLongerCrashingAt - crashingAt) >> 1); // Get middle, rounding up.
+      builder = new BytesBuilder();
+      builder.add(sublist(latestCrashData, 0, offset));
+      builder
+          .add(sublist(latestCrashData, offset + mid, latestCrashData.length));
+      candidate = builder.takeBytes();
+      if (await crashesOnCompile(
+          fs, main, candidate, compilerContext, initialComponent)) {
+        crashingAt = mid;
+      } else {
+        // [noLongerCrashingAt] might actually crash now.
+        noLongerCrashingAt = mid - 1;
+      }
+    }
+
+    // This is basically an assert.
+    builder = new BytesBuilder();
+    builder.add(sublist(latestCrashData, 0, offset));
+    builder.add(
+        sublist(latestCrashData, offset + crashingAt, latestCrashData.length));
+    candidate = builder.takeBytes();
+    if (!await crashesOnCompile(
+        fs, main, candidate, compilerContext, initialComponent)) {
+      throw "Error in binary search.";
+    }
+    latestCrashData = candidate;
+  }
+  return latestCrashData;
+}
+
+Future<Uint8List> deleteLines(Uint8List data, MemoryFileSystem fs, Uri main,
+    CompilerContext compilerContext, Component initialComponent) async {
+  // Try to delete "lines".
+  const int $LF = 10;
+  Uint8List latestCrashData = data;
+  List<Uint8List> lines = [];
+  int start = 0;
+  for (int i = 0; i < data.length; i++) {
+    if (data[i] == $LF) {
+      lines.add(sublist(data, start, i));
+      start = i + 1;
+    }
+  }
+  lines.add(sublist(data, start, data.length));
+  List<bool> include = new List.filled(lines.length, true);
+  for (int i = 0; i < lines.length; i++) {
+    include[i] = false;
+    final BytesBuilder builder = new BytesBuilder();
+    for (int j = 0; j < lines.length; j++) {
+      if (include[j]) {
+        builder.add(lines[j]);
+        if (j + 1 < lines.length) {
+          builder.addByte($LF);
+        }
+      }
+    }
+    Uint8List candidate = builder.takeBytes();
+    if (!await crashesOnCompile(
+        fs, main, candidate, compilerContext, initialComponent)) {
+      // Didn't crash => Can't remove line i.
+      include[i] = true;
+    } else {
+      print("Can delete line $i");
+      latestCrashData = candidate;
+    }
+  }
+  return latestCrashData;
+}
+
+Future<bool> crashesOnCompile(MemoryFileSystem fs, Uri main, Uint8List data,
+    CompilerContext compilerContext, Component initialComponent) async {
+  fs.entityForUri(main).writeAsBytesSync(data);
+  IncrementalCompiler incrementalCompiler =
+      new IncrementalCompiler.fromComponent(compilerContext, initialComponent);
+  incrementalCompiler.invalidate(main);
+  try {
+    await incrementalCompiler.computeDelta();
+    return false;
+  } catch (e) {
+    return true;
+  }
+}
+
+Future<Component> getInitialComponent(CompilerContext compilerContext) async {
+  IncrementalCompiler incrementalCompiler =
+      new IncrementalCompiler(compilerContext);
+  Component originalComponent = await incrementalCompiler.computeDelta();
+  return originalComponent;
+}
+
+CompilerContext setupCompilerContext(Uri main) {
+  Uint8List sdkSummaryData = new File.fromUri(platformUri).readAsBytesSync();
+  MemoryFileSystem fs = new MemoryFileSystem(base);
+  CompilerOptions options = getOptions();
+
+  options.fileSystem = fs;
+  options.sdkRoot = null;
+  options.sdkSummary = sdkSummary;
+  options.omitPlatform = false;
+  options.onDiagnostic = (DiagnosticMessage message) {
+    // don't care.
+  };
+  fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryData);
+  fs.entityForUri(main).writeAsStringSync("main() {}");
+
+  CompilerContext compilerContext = new CompilerContext(
+      new ProcessedOptions(options: options, inputs: [main]));
+  return compilerContext;
+}
+
+String getFileAsStringContent(File file, bool nnbd) {
+  Uint8List rawBytes = file.readAsBytesSync();
+  List<int> lineStarts = new List<int>();
+
+  Token firstToken = parser_suite.scanRawBytes(rawBytes,
+      nnbd ? scannerConfiguration : scannerConfigurationNonNNBD, lineStarts);
+
+  if (firstToken == null) {
+    throw "Got null token from scanner";
+  }
+
+  ParserTestListener parserTestListener = new ParserTestListener(false);
+  Parser parser = new Parser(parserTestListener);
+  parser.parseUnit(firstToken);
+  String parsedString =
+      parser_suite.tokenStreamToString(firstToken, lineStarts).toString();
+  return parsedString;
+}
+
+ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
+    enableTripleShift: true,
+    enableExtensionMethods: true,
+    enableNonNullable: true);
+
+ScannerConfiguration scannerConfigurationNonNNBD = new ScannerConfiguration(
+    enableTripleShift: true,
+    enableExtensionMethods: true,
+    enableNonNullable: false);
diff --git a/pkg/front_end/test/id_testing/data/marker.options b/pkg/front_end/test/id_testing/data/marker.options
index bb35ae5..c846376b 100644
--- a/pkg/front_end/test/id_testing/data/marker.options
+++ b/pkg/front_end/test/id_testing/data/marker.options
@@ -1,2 +1,3 @@
 cfe=pkg/front_end/test/id_testing/id_testing_test.dart
 dart2js=tests/compiler/dart2js/equivalence/id_testing_test.dart
+dart2js:nnbd-sdk=tests/compiler/dart2js/equivalence/id_testing_test.dart
diff --git a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
index ec1eebd..2d7e57c 100644
--- a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
@@ -46,7 +46,7 @@
   // type inference occurring before or after mixin transformation.
   Stopwatch stopwatch = new Stopwatch()..start();
   await normalCompile(dart2jsUrl, normalDill,
-      options: getOptions()..target = new NoneTarget(new TargetFlags()));
+      options: getOptions(target: new NoneTarget(new TargetFlags())));
   print("Normal compile took ${stopwatch.elapsedMilliseconds} ms");
   {
     // Check that we don't include the source from files from the sdk.
@@ -84,7 +84,7 @@
     stopwatch.reset();
     bool initializeResult = await initializedCompile(
         dart2jsUrl, fullDillFromInitialized, initializeWith, [invalidateUri],
-        options: getOptions()..target = new NoneTarget(new TargetFlags()));
+        options: getOptions(target: new NoneTarget(new TargetFlags())));
     Expect.equals(initializeExpect, initializeResult);
     print("Initialized compile(s) from ${initializeWith.pathSegments.last} "
         "took ${stopwatch.elapsedMilliseconds} ms");
@@ -99,7 +99,7 @@
     stopwatch.reset();
     initializeResult = await initializedCompile(
         dart2jsUrl, fullDillFromInitialized, initializeWith, [],
-        options: getOptions()..target = new NoneTarget(new TargetFlags()));
+        options: getOptions(target: new NoneTarget(new TargetFlags())));
     Expect.equals(initializeExpect, initializeResult);
     print("Initialized compile(s) from ${initializeWith.pathSegments.last} "
         "took ${stopwatch.elapsedMilliseconds} ms");
diff --git a/pkg/front_end/test/incremental_dart2js_tester.dart b/pkg/front_end/test/incremental_dart2js_tester.dart
index 8a5401c..a67953d 100644
--- a/pkg/front_end/test/incremental_dart2js_tester.dart
+++ b/pkg/front_end/test/incremental_dart2js_tester.dart
@@ -174,7 +174,7 @@
     stopwatch.reset();
     stopwatch.start();
     Uri input = Platform.script.resolve("../../compiler/bin/dart2js.dart");
-    CompilerOptions options = helper.getOptions(targetName: "VM");
+    CompilerOptions options = helper.getOptions();
     helper.TestIncrementalCompiler compiler =
         new helper.TestIncrementalCompiler(options, input);
     compiler.useExperimentalInvalidation = useExperimentalInvalidation;
diff --git a/pkg/front_end/test/incremental_load_from_dill_suite.dart b/pkg/front_end/test/incremental_load_from_dill_suite.dart
index 97a33b5..015e3d5 100644
--- a/pkg/front_end/test/incremental_load_from_dill_suite.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_suite.dart
@@ -15,6 +15,8 @@
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
+import "package:dev_compiler/src/kernel/target.dart" show DevCompilerTarget;
+
 import 'package:expect/expect.dart' show Expect;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
@@ -59,7 +61,8 @@
         LibraryDependency,
         Member,
         Name,
-        Procedure;
+        Procedure,
+        Supertype;
 
 import 'package:kernel/target/targets.dart'
     show NoneTarget, Target, TargetFlags;
@@ -164,6 +167,7 @@
           "omitPlatform",
           "target",
           "forceLateLoweringForTesting",
+          "trackWidgetCreation",
           "incrementalSerialization"
         ]);
         await new NewWorldTest().newWorldTest(
@@ -173,7 +177,8 @@
           map["modules"],
           map["omitPlatform"],
           map["target"],
-          map["forceLateLoweringForTesting"],
+          map["forceLateLoweringForTesting"] ?? false,
+          map["trackWidgetCreation"] ?? false,
           map["incrementalSerialization"],
         );
         break;
@@ -245,16 +250,13 @@
   checkIsEqual(normalDillData, initializedDillData);
 }
 
-Future<Map<String, List<int>>> createModules(
-    Map module,
-    final List<int> sdkSummaryData,
-    String targetName,
-    bool forceLateLoweringForTesting) async {
+Future<Map<String, List<int>>> createModules(Map module,
+    final List<int> sdkSummaryData, Target target, String sdkSummary) async {
   final Uri base = Uri.parse("org-dartlang-test:///");
-  final Uri sdkSummary = base.resolve("vm_platform_strong.dill");
+  final Uri sdkSummaryUri = base.resolve(sdkSummary);
 
   MemoryFileSystem fs = new MemoryFileSystem(base);
-  fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryData);
+  fs.entityForUri(sdkSummaryUri).writeAsBytesSync(sdkSummaryData);
 
   // Setup all sources
   for (Map moduleSources in module.values) {
@@ -281,12 +283,11 @@
         moduleSources.add(uri);
       }
     }
-    CompilerOptions options = getOptions(
-        targetName: targetName,
-        forceLateLoweringForTesting: forceLateLoweringForTesting);
+    CompilerOptions options =
+        getOptions(target: target, sdkSummary: sdkSummary);
     options.fileSystem = fs;
     options.sdkRoot = null;
-    options.sdkSummary = sdkSummary;
+    options.sdkSummary = sdkSummaryUri;
     options.omitPlatform = true;
     options.onDiagnostic = (DiagnosticMessage message) {
       if (getMessageCodeObject(message)?.name == "InferredPackageUri") return;
@@ -334,12 +335,32 @@
       bool omitPlatform,
       String targetName,
       bool forceLateLoweringForTesting,
+      bool trackWidgetCreation,
       bool incrementalSerialization) async {
     final Uri sdkRoot = computePlatformBinariesLocation(forceBuildDir: true);
+
+    TargetFlags targetFlags = new TargetFlags(
+        forceLateLoweringForTesting: forceLateLoweringForTesting,
+        trackWidgetCreation: trackWidgetCreation);
+    Target target = new VmTarget(targetFlags);
+    String sdkSummary = "vm_platform_strong.dill";
+    if (targetName != null) {
+      if (targetName == "None") {
+        target = new NoneTarget(targetFlags);
+      } else if (targetName == "DDC") {
+        target = new DevCompilerTarget(targetFlags);
+        sdkSummary = "ddc_platform.dill";
+      } else if (targetName == "VM") {
+        // default.
+      } else {
+        throw "Unknown target name '$targetName'";
+      }
+    }
+
     final Uri base = Uri.parse("org-dartlang-test:///");
-    final Uri sdkSummary = base.resolve("vm_platform_strong.dill");
+    final Uri sdkSummaryUri = base.resolve(sdkSummary);
     final Uri initializeFrom = base.resolve("initializeFrom.dill");
-    Uri platformUri = sdkRoot.resolve("vm_platform_strong.dill");
+    Uri platformUri = sdkRoot.resolve(sdkSummary);
     final List<int> sdkSummaryData =
         await new File.fromUri(platformUri).readAsBytes();
 
@@ -354,8 +375,8 @@
     Map<String, Component> moduleComponents;
 
     if (modules != null) {
-      moduleData = await createModules(
-          modules, sdkSummaryData, targetName, forceLateLoweringForTesting);
+      moduleData =
+          await createModules(modules, sdkSummaryData, target, sdkSummary);
       sdk = newestWholeComponent = new Component();
       new BinaryBuilder(sdkSummaryData,
               filename: null, disableLazyReading: false)
@@ -411,7 +432,7 @@
       if (brandNewWorld) {
         fs = new MemoryFileSystem(base);
       }
-      fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryData);
+      fs.entityForUri(sdkSummaryUri).writeAsBytesSync(sdkSummaryData);
       bool expectInitializeFromDill = false;
       if (newestWholeComponentData != null &&
           newestWholeComponentData.isNotEmpty) {
@@ -443,12 +464,10 @@
       }
 
       if (brandNewWorld) {
-        options = getOptions(
-            targetName: targetName,
-            forceLateLoweringForTesting: forceLateLoweringForTesting);
+        options = getOptions(target: target, sdkSummary: sdkSummary);
         options.fileSystem = fs;
         options.sdkRoot = null;
-        options.sdkSummary = sdkSummary;
+        options.sdkSummary = sdkSummaryUri;
         options.omitPlatform = omitPlatform != false;
         if (world["experiments"] != null) {
           Map<ExperimentalFlag, bool> experimentalFlags =
@@ -908,10 +927,32 @@
     sb.writeln("Library ${library.importUri}");
     for (Class c in library.classes) {
       sb.writeln("  - Class ${c.name}");
+
+      Set<Class> checkedSupertypes = <Class>{};
+      void checkSupertype(Supertype supertype) {
+        if (supertype == null) return;
+        Class superclass = supertype.classNode;
+        if (checkedSupertypes.add(superclass)) {
+          Supertype asSuperClass =
+              classHierarchy.getClassAsInstanceOf(c, superclass);
+          if (asSuperClass == null) {
+            throw "${superclass} not found as a superclass of $c";
+          }
+          checkSupertype(superclass.supertype);
+          checkSupertype(superclass.mixedInType);
+          for (Supertype interface in superclass.implementedTypes) {
+            checkSupertype(interface);
+          }
+        }
+      }
+
+      checkSupertype(c.asThisSupertype);
+
       ForTestingClassInfo info = classHierarchyMap[c];
       if (info == null) {
         throw "Didn't find any class hierarchy info for $c";
       }
+
       if (info.lazyDeclaredGettersAndCalls != null) {
         sb.writeln("    - lazyDeclaredGettersAndCalls:");
         for (Member member in info.lazyDeclaredGettersAndCalls) {
@@ -1330,20 +1371,10 @@
   Expect.equals(a.length, b.length);
 }
 
-CompilerOptions getOptions(
-    {String targetName, bool forceLateLoweringForTesting: false}) {
+CompilerOptions getOptions({Target target, String sdkSummary}) {
+  target ??= new VmTarget(new TargetFlags());
+  sdkSummary ??= 'vm_platform_strong.dill';
   final Uri sdkRoot = computePlatformBinariesLocation(forceBuildDir: true);
-  Target target = new VmTarget(new TargetFlags(
-      forceLateLoweringForTesting: forceLateLoweringForTesting));
-  if (targetName != null) {
-    if (targetName == "None") {
-      target = new NoneTarget(new TargetFlags());
-    } else if (targetName == "VM") {
-      // default.
-    } else {
-      throw "Unknown target name '$targetName'";
-    }
-  }
   CompilerOptions options = new CompilerOptions()
     ..sdkRoot = sdkRoot
     ..target = target
@@ -1356,7 +1387,7 @@
             "Unexpected error: ${message.plainTextFormatted.join('\n')}");
       }
     }
-    ..sdkSummary = sdkRoot.resolve("vm_platform_strong.dill")
+    ..sdkSummary = sdkRoot.resolve(sdkSummary)
     ..environmentDefines = const {};
   return options;
 }
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index 4824e2e..cbbf1219 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -237,66 +237,66 @@
       }
     });
   }
+}
 
-  StringBuffer tokenStreamToString(Token firstToken, List<int> lineStarts,
-      {bool addTypes: false}) {
-    StringBuffer sb = new StringBuffer();
-    Token token = firstToken;
+StringBuffer tokenStreamToString(Token firstToken, List<int> lineStarts,
+    {bool addTypes: false}) {
+  StringBuffer sb = new StringBuffer();
+  Token token = firstToken;
 
-    Token process(Token token, bool errorTokens) {
-      bool printed = false;
-      int endOfLast = -1;
-      int lineStartsIteratorLine = 1;
-      Iterator<int> lineStartsIterator = lineStarts.iterator;
-      lineStartsIterator.moveNext();
-      lineStartsIterator.moveNext();
-      lineStartsIteratorLine++;
+  Token process(Token token, bool errorTokens) {
+    bool printed = false;
+    int endOfLast = -1;
+    int lineStartsIteratorLine = 1;
+    Iterator<int> lineStartsIterator = lineStarts.iterator;
+    lineStartsIterator.moveNext();
+    lineStartsIterator.moveNext();
+    lineStartsIteratorLine++;
 
-      while (token != null) {
-        if (errorTokens && token is! ErrorToken) return token;
-        if (!errorTokens && token is ErrorToken) {
-          if (token == token.next) break;
-          token = token.next;
-          continue;
-        }
-
-        int prevLine = lineStartsIteratorLine;
-        while (token.offset >= lineStartsIterator.current &&
-            lineStartsIterator.moveNext()) {
-          lineStartsIteratorLine++;
-        }
-        if (printed &&
-            (token.offset > endOfLast || prevLine < lineStartsIteratorLine)) {
-          if (prevLine < lineStartsIteratorLine) {
-            for (int i = prevLine; i < lineStartsIteratorLine; i++) {
-              sb.write("\n");
-            }
-          } else {
-            sb.write(" ");
-          }
-        }
-        if (token is! ErrorToken) {
-          sb.write(token.lexeme);
-        }
-        if (addTypes) {
-          sb.write("[${token.runtimeType}]");
-        }
-        printed = true;
-        endOfLast = token.end;
+    while (token != null) {
+      if (errorTokens && token is! ErrorToken) return token;
+      if (!errorTokens && token is ErrorToken) {
         if (token == token.next) break;
         token = token.next;
+        continue;
       }
 
-      return token;
+      int prevLine = lineStartsIteratorLine;
+      while (token.offset >= lineStartsIterator.current &&
+          lineStartsIterator.moveNext()) {
+        lineStartsIteratorLine++;
+      }
+      if (printed &&
+          (token.offset > endOfLast || prevLine < lineStartsIteratorLine)) {
+        if (prevLine < lineStartsIteratorLine) {
+          for (int i = prevLine; i < lineStartsIteratorLine; i++) {
+            sb.write("\n");
+          }
+        } else {
+          sb.write(" ");
+        }
+      }
+      if (token is! ErrorToken) {
+        sb.write(token.lexeme);
+      }
+      if (addTypes) {
+        sb.write("[${token.runtimeType}]");
+      }
+      printed = true;
+      endOfLast = token.end;
+      if (token == token.next) break;
+      token = token.next;
     }
 
-    if (addTypes) {
-      token = process(token, true);
-    }
-    token = process(token, false);
-
-    return sb;
+    return token;
   }
+
+  if (addTypes) {
+    token = process(token, true);
+  }
+  token = process(token, false);
+
+  return sb;
 }
 
 Token scanUri(Uri uri, String shortName, {List<int> lineStarts}) {
@@ -312,6 +312,11 @@
   File f = new File.fromUri(uri);
   List<int> rawBytes = f.readAsBytesSync();
 
+  return scanRawBytes(rawBytes, config, lineStarts);
+}
+
+Token scanRawBytes(
+    List<int> rawBytes, ScannerConfiguration config, List<int> lineStarts) {
   Uint8List bytes = new Uint8List(rawBytes.length + 1);
   bytes.setRange(0, rawBytes.length, rawBytes);
 
diff --git a/pkg/front_end/test/read_dill_from_binary_md_test.dart b/pkg/front_end/test/read_dill_from_binary_md_test.dart
index 8b9c6d3..4907f4e 100644
--- a/pkg/front_end/test/read_dill_from_binary_md_test.dart
+++ b/pkg/front_end/test/read_dill_from_binary_md_test.dart
@@ -23,7 +23,7 @@
   final Uri dart2jsUrl = Uri.base.resolve("pkg/compiler/bin/dart2js.dart");
   Stopwatch stopwatch = new Stopwatch()..start();
   List<int> bytes = await normalCompileToBytes(dart2jsUrl,
-      options: getOptions()..target = new NoneTarget(new TargetFlags()));
+      options: getOptions(target: new NoneTarget(new TargetFlags())));
   print("Compiled dart2js in ${stopwatch.elapsedMilliseconds} ms");
 
   stopwatch.reset();
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 93a4423..88dcde6 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -106,6 +106,7 @@
 bj
 blob
 blocking
+bmp
 bn
 bo
 bodied
@@ -239,6 +240,7 @@
 cyclically
 d
 d11e
+d7c
 dag
 dangerous
 dangling
@@ -595,6 +597,7 @@
 mangled
 manipulation
 markdown
+masking
 matcher
 mb
 md
@@ -925,6 +928,7 @@
 shallow
 shas
 shelf
+shifts
 showing
 shrinking
 shru
@@ -1199,6 +1203,7 @@
 worthwhile
 writeln
 wrt
+wtf
 www
 x
 x0
@@ -1239,6 +1244,7 @@
 xn
 xnon
 xor
+xor's
 xpotentially
 xs
 xss
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index aae076c..2327236 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -1054,8 +1054,8 @@
 exited
 exits
 expand
-expands
 expanding
+expands
 expansion
 expect
 expectation
@@ -1411,6 +1411,7 @@
 included
 includes
 including
+inclusion
 inclusive
 incoming
 incompatible
@@ -1706,6 +1707,7 @@
 logging
 logic
 logical
+lone
 long
 longer
 longest
@@ -1768,6 +1770,7 @@
 matter
 maturity
 max
+maximal
 maximum
 may
 maybe
@@ -1843,6 +1846,7 @@
 modulo
 moment
 mongolian
+monotonous
 more
 moreover
 most
@@ -1944,6 +1948,7 @@
 objects
 oblivious
 observation
+observations
 observed
 obtain
 obtained
@@ -2247,6 +2252,7 @@
 promotion
 promotions
 propagate
+propagates
 propagating
 propagation
 proper
@@ -2327,6 +2333,8 @@
 recognizes
 recommend
 recommendations
+recomputation
+recomputes
 record
 recorded
 recording
@@ -2991,6 +2999,7 @@
 translates
 translating
 translator
+traveling
 traversed
 treat
 treated
@@ -3017,6 +3026,8 @@
 truly
 truncate
 truncating
+trust
+trusts
 truth
 try
 trying
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 95a7bb3..2b8ccc0 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -27,8 +27,10 @@
 aoo
 approval
 approximation
+arbitrarily
 asdf
 asserter
+assure
 auth
 authority
 auto
@@ -279,6 +281,7 @@
 issue41496b
 issue41498b
 issue41499b
+it'll
 iter
 joo
 jumped
@@ -340,6 +343,7 @@
 metrics
 mf
 micro
+minimize
 minutes
 mismatched
 misnamed
@@ -365,6 +369,7 @@
 oh
 okay
 ooo
+operate
 ops
 optimal
 oracle
diff --git a/pkg/front_end/test/test_generator_test.dart b/pkg/front_end/test/test_generator_test.dart
index d0e3e1a..9ce654d 100644
--- a/pkg/front_end/test/test_generator_test.dart
+++ b/pkg/front_end/test/test_generator_test.dart
@@ -130,7 +130,7 @@
     MemoryFileSystem fs = new MemoryFileSystem(base);
     fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryData);
 
-    CompilerOptions options = helper.getOptions(targetName: "VM");
+    CompilerOptions options = helper.getOptions();
     options.fileSystem = fs;
     options.sdkRoot = null;
     options.sdkSummary = sdkSummary;
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index a9d27a9..855e343 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -369,7 +369,7 @@
       for (Library library in component.libraries) {
         if (library.importUri.scheme != "dart" &&
             library.importUri.scheme != "package") {
-          library.accept(verifier);
+          verifier.verify(library);
         }
       }
       for (TextSerializationVerificationFailure failure in verifier.failures) {
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart b/pkg/front_end/testcases/extensions/call_methods.dart
index cf0ecfab..3ae8fe3 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart
+++ b/pkg/front_end/testcases/extensions/call_methods.dart
@@ -26,6 +26,15 @@
   ""();
 }
 
+var topLevel1 = 1(10);
+var topLevel2 = 1("10");
+var topLevel3 = 1.0(10);
+var topLevel4 = 1.0("10");
+A a = new A();
+var topLevel5 = a(2);
+B b = new B();
+var topLevel6 = a(2, "3");
+
 errors() {
   1(10);
   1("10");
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.outline.expect b/pkg/front_end/testcases/extensions/call_methods.dart.outline.expect
index b57cf7b..04fd8c7 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.outline.expect
@@ -23,6 +23,14 @@
 extension _extension#2 on core::String* {
   get call = self::_extension#2|get#call;
 }
+static field core::String* topLevel1;
+static field core::String* topLevel2;
+static field core::String* topLevel3;
+static field core::String* topLevel4;
+static field self::A* a;
+static field core::String* topLevel5;
+static field self::B* b;
+static field core::String* topLevel6;
 static method _extension#0|get#call(final core::int* #this) → core::String*
   ;
 static method _extension#1|get#call(final core::num* #this) → core::String*
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.strong.expect b/pkg/front_end/testcases/extensions/call_methods.dart.strong.expect
index e831fc5..7835653 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.strong.expect
@@ -2,49 +2,91 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:30:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+// pkg/front_end/testcases/extensions/call_methods.dart:29:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// var topLevel1 = 1(10);
+//                  ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:30:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// var topLevel2 = 1("10");
+//                  ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:31:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// var topLevel3 = 1.0(10);
+//                    ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:32:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// var topLevel4 = 1.0("10");
+//                    ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// var topLevel5 = a(2);
+//                  ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var topLevel5 = a(2);
+//                  ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+// var topLevel6 = a(2, "3");
+//                  ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var topLevel6 = a(2, "3");
+//                  ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:39:4: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //   1(10);
 //    ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:31:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+// pkg/front_end/testcases/extensions/call_methods.dart:40:4: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //   1("10");
 //    ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:32:6: Error: Too many positional arguments: 0 allowed, but 1 found.
+// pkg/front_end/testcases/extensions/call_methods.dart:41:6: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //   1.0(10);
 //      ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:33:6: Error: Too many positional arguments: 0 allowed, but 1 found.
+// pkg/front_end/testcases/extensions/call_methods.dart:42:6: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //   1.0("10");
 //      ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:35:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+// pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //   a(2);
 //    ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:35:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+// pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
 //   a(2);
 //    ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:36:4: Error: Too many positional arguments: 0 allowed, but 2 found.
+// pkg/front_end/testcases/extensions/call_methods.dart:45:4: Error: Too many positional arguments: 0 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   a(2, "3");
 //    ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:36:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+// pkg/front_end/testcases/extensions/call_methods.dart:45:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
 //   a(2, "3");
 //    ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:38:4: Error: Cannot invoke an instance of 'B' because it declares 'call' to be something other than a method.
+// pkg/front_end/testcases/extensions/call_methods.dart:47:4: Error: Cannot invoke an instance of 'B' because it declares 'call' to be something other than a method.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
 //   b();
@@ -76,6 +118,34 @@
 extension _extension#2 on core::String* {
   get call = self::_extension#2|get#call;
 }
+static field core::String* topLevel1 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:29:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+var topLevel1 = 1(10);
+                 ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)).call(10);
+static field core::String* topLevel2 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:30:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+var topLevel2 = 1(\"10\");
+                 ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)).call("10");
+static field core::String* topLevel3 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:31:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+var topLevel3 = 1.0(10);
+                   ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)).call(10);
+static field core::String* topLevel4 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:32:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+var topLevel4 = 1.0(\"10\");
+                   ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)).call("10");
+static field self::A* a = new self::A::•();
+static field core::String* topLevel5 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+ - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var topLevel5 = a(2);
+                 ^" as{TypeError,ForDynamic} core::String*;
+static field self::B* b = new self::B::•();
+static field core::String* topLevel6 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+ - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var topLevel6 = a(2, \"3\");
+                 ^" as{TypeError,ForDynamic} core::String*;
 static method _extension#0|get#call(final core::int* #this) → core::String*
   return "My name is int";
 static method _extension#1|get#call(final core::num* #this) → core::String*
@@ -86,35 +156,35 @@
   self::_extension#2|get#call("").call();
 }
 static method errors() → dynamic {
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:30:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:39:4: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
   1(10);
    ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)).call(10);
-  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:31:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:40:4: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
   1(\"10\");
    ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)).call("10");
-  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:32:6: Error: Too many positional arguments: 0 allowed, but 1 found.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:41:6: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
   1.0(10);
      ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)).call(10);
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:33:6: Error: Too many positional arguments: 0 allowed, but 1 found.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:42:6: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
   1.0(\"10\");
      ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)).call("10");
   self::A* a = new self::A::•();
-  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:35:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
   a(2);
    ^";
-  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:36:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:45:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
   a(2, \"3\");
    ^";
   self::B* b = new self::B::•();
-  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:38:4: Error: Cannot invoke an instance of 'B' because it declares 'call' to be something other than a method.
+  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:47:4: Error: Cannot invoke an instance of 'B' because it declares 'call' to be something other than a method.
  - 'B' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
   b();
diff --git a/pkg/front_end/testcases/general/call.dart b/pkg/front_end/testcases/general/call.dart
index 1543991..4152cd8 100644
--- a/pkg/front_end/testcases/general/call.dart
+++ b/pkg/front_end/testcases/general/call.dart
@@ -46,3 +46,36 @@
   var nothing11 = callableGetter.call.call();
   var nothing12 = callableGetter.call.call.call();
 }
+
+var closure = (x) => x;
+var int1 = closure(1);
+var int2 = closure.call(1);
+var int3 = closure.call.call(1);
+var int4 = closure.call.call.call(1);
+
+var callable = new Callable();
+var string1 = callable(1);
+var string2 = callable.call(1);
+var string3 = callable.call.call(1);
+var string4 = callable.call.call.call(1);
+
+var callableGetter = new CallableGetter();
+var string5 = callableGetter(1);
+var string6 = callableGetter.call(1);
+var string7 = callableGetter.call.call(1);
+var string8 = callableGetter.call.call.call(1);
+
+var nothing1 = closure();
+var nothing2 = closure.call();
+var nothing3 = closure.call.call();
+var nothing4 = closure.call.call.call();
+
+var nothing5 = callable();
+var nothing6 = callable.call();
+var nothing7 = callable.call.call();
+var nothing8 = callable.call.call.call();
+
+var nothing9 = callableGetter();
+var nothing10 = callableGetter.call();
+var nothing11 = callableGetter.call.call();
+var nothing12 = callableGetter.call.call.call();
diff --git a/pkg/front_end/testcases/general/call.dart.outline.expect b/pkg/front_end/testcases/general/call.dart.outline.expect
index 5aba50d..93fbf2a 100644
--- a/pkg/front_end/testcases/general/call.dart.outline.expect
+++ b/pkg/front_end/testcases/general/call.dart.outline.expect
@@ -14,5 +14,32 @@
   get call() → dynamic
     ;
 }
+static field (dynamic) →* dynamic closure;
+static field dynamic int1;
+static field dynamic int2;
+static field dynamic int3;
+static field dynamic int4;
+static field self::Callable* callable;
+static field dynamic string1;
+static field dynamic string2;
+static field dynamic string3;
+static field dynamic string4;
+static field self::CallableGetter* callableGetter;
+static field dynamic string5;
+static field dynamic string6;
+static field dynamic string7;
+static field dynamic string8;
+static field dynamic nothing1;
+static field dynamic nothing2;
+static field dynamic nothing3;
+static field dynamic nothing4;
+static field dynamic nothing5;
+static field dynamic nothing6;
+static field dynamic nothing7;
+static field dynamic nothing8;
+static field dynamic nothing9;
+static field dynamic nothing10;
+static field dynamic nothing11;
+static field dynamic nothing12;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/call.dart.strong.expect b/pkg/front_end/testcases/general/call.dart.strong.expect
index 9efa544..9bbc04c 100644
--- a/pkg/front_end/testcases/general/call.dart.strong.expect
+++ b/pkg/front_end/testcases/general/call.dart.strong.expect
@@ -46,6 +46,50 @@
 //   var nothing9 = callableGetter();
 //                                ^
 //
+// pkg/front_end/testcases/general/call.dart:63:29: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+//  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var string5 = callableGetter(1);
+//                             ^
+//
+// pkg/front_end/testcases/general/call.dart:68:23: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing1 = closure();
+//                       ^
+//
+// pkg/front_end/testcases/general/call.dart:69:28: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing2 = closure.call();
+//                            ^
+//
+// pkg/front_end/testcases/general/call.dart:70:33: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing3 = closure.call.call();
+//                                 ^
+//
+// pkg/front_end/testcases/general/call.dart:71:38: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing4 = closure.call.call.call();
+//                                      ^
+//
+// pkg/front_end/testcases/general/call.dart:73:24: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing5 = callable();
+//                        ^
+//
+// pkg/front_end/testcases/general/call.dart:74:29: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing6 = callable.call();
+//                             ^
+//
+// pkg/front_end/testcases/general/call.dart:75:34: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing7 = callable.call.call();
+//                                  ^
+//
+// pkg/front_end/testcases/general/call.dart:76:39: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing8 = callable.call.call.call();
+//                                       ^
+//
+// pkg/front_end/testcases/general/call.dart:78:30: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+//  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var nothing9 = callableGetter();
+//                              ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -64,6 +108,57 @@
   get call() → dynamic
     return new self::Callable::•();
 }
+static field (dynamic) →* dynamic closure = (dynamic x) → dynamic => x;
+static field dynamic int1 = self::closure.call(1);
+static field dynamic int2 = self::closure.call(1);
+static field dynamic int3 = self::closure.call.call(1);
+static field dynamic int4 = self::closure.call.call.call(1);
+static field self::Callable* callable = new self::Callable::•();
+static field dynamic string1 = self::callable.{self::Callable::call}(1);
+static field dynamic string2 = self::callable.{self::Callable::call}(1);
+static field dynamic string3 = self::callable.{self::Callable::call}.call(1);
+static field dynamic string4 = self::callable.{self::Callable::call}.call.call(1);
+static field self::CallableGetter* callableGetter = new self::CallableGetter::•();
+static field dynamic string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:63:29: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+ - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var string5 = callableGetter(1);
+                            ^";
+static field dynamic string6 = let final self::CallableGetter* #t1 = self::callableGetter in let final core::int* #t2 = 1 in #t1.{self::CallableGetter::call}.call(#t2);
+static field dynamic string7 = self::callableGetter.{self::CallableGetter::call}.call(1);
+static field dynamic string8 = self::callableGetter.{self::CallableGetter::call}.call.call(1);
+static field dynamic nothing1 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/general/call.dart:68:23: Error: Too few positional arguments: 1 required, 0 given.
+var nothing1 = closure();
+                      ^" in self::closure.call();
+static field dynamic nothing2 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/general/call.dart:69:28: Error: Too few positional arguments: 1 required, 0 given.
+var nothing2 = closure.call();
+                           ^" in self::closure.call();
+static field dynamic nothing3 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/general/call.dart:70:33: Error: Too few positional arguments: 1 required, 0 given.
+var nothing3 = closure.call.call();
+                                ^" in self::closure.call.call();
+static field dynamic nothing4 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/general/call.dart:71:38: Error: Too few positional arguments: 1 required, 0 given.
+var nothing4 = closure.call.call.call();
+                                     ^" in self::closure.call.call.call();
+static field dynamic nothing5 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/general/call.dart:73:24: Error: Too few positional arguments: 1 required, 0 given.
+var nothing5 = callable();
+                       ^" in self::callable.{self::Callable::call}();
+static field dynamic nothing6 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/general/call.dart:74:29: Error: Too few positional arguments: 1 required, 0 given.
+var nothing6 = callable.call();
+                            ^" in self::callable.{self::Callable::call}();
+static field dynamic nothing7 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/general/call.dart:75:34: Error: Too few positional arguments: 1 required, 0 given.
+var nothing7 = callable.call.call();
+                                 ^" in self::callable.{self::Callable::call}.call();
+static field dynamic nothing8 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/general/call.dart:76:39: Error: Too few positional arguments: 1 required, 0 given.
+var nothing8 = callable.call.call.call();
+                                      ^" in self::callable.{self::Callable::call}.call.call();
+static field dynamic nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:78:30: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+ - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var nothing9 = callableGetter();
+                             ^";
+static field dynamic nothing10 = self::callableGetter.{self::CallableGetter::call}.call();
+static field dynamic nothing11 = self::callableGetter.{self::CallableGetter::call}.call();
+static field dynamic nothing12 = self::callableGetter.{self::CallableGetter::call}.call.call();
 static method main() → dynamic {
   (dynamic) →* dynamic closure = (dynamic x) → dynamic => x;
   dynamic int1 = closure.call(1);
@@ -81,31 +176,31 @@
 Try changing 'call' to a method or explicitly invoke 'call'.
   var string5 = callableGetter(1);
                               ^";
-  dynamic string6 = let final self::CallableGetter* #t1 = callableGetter in let final core::int* #t2 = 1 in #t1.{self::CallableGetter::call}.call(#t2);
+  dynamic string6 = let final self::CallableGetter* #t11 = callableGetter in let final core::int* #t12 = 1 in #t11.{self::CallableGetter::call}.call(#t12);
   dynamic string7 = callableGetter.{self::CallableGetter::call}.call(1);
   dynamic string8 = callableGetter.{self::CallableGetter::call}.call.call(1);
-  invalid-type nothing1 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/general/call.dart:34:25: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-type nothing1 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/general/call.dart:34:25: Error: Too few positional arguments: 1 required, 0 given.
   var nothing1 = closure();
                         ^" in closure.call();
-  invalid-type nothing2 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/general/call.dart:35:30: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-type nothing2 = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/general/call.dart:35:30: Error: Too few positional arguments: 1 required, 0 given.
   var nothing2 = closure.call();
                              ^" in closure.call();
-  invalid-type nothing3 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/general/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-type nothing3 = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/general/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
   var nothing3 = closure.call.call();
                                   ^" in closure.call.call();
-  invalid-type nothing4 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/general/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-type nothing4 = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/general/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
   var nothing4 = closure.call.call.call();
                                        ^" in closure.call.call.call();
-  invalid-type nothing5 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/general/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-type nothing5 = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/general/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
   var nothing5 = callable();
                          ^" in callable.{self::Callable::call}();
-  invalid-type nothing6 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/general/call.dart:40:31: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-type nothing6 = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/general/call.dart:40:31: Error: Too few positional arguments: 1 required, 0 given.
   var nothing6 = callable.call();
                               ^" in callable.{self::Callable::call}();
-  invalid-type nothing7 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/general/call.dart:41:36: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-type nothing7 = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/general/call.dart:41:36: Error: Too few positional arguments: 1 required, 0 given.
   var nothing7 = callable.call.call();
                                    ^" in callable.{self::Callable::call}.call();
-  invalid-type nothing8 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/general/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-type nothing8 = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/general/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
   var nothing8 = callable.call.call.call();
                                         ^" in callable.{self::Callable::call}.call.call();
   dynamic nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_widget_transform.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_widget_transform.yaml
new file mode 100644
index 0000000..3e3b988
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_widget_transform.yaml
@@ -0,0 +1,65 @@
+# Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+type: newworld
+target: DDC
+trackWidgetCreation: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import 'package:flutter/src/widgets/framework.dart';
+        import 'package:flutter/src/widgets/widget_inspector.dart';
+
+        class Foo extends Widget {}
+      flutter/lib/src/widgets/framework.dart: |
+        abstract class Bar {}
+
+        abstract class Widget extends Bar {}
+      flutter/lib/src/widgets/widget_inspector.dart: |
+        abstract class _HasCreationLocation {
+          _Location get _location;
+        }
+
+        /// A tuple with file, line, and column number, for displaying human-readable
+        /// file locations.
+        class _Location {
+          const _Location({
+            this.file,
+            this.line,
+            this.column,
+            this.name,
+            this.parameterLocations,
+          });
+
+          /// File path of the location.
+          final String file;
+
+          /// 1-based line number.
+          final int line;
+
+          /// 1-based column number.
+          final int column;
+
+          /// Optional name of the parameter or function at this location.
+          final String name;
+
+          /// Optional locations of the parameters of the member at this location.
+          final List<_Location> parameterLocations;
+        }
+      .packages: |
+        flutter:flutter/lib
+    expectedLibraryCount: 3
+  - entry: main.dart
+    worldType: updated
+    invalidate:
+      - main.dart
+    expectInitializeFromDill: false
+    sources:
+      main.dart: |
+        import 'package:flutter/src/widgets/framework.dart';
+        import 'package:flutter/src/widgets/widget_inspector.dart';
+
+        class Foo extends Widget {}
+    expectedLibraryCount: 3
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_widget_transform.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_widget_transform.yaml.world.1.expect
new file mode 100644
index 0000000..95a88d7
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_widget_transform.yaml.world.1.expect
@@ -0,0 +1,48 @@
+main = <No Member>;
+library from "package:flutter/src/widgets/framework.dart" as fra {
+
+  abstract class Bar extends dart.core::Object {
+    synthetic constructor •() → fra::Bar*
+      : super dart.core::Object::•()
+      ;
+  }
+  abstract class Widget extends fra::Bar implements wid::_HasCreationLocation {
+    final field wid::_Location* _location /* from null */;
+    synthetic constructor •({wid::_Location* $creationLocationd_0dea112b090073317d4}) → fra::Widget*
+      : super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
+      ;
+  }
+}
+library from "package:flutter/src/widgets/widget_inspector.dart" as wid {
+
+  abstract class _HasCreationLocation extends dart.core::Object {
+    synthetic constructor •() → wid::_HasCreationLocation*
+      : super dart.core::Object::•()
+      ;
+    abstract get _location() → wid::_Location*;
+  }
+  class _Location extends dart.core::Object /*hasConstConstructor*/  {
+    final field dart.core::String* file;
+    final field dart.core::int* line;
+    final field dart.core::int* column;
+    final field dart.core::String* name;
+    final field dart.core::List<wid::_Location*>* parameterLocations;
+    const constructor •({dart.core::String* file = #C1, dart.core::int* line = #C1, dart.core::int* column = #C1, dart.core::String* name = #C1, dart.core::List<wid::_Location*>* parameterLocations = #C1}) → wid::_Location*
+      : wid::_Location::file = file, wid::_Location::line = line, wid::_Location::column = column, wid::_Location::name = name, wid::_Location::parameterLocations = parameterLocations, super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:flutter/src/widgets/framework.dart";
+  import "package:flutter/src/widgets/widget_inspector.dart";
+
+  class Foo extends fra::Widget {
+    synthetic constructor •({wid::_Location* $creationLocationd_0dea112b090073317d4}) → main::Foo*
+      : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
+      ;
+  }
+}
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_widget_transform.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_widget_transform.yaml.world.2.expect
new file mode 100644
index 0000000..95a88d7
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_widget_transform.yaml.world.2.expect
@@ -0,0 +1,48 @@
+main = <No Member>;
+library from "package:flutter/src/widgets/framework.dart" as fra {
+
+  abstract class Bar extends dart.core::Object {
+    synthetic constructor •() → fra::Bar*
+      : super dart.core::Object::•()
+      ;
+  }
+  abstract class Widget extends fra::Bar implements wid::_HasCreationLocation {
+    final field wid::_Location* _location /* from null */;
+    synthetic constructor •({wid::_Location* $creationLocationd_0dea112b090073317d4}) → fra::Widget*
+      : super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
+      ;
+  }
+}
+library from "package:flutter/src/widgets/widget_inspector.dart" as wid {
+
+  abstract class _HasCreationLocation extends dart.core::Object {
+    synthetic constructor •() → wid::_HasCreationLocation*
+      : super dart.core::Object::•()
+      ;
+    abstract get _location() → wid::_Location*;
+  }
+  class _Location extends dart.core::Object /*hasConstConstructor*/  {
+    final field dart.core::String* file;
+    final field dart.core::int* line;
+    final field dart.core::int* column;
+    final field dart.core::String* name;
+    final field dart.core::List<wid::_Location*>* parameterLocations;
+    const constructor •({dart.core::String* file = #C1, dart.core::int* line = #C1, dart.core::int* column = #C1, dart.core::String* name = #C1, dart.core::List<wid::_Location*>* parameterLocations = #C1}) → wid::_Location*
+      : wid::_Location::file = file, wid::_Location::line = line, wid::_Location::column = column, wid::_Location::name = name, wid::_Location::parameterLocations = parameterLocations, super dart.core::Object::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:flutter/src/widgets/framework.dart";
+  import "package:flutter/src/widgets/widget_inspector.dart";
+
+  class Foo extends fra::Widget {
+    synthetic constructor •({wid::_Location* $creationLocationd_0dea112b090073317d4}) → main::Foo*
+      : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
+      ;
+  }
+}
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/issue41199.dart b/pkg/front_end/testcases/inference/issue41199.dart
new file mode 100644
index 0000000..778bf42
--- /dev/null
+++ b/pkg/front_end/testcases/inference/issue41199.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo<X>(Map<X, Y> Function<Y>() f) => null;
+baz() => foo(<Z>() => <dynamic, Z>{});
+
+main() {}
diff --git a/pkg/front_end/testcases/inference/issue41199.dart.outline.expect b/pkg/front_end/testcases/inference/issue41199.dart.outline.expect
new file mode 100644
index 0000000..69b0cc3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/issue41199.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo<X extends core::Object* = dynamic>(<Y extends core::Object* = dynamic>() →* core::Map<self::foo::X*, Y*>* f) → dynamic
+  ;
+static method baz() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/issue41199.dart.strong.expect b/pkg/front_end/testcases/inference/issue41199.dart.strong.expect
new file mode 100644
index 0000000..6d7392d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/issue41199.dart.strong.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo<X extends core::Object* = dynamic>(<Y extends core::Object* = dynamic>() →* core::Map<self::foo::X*, Y*>* f) → dynamic
+  return null;
+static method baz() → dynamic
+  return self::foo<dynamic>(<Z extends core::Object* = dynamic>() → core::Map<dynamic, Z*>* => <dynamic, Z*>{});
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/issue41199.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/issue41199.dart.strong.transformed.expect
new file mode 100644
index 0000000..6d7392d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/issue41199.dart.strong.transformed.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo<X extends core::Object* = dynamic>(<Y extends core::Object* = dynamic>() →* core::Map<self::foo::X*, Y*>* f) → dynamic
+  return null;
+static method baz() → dynamic
+  return self::foo<dynamic>(<Z extends core::Object* = dynamic>() → core::Map<dynamic, Z*>* => <dynamic, Z*>{});
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart b/pkg/front_end/testcases/nnbd/issue41102.dart
index f10ab27..a237a56 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart
@@ -38,7 +38,7 @@
 
 final s10 = s7.length;
 
-final s11 = s5.length = 0;
+final s11 = s7.length = 0;
 
 final s12 = -s5;
 
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
index 7157bfd..6c39527 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
@@ -43,14 +43,10 @@
 // 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.
+// pkg/front_end/testcases/nnbd/issue41102.dart:41: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 s11 = s5.length = 0;
+// final s11 = s7.length = 0;
 //                ^^^^^^
 //
 // pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
@@ -111,13 +107,11 @@
 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.
+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 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
 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;
-               ^^^^^^";
+final s11 = s7.length = 0;
+               ^^^^^^" in self::s7.{core::List::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-}();
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
index d888b44..ae59b84 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
@@ -43,14 +43,10 @@
 // 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.
+// pkg/front_end/testcases/nnbd/issue41102.dart:41: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 s11 = s5.length = 0;
+// final s11 = s7.length = 0;
 //                ^^^^^^
 //
 // pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
@@ -111,13 +107,11 @@
 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.
+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 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
 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;
-               ^^^^^^";
+final s11 = s7.length = 0;
+               ^^^^^^" in self::s7.{core::List::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-}();
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
index 7157bfd..6c39527 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
@@ -43,14 +43,10 @@
 // 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.
+// pkg/front_end/testcases/nnbd/issue41102.dart:41: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 s11 = s5.length = 0;
+// final s11 = s7.length = 0;
 //                ^^^^^^
 //
 // pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
@@ -111,13 +107,11 @@
 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.
+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 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
 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;
-               ^^^^^^";
+final s11 = s7.length = 0;
+               ^^^^^^" in self::s7.{core::List::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-}();
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
index d888b44..ae59b84 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
@@ -43,14 +43,10 @@
 // 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.
+// pkg/front_end/testcases/nnbd/issue41102.dart:41: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 s11 = s5.length = 0;
+// final s11 = s7.length = 0;
 //                ^^^^^^
 //
 // pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
@@ -111,13 +107,11 @@
 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.
+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 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
 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;
-               ^^^^^^";
+final s11 = s7.length = 0;
+               ^^^^^^" in self::s7.{core::List::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-}();
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart
new file mode 100644
index 0000000..a000d92
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+class Class {
+  int property = 0;
+  int method() => 0;
+  Function functionField = () {};
+  void Function() functionTypeField = () {};
+  Function get functionGetter => () {};
+  void Function() get functionTypeGetter => () {};
+}
+
+Function? get nullableFunction => () {};
+
+void Function()? get nullableFunctionType => () {};
+
+int? get nullableInt => 0;
+
+Map<dynamic, dynamic>? get nullableMap => {};
+
+Class? get nullableClass => new Class();
+
+var topLevelBinary = nullableInt + 0;
+var topLevelUnary = -nullableInt;
+var topLevelIndexGet = nullableMap[0];
+var topLevelIndexSet = nullableMap[0] = 1;
+var topLevelIndexGetSet = nullableMap[0] += 1;
+var topLevelPropertyGet = nullableClass.property;
+var topLevelPropertySet = nullableClass.property = 1;
+var topLevelPropertyGetSet = nullableClass.property += 1;
+var topLevelMethodInvocation = nullableClass.method();
+var topLevelMethodTearOff = nullableClass.method;
+var topLevelFunctionImplicitCall = nullableFunction();
+var topLevelFunctionExplicitCall = nullableFunction.call();
+var topLevelFunctionTearOff = nullableFunction.call;
+var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+var topLevelFunctionField = nullableClass.functionField();
+var topLevelFunctionTypeField = nullableClass.functionTypeField();
+var topLevelFunctionGetter = nullableClass.functionGetter();
+var topLevelFunctionTypeGetter = nullableClass.functionTypeGetter();
+
+test() {
+  var localBinary = nullableInt + 0;
+  var localUnary = -nullableInt;
+  var localIndexGet = nullableMap[0];
+  var localIndexSet = nullableMap[0] = 1;
+  var localIndexGetSet = nullableMap[0] += 1;
+  var localPropertyGet = nullableClass.property;
+  var localPropertySet = nullableClass.property = 1;
+  var localPropertyGetSet = nullableClass.property += 1;
+  var localMethodInvocation = nullableClass.method();
+  var localMethodTearOff = nullableClass.method;
+  var localFunctionImplicitCall = nullableFunction();
+  var localFunctionExplicitCall = nullableFunction.call();
+  var localFunctionTearOff = nullableFunction.call;
+  var localFunctionTypeImplicitCall = nullableFunctionType();
+  var localFunctionTypeExplicitCall = nullableFunctionType.call();
+  var localFunctionTypeTearOff = nullableFunctionType.call;
+  var localFunctionField = nullableClass.functionField();
+  var localFunctionTypeField = nullableClass.functionTypeField();
+  var localFunctionGetter = nullableClass.functionGetter();
+  var localFunctionTypeGetter = nullableClass.functionTypeGetter();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect
new file mode 100644
index 0000000..e9455e1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int property;
+  field core::Function functionField;
+  field () → void functionTypeField;
+  synthetic constructor •() → self::Class
+    ;
+  method method() → core::int
+    ;
+  get functionGetter() → core::Function
+    ;
+  get functionTypeGetter() → () → void
+    ;
+}
+static field core::int? topLevelBinary;
+static field core::int topLevelUnary;
+static field dynamic topLevelIndexGet;
+static field core::int topLevelIndexSet;
+static field dynamic topLevelIndexGetSet;
+static field core::int topLevelPropertyGet;
+static field core::int topLevelPropertySet;
+static field core::int topLevelPropertyGetSet;
+static field core::int topLevelMethodInvocation;
+static field () → core::int topLevelMethodTearOff;
+static field dynamic topLevelFunctionImplicitCall;
+static field dynamic topLevelFunctionExplicitCall;
+static field core::Function? topLevelFunctionTearOff;
+static field void topLevelFunctionTypeImplicitCall;
+static field void topLevelFunctionTypeExplicitCall;
+static field () →? void topLevelFunctionTypeTearOff;
+static field dynamic topLevelFunctionField;
+static field void topLevelFunctionTypeField;
+static field dynamic topLevelFunctionGetter;
+static field void topLevelFunctionTypeGetter;
+static get nullableFunction() → core::Function?
+  ;
+static get nullableFunctionType() → () →? void
+  ;
+static get nullableInt() → core::int?
+  ;
+static get nullableMap() → core::Map<dynamic, dynamic>?
+  ;
+static get nullableClass() → self::Class?
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
new file mode 100644
index 0000000..eeb102b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
@@ -0,0 +1,358 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// var topLevelBinary = nullableInt + 0;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:25:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// var topLevelUnary = -nullableInt;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:26:35: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGet = nullableMap[0];
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:27:35: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexSet = nullableMap[0] = 1;
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:38: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGetSet = nullableMap[0] += 1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:38: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGetSet = nullableMap[0] += 1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:29:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertyGet = nullableClass.property;
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:30:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertySet = nullableClass.property = 1;
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:31:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertyGetSet = nullableClass.property += 1;
+//                                            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:32:46: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+// var topLevelMethodInvocation = nullableClass.method();
+//                                              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:34:52: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?.call instead.
+// var topLevelFunctionImplicitCall = nullableFunction();
+//                                                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:35:53: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+// var topLevelFunctionExplicitCall = nullableFunction.call();
+//                                                     ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:36:48: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try accessing using ?. instead.
+// var topLevelFunctionTearOff = nullableFunction.call;
+//                                                ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:60: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+//                                                            ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:61: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+// var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+//                                                             ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:39:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+// Try accessing using ?. instead.
+// var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+//                                                        ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:46:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+//   var localBinary = nullableInt + 0;
+//                                 ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:47:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+//   var localUnary = -nullableInt;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:48:34: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGet = nullableMap[0];
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:49:34: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexSet = nullableMap[0] = 1;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:37: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGetSet = nullableMap[0] += 1;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:37: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGetSet = nullableMap[0] += 1;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:51:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertyGet = nullableClass.property;
+//                                        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertySet = nullableClass.property = 1;
+//                                        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertyGetSet = nullableClass.property += 1;
+//                                           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:54:45: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+//   var localMethodInvocation = nullableClass.method();
+//                                             ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:56:51: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?.call instead.
+//   var localFunctionImplicitCall = nullableFunction();
+//                                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:57:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+//   var localFunctionExplicitCall = nullableFunction.call();
+//                                                    ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:58:47: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try accessing using ?. instead.
+//   var localFunctionTearOff = nullableFunction.call;
+//                                               ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:59:59: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+//   var localFunctionTypeImplicitCall = nullableFunctionType();
+//                                                           ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:60:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+//   var localFunctionTypeExplicitCall = nullableFunctionType.call();
+//                                                            ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:61:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+// Try accessing using ?. instead.
+//   var localFunctionTypeTearOff = nullableFunctionType.call;
+//                                                       ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int property = 0;
+  field core::Function functionField = () → core::Null? {};
+  field () → void functionTypeField = () → core::Null? {};
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method method() → core::int
+    return 0;
+  get functionGetter() → core::Function
+    return () → core::Null? {};
+  get functionTypeGetter() → () → void
+    return () → core::Null? {};
+}
+static field core::int? topLevelBinary = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+var topLevelBinary = nullableInt + 0;
+                                 ^" in self::nullableInt.{core::num::+}(0);
+static field core::int topLevelUnary = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:25:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+var topLevelUnary = -nullableInt;
+                    ^" in self::nullableInt.{core::int::unary-}();
+static field dynamic topLevelIndexGet = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:26:35: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGet = nullableMap[0];
+                                  ^" in self::nullableMap.{core::Map::[]}(0);
+static field core::int topLevelIndexSet = let final core::Map<dynamic, dynamic>? #t4 = self::nullableMap in let final core::int #t5 = 0 in let final core::int #t6 = 1 in let final void #t7 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:27:35: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexSet = nullableMap[0] = 1;
+                                  ^" in #t4.{core::Map::[]=}(#t5, #t6) in #t6;
+static field dynamic topLevelIndexGetSet = let final core::Map<dynamic, dynamic>? #t9 = self::nullableMap in let final core::int #t10 = 0 in let final dynamic #t11 = (let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:38: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGetSet = nullableMap[0] += 1;
+                                     ^" in #t9.{core::Map::[]}(#t10)).+(1) in let final void #t13 = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:38: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGetSet = nullableMap[0] += 1;
+                                     ^" in #t9.{core::Map::[]=}(#t10, #t11) in #t11;
+static field core::int topLevelPropertyGet = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:29:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGet = nullableClass.property;
+                                        ^^^^^^^^" in self::nullableClass.{self::Class::property};
+static field core::int topLevelPropertySet = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:30:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertySet = nullableClass.property = 1;
+                                        ^^^^^^^^" in self::nullableClass.{self::Class::property} = 1;
+static field core::int topLevelPropertyGetSet = let final self::Class? #t17 = self::nullableClass in let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:31:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGetSet = nullableClass.property += 1;
+                                           ^^^^^^^^" in #t17.{self::Class::property} = (let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:31:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGetSet = nullableClass.property += 1;
+                                           ^^^^^^^^" in #t17.{self::Class::property}).{core::num::+}(1);
+static field core::int topLevelMethodInvocation = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:32:46: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+var topLevelMethodInvocation = nullableClass.method();
+                                             ^^^^^^" in self::nullableClass.{self::Class::method}();
+static field () → core::int topLevelMethodTearOff = self::nullableClass.{self::Class::method};
+static field dynamic topLevelFunctionImplicitCall = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:34:52: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?.call instead.
+var topLevelFunctionImplicitCall = nullableFunction();
+                                                   ^" in self::nullableFunction.call();
+static field dynamic topLevelFunctionExplicitCall = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:35:53: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+var topLevelFunctionExplicitCall = nullableFunction.call();
+                                                    ^^^^" in self::nullableFunction.call();
+static field core::Function? topLevelFunctionTearOff = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:36:48: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try accessing using ?. instead.
+var topLevelFunctionTearOff = nullableFunction.call;
+                                               ^^^^" in self::nullableFunction.call;
+static field void topLevelFunctionTypeImplicitCall = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:60: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+                                                           ^" in self::nullableFunctionType.call();
+static field void topLevelFunctionTypeExplicitCall = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:61: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+                                                            ^^^^" in self::nullableFunctionType.call();
+static field () →? void topLevelFunctionTypeTearOff = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:39:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+Try accessing using ?. instead.
+var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+                                                       ^^^^" in self::nullableFunctionType.call;
+static field dynamic topLevelFunctionField = self::nullableClass.{self::Class::functionField}.call();
+static field void topLevelFunctionTypeField = self::nullableClass.{self::Class::functionTypeField}.call();
+static field dynamic topLevelFunctionGetter = self::nullableClass.{self::Class::functionGetter}.call();
+static field void topLevelFunctionTypeGetter = self::nullableClass.{self::Class::functionTypeGetter}.call();
+static get nullableFunction() → core::Function?
+  return () → core::Null? {};
+static get nullableFunctionType() → () →? void
+  return () → core::Null? {};
+static get nullableInt() → core::int?
+  return 0;
+static get nullableMap() → core::Map<dynamic, dynamic>?
+  return <dynamic, dynamic>{};
+static get nullableClass() → self::Class?
+  return new self::Class::•();
+static method test() → dynamic {
+  core::int? localBinary = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:46:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  var localBinary = nullableInt + 0;
+                                ^" in self::nullableInt.{core::num::+}(0);
+  core::int localUnary = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:47:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  var localUnary = -nullableInt;
+                   ^" in self::nullableInt.{core::int::unary-}();
+  dynamic localIndexGet = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:48:34: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGet = nullableMap[0];
+                                 ^" in self::nullableMap.{core::Map::[]}(0);
+  core::int localIndexSet = let final core::Map<dynamic, dynamic>? #t30 = self::nullableMap in let final core::int #t31 = 0 in let final core::int #t32 = 1 in let final void #t33 = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:49:34: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexSet = nullableMap[0] = 1;
+                                 ^" in #t30.{core::Map::[]=}(#t31, #t32) in #t32;
+  dynamic localIndexGetSet = let final core::Map<dynamic, dynamic>? #t35 = self::nullableMap in let final core::int #t36 = 0 in let final dynamic #t37 = (let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:37: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGetSet = nullableMap[0] += 1;
+                                    ^" in #t35.{core::Map::[]}(#t36)).+(1) in let final void #t39 = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:37: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGetSet = nullableMap[0] += 1;
+                                    ^" in #t35.{core::Map::[]=}(#t36, #t37) in #t37;
+  core::int localPropertyGet = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:51:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGet = nullableClass.property;
+                                       ^^^^^^^^" in self::nullableClass.{self::Class::property};
+  core::int localPropertySet = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertySet = nullableClass.property = 1;
+                                       ^^^^^^^^" in self::nullableClass.{self::Class::property} = 1;
+  core::int localPropertyGetSet = let final self::Class? #t43 = self::nullableClass in let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGetSet = nullableClass.property += 1;
+                                          ^^^^^^^^" in #t43.{self::Class::property} = (let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGetSet = nullableClass.property += 1;
+                                          ^^^^^^^^" in #t43.{self::Class::property}).{core::num::+}(1);
+  core::int localMethodInvocation = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:54:45: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+  var localMethodInvocation = nullableClass.method();
+                                            ^^^^^^" in self::nullableClass.{self::Class::method}();
+  () → core::int localMethodTearOff = self::nullableClass.{self::Class::method};
+  dynamic localFunctionImplicitCall = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:56:51: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?.call instead.
+  var localFunctionImplicitCall = nullableFunction();
+                                                  ^" in self::nullableFunction.call();
+  dynamic localFunctionExplicitCall = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:57:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+  var localFunctionExplicitCall = nullableFunction.call();
+                                                   ^^^^" in self::nullableFunction.call();
+  core::Function? localFunctionTearOff = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:58:47: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try accessing using ?. instead.
+  var localFunctionTearOff = nullableFunction.call;
+                                              ^^^^" in self::nullableFunction.call;
+  void localFunctionTypeImplicitCall = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:59:59: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  var localFunctionTypeImplicitCall = nullableFunctionType();
+                                                          ^" in self::nullableFunctionType.call();
+  void localFunctionTypeExplicitCall = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:60:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+  var localFunctionTypeExplicitCall = nullableFunctionType.call();
+                                                           ^^^^" in self::nullableFunctionType.call();
+  () →? void localFunctionTypeTearOff = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:61:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+Try accessing using ?. instead.
+  var localFunctionTypeTearOff = nullableFunctionType.call;
+                                                      ^^^^" in self::nullableFunctionType.call;
+  dynamic localFunctionField = self::nullableClass.{self::Class::functionField}.call();
+  void localFunctionTypeField = self::nullableClass.{self::Class::functionTypeField}.call();
+  dynamic localFunctionGetter = self::nullableClass.{self::Class::functionGetter}.call();
+  void localFunctionTypeGetter = self::nullableClass.{self::Class::functionTypeGetter}.call();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.transformed.expect
new file mode 100644
index 0000000..f0ea1d5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.transformed.expect
@@ -0,0 +1,356 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:20:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// var topLevelBinary = nullableInt + 0;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:21:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// var topLevelUnary = -nullableInt;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:22:35: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGet = nullableMap[0];
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:23:35: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexSet = nullableMap[0] = 1;
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:38: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGetSet = nullableMap[0] += 1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:38: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGetSet = nullableMap[0] += 1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:25:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertyGet = nullableClass.property;
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:26:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertySet = nullableClass.property = 1;
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:27:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertyGetSet = nullableClass.property += 1;
+//                                            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:46: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+// var topLevelMethodInvocation = nullableClass.method();
+//                                              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:29:43: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelMethodTearOff = nullableClass.method;
+//                                           ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:30:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+// var topLevelFunctionImplicitCall = nullableFunction();
+//                                                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:31:53: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+// var topLevelFunctionExplicitCall = nullableFunction.call();
+//                                                     ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:32:48: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try accessing using ?. instead.
+// var topLevelFunctionTearOff = nullableFunction.call;
+//                                                ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:33:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+// var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+//                                                            ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:34:61: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+// var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+//                                                             ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:35:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+// Try accessing using ?. instead.
+// var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+//                                                        ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+//   var localBinary = nullableInt + 0;
+//                                 ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:39:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+//   var localUnary = -nullableInt;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:40:34: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGet = nullableMap[0];
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:41:34: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexSet = nullableMap[0] = 1;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:42:37: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGetSet = nullableMap[0] += 1;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:42:37: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGetSet = nullableMap[0] += 1;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:43:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertyGet = nullableClass.property;
+//                                        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:44:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertySet = nullableClass.property = 1;
+//                                        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:45:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertyGetSet = nullableClass.property += 1;
+//                                           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:46:45: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+//   var localMethodInvocation = nullableClass.method();
+//                                             ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:47:42: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localMethodTearOff = nullableClass.method;
+//                                          ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:48:51: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+//   var localFunctionImplicitCall = nullableFunction();
+//                                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:49:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+//   var localFunctionExplicitCall = nullableFunction.call();
+//                                                    ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:47: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try accessing using ?. instead.
+//   var localFunctionTearOff = nullableFunction.call;
+//                                               ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:51:59: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+//   var localFunctionTypeImplicitCall = nullableFunctionType();
+//                                                           ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+//   var localFunctionTypeExplicitCall = nullableFunctionType.call();
+//                                                            ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+// Try accessing using ?. instead.
+//   var localFunctionTypeTearOff = nullableFunctionType.call;
+//                                                       ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int property = 0;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method method() → core::int
+    return 0;
+}
+static field core::num topLevelBinary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:20:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+var topLevelBinary = nullableInt + 0;
+                                 ^";
+static field core::int topLevelUnary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:21:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+var topLevelUnary = -nullableInt;
+                    ^";
+static field dynamic topLevelIndexGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:22:35: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGet = nullableMap[0];
+                                  ^";
+static field core::int topLevelIndexSet = let final core::Map<dynamic, dynamic>? #t1 = self::nullableMap in let final core::int #t2 = 0 in let final core::int #t3 = 1 in let final void #t4 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:23:35: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexSet = nullableMap[0] = 1;
+                                  ^" in #t3;
+static field dynamic topLevelIndexGetSet = let final core::Map<dynamic, dynamic>? #t5 = self::nullableMap in let final core::int #t6 = 0 in let final dynamic #t7 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:38: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGetSet = nullableMap[0] += 1;
+                                     ^".+(1) in let final void #t8 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:38: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGetSet = nullableMap[0] += 1;
+                                     ^" in #t7;
+static field core::int topLevelPropertyGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:25:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGet = nullableClass.property;
+                                        ^^^^^^^^";
+static field core::int topLevelPropertySet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:26:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertySet = nullableClass.property = 1;
+                                        ^^^^^^^^";
+static field core::int topLevelPropertyGetSet = let final self::Class? #t9 = self::nullableClass in invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:27:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGetSet = nullableClass.property += 1;
+                                           ^^^^^^^^";
+static field dynamic topLevelMethodInvocation = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:46: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+var topLevelMethodInvocation = nullableClass.method();
+                                             ^^^^^^";
+static field () → core::int topLevelMethodTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:29:43: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelMethodTearOff = nullableClass.method;
+                                          ^^^^^^";
+static field dynamic topLevelFunctionImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:30:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+var topLevelFunctionImplicitCall = nullableFunction();
+                                                   ^";
+static field dynamic topLevelFunctionExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:31:53: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+var topLevelFunctionExplicitCall = nullableFunction.call();
+                                                    ^^^^";
+static field core::Function? topLevelFunctionTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:32:48: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try accessing using ?. instead.
+var topLevelFunctionTearOff = nullableFunction.call;
+                                               ^^^^";
+static field dynamic topLevelFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:33:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+                                                           ^";
+static field dynamic topLevelFunctionTypeExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:34:61: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+                                                            ^^^^";
+static field () →? void topLevelFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:35:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+Try accessing using ?. instead.
+var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+                                                       ^^^^";
+static get nullableFunction() → core::Function?
+  return () → core::Null? {};
+static get nullableFunctionType() → () →? void
+  return () → core::Null? {};
+static get nullableInt() → core::int?
+  return 0;
+static get nullableMap() → core::Map<dynamic, dynamic>?
+  return <dynamic, dynamic>{};
+static get nullableClass() → self::Class?
+  return new self::Class::•();
+static method test() → dynamic {
+  core::num localBinary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  var localBinary = nullableInt + 0;
+                                ^";
+  core::int localUnary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:39:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  var localUnary = -nullableInt;
+                   ^";
+  dynamic localIndexGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:40:34: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGet = nullableMap[0];
+                                 ^";
+  core::int localIndexSet = let final core::Map<dynamic, dynamic>? #t10 = self::nullableMap in let final core::int #t11 = 0 in let final core::int #t12 = 1 in let final void #t13 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:41:34: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexSet = nullableMap[0] = 1;
+                                 ^" in #t12;
+  dynamic localIndexGetSet = let final core::Map<dynamic, dynamic>? #t14 = self::nullableMap in let final core::int #t15 = 0 in let final dynamic #t16 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:42:37: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGetSet = nullableMap[0] += 1;
+                                    ^".+(1) in let final void #t17 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:42:37: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGetSet = nullableMap[0] += 1;
+                                    ^" in #t16;
+  core::int localPropertyGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:43:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGet = nullableClass.property;
+                                       ^^^^^^^^";
+  core::int localPropertySet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:44:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertySet = nullableClass.property = 1;
+                                       ^^^^^^^^";
+  core::int localPropertyGetSet = let final self::Class? #t18 = self::nullableClass in invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:45:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGetSet = nullableClass.property += 1;
+                                          ^^^^^^^^";
+  dynamic localMethodInvocation = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:46:45: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+  var localMethodInvocation = nullableClass.method();
+                                            ^^^^^^";
+  () → core::int localMethodTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:47:42: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localMethodTearOff = nullableClass.method;
+                                         ^^^^^^";
+  dynamic localFunctionImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:48:51: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+  var localFunctionImplicitCall = nullableFunction();
+                                                  ^";
+  dynamic localFunctionExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:49:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+  var localFunctionExplicitCall = nullableFunction.call();
+                                                   ^^^^";
+  core::Function? localFunctionTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:47: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try accessing using ?. instead.
+  var localFunctionTearOff = nullableFunction.call;
+                                              ^^^^";
+  dynamic localFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:51:59: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+  var localFunctionTypeImplicitCall = nullableFunctionType();
+                                                          ^";
+  dynamic localFunctionTypeExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+  var localFunctionTypeExplicitCall = nullableFunctionType.call();
+                                                           ^^^^";
+  () →? void localFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+Try accessing using ?. instead.
+  var localFunctionTypeTearOff = nullableFunctionType.call;
+                                                      ^^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
new file mode 100644
index 0000000..eeb102b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
@@ -0,0 +1,358 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// var topLevelBinary = nullableInt + 0;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:25:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// var topLevelUnary = -nullableInt;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:26:35: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGet = nullableMap[0];
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:27:35: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexSet = nullableMap[0] = 1;
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:38: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGetSet = nullableMap[0] += 1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:38: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGetSet = nullableMap[0] += 1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:29:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertyGet = nullableClass.property;
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:30:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertySet = nullableClass.property = 1;
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:31:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertyGetSet = nullableClass.property += 1;
+//                                            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:32:46: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+// var topLevelMethodInvocation = nullableClass.method();
+//                                              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:34:52: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?.call instead.
+// var topLevelFunctionImplicitCall = nullableFunction();
+//                                                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:35:53: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+// var topLevelFunctionExplicitCall = nullableFunction.call();
+//                                                     ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:36:48: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try accessing using ?. instead.
+// var topLevelFunctionTearOff = nullableFunction.call;
+//                                                ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:60: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+//                                                            ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:61: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+// var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+//                                                             ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:39:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+// Try accessing using ?. instead.
+// var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+//                                                        ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:46:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+//   var localBinary = nullableInt + 0;
+//                                 ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:47:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+//   var localUnary = -nullableInt;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:48:34: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGet = nullableMap[0];
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:49:34: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexSet = nullableMap[0] = 1;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:37: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGetSet = nullableMap[0] += 1;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:37: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGetSet = nullableMap[0] += 1;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:51:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertyGet = nullableClass.property;
+//                                        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertySet = nullableClass.property = 1;
+//                                        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertyGetSet = nullableClass.property += 1;
+//                                           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:54:45: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+//   var localMethodInvocation = nullableClass.method();
+//                                             ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:56:51: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?.call instead.
+//   var localFunctionImplicitCall = nullableFunction();
+//                                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:57:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+//   var localFunctionExplicitCall = nullableFunction.call();
+//                                                    ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:58:47: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try accessing using ?. instead.
+//   var localFunctionTearOff = nullableFunction.call;
+//                                               ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:59:59: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+//   var localFunctionTypeImplicitCall = nullableFunctionType();
+//                                                           ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:60:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+//   var localFunctionTypeExplicitCall = nullableFunctionType.call();
+//                                                            ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:61:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+// Try accessing using ?. instead.
+//   var localFunctionTypeTearOff = nullableFunctionType.call;
+//                                                       ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int property = 0;
+  field core::Function functionField = () → core::Null? {};
+  field () → void functionTypeField = () → core::Null? {};
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method method() → core::int
+    return 0;
+  get functionGetter() → core::Function
+    return () → core::Null? {};
+  get functionTypeGetter() → () → void
+    return () → core::Null? {};
+}
+static field core::int? topLevelBinary = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+var topLevelBinary = nullableInt + 0;
+                                 ^" in self::nullableInt.{core::num::+}(0);
+static field core::int topLevelUnary = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:25:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+var topLevelUnary = -nullableInt;
+                    ^" in self::nullableInt.{core::int::unary-}();
+static field dynamic topLevelIndexGet = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:26:35: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGet = nullableMap[0];
+                                  ^" in self::nullableMap.{core::Map::[]}(0);
+static field core::int topLevelIndexSet = let final core::Map<dynamic, dynamic>? #t4 = self::nullableMap in let final core::int #t5 = 0 in let final core::int #t6 = 1 in let final void #t7 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:27:35: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexSet = nullableMap[0] = 1;
+                                  ^" in #t4.{core::Map::[]=}(#t5, #t6) in #t6;
+static field dynamic topLevelIndexGetSet = let final core::Map<dynamic, dynamic>? #t9 = self::nullableMap in let final core::int #t10 = 0 in let final dynamic #t11 = (let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:38: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGetSet = nullableMap[0] += 1;
+                                     ^" in #t9.{core::Map::[]}(#t10)).+(1) in let final void #t13 = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:38: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGetSet = nullableMap[0] += 1;
+                                     ^" in #t9.{core::Map::[]=}(#t10, #t11) in #t11;
+static field core::int topLevelPropertyGet = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:29:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGet = nullableClass.property;
+                                        ^^^^^^^^" in self::nullableClass.{self::Class::property};
+static field core::int topLevelPropertySet = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:30:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertySet = nullableClass.property = 1;
+                                        ^^^^^^^^" in self::nullableClass.{self::Class::property} = 1;
+static field core::int topLevelPropertyGetSet = let final self::Class? #t17 = self::nullableClass in let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:31:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGetSet = nullableClass.property += 1;
+                                           ^^^^^^^^" in #t17.{self::Class::property} = (let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:31:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGetSet = nullableClass.property += 1;
+                                           ^^^^^^^^" in #t17.{self::Class::property}).{core::num::+}(1);
+static field core::int topLevelMethodInvocation = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:32:46: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+var topLevelMethodInvocation = nullableClass.method();
+                                             ^^^^^^" in self::nullableClass.{self::Class::method}();
+static field () → core::int topLevelMethodTearOff = self::nullableClass.{self::Class::method};
+static field dynamic topLevelFunctionImplicitCall = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:34:52: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?.call instead.
+var topLevelFunctionImplicitCall = nullableFunction();
+                                                   ^" in self::nullableFunction.call();
+static field dynamic topLevelFunctionExplicitCall = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:35:53: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+var topLevelFunctionExplicitCall = nullableFunction.call();
+                                                    ^^^^" in self::nullableFunction.call();
+static field core::Function? topLevelFunctionTearOff = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:36:48: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try accessing using ?. instead.
+var topLevelFunctionTearOff = nullableFunction.call;
+                                               ^^^^" in self::nullableFunction.call;
+static field void topLevelFunctionTypeImplicitCall = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:60: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+                                                           ^" in self::nullableFunctionType.call();
+static field void topLevelFunctionTypeExplicitCall = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:61: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+                                                            ^^^^" in self::nullableFunctionType.call();
+static field () →? void topLevelFunctionTypeTearOff = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:39:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+Try accessing using ?. instead.
+var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+                                                       ^^^^" in self::nullableFunctionType.call;
+static field dynamic topLevelFunctionField = self::nullableClass.{self::Class::functionField}.call();
+static field void topLevelFunctionTypeField = self::nullableClass.{self::Class::functionTypeField}.call();
+static field dynamic topLevelFunctionGetter = self::nullableClass.{self::Class::functionGetter}.call();
+static field void topLevelFunctionTypeGetter = self::nullableClass.{self::Class::functionTypeGetter}.call();
+static get nullableFunction() → core::Function?
+  return () → core::Null? {};
+static get nullableFunctionType() → () →? void
+  return () → core::Null? {};
+static get nullableInt() → core::int?
+  return 0;
+static get nullableMap() → core::Map<dynamic, dynamic>?
+  return <dynamic, dynamic>{};
+static get nullableClass() → self::Class?
+  return new self::Class::•();
+static method test() → dynamic {
+  core::int? localBinary = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:46:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  var localBinary = nullableInt + 0;
+                                ^" in self::nullableInt.{core::num::+}(0);
+  core::int localUnary = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:47:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  var localUnary = -nullableInt;
+                   ^" in self::nullableInt.{core::int::unary-}();
+  dynamic localIndexGet = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:48:34: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGet = nullableMap[0];
+                                 ^" in self::nullableMap.{core::Map::[]}(0);
+  core::int localIndexSet = let final core::Map<dynamic, dynamic>? #t30 = self::nullableMap in let final core::int #t31 = 0 in let final core::int #t32 = 1 in let final void #t33 = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:49:34: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexSet = nullableMap[0] = 1;
+                                 ^" in #t30.{core::Map::[]=}(#t31, #t32) in #t32;
+  dynamic localIndexGetSet = let final core::Map<dynamic, dynamic>? #t35 = self::nullableMap in let final core::int #t36 = 0 in let final dynamic #t37 = (let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:37: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGetSet = nullableMap[0] += 1;
+                                    ^" in #t35.{core::Map::[]}(#t36)).+(1) in let final void #t39 = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:37: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGetSet = nullableMap[0] += 1;
+                                    ^" in #t35.{core::Map::[]=}(#t36, #t37) in #t37;
+  core::int localPropertyGet = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:51:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGet = nullableClass.property;
+                                       ^^^^^^^^" in self::nullableClass.{self::Class::property};
+  core::int localPropertySet = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertySet = nullableClass.property = 1;
+                                       ^^^^^^^^" in self::nullableClass.{self::Class::property} = 1;
+  core::int localPropertyGetSet = let final self::Class? #t43 = self::nullableClass in let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGetSet = nullableClass.property += 1;
+                                          ^^^^^^^^" in #t43.{self::Class::property} = (let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGetSet = nullableClass.property += 1;
+                                          ^^^^^^^^" in #t43.{self::Class::property}).{core::num::+}(1);
+  core::int localMethodInvocation = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:54:45: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+  var localMethodInvocation = nullableClass.method();
+                                            ^^^^^^" in self::nullableClass.{self::Class::method}();
+  () → core::int localMethodTearOff = self::nullableClass.{self::Class::method};
+  dynamic localFunctionImplicitCall = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:56:51: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?.call instead.
+  var localFunctionImplicitCall = nullableFunction();
+                                                  ^" in self::nullableFunction.call();
+  dynamic localFunctionExplicitCall = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:57:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+  var localFunctionExplicitCall = nullableFunction.call();
+                                                   ^^^^" in self::nullableFunction.call();
+  core::Function? localFunctionTearOff = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:58:47: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try accessing using ?. instead.
+  var localFunctionTearOff = nullableFunction.call;
+                                              ^^^^" in self::nullableFunction.call;
+  void localFunctionTypeImplicitCall = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:59:59: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  var localFunctionTypeImplicitCall = nullableFunctionType();
+                                                          ^" in self::nullableFunctionType.call();
+  void localFunctionTypeExplicitCall = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:60:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+  var localFunctionTypeExplicitCall = nullableFunctionType.call();
+                                                           ^^^^" in self::nullableFunctionType.call();
+  () →? void localFunctionTypeTearOff = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:61:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+Try accessing using ?. instead.
+  var localFunctionTypeTearOff = nullableFunctionType.call;
+                                                      ^^^^" in self::nullableFunctionType.call;
+  dynamic localFunctionField = self::nullableClass.{self::Class::functionField}.call();
+  void localFunctionTypeField = self::nullableClass.{self::Class::functionTypeField}.call();
+  dynamic localFunctionGetter = self::nullableClass.{self::Class::functionGetter}.call();
+  void localFunctionTypeGetter = self::nullableClass.{self::Class::functionTypeGetter}.call();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.transformed.expect
new file mode 100644
index 0000000..f0ea1d5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.transformed.expect
@@ -0,0 +1,356 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:20:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// var topLevelBinary = nullableInt + 0;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:21:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// var topLevelUnary = -nullableInt;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:22:35: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGet = nullableMap[0];
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:23:35: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexSet = nullableMap[0] = 1;
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:38: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGetSet = nullableMap[0] += 1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:38: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGetSet = nullableMap[0] += 1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:25:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertyGet = nullableClass.property;
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:26:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertySet = nullableClass.property = 1;
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:27:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertyGetSet = nullableClass.property += 1;
+//                                            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:46: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+// var topLevelMethodInvocation = nullableClass.method();
+//                                              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:29:43: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelMethodTearOff = nullableClass.method;
+//                                           ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:30:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+// var topLevelFunctionImplicitCall = nullableFunction();
+//                                                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:31:53: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+// var topLevelFunctionExplicitCall = nullableFunction.call();
+//                                                     ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:32:48: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try accessing using ?. instead.
+// var topLevelFunctionTearOff = nullableFunction.call;
+//                                                ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:33:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+// var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+//                                                            ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:34:61: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+// var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+//                                                             ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:35:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+// Try accessing using ?. instead.
+// var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+//                                                        ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+//   var localBinary = nullableInt + 0;
+//                                 ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:39:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+//   var localUnary = -nullableInt;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:40:34: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGet = nullableMap[0];
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:41:34: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexSet = nullableMap[0] = 1;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:42:37: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGetSet = nullableMap[0] += 1;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:42:37: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGetSet = nullableMap[0] += 1;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:43:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertyGet = nullableClass.property;
+//                                        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:44:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertySet = nullableClass.property = 1;
+//                                        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:45:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertyGetSet = nullableClass.property += 1;
+//                                           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:46:45: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+//   var localMethodInvocation = nullableClass.method();
+//                                             ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:47:42: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localMethodTearOff = nullableClass.method;
+//                                          ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:48:51: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+//   var localFunctionImplicitCall = nullableFunction();
+//                                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:49:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+//   var localFunctionExplicitCall = nullableFunction.call();
+//                                                    ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:47: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try accessing using ?. instead.
+//   var localFunctionTearOff = nullableFunction.call;
+//                                               ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:51:59: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+//   var localFunctionTypeImplicitCall = nullableFunctionType();
+//                                                           ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+//   var localFunctionTypeExplicitCall = nullableFunctionType.call();
+//                                                            ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+// Try accessing using ?. instead.
+//   var localFunctionTypeTearOff = nullableFunctionType.call;
+//                                                       ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int property = 0;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method method() → core::int
+    return 0;
+}
+static field core::num topLevelBinary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:20:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+var topLevelBinary = nullableInt + 0;
+                                 ^";
+static field core::int topLevelUnary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:21:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+var topLevelUnary = -nullableInt;
+                    ^";
+static field dynamic topLevelIndexGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:22:35: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGet = nullableMap[0];
+                                  ^";
+static field core::int topLevelIndexSet = let final core::Map<dynamic, dynamic>? #t1 = self::nullableMap in let final core::int #t2 = 0 in let final core::int #t3 = 1 in let final void #t4 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:23:35: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexSet = nullableMap[0] = 1;
+                                  ^" in #t3;
+static field dynamic topLevelIndexGetSet = let final core::Map<dynamic, dynamic>? #t5 = self::nullableMap in let final core::int #t6 = 0 in let final dynamic #t7 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:38: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGetSet = nullableMap[0] += 1;
+                                     ^".+(1) in let final void #t8 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:24:38: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGetSet = nullableMap[0] += 1;
+                                     ^" in #t7;
+static field core::int topLevelPropertyGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:25:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGet = nullableClass.property;
+                                        ^^^^^^^^";
+static field core::int topLevelPropertySet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:26:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertySet = nullableClass.property = 1;
+                                        ^^^^^^^^";
+static field core::int topLevelPropertyGetSet = let final self::Class? #t9 = self::nullableClass in invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:27:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGetSet = nullableClass.property += 1;
+                                           ^^^^^^^^";
+static field dynamic topLevelMethodInvocation = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:28:46: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+var topLevelMethodInvocation = nullableClass.method();
+                                             ^^^^^^";
+static field () → core::int topLevelMethodTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:29:43: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelMethodTearOff = nullableClass.method;
+                                          ^^^^^^";
+static field dynamic topLevelFunctionImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:30:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+var topLevelFunctionImplicitCall = nullableFunction();
+                                                   ^";
+static field dynamic topLevelFunctionExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:31:53: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+var topLevelFunctionExplicitCall = nullableFunction.call();
+                                                    ^^^^";
+static field core::Function? topLevelFunctionTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:32:48: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try accessing using ?. instead.
+var topLevelFunctionTearOff = nullableFunction.call;
+                                               ^^^^";
+static field dynamic topLevelFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:33:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+                                                           ^";
+static field dynamic topLevelFunctionTypeExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:34:61: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+                                                            ^^^^";
+static field () →? void topLevelFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:35:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+Try accessing using ?. instead.
+var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+                                                       ^^^^";
+static get nullableFunction() → core::Function?
+  return () → core::Null? {};
+static get nullableFunctionType() → () →? void
+  return () → core::Null? {};
+static get nullableInt() → core::int?
+  return 0;
+static get nullableMap() → core::Map<dynamic, dynamic>?
+  return <dynamic, dynamic>{};
+static get nullableClass() → self::Class?
+  return new self::Class::•();
+static method test() → dynamic {
+  core::num localBinary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  var localBinary = nullableInt + 0;
+                                ^";
+  core::int localUnary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:39:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  var localUnary = -nullableInt;
+                   ^";
+  dynamic localIndexGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:40:34: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGet = nullableMap[0];
+                                 ^";
+  core::int localIndexSet = let final core::Map<dynamic, dynamic>? #t10 = self::nullableMap in let final core::int #t11 = 0 in let final core::int #t12 = 1 in let final void #t13 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:41:34: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexSet = nullableMap[0] = 1;
+                                 ^" in #t12;
+  dynamic localIndexGetSet = let final core::Map<dynamic, dynamic>? #t14 = self::nullableMap in let final core::int #t15 = 0 in let final dynamic #t16 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:42:37: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGetSet = nullableMap[0] += 1;
+                                    ^".+(1) in let final void #t17 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:42:37: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGetSet = nullableMap[0] += 1;
+                                    ^" in #t16;
+  core::int localPropertyGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:43:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGet = nullableClass.property;
+                                       ^^^^^^^^";
+  core::int localPropertySet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:44:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertySet = nullableClass.property = 1;
+                                       ^^^^^^^^";
+  core::int localPropertyGetSet = let final self::Class? #t18 = self::nullableClass in invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:45:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGetSet = nullableClass.property += 1;
+                                          ^^^^^^^^";
+  dynamic localMethodInvocation = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:46:45: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+  var localMethodInvocation = nullableClass.method();
+                                            ^^^^^^";
+  () → core::int localMethodTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:47:42: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localMethodTearOff = nullableClass.method;
+                                         ^^^^^^";
+  dynamic localFunctionImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:48:51: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+  var localFunctionImplicitCall = nullableFunction();
+                                                  ^";
+  dynamic localFunctionExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:49:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+  var localFunctionExplicitCall = nullableFunction.call();
+                                                   ^^^^";
+  core::Function? localFunctionTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:47: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try accessing using ?. instead.
+  var localFunctionTearOff = nullableFunction.call;
+                                              ^^^^";
+  dynamic localFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:51:59: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+  var localFunctionTypeImplicitCall = nullableFunctionType();
+                                                          ^";
+  dynamic localFunctionTypeExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+  var localFunctionTypeExplicitCall = nullableFunctionType.call();
+                                                           ^^^^";
+  () →? void localFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+Try accessing using ?. instead.
+  var localFunctionTypeTearOff = nullableFunctionType.call;
+                                                      ^^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 486fea6..bd6eb1d 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -12,6 +12,84 @@
 extensions/invalid_explicit_access: RuntimeError
 extensions/issue40713: TypeCheckError
 extensions/static_access_of_instance: RuntimeError
+general/abstract_members: TypeCheckError
+general/accessors: RuntimeError
+general/ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
+general/await_in_non_async: RuntimeError # Expected.
+general/bug21938: TypeCheckError
+general/bug30695: TypeCheckError
+general/bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
+general/call: TypeCheckError
+general/candidate_found: TypeCheckError
+general/cascade: RuntimeError
+general/constructor_initializer_invalid: RuntimeError # Fails execution after recovery
+general/covariant_generic: RuntimeError
+general/duplicated_declarations: TypeCheckError
+general/duplicated_field_initializer: RuntimeError
+general/error_locations/error_location_01: RuntimeError
+general/error_locations/error_location_02: RuntimeError
+general/error_locations/error_location_03: RuntimeError
+general/error_locations/error_location_05: RuntimeError
+general/error_locations/error_location_06: RuntimeError
+general/error_recovery/await_not_in_async: RuntimeError
+general/error_recovery/constructor_recovery_bad_name_general.crash: RuntimeError
+general/error_recovery/constructor_recovery_bad_name_get.crash: RuntimeError
+general/error_recovery/constructor_recovery_bad_name_return_type.crash: RuntimeError
+general/error_recovery/constructor_recovery_bad_name_set.crash: RuntimeError
+general/error_recovery/constructor_recovery_get: RuntimeError
+general/error_recovery/constructor_recovery_ok: RuntimeError
+general/error_recovery/constructor_recovery_operator.crash: RuntimeError
+general/error_recovery/constructor_recovery_return_type: RuntimeError
+general/error_recovery/constructor_recovery_set: RuntimeError
+general/error_recovery/empty_await_for: RuntimeError
+general/error_recovery/empty_for: RuntimeError
+general/error_recovery/issue_38415.crash: RuntimeError
+general/error_recovery/issue_39024.crash: RuntimeError
+general/error_recovery/issue_39026.crash: RuntimeError
+general/error_recovery/issue_39026_prime.crash: RuntimeError
+general/error_recovery/issue_39033.crash: RuntimeError
+general/error_recovery/issue_39058.crash: RuntimeError
+general/error_recovery/issue_39058_prime.crash: RuntimeError
+general/error_recovery/issue_39202.crash: RuntimeError
+general/error_recovery/issue_39230.crash: RuntimeError
+general/error_recovery/issue_39958_01: RuntimeError
+general/error_recovery/issue_39958_02: RuntimeError
+general/error_recovery/issue_39958_03: RuntimeError
+general/error_recovery/issue_39958_04: RuntimeError
+general/error_recovery/yield_not_in_generator: RuntimeError
+general/expressions: RuntimeError
+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_operator: TypeCheckError
+general/invocations: RuntimeError
+general/issue37776: RuntimeError
+general/issue38938: RuntimeError # no main and compile time errors.
+general/issue38944: RuntimeError # no main and compile time errors.
+general/issue38961: RuntimeError # no main and compile time errors.
+general/issue41210a: TypeCheckError
+general/issue41210b/issue41210: TypeCheckError
+general/micro: RuntimeError
+general/mixin_application_override: ExpectationFileMismatch # Too many errors.
+general/mixin_application_override: TypeCheckError
+general/mixin_constructors_with_default_values: RuntimeError # Expected
+general/operator_method_not_found: RuntimeError # Expected
+general/optional: TypeCheckError
+general/override_check_accessor_after_inference: TypeCheckError # Issue #31620
+general/override_check_accessor_basic: TypeCheckError # Issue #31620
+general/override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
+general/override_check_after_inference: TypeCheckError # Issue #31620
+general/override_check_basic: TypeCheckError # Issue #31620
+general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
+general/override_setter_with_field: TypeCheckError
+general/reject_generic_function_types_in_bounds: RuntimeError # Expected
+general/spread_collection: RuntimeError
+general/statements: Crash
+general/type_parameter_type_named_int: RuntimeError # Expected
+general/type_variable_as_super: RuntimeError
+general/type_variable_bound_access: TypeCheckError
+general/unsound_promotion: TypeCheckError
+general/void_methods: RuntimeError
 general_nnbd_opt_out/abstract_members: TypeCheckError
 general_nnbd_opt_out/accessors: RuntimeError
 general_nnbd_opt_out/ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
@@ -60,95 +138,12 @@
 general_nnbd_opt_out/type_variable_bound_access: TypeCheckError
 general_nnbd_opt_out/unsound_promotion: TypeCheckError
 general_nnbd_opt_out/void_methods: RuntimeError
-general/abstract_members: TypeCheckError
-general/accessors: RuntimeError
-general/ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
-general/await_in_non_async: RuntimeError # Expected.
-general/bug21938: TypeCheckError
-general/bug30695: TypeCheckError
-general/bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
-general/call: TypeCheckError
-general/candidate_found: TypeCheckError
-general/cascade: RuntimeError
-general/constructor_initializer_invalid: RuntimeError # Fails execution after recovery
-general/covariant_generic: RuntimeError
-general/duplicated_declarations: TypeCheckError
-general/duplicated_field_initializer: RuntimeError
-general/error_locations/error_location_01: RuntimeError
-general/error_locations/error_location_02: RuntimeError
-general/error_locations/error_location_03: RuntimeError
-general/error_locations/error_location_05: RuntimeError
-general/error_locations/error_location_06: RuntimeError
-general/error_recovery/await_not_in_async: RuntimeError
-general/error_recovery/constructor_recovery_bad_name_general.crash: RuntimeError
-general/error_recovery/constructor_recovery_bad_name_get.crash: RuntimeError
-general/error_recovery/constructor_recovery_bad_name_return_type.crash: RuntimeError
-general/error_recovery/constructor_recovery_bad_name_set.crash: RuntimeError
-general/error_recovery/constructor_recovery_get: RuntimeError
-general/error_recovery/constructor_recovery_ok: RuntimeError
-general/error_recovery/constructor_recovery_operator.crash: RuntimeError
-general/error_recovery/constructor_recovery_return_type: RuntimeError
-general/error_recovery/constructor_recovery_set: RuntimeError
-general/error_recovery/empty_await_for: RuntimeError
-general/error_recovery/empty_for: RuntimeError
-general/error_recovery/issue_38415.crash: RuntimeError
-general/error_recovery/issue_39024.crash: RuntimeError
-general/error_recovery/issue_39026_prime.crash: RuntimeError
-general/error_recovery/issue_39026.crash: RuntimeError
-general/error_recovery/issue_39033.crash: RuntimeError
-general/error_recovery/issue_39058_prime.crash: RuntimeError
-general/error_recovery/issue_39058.crash: RuntimeError
-general/error_recovery/issue_39202.crash: RuntimeError
-general/error_recovery/issue_39230.crash: RuntimeError
-general/error_recovery/issue_39958_01: RuntimeError
-general/error_recovery/issue_39958_02: RuntimeError
-general/error_recovery/issue_39958_03: RuntimeError
-general/error_recovery/issue_39958_04: RuntimeError
-general/error_recovery/yield_not_in_generator: RuntimeError
-general/expressions: RuntimeError
-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_operator: TypeCheckError
-general/invocations: RuntimeError
-general/issue37776: RuntimeError
-general/issue38938: RuntimeError # no main and compile time errors.
-general/issue38944: RuntimeError # no main and compile time errors.
-general/issue38961: RuntimeError # no main and compile time errors.
-general/issue41210a: TypeCheckError
-general/issue41210b/issue41210: TypeCheckError
-general/micro: RuntimeError
-general/mixin_application_override: ExpectationFileMismatch # Too many errors.
-general/mixin_application_override: TypeCheckError
-general/mixin_constructors_with_default_values: RuntimeError # Expected
-general/operator_method_not_found: RuntimeError # Expected
-general/optional: TypeCheckError
-general/override_check_accessor_after_inference: TypeCheckError # Issue #31620
-general/override_check_accessor_basic: TypeCheckError # Issue #31620
-general/override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
-general/override_check_after_inference: TypeCheckError # Issue #31620
-general/override_check_basic: TypeCheckError # Issue #31620
-general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
-general/override_setter_with_field: TypeCheckError
-general/reject_generic_function_types_in_bounds: RuntimeError # Expected
-general/spread_collection: RuntimeError
-general/statements: Crash
-general/type_parameter_type_named_int: RuntimeError # Expected
-general/type_variable_as_super: RuntimeError
-general/type_variable_bound_access: TypeCheckError
-general/unsound_promotion: TypeCheckError
-general/void_methods: RuntimeError
-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
-inference_new/infer_assign_to_property_custom: TypeCheckError
-inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
 inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
 inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer: TypeCheckError
 inference/downwards_inference_for_each: RuntimeError # Issue #36382
 inference/downwards_inference_on_list_literals_infer_downwards: RuntimeError
-inference/future_then_upwards_2: RuntimeError
 inference/future_then_upwards: RuntimeError
+inference/future_then_upwards_2: RuntimeError
 inference/generic_methods_correctly_recognize_generic_upper_bound: TypeCheckError
 inference/generic_methods_do_not_infer_invalid_override_of_generic_method: TypeCheckError
 inference/generic_methods_handle_override_of_non_generic_with_generic: TypeCheckError
@@ -163,6 +158,11 @@
 inference/mixin_inference_unification_1: TypeCheckError
 inference/mixin_inference_unification_2: TypeCheckError
 inference/override_equals: RuntimeError
+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
+inference_new/infer_assign_to_property_custom: TypeCheckError
+inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
 instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # Expected
 instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
 nnbd/inheritance_from_opt_in: TypeCheckError
@@ -170,6 +170,7 @@
 nnbd/messages_with_types_opt_in: TypeCheckError
 nnbd/messages_with_types_opt_out: TypeCheckError
 nnbd/never_opt_out: TypeCheckError
+nnbd/potentially_nullable_access: TypeCheckError
 rasta/abstract_constructor: RuntimeError
 rasta/bad_constructor_redirection: RuntimeError
 rasta/bad_continue: RuntimeError
@@ -205,16 +206,16 @@
 rasta/native_is_illegal: RuntimeError
 rasta/parser_error: RuntimeError
 rasta/static: RuntimeError
+rasta/super: TypeCheckError
 rasta/super_initializer: RuntimeError
 rasta/super_mixin: TypeCheckError
 rasta/super_operator: TypeCheckError
-rasta/super: TypeCheckError
 rasta/type_literals: RuntimeError
 rasta/typedef: RuntimeError
+rasta/unresolved: RuntimeError
 rasta/unresolved_constructor: RuntimeError
 rasta/unresolved_for_in: RuntimeError
 rasta/unresolved_recovery: TypeCheckError
-rasta/unresolved: RuntimeError
 regress/issue_29976: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_29982: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_30836: RuntimeError # Issue 30836.
@@ -229,8 +230,8 @@
 regress/issue_35260: RuntimeError # Expected
 regress/issue_35266: RuntimeError # Expected
 regress/issue_36400: RuntimeError
-regress/issue_36647_2: RuntimeError # Expected
 regress/issue_36647: RuntimeError # Expected
+regress/issue_36647_2: RuntimeError # Expected
 regress/issue_36669: RuntimeError
 regress/issue_37285: RuntimeError
 regress/issue_39035.crash: RuntimeError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index bf8a83c..ec59b90 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -6,139 +6,29 @@
 # the round trip for Kernel textual serialization where the initial binary
 # Kernel files are produced by compiling Dart code via Fasta.
 
-expression/eval: TextSerializationFailure # Was: Pass
-expression/main: TextSerializationFailure # Was: Pass
-extensions/ambiguous: TextSerializationFailure
-extensions/annotations: TextSerializationFailure
 extensions/call_methods: TypeCheckError
-extensions/check_bounds: TextSerializationFailure
-extensions/compounds: TextSerializationFailure
-extensions/conflict_with_object: TextSerializationFailure
-extensions/conflicts: TextSerializationFailure
-extensions/default_values: TextSerializationFailure
-extensions/deferred_explicit_access: TextSerializationFailure
-extensions/deferred_import_hidden: TextSerializationFailure
-extensions/direct_instance_access: TextSerializationFailure
-extensions/direct_static_access: TextSerializationFailure
-extensions/dynamic_invoke: TextSerializationFailure
-extensions/explicit_extension_access: TextSerializationFailure
-extensions/explicit_extension_inference: TextSerializationFailure
-extensions/explicit_generic_extension_access: TextSerializationFailure
-extensions/explicit_this: TextSerializationFailure
-extensions/export_twice: TextSerializationFailure
-extensions/extension_call: TextSerializationFailure
-extensions/extension_constructor: TextSerializationFailure
-extensions/extension_field_with_type_parameter_usage: TextSerializationFailure
-extensions/extension_methods: TextSerializationFailure
-extensions/extension_setter: TextSerializationFailure
 extensions/extension_setter_error: TypeCheckError
-extensions/generic_function_in_generic_extension: TextSerializationFailure
-extensions/getter_setter_conflict: TextSerializationFailure
-extensions/if_null: TextSerializationFailure
-extensions/implicit_extension_inference: TextSerializationFailure
-extensions/implicit_this: TextSerializationFailure
-extensions/import_via_prefix: TextSerializationFailure
-extensions/index: TextSerializationFailure
-extensions/instance_access: TextSerializationFailure
-extensions/instance_access_of_static: TextSerializationFailure
-extensions/instance_members: TextSerializationFailure
-extensions/instance_tearoff: TextSerializationFailure
-extensions/internal_resolution: TextSerializationFailure
-extensions/invalid_explicit_access: TextSerializationFailure
-extensions/issue38600: TextSerializationFailure
-extensions/issue38745: TextSerializationFailure
-extensions/issue38750: TextSerializationFailure
-extensions/issue38755: TextSerializationFailure
-extensions/issue38915: TextSerializationFailure
-extensions/issue39527: TextSerializationFailure
-extensions/issue39889: TextSerializationFailure
-extensions/issue39938/issue39938: TextSerializationFailure
-extensions/issue40596: TextSerializationFailure
+extensions/instance_access_of_static: RuntimeError
+extensions/invalid_explicit_access: RuntimeError
 extensions/issue40713: TypeCheckError
-extensions/issue40816: TextSerializationFailure
-extensions/missing_toplevel: TextSerializationFailure
-extensions/nested_on_types: TextSerializationFailure
-extensions/null_aware: TextSerializationFailure
-extensions/on_function_type: TextSerializationFailure
-extensions/on_type_inference: TextSerializationFailure
-extensions/on_type_variable_inference: TextSerializationFailure
-extensions/operators: TextSerializationFailure
-extensions/other_kinds: TextSerializationFailure
-extensions/private_members: TextSerializationFailure
-extensions/static_access: TextSerializationFailure
-extensions/static_access_of_instance: TextSerializationFailure
-extensions/tear_offs: TextSerializationFailure
-extensions/type_variables: TextSerializationFailure
-extensions/unnamed_extensions: TextSerializationFailure
-extensions/use_this: TextSerializationFailure
-general/DeltaBlue: TextSerializationFailure # Was: Pass
+extensions/static_access_of_instance: RuntimeError
 general/abstract_members: TypeCheckError
-general/accessors: TextSerializationFailure # Was: RuntimeError
-general/all_variances: TextSerializationFailure
+general/accessors: RuntimeError
 general/ambiguous_exports: RuntimeError
-general/annotation_on_enum_values: TextSerializationFailure # Was: Pass
-general/argument: TextSerializationFailure # Was: Pass
-general/arithmetic: TextSerializationFailure # Was: Pass
-general/arrow_function: TextSerializationFailure # Was: Pass
-general/assign_to_initializing_formal: TextSerializationFailure
-general/async_nested: TextSerializationFailure # Was: Pass
-general/await_complex: TextSerializationFailure
-general/await_in_cascade: TextSerializationFailure
 general/await_in_non_async: RuntimeError
-general/await_in_non_async: TextSerializationFailure
-general/bad_setter_abstract: TextSerializationFailure # Was: Pass
-general/bad_store: TextSerializationFailure # Was: Pass
-general/bad_type_variable_uses_in_supertypes: TextSerializationFailure
-general/bounds_check_depends_on_inference: TextSerializationFailure # Was: Pass
 general/bug21938: TypeCheckError
 general/bug30695: TypeCheckError
 general/bug31124: RuntimeError
-general/bug32414a: TextSerializationFailure # Was: Pass
-general/bug32414b: TextSerializationFailure # Was: Pass
-general/bug32426: TextSerializationFailure # Was: Pass
-general/bug32629: TextSerializationFailure
-general/bug32866: TextSerializationFailure # Was: Pass
-general/bug33099: TextSerializationFailure # Was: Pass
-general/bug33196: TextSerializationFailure # Was: Pass
-general/bug33206: TextSerializationFailure # Was: Pass
-general/bug33298: TextSerializationFailure # Was: Pass
-general/bug34511: TextSerializationFailure # Was: Pass
-general/bug35470: TextSerializationFailure # Was: Pass
-general/bug37476: TextSerializationFailure
 general/call: TypeCheckError
 general/candidate_found: TypeCheckError
-general/cascade: TextSerializationFailure # Was: RuntimeError
-general/check_deferred_as_check: TextSerializationFailure # Was: Pass
-general/check_deferred_is_check: TextSerializationFailure # Was: Pass
-general/circularity-via-initializing-formal: TextSerializationFailure # Was: Pass
-general/classes: TextSerializationFailure # Was: Pass
-general/clone_function_type: TextSerializationFailure # Was: Pass
-general/closure: TextSerializationFailure # Was: Pass
-general/complex_class_hierarchy: TextSerializationFailure
-general/compound_binary_implicit_as: TextSerializationFailure
-general/constant_truncate: TextSerializationFailure
-general/constructor_const_inference: TextSerializationFailure # Was: Pass
-general/constructor_function_types: TextSerializationFailure # Was: Pass
-general/constructor_initializer_invalid: TextSerializationFailure # Was: RuntimeError # Fails execution after recovery
-general/continue_inference_after_error_lib: TextSerializationFailure # Was: Pass
-general/control_flow_collection: TextSerializationFailure
-general/control_flow_collection_inference: TextSerializationFailure
-general/covariant_equals: TextSerializationFailure
-general/covariant_generic: TextSerializationFailure # Was: RuntimeError
-general/covariant_parameter_in_superclass_of_mixin_application: TextSerializationFailure
-general/default_values: TextSerializationFailure # Was: Pass
-general/deferred_lib: TextSerializationFailure # Was: Pass
-general/demote_closure_types: TextSerializationFailure
-general/duplicated_bad_prefix_lib1: TextSerializationFailure # Was: Pass
-general/duplicated_bad_prefix_lib2: TextSerializationFailure # Was: Pass
+general/cascade: RuntimeError
+general/constructor_initializer_invalid: RuntimeError
+general/covariant_generic: RuntimeError
 general/duplicated_declarations: TypeCheckError
-general/duplicated_declarations_lib: TextSerializationFailure # Was: Pass
-general/duplicated_declarations_part: TextSerializationFailure # Was: Pass
 general/duplicated_field_initializer: RuntimeError
-general/error_locations/error_location_01: TextSerializationFailure
-general/error_locations/error_location_02: TextSerializationFailure
-general/error_locations/error_location_03: TextSerializationFailure
-general/error_locations/error_location_04: TextSerializationFailure
+general/error_locations/error_location_01: RuntimeError
+general/error_locations/error_location_02: RuntimeError
+general/error_locations/error_location_03: RuntimeError
 general/error_locations/error_location_05: RuntimeError
 general/error_locations/error_location_06: RuntimeError
 general/error_recovery/await_not_in_async: RuntimeError
@@ -154,7 +44,6 @@
 general/error_recovery/empty_await_for: RuntimeError
 general/error_recovery/empty_for: RuntimeError
 general/error_recovery/issue_38415.crash: RuntimeError
-general/error_recovery/issue_38415.crash: TextSerializationFailure
 general/error_recovery/issue_39024.crash: RuntimeError
 general/error_recovery/issue_39026.crash: RuntimeError
 general/error_recovery/issue_39026_prime.crash: RuntimeError
@@ -162,918 +51,124 @@
 general/error_recovery/issue_39058.crash: RuntimeError
 general/error_recovery/issue_39058_prime.crash: RuntimeError
 general/error_recovery/issue_39202.crash: RuntimeError
-general/error_recovery/issue_39202.crash: TextSerializationFailure
 general/error_recovery/issue_39230.crash: RuntimeError
 general/error_recovery/issue_39958_01: RuntimeError
-general/error_recovery/issue_39958_01: TextSerializationFailure
 general/error_recovery/issue_39958_02: RuntimeError
-general/error_recovery/issue_39958_02: TextSerializationFailure
 general/error_recovery/issue_39958_03: RuntimeError
-general/error_recovery/issue_39958_03: TextSerializationFailure
 general/error_recovery/issue_39958_04: RuntimeError
-general/error_recovery/issue_39958_04: TextSerializationFailure
 general/error_recovery/yield_not_in_generator: RuntimeError
-general/escape: TextSerializationFailure # Was: Pass
-general/expressions: TextSerializationFailure # Was: RuntimeError
-general/extend_with_type_variable: TextSerializationFailure
-general/external: TextSerializationFailure # Was: Pass
+general/expressions: RuntimeError
 general/external_import: RuntimeError
-general/fallthrough: TextSerializationFailure
-general/ffi_sample: TextSerializationFailure
-general/fibonacci: TextSerializationFailure # Was: Pass
-general/for_in_scope: TextSerializationFailure # Was: Pass
-general/for_in_without_declaration: TextSerializationFailure
-general/forwarding_stub_for_operator: TextSerializationFailure
-general/function_in_field: TextSerializationFailure # Was: Pass
-general/function_type_assignments: TextSerializationFailure # Was: Pass
-general/function_type_is_check: TextSerializationFailure # Was: Pass
-general/functions: TextSerializationFailure # Was: Pass
-general/generic_function_type_in_message: TextSerializationFailure
-general/getter_call: TextSerializationFailure
-general/if_null_in_cascade: TextSerializationFailure
-general/if_null_in_list_literal: TextSerializationFailure
-general/if_null_in_set_literal: TextSerializationFailure
-general/illegal_named_function_expression: TextSerializationFailure # Was: Pass
-general/illegal_named_function_expression_scope: TextSerializationFailure # Was: Pass
-general/implicit_new: TextSerializationFailure # Was: Pass
-general/implicit_scope_test: TextSerializationFailure # Was: Pass
 general/incomplete_field_formal_parameter: RuntimeError
 general/infer_field_from_multiple: TypeCheckError
-general/infer_fixed_generic_return_type: TextSerializationFailure
-general/infer_map_literal_with_closure: TextSerializationFailure
-general/interface_contravariant_from_class: TextSerializationFailure
-general/interface_covariantImpl_from_class: TextSerializationFailure
-general/interface_covariantInterface_from_class: TextSerializationFailure
-general/invalid_assignment: TextSerializationFailure # Was: Pass
-general/invalid_cast: TextSerializationFailure # Was: Pass
 general/invalid_operator: TypeCheckError
 general/invocations: RuntimeError
-general/issue34899: TextSerializationFailure
-general/issue35875: TextSerializationFailure
-general/issue37027: TextSerializationFailure
-general/issue37381: TextSerializationFailure
 general/issue37776: RuntimeError
-general/issue38812: TextSerializationFailure
 general/issue38938: RuntimeError
-general/issue38943: TextSerializationFailure
-general/issue38944: TextSerializationFailure
+general/issue38944: RuntimeError
 general/issue38961: RuntimeError
-general/issue39344: TextSerializationFailure
-general/issue39817: TextSerializationFailure
-general/issue40242: TextSerializationFailure
-general/issue40428: TextSerializationFailure
-general/issue40662: TextSerializationFailure
-general/issue40744: TextSerializationFailure
-general/issue41070: TextSerializationFailure
 general/issue41210a: TypeCheckError
 general/issue41210b/issue41210: TypeCheckError
-general/local_generic_function: TextSerializationFailure # Was: Pass
-general/long_chain_of_typedefs: TextSerializationFailure
-general/many_errors: TextSerializationFailure
-general/metadata_enum: TextSerializationFailure # Was: Pass
-general/micro: TextSerializationFailure # Was: RuntimeError
-general/missing_toplevel: TextSerializationFailure
-general/mixin: TextSerializationFailure # Was: Pass
-general/mixin_application_inferred_parameter_type: TextSerializationFailure
-general/mixin_application_override: ExpectationFileMismatch
+general/micro: RuntimeError
 general/mixin_application_override: TypeCheckError
-general/mixin_constructors_with_default_values: TextSerializationFailure # Was: Pass
-general/mixin_covariant: TextSerializationFailure
-general/mixin_inherited_setter_for_mixed_in_field: TextSerializationFailure # Was: Pass
-general/mixin_super_repeated: TextSerializationFailure # Was: Pass
-general/named_function_scope: TextSerializationFailure # Was: Pass
-general/named_parameters: TextSerializationFailure # Was: Pass
-general/native_as_name: TextSerializationFailure # Was: Pass
-general/nested_implicit_const_with_env_var: TextSerializationFailure # Was: Pass
-general/nested_property_set: TextSerializationFailure
-general/nested_variable_set: TextSerializationFailure
-general/nested_variance: TextSerializationFailure
-general/no_such_method_private_setter: TextSerializationFailure # Was: Pass
-general/no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
-general/non_covariant_checks: TextSerializationFailure
-general/null_aware: TextSerializationFailure # Was: Pass
-general/null_aware_for_in: TextSerializationFailure
-general/null_aware_postfix: TextSerializationFailure
-general/null_aware_spread: TextSerializationFailure
-general/operator_method_not_found: TextSerializationFailure
-general/operators: TextSerializationFailure # Was: Pass
+general/mixin_constructors_with_default_values: RuntimeError
+general/operator_method_not_found: RuntimeError
 general/optional: TypeCheckError
-general/override: TextSerializationFailure # Was: Pass
 general/override_check_accessor_after_inference: TypeCheckError # Issue #31620
 general/override_check_accessor_basic: TypeCheckError # Issue #31620
 general/override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
 general/override_check_after_inference: TypeCheckError # Issue #31620
 general/override_check_basic: TypeCheckError # Issue #31620
-general/override_check_generic_method_f_bounded: TextSerializationFailure # Was: Pass
-general/override_check_two_substitutions: TextSerializationFailure # Was: Pass
 general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 general/override_setter_with_field: TypeCheckError
-general/part_as_entry_point_lib: TextSerializationFailure # Was: Pass
-general/private_method_tearoff: TextSerializationFailure # Was: Pass
-general/private_method_tearoff_lib: TextSerializationFailure # Was: Pass
-general/promoted_access: TextSerializationFailure
-general/promoted_null_aware_access: TextSerializationFailure
-general/public_method_tearoff: TextSerializationFailure # Was: Pass
-general/public_method_tearoff_lib: TextSerializationFailure # Was: Pass
-general/qualified: TextSerializationFailure # Was: Pass
-general/qualified_lib: TextSerializationFailure # Was: Pass
-general/qualified_part: TextSerializationFailure # Was: Pass
-general/redirecting_factory: TextSerializationFailure # Was: Pass
-general/redirecting_factory_const_inference: TextSerializationFailure # Was: Pass
-general/redirecting_factory_typeargs_test: TextSerializationFailure # Was: Pass
-general/redirecting_factory_typeparam_test: TextSerializationFailure # Was: Pass
-general/redirecting_factory_typeparambounds_test: TextSerializationFailure # Was: Pass
-general/redirecting_initializer_arguments_assignable_test: TextSerializationFailure # Was: Pass
-general/redirecting_initializer_arguments_test: TextSerializationFailure # Was: Pass
-general/redirection_chain_type_arguments: TextSerializationFailure # Was: Pass
-general/redirection_chain_type_arguments_subst: TextSerializationFailure # Was: Pass
-general/redirection_type_arguments: TextSerializationFailure # Was: Pass
-general/reject_generic_function_types_in_bounds: TextSerializationFailure # Was: RuntimeError # Expected
-general/return_with_unknown_type_in_context: TextSerializationFailure # Was: Pass
-general/spread_collection: TextSerializationFailure # Should be fixed as part of implementing spread collection support
-general/spread_collection_inference: TextSerializationFailure # Should be fixed as part of implementing spread collection support
+general/reject_generic_function_types_in_bounds: RuntimeError
+general/spread_collection: RuntimeError # Should be fixed as part of implementing spread collection support
 general/statements: Crash
-general/store_load: TextSerializationFailure # Was: Pass
-general/super_call: TextSerializationFailure # Was: Pass
-general/super_nsm: TextSerializationFailure # Was: Pass
-general/this_field_call: TextSerializationFailure
-general/three_typedefs_loop: TextSerializationFailure
-general/top_level_accessors: TextSerializationFailure # Was: Pass
-general/top_level_accessors_part: TextSerializationFailure # Was: Pass
-general/type_of_null: TextSerializationFailure
-general/type_parameter_type_named_int: TextSerializationFailure
-general/type_parameter_usage_in_static_method_in_class: TextSerializationFailure
-general/type_parameter_usage_in_static_method_in_extension: TextSerializationFailure
-general/type_variable_as_super: TextSerializationFailure # Was: RuntimeError
+general/type_parameter_type_named_int: RuntimeError
+general/type_variable_as_super: RuntimeError
 general/type_variable_bound_access: TypeCheckError
-general/type_variable_prefix: TextSerializationFailure # Was: RuntimeError
-general/type_variable_uses: TextSerializationFailure # Was: Pass
-general/undefined: TextSerializationFailure # Was: Pass
-general/undefined_getter_in_compound_assignment: TextSerializationFailure # Was: Pass
-general/uninitialized_fields: TextSerializationFailure # Was: Pass
 general/unsound_promotion: TypeCheckError
-general/unused_methods: TextSerializationFailure # Was: Pass
-general/var_as_type_name: TextSerializationFailure # Was: Pass
-general/vm_type_ops: TextSerializationFailure
-general/void_methods: TextSerializationFailure
-general/well_boundness_checks_in_outline: TextSerializationFailure
-general/with_dependencies/extension_from_dill/extension_from_dill: TextSerializationFailure
-general/with_dependencies/variance_from_dill/variance_from_dill: TextSerializationFailure
-general_nnbd_opt_out/DeltaBlue: TextSerializationFailure # Was: Pass
+general/void_methods: RuntimeError
 general_nnbd_opt_out/abstract_members: TypeCheckError
-general_nnbd_opt_out/accessors: TextSerializationFailure # Was: RuntimeError
-general_nnbd_opt_out/all_variances: TextSerializationFailure
+general_nnbd_opt_out/accessors: RuntimeError
 general_nnbd_opt_out/ambiguous_exports: RuntimeError
-general_nnbd_opt_out/annotation_on_enum_values: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/argument: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/arithmetic: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/arrow_function: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/assign_to_initializing_formal: TextSerializationFailure
-general_nnbd_opt_out/async_nested: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/await_complex: TextSerializationFailure
-general_nnbd_opt_out/await_in_cascade: TextSerializationFailure
 general_nnbd_opt_out/await_in_non_async: RuntimeError
-general_nnbd_opt_out/await_in_non_async: TextSerializationFailure
-general_nnbd_opt_out/bad_setter_abstract: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bad_store: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bad_type_variable_uses_in_supertypes: TextSerializationFailure
-general_nnbd_opt_out/bounds_check_depends_on_inference: TextSerializationFailure # Was: Pass
 general_nnbd_opt_out/bug21938: TypeCheckError
 general_nnbd_opt_out/bug30695: TypeCheckError
 general_nnbd_opt_out/bug31124: RuntimeError
-general_nnbd_opt_out/bug32414a: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bug32414b: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bug32426: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bug32629: TextSerializationFailure
-general_nnbd_opt_out/bug32866: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bug33099: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bug33196: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bug33206: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bug33298: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bug34511: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bug35470: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/bug37476: TextSerializationFailure
 general_nnbd_opt_out/call: TypeCheckError
 general_nnbd_opt_out/candidate_found: TypeCheckError
-general_nnbd_opt_out/cascade: TextSerializationFailure # Was: RuntimeError
-general_nnbd_opt_out/check_deferred_as_check: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/check_deferred_is_check: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/circularity-via-initializing-formal: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/classes: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/clone_function_type: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/closure: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/complex_class_hierarchy: TextSerializationFailure
-general_nnbd_opt_out/compound_binary_implicit_as: TextSerializationFailure
-general_nnbd_opt_out/constructor_const_inference: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/constructor_function_types: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/constructor_initializer_invalid: TextSerializationFailure # Was: RuntimeError # Fails execution after recovery
-general_nnbd_opt_out/continue_inference_after_error_lib: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/control_flow_collection: TextSerializationFailure
-general_nnbd_opt_out/control_flow_collection_inference: TextSerializationFailure
-general_nnbd_opt_out/covariant_equals: TextSerializationFailure
-general_nnbd_opt_out/covariant_generic: TextSerializationFailure # Was: RuntimeError
-general_nnbd_opt_out/covariant_parameter_in_superclass_of_mixin_application: TextSerializationFailure
-general_nnbd_opt_out/default_values: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/deferred_lib: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/duplicated_bad_prefix_lib1: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/duplicated_bad_prefix_lib2: TextSerializationFailure # Was: Pass
+general_nnbd_opt_out/cascade: RuntimeError
+general_nnbd_opt_out/constructor_initializer_invalid: RuntimeError
+general_nnbd_opt_out/covariant_generic: RuntimeError
 general_nnbd_opt_out/duplicated_declarations: TypeCheckError
-general_nnbd_opt_out/duplicated_declarations_lib: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/duplicated_declarations_part: TextSerializationFailure # Was: Pass
 general_nnbd_opt_out/duplicated_field_initializer: RuntimeError
-general_nnbd_opt_out/error_locations/error_location_01: TextSerializationFailure
-general_nnbd_opt_out/error_locations/error_location_02: TextSerializationFailure
-general_nnbd_opt_out/error_locations/error_location_03: TextSerializationFailure
-general_nnbd_opt_out/error_locations/error_location_04: TextSerializationFailure
+general_nnbd_opt_out/error_locations/error_location_01: RuntimeError
+general_nnbd_opt_out/error_locations/error_location_02: RuntimeError
+general_nnbd_opt_out/error_locations/error_location_03: RuntimeError
 general_nnbd_opt_out/error_locations/error_location_05: RuntimeError
 general_nnbd_opt_out/error_locations/error_location_06: RuntimeError
-general_nnbd_opt_out/escape: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/expressions: TextSerializationFailure # Was: RuntimeError
-general_nnbd_opt_out/extend_with_type_variable: TextSerializationFailure
-general_nnbd_opt_out/external: TextSerializationFailure # Was: Pass
+general_nnbd_opt_out/expressions: RuntimeError
 general_nnbd_opt_out/external_import: RuntimeError
-general_nnbd_opt_out/fallthrough: TextSerializationFailure
-general_nnbd_opt_out/ffi_sample: TextSerializationFailure
-general_nnbd_opt_out/fibonacci: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/for_in_scope: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/for_in_without_declaration: TextSerializationFailure
-general_nnbd_opt_out/forwarding_stub_for_operator: TextSerializationFailure
-general_nnbd_opt_out/function_in_field: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/function_type_assignments: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/function_type_is_check: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/functions: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/generic_function_type_in_message: TextSerializationFailure
-general_nnbd_opt_out/if_null_in_cascade: TextSerializationFailure
-general_nnbd_opt_out/if_null_in_list_literal: TextSerializationFailure
-general_nnbd_opt_out/if_null_in_set_literal: TextSerializationFailure
-general_nnbd_opt_out/illegal_named_function_expression: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/illegal_named_function_expression_scope: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/implicit_new: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/implicit_scope_test: TextSerializationFailure # Was: Pass
 general_nnbd_opt_out/incomplete_field_formal_parameter: RuntimeError
-general_nnbd_opt_out/interface_contravariant_from_class: TextSerializationFailure
-general_nnbd_opt_out/interface_covariantImpl_from_class: TextSerializationFailure
-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/invocations: RuntimeError
-general_nnbd_opt_out/issue34899: TextSerializationFailure
-general_nnbd_opt_out/issue35875: TextSerializationFailure
-general_nnbd_opt_out/issue37027: TextSerializationFailure
-general_nnbd_opt_out/issue37381: TextSerializationFailure
 general_nnbd_opt_out/issue37776: RuntimeError
-general_nnbd_opt_out/issue38812: TextSerializationFailure
 general_nnbd_opt_out/issue38938: RuntimeError
-general_nnbd_opt_out/issue38943: TextSerializationFailure
-general_nnbd_opt_out/issue38944: TextSerializationFailure
+general_nnbd_opt_out/issue38944: RuntimeError
 general_nnbd_opt_out/issue38961: RuntimeError
-general_nnbd_opt_out/issue39344: TextSerializationFailure
-general_nnbd_opt_out/issue39817: TextSerializationFailure
-general_nnbd_opt_out/local_generic_function: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/long_chain_of_typedefs: TextSerializationFailure
-general_nnbd_opt_out/many_errors: TextSerializationFailure
-general_nnbd_opt_out/metadata_enum: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/micro: TextSerializationFailure # Was: RuntimeError
-general_nnbd_opt_out/missing_toplevel: TextSerializationFailure
-general_nnbd_opt_out/mixin: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/mixin_application_inferred_parameter_type: TextSerializationFailure
-general_nnbd_opt_out/mixin_application_override: ExpectationFileMismatch
+general_nnbd_opt_out/micro: RuntimeError
 general_nnbd_opt_out/mixin_application_override: TypeCheckError
-general_nnbd_opt_out/mixin_constructors_with_default_values: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/mixin_inherited_setter_for_mixed_in_field: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/mixin_super_repeated: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/named_function_scope: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/named_parameters: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/native_as_name: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/nested_implicit_const_with_env_var: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/nested_property_set: TextSerializationFailure
-general_nnbd_opt_out/nested_variable_set: TextSerializationFailure
-general_nnbd_opt_out/nested_variance: TextSerializationFailure
-general_nnbd_opt_out/no_such_method_private_setter: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/non_covariant_checks: TextSerializationFailure
-general_nnbd_opt_out/null_aware: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/null_aware_for_in: TextSerializationFailure
-general_nnbd_opt_out/null_aware_postfix: TextSerializationFailure
-general_nnbd_opt_out/null_aware_spread: TextSerializationFailure
-general_nnbd_opt_out/operator_method_not_found: TextSerializationFailure
-general_nnbd_opt_out/operators: TextSerializationFailure # Was: Pass
+general_nnbd_opt_out/mixin_constructors_with_default_values: RuntimeError
+general_nnbd_opt_out/operator_method_not_found: RuntimeError
 general_nnbd_opt_out/optional: TypeCheckError
-general_nnbd_opt_out/override: TextSerializationFailure # Was: Pass
 general_nnbd_opt_out/override_check_accessor_after_inference: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_check_accessor_basic: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_check_after_inference: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_check_basic: TypeCheckError # Issue #31620
-general_nnbd_opt_out/override_check_generic_method_f_bounded: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/override_check_two_substitutions: TextSerializationFailure # Was: Pass
 general_nnbd_opt_out/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_setter_with_field: TypeCheckError
-general_nnbd_opt_out/part_as_entry_point_lib: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/private_method_tearoff: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/private_method_tearoff_lib: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/promoted_access: TextSerializationFailure
-general_nnbd_opt_out/public_method_tearoff: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/public_method_tearoff_lib: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/qualified: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/qualified_lib: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/qualified_part: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/redirecting_factory: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/redirecting_factory_const_inference: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/redirecting_factory_typeargs_test: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/redirecting_factory_typeparam_test: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/redirecting_factory_typeparambounds_test: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/redirecting_initializer_arguments_assignable_test: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/redirecting_initializer_arguments_test: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/redirection_chain_type_arguments: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/redirection_chain_type_arguments_subst: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/redirection_type_arguments: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/reject_generic_function_types_in_bounds: TextSerializationFailure # Was: RuntimeError # Expected
-general_nnbd_opt_out/return_with_unknown_type_in_context: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/spread_collection: TextSerializationFailure # Should be fixed as part of implementing spread collection support
-general_nnbd_opt_out/spread_collection_inference: TextSerializationFailure # Should be fixed as part of implementing spread collection support
+general_nnbd_opt_out/reject_generic_function_types_in_bounds: RuntimeError
+general_nnbd_opt_out/spread_collection: RuntimeError # Should be fixed as part of implementing spread collection support
 general_nnbd_opt_out/statements: Crash
-general_nnbd_opt_out/store_load: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/super_call: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/super_nsm: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/three_typedefs_loop: TextSerializationFailure
-general_nnbd_opt_out/top_level_accessors: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/top_level_accessors_part: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/type_of_null: TextSerializationFailure
-general_nnbd_opt_out/type_parameter_type_named_int: TextSerializationFailure
-general_nnbd_opt_out/type_variable_as_super: TextSerializationFailure # Was: RuntimeError
+general_nnbd_opt_out/type_parameter_type_named_int: RuntimeError
+general_nnbd_opt_out/type_variable_as_super: RuntimeError
 general_nnbd_opt_out/type_variable_bound_access: TypeCheckError
-general_nnbd_opt_out/type_variable_prefix: TextSerializationFailure # Was: RuntimeError
-general_nnbd_opt_out/type_variable_uses: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/undefined: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/undefined_getter_in_compound_assignment: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/uninitialized_fields: TextSerializationFailure # Was: Pass
 general_nnbd_opt_out/unsound_promotion: TypeCheckError
-general_nnbd_opt_out/unused_methods: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/var_as_type_name: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/void_methods: TextSerializationFailure
-implicit_getter_calls/getter_call: TextSerializationFailure
-implicit_getter_calls/this_field_call: TextSerializationFailure
-inference/abstract_class_instantiation: TextSerializationFailure
-inference/assert: TextSerializationFailure # Was: Pass
-inference/assert_initializer: TextSerializationFailure # Was: Pass
-inference/assign_local: TextSerializationFailure # Was: Pass
-inference/async_await: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_async_all_returns_are_futures: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_async_all_returns_are_values: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_async_mix_of_values_and_futures: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_async_star: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_basic: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_basic_void: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_infer_bottom_async: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_infer_bottom_async_star: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_infer_bottom_sync: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_infer_bottom_sync_star: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_lub: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_nested_lambdas: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_no_return: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_returns: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_sync_star: TextSerializationFailure # Was: Pass
-inference/block_bodied_lambdas_void_context: TextSerializationFailure # Was: Pass
-inference/bug30251: TextSerializationFailure # Was: Pass
-inference/bug30620: TextSerializationFailure # Was: Pass
-inference/bug30620_b: TextSerializationFailure # Was: Pass
-inference/bug30620_c: TextSerializationFailure # Was: Pass
-inference/bug30620_d: TextSerializationFailure # Was: Pass
-inference/bug30624: TextSerializationFailure # Was: Pass
-inference/bug31132: TextSerializationFailure # Was: Pass
-inference/bug31133: TextSerializationFailure # Was: Pass
-inference/bug31436: TextSerializationFailure # Was: Pass
-inference/bug32291: TextSerializationFailure # Was: Pass
-inference/bug33324: TextSerializationFailure # Was: Pass
-inference/callable_generic_class: TextSerializationFailure # Was: Pass
-inference/complex_predecrement: TextSerializationFailure # Was: Pass
-inference/conditional_upwards_inference: TextSerializationFailure # Was: Pass
-inference/constructors_downwards_with_constraint: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments: TextSerializationFailure # Was: Pass
+general_nnbd_opt_out/void_methods: RuntimeError
 inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
-inference/constructors_infer_from_arguments_const: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_const_with_upper_bound: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_downwards_from_constructor: TextSerializationFailure
-inference/constructors_infer_from_arguments_factory: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_factory_calls_constructor: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_named: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_named_factory: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_redirecting: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_redirecting_factory: TextSerializationFailure # Was: Pass
-inference/constructors_infer_from_arguments_redirecting_factory_to_factory: TextSerializationFailure # Was: Pass
-inference/constructors_inference_f_bounded: TextSerializationFailure # Was: Pass
-inference/constructors_reverse_type_parameters: TextSerializationFailure # Was: Pass
-inference/constructors_too_many_positional_arguments: TextSerializationFailure
 inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer: TypeCheckError
-inference/dont_infer_type_on_dynamic: TextSerializationFailure # Was: Pass
-inference/dont_infer_type_when_initializer_is_null: TextSerializationFailure # Was: Pass
-inference/downward_inference_fixes_no_upwards_errors: TextSerializationFailure # Was: Pass
-inference/downward_inference_miscellaneous: TextSerializationFailure # Was: Pass
-inference/downwards_inference_annotations_for_loop_variable: TextSerializationFailure # Was: Pass
-inference/downwards_inference_annotations_type_variable: TextSerializationFailure
-inference/downwards_inference_async_await: TextSerializationFailure # Was: Pass
-inference/downwards_inference_for_each: TextSerializationFailure # Was: Pass
-inference/downwards_inference_initializing_formal_default_formal: TextSerializationFailure # Was: Pass
-inference/downwards_inference_inside_top_level: TextSerializationFailure # Was: Pass
-inference/downwards_inference_inside_top_level_2: TextSerializationFailure # Was: Pass
-inference/downwards_inference_on_function_expressions: TextSerializationFailure # Was: Pass
-inference/downwards_inference_on_function_of_t_using_the_t: TextSerializationFailure
-inference/downwards_inference_on_generic_constructor_arguments_empty_list: TextSerializationFailure # Was: Pass
-inference/downwards_inference_on_generic_constructor_arguments_infer_downwards: TextSerializationFailure # Was: Pass
-inference/downwards_inference_on_generic_function_expressions: TextSerializationFailure # Was: Pass
-inference/downwards_inference_on_instance_creations_infer_downwards: TextSerializationFailure # Was: Pass
+inference/downwards_inference_for_each: RuntimeError
 inference/downwards_inference_on_list_literals_infer_downwards: RuntimeError
-inference/downwards_inference_on_list_literals_infer_if_value_types_match_context: TextSerializationFailure # Was: Pass
-inference/downwards_inference_yield_yield_star: TextSerializationFailure # Was: Pass
-inference/dynamic_methods: TextSerializationFailure # Was: Pass
-inference/field_initializer_context_explicit: TextSerializationFailure # Was: Pass
-inference/field_initializer_context_implicit: TextSerializationFailure # Was: Pass
-inference/field_initializer_context_this: TextSerializationFailure # Was: Pass
-inference/field_initializer_parameter: TextSerializationFailure # Was: Pass
-inference/for_each_downcast_iterable: TextSerializationFailure # Was: Pass
-inference/for_in_loop_promotion: TextSerializationFailure # Was: Pass
-inference/for_loop_empty_condition: TextSerializationFailure # Was: Pass
-inference/for_loop_initializer_expression: TextSerializationFailure # Was: Pass
-inference/for_loop_promotion: TextSerializationFailure # Was: Pass
-inference/future_or_subtyping: TextSerializationFailure # Was: Pass
-inference/future_then: TextSerializationFailure # Was: Pass
-inference/future_then_2: TextSerializationFailure # Was: Pass
-inference/future_then_3: TextSerializationFailure # Was: Pass
-inference/future_then_4: TextSerializationFailure # Was: Pass
-inference/future_then_5: TextSerializationFailure # Was: Pass
-inference/future_then_6: TextSerializationFailure # Was: Pass
-inference/future_then_conditional: TextSerializationFailure # Was: Pass
-inference/future_then_conditional_2: TextSerializationFailure # Was: Pass
-inference/future_then_conditional_3: TextSerializationFailure # Was: Pass
-inference/future_then_conditional_4: TextSerializationFailure # Was: Pass
-inference/future_then_conditional_5: TextSerializationFailure # Was: Pass
-inference/future_then_conditional_6: TextSerializationFailure # Was: Pass
-inference/future_then_downwards_method_target: TextSerializationFailure # Was: Pass
-inference/future_then_explicit_future: TextSerializationFailure
-inference/future_then_ifNull: TextSerializationFailure # Was: Pass
-inference/future_then_upwards: TextSerializationFailure # Was: RuntimeError
-inference/future_then_upwards_2: TextSerializationFailure # Was: RuntimeError
-inference/future_then_upwards_3: TextSerializationFailure # Was: Pass
-inference/future_then_upwards_from_block: TextSerializationFailure # Was: Pass
-inference/future_union_async_conditional: TextSerializationFailure # Was: Pass
-inference/future_union_async_conditional_2: TextSerializationFailure # Was: Pass
-inference/future_union_downwards: TextSerializationFailure # Was: Pass
-inference/future_union_downwards_2: TextSerializationFailure # Was: Pass
-inference/future_union_downwards_3: TextSerializationFailure # Was: Pass
-inference/future_union_downwards_4: TextSerializationFailure # Was: Pass
-inference/future_union_downwards_generic_method_with_future_return: TextSerializationFailure # Was: Pass
-inference/future_union_downwards_generic_method_with_generic_return: TextSerializationFailure # Was: Pass
-inference/future_union_upwards_generic_methods: TextSerializationFailure # Was: Pass
-inference/generic_functions_return_typedef: TextSerializationFailure
-inference/generic_methods_basic_downward_inference: TextSerializationFailure # Was: Pass
+inference/future_then_upwards: RuntimeError
+inference/future_then_upwards_2: RuntimeError
 inference/generic_methods_correctly_recognize_generic_upper_bound: TypeCheckError
-inference/generic_methods_dart_math_min_max: TextSerializationFailure # Was: Pass
 inference/generic_methods_do_not_infer_invalid_override_of_generic_method: TypeCheckError
-inference/generic_methods_downwards_inference_affects_arguments: TextSerializationFailure # Was: Pass
-inference/generic_methods_downwards_inference_fold: TextSerializationFailure # Was: Pass
 inference/generic_methods_handle_override_of_non_generic_with_generic: TypeCheckError
-inference/generic_methods_infer_generic_function_parameter_type2: TextSerializationFailure # Was: Pass
-inference/generic_methods_infer_generic_function_parameter_type: TextSerializationFailure # Was: Pass
-inference/generic_methods_infer_generic_function_return_type: TextSerializationFailure # Was: Pass
-inference/generic_methods_infer_generic_instantiation: TextSerializationFailure # Was: Pass
-inference/generic_methods_infer_generic_method_type: TextSerializationFailure # Was: Pass
-inference/generic_methods_infer_js_builtin: TextSerializationFailure
-inference/generic_methods_inference_error: TextSerializationFailure # Was: Pass
-inference/generic_methods_iterable_and_future: TextSerializationFailure # Was: Pass
-inference/generic_methods_nested_generic_instantiation: TextSerializationFailure # Was: Pass
-inference/generic_methods_uses_greatest_lower_bound: TextSerializationFailure # Was: Pass
-inference/greatest_closure_multiple_params: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_implicit_this: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_implicit_this_upwards: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_index_full: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_index_super: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_index_this: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_local: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_local_upwards: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_property_full: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_property_null_aware: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_property_null_aware_upwards: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_property_super: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_property_super_upwards: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_property_upwards: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_static: TextSerializationFailure # Was: Pass
-inference/infer_assign_to_static_upwards: TextSerializationFailure # Was: Pass
-inference/infer_field_override_with_substitution: TextSerializationFailure # Was: Pass
-inference/infer_final_field_getter_and_setter: TextSerializationFailure # Was: Pass
-inference/infer_final_field_getter_only: TextSerializationFailure # Was: Pass
-inference/infer_final_field_setter_only: TextSerializationFailure # Was: Pass
-inference/infer_from_complex_expressions_if_outer_most_value_is_precise: TextSerializationFailure
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on2: TextSerializationFailure # Was: Pass
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a: TextSerializationFailure # Was: Pass
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on: TextSerializationFailure # Was: Pass
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a: TextSerializationFailure # Was: Pass
-inference/infer_generic_field_types: TextSerializationFailure
-inference/infer_generic_method_type_named: TextSerializationFailure # Was: Pass
-inference/infer_generic_method_type_positional2: TextSerializationFailure # Was: Pass
-inference/infer_generic_method_type_positional: TextSerializationFailure # Was: Pass
-inference/infer_generic_method_type_required: TextSerializationFailure # Was: Pass
-inference/infer_list_literal_nested_in_map_literal: TextSerializationFailure # Was: Pass
-inference/infer_local_function_referenced_before_declaration: TextSerializationFailure # Was: Pass
-inference/infer_local_function_return_type: TextSerializationFailure # Was: Pass
-inference/infer_method_function_typed: TextSerializationFailure # Was: Pass
-inference/infer_method_missing_params: ExpectationFileMismatch
 inference/infer_method_missing_params: TypeCheckError
-inference/infer_rethrow: TextSerializationFailure # Was: Pass
-inference/infer_return_of_statement_lambda: TextSerializationFailure # Was: Pass
-inference/infer_setter_function_typed: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively2: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively_2_a: TextSerializationFailure # Was: Pass
-inference/infer_statics_transitively_a: TextSerializationFailure # Was: Pass
-inference/infer_throw_downwards: TextSerializationFailure # Was: Pass
-inference/infer_type_on_var_from_field: TextSerializationFailure # Was: Pass
-inference/infer_type_on_var_from_top_level: TextSerializationFailure # Was: Pass
 inference/infer_type_regardless_of_declaration_order_or_cycles: RuntimeError
-inference/infer_types_on_generic_instantiations_3: TextSerializationFailure # Was: Pass
-inference/infer_types_on_generic_instantiations_4: TextSerializationFailure # Was: RuntimeError
-inference/infer_types_on_generic_instantiations_5: TextSerializationFailure # Was: Pass
-inference/infer_types_on_generic_instantiations_in_library_cycle: TextSerializationFailure # Was: Pass
-inference/infer_types_on_generic_instantiations_in_library_cycle_a: TextSerializationFailure # Was: Pass
+inference/infer_types_on_generic_instantiations_4: RuntimeError
 inference/infer_types_on_generic_instantiations_infer: TypeCheckError
-inference/infer_types_on_loop_indices_for_each_loop: TextSerializationFailure # Was: Pass
-inference/infer_types_on_loop_indices_for_each_loop_async: TextSerializationFailure # Was: Pass
-inference/infer_types_on_loop_indices_for_loop_with_inference: TextSerializationFailure # Was: Pass
-inference/inferred_initializing_formal_checks_default_value: TextSerializationFailure # Was: Pass
-inference/inferred_type_cascade: TextSerializationFailure # Was: Pass
-inference/inferred_type_custom_index_op: TextSerializationFailure # Was: Pass
-inference/inferred_type_custom_index_op_via_interface: TextSerializationFailure # Was: Pass
-inference/inferred_type_is_enum: TextSerializationFailure # Was: Pass
-inference/inferred_type_is_enum_values: TextSerializationFailure # Was: Pass
-inference/inferred_type_is_typedef_parameterized: TextSerializationFailure # Was: Pass
-inference/inferred_type_via_closure_multiple_levels_of_nesting: TextSerializationFailure # Was: Pass
-inference/inferred_type_via_closure_type_depends_on_args: TextSerializationFailure # Was: Pass
-inference/instance_creation_downwards: TextSerializationFailure # Was: Pass
-inference/instantiate_tearoff: TextSerializationFailure # Was: Pass
-inference/instantiate_tearoff_after_contravariance_check: TextSerializationFailure # Was: Pass
 inference/instantiate_tearoff_of_call: TypeCheckError # Issue #31746
-inference/instantiate_to_bounds_generic2_has_bound_defined_after: TextSerializationFailure # Was: Pass
-inference/instantiate_to_bounds_generic2_has_bound_defined_before: TextSerializationFailure # Was: Pass
-inference/instantiate_to_bounds_generic2_no_bound: TextSerializationFailure # Was: Pass
 inference/instantiate_to_bounds_generic_has_bound_defined_after transform: RuntimeError
-inference/instantiate_to_bounds_generic_has_bound_defined_after: TextSerializationFailure # Was: Pass
-inference/instantiate_to_bounds_generic_has_bound_defined_before: TextSerializationFailure # Was: Pass
-inference/instantiate_to_bounds_invoke_constructor_no_bound: TextSerializationFailure # Was: Pass
-inference/instantiate_to_bounds_invoke_constructor_type_args_exact: TextSerializationFailure # Was: Pass
-inference/instantiate_to_bounds_not_generic: TextSerializationFailure # Was: Pass
-inference/lambda_does_not_have_propagated_type_hint: TextSerializationFailure # Was: Pass
-inference/lambda_return_type: TextSerializationFailure # Was: Pass
-inference/lambda_void_context: TextSerializationFailure # Was: Pass
-inference/list_literals: TextSerializationFailure # Was: Pass
-inference/list_literals_can_infer_null_bottom: TextSerializationFailure # Was: Pass
-inference/local_constructor_from_arguments: TextSerializationFailure # Was: Pass
-inference/local_reference_upwards_local: TextSerializationFailure # Was: Pass
-inference/local_return_and_yield: TextSerializationFailure # Was: Pass
-inference/logical_or_promotion: TextSerializationFailure # Was: Pass
-inference/map_literals: TextSerializationFailure # Was: Pass
-inference/map_literals_can_infer_null: TextSerializationFailure # Was: Pass
-inference/map_literals_top_level: TextSerializationFailure # Was: Pass
-inference/method_call_with_type_arguments_instance_method: TextSerializationFailure # Was: Pass
-inference/method_call_with_type_arguments_instance_method_identifier_sequence: TextSerializationFailure # Was: Pass
-inference/method_call_with_type_arguments_static_method: TextSerializationFailure # Was: Pass
-inference/method_call_with_type_arguments_top_level_function: TextSerializationFailure # Was: Pass
-inference/mixin_inference_instantiate_to_bounds_1: TextSerializationFailure # Was: Pass
-inference/mixin_inference_instantiate_to_bounds_2: TextSerializationFailure # Was: Pass
-inference/mixin_inference_instantiate_to_bounds_3: TextSerializationFailure # Was: Pass
-inference/mixin_inference_multiple_constraints: TextSerializationFailure # Was: Pass
-inference/mixin_inference_non_trivial_constraints: TextSerializationFailure # Was: Pass
-inference/mixin_inference_outwards_1: TextSerializationFailure # Was: Pass
-inference/mixin_inference_outwards_2: TextSerializationFailure # Was: Pass
 inference/mixin_inference_outwards_3: TypeCheckError
 inference/mixin_inference_outwards_4: TypeCheckError
 inference/mixin_inference_unification_1: TypeCheckError
 inference/mixin_inference_unification_2: TypeCheckError
-inference/no_error_when_declared_type_is_num_and_assigned_null: TextSerializationFailure # Was: Pass
-inference/non_const_invocation: TextSerializationFailure # Was: Pass
-inference/null_aware_method_invocation: TextSerializationFailure # Was: Pass
-inference/null_aware_property_get: TextSerializationFailure # Was: Pass
-inference/null_coalescing_operator: TextSerializationFailure # Was: Pass
-inference/null_coalescing_operator_2: TextSerializationFailure # Was: Pass
-inference/null_literal_should_not_infer_as_bottom: TextSerializationFailure # Was: Pass
-inference/overloaded_int_operators: TextSerializationFailure # Was: Pass
-inference/override_equals: TextSerializationFailure # Was: RuntimeError
-inference/override_inference_depends_on_field_inference: TextSerializationFailure
-inference/override_inference_with_type_parameters: TextSerializationFailure
-inference/parameter_defaults_upwards: TextSerializationFailure # Was: Pass
-inference/promote_bounds: TextSerializationFailure # Was: Pass
-inference/promote_from_logical_rhs: TextSerializationFailure # Was: Pass
-inference/promotion_subtype_check: TextSerializationFailure # Was: Pass
-inference/propagate_inference_to_field_in_class: TextSerializationFailure # Was: Pass
-inference/propagate_inference_to_field_in_class_dynamic_warnings: TextSerializationFailure # Was: Pass
-inference/propagate_inference_transitively2: TextSerializationFailure # Was: Pass
-inference/propagate_inference_transitively: TextSerializationFailure # Was: Pass
-inference/propagate_variable_get: TextSerializationFailure # Was: Pass
-inference/property_set: TextSerializationFailure # Was: Pass
-inference/property_set_bad_setter: TextSerializationFailure # Was: Pass
-inference/recursive_generic_function: TextSerializationFailure # Was: Pass
-inference/refine_binary_expression_type_type_parameter_t_double: TextSerializationFailure # Was: Pass
-inference/refine_binary_expression_type_type_parameter_t_int: TextSerializationFailure # Was: Pass
-inference/refine_binary_expression_type_type_parameter_t_t: TextSerializationFailure # Was: Pass
-inference/string_literal: TextSerializationFailure # Was: Pass
-inference/super_index_set: TextSerializationFailure # Was: Pass
-inference/super_index_set_substitution: TextSerializationFailure # Was: Pass
-inference/super_initializer: TextSerializationFailure # Was: Pass
-inference/super_initializer_substitution: TextSerializationFailure # Was: Pass
-inference/super_method_invocation_substitution: TextSerializationFailure # Was: Pass
-inference/super_property_get_substitution: TextSerializationFailure # Was: Pass
-inference/super_property_set_substitution: TextSerializationFailure # Was: Pass
-inference/switch_continue: TextSerializationFailure # Was: Pass
-inference/this_reference: TextSerializationFailure # Was: Pass
-inference/top_level_return_and_yield: TextSerializationFailure # Was: Pass
-inference/try_catch: TextSerializationFailure # Was: Pass
-inference/try_catch_finally: TextSerializationFailure # Was: Pass
-inference/try_catch_promotion: TextSerializationFailure # Was: Pass
-inference/try_finally: TextSerializationFailure # Was: Pass
-inference/type_cast: TextSerializationFailure # Was: Pass
-inference/type_promotion_ignores_local_functions: TextSerializationFailure # Was: Pass
-inference/type_promotion_not_and_not: TextSerializationFailure # Was: Pass
-inference/type_promotion_simple: TextSerializationFailure # Was: Pass
-inference/type_promotion_stopped_by_access_in_a_closure: TextSerializationFailure # Was: Pass
-inference/type_promotion_stopped_by_assignment_in_scope: TextSerializationFailure # Was: Pass
-inference/type_promotion_stopped_by_mutation_in_a_closure: TextSerializationFailure # Was: Pass
-inference/unresolved_super: TextSerializationFailure
-inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param: TextSerializationFailure # Was: Pass
-inference/unsafe_block_closure_inference_constructor_call_explicit_type_param: TextSerializationFailure # Was: Pass
-inference/unsafe_block_closure_inference_constructor_call_implicit_type_param: TextSerializationFailure # Was: Pass
-inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param: TextSerializationFailure # Was: Pass
-inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: TextSerializationFailure
-inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: TextSerializationFailure
-inference/unsafe_block_closure_inference_function_call_explicit_type_param: TextSerializationFailure # Was: Pass
-inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: TextSerializationFailure
-inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: TextSerializationFailure
-inference/unsafe_block_closure_inference_function_call_implicit_type_param: TextSerializationFailure # Was: Pass
-inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr: TextSerializationFailure # Was: Pass
-inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param: TextSerializationFailure # Was: Pass
-inference/unsafe_block_closure_inference_method_call_explicit_type_param: TextSerializationFailure # Was: Pass
-inference/unsafe_block_closure_inference_method_call_implicit_type_param: TextSerializationFailure # Was: Pass
-inference/void_return_type_subtypes_dynamic: TextSerializationFailure # Was: Pass
-inference_new/const_invocation: TextSerializationFailure # Was: Pass
-inference_new/dependency_only_if_generic_method: TextSerializationFailure # Was: Pass
-inference_new/do_loop: TextSerializationFailure # Was: Pass
-inference_new/downwards_inference_inside_top_level: TextSerializationFailure # Was: Pass
-inference_new/downwards_inference_inside_top_level_2: TextSerializationFailure # Was: Pass
-inference_new/for_each_identifier_downwards: TextSerializationFailure # Was: Pass
-inference_new/for_each_invalid_iterable: TextSerializationFailure # Was: Pass
-inference_new/for_each_outer_var_type: TextSerializationFailure # Was: Pass
-inference_new/indexed_assign_combiner: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_implicit_this: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_implicit_this_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_index: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_index_full: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_index_set_vs_get: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_index_super: TextSerializationFailure # Was: Pass
+inference/override_equals: RuntimeError
 inference_new/infer_assign_to_index_super_upwards: TypeCheckError
-inference_new/infer_assign_to_index_this: TextSerializationFailure # Was: Pass
 inference_new/infer_assign_to_index_this_upwards: TypeCheckError
 inference_new/infer_assign_to_index_upwards: TypeCheckError
-inference_new/infer_assign_to_local: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_local_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property: TextSerializationFailure # Was: Pass
 inference_new/infer_assign_to_property_custom: TypeCheckError
-inference_new/infer_assign_to_property_full: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_null_aware: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_null_aware_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_super: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_super_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_property_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_static: TextSerializationFailure # Was: Pass
-inference_new/infer_assign_to_static_upwards: TextSerializationFailure # Was: Pass
-inference_new/infer_instance_accessor_ref: TextSerializationFailure # Was: Pass
-inference_new/infer_instance_field_ref: TextSerializationFailure # Was: Pass
-inference_new/infer_logical: TextSerializationFailure # Was: Pass
 inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
-inference_new/multiple_interface_inheritance: TextSerializationFailure # Was: Pass
-inference_new/null_aware_property_get: TextSerializationFailure
-inference_new/property_assign_combiner: TextSerializationFailure # Was: Pass
-inference_new/static_assign_combiner: TextSerializationFailure # Was: Pass
-inference_new/super_index_get: TextSerializationFailure # Was: Pass
-inference_new/super_index_get_substitution: TextSerializationFailure # Was: Pass
-inference_new/switch: TextSerializationFailure # Was: Pass
-inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: TextSerializationFailure # Was: Pass
-inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: TextSerializationFailure # Was: Pass
-inference_new/void_return_type_subtypes_dynamic: TextSerializationFailure # Was: Pass
-inference_new/while_loop: TextSerializationFailure # Was: Pass
-instantiate_to_bound/all_steps: TextSerializationFailure # Was: Pass
-instantiate_to_bound/body_literal_list: TextSerializationFailure # Was: Pass
-instantiate_to_bound/body_literal_list_with_generic_argument: TextSerializationFailure # Was: Pass
-instantiate_to_bound/body_literal_map: TextSerializationFailure # Was: Pass
-instantiate_to_bound/body_omitted_bound: TextSerializationFailure # Was: Pass
-instantiate_to_bound/body_super_bounded_type: TextSerializationFailure # Was: Pass
-instantiate_to_bound/body_typedef_literal_list: TextSerializationFailure # Was: Pass
-instantiate_to_bound/body_typedef_literal_list_with_generic_argument: TextSerializationFailure # Was: Pass
-instantiate_to_bound/body_typedef_literal_map: TextSerializationFailure # Was: Pass
-instantiate_to_bound/body_typedef_omitted_bound: TextSerializationFailure # Was: Pass
-instantiate_to_bound/body_typedef_super_bounded_type: TextSerializationFailure # Was: Pass
-instantiate_to_bound/contravariant_dependence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/contravariant_dependence_in_literals: TextSerializationFailure # Was: Pass
-instantiate_to_bound/contravariant_mutual_dependence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/contravariant_mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
-instantiate_to_bound/covariant_dependence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/covariant_dependence_in_literals: TextSerializationFailure # Was: Pass
-instantiate_to_bound/covariant_mutual_dependence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/covariant_mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
-instantiate_to_bound/dependence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/dependence_in_literals: TextSerializationFailure # Was: Pass
-instantiate_to_bound/inference_constrained_by_bound: TextSerializationFailure # Was: Pass
-instantiate_to_bound/inference_defaults_to_bound: TextSerializationFailure # Was: Pass
-instantiate_to_bound/inference_gives_input: TextSerializationFailure # Was: Pass
-instantiate_to_bound/inference_super_bounded_rejected: TextSerializationFailure # Was: Pass
-instantiate_to_bound/instantiated_in_outline: TextSerializationFailure # Was: Pass
-instantiate_to_bound/literal_list: TextSerializationFailure # Was: Pass
-instantiate_to_bound/literal_list_with_generic_argument: TextSerializationFailure # Was: Pass
-instantiate_to_bound/literal_map: TextSerializationFailure # Was: Pass
-instantiate_to_bound/multiple_strongly_connected: TextSerializationFailure # Was: Pass
-instantiate_to_bound/mutual_dependence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_bound_due_to_non_simple: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_bound_due_to_variables: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: TextSerializationFailure # Was: RuntimeError # Expected
-instantiate_to_bound/non_simple_class_typedef_cycle: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_co_inductive: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_co_inductive_for_each: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_co_inductive_no_dup: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_folded_regress: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_for_each: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_from_compiled: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_generic_function_in_bound_regress: TextSerializationFailure # Was: RuntimeError # Expected
-instantiate_to_bound/non_simple_many: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_many_libs_same_name_cycle: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_no_dup: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_suppress_consequence: TextSerializationFailure # Was: Pass
-instantiate_to_bound/non_simple_variables_from_same: TextSerializationFailure # Was: Pass
-instantiate_to_bound/omitted_bound: TextSerializationFailure # Was: Pass
-instantiate_to_bound/raw_in_bound: TextSerializationFailure # Was: Pass
-instantiate_to_bound/super_bounded_in_bound: TextSerializationFailure
-instantiate_to_bound/super_bounded_type: TextSerializationFailure # Was: Pass
-instantiate_to_bound/supertypes: TextSerializationFailure # Was: Pass
-instantiate_to_bound/typedef_instantiated_in_outline: TextSerializationFailure # Was: Pass
-instantiate_to_bound/typedef_literal_list: TextSerializationFailure # Was: Pass
-instantiate_to_bound/typedef_literal_list_with_generic_argument: TextSerializationFailure # Was: Pass
-instantiate_to_bound/typedef_literal_map: TextSerializationFailure # Was: Pass
-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/infer_from_late_variable: TextSerializationFailure
-late_lowering/infer_late_field_type: TextSerializationFailure
-late_lowering/initializer_rewrite: TextSerializationFailure
-late_lowering/instance_field_with_initializer: TextSerializationFailure
-late_lowering/instance_field_without_initializer: TextSerializationFailure
-late_lowering/instance_final_field_without_initializer: TextSerializationFailure
-late_lowering/instance_nullable_field_with_initializer: TextSerializationFailure
-late_lowering/instance_nullable_field_without_initializer: TextSerializationFailure
-late_lowering/instance_nullable_final_field_without_initializer: TextSerializationFailure
-late_lowering/issue40093: TextSerializationFailure
-late_lowering/issue40373: TextSerializationFailure
-late_lowering/issue40373b: TextSerializationFailure
-late_lowering/issue40601: TextSerializationFailure
-late_lowering/issue40805: TextSerializationFailure
-late_lowering/issue41436b: TextSerializationFailure
-late_lowering/issue41436c/issue41436c: TextSerializationFailure
-late_lowering/late_field_inference: TextSerializationFailure
-late_lowering/late_field_with_initializer: TextSerializationFailure
-late_lowering/late_field_without_initializer: TextSerializationFailure
-late_lowering/late_final_field_with_initializer: TextSerializationFailure
-late_lowering/late_final_field_without_initializer: TextSerializationFailure
-late_lowering/late_final_local_with_initializer: TextSerializationFailure
-late_lowering/late_final_local_without_initializer: TextSerializationFailure
-late_lowering/late_final_nullable_field_with_initializer: TextSerializationFailure
-late_lowering/late_final_nullable_field_without_initializer: TextSerializationFailure
-late_lowering/late_final_nullable_local_with_initializer: TextSerializationFailure
-late_lowering/late_final_nullable_local_without_initializer: TextSerializationFailure
-late_lowering/late_future_or: TextSerializationFailure
-late_lowering/late_local_with_initializer: TextSerializationFailure
-late_lowering/late_local_without_initializer: TextSerializationFailure
-late_lowering/late_nullable_field_with_initializer: TextSerializationFailure
-late_lowering/late_nullable_field_without_initializer: TextSerializationFailure
-late_lowering/late_nullable_local_with_initializer: TextSerializationFailure
-late_lowering/late_nullable_local_without_initializer: TextSerializationFailure
-late_lowering/later: TextSerializationFailure
-late_lowering/override: TextSerializationFailure
-late_lowering/override_getter_setter: TextSerializationFailure
-late_lowering/return_late: TextSerializationFailure
-late_lowering/uninitialized_non_nullable_late_fields: TextSerializationFailure
-new_const_insertion/simple: TextSerializationFailure # Was: Pass
-nnbd/assign_type_variable: TextSerializationFailure
-nnbd/assignability: TextSerializationFailure
-nnbd/bounds_checks: TextSerializationFailure
-nnbd/bounds_from_opt_in: TextSerializationFailure
-nnbd/call: TextSerializationFailure
-nnbd/constant_null_is: TextSerializationFailure
-nnbd/constants: TextSerializationFailure
-nnbd/covariant_equals: 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/forin: TextSerializationFailure
-nnbd/function_types: TextSerializationFailure
-nnbd/future_or_variables: 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
-nnbd/infer_in_legacy_from_opted_in: TextSerializationFailure
+instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError
+instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError
 nnbd/inheritance_from_opt_in: TypeCheckError
-nnbd/inheritance_from_opt_out: TextSerializationFailure
-nnbd/intersection_types: TextSerializationFailure
-nnbd/issue39822: TextSerializationFailure
-nnbd/issue40093: TextSerializationFailure
-nnbd/issue40134: TextSerializationFailure
-nnbd/issue40512/issue40512: TextSerializationFailure
-nnbd/issue40600: TextSerializationFailure
-nnbd/issue40601: TextSerializationFailure
-nnbd/issue40805: TextSerializationFailure
-nnbd/issue41102: TextSerializationFailure
-nnbd/issue41103: TextSerializationFailure
-nnbd/issue41114: TextSerializationFailure
-nnbd/issue41156: TextSerializationFailure
-nnbd/issue41180: TextSerializationFailure
-nnbd/issue41210a/issue41210: TextSerializationFailure
-nnbd/issue41210b: TextSerializationFailure
-nnbd/issue41273: TextSerializationFailure
-nnbd/issue41498: TextSerializationFailure
-nnbd/issue41498b: TextSerializationFailure
-nnbd/issue_39286: TextSerializationFailure
-nnbd/issue_39286_2: TextSerializationFailure
-nnbd/late: TextSerializationFailure
-nnbd/later: TextSerializationFailure
-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_out: TextSerializationFailure
+nnbd/issue41180: RuntimeError
 nnbd/messages_with_types_opt_in: TypeCheckError
 nnbd/messages_with_types_opt_out: TypeCheckError
-nnbd/missing_required_named_parameter: TextSerializationFailure
-nnbd/mixed_mode_hierarchy_generic_methods: TextSerializationFailure
-nnbd/mixin_from_opt_in: TextSerializationFailure
-nnbd/mixin_from_opt_in_out_in: TextSerializationFailure
-nnbd/mixin_from_opt_out: TextSerializationFailure
-nnbd/never_bound: TextSerializationFailure
 nnbd/never_opt_out: TypeCheckError
-nnbd/never_receiver: TextSerializationFailure
-nnbd/no_null_shorting: TextSerializationFailure
-nnbd/no_null_shorting_explicit_extension: TextSerializationFailure
-nnbd/no_null_shorting_extension: TextSerializationFailure
-nnbd/non_nullable_field_initialization: TextSerializationFailure
-nnbd/not_definitely_unassigned_late_local_variables: TextSerializationFailure
-nnbd/nsm_from_opt_in: TextSerializationFailure
-nnbd/null_access: TextSerializationFailure
-nnbd/null_aware_chain: TextSerializationFailure
-nnbd/null_check: TextSerializationFailure
-nnbd/null_check_context: TextSerializationFailure
-nnbd/null_shorting: TextSerializationFailure
-nnbd/null_shorting_cascade: TextSerializationFailure
-nnbd/null_shorting_explicit_extension: TextSerializationFailure
-nnbd/null_shorting_extension: TextSerializationFailure
-nnbd/null_shorting_index: TextSerializationFailure
-nnbd/nullable_access: TextSerializationFailure
-nnbd/nullable_null: TextSerializationFailure
-nnbd/nullable_object_access: TextSerializationFailure
-nnbd/nullable_param: TextSerializationFailure
-nnbd/nullable_receiver: TextSerializationFailure
-nnbd/nullable_rhs_of_typedef: TextSerializationFailure
-nnbd/opt_out: TextSerializationFailure
-nnbd/override_checks: TextSerializationFailure
-nnbd/potentially_constant_type_as: TextSerializationFailure
-nnbd/potentially_constant_type_is: TextSerializationFailure
-nnbd/potentially_non_nullable_field: TextSerializationFailure
-nnbd/regress_null_aware: TextSerializationFailure
-nnbd/return_late: TextSerializationFailure
-nnbd/return_null: TextSerializationFailure
-nnbd/shorting_stop: TextSerializationFailure
-nnbd/sink_hierarchy: TextSerializationFailure
-nnbd/strictly_non_nullable_warnings: TextSerializationFailure
-nnbd/substitution_in_inference: TextSerializationFailure
-nnbd/switch_redesign_fall_over: TextSerializationFailure
-nnbd/switch_redesign_types: TextSerializationFailure
-nnbd/tearoff_from_nullable_receiver: TextSerializationFailure
-nnbd/type_parameter_types: TextSerializationFailure
-nnbd/uninitialized_non_nullable_late_fields: TextSerializationFailure
-no_such_method_forwarders/abstract_accessors_from_field: TextSerializationFailure # Was: Pass
-no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in: TextSerializationFailure # Was: Pass
-no_such_method_forwarders/abstract_accessors_from_field_one_defined: TextSerializationFailure # Was: Pass
-no_such_method_forwarders/abstract_accessors_from_field_with_substitution: TextSerializationFailure # Was: Pass
-no_such_method_forwarders/abstract_override_abstract_different_type: TextSerializationFailure
-no_such_method_forwarders/abstract_override_with_different_signature: TextSerializationFailure
-no_such_method_forwarders/default_argument_values: TextSerializationFailure # Was: Pass
-no_such_method_forwarders/forwarder_propagation: TextSerializationFailure
-no_such_method_forwarders/multiple_abstract_setters: TextSerializationFailure
-no_such_method_forwarders/nsm_inherited: TextSerializationFailure # Was: Pass
-no_such_method_forwarders/setter_not_shadowed_by_method: TextSerializationFailure # Was: Pass
-no_such_method_forwarders/subst_on_forwarder: TextSerializationFailure # Was: Pass
+nnbd/potentially_nullable_access: TypeCheckError
 rasta/abstract_constructor: RuntimeError
 rasta/bad_constructor_redirection: RuntimeError
 rasta/bad_continue: RuntimeError
@@ -1081,194 +176,67 @@
 rasta/bad_explicit_super_constructor: RuntimeError
 rasta/bad_implicit_super_constructor: RuntimeError
 rasta/bad_interpolation: RuntimeError
-rasta/bad_interpolation: TextSerializationFailure # Was: RuntimeError
 rasta/bad_redirection: RuntimeError
 rasta/bad_setter_initializer: RuntimeError
 rasta/breaking_bad: RuntimeError
-rasta/cascades: TextSerializationFailure # Was: Pass
 rasta/class_hierarchy: RuntimeError
 rasta/class_member: RuntimeError
 rasta/constant_get_and_invoke: RuntimeError
-rasta/deferred_lib: TextSerializationFailure # Was: Pass
 rasta/duplicated_mixin: RuntimeError
-rasta/enum: TextSerializationFailure # Was: Pass
 rasta/export: RuntimeError
-rasta/export: TextSerializationFailure # Was: RuntimeError # Expected, this file has no main method.
 rasta/foo: RuntimeError
-rasta/foo: TextSerializationFailure # Was: RuntimeError # Expected, this file has no main method.
-rasta/for_loop: TextSerializationFailure # Was: Pass
-rasta/generic_factory: TextSerializationFailure # Was: RuntimeError
+rasta/generic_factory: RuntimeError
 rasta/issue_000001: RuntimeError
-rasta/issue_000002: TextSerializationFailure # Was: Pass
-rasta/issue_000004: TextSerializationFailure # Was: Pass
-rasta/issue_000008: TextSerializationFailure # Was: Pass
-rasta/issue_000031: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000031: RuntimeError
 rasta/issue_000032: RuntimeError
 rasta/issue_000034: RuntimeError
 rasta/issue_000036: RuntimeError
-rasta/issue_000036: TextSerializationFailure # Was: RuntimeError
 rasta/issue_000039: RuntimeError
 rasta/issue_000041: RuntimeError
 rasta/issue_000042: RuntimeError
 rasta/issue_000043: RuntimeError
 rasta/issue_000044: RuntimeError
 rasta/issue_000046: RuntimeError
-rasta/issue_000048: TextSerializationFailure # Was: Pass
-rasta/issue_000052: TextSerializationFailure # Was: Pass
-rasta/issue_000067: TextSerializationFailure # Was: Pass
-rasta/issue_000068: TextSerializationFailure # Was: Pass
-rasta/issue_000069: TextSerializationFailure # Was: Pass
-rasta/issue_000070: TextSerializationFailure # Was: Pass
-rasta/issue_000080: TextSerializationFailure # Was: Pass
-rasta/issue_000081: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000081: RuntimeError
 rasta/malformed_const_constructor: RuntimeError
 rasta/malformed_function: RuntimeError
-rasta/malformed_function: TextSerializationFailure # Was: RuntimeError
 rasta/mixin_library: TypeCheckError
 rasta/native_is_illegal: RuntimeError
-rasta/parser_error: TextSerializationFailure # Was: RuntimeError
-rasta/static: TextSerializationFailure # Was: RuntimeError
+rasta/parser_error: RuntimeError
+rasta/static: RuntimeError
 rasta/super: TypeCheckError
-rasta/super_initializer: TextSerializationFailure # Was: RuntimeError
+rasta/super_initializer: RuntimeError
 rasta/super_mixin: TypeCheckError
 rasta/super_operator: TypeCheckError
-rasta/switch_execution_case_t02: TextSerializationFailure # Was: Pass
-rasta/this_invoke: TextSerializationFailure # Was: Pass
-rasta/type_literals: TextSerializationFailure
-rasta/type_with_parse_error: TextSerializationFailure # Was: Pass
+rasta/type_literals: RuntimeError
 rasta/typedef: RuntimeError
-rasta/typedef: TextSerializationFailure
 rasta/unresolved: RuntimeError
-rasta/unresolved: TextSerializationFailure # Was: RuntimeError
 rasta/unresolved_constructor: RuntimeError
-rasta/unresolved_for_in: TextSerializationFailure # Was: RuntimeError
+rasta/unresolved_for_in: RuntimeError
 rasta/unresolved_recovery: TypeCheckError
-regress/issue_29937: TextSerializationFailure # Was: Pass
-regress/issue_29942: TextSerializationFailure # Was: Pass
 regress/issue_29976: RuntimeError
-regress/issue_29976: TextSerializationFailure # Was:  RuntimeError # Tests runtime behavior of error recovery.
-regress/issue_29978: TextSerializationFailure # Was: Pass
-regress/issue_29979: TextSerializationFailure # Was: Pass
-regress/issue_29981: TextSerializationFailure # Was: Pass
-regress/issue_29982: TextSerializationFailure # Was: RuntimeError # Tests runtime behavior of error recovery.
-regress/issue_30834: TextSerializationFailure # Was: Pass
+regress/issue_29982: RuntimeError
 regress/issue_30836: RuntimeError
-regress/issue_30838: TextSerializationFailure # Was: Pass
-regress/issue_31181: TextSerializationFailure # Was: Pass
-regress/issue_31184: TextSerializationFailure # Was: Pass
-regress/issue_31185: TextSerializationFailure # Was: Pass
-regress/issue_31190: TextSerializationFailure # Was: Pass
-regress/issue_31213: TextSerializationFailure # Was: Pass
 regress/issue_31299: TypeCheckError
-regress/issue_31766: TextSerializationFailure # Was: Pass
-regress/issue_31846: TextSerializationFailure # Was: Pass
-regress/issue_31996: TextSerializationFailure # Was: Pass
-regress/issue_32182: TextSerializationFailure # Was: Pass
-regress/issue_32196: TextSerializationFailure # Was: Pass
-regress/issue_32200: TextSerializationFailure # Was: RuntimeError # Invalid type.
-regress/issue_32660: TextSerializationFailure # Was: Pass
 regress/issue_32972: TypeCheckError
-regress/issue_33452: TextSerializationFailure # Was: RuntimeError # Test has an intentional error
-regress/issue_33672: TextSerializationFailure # Was: Pass
-regress/issue_34225: TextSerializationFailure # Was: RuntimeError
-regress/issue_34291_lib: TextSerializationFailure # Was: Pass
-regress/issue_34403: TextSerializationFailure # Was: Pass
-regress/issue_34403_lib: TextSerializationFailure # Was: Pass
-regress/issue_34498: TextSerializationFailure # Was: Pass
-regress/issue_34498_lib: TextSerializationFailure # Was: Pass
+regress/issue_33452: RuntimeError
+regress/issue_34225: RuntimeError
 regress/issue_34563: RuntimeError
-regress/issue_34614: TextSerializationFailure # Was: Pass
-regress/issue_35177: TextSerializationFailure # Was: RuntimeError
+regress/issue_35177: RuntimeError
 regress/issue_35258: RuntimeError
 regress/issue_35259: RuntimeError
 regress/issue_35260: RuntimeError
-regress/issue_35266: TextSerializationFailure # Was: RuntimeError # Expected
-regress/issue_35900: TextSerializationFailure
+regress/issue_35266: RuntimeError
 regress/issue_36400: RuntimeError
 regress/issue_36647: RuntimeError
 regress/issue_36647_2: RuntimeError
 regress/issue_36669: RuntimeError
 regress/issue_37285: RuntimeError
-regress/issue_37681: TextSerializationFailure
 regress/issue_39035.crash: RuntimeError
-regress/issue_39035.crash: TextSerializationFailure
-regress/issue_39040: TextSerializationFailure
 regress/issue_39091_1: RuntimeError
 regress/issue_39091_2: RuntimeError
-regress/issue_39091_2: TextSerializationFailure
-regress/issue_39682: TextSerializationFailure
-regress/issue_41265.crash: TextSerializationFailure
-runtime_checks/call_kinds: TextSerializationFailure # Was: Pass
 regress/utf_16_le_content.crash: Crash
-runtime_checks/call_kinds_get: TextSerializationFailure # Was: Pass
-runtime_checks/call_kinds_set: TextSerializationFailure # Was: Pass
-runtime_checks/call_method_implicit_tear_off: TextSerializationFailure # Was: Pass
-runtime_checks/call_method_implicit_tear_off_future_or: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_field: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_generic_method_type_parameter: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_generic_return: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_generic_return_null_aware: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_generic_return_tear_off: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_getter: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_getter_return: TextSerializationFailure # Was: Pass
-runtime_checks/contravariant_getter_return_null_aware: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_method_type_parameter: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_complex: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_in_interface: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_in_interface_mixin: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_in_interface_super: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_in_interface_super_mixin: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_generic_parameter_tear_off: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_keyword: TextSerializationFailure # Was: Pass
-runtime_checks/covariant_setter: TextSerializationFailure # Was: Pass
-runtime_checks/dynamic_invocation: TextSerializationFailure # Was: Pass
-runtime_checks/dynamic_invocation_generic: TextSerializationFailure # Was: Pass
-runtime_checks/dynamic_invocation_of_getter: TextSerializationFailure # Was: Pass
-runtime_checks/field_forwarding_stub_generic_covariant: ExpectationFileMismatch
-runtime_checks/field_forwarding_stub_generic_covariant: TextSerializationFailure # Was: Pass
-runtime_checks/forwarding_stub_with_default_values: TextSerializationFailure # Was: Pass
-runtime_checks/forwarding_stub_with_non_covariant_param: TextSerializationFailure # Was: Pass
-runtime_checks/generic_covariance_inheritance_setter_field: TextSerializationFailure # Was: Pass
-runtime_checks/generic_vs_explicit_covariance: TextSerializationFailure # Was: Pass
-runtime_checks/implicit_downcast_assert_initializer: TextSerializationFailure # Was: Pass
-runtime_checks/implicit_downcast_assert_statement: TextSerializationFailure # Was: Pass
-runtime_checks/implicit_downcast_constructor_initializer: TextSerializationFailure # Was: Pass
-runtime_checks/implicit_downcast_do: TextSerializationFailure # Was: Pass
-runtime_checks/implicit_downcast_for_condition: TextSerializationFailure # Was: Pass
-runtime_checks/implicit_downcast_if: TextSerializationFailure # Was: Pass
-runtime_checks/implicit_downcast_not: TextSerializationFailure # Was: Pass
-runtime_checks/implicit_downcast_while: TextSerializationFailure # Was: Pass
-runtime_checks_new/abstract_override_becomes_forwarding_stub: ExpectationFileMismatch
-runtime_checks_new/abstract_override_becomes_forwarding_stub: TextSerializationFailure # Was: Pass
-runtime_checks_new/call_through_this: TextSerializationFailure # Was: Pass
-runtime_checks_new/contravariant_combiner: TextSerializationFailure # Was: Pass
-runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: TextSerializationFailure # Was: RuntimeError
-runtime_checks_new/contravariant_getter_return_compound_assign: TextSerializationFailure # Was: Pass
-runtime_checks_new/contravariant_index_assign: TextSerializationFailure # Was: Pass
-runtime_checks_new/contravariant_index_get: TextSerializationFailure # Was: Pass
-runtime_checks_new/derived_class_typed: TextSerializationFailure # Was: Pass
-runtime_checks_new/field_forwarding_stub_abstract_generic_covariant: TextSerializationFailure # Was: Pass
-runtime_checks_new/field_forwarding_stub_explicit_covariant: ExpectationFileMismatch
-runtime_checks_new/field_forwarding_stub_explicit_covariant: TextSerializationFailure # Was: Pass
-runtime_checks_new/for_in_call_kinds: TextSerializationFailure # Was: Pass
-runtime_checks_new/generic_covariance_based_on_inference: TextSerializationFailure # Was: Pass
-runtime_checks_new/mixin_forwarding_stub_field: ExpectationFileMismatch
+runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError
 runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
-runtime_checks_new/mixin_forwarding_stub_getter: TypeCheckError
-runtime_checks_new/mixin_forwarding_stub_setter: ExpectationFileMismatch
 runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
-runtime_checks_new/stub_checked_via_target: TextSerializationFailure # Was: Pass
-runtime_checks_new/stub_from_interface_contravariant_from_class: TextSerializationFailure # Was: Pass
-runtime_checks_new/stub_from_interface_covariantImpl_from_class: TextSerializationFailure # Was: Pass
-runtime_checks_new/stub_from_interface_covariantImpl_from_interface: TextSerializationFailure # Was: Pass
-runtime_checks_new/stub_from_interface_covariantImpl_from_super: TextSerializationFailure # Was: Pass
-runtime_checks_new/stub_from_interface_covariantInterface_from_class: TextSerializationFailure # Was: Pass
-runtime_checks_new/stub_from_interface_covariant_from_interface: TextSerializationFailure # Was: Pass
-set_literals/disambiguation_rule: TextSerializationFailure # Was: RuntimeError
-top_level_variance_test: TextSerializationFailure
-unified_collections/mixed_entries: TextSerializationFailure
-unified_collections/string_concatenation: TextSerializationFailure
-variance/class_type_parameter_modifier: TextSerializationFailure
-variance/generic_covariance_sound_variance: TextSerializationFailure
-variance/unconstrained_inference: TextSerializationFailure
+set_literals/disambiguation_rule: RuntimeError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 5b3a8c9..9be9f1e 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -62,3 +62,5 @@
 nnbd/messages_with_types_opt_in: TypeCheckError
 nnbd/messages_with_types_opt_out: TypeCheckError
 nnbd/never_opt_out: TypeCheckError
+nnbd/potentially_nullable_access: TypeCheckError
+
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 3c70beb..2b37b2c 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -68,12 +68,12 @@
 ```
 
 A string table consists of an array of end offsets and a payload array of
-strings encoded as UTF-8.  The array of end offsets maps a string index to the
+strings encoded as WTF-8.  The array of end offsets maps a string index to the
 offset of the _next_ string in the table or the offset of the end of the array
 for the last string.  These offsets are relative to the string payload array.
-Thus, string number 0 consists of the UTF-8 encoded string stretching from
+Thus, string number 0 consists of the WTF-8 encoded string stretching from
 offset 0 (inclusive) to endOffset[0] (exclusive); and string number N for N > 0
-consists of the UTF-8 encoded string stretching from offset endOffset[N-1]
+consists of the WTF-8 encoded string stretching from offset endOffset[N-1]
 (inclusive) to endOffset[N] (exclusive).
 
 ``` scala
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 73b41c5..df48c44 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -4,7 +4,6 @@
 library kernel.ast_from_binary;
 
 import 'dart:core' hide MapEntry;
-import 'dart:convert';
 import 'dart:developer';
 import 'dart:typed_data';
 
@@ -171,36 +170,74 @@
     return _doubleBuffer[0];
   }
 
-  List<int> readBytes(int length) {
-    List<int> bytes = new Uint8List(length);
+  Uint8List readBytes(int length) {
+    Uint8List bytes = new Uint8List(length);
     bytes.setRange(0, bytes.length, _bytes, _byteOffset);
     _byteOffset += bytes.length;
     return bytes;
   }
 
-  List<int> readByteList() {
+  Uint8List readByteList() {
     return readBytes(readUInt());
   }
 
+  String readString() {
+    return readStringEntry(readUInt());
+  }
+
   String readStringEntry(int numBytes) {
-    // Utf8Decoder will skip leading BOM characters, but we must preserve them.
-    // Collect leading BOMs before passing the bytes onto Utf8Decoder.
-    int numByteOrderMarks = 0;
-    while (_byteOffset + 2 < _bytes.length &&
-        _bytes[_byteOffset] == 0xef &&
-        _bytes[_byteOffset + 1] == 0xbb &&
-        _bytes[_byteOffset + 2] == 0xbf) {
-      ++numByteOrderMarks;
-      _byteOffset += 3;
-      numBytes -= 3;
+    int start = _byteOffset;
+    int end = start + numBytes;
+    _byteOffset = end;
+    for (int i = start; i < end; i++) {
+      if (_bytes[i] > 127) {
+        return _decodeWtf8(start, end);
+      }
     }
-    String string = const Utf8Decoder()
-        .convert(_bytes, _byteOffset, _byteOffset + numBytes);
-    _byteOffset += numBytes;
-    if (numByteOrderMarks > 0) {
-      return '\ufeff' * numByteOrderMarks + string;
+    return new String.fromCharCodes(_bytes, start, end);
+  }
+
+  String _decodeWtf8(int start, int end) {
+    // WTF-8 decoder that trusts its input, meaning that the correctness of
+    // the code depends on the bytes from start to end being valid and
+    // complete WTF-8. Instead of masking off the control bits from every
+    // byte, it simply xor's the byte values together at their appropriate
+    // bit shifts, and then xor's out all of the control bits at once.
+    Uint16List charCodes = new Uint16List(end - start);
+    int i = start;
+    int j = 0;
+    while (i < end) {
+      int byte = _bytes[i++];
+      if (byte < 0x80) {
+        // ASCII.
+        charCodes[j++] = byte;
+      } else if (byte < 0xE0) {
+        // Two-byte sequence (11-bit unicode value).
+        int byte2 = _bytes[i++];
+        int value = (byte << 6) ^ byte2 ^ 0x3080;
+        assert(value >= 0x80 && value < 0x800);
+        charCodes[j++] = value;
+      } else if (byte < 0xF0) {
+        // Three-byte sequence (16-bit unicode value).
+        int byte2 = _bytes[i++];
+        int byte3 = _bytes[i++];
+        int value = (byte << 12) ^ (byte2 << 6) ^ byte3 ^ 0xE2080;
+        assert(value >= 0x800 && value < 0x10000);
+        charCodes[j++] = value;
+      } else {
+        // Four-byte sequence (non-BMP unicode value).
+        int byte2 = _bytes[i++];
+        int byte3 = _bytes[i++];
+        int byte4 = _bytes[i++];
+        int value =
+            (byte << 18) ^ (byte2 << 12) ^ (byte3 << 6) ^ byte4 ^ 0x3C82080;
+        assert(value >= 0x10000 && value < 0x110000);
+        charCodes[j++] = 0xD7C0 + (value >> 10);
+        charCodes[j++] = 0xDC00 + (value & 0x3FF);
+      }
     }
-    return string;
+    assert(i == end);
+    return new String.fromCharCodes(charCodes, 0, j);
   }
 
   /// Read metadataMappings section from the binary.
@@ -222,7 +259,7 @@
     for (int i = 0; i < length; ++i) {
       endOffsets[i] = readUInt();
     }
-    // Read the UTF-8 encoded strings.
+    // Read the WTF-8 encoded strings.
     table.length = length;
     int startOffset = 0;
     for (int i = 0; i < length; ++i) {
@@ -756,7 +793,7 @@
     List<String> strings =
         new List<String>.filled(length, null, growable: true);
     for (int i = 0; i < length; i++) {
-      String s = const Utf8Decoder().convert(readByteList());
+      String s = readString();
       strings[i] = s;
     }
     return strings;
@@ -769,12 +806,10 @@
     _sourceUriTable.length = length;
     Map<Uri, Source> uriToSource = <Uri, Source>{};
     for (int i = 0; i < length; ++i) {
-      List<int> uriBytes = readByteList();
-      Uri uri = uriBytes.isEmpty
-          ? null
-          : Uri.parse(const Utf8Decoder().convert(uriBytes));
+      String uriString = readString();
+      Uri uri = uriString.isEmpty ? null : Uri.parse(uriString);
       _sourceUriTable[i] = uri;
-      List<int> sourceCode = readByteList();
+      Uint8List sourceCode = readByteList();
       int lineCount = readUInt();
       List<int> lineStarts = new List<int>(lineCount);
       int previousLineStart = 0;
@@ -783,10 +818,9 @@
         lineStarts[j] = lineStart;
         previousLineStart = lineStart;
       }
-      List<int> importUriBytes = readByteList();
-      Uri importUri = importUriBytes.isEmpty
-          ? null
-          : Uri.parse(const Utf8Decoder().convert(importUriBytes));
+      String importUriString = readString();
+      Uri importUri =
+          importUriString.isEmpty ? null : Uri.parse(importUriString);
       uriToSource[uri] = new Source(lineStarts, sourceCode, importUri, uri);
     }
 
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 93546be..c481d69 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -4,7 +4,6 @@
 library kernel.ast_to_binary;
 
 import 'dart:core' hide MapEntry;
-import 'dart:convert' show utf8;
 import 'dart:developer';
 import 'dart:io' show BytesBuilder;
 import 'dart:typed_data';
@@ -105,9 +104,9 @@
         (value >> 8) & 0xFF, value & 0xFF);
   }
 
-  void writeByteList(List<int> utf8Bytes) {
-    writeUInt30(utf8Bytes.length);
-    writeBytes(utf8Bytes);
+  void writeByteList(List<int> bytes) {
+    writeUInt30(bytes.length);
+    writeBytes(bytes);
   }
 
   int getBufferOffset() {
@@ -117,7 +116,7 @@
   void writeStringTable(StringIndexer indexer) {
     _binaryOffsetForStringTable = getBufferOffset();
 
-    // Containers for the utf8 encoded strings.
+    // Containers for the WTF-8 encoded strings.
     final List<Uint8List> data = new List<Uint8List>();
     int totalLength = 0;
     const int minLength = 1 << 16;
@@ -141,24 +140,13 @@
             index = 0;
             buffer = new Uint8List(newLength);
           }
-          newIndex = NotQuiteString.writeUtf8(buffer, index, key);
+          newIndex = _writeWtf8(buffer, index, key);
           if (newIndex != -1) break;
           requiredMinLength = allocateMinLength;
         }
-        if (newIndex < 0) {
-          // Utf8 encoding failed.
-          if (buffer != null && index > 0) {
-            data.add(new Uint8List.view(buffer.buffer, 0, index));
-            buffer = null;
-            index = 0;
-          }
-          List<int> converted = utf8.encoder.convert(key);
-          data.add(converted);
-          totalLength += converted.length;
-        } else {
-          totalLength += newIndex - index;
-          index = newIndex;
-        }
+        assert(newIndex >= 0);
+        totalLength += newIndex - index;
+        index = newIndex;
       }
       writeUInt30(totalLength);
     }
@@ -166,7 +154,7 @@
       data.add(Uint8List.view(buffer.buffer, 0, index));
     }
 
-    // Write the UTF-8 encoded strings.
+    // Write the WTF-8 encoded strings.
     for (int i = 0; i < data.length; ++i) {
       writeBytes(data[i]);
     }
@@ -586,9 +574,7 @@
     if (strings != null) {
       for (int i = 0; i < strings.length; i++) {
         String s = strings[i];
-        // This is slow, but we expect there to in general be no problems. If this
-        // turns out to be wrong we can optimize it as we do URLs for instance.
-        writeByteList(utf8.encoder.convert(s));
+        outputStringViaBuffer(s, new Uint8List(s.length * 3));
       }
     }
   }
@@ -820,21 +806,16 @@
     }
   }
 
-  void outputStringViaBuffer(String uriAsString, Uint8List buffer) {
-    if (uriAsString.length * 3 < buffer.length) {
-      int length = NotQuiteString.writeUtf8(buffer, 0, uriAsString);
-      if (length < 0) {
-        // Utf8 encoding failed.
-        writeByteList(utf8.encoder.convert(uriAsString));
-      } else {
-        writeUInt30(length);
-        for (int j = 0; j < length; j++) {
-          writeByte(buffer[j]);
-        }
+  void outputStringViaBuffer(String s, Uint8List buffer) {
+    int length = _writeWtf8(buffer, 0, s);
+    if (length >= 0) {
+      writeUInt30(length);
+      for (int j = 0; j < length; j++) {
+        writeByte(buffer[j]);
       }
     } else {
       // Uncommon case with very long url.
-      writeByteList(utf8.encoder.convert(uriAsString));
+      outputStringViaBuffer(s, new Uint8List(s.length * 3));
     }
   }
 
@@ -2758,63 +2739,58 @@
   }
 }
 
-class NotQuiteString {
-  /**
-   * Write [source] string into [target] starting at index [index].
-   *
-   * Optionally only write part of the input [source] starting at [start] and
-   * ending at [end].
-   *
-   * The output space needed is at most [source.length] * 3.
-   *
-   * Returns
-   *  * Non-negative on success (the new index in [target]).
-   *  * -1 when [target] doesn't have enough space. Note that [target] can be
-   *    polluted starting at [index].
-   *  * -2 on input error, i.e. an unpaired lead or tail surrogate.
-   */
-  static int writeUtf8(List<int> target, int index, String source,
-      [int start = 0, int end]) {
-    RangeError.checkValidIndex(index, target, null, target.length);
-    end = RangeError.checkValidRange(start, end, source.length);
-    if (start == end) return index;
-    int i = start;
-    int length = target.length;
-    do {
-      int codeUnit = source.codeUnitAt(i++);
-      while (codeUnit < 128) {
-        if (index >= length) return -1;
-        target[index++] = codeUnit;
-        if (i >= end) return index;
-        codeUnit = source.codeUnitAt(i++);
-      }
-      if (codeUnit < 0x800) {
-        index += 2;
-        if (index > length) return -1;
-        target[index - 2] = 0xC0 | (codeUnit >> 6);
-        target[index - 1] = 0x80 | (codeUnit & 0x3f);
-      } else if (codeUnit & 0xF800 != 0xD800) {
-        // Not a surrogate.
-        index += 3;
-        if (index > length) return -1;
-        target[index - 3] = 0xE0 | (codeUnit >> 12);
-        target[index - 2] = 0x80 | ((codeUnit >> 6) & 0x3f);
-        target[index - 1] = 0x80 | (codeUnit & 0x3f);
-      } else {
-        if (codeUnit >= 0xDC00) return -2; // Unpaired tail surrogate.
-        if (i >= end) return -2; // Unpaired lead surrogate.
-        int nextChar = source.codeUnitAt(i++);
-        if (nextChar & 0xFC00 != 0xDC00) return -2; // Unpaired lead surrogate.
-        index += 4;
-        if (index > length) return -1;
-        codeUnit = (codeUnit & 0x3FF) + 0x40;
-        target[index - 4] = 0xF0 | (codeUnit >> 8);
-        target[index - 3] = 0x80 | ((codeUnit >> 2) & 0x3F);
-        target[index - 2] =
-            0x80 | (((codeUnit & 3) << 4) | ((nextChar & 0x3FF) >> 6));
-        target[index - 1] = 0x80 | (nextChar & 0x3f);
-      }
-    } while (i < end);
-    return index;
-  }
+/**
+ * Write [source] string into [target] starting at index [index].
+ *
+ * The output space needed is at most [source.length] * 3.
+ *
+ * Returns
+ *  * Non-negative on success (the new index in [target]).
+ *  * -1 when [target] doesn't have enough space. Note that [target] can be
+ *    polluted starting at [index].
+ */
+int _writeWtf8(Uint8List target, int index, String source) {
+  int end = source.length;
+  if (end == 0) return index;
+  int length = target.length;
+  assert(index <= length);
+  int i = 0;
+  do {
+    int codeUnit = source.codeUnitAt(i++);
+    while (codeUnit < 128) {
+      // ASCII.
+      if (index >= length) return -1;
+      target[index++] = codeUnit;
+      if (i >= end) return index;
+      codeUnit = source.codeUnitAt(i++);
+    }
+    if (codeUnit < 0x800) {
+      // Two-byte sequence (11-bit unicode value).
+      index += 2;
+      if (index > length) return -1;
+      target[index - 2] = 0xC0 | (codeUnit >> 6);
+      target[index - 1] = 0x80 | (codeUnit & 0x3f);
+    } else if ((codeUnit & 0xFC00) == 0xD800 &&
+        i < end &&
+        (source.codeUnitAt(i) & 0xFC00) == 0xDC00) {
+      // Surrogate pair -> four-byte sequence (non-BMP unicode value).
+      index += 4;
+      if (index > length) return -1;
+      int codeUnit2 = source.codeUnitAt(i++);
+      int unicode = 0x10000 + ((codeUnit & 0x3FF) << 10) + (codeUnit2 & 0x3FF);
+      target[index - 4] = 0xF0 | (unicode >> 18);
+      target[index - 3] = 0x80 | ((unicode >> 12) & 0x3F);
+      target[index - 2] = 0x80 | ((unicode >> 6) & 0x3F);
+      target[index - 1] = 0x80 | (unicode & 0x3F);
+    } else {
+      // Three-byte sequence (16-bit unicode value), including lone
+      // surrogates.
+      index += 3;
+      if (index > length) return -1;
+      target[index - 3] = 0xE0 | (codeUnit >> 12);
+      target[index - 2] = 0x80 | ((codeUnit >> 6) & 0x3f);
+      target[index - 1] = 0x80 | (codeUnit & 0x3f);
+    }
+  } while (i < end);
+  return index;
 }
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index d649729..8bbae44 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -204,8 +204,10 @@
   ///
   /// Note, that it is the clients responsibility to mark all subclasses as
   /// changed too.
+  // TODO(johnniwinther): Support class hierarchy changes directly. Currently
+  // we can handle added superclasses but not removed superclasses.
   ClassHierarchy applyTreeChanges(Iterable<Library> removedLibraries,
-      Iterable<Library> ensureKnownLibraries,
+      Iterable<Library> ensureKnownLibraries, Iterable<Class> updatedClasses,
       {Component reissueAmbiguousSupertypesFor});
 
   /// This method is invoked by the client after a member change on classes:
@@ -801,30 +803,61 @@
 
   @override
   ClassHierarchy applyTreeChanges(Iterable<Library> removedLibraries,
-      Iterable<Library> ensureKnownLibraries,
+      Iterable<Library> ensureKnownLibraries, Iterable<Class> updatedClasses,
       {Component reissueAmbiguousSupertypesFor}) {
+    Set<_ClassInfo> changedClasses = <_ClassInfo>{};
+
+    void removeClass(Class cls) {
+      _ClassInfo info = _infoMap[cls];
+      if (info == null) return;
+      if (cls.supertype != null) {
+        _infoMap[cls.supertype.classNode]?.directExtenders?.remove(info);
+      }
+      if (cls.mixedInType != null) {
+        _infoMap[cls.mixedInType.classNode]?.directMixers?.remove(info);
+      }
+      for (Supertype supertype in cls.implementedTypes) {
+        _infoMap[supertype.classNode]?.directImplementers?.remove(info);
+        // Remove from directMixers too as the mixin transformation will
+        // "move" the type here.
+        if (cls.isAnonymousMixin || cls.isEliminatedMixin) {
+          _infoMap[supertype.classNode]?.directMixers?.remove(info);
+        }
+      }
+      _infoMap.remove(cls);
+      _recordedAmbiguousSupertypes.remove(cls);
+    }
+
+    void invalidateClass(_ClassInfo info) {
+      if (info == null) return;
+      if (!changedClasses.add(info)) return;
+      if (info.directExtenders != null) {
+        for (_ClassInfo i in info.directExtenders.toList()) {
+          invalidateClass(i);
+        }
+      }
+      if (info.directMixers != null) {
+        for (_ClassInfo i in info.directMixers.toList()) {
+          invalidateClass(i);
+        }
+      }
+      if (info.directImplementers != null) {
+        for (_ClassInfo i in info.directImplementers.toList()) {
+          invalidateClass(i);
+        }
+      }
+      removeClass(info.classNode);
+    }
+
+    for (Class cls in updatedClasses) {
+      invalidateClass(_infoMap[cls]);
+    }
+
     // Remove all references to the removed classes.
     for (Library lib in removedLibraries) {
       if (!knownLibraries.contains(lib)) continue;
       for (Class class_ in lib.classes) {
-        _ClassInfo info = _infoMap[class_];
-        if (class_.supertype != null) {
-          _infoMap[class_.supertype.classNode]?.directExtenders?.remove(info);
-        }
-        if (class_.mixedInType != null) {
-          _infoMap[class_.mixedInType.classNode]?.directMixers?.remove(info);
-        }
-        for (Supertype supertype in class_.implementedTypes) {
-          _infoMap[supertype.classNode]?.directImplementers?.remove(info);
-          // Remove from directMixers too as the mixin transformation will
-          // "move" the type here.
-          if (class_.isAnonymousMixin || class_.isEliminatedMixin) {
-            _infoMap[supertype.classNode]?.directMixers?.remove(info);
-          }
-        }
-
-        _infoMap.remove(class_);
-        _recordedAmbiguousSupertypes.remove(class_);
+        removeClass(class_);
       }
       knownLibraries.remove(lib);
     }
@@ -860,6 +893,10 @@
       }
       knownLibraries.add(lib);
     }
+    for (_ClassInfo info in changedClasses) {
+      _topologicalSortVisit(info.classNode, new Set<Class>(),
+          orderedList: addedClassesSorted);
+    }
     _initializeTopologicallySortedClasses(
         addedClassesSorted, expectedStartIndex);
 
diff --git a/pkg/kernel/lib/target/changed_structure_notifier.dart b/pkg/kernel/lib/target/changed_structure_notifier.dart
index d18c7de..e1b2c7f 100644
--- a/pkg/kernel/lib/target/changed_structure_notifier.dart
+++ b/pkg/kernel/lib/target/changed_structure_notifier.dart
@@ -7,6 +7,9 @@
 /// Meant for notifying the backend (the compiler) that the structure has
 /// changed, in turn allowing it to update its internal model.
 abstract class ChangedStructureNotifier {
-  /// Mark the class [c] as having changed in that its members have changed.
-  void forClass(Class c);
+  /// Mark the members of class [cls] have changed.
+  void registerClassMemberChange(Class cls);
+
+  /// Mark that the class hierarchy for class [cls] has changed.
+  void registerClassHierarchyChange(Class cls);
 }
diff --git a/pkg/kernel/lib/text/serializer_combinators.dart b/pkg/kernel/lib/text/serializer_combinators.dart
index 9a2dda6..30eb6a3 100644
--- a/pkg/kernel/lib/text/serializer_combinators.dart
+++ b/pkg/kernel/lib/text/serializer_combinators.dart
@@ -26,7 +26,7 @@
 
   T addBinder(String name, T node) {
     if (usedNames.contains(name)) {
-      throw StateError("name '$name' is already declared in this scope");
+      throw StateError("Name '${name}' is already declared in this scope.");
     }
     usedNames.add(name);
     return binders[name] = node;
@@ -115,7 +115,7 @@
 
   String readFrom(Iterator<Object> stream, DeserializationState _) {
     if (stream.current is! String) {
-      throw StateError("expected an atom, found a list");
+      throw StateError("Expected an atom, found a list: '${stream.current}'.");
     }
     String result = json.decode(stream.current);
     stream.moveNext();
@@ -132,7 +132,7 @@
 
   int readFrom(Iterator<Object> stream, DeserializationState _) {
     if (stream.current is! String) {
-      throw StateError("expected an atom, found a list");
+      throw StateError("Expected an atom, found a list: '${stream.current}'.");
     }
     int result = int.parse(stream.current);
     stream.moveNext();
@@ -149,7 +149,7 @@
 
   double readFrom(Iterator<Object> stream, DeserializationState _) {
     if (stream.current is! String) {
-      throw StateError("expected an atom, found a list");
+      throw StateError("Expected an atom, found a list: '${stream.current}'.");
     }
     double result = double.parse(stream.current);
     stream.moveNext();
@@ -166,7 +166,7 @@
 
   bool readFrom(Iterator<Object> stream, DeserializationState _) {
     if (stream.current is! String) {
-      throw StateError("expected an atom, found a list");
+      throw StateError("Expected an atom, found a list: '${stream.current}'.");
     }
     bool result;
     if (stream.current == "true") {
@@ -174,7 +174,7 @@
     } else if (stream.current == "false") {
       result = false;
     } else {
-      throw StateError("expected 'true' or 'false', found '${stream.current}'");
+      throw StateError("Expected 'true' or 'false', found '${stream.current}'");
     }
     stream.moveNext();
     return result;
@@ -223,12 +223,12 @@
 
   T readFrom(Iterator<Object> stream, DeserializationState state) {
     if (stream.current is! Iterator) {
-      throw StateError("expected list, found atom");
+      throw StateError("Expected list, found atom: '${stream.current}'.");
     }
     Iterator nested = stream.current;
     nested.moveNext();
     if (nested.current is! String) {
-      throw StateError("expected atom, found list");
+      throw StateError("Expected atom, found list: '${nested.current}'.");
     }
     String tag = nested.current;
     for (int i = 0; i < _tags.length; ++i) {
@@ -236,13 +236,14 @@
         nested.moveNext();
         T result = _serializers[i].readFrom(nested, state);
         if (nested.moveNext()) {
-          throw StateError("extra cruft in tagged '${tag}'");
+          throw StateError(
+              "Extra data in tagged '${tag}': '${nested.current}'.");
         }
         stream.moveNext();
         return result;
       }
     }
-    throw StateError("unrecognized tag '${tag}'");
+    throw StateError("Unrecognized tag '${tag}'.");
   }
 
   void writeTo(StringBuffer buffer, T object, SerializationState state) {
@@ -258,7 +259,7 @@
         return;
       }
     }
-    throw StateError("unrecognized tag '${tag}'");
+    throw StateError("Unrecognized tag '${tag}'.");
   }
 }
 
@@ -401,7 +402,7 @@
 
   List<T> readFrom(Iterator<Object> stream, DeserializationState state) {
     if (stream.current is! Iterator) {
-      throw StateError("expected a list, found an atom");
+      throw StateError("Expected a list, found an atom: '${stream.current}'.");
     }
     Iterator<Object> list = stream.current;
     list.moveNext();
diff --git a/pkg/kernel/lib/text/text_serialization_verifier.dart b/pkg/kernel/lib/text/text_serialization_verifier.dart
index 3f31c54..7d60bb7 100644
--- a/pkg/kernel/lib/text/text_serialization_verifier.dart
+++ b/pkg/kernel/lib/text/text_serialization_verifier.dart
@@ -55,21 +55,189 @@
 }
 
 class VerificationStatus {
+  final VerificationStatus parent;
+
   final Node node;
-  int childrenCount = 0;
-  final List<Node> supportedChildren = [];
 
-  VerificationStatus(this.node);
+  bool allChildrenAreSupported = true;
+  final List<Node> roundTripReadyNodes = [];
 
-  bool isFullySupported(TextSerializationVerifier verifier) {
-    return verifier.isSupported(node) &&
-        childrenCount == supportedChildren.length;
+  final Set<VariableDeclaration> variableDeclarations =
+      new Set<VariableDeclaration>.identity();
+  final Set<TypeParameter> typeParameters = new Set<TypeParameter>.identity();
+
+  final Set<VariableDeclaration> usedVariables =
+      new Set<VariableDeclaration>.identity();
+  final Set<TypeParameter> usedTypeParameters =
+      new Set<TypeParameter>.identity();
+
+  VerificationStatus(this.parent, this.node);
+
+  bool get isRoot => parent == null;
+
+  bool get isFullySupported => isSupported(node) && allChildrenAreSupported;
+
+  bool get hasSufficientScope {
+    return usedVariables.every((v) => variableDeclarations.contains(v)) &&
+        usedTypeParameters.every((p) => typeParameters.contains(p));
   }
 
-  void addChild(Node child, bool isSupported) {
-    ++childrenCount;
-    if (isSupported) supportedChildren.add(child);
+  bool get isRoundTripReady => isFullySupported && hasSufficientScope;
+
+  bool isVariableDeclared(VariableDeclaration node) {
+    return variableDeclarations.contains(node) ||
+        !isRoot && parent.isVariableDeclared(node);
   }
+
+  bool isTypeParameterDeclared(TypeParameter node) {
+    return typeParameters.contains(node) ||
+        !isRoot && parent.isTypeParameterDeclared(node);
+  }
+
+  void handleChild(VerificationStatus childStatus) {
+    allChildrenAreSupported =
+        allChildrenAreSupported && childStatus.isFullySupported;
+  }
+
+  void handleDeclarations() {
+    Node node = this.node;
+    if (node is VariableDeclaration) {
+      parent.variableDeclarations.add(node);
+    }
+    if (node is TypeParameter) {
+      parent.typeParameters.add(node);
+    }
+    if (node is VariableGet) {
+      usedVariables.add(node.variable);
+    }
+    if (node is VariableSet) {
+      usedVariables.add(node.variable);
+    }
+    if (node is TypeParameterType) {
+      usedTypeParameters.add(node.parameter);
+    }
+  }
+
+  /// Computes round-trip ready nodes or propagates them further in the stack.
+  ///
+  /// The returned nodes are the roots of maximal-by-inclusion subtrees that are
+  /// ready for the round-trip textual serialization.
+  List<Node> takeRoundTripReadyNodes() {
+    if (isRoot) {
+      // If the node is the root of the AST and is round-trip ready, return just
+      // the root because it's maximal-by-inclusion.
+      // Otherwise, return the nodes collected so far.
+      List<Node> result =
+          isRoundTripReady ? <Node>[node] : roundTripReadyNodes.toList();
+      roundTripReadyNodes.clear();
+      return result;
+    }
+
+    // The algorithm in this branch is based on the following observations:
+    //   - The isFullySupported property is monotonous.  That is, when traveling
+    //     from a leaf to the root, the property may only change its value from
+    //     true to false.
+    //   - The isRoundTripReady property is not monotonous because the sub-tree
+    //     that is ready for the round trip shouldn't contain free variables or
+    //     free type parameters.
+    //   - The isRoundTripReady property implies the isFullySupported property.
+
+    if (!isFullySupported) {
+      // We're out of the isFullySupported sub-tree, run the round trip on the
+      // nodes that are ready for it so far -- they are maximal-by-inclusion by
+      // construction.
+      List<Node> result = roundTripReadyNodes.toList();
+      roundTripReadyNodes.clear();
+      return result;
+    } else {
+      // We're still in the isFullySupported sub-tree.  It's to early to decide
+      // if the collected sub-trees or the node itself are maximal-by-inclusion.
+      // The decision should be made in one of the parent nodes.  So, we just
+      // propagate the information to the parent, returning an empty list for
+      // the current node.
+      if (isRoundTripReady) {
+        // The current tree is ready for the round trip.  Its sub-trees, which
+        // are also round-trip ready, are not maximal-by-inclusion.  So only the
+        // node itself is passed to the parent.
+        parent.roundTripReadyNodes.add(node);
+      } else {
+        // The node is not round-trip ready.  The round-trip ready sub-trees
+        // collected so far remain the candidates for being
+        // maximal-by-inclusion.
+        parent.roundTripReadyNodes.addAll(roundTripReadyNodes);
+      }
+      return const <Node>[];
+    }
+  }
+
+  /// Passes the necessary information to the parent when popped from the stack.
+  void mergeToParent() {
+    // Pass the free occurrences of variables and type parameters to the parent.
+    if (parent != null) {
+      parent.usedVariables
+          .addAll(usedVariables.difference(variableDeclarations));
+      parent.usedTypeParameters
+          .addAll(usedTypeParameters.difference(typeParameters));
+      parent.handleChild(this);
+    }
+  }
+
+  static bool isDartTypeSupported(DartType node) =>
+      node is InvalidType ||
+      node is DynamicType ||
+      node is VoidType ||
+      node is BottomType ||
+      node is FunctionType ||
+      node is TypeParameterType;
+
+  static bool isExpressionSupported(Expression node) =>
+      node is StringLiteral ||
+      node is SymbolLiteral ||
+      node is IntLiteral ||
+      node is DoubleLiteral ||
+      node is BoolLiteral ||
+      node is NullLiteral ||
+      node is ListLiteral ||
+      node is SetLiteral ||
+      node is MapLiteral ||
+      node is TypeLiteral ||
+      node is InvalidExpression ||
+      node is Not ||
+      node is LogicalExpression ||
+      node is StringConcatenation ||
+      node is ThisExpression ||
+      node is Rethrow ||
+      node is Throw ||
+      node is AwaitExpression ||
+      node is ConditionalExpression ||
+      node is IsExpression ||
+      node is AsExpression ||
+      node is Let ||
+      node is PropertyGet ||
+      node is PropertySet ||
+      node is SuperPropertyGet ||
+      node is SuperPropertySet ||
+      node is MethodInvocation ||
+      node is SuperMethodInvocation ||
+      node is VariableGet ||
+      node is VariableSet ||
+      node is StaticGet ||
+      node is StaticSet ||
+      node is DirectPropertyGet ||
+      node is DirectPropertySet ||
+      node is StaticInvocation ||
+      node is DirectMethodInvocation ||
+      node is ConstructorInvocation ||
+      node is FunctionExpression;
+
+  static bool isStatementSupported(Statement node) =>
+      node is ExpressionStatement ||
+      node is ReturnStatement && node.expression != null;
+
+  static bool isSupported(Node node) =>
+      node is DartType && isDartTypeSupported(node) ||
+      node is Expression && isExpressionSupported(node) ||
+      node is Statement && isStatementSupported(node);
 }
 
 class TextSerializationVerifier extends RecursiveVisitor<void> {
@@ -87,61 +255,52 @@
 
   int lastSeenOffset = noOffset;
 
-  List<VerificationStatus> _statusStack = [];
+  VerificationStatus _statusStackTop;
 
   TextSerializationVerifier({CanonicalName root})
       : root = root ?? new CanonicalName.root() {
     initializeSerializers();
   }
 
-  bool get isRoot => _statusStack.isEmpty;
+  VerificationStatus get currentStatus => _statusStackTop;
 
-  VerificationStatus get currentStatus => _statusStack.last;
-
-  void pushStatus(VerificationStatus status) {
-    _statusStack.add(status);
+  void pushStatusFor(Node node) {
+    _statusStackTop = new VerificationStatus(_statusStackTop, node);
   }
 
-  VerificationStatus popStatus() {
-    return _statusStack.removeLast();
+  void dropStatus() {
+    if (_statusStackTop == null) {
+      throw new StateError(
+          "Attempting to remove a status from an empty status stack.");
+    }
+    _statusStackTop = _statusStackTop.parent;
   }
 
-  void verify(Node node) {}
+  void verify(Node node) => node.accept(this);
 
   void defaultNode(Node node) {
     enterNode(node);
     node.visitChildren(this);
-    bool isFullySupported = exitNode(node);
-    if (isFullySupported) {
-      if (node is DartType) {
-        makeRoundTrip<DartType>(node, dartTypeSerializer);
-      } else if (node is Expression) {
-        makeRoundTrip<Expression>(node, expressionSerializer);
-      } else if (node is Statement) {
-        makeRoundTrip<Statement>(node, statementSerializer);
-      } else {
-        throw new StateError(
-            "Don't know how to make a round trip for a supported node '${node.runtimeType}'");
-      }
-    }
+    exitNode(node);
   }
 
   void enterNode(node) {
     storeLastSeenUriAndOffset(node);
-    pushStatus(new VerificationStatus(node));
+    pushStatusFor(node);
+    currentStatus.handleDeclarations();
   }
 
-  bool exitNode(node) {
+  void exitNode(node) {
     if (!identical(node, currentStatus.node)) {
       throw new StateError("Trying to remove node '${node}' from the stack, "
           "while another node '${currentStatus.node}' is on the top of it.");
     }
-    VerificationStatus status = popStatus();
-    bool isFullySupported = status.isFullySupported(this);
-    if (!isRoot) {
-      currentStatus.addChild(node, isFullySupported);
+    List<Node> roundTripReadyNodes = currentStatus.takeRoundTripReadyNodes();
+    for (Node node in roundTripReadyNodes) {
+      makeRoundTripDispatch(node);
     }
-    return isFullySupported;
+    currentStatus.mergeToParent();
+    dropStatus();
   }
 
   void storeLastSeenUriAndOffset(Node node) {
@@ -193,14 +352,30 @@
     return buffer.toString();
   }
 
-  void makeRoundTrip<T extends Node>(T node, TextSerializer<T> serializer) {
+  RoundTripStatus makeRoundTripDispatch(Node node) {
+    if (node is DartType) {
+      return makeRoundTrip<DartType>(node, dartTypeSerializer);
+    } else if (node is Expression) {
+      return makeRoundTrip<Expression>(node, expressionSerializer);
+    } else if (node is Statement) {
+      return makeRoundTrip<Statement>(node, statementSerializer);
+    } else {
+      throw new StateError(
+          "Don't know how to make a round trip for a supported node '${node.runtimeType}'");
+    }
+  }
+
+  RoundTripStatus makeRoundTrip<T extends Node>(
+      T node, TextSerializer<T> serializer) {
     String initial = writeNode(node, serializer, lastSeenUri, lastSeenOffset);
 
     // Do the round trip.
     T deserialized = readNode(initial, serializer, lastSeenUri, lastSeenOffset);
 
     // The error is reported elsewhere for the case of null.
-    if (deserialized == null) return;
+    if (deserialized == null) {
+      return new RoundTripStatus(false, initial);
+    }
 
     String serialized =
         writeNode(deserialized, serializer, lastSeenUri, lastSeenOffset);
@@ -208,62 +383,15 @@
     if (initial != serialized) {
       failures.add(new TextRoundTripFailure(
           initial, serialized, lastSeenUri, lastSeenOffset));
+      return new RoundTripStatus(false, initial);
     }
+    return new RoundTripStatus(true, initial);
   }
+}
 
-  bool isDartTypeSupported(DartType node) =>
-      node is InvalidType ||
-      node is DynamicType ||
-      node is VoidType ||
-      node is BottomType ||
-      node is FunctionType ||
-      node is TypeParameterType;
+class RoundTripStatus {
+  final bool successful;
+  final String serialized;
 
-  bool isExpressionSupported(Expression node) =>
-      node is StringLiteral ||
-      node is SymbolLiteral ||
-      node is IntLiteral ||
-      node is DoubleLiteral ||
-      node is BoolLiteral ||
-      node is NullLiteral ||
-      node is ListLiteral ||
-      node is SetLiteral ||
-      node is MapLiteral ||
-      node is TypeLiteral ||
-      node is InvalidExpression ||
-      node is Not ||
-      node is LogicalExpression ||
-      node is StringConcatenation ||
-      node is ThisExpression ||
-      node is Rethrow ||
-      node is Throw ||
-      node is AwaitExpression ||
-      node is ConditionalExpression ||
-      node is IsExpression ||
-      node is AsExpression ||
-      node is Let ||
-      node is PropertyGet ||
-      node is PropertySet ||
-      node is SuperPropertyGet ||
-      node is SuperPropertySet ||
-      node is MethodInvocation ||
-      node is SuperMethodInvocation ||
-      node is VariableGet ||
-      node is VariableSet ||
-      node is StaticGet ||
-      node is StaticSet ||
-      node is DirectPropertyGet ||
-      node is DirectPropertySet ||
-      node is StaticInvocation ||
-      node is DirectMethodInvocation ||
-      node is ConstructorInvocation ||
-      node is FunctionExpression;
-
-  bool isStatementSupported(Statement node) =>
-      node is ExpressionStatement || node is ReturnStatement;
-
-  bool isSupported(Node node) =>
-      node is DartType && isDartTypeSupported(node) ||
-      node is Expression && isExpressionSupported(node) ||
-      node is Statement && isStatementSupported(node);
+  RoundTripStatus(this.successful, this.serialized);
 }
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 02dd86e..1b8ddd4 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -37,7 +37,7 @@
 Name wrapPrivateName(Tuple2<String, String> tuple) {
   // We need a map from import URI to libraries.  More generally, we will need
   // a way to map any 'named' node to the node's reference.
-  throw UnimplementedError('deserialization of private names');
+  throw UnimplementedError('Deserialization of private names.');
 }
 
 TextSerializer<Name> nameSerializer = new Case(
@@ -738,8 +738,8 @@
   const VariableDeclarationTagger();
 
   String tag(VariableDeclaration decl) {
-    if (decl.isCovariant) throw UnimplementedError("covariant declaration");
-    if (decl.isFieldFormal) throw UnimplementedError("initializing formal");
+    if (decl.isCovariant) throw UnimplementedError("Covariant declaration.");
+    if (decl.isFieldFormal) throw UnimplementedError("Initializing formal.");
     if (decl.isConst) {
       // It's not clear what invariants we assume about const/final.  For now
       // throw if we have both.
diff --git a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
index 44a7285..3a0bc0dd 100644
--- a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
+++ b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
@@ -7,6 +7,7 @@
 import 'package:meta/meta.dart';
 
 import '../ast.dart';
+import '../target/changed_structure_notifier.dart';
 
 // Parameter name used to track were widget constructor calls were made from.
 //
@@ -309,11 +310,13 @@
   Class _widgetClass;
   Class _locationClass;
 
+  final ChangedStructureNotifier _changedStructureNotifier;
+
   /// Marker interface indicating that a private _location field is
   /// available.
   Class _hasCreationLocationClass;
 
-  WidgetCreatorTracker();
+  WidgetCreatorTracker(this._changedStructureNotifier);
 
   void _resolveFlutterClasses(Iterable<Library> libraries) {
     // If the Widget or Debug location classes have been updated we need to get
@@ -358,6 +361,8 @@
     }
     clazz.implementedTypes
         .add(new Supertype(_hasCreationLocationClass, <DartType>[]));
+    _changedStructureNotifier?.registerClassHierarchyChange(clazz);
+
     // We intentionally use the library context of the _HasCreationLocation
     // class for the private field even if [clazz] is in a different library
     // so that all classes implementing Widget behave consistently.
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 5af2a2d..fbe87af 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -475,6 +475,7 @@
 
   DartType visit(DartType node) => node.accept(this);
 
+  DartType defaultDartType(DartType node) => node;
   DartType visitInvalidType(InvalidType node) => node;
   DartType visitDynamicType(DynamicType node) => node;
   DartType visitVoidType(VoidType node) => node;
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 17c380a..3f6d770 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -118,7 +118,7 @@
 ''');
 
     // No updated classes, the same hierarchy.
-    expect(hierarchy.applyTreeChanges([], []), same(hierarchy));
+    expect(hierarchy.applyTreeChanges([], [], []), same(hierarchy));
 
     // Has updated classes, still the same hierarchy (instance). Can answer
     // queries about the new classes.
@@ -129,12 +129,13 @@
     component.libraries.add(libWithC);
     libWithC.addClass(c);
 
-    expect(hierarchy.applyTreeChanges([libWithB], [libWithC]), same(hierarchy));
+    expect(hierarchy.applyTreeChanges([libWithB], [libWithC], []),
+        same(hierarchy));
     expect(hierarchy.isSubclassOf(a, c), false);
     expect(hierarchy.isSubclassOf(c, a), true);
 
     // Remove so A should no longer be a super of anything.
-    expect(hierarchy.applyTreeChanges([libWithC], []), same(hierarchy));
+    expect(hierarchy.applyTreeChanges([libWithC], [], []), same(hierarchy));
   }
 
   void test_applyMemberChanges() {
diff --git a/pkg/native_stack_traces/CHANGELOG.md b/pkg/native_stack_traces/CHANGELOG.md
index 222b0d9..0d1a91d 100644
--- a/pkg/native_stack_traces/CHANGELOG.md
+++ b/pkg/native_stack_traces/CHANGELOG.md
@@ -1,5 +1,18 @@
 # Changelog
 
+## 0.3.4
+
+- Decoded Dart calls are now never considered internal, only VM stub calls.
+  This is due to a concurrent change in the Dart VM that no longer prints
+  non-symbolic frames for functions considered invisible, which matches the
+  symbolic frame printer and removes the need for the decoder to guess which
+  frames should be hidden.
+
+  This package still works on earlier versions of Dart, so the dependencies have
+  not changed. However, it may print more frame information than expected when
+  decoding stack frames from a Dart VM that does not include this change to
+  non-symbolic stack printing.
+
 ## 0.3.3
 
 - No externally visible changes.
diff --git a/pkg/native_stack_traces/lib/src/dwarf.dart b/pkg/native_stack_traces/lib/src/dwarf.dart
index 0b20555..a6e842e 100644
--- a/pkg/native_stack_traces/lib/src/dwarf.dart
+++ b/pkg/native_stack_traces/lib/src/dwarf.dart
@@ -1058,7 +1058,7 @@
   DartCallInfo({this.inlined = false, this.function, this.filename, this.line});
 
   @override
-  bool get isInternal => line <= 0;
+  bool get isInternal => false;
 
   @override
   int get hashCode => _hashFinish(_hashCombine(
@@ -1079,8 +1079,7 @@
   }
 
   @override
-  String toString() =>
-      "${function} (${filename}:${isInternal ? "??" : line.toString()})";
+  String toString() => "${function} (${filename}${line <= 0 ? '' : ':$line'})";
 }
 
 /// Represents the information for a call site located in a Dart stub.
@@ -1225,10 +1224,7 @@
       {bool includeInternalFrames = false}) {
     var calls = _debugInfo.callInfo(_lineNumberInfo, 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);
+      final symbol = _elf.staticSymbolAt(address);
       if (symbol != null) {
         final offset = address - symbol.value;
         calls = <CallInfo>[StubCallInfo(name: symbol.name, offset: offset)];
diff --git a/pkg/native_stack_traces/lib/src/elf.dart b/pkg/native_stack_traces/lib/src/elf.dart
index 6b4e305..cee46f0 100644
--- a/pkg/native_stack_traces/lib/src/elf.dart
+++ b/pkg/native_stack_traces/lib/src/elf.dart
@@ -719,7 +719,7 @@
 /// A table of (static or dynamic) [Symbol]s.
 class SymbolTable extends Section {
   final List<Symbol> _entries;
-  final _nameCache;
+  final Map<String, Symbol> _nameCache;
 
   SymbolTable._(SectionHeaderEntry entry, this._entries)
       : _nameCache = {},
diff --git a/pkg/native_stack_traces/pubspec.yaml b/pkg/native_stack_traces/pubspec.yaml
index b0aa7df..c7f8f15 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.3.3
+version: 0.3.4
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/native_stack_traces
 
diff --git a/pkg/nnbd_migration/.gitignore b/pkg/nnbd_migration/.gitignore
new file mode 100644
index 0000000..7138b41
--- /dev/null
+++ b/pkg/nnbd_migration/.gitignore
@@ -0,0 +1,3 @@
+lib/src/front_end/resources/*.js.deps
+lib/src/front_end/resources/*.js.map
+lib/src/front_end/resources/migration.js
diff --git a/pkg/nnbd_migration/lib/api_for_analysis_server/dartfix_listener_interface.dart b/pkg/nnbd_migration/lib/api_for_analysis_server/dartfix_listener_interface.dart
new file mode 100644
index 0000000..c2505a2
--- /dev/null
+++ b/pkg/nnbd_migration/lib/api_for_analysis_server/dartfix_listener_interface.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:nnbd_migration/api_for_analysis_server/driver_provider.dart';
+
+abstract class DartFixListenerInterface {
+  DriverProvider get server;
+
+  SourceChange get sourceChange;
+
+  /// Add the given [detail] to the list of details to be returned to the
+  /// client.
+  void addDetail(String detail);
+
+  /// Record an edit to be sent to the client.
+  ///
+  /// The associated suggestion should be separately added by calling
+  /// [addSuggestion].
+  void addEditWithoutSuggestion(Source source, SourceEdit edit);
+
+  /// Record a recommendation to be sent to the client.
+  void addRecommendation(String description, [Location location]);
+
+  /// Record a source change to be sent to the client.
+  void addSourceFileEdit(
+      String description, Location location, SourceFileEdit fileEdit);
+
+  /// Record a suggestion to be sent to the client.
+  ///
+  /// The associated edits should be separately added by calling
+  /// [addEditWithoutRecommendation].
+  void addSuggestion(String description, Location location);
+}
diff --git a/pkg/nnbd_migration/lib/api_for_analysis_server/driver_provider.dart b/pkg/nnbd_migration/lib/api_for_analysis_server/driver_provider.dart
new file mode 100644
index 0000000..2079378
--- /dev/null
+++ b/pkg/nnbd_migration/lib/api_for_analysis_server/driver_provider.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/file_system/file_system.dart';
+
+abstract class DriverProvider {
+  ResourceProvider get resourceProvider;
+
+  /// Return the appropriate analysis session for the file with the given
+  /// [path].
+  AnalysisSession getAnalysisSession(String path);
+}
diff --git a/pkg/nnbd_migration/lib/api_for_analysis_server/http_preview_server.dart b/pkg/nnbd_migration/lib/api_for_analysis_server/http_preview_server.dart
new file mode 100644
index 0000000..4a409a01
--- /dev/null
+++ b/pkg/nnbd_migration/lib/api_for_analysis_server/http_preview_server.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'package:nnbd_migration/src/preview/http_preview_server.dart'
+    show HttpPreviewServer;
diff --git a/pkg/nnbd_migration/lib/api_for_analysis_server/instrumentation_listener.dart b/pkg/nnbd_migration/lib/api_for_analysis_server/instrumentation_listener.dart
new file mode 100644
index 0000000..dc2785e
--- /dev/null
+++ b/pkg/nnbd_migration/lib/api_for_analysis_server/instrumentation_listener.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'package:nnbd_migration/src/front_end/instrumentation_listener.dart'
+    show InstrumentationListener;
diff --git a/pkg/nnbd_migration/lib/api_for_analysis_server/migration_state.dart b/pkg/nnbd_migration/lib/api_for_analysis_server/migration_state.dart
new file mode 100644
index 0000000..dabbeed
--- /dev/null
+++ b/pkg/nnbd_migration/lib/api_for_analysis_server/migration_state.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'package:nnbd_migration/src/front_end/migration_state.dart'
+    show MigrationState;
diff --git a/pkg/nnbd_migration/lib/api_for_analysis_server/nnbd_migration.dart b/pkg/nnbd_migration/lib/api_for_analysis_server/nnbd_migration.dart
new file mode 100644
index 0000000..e888dfc
--- /dev/null
+++ b/pkg/nnbd_migration/lib/api_for_analysis_server/nnbd_migration.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'package:nnbd_migration/nnbd_migration.dart'
+    show NullabilityMigration, NullabilityMigrationListener;
diff --git a/pkg/nnbd_migration/lib/nnbd_migration.dart b/pkg/nnbd_migration/lib/nnbd_migration.dart
index 8e2da63..c8670c0 100644
--- a/pkg/nnbd_migration/lib/nnbd_migration.dart
+++ b/pkg/nnbd_migration/lib/nnbd_migration.dart
@@ -17,6 +17,10 @@
 
 /// Description of fixes that might be performed by nullability migration.
 class NullabilityFixDescription {
+  /// A variable declaration needs to be marked as "late".
+  static const addLate = const NullabilityFixDescription._(
+      appliedMessage: 'Added a late keyword', kind: NullabilityFixKind.addLate);
+
   /// A variable declaration needs to be marked as "late" due to the presence of
   /// a `/*late*/` hint.
   static const addLateDueToHint = const NullabilityFixDescription._(
@@ -200,6 +204,7 @@
 
 /// An enumeration of the various kinds of nullability fixes.
 enum NullabilityFixKind {
+  addLate,
   addLateDueToHint,
   addRequired,
   addType,
diff --git a/pkg/nnbd_migration/lib/src/fix_aggregator.dart b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
index 7c37739..bedc3f5 100644
--- a/pkg/nnbd_migration/lib/src/fix_aggregator.dart
+++ b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
@@ -707,8 +707,12 @@
   /// that should be added.  Otherwise `null`.
   DartType addExplicitType;
 
-  /// If a "late" annotation should be added to this variable  declaration, the
-  /// hint that caused it.  Otherwise `null`.
+  /// Indicates whether a "late" annotation should be added to this variable
+  /// declaration, caused by inference.
+  bool addLate = false;
+
+  /// If a "late" annotation should be added to this variable declaration, and
+  /// the cause is a "late" hint, the hint that caused it.  Otherwise `null`.
   HintComment lateHint;
 
   NodeChangeForVariableDeclarationList() : super._();
@@ -716,6 +720,13 @@
   @override
   EditPlan _apply(VariableDeclarationList node, FixAggregator aggregator) {
     List<EditPlan> innerPlans = [];
+    if (addLate) {
+      var info = AtomicEditInfo(NullabilityFixDescription.addLate, {});
+      innerPlans.add(aggregator.planner.insertText(
+          node,
+          node.firstTokenAfterCommentAndMetadata.offset,
+          [AtomicEdit.insert('late', info: info), AtomicEdit.insert(' ')]));
+    }
     if (addExplicitType != null) {
       var typeText = addExplicitType.getDisplayString(withNullability: true);
       if (node.keyword?.keyword == Keyword.VAR) {
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 0bc3fd1..76732f9 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -684,6 +684,24 @@
         }
       }
     }
+
+    // Check if the nullability node for a single variable declaration has been
+    // declared to be late.
+    var lateNeeded = false;
+    if (node.variables.length == 1) {
+      var variableElement = node.variables.single.declaredElement;
+      if (_fixBuilder._variables
+          .decoratedElementType(variableElement)
+          .node
+          .isLate) {
+        lateNeeded = true;
+      }
+    }
+    if (lateNeeded) {
+      (_fixBuilder._getChange(node) as NodeChangeForVariableDeclarationList)
+          .addLate = true;
+    }
+
     var lateHint = _fixBuilder._variables.getLateHint(source, node);
     if (lateHint != null) {
       (_fixBuilder._getChange(node) as NodeChangeForVariableDeclarationList)
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
similarity index 92%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
rename to pkg/nnbd_migration/lib/src/front_end/info_builder.dart
index 69506b5..e436326 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
@@ -4,13 +4,6 @@
 
 import 'dart:collection';
 
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
-import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
-import 'package:analysis_server/src/edit/fix/non_nullable_fix.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_information.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/offset_mapper.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/file_system/file_system.dart';
@@ -18,11 +11,17 @@
     show SourceFileEdit;
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
+import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
 import 'package:meta/meta.dart';
+import 'package:nnbd_migration/api_for_analysis_server/dartfix_listener_interface.dart';
+import 'package:nnbd_migration/api_for_analysis_server/driver_provider.dart';
 import 'package:nnbd_migration/fix_reason_target.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
 import 'package:nnbd_migration/src/edit_plan.dart';
+import 'package:nnbd_migration/src/front_end/instrumentation_information.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/offset_mapper.dart';
 
 /// A builder used to build the migration information for a library.
 class InfoBuilder {
@@ -36,10 +35,7 @@
   final InstrumentationInformation info;
 
   /// The listener used to gather the changes to be applied.
-  final DartFixListener listener;
-
-  /// The dartfix adapter, which can be used to report exceptions that occur.
-  final NullabilityMigrationAdapter adapter;
+  final DartFixListenerInterface listener;
 
   /// The [NullabilityMigration] instance for this migration.
   final NullabilityMigration migration;
@@ -50,10 +46,10 @@
 
   /// Initialize a newly created builder.
   InfoBuilder(this.provider, this.includedPath, this.info, this.listener,
-      this.adapter, this.migration);
+      this.migration);
 
-  /// The analysis server used to get information about libraries.
-  AnalysisServer get server => listener.server;
+  /// The provider used to get information about libraries.
+  DriverProvider get driverProvider => listener.server;
 
   /// Return the migration information for all of the libraries that were
   /// migrated.
@@ -63,7 +59,7 @@
         SplayTreeSet<UnitInfo>((u1, u2) => u1.path.compareTo(u2.path));
     for (var source in sourceInfoMap.keys) {
       var filePath = source.fullName;
-      var session = server.getAnalysisDriver(filePath).currentSession;
+      var session = driverProvider.getAnalysisSession(filePath);
       if (!session.getFile(filePath).isPart) {
         var result = await session.getResolvedLibrary(filePath);
         for (var unitResult in result.units) {
@@ -185,6 +181,10 @@
         edits.add(_removeHint('Remove /*!*/ hint'));
         edits.add(_changeHint('Change to /*?*/ hint', '/*?*/'));
         break;
+      case NullabilityFixKind.addLate:
+        // We could add an edit to add a `/*?*/` hint, but the offset is a
+        // little tricky.
+        break;
       case NullabilityFixKind.nullAwarenessUnnecessaryInStrongMode:
       case NullabilityFixKind.conditionTrueInStrongMode:
       case NullabilityFixKind.conditionFalseInStrongMode:
@@ -322,9 +322,11 @@
         var info = edit.info;
         var edits = info != null
             ? _computeEdits(info, sourceOffset, result.content)
-            : [];
+            : <EditDetail>[];
         var lineNumber = lineInfo.getLocation(sourceOffset).lineNumber;
-        var traces = info == null ? const [] : _computeTraces(info.fixReasons);
+        var traces = info == null
+            ? const <TraceInfo>[]
+            : _computeTraces(info.fixReasons);
         var description = info?.description;
         var hint = info?.hintComment;
         var isCounted = hint == null || hintsSeen.add(hint);
@@ -435,10 +437,14 @@
       if (enclosingNode is ConstructorDeclaration) {
         if (enclosingNode.name == null) {
           return _describeClassOrExtensionMember(
-              enclosingNode.parent, 'the default constructor of', '');
+              enclosingNode.parent as CompilationUnitMember,
+              'the default constructor of',
+              '');
         } else {
           return _describeClassOrExtensionMember(
-              enclosingNode.parent, 'the constructor', enclosingNode.name.name);
+              enclosingNode.parent as CompilationUnitMember,
+              'the constructor',
+              enclosingNode.name.name);
         }
       } else if (enclosingNode is MethodDeclaration) {
         var functionName = enclosingNode.name.name;
@@ -454,7 +460,9 @@
           baseDescription = 'the method';
         }
         return _describeClassOrExtensionMember(
-            enclosingNode.parent, baseDescription, functionName);
+            enclosingNode.parent as CompilationUnitMember,
+            baseDescription,
+            functionName);
       } else if (enclosingNode is FunctionDeclaration &&
           enclosingNode.parent is CompilationUnit) {
         var functionName = enclosingNode.name.name;
@@ -511,7 +519,9 @@
     var grandParent = parent.parent;
     if (grandParent is FieldDeclaration) {
       return _describeClassOrExtensionMember(
-          grandParent.parent, 'the field', variableName);
+          grandParent.parent as CompilationUnitMember,
+          'the field',
+          variableName);
     } else if (grandParent is TopLevelVariableDeclaration) {
       return "the variable '$variableName'";
     } else {
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_information.dart b/pkg/nnbd_migration/lib/src/front_end/instrumentation_information.dart
similarity index 100%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_information.dart
rename to pkg/nnbd_migration/lib/src/front_end/instrumentation_information.dart
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_listener.dart b/pkg/nnbd_migration/lib/src/front_end/instrumentation_listener.dart
similarity index 97%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_listener.dart
rename to pkg/nnbd_migration/lib/src/front_end/instrumentation_listener.dart
index 933b7b5..fbbbbcf 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_listener.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/instrumentation_listener.dart
@@ -2,13 +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:analysis_server/src/edit/nnbd_migration/instrumentation_information.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/src/generated/source.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/src/edit_plan.dart';
+import 'package:nnbd_migration/src/front_end/instrumentation_information.dart';
 
 /// A listener used to gather instrumentation information from the migration
 /// engine.
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart b/pkg/nnbd_migration/lib/src/front_end/instrumentation_renderer.dart
similarity index 91%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
rename to pkg/nnbd_migration/lib/src/front_end/instrumentation_renderer.dart
index 6eb9fd4..e5538ea 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/instrumentation_renderer.dart
@@ -4,9 +4,9 @@
 
 import 'dart:io';
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/resources/resources.g.dart'
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
+import 'package:nnbd_migration/src/front_end/resources/resources.g.dart'
     as resources;
 import 'package:path/path.dart' as path;
 
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart b/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
similarity index 97%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
rename to pkg/nnbd_migration/lib/src/front_end/migration_info.dart
index adb8601..cafab98 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
@@ -2,15 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/nnbd_migration/offset_mapper.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/unit_link.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:collection/collection.dart';
 import 'package:crypto/crypto.dart';
 import 'package:meta/meta.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
+import 'package:nnbd_migration/src/front_end/offset_mapper.dart';
+import 'package:nnbd_migration/src/front_end/unit_link.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 import 'package:path/path.dart' as path;
 
 /// A description of an edit that can be applied before rerunning the migration
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_state.dart b/pkg/nnbd_migration/lib/src/front_end/migration_state.dart
similarity index 72%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/migration_state.dart
rename to pkg/nnbd_migration/lib/src/front_end/migration_state.dart
index 53b0a73..1d714bd 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_state.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/migration_state.dart
@@ -2,13 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
-import 'package:analysis_server/src/edit/fix/non_nullable_fix.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/info_builder.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_listener.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
+import 'package:nnbd_migration/api_for_analysis_server/dartfix_listener_interface.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
+import 'package:nnbd_migration/src/front_end/info_builder.dart';
+import 'package:nnbd_migration/src/front_end/instrumentation_listener.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
 
 /// The state of an NNBD migration.
 class MigrationState {
@@ -17,14 +16,11 @@
   /// The migration associated with the state.
   final NullabilityMigration migration;
 
-  /// The adapter to dartfix for this migration.
-  final NullabilityMigrationAdapter adapter;
-
   /// The root directory that contains all of the files that were migrated.
   final String includedRoot;
 
   /// The listener used to collect fixes.
-  final DartFixListener listener;
+  final DartFixListenerInterface listener;
 
   /// The listener that collected information during the migration.
   final InstrumentationListener instrumentationListener;
@@ -40,7 +36,7 @@
 
   /// Initialize a newly created migration state with the given values.
   MigrationState(this.migration, this.includedRoot, this.listener,
-      this.instrumentationListener, this.adapter);
+      this.instrumentationListener);
 
   /// If the migration has been applied to disk.
   bool get hasBeenApplied => _hasBeenApplied;
@@ -56,7 +52,7 @@
     assert(!hasBeenApplied);
     var provider = listener.server.resourceProvider;
     var infoBuilder = InfoBuilder(provider, includedRoot,
-        instrumentationListener.data, listener, adapter, migration);
+        instrumentationListener.data, listener, migration);
     var unitInfos = await infoBuilder.explainMigration();
     var pathContext = provider.pathContext;
     migrationInfo = MigrationInfo(
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/navigation_tree_renderer.dart b/pkg/nnbd_migration/lib/src/front_end/navigation_tree_renderer.dart
similarity index 87%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/navigation_tree_renderer.dart
rename to pkg/nnbd_migration/lib/src/front_end/navigation_tree_renderer.dart
index 124a631..09d975c 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/navigation_tree_renderer.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/navigation_tree_renderer.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/unit_link.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/web/navigation_tree.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
+import 'package:nnbd_migration/src/front_end/unit_link.dart';
+import 'package:nnbd_migration/src/front_end/web/navigation_tree.dart';
 import 'package:path/path.dart' as path;
 
 /// Groups the items in [iterable] by the result of applying [groupFn] to each
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/offset_mapper.dart b/pkg/nnbd_migration/lib/src/front_end/offset_mapper.dart
similarity index 100%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/offset_mapper.dart
rename to pkg/nnbd_migration/lib/src/front_end/offset_mapper.dart
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/path_mapper.dart b/pkg/nnbd_migration/lib/src/front_end/path_mapper.dart
similarity index 100%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/path_mapper.dart
rename to pkg/nnbd_migration/lib/src/front_end/path_mapper.dart
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/region_renderer.dart b/pkg/nnbd_migration/lib/src/front_end/region_renderer.dart
similarity index 93%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/region_renderer.dart
rename to pkg/nnbd_migration/lib/src/front_end/region_renderer.dart
index 6ac067c3..6b65c50 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/region_renderer.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/region_renderer.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/web/edit_details.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
+import 'package:nnbd_migration/src/front_end/web/edit_details.dart';
 import 'package:path/path.dart' as path;
 
 /// The HTML that is displayed for a region of code.
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/.clang-format b/pkg/nnbd_migration/lib/src/front_end/resources/.clang-format
similarity index 100%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/resources/.clang-format
rename to pkg/nnbd_migration/lib/src/front_end/resources/.clang-format
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/highlight.css b/pkg/nnbd_migration/lib/src/front_end/resources/highlight.css
similarity index 100%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/resources/highlight.css
rename to pkg/nnbd_migration/lib/src/front_end/resources/highlight.css
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/highlight.md b/pkg/nnbd_migration/lib/src/front_end/resources/highlight.md
similarity index 100%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/resources/highlight.md
rename to pkg/nnbd_migration/lib/src/front_end/resources/highlight.md
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/highlight.pack.js b/pkg/nnbd_migration/lib/src/front_end/resources/highlight.pack.js
similarity index 100%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/resources/highlight.pack.js
rename to pkg/nnbd_migration/lib/src/front_end/resources/highlight.pack.js
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html b/pkg/nnbd_migration/lib/src/front_end/resources/index.html
similarity index 86%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
rename to pkg/nnbd_migration/lib/src/front_end/resources/index.html
index 629cb25..a1e8242 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/index.html
@@ -11,6 +11,13 @@
 <div class="rerunning-pane">
   <h1>Rerunning...</h1>
 </div>
+<div class="popup-pane">
+  <div class="close button">X</div>
+  <h2></h2><!-- header placeholder element -->
+  <p></p><!-- subheader placeholder element -->
+  <pre></pre><!-- preformated content placeholder element -->
+  <a class="button bottom" target="_blank">File on GitHub</a><!-- post to github placeholder element -->
+</div>
 <p class="root">{{ root }}</p>
 <header class="elevation-z4">
     <h1 class="before-apply">Proposed null safety changes</h1>
@@ -65,6 +72,7 @@
         migration help</a>
     <span class="wide"> </span>
     <div>Based on {{ sdkVersion }}</div>
+    <button class="report-problem">Report a Problem</button>
 </footer>
 </body>
 </html>
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css b/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
similarity index 87%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
rename to pkg/nnbd_migration/lib/src/front_end/resources/migration.css
index c857fab..41940da 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
@@ -65,6 +65,11 @@
   margin: 10px;
 }
 
+footer .report-problem {
+  right: 0px;
+  margin: 4px 8px;
+}
+
 .rerun-migration .required {
   display: none;
 }
@@ -113,7 +118,7 @@
   display: flex;
   flex-direction: row;
   align-items: center;
-  padding: 8px 24px;
+  padding: 8px 0 8px 24px;
 }
 
 footer .wide {
@@ -402,6 +407,60 @@
   cursor: pointer;
 }
 
+.popup-pane {
+  display: none;
+  position: fixed;
+  top: 150px;
+  left: 150px;
+  right: 150px;
+  bottom: 150px;
+  border: 1px solid black;
+  border-top: 2px solid black;
+  border-radius: 7px;
+  box-shadow: 0px 0px 20px 2px #b4bfcb22;
+  z-index: 1;
+  background: #2b3036;
+  padding: 20px;
+}
+
+.popup-pane .close {
+  position: absolute;
+  right: 10px;
+  top: 10px;
+  cursor: pointer;
+  text-shadow: 1px 1px 2px #888;
+  box-shadow: 1px 1px 2px #111;
+}
+
+.popup-pane h2 {
+  padding: 21px;
+  height: 10%;
+  margin: 0px;
+  box-sizing: border-box;
+}
+
+.popup-pane p {
+  height: 10%;
+  box-sizing: border-box;
+  padding: 0px 20px;
+}
+
+.popup-pane pre {
+  background: #282b2e;
+  padding: 20px;
+  bottom: 0px;
+  overflow: auto scroll;
+  height: 65%;
+  margin: 0px;
+  box-sizing: border-box;
+}
+
+.popup-pane .button.bottom {
+  margin: 20px 0px;
+  display: block;
+  text-align: center;
+}
+
 .rerunning-pane {
   display: none;
 }
@@ -466,12 +525,12 @@
   fill: #fff;
 }
 
-a.post-link {
+.add-hint-link {
   display: inline-block;
   margin: 3px;
 }
 
-button, a.post-link {
+button, a.button {
   background-color: #33ccff;
   border: 2px solid #37aedc;
   border-radius: 3px;
@@ -480,7 +539,7 @@
   color: #282828;
 }
 
-button:hover, a.post-link:hover {
+button:hover, .button:hover {
   background-color: #80dfff;
   border: 2px solid #52b8e0;
   cursor: pointer;
diff --git a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
new file mode 100644
index 0000000..2285f5c
--- /dev/null
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
@@ -0,0 +1,4158 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This file is generated; don't edit it directly.
+//
+// See pkg/nnbd_migration/tool/codegen/generate_resources.dart for how
+// to edit the source content and for re-generation instructions.
+
+import 'dart:convert' as convert;
+
+String get highlight_css {
+  return _highlight_css ??= _decode(_highlight_css_base64);
+}
+
+String get highlight_pack_js {
+  return _highlight_pack_js ??= _decode(_highlight_pack_js_base64);
+}
+
+String get index_html {
+  return _index_html ??= _decode(_index_html_base64);
+}
+
+String get migration_css {
+  return _migration_css ??= _decode(_migration_css_base64);
+}
+
+String get migration_js {
+  return _migration_js ??= _decode(_migration_js_base64);
+}
+
+String _decode(String data) {
+  data = data.replaceAll('\n', '').trim();
+  return String.fromCharCodes(convert.base64Decode(data));
+}
+
+String _highlight_css;
+// highlight_css md5 is 'fb012626bafd286510d32da815dae448'
+String _highlight_css_base64 = '''
+LyoKRGF0ZTogMjQgRmV2IDIwMTUKQXV0aG9yOiBQZWRybyBPbGl2ZWlyYSA8a2FueXR1QGdtYWlsIC4g
+Y29tPgoqLwoKLmhsanMgewogIGNvbG9yOiAjYTliN2M2OwogIGJhY2tncm91bmQ6ICMyODJiMmU7CiAg
+ZGlzcGxheTogYmxvY2s7CiAgb3ZlcmZsb3cteDogYXV0bzsKICBwYWRkaW5nOiAwLjVlbTsKfQoKLmhs
+anMtbnVtYmVyLAouaGxqcy1saXRlcmFsLAouaGxqcy1zeW1ib2wsCi5obGpzLWJ1bGxldCB7CiAgY29s
+b3I6ICM2ODk3QkI7Cn0KCi5obGpzLWtleXdvcmQsCi5obGpzLXNlbGVjdG9yLXRhZywKLmhsanMtZGVs
+ZXRpb24gewogIGNvbG9yOiAjY2M3ODMyOwp9CgouaGxqcy12YXJpYWJsZSwKLmhsanMtdGVtcGxhdGUt
+dmFyaWFibGUsCi5obGpzLWxpbmsgewogIGNvbG9yOiAjNjI5NzU1Owp9CgouaGxqcy1jb21tZW50LAou
+aGxqcy1xdW90ZSB7CiAgY29sb3I6ICM4MDgwODA7Cn0KCi5obGpzLW1ldGEgewogIGNvbG9yOiAjYmJi
+NTI5Owp9CgouaGxqcy1zdHJpbmcsCi5obGpzLWF0dHJpYnV0ZSwKLmhsanMtYWRkaXRpb24gewogIGNv
+bG9yOiAjNkE4NzU5Owp9CgouaGxqcy1zZWN0aW9uLAouaGxqcy10aXRsZSwKLmhsanMtdHlwZSB7CiAg
+Y29sb3I6ICNmZmM2NmQ7Cn0KCi5obGpzLW5hbWUsCi5obGpzLXNlbGVjdG9yLWlkLAouaGxqcy1zZWxl
+Y3Rvci1jbGFzcyB7CiAgY29sb3I6ICNlOGJmNmE7Cn0KCi5obGpzLWVtcGhhc2lzIHsKICBmb250LXN0
+eWxlOiBpdGFsaWM7Cn0KCi5obGpzLXN0cm9uZyB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0K
+''';
+
+String _highlight_pack_js;
+// highlight_pack_js md5 is '9104bfe8b056f8e00da50b0ea3d6e6d4'
+String _highlight_pack_js_base64 = '''
+LyohIGhpZ2hsaWdodC5qcyB2OS4xNS4xMCB8IEJTRDMgTGljZW5zZSB8IGdpdC5pby9obGpzbGljZW5z
+ZSAqLwohZnVuY3Rpb24oZSl7dmFyIG49Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvd3x8Im9i
+amVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmOyJ1bmRlZmluZWQiPT10eXBlb2YgZXhwb3J0c3x8ZXhwb3J0
+cy5ub2RlVHlwZT9uJiYobi5obGpzPWUoe30pLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmlu
+ZS5hbWQmJmRlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBuLmhsanN9KSk6ZShleHBvcnRzKX0oZnVu
+Y3Rpb24oYSl7dmFyIGY9W10sdT1PYmplY3Qua2V5cyxOPXt9LGM9e30sbj0vXihuby0/aGlnaGxpZ2h0
+fHBsYWlufHRleHQpJC9pLHM9L1xibGFuZyg/OnVhZ2UpPy0oW1x3LV0rKVxiL2ksdD0vKCheKDxbXj5d
+Kz58XHR8KSt8KD86XG4pKSkvZ20scj17Y2FzZV9pbnNlbnNpdGl2ZToiY0kiLGxleGVtZXM6ImwiLGNv
+bnRhaW5zOiJjIixrZXl3b3JkczoiayIsc3ViTGFuZ3VhZ2U6InNMIixjbGFzc05hbWU6ImNOIixiZWdp
+bjoiYiIsYmVnaW5LZXl3b3JkczoiYksiLGVuZDoiZSIsZW5kc1dpdGhQYXJlbnQ6ImVXIixpbGxlZ2Fs
+OiJpIixleGNsdWRlQmVnaW46ImVCIixleGNsdWRlRW5kOiJlRSIscmV0dXJuQmVnaW46InJCIixyZXR1
+cm5FbmQ6InJFIixyZWxldmFuY2U6InIiLHZhcmlhbnRzOiJ2IixJREVOVF9SRToiSVIiLFVOREVSU0NP
+UkVfSURFTlRfUkU6IlVJUiIsTlVNQkVSX1JFOiJOUiIsQ19OVU1CRVJfUkU6IkNOUiIsQklOQVJZX05V
+TUJFUl9SRToiQk5SIixSRV9TVEFSVEVSU19SRToiUlNSIixCQUNLU0xBU0hfRVNDQVBFOiJCRSIsQVBP
+U19TVFJJTkdfTU9ERToiQVNNIixRVU9URV9TVFJJTkdfTU9ERToiUVNNIixQSFJBU0FMX1dPUkRTX01P
+REU6IlBXTSIsQ19MSU5FX0NPTU1FTlRfTU9ERToiQ0xDTSIsQ19CTE9DS19DT01NRU5UX01PREU6IkNC
+Q00iLEhBU0hfQ09NTUVOVF9NT0RFOiJIQ00iLE5VTUJFUl9NT0RFOiJOTSIsQ19OVU1CRVJfTU9ERToi
+Q05NIixCSU5BUllfTlVNQkVSX01PREU6IkJOTSIsQ1NTX05VTUJFUl9NT0RFOiJDU1NOTSIsUkVHRVhQ
+X01PREU6IlJNIixUSVRMRV9NT0RFOiJUTSIsVU5ERVJTQ09SRV9USVRMRV9NT0RFOiJVVE0iLENPTU1F
+TlQ6IkMiLGJlZ2luUmU6ImJSIixlbmRSZToiZVIiLGlsbGVnYWxSZToiaVIiLGxleGVtZXNSZToibFIi
+LHRlcm1pbmF0b3JzOiJ0Iix0ZXJtaW5hdG9yX2VuZDoidEUifSxiPSI8L3NwYW4+IixoPXtjbGFzc1By
+ZWZpeDoiaGxqcy0iLHRhYlJlcGxhY2U6bnVsbCx1c2VCUjohMSxsYW5ndWFnZXM6dm9pZCAwfTtmdW5j
+dGlvbiBfKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsi
+KS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiBFKGUpe3JldHVybiBlLm5vZGVOYW1lLnRvTG93
+ZXJDYXNlKCl9ZnVuY3Rpb24gdihlLG4pe3ZhciB0PWUmJmUuZXhlYyhuKTtyZXR1cm4gdCYmMD09PXQu
+aW5kZXh9ZnVuY3Rpb24gbChlKXtyZXR1cm4gbi50ZXN0KGUpfWZ1bmN0aW9uIGcoZSl7dmFyIG4sdD17
+fSxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtmb3IobiBpbiBlKXRbbl09
+ZVtuXTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZvcihuIGluIGUpdFtuXT1lW25dfSksdH1m
+dW5jdGlvbiBSKGUpe3ZhciBhPVtdO3JldHVybiBmdW5jdGlvbiBlKG4sdCl7Zm9yKHZhciByPW4uZmly
+c3RDaGlsZDtyO3I9ci5uZXh0U2libGluZykzPT09ci5ub2RlVHlwZT90Kz1yLm5vZGVWYWx1ZS5sZW5n
+dGg6MT09PXIubm9kZVR5cGUmJihhLnB1c2goe2V2ZW50OiJzdGFydCIsb2Zmc2V0OnQsbm9kZTpyfSks
+dD1lKHIsdCksRShyKS5tYXRjaCgvYnJ8aHJ8aW1nfGlucHV0Lyl8fGEucHVzaCh7ZXZlbnQ6InN0b3Ai
+LG9mZnNldDp0LG5vZGU6cn0pKTtyZXR1cm4gdH0oZSwwKSxhfWZ1bmN0aW9uIGkoZSl7aWYociYmIWUu
+bGFuZ0FwaVJlc3RvcmVkKXtmb3IodmFyIG4gaW4gZS5sYW5nQXBpUmVzdG9yZWQ9ITAscillW25dJiYo
+ZVtyW25dXT1lW25dKTsoZS5jfHxbXSkuY29uY2F0KGUudnx8W10pLmZvckVhY2goaSl9fWZ1bmN0aW9u
+IG0obyl7ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZSYmZS5zb3VyY2V8fGV9ZnVuY3Rpb24gYyhlLG4pe3Jl
+dHVybiBuZXcgUmVnRXhwKHMoZSksIm0iKyhvLmNJPyJpIjoiIikrKG4/ImciOiIiKSl9IWZ1bmN0aW9u
+IG4odCxlKXtpZighdC5jb21waWxlZCl7aWYodC5jb21waWxlZD0hMCx0Lms9dC5rfHx0LmJLLHQuayl7
+ZnVuY3Rpb24gcih0LGUpe28uY0kmJihlPWUudG9Mb3dlckNhc2UoKSksZS5zcGxpdCgiICIpLmZvckVh
+Y2goZnVuY3Rpb24oZSl7dmFyIG49ZS5zcGxpdCgifCIpO2FbblswXV09W3QsblsxXT9OdW1iZXIoblsx
+XSk6MV19KX12YXIgYT17fTsic3RyaW5nIj09dHlwZW9mIHQuaz9yKCJrZXl3b3JkIix0LmspOnUodC5r
+KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IoZSx0LmtbZV0pfSksdC5rPWF9dC5sUj1jKHQubHx8L1x3Ky8s
+ITApLGUmJih0LmJLJiYodC5iPSJcXGIoIit0LmJLLnNwbGl0KCIgIikuam9pbigifCIpKyIpXFxiIiks
+dC5ifHwodC5iPS9cQnxcYi8pLHQuYlI9Yyh0LmIpLHQuZW5kU2FtZUFzQmVnaW4mJih0LmU9dC5iKSx0
+LmV8fHQuZVd8fCh0LmU9L1xCfFxiLyksdC5lJiYodC5lUj1jKHQuZSkpLHQudEU9cyh0LmUpfHwiIix0
+LmVXJiZlLnRFJiYodC50RSs9KHQuZT8ifCI6IiIpK2UudEUpKSx0LmkmJih0LmlSPWModC5pKSksbnVs
+bD09dC5yJiYodC5yPTEpLHQuY3x8KHQuYz1bXSksdC5jPUFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBw
+bHkoW10sdC5jLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4udiYmIW4u
+Y2FjaGVkX3ZhcmlhbnRzJiYobi5jYWNoZWRfdmFyaWFudHM9bi52Lm1hcChmdW5jdGlvbihlKXtyZXR1
+cm4gZyhuLHt2Om51bGx9LGUpfSkpLG4uY2FjaGVkX3ZhcmlhbnRzfHxuLmVXJiZbZyhuKV18fFtuXX0o
+InNlbGYiPT09ZT90OmUpfSkpLHQuYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe24oZSx0KX0pLHQuc3RhcnRz
+JiZuKHQuc3RhcnRzLGUpO3ZhciBpPXQuYy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYks/IlxcLj8o
+PzoiK2UuYisiKVxcLj8iOmUuYn0pLmNvbmNhdChbdC50RSx0LmldKS5tYXAocykuZmlsdGVyKEJvb2xl
+YW4pO3QudD1pLmxlbmd0aD9jKGZ1bmN0aW9uKGUsbil7Zm9yKHZhciB0PS9cWyg/OlteXFxcXV18XFwu
+KSpcXXxcKFw/P3xcXChbMS05XVswLTldKil8XFwuLyxyPTAsYT0iIixpPTA7aTxlLmxlbmd0aDtpKysp
+e3ZhciBvPXIsYz1zKGVbaV0pO2ZvcigwPGkmJihhKz1uKTswPGMubGVuZ3RoOyl7dmFyIHU9dC5leGVj
+KGMpO2lmKG51bGw9PXUpe2ErPWM7YnJlYWt9YSs9Yy5zdWJzdHJpbmcoMCx1LmluZGV4KSxjPWMuc3Vi
+c3RyaW5nKHUuaW5kZXgrdVswXS5sZW5ndGgpLCJcXCI9PXVbMF1bMF0mJnVbMV0/YSs9IlxcIitTdHJp
+bmcoTnVtYmVyKHVbMV0pK28pOihhKz11WzBdLCIoIj09dVswXSYmcisrKX19cmV0dXJuIGF9KGksInwi
+KSwhMCk6e2V4ZWM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19fX0obyl9ZnVuY3Rpb24gQyhlLG4saSx0
+KXtmdW5jdGlvbiBjKGUsbix0LHIpe3ZhciBhPSc8c3BhbiBjbGFzcz0iJysocj8iIjpoLmNsYXNzUHJl
+Zml4KTtyZXR1cm4gZT8oYSs9ZSsnIj4nKStuKyh0PyIiOmIpOm59ZnVuY3Rpb24gbygpe0UrPW51bGwh
+PWwuc0w/ZnVuY3Rpb24oKXt2YXIgZT0ic3RyaW5nIj09dHlwZW9mIGwuc0w7aWYoZSYmIU5bbC5zTF0p
+cmV0dXJuIF8oZyk7dmFyIG49ZT9DKGwuc0wsZywhMCxmW2wuc0xdKTpPKGcsbC5zTC5sZW5ndGg/bC5z
+TDp2b2lkIDApO3JldHVybiAwPGwuciYmKFIrPW4uciksZSYmKGZbbC5zTF09bi50b3ApLGMobi5sYW5n
+dWFnZSxuLnZhbHVlLCExLCEwKX0oKTpmdW5jdGlvbigpe3ZhciBlLG4sdCxyLGEsaSxvO2lmKCFsLmsp
+cmV0dXJuIF8oZyk7Zm9yKHI9IiIsbj0wLGwubFIubGFzdEluZGV4PTAsdD1sLmxSLmV4ZWMoZyk7dDsp
+cis9XyhnLnN1YnN0cmluZyhuLHQuaW5kZXgpKSxhPWwsaT10LHZvaWQgMCxvPXMuY0k/aVswXS50b0xv
+d2VyQ2FzZSgpOmlbMF0sKGU9YS5rLmhhc093blByb3BlcnR5KG8pJiZhLmtbb10pPyhSKz1lWzFdLHIr
+PWMoZVswXSxfKHRbMF0pKSk6cis9Xyh0WzBdKSxuPWwubFIubGFzdEluZGV4LHQ9bC5sUi5leGVjKGcp
+O3JldHVybiByK18oZy5zdWJzdHIobikpfSgpLGc9IiJ9ZnVuY3Rpb24gdShlKXtFKz1lLmNOP2MoZS5j
+TiwiIiwhMCk6IiIsbD1PYmplY3QuY3JlYXRlKGUse3BhcmVudDp7dmFsdWU6bH19KX1mdW5jdGlvbiBy
+KGUsbil7aWYoZys9ZSxudWxsPT1uKXJldHVybiBvKCksMDt2YXIgdD1mdW5jdGlvbihlLG4pe3ZhciB0
+LHIsYTtmb3IodD0wLHI9bi5jLmxlbmd0aDt0PHI7dCsrKWlmKHYobi5jW3RdLmJSLGUpKXJldHVybiBu
+LmNbdF0uZW5kU2FtZUFzQmVnaW4mJihuLmNbdF0uZVI9KGE9bi5jW3RdLmJSLmV4ZWMoZSlbMF0sbmV3
+IFJlZ0V4cChhLnJlcGxhY2UoL1stXC9cXF4kKis/LigpfFtcXXt9XS9nLCJcXCQmIiksIm0iKSkpLG4u
+Y1t0XX0obixsKTtpZih0KXJldHVybiB0LnNraXA/Zys9bjoodC5lQiYmKGcrPW4pLG8oKSx0LnJCfHx0
+LmVCfHwoZz1uKSksdSh0KSx0LnJCPzA6bi5sZW5ndGg7dmFyIHI9ZnVuY3Rpb24gZShuLHQpe2lmKHYo
+bi5lUix0KSl7Zm9yKDtuLmVuZHNQYXJlbnQmJm4ucGFyZW50OyluPW4ucGFyZW50O3JldHVybiBufWlm
+KG4uZVcpcmV0dXJuIGUobi5wYXJlbnQsdCl9KGwsbik7aWYocil7dmFyIGE9bDtmb3IoYS5za2lwP2cr
+PW46KGEuckV8fGEuZUV8fChnKz1uKSxvKCksYS5lRSYmKGc9bikpO2wuY04mJihFKz1iKSxsLnNraXB8
+fGwuc0x8fChSKz1sLnIpLChsPWwucGFyZW50KSE9PXIucGFyZW50Oyk7cmV0dXJuIHIuc3RhcnRzJiYo
+ci5lbmRTYW1lQXNCZWdpbiYmKHIuc3RhcnRzLmVSPXIuZVIpLHUoci5zdGFydHMpKSxhLnJFPzA6bi5s
+ZW5ndGh9aWYoZnVuY3Rpb24oZSxuKXtyZXR1cm4haSYmdihuLmlSLGUpfShuLGwpKXRocm93IG5ldyBF
+cnJvcignSWxsZWdhbCBsZXhlbWUgIicrbisnIiBmb3IgbW9kZSAiJysobC5jTnx8Ijx1bm5hbWVkPiIp
+KyciJyk7cmV0dXJuIGcrPW4sbi5sZW5ndGh8fDF9dmFyIHM9QihlKTtpZighcyl0aHJvdyBuZXcgRXJy
+b3IoJ1Vua25vd24gbGFuZ3VhZ2U6ICInK2UrJyInKTttKHMpO3ZhciBhLGw9dHx8cyxmPXt9LEU9IiI7
+Zm9yKGE9bDthIT09czthPWEucGFyZW50KWEuY04mJihFPWMoYS5jTiwiIiwhMCkrRSk7dmFyIGc9IiIs
+Uj0wO3RyeXtmb3IodmFyIGQscCxNPTA7bC50Lmxhc3RJbmRleD1NLGQ9bC50LmV4ZWMobik7KXA9cihu
+LnN1YnN0cmluZyhNLGQuaW5kZXgpLGRbMF0pLE09ZC5pbmRleCtwO2ZvcihyKG4uc3Vic3RyKE0pKSxh
+PWw7YS5wYXJlbnQ7YT1hLnBhcmVudClhLmNOJiYoRSs9Yik7cmV0dXJue3I6Uix2YWx1ZTpFLGxhbmd1
+YWdlOmUsdG9wOmx9fWNhdGNoKGUpe2lmKGUubWVzc2FnZSYmLTEhPT1lLm1lc3NhZ2UuaW5kZXhPZigi
+SWxsZWdhbCIpKXJldHVybntyOjAsdmFsdWU6XyhuKX07dGhyb3cgZX19ZnVuY3Rpb24gTyh0LGUpe2U9
+ZXx8aC5sYW5ndWFnZXN8fHUoTik7dmFyIHI9e3I6MCx2YWx1ZTpfKHQpfSxhPXI7cmV0dXJuIGUuZmls
+dGVyKEIpLmZpbHRlcihNKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPUMoZSx0LCExKTtuLmxhbmd1
+YWdlPWUsbi5yPmEuciYmKGE9biksbi5yPnIuciYmKGE9cixyPW4pfSksYS5sYW5ndWFnZSYmKHIuc2Vj
+b25kX2Jlc3Q9YSkscn1mdW5jdGlvbiBkKGUpe3JldHVybiBoLnRhYlJlcGxhY2V8fGgudXNlQlI/ZS5y
+ZXBsYWNlKHQsZnVuY3Rpb24oZSxuKXtyZXR1cm4gaC51c2VCUiYmIlxuIj09PWU/Ijxicj4iOmgudGFi
+UmVwbGFjZT9uLnJlcGxhY2UoL1x0L2csaC50YWJSZXBsYWNlKToiIn0pOmV9ZnVuY3Rpb24gbyhlKXt2
+YXIgbix0LHIsYSxpLG89ZnVuY3Rpb24oZSl7dmFyIG4sdCxyLGEsaT1lLmNsYXNzTmFtZSsiICI7aWYo
+aSs9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5jbGFzc05hbWU6IiIsdD1zLmV4ZWMoaSkpcmV0dXJu
+IEIodFsxXSk/dFsxXToibm8taGlnaGxpZ2h0Ijtmb3Iobj0wLHI9KGk9aS5zcGxpdCgvXHMrLykpLmxl
+bmd0aDtuPHI7bisrKWlmKGwoYT1pW25dKXx8QihhKSlyZXR1cm4gYX0oZSk7bChvKXx8KGgudXNlQlI/
+KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwi
+ZGl2IikpLmlubmVySFRNTD1lLmlubmVySFRNTC5yZXBsYWNlKC9cbi9nLCIiKS5yZXBsYWNlKC88YnJb
+IFwvXSo+L2csIlxuIik6bj1lLGk9bi50ZXh0Q29udGVudCxyPW8/QyhvLGksITApOk8oaSksKHQ9Uihu
+KSkubGVuZ3RoJiYoKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8x
+OTk5L3hodG1sIiwiZGl2IikpLmlubmVySFRNTD1yLnZhbHVlLHIudmFsdWU9ZnVuY3Rpb24oZSxuLHQp
+e3ZhciByPTAsYT0iIixpPVtdO2Z1bmN0aW9uIG8oKXtyZXR1cm4gZS5sZW5ndGgmJm4ubGVuZ3RoP2Vb
+MF0ub2Zmc2V0IT09blswXS5vZmZzZXQ/ZVswXS5vZmZzZXQ8blswXS5vZmZzZXQ/ZTpuOiJzdGFydCI9
+PT1uWzBdLmV2ZW50P2U6bjplLmxlbmd0aD9lOm59ZnVuY3Rpb24gYyhlKXthKz0iPCIrRShlKStmLm1h
+cC5jYWxsKGUuYXR0cmlidXRlcyxmdW5jdGlvbihlKXtyZXR1cm4iICIrZS5ub2RlTmFtZSsnPSInK18o
+ZS52YWx1ZSkucmVwbGFjZSgnIicsIiZxdW90OyIpKyciJ30pLmpvaW4oIiIpKyI+In1mdW5jdGlvbiB1
+KGUpe2ErPSI8LyIrRShlKSsiPiJ9ZnVuY3Rpb24gcyhlKXsoInN0YXJ0Ij09PWUuZXZlbnQ/Yzp1KShl
+Lm5vZGUpfWZvcig7ZS5sZW5ndGh8fG4ubGVuZ3RoOyl7dmFyIGw9bygpO2lmKGErPV8odC5zdWJzdHJp
+bmcocixsWzBdLm9mZnNldCkpLHI9bFswXS5vZmZzZXQsbD09PWUpe2ZvcihpLnJldmVyc2UoKS5mb3JF
+YWNoKHUpO3MobC5zcGxpY2UoMCwxKVswXSksKGw9bygpKT09PWUmJmwubGVuZ3RoJiZsWzBdLm9mZnNl
+dD09PXI7KTtpLnJldmVyc2UoKS5mb3JFYWNoKGMpfWVsc2Uic3RhcnQiPT09bFswXS5ldmVudD9pLnB1
+c2gobFswXS5ub2RlKTppLnBvcCgpLHMobC5zcGxpY2UoMCwxKVswXSl9cmV0dXJuIGErXyh0LnN1YnN0
+cihyKSl9KHQsUihhKSxpKSksci52YWx1ZT1kKHIudmFsdWUpLGUuaW5uZXJIVE1MPXIudmFsdWUsZS5j
+bGFzc05hbWU9ZnVuY3Rpb24oZSxuLHQpe3ZhciByPW4/Y1tuXTp0LGE9W2UudHJpbSgpXTtyZXR1cm4g
+ZS5tYXRjaCgvXGJobGpzXGIvKXx8YS5wdXNoKCJobGpzIiksLTE9PT1lLmluZGV4T2YocikmJmEucHVz
+aChyKSxhLmpvaW4oIiAiKS50cmltKCl9KGUuY2xhc3NOYW1lLG8sci5sYW5ndWFnZSksZS5yZXN1bHQ9
+e2xhbmd1YWdlOnIubGFuZ3VhZ2UscmU6ci5yfSxyLnNlY29uZF9iZXN0JiYoZS5zZWNvbmRfYmVzdD17
+bGFuZ3VhZ2U6ci5zZWNvbmRfYmVzdC5sYW5ndWFnZSxyZTpyLnNlY29uZF9iZXN0LnJ9KSl9ZnVuY3Rp
+b24gcCgpe2lmKCFwLmNhbGxlZCl7cC5jYWxsZWQ9ITA7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3Rv
+ckFsbCgicHJlIGNvZGUiKTtmLmZvckVhY2guY2FsbChlLG8pfX1mdW5jdGlvbiBCKGUpe3JldHVybiBl
+PShlfHwiIikudG9Mb3dlckNhc2UoKSxOW2VdfHxOW2NbZV1dfWZ1bmN0aW9uIE0oZSl7dmFyIG49Qihl
+KTtyZXR1cm4gbiYmIW4uZGlzYWJsZUF1dG9kZXRlY3R9cmV0dXJuIGEuaGlnaGxpZ2h0PUMsYS5oaWdo
+bGlnaHRBdXRvPU8sYS5maXhNYXJrdXA9ZCxhLmhpZ2hsaWdodEJsb2NrPW8sYS5jb25maWd1cmU9ZnVu
+Y3Rpb24oZSl7aD1nKGgsZSl9LGEuaW5pdEhpZ2hsaWdodGluZz1wLGEuaW5pdEhpZ2hsaWdodGluZ09u
+TG9hZD1mdW5jdGlvbigpe2FkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHAsITEpLGFk
+ZEV2ZW50TGlzdGVuZXIoImxvYWQiLHAsITEpfSxhLnJlZ2lzdGVyTGFuZ3VhZ2U9ZnVuY3Rpb24obixl
+KXt2YXIgdD1OW25dPWUoYSk7aSh0KSx0LmFsaWFzZXMmJnQuYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9u
+KGUpe2NbZV09bn0pfSxhLmxpc3RMYW5ndWFnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdShOKX0sYS5nZXRM
+YW5ndWFnZT1CLGEuYXV0b0RldGVjdGlvbj1NLGEuaW5oZXJpdD1nLGEuSVI9YS5JREVOVF9SRT0iW2Et
+ekEtWl1cXHcqIixhLlVJUj1hLlVOREVSU0NPUkVfSURFTlRfUkU9IlthLXpBLVpfXVxcdyoiLGEuTlI9
+YS5OVU1CRVJfUkU9IlxcYlxcZCsoXFwuXFxkKyk/IixhLkNOUj1hLkNfTlVNQkVSX1JFPSIoLT8pKFxc
+YjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQr
+KT8pIixhLkJOUj1hLkJJTkFSWV9OVU1CRVJfUkU9IlxcYigwYlswMV0rKSIsYS5SU1I9YS5SRV9TVEFS
+VEVSU19SRT0iIXwhPXwhPT18JXwlPXwmfCYmfCY9fFxcKnxcXCo9fFxcK3xcXCs9fCx8LXwtPXwvPXwv
+fDp8O3w8PHw8PD18PD18PHw9PT18PT18PXw+Pj49fD4+PXw+PXw+Pj58Pj58PnxcXD98XFxbfFxce3xc
+XCh8XFxefFxcXj18XFx8fFxcfD18XFx8XFx8fH4iLGEuQkU9YS5CQUNLU0xBU0hfRVNDQVBFPXtiOiJc
+XFxcW1xcc1xcU10iLHI6MH0sYS5BU009YS5BUE9TX1NUUklOR19NT0RFPXtjTjoic3RyaW5nIixiOiIn
+IixlOiInIixpOiJcXG4iLGM6W2EuQkVdfSxhLlFTTT1hLlFVT1RFX1NUUklOR19NT0RFPXtjTjoic3Ry
+aW5nIixiOiciJyxlOiciJyxpOiJcXG4iLGM6W2EuQkVdfSxhLlBXTT1hLlBIUkFTQUxfV09SRFNfTU9E
+RT17YjovXGIoYXxhbnx0aGV8YXJlfEknbXxpc24ndHxkb24ndHxkb2Vzbid0fHdvbid0fGJ1dHxqdXN0
+fHNob3VsZHxwcmV0dHl8c2ltcGx5fGVub3VnaHxnb25uYXxnb2luZ3x3dGZ8c298c3VjaHx3aWxsfHlv
+dXx5b3VyfHRoZXl8bGlrZXxtb3JlKVxiL30sYS5DPWEuQ09NTUVOVD1mdW5jdGlvbihlLG4sdCl7dmFy
+IHI9YS5pbmhlcml0KHtjTjoiY29tbWVudCIsYjplLGU6bixjOltdfSx0fHx7fSk7cmV0dXJuIHIuYy5w
+dXNoKGEuUFdNKSxyLmMucHVzaCh7Y046ImRvY3RhZyIsYjoiKD86VE9ET3xGSVhNRXxOT1RFfEJVR3xY
+WFgpOiIscjowfSkscn0sYS5DTENNPWEuQ19MSU5FX0NPTU1FTlRfTU9ERT1hLkMoIi8vIiwiJCIpLGEu
+Q0JDTT1hLkNfQkxPQ0tfQ09NTUVOVF9NT0RFPWEuQygiL1xcKiIsIlxcKi8iKSxhLkhDTT1hLkhBU0hf
+Q09NTUVOVF9NT0RFPWEuQygiIyIsIiQiKSxhLk5NPWEuTlVNQkVSX01PREU9e2NOOiJudW1iZXIiLGI6
+YS5OUixyOjB9LGEuQ05NPWEuQ19OVU1CRVJfTU9ERT17Y046Im51bWJlciIsYjphLkNOUixyOjB9LGEu
+Qk5NPWEuQklOQVJZX05VTUJFUl9NT0RFPXtjTjoibnVtYmVyIixiOmEuQk5SLHI6MH0sYS5DU1NOTT1h
+LkNTU19OVU1CRVJfTU9ERT17Y046Im51bWJlciIsYjphLk5SKyIoJXxlbXxleHxjaHxyZW18dnd8dmh8
+dm1pbnx2bWF4fGNtfG1tfGlufHB0fHBjfHB4fGRlZ3xncmFkfHJhZHx0dXJufHN8bXN8SHp8a0h6fGRw
+aXxkcGNtfGRwcHgpPyIscjowfSxhLlJNPWEuUkVHRVhQX01PREU9e2NOOiJyZWdleHAiLGI6L1wvLyxl
+Oi9cL1tnaW11eV0qLyxpOi9cbi8sYzpbYS5CRSx7YjovXFsvLGU6L1xdLyxyOjAsYzpbYS5CRV19XX0s
+YS5UTT1hLlRJVExFX01PREU9e2NOOiJ0aXRsZSIsYjphLklSLHI6MH0sYS5VVE09YS5VTkRFUlNDT1JF
+X1RJVExFX01PREU9e2NOOiJ0aXRsZSIsYjphLlVJUixyOjB9LGEuTUVUSE9EX0dVQVJEPXtiOiJcXC5c
+XHMqIithLlVJUixyOjB9LGF9KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoInhtbCIsZnVuY3Rpb24ocyl7
+dmFyIGU9e2VXOiEwLGk6LzwvLHI6MCxjOlt7Y046ImF0dHIiLGI6IltBLVphLXowLTlcXC5fOi1dKyIs
+cjowfSx7YjovPVxzKi8scjowLGM6W3tjTjoic3RyaW5nIixlbmRzUGFyZW50OiEwLHY6W3tiOi8iLyxl
+Oi8iL30se2I6LycvLGU6LycvfSx7YjovW15ccyInPTw+YF0rL31dfV19XX07cmV0dXJue2FsaWFzZXM6
+WyJodG1sIiwieGh0bWwiLCJyc3MiLCJhdG9tIiwieGpiIiwieHNkIiwieHNsIiwicGxpc3QiLCJ3c2Yi
+XSxjSTohMCxjOlt7Y046Im1ldGEiLGI6IjwhRE9DVFlQRSIsZToiPiIscjoxMCxjOlt7YjoiXFxbIixl
+OiJcXF0ifV19LHMuQygiXHgzYyEtLSIsIi0tXHgzZSIse3I6MTB9KSx7YjoiPFxcIVxcW0NEQVRBXFxb
+IixlOiJcXF1cXF0+IixyOjEwfSx7Y046Im1ldGEiLGI6LzxcP3htbC8sZTovXD8+LyxyOjEwfSx7Yjov
+PFw/KHBocCk/LyxlOi9cPz4vLHNMOiJwaHAiLGM6W3tiOiIvXFwqIixlOiJcXCovIixza2lwOiEwfSx7
+YjonYiInLGU6JyInLHNraXA6ITB9LHtiOiJiJyIsZToiJyIsc2tpcDohMH0scy5pbmhlcml0KHMuQVNN
+LHtpOm51bGwsY046bnVsbCxjOm51bGwsc2tpcDohMH0pLHMuaW5oZXJpdChzLlFTTSx7aTpudWxsLGNO
+Om51bGwsYzpudWxsLHNraXA6ITB9KV19LHtjTjoidGFnIixiOiI8c3R5bGUoPz1cXHN8PnwkKSIsZToi
+PiIsazp7bmFtZToic3R5bGUifSxjOltlXSxzdGFydHM6e2U6Ijwvc3R5bGU+IixyRTohMCxzTDpbImNz
+cyIsInhtbCJdfX0se2NOOiJ0YWciLGI6IjxzY3JpcHQoPz1cXHN8PnwkKSIsZToiPiIsazp7bmFtZToi
+c2NyaXB0In0sYzpbZV0sc3RhcnRzOntlOiI8XC9zY3JpcHQ+IixyRTohMCxzTDpbImFjdGlvbnNjcmlw
+dCIsImphdmFzY3JpcHQiLCJoYW5kbGViYXJzIiwieG1sIiwidmJzY3JpcHQiXX19LHtjTjoidGFnIixi
+OiI8Lz8iLGU6Ii8/PiIsYzpbe2NOOiJuYW1lIixiOi9bXlwvPjxcc10rLyxyOjB9LGVdfV19fSk7aGxq
+cy5yZWdpc3Rlckxhbmd1YWdlKCJtYXJrZG93biIsZnVuY3Rpb24oZSl7cmV0dXJue2FsaWFzZXM6WyJt
+ZCIsIm1rZG93biIsIm1rZCJdLGM6W3tjTjoic2VjdGlvbiIsdjpbe2I6Il4jezEsNn0iLGU6IiQifSx7
+YjoiXi4rP1xcbls9LV17Mix9JCJ9XX0se2I6IjwiLGU6Ij4iLHNMOiJ4bWwiLHI6MH0se2NOOiJidWxs
+ZXQiLGI6Il5cXHMqKFsqKy1dfChcXGQrXFwuKSlcXHMrIn0se2NOOiJzdHJvbmciLGI6IlsqX117Mn0u
+Kz9bKl9dezJ9In0se2NOOiJlbXBoYXNpcyIsdjpbe2I6IlxcKi4rP1xcKiJ9LHtiOiJfLis/XyIscjow
+fV19LHtjTjoicXVvdGUiLGI6Il4+XFxzKyIsZToiJCJ9LHtjTjoiY29kZSIsdjpbe2I6Il5gYGB3KnMq
+JCIsZToiXmBgYHMqJCJ9LHtiOiJgLis/YCJ9LHtiOiJeKCB7NH18XHQpIixlOiIkIixyOjB9XX0se2I6
+Il5bLVxcKl17Myx9IixlOiIkIn0se2I6IlxcWy4rP1xcXVtcXChcXFtdLio/W1xcKVxcXV0iLHJCOiEw
+LGM6W3tjTjoic3RyaW5nIixiOiJcXFsiLGU6IlxcXSIsZUI6ITAsckU6ITAscjowfSx7Y046Imxpbmsi
+LGI6IlxcXVxcKCIsZToiXFwpIixlQjohMCxlRTohMH0se2NOOiJzeW1ib2wiLGI6IlxcXVxcWyIsZToi
+XFxdIixlQjohMCxlRTohMH1dLHI6MTB9LHtiOi9eXFtbXlxuXStcXTovLHJCOiEwLGM6W3tjTjoic3lt
+Ym9sIixiOi9cWy8sZTovXF0vLGVCOiEwLGVFOiEwfSx7Y046ImxpbmsiLGI6LzpccyovLGU6LyQvLGVC
+OiEwfV19XX19KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoImRhcnQiLGZ1bmN0aW9uKGUpe3ZhciB0PXtj
+Tjoic3Vic3QiLHY6W3tiOiJcXCRbQS1aYS16MC05X10rIn1dfSxyPXtjTjoic3Vic3QiLHY6W3tiOiJc
+XCR7IixlOiJ9In1dLGs6InRydWUgZmFsc2UgbnVsbCB0aGlzIGlzIG5ldyBzdXBlciJ9LG49e2NOOiJz
+dHJpbmciLHY6W3tiOiJyJycnIixlOiInJycifSx7YjonciIiIicsZTonIiIiJ30se2I6InInIixlOiIn
+IixpOiJcXG4ifSx7YjonciInLGU6JyInLGk6IlxcbiJ9LHtiOiInJyciLGU6IicnJyIsYzpbZS5CRSx0
+LHJdfSx7YjonIiIiJyxlOiciIiInLGM6W2UuQkUsdCxyXX0se2I6IiciLGU6IiciLGk6IlxcbiIsYzpb
+ZS5CRSx0LHJdfSx7YjonIicsZTonIicsaToiXFxuIixjOltlLkJFLHQscl19XX07ci5jPVtlLkNOTSxu
+XTtyZXR1cm57azp7a2V5d29yZDoiYXNzZXJ0IGFzeW5jIGF3YWl0IGJyZWFrIGNhc2UgY2F0Y2ggY2xh
+c3MgY29uc3QgY29udGludWUgZGVmYXVsdCBkbyBlbHNlIGVudW0gZXh0ZW5kcyBmYWxzZSBmaW5hbCBm
+aW5hbGx5IGZvciBpZiBpbiBpcyBuZXcgbnVsbCByZXRocm93IHJldHVybiBzdXBlciBzd2l0Y2ggc3lu
+YyB0aGlzIHRocm93IHRydWUgdHJ5IHZhciB2b2lkIHdoaWxlIHdpdGggeWllbGQgYWJzdHJhY3QgYXMg
+ZHluYW1pYyBleHBvcnQgZXh0ZXJuYWwgZmFjdG9yeSBnZXQgaW1wbGVtZW50cyBpbXBvcnQgbGlicmFy
+eSBvcGVyYXRvciBwYXJ0IHNldCBzdGF0aWMgdHlwZWRlZiIsYnVpbHRfaW46InByaW50IENvbXBhcmFi
+bGUgRGF0ZVRpbWUgRHVyYXRpb24gRnVuY3Rpb24gSXRlcmFibGUgSXRlcmF0b3IgTGlzdCBNYXAgTWF0
+Y2ggTnVsbCBPYmplY3QgUGF0dGVybiBSZWdFeHAgU2V0IFN0b3B3YXRjaCBTdHJpbmcgU3RyaW5nQnVm
+ZmVyIFN0cmluZ1NpbmsgU3ltYm9sIFR5cGUgVXJpIGJvb2wgZG91YmxlIGludCBudW0gZG9jdW1lbnQg
+d2luZG93IHF1ZXJ5U2VsZWN0b3IgcXVlcnlTZWxlY3RvckFsbCBFbGVtZW50IEVsZW1lbnRMaXN0In0s
+YzpbbixlLkMoIi9cXCpcXCoiLCJcXCovIix7c0w6Im1hcmtkb3duIn0pLGUuQygiLy8vIiwiJCIse3NM
+OiJtYXJrZG93biJ9KSxlLkNMQ00sZS5DQkNNLHtjTjoiY2xhc3MiLGJLOiJjbGFzcyBpbnRlcmZhY2Ui
+LGU6InsiLGVFOiEwLGM6W3tiSzoiZXh0ZW5kcyBpbXBsZW1lbnRzIn0sZS5VVE1dfSxlLkNOTSx7Y046
+Im1ldGEiLGI6IkBbQS1aYS16XSsifSx7YjoiPT4ifV19fSk7Cg==
+''';
+
+String _index_html;
+// index_html md5 is 'f3749ede15251d6832acc370afaca966'
+String _index_html_base64 = '''
+PGh0bWw+CjxoZWFkPgogICAgPHRpdGxlPk51bGwgU2FmZXR5IFByZXZpZXc8L3RpdGxlPgogICAgPHNj
+cmlwdCBzcmM9Int7IGhpZ2hsaWdodEpzUGF0aCB9fSI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0Pnt7IGRh
+cnRQYWdlU2NyaXB0IH19PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0
+dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1PcGVuK1NhbnM6NDAwLDYwMCZkaXNw
+bGF5PXN3YXAiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7eyBoaWdobGlnaHRTdHls
+ZVBhdGggfX0iPgogICAgPHN0eWxlPnt7IGRhcnRQYWdlU3R5bGUgfX08L3N0eWxlPgo8L2hlYWQ+Cjxi
+b2R5IGNsYXNzPSJ7eyBtaWdyYXRpb25BcHBsaWVkU3R5bGUgfX0ge3sgbmVlZHNSZXJ1blN0eWxlIH19
+Ij4KPGRpdiBjbGFzcz0icmVydW5uaW5nLXBhbmUiPgogIDxoMT5SZXJ1bm5pbmcuLi48L2gxPgo8L2Rp
+dj4KPGRpdiBjbGFzcz0icG9wdXAtcGFuZSI+CiAgPGRpdiBjbGFzcz0iY2xvc2UgYnV0dG9uIj5YPC9k
+aXY+CiAgPGgyPjwvaDI+PCEtLSBoZWFkZXIgcGxhY2Vob2xkZXIgZWxlbWVudCAtLT4KICA8cD48L3A+
+PCEtLSBzdWJoZWFkZXIgcGxhY2Vob2xkZXIgZWxlbWVudCAtLT4KICA8cHJlPjwvcHJlPjwhLS0gcHJl
+Zm9ybWF0ZWQgY29udGVudCBwbGFjZWhvbGRlciBlbGVtZW50IC0tPgogIDxhIGNsYXNzPSJidXR0b24g
+Ym90dG9tIiB0YXJnZXQ9Il9ibGFuayI+RmlsZSBvbiBHaXRIdWI8L2E+PCEtLSBwb3N0IHRvIGdpdGh1
+YiBwbGFjZWhvbGRlciBlbGVtZW50IC0tPgo8L2Rpdj4KPHAgY2xhc3M9InJvb3QiPnt7IHJvb3QgfX08
+L3A+CjxoZWFkZXIgY2xhc3M9ImVsZXZhdGlvbi16NCI+CiAgICA8aDEgY2xhc3M9ImJlZm9yZS1hcHBs
+eSI+UHJvcG9zZWQgbnVsbCBzYWZldHkgY2hhbmdlczwvaDE+CiAgICA8aDEgY2xhc3M9ImFmdGVyLWFw
+cGx5Ij4mIzEwMDAzOyBOdWxsIHNhZmV0eSBtaWdyYXRpb24gYXBwbGllZDwvaDE+CiAgICA8aDIgaWQ9
+InVuaXQtbmFtZSI+Jm5ic3A7PC9oMj4KICAgIDxidXR0b24gY2xhc3M9ImFwcGx5LW1pZ3JhdGlvbiI+
+JiM5OTk4OyBBcHBseSBNaWdyYXRpb248L2J1dHRvbj4KICAgIDxidXR0b24gY2xhc3M9ImFwcGx5LW1p
+Z3JhdGlvbiIgZGlzYWJsZWQ+JiM5OTk4OyBBcHBseSBNaWdyYXRpb248L2J1dHRvbj4KICAgIDxidXR0
+b24gY2xhc3M9InJlcnVuLW1pZ3JhdGlvbiBiZWZvcmUtYXBwbHkiPgogICAgICA8c3BhbiBjbGFzcz0i
+b3B0aW9uYWwiPiYjODYzNTsgUmVydW4gRnJvbSBTb3VyY2VzPC9zcGFuPgogICAgICA8c3BhbiBjbGFz
+cz0icmVxdWlyZWQiPgogICAgICAgIDxzcGFuIGNsYXNzPSJpY29uIiAKICAgICAgICAgIHRpdGxlPSJE
+aXNrIGNvbnRlbnRzIGhhdmUgY2hhbmdlZC4gUmVydW4gdG8gZ2V0IGFuIHVwLXRvLWRhdGUgbWlncmF0
+aW9uLiI+ITwvc3Bhbj4KICAgICAgICBSZXJ1biBXaXRoIENoYW5nZXMKICAgICAgPC9zcGFuPgogICAg
+PC9idXR0b24+CjwvaGVhZGVyPgo8ZGl2IGNsYXNzPSJwYW5lbHMgaG9yaXpvbnRhbCI+CiAgICA8ZGl2
+IGNsYXNzPSJuYXYtcGFuZWwiPgogICAgICAgIDxkaXYgY2xhc3M9Im5hdi1pbm5lciI+CiAgICAgICAg
+ICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPlByb2plY3QgRmlsZXM8L2Rpdj4KICAgICAgICAg
+ICAgPGRpdiBjbGFzcz0ibmF2LXRyZWUiPjwvZGl2PgogICAgICAgIDwvZGl2PjwhLS0gL25hdi1pbm5l
+ciAtLT4KICAgIDwvZGl2PjwhLS0gL25hdiAtLT4KICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAg
+ICAgIDxkaXYgY2xhc3M9InJlZ2lvbnMiPgogICAgICAgICAgICA8IS0tIFRoZSByZWdpb25zIG92ZXJs
+YXkgY29kZSBjb3B5IG9mIHRoZSBjb250ZW50IHRvIHByb3ZpZGUgLS0+CiAgICAgICAgICAgIDwhLS0g
+dG9vbHRpcHMgZm9yIG1vZGlmaWVkIHJlZ2lvbnMuIC0tPgogICAgICAgIDwvZGl2PjwhLS0gL3JlZ2lv
+bnMgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iY29kZSI+CiAgICAgICAgICAgIDwhLS0gQ29tcGlsYXRp
+b24gdW5pdCBjb250ZW50IGlzIHdyaXR0ZW4gaGVyZS4gLS0+CiAgICAgICAgICAgIDxwIGNsYXNzPSJ3
+ZWxjb21lIj4KICAgICAgICAgICAgICAgIFNlbGVjdCBhIHNvdXJjZSBmaWxlIG9uIHRoZSBsZWZ0IHRv
+IHByZXZpZXcgdGhlIHByb3Bvc2VkIGVkaXRzLgogICAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+
+CiAgICA8L2Rpdj48IS0tIC9jb250ZW50IC0tPgogICAgPGRpdiBjbGFzcz0iaW5mby1wYW5lbCI+CiAg
+ICAgICAgPGRpdiBjbGFzcz0iZWRpdC1saXN0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwt
+aGVhZGluZyI+UHJvcG9zZWQgRWRpdHM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwt
+Y29udGVudCI+PC9kaXY+CiAgICAgICAgPC9kaXY+PCEtLSAvZWRpdC1saXN0IC0tPgogICAgICAgIDxk
+aXYgY2xhc3M9ImVkaXQtcGFuZWwiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5n
+Ij5FZGl0IERldGFpbHM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtY29udGVudCI+
+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0icGxhY2Vob2xkZXIiPlNlZSBkZXRhaWxzIGFib3V0IGEg
+cHJvcG9zZWQgZWRpdC48L3A+CiAgICAgICAgICAgIDwvZGl2PjwhLS0gL3BhbmVsLWNvbnRlbnQgLS0+
+CiAgICAgICAgPC9kaXY+PCEtLSAvZWRpdC1wYW5lbCAtLT4KICAgIDwvZGl2PjwhLS0gL2luZm8tcGFu
+ZWwgLS0+CjwvZGl2PjwhLS0gL3BhbmVscyAtLT4KPGZvb3Rlcj4KICAgIDxhIHRhcmdldD0iX2JsYW5r
+IgogICAgICBocmVmPSJodHRwczovL2dvby5nbGUvZGFydC1udWxsLXNhZmV0eS1taWdyYXRpb24tdG9v
+bCI+TnVsbCBzYWZldHkKICAgICAgICBtaWdyYXRpb24gaGVscDwvYT4KICAgIDxzcGFuIGNsYXNzPSJ3
+aWRlIj4gPC9zcGFuPgogICAgPGRpdj5CYXNlZCBvbiB7eyBzZGtWZXJzaW9uIH19PC9kaXY+CiAgICA8
+YnV0dG9uIGNsYXNzPSJyZXBvcnQtcHJvYmxlbSI+UmVwb3J0IGEgUHJvYmxlbTwvYnV0dG9uPgo8L2Zv
+b3Rlcj4KPC9ib2R5Pgo8L2h0bWw+Cg==
+''';
+
+String _migration_css;
+// migration_css md5 is '3ac37808bdb8d07efd1c9ce21b67fccc'
+String _migration_css_base64 = '''
+LyogQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUg
+dGhlIEFVVEhPUlMgZmlsZSAgKi8KLyogZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVz
+ZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgKi8KLyogQlNELXN0eWxlIGxpY2Vu
+c2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4gICAgICAgICAgICAgICAgICAg
+Ki8KCmJvZHkgewogIGJhY2tncm91bmQtY29sb3I6ICMxMjIwMmY7CiAgY29sb3I6ICNjY2M7CiAgZm9u
+dC1mYW1pbHk6ICJSb2JvdG8iLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTRweDsKICBkaXNwbGF5
+OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRv
+cDogMDsKICByaWdodDogMDsKICBib3R0b206IDA7CiAgbGVmdDogMDsKICBtYXJnaW46IDA7CiAgcGFk
+ZGluZzogMDsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucHJvcG9zZWQgLmFmdGVyLWFwcGx5IHsKICBk
+aXNwbGF5OiBub25lOwp9CgouYXBwbGllZCAuYmVmb3JlLWFwcGx5IHsKICBkaXNwbGF5OiBub25lOwp9
+CgouYXBwbGllZCAuYXBwbHktbWlncmF0aW9uOm5vdChbZGlzYWJsZWRdKSwgLm5lZWRzLXJlcnVuIC5h
+cHBseS1taWdyYXRpb246bm90KFtkaXNhYmxlZF0pIHsKICBkaXNwbGF5OiBub25lOwp9CgoucHJvcG9z
+ZWQ6bm90KC5uZWVkcy1yZXJ1bikgLmFwcGx5LW1pZ3JhdGlvbltkaXNhYmxlZF0gewogIGRpc3BsYXk6
+IG5vbmU7Cn0KCmhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzFjMjgzNDsKICBoZWlnaHQ6IDQ4
+cHg7CiAgcGFkZGluZy1sZWZ0OiAyNHB4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgei1pbmRleDog
+NDsKfQoKaGVhZGVyIGgxLApoZWFkZXIgaDIgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250
+LWZhbWlseTogIkdvb2dsZSBTYW5zIiwiUm9ib3RvIixzYW5zLXNlcmlmOwogIGZvbnQtd2VpZ2h0OiA0
+MDA7CiAgbWFyZ2luLXJpZ2h0OiAyNHB4Owp9CgpoMSB7CiAgZm9udC1zaXplOiAxLjVlbTsKfQoKaGVh
+ZGVyIGgyIHsKICBmb250LXNpemU6IDEuMmVtOwp9CgpoZWFkZXIgLmFwcGx5LW1pZ3JhdGlvbiwgLnJl
+cnVuLW1pZ3JhdGlvbiB7CiAgcmlnaHQ6IDBweDsKICBmbG9hdDogcmlnaHQ7CiAgbWFyZ2luOiAxMHB4
+Owp9Cgpmb290ZXIgLnJlcG9ydC1wcm9ibGVtIHsKICByaWdodDogMHB4OwogIG1hcmdpbjogNHB4IDhw
+eDsKfQoKLnJlcnVuLW1pZ3JhdGlvbiAucmVxdWlyZWQgewogIGRpc3BsYXk6IG5vbmU7Cn0KCi5uZWVk
+cy1yZXJ1biAucmVydW4tbWlncmF0aW9uIC5yZXF1aXJlZCB7CiAgZGlzcGxheTogaW5pdGlhbDsKfQoK
+Lm5lZWRzLXJlcnVuIC5yZXJ1bi1taWdyYXRpb24gLm9wdGlvbmFsIHsKICBkaXNwbGF5Om5vbmU7Cn0K
+Ci8qIFJlZCB0cmlhbmdsZSAqLwoucmVydW4tbWlncmF0aW9uIC5yZXF1aXJlZCAuaWNvbjo6YmVmb3Jl
+IHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtOHB4LCAtMTFweCk7CiAgY29udGVudDogJ1wyNUIzJzsK
+ICBmb250LXNpemU6IDI1cHg7CiAgcG9zaXRpb246IGZpeGVkOwogIGNvbG9yOiAjZTgyYzJjOwogIHRl
+eHQtc2hhZG93OiAwcHggMHB4IDVweCB3aGl0ZTsKICB6LWluZGV4OiAtMzsKfQoKLyogUmVkIHRyaWFu
+Z2xlIGZpbGwgKi8KLnJlcnVuLW1pZ3JhdGlvbiAucmVxdWlyZWQgLmljb246OmFmdGVyIHsKICB0cmFu
+c2Zvcm06IHRyYW5zbGF0ZSgtOXB4LCAtMTBweCk7CiAgY29udGVudDogJ1wyNUI0JzsKICBmb250LXNp
+emU6IDI1cHg7CiAgcG9zaXRpb246IGZpeGVkOwogIGNvbG9yOiAjYjNlY2ZmOwogIHotaW5kZXg6IC0x
+Owp9CgovKiBSZWQgdHJpYW5nbGUgZXhjbGFtYXRpb24gKi8KLnJlcnVuLW1pZ3JhdGlvbiAucmVxdWly
+ZWQgLmljb24gewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBtYXJnaW4tcmlnaHQ6IDhweDsKICB0
+cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIDJweCk7CiAgbWFyZ2luLWxlZnQ6IDJweDsKICBjb2xvcjog
+IzJiMmIyYjsKfQoKZm9vdGVyIHsKICBjb2xvcjogI2NjYzsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjcz
+MjNhOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IHJvdzsKICBhbGlnbi1pdGVtczog
+Y2VudGVyOwogIHBhZGRpbmc6IDhweCAwIDhweCAyNHB4Owp9Cgpmb290ZXIgLndpZGUgewogIGZsZXg6
+IDE7Cn0KCi5ob3Jpem9udGFsIHsKICBkaXNwbGF5OiBmbGV4Owp9CgoucGFuZWxzIHsKICBiYWNrZ3Jv
+dW5kLWNvbG9yOiAjMTIxYTI1OwogIGZsZXg6IDE7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBhbmVs
+LWhlYWRpbmcgewogIGNvbG9yOiBncmF5OwogIG1hcmdpbjogOHB4Owp9CgoubmF2LWxpbmssCi5yZWdp
+b24gewogIGN1cnNvcjogcG9pbnRlcjsKfQoKLm5hdi1wYW5lbCB7CiAgYmFja2dyb3VuZC1jb2xvcjog
+IzI4MmIyZTsKICBmbGV4OiAxIDIwMHB4OwogIG1hcmdpbjogMDsKICBvdmVyZmxvdzogc2Nyb2xsOwp9
+CgoubmF2LWlubmVyIHsKICBwYWRkaW5nOiAwIDAgN3B4IDdweDsKfQoKLmZpeGVkIHsKICBwb3NpdGlv
+bjogZml4ZWQ7CiAgdG9wOiAwOwp9Cgoucm9vdCB7CiAgbWFyZ2luOiAwOwogIGRpc3BsYXk6IG5vbmU7
+Cn0KCi5uYXYtdHJlZSA+IHVsIHsKICBwYWRkaW5nLWxlZnQ6IDZweDsKfQoKLm5hdi1pbm5lciB1bCB7
+CiAgcGFkZGluZy1sZWZ0OiAxMnB4OwogIG1hcmdpbjogMDsKfQoKLm5hdi1pbm5lciBsaSB7CiAgbGlz
+dC1zdHlsZS10eXBlOiBub25lOwp9CgoubmF2LWlubmVyIGxpOm5vdCguZGlyKSB7CiAgbWFyZ2luLWxl
+ZnQ6IDIwcHg7CiAgbWFyZ2luLWJvdHRvbTogM3B4Owp9CgoubmF2LWlubmVyIGxpLmRpciAuYXJyb3cg
+ewogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAx
+MHB4OwogIG1hcmdpbi1yaWdodDogNHB4OwogIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjVzIGVhc2Ut
+b3V0Owp9CgoubmF2LWlubmVyIGxpLmRpciAuYXJyb3cuY29sbGFwc2VkIHsKICB0cmFuc2Zvcm06IHJv
+dGF0ZSgtOTBkZWcpOwp9CgoubmF2LWlubmVyIHVsIHsKICBtYXgtaGVpZ2h0OiAyMDAwcHg7CiAgdHJh
+bnNpdGlvbjogbWF4LWhlaWdodCAwLjVzIGVhc2Utb3V0Owp9CgoubmF2LWlubmVyIHVsLmNvbGxhcHNl
+ZCB7CiAgbWF4LWhlaWdodDogMCAhaW1wb3J0YW50OwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5uYXYt
+aW5uZXIgLnNlbGVjdGVkLWZpbGUgewogIGNvbG9yOiB3aGl0ZTsKICBjdXJzb3I6IGluaGVyaXQ7CiAg
+Zm9udC13ZWlnaHQ6IDYwMDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5lZGl0LWNvdW50IHsK
+ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzdhZWRjOwogIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgY29sb3I6
+ICMwMDAwMDA7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTFweDsKICBmb250
+LXdlaWdodDogNjAwOwogIG1hcmdpbi1sZWZ0OiA1cHg7CiAgbWluLXdpZHRoOiAyNXB4OwogIHBhZGRp
+bmc6IDRweCAwIDJweCAwOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBsaW5lLWhlaWdodDogMWVtOwp9
+CgouY29udGVudCB7CiAgZmxleDogNCAzMDBweDsKICBiYWNrZ3JvdW5kOiAjMjgyYjJlOwogIGZvbnQt
+ZmFtaWx5OiBtb25vc3BhY2U7CiAgbWFyZ2luOiAwIDZweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAg
+d2hpdGUtc3BhY2U6IHByZTsKICBvdmVyZmxvdzogc2Nyb2xsOwp9CgouY29kZSB7CiAgcGFkZGluZzog
+MC41ZW07CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDA7CiAgdG9wOiAwOwogIG1hcmdpbi1s
+ZWZ0OiA1NnB4Owp9CgouaGxqcyB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzI4MmIyZTsKICBkaXNwbGF5
+OiBibG9jazsKICBvdmVyZmxvdy14OiBhdXRvOwogIHBhZGRpbmc6IDAuNWVtOwp9CgouY29kZSAud2Vs
+Y29tZSB7CiAgZm9udC1mYW1pbHk6ICJHb29nbGUgU2FucyIsIlJvYm90byIsc2Fucy1zZXJpZjsKICBm
+b250LXNpemU6IDE4cHg7CiAgbWFyZ2luLXJpZ2h0OiA2MnB4OwogIGNvbG9yOiAjNzc3Owp9CgouY29k
+ZSAubmF2LWxpbmsgewogIGNvbG9yOiBpbmhlcml0OwogIHRleHQtZGVjb3JhdGlvbi1saW5lOiBub25l
+Owp9CgouY29kZSAubmF2LWxpbms6dmlzaXRlZCB7CiAgY29sb3I6IGluaGVyaXQ7CiAgdGV4dC1kZWNv
+cmF0aW9uLWxpbmU6IG5vbmU7Cn0KCi5jb2RlIC5uYXYtbGluazpob3ZlciB7CiAgdGV4dC1kZWNvcmF0
+aW9uLWxpbmU6IHVuZGVybGluZTsKICBmb250LXdlaWdodDogNjAwOwp9CgoucmVnaW9ucyB7CiAgcGFk
+ZGluZzogMC41ZW07CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDA7CiAgdG9wOiAwOwp9Cgou
+cmVnaW9ucyB0YWJsZSB7CiAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgZm9udC1zaXplOiBpbmhlcml0Owp9
+CgoucmVnaW9ucyB0ZCB7CiAgYm9yZGVyOiBub25lOwogIC8qIFRoZSBjb250ZW50IG9mIHRoZSByZWdp
+b25zIGlzIG5vdCB2aXNpYmxlOyB0aGUgdXNlciBpbnN0ZWFkIHdpbGwgc2VlIHRoZQogICAqIGhpZ2hs
+aWdodGVkIGNvcHkgb2YgdGhlIGNvbnRlbnQuICovCiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwg
+MCk7CiAgcGFkZGluZzogMDsKICB3aGl0ZS1zcGFjZTogcHJlOwp9CgoucmVnaW9ucyB0ZDplbXB0eTph
+ZnRlciB7CiAgY29udGVudDogIlwwMGEwIjsKfQoKLnJlZ2lvbnMgdHIuaGlnaGxpZ2h0IHRkOmxhc3Qt
+Y2hpbGQgewogIGJhY2tncm91bmQtY29sb3I6ICM0NDQ0NDQ7CiAgY29sb3I6IHdoaXRlOwp9CgoucmVn
+aW9ucyB0ZC5saW5lLW5vIHsKICBib3JkZXItcmlnaHQ6IHNvbGlkICMyODJiMmUgMnB4OwogIGNvbG9y
+OiAjOTk5OTk5OwogIHBhZGRpbmctcmlnaHQ6IDRweDsKICB0ZXh0LWFsaWduOiByaWdodDsKICB2aXNp
+YmlsaXR5OiB2aXNpYmxlOwogIHdpZHRoOiA1MHB4OwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoK
+LnJlZ2lvbnMgdHIuaGlnaGxpZ2h0IHRkLmxpbmUtbm8gewogIGJvcmRlci1yaWdodDogc29saWQgI2Nj
+YyAycHg7Cn0KCi5yZWdpb24gewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBwb3NpdGlvbjogcmVs
+YXRpdmU7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICB6LWluZGV4OiAyMDA7Cn0KCi5yZWdpb24uYWRk
+ZWQtcmVnaW9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NmZmNjOwogIGNvbG9yOiAjMDAzMzAwOwp9
+CgoucmVnaW9uLnJlbW92ZWQtcmVnaW9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2NjY2OwogIGNv
+bG9yOiAjMDAxMTAwOwp9CgoucmVnaW9uLmluZm9ybWF0aXZlLXJlZ2lvbiB7CiAgYmFja2dyb3VuZC1j
+b2xvcjogIzg4ODg4ODsKICBjb2xvcjogIzAwMDAwMDsKfQoKLnRhcmdldCB7CiAgYmFja2dyb3VuZC1j
+b2xvcjogIzQ0NDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICBm
+b250LXdlaWdodDogNjAwOwp9CgouaW5mby1wYW5lbCB7CiAgZmxleDogMSAyMDBweDsKICBtYXJnaW46
+IDA7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVt
+bjsKfQoKLmluZm8tcGFuZWwgLmVkaXQtcGFuZWwgewogIGJhY2tncm91bmQtY29sb3I6ICMyODJiMmU7
+CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50IHsKICBwYWRkaW5n
+OiA3cHg7Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50PiA6Zmlyc3QtY2hpbGQgewogIG1hcmdp
+bi10b3A6IDA7Cn0KCi5pbmZvLXBhbmVsIC5ub3dyYXAgewogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0K
+Ci5pbmZvLXBhbmVsIHVsLAouaW5mby1wYW5lbCBvbCB7CiAgcGFkZGluZy1sZWZ0OiAyMHB4Owp9Cgou
+aW5mby1wYW5lbCBsaSB7CiAgbWFyZ2luOiAwIDAgNXB4IDA7Cn0KCi5pbmZvLXBhbmVsIGEgewogIGNv
+bG9yOiAjMzNjY2ZmOwp9CgouaW5mby1wYW5lbCAuZWRpdC1saXN0IHsKICBiYWNrZ3JvdW5kLWNvbG9y
+OiAjMjgyYjJlOwogIG92ZXJmbG93OiBhdXRvOwp9CgouZWRpdC1wYW5lbCB7CiAgbWFyZ2luLXRvcDog
+NnB4OwogIGZsZXg6IDEgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgewogIGZsZXg6IDIgMTAwcHg7Cn0KCi5l
+ZGl0LWxpc3QgLmVkaXQgewogIG1hcmdpbjogM3B4IDA7Cn0KCi5lZGl0LWxpc3QgLmVkaXQtbGluayB7
+CiAgY3Vyc29yOiBwb2ludGVyOwp9CgoucG9wdXAtcGFuZSB7CiAgZGlzcGxheTogbm9uZTsKICBwb3Np
+dGlvbjogZml4ZWQ7CiAgdG9wOiAxNTBweDsKICBsZWZ0OiAxNTBweDsKICByaWdodDogMTUwcHg7CiAg
+Ym90dG9tOiAxNTBweDsKICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKICBib3JkZXItdG9wOiAycHgg
+c29saWQgYmxhY2s7CiAgYm9yZGVyLXJhZGl1czogN3B4OwogIGJveC1zaGFkb3c6IDBweCAwcHggMjBw
+eCAycHggI2I0YmZjYjIyOwogIHotaW5kZXg6IDE7CiAgYmFja2dyb3VuZDogIzJiMzAzNjsKICBwYWRk
+aW5nOiAyMHB4Owp9CgoucG9wdXAtcGFuZSAuY2xvc2UgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBy
+aWdodDogMTBweDsKICB0b3A6IDEwcHg7CiAgY3Vyc29yOiBwb2ludGVyOwogIHRleHQtc2hhZG93OiAx
+cHggMXB4IDJweCAjODg4OwogIGJveC1zaGFkb3c6IDFweCAxcHggMnB4ICMxMTE7Cn0KCi5wb3B1cC1w
+YW5lIGgyIHsKICBwYWRkaW5nOiAyMXB4OwogIGhlaWdodDogMTAlOwogIG1hcmdpbjogMHB4OwogIGJv
+eC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5wb3B1cC1wYW5lIHAgewogIGhlaWdodDogMTAlOwogIGJv
+eC1zaXppbmc6IGJvcmRlci1ib3g7CiAgcGFkZGluZzogMHB4IDIwcHg7Cn0KCi5wb3B1cC1wYW5lIHBy
+ZSB7CiAgYmFja2dyb3VuZDogIzI4MmIyZTsKICBwYWRkaW5nOiAyMHB4OwogIGJvdHRvbTogMHB4Owog
+IG92ZXJmbG93OiBhdXRvIHNjcm9sbDsKICBoZWlnaHQ6IDY1JTsKICBtYXJnaW46IDBweDsKICBib3gt
+c2l6aW5nOiBib3JkZXItYm94Owp9CgoucG9wdXAtcGFuZSAuYnV0dG9uLmJvdHRvbSB7CiAgbWFyZ2lu
+OiAyMHB4IDBweDsKICBkaXNwbGF5OiBibG9jazsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5yZXJ1
+bm5pbmctcGFuZSB7CiAgZGlzcGxheTogbm9uZTsKfQoKYm9keS5yZXJ1bm5pbmcgLnJlcnVubmluZy1w
+YW5lIHsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogZml4ZWQ7CiAgdG9wOiAwcHg7CiAgYm90
+dG9tOiAwcHg7CiAgbGVmdDogMHB4OwogIHJpZ2h0OiAwcHg7CiAgYmFja2dyb3VuZC1jb2xvcjogIzAw
+MDAwMEFBOyAvKiB0cmFuc2x1Y2VudCBibGFjayAqLwogIHotaW5kZXg6IDQwMDsKfQoKLnJlcnVubmlu
+Zy1wYW5lIGgxIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiA1MCU7CiAgbGVmdDogNTAlOwog
+IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwp9CgpwLnRyYWNlIC50eXBlLWRlc2NyaXB0
+aW9uIHsKICAvKiBGcm9tIEhMSlMncyAuaGxqcy1rZXl3b3JkLCAuaGxqcy1zZWxlY3Rvci10YWcsIC5o
+bGpzLWRlbGV0aW9uICovCiAgY29sb3I6ICNjYzc4MzI7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsK
+fQoKdWwudHJhY2UgewogIGZvbnQtc2l6ZTogMTNweDsKICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAg
+cGFkZGluZy1sZWZ0OiAwcHg7Cn0KCnVsLnRyYWNlIGxpIHsKICBjb2xvcjogd2hpdGU7CiAgbWFyZ2lu
+LWxlZnQ6IDE0cHg7CiAgdGV4dC1pbmRlbnQ6IC0xNHB4Owp9Cgp1bC50cmFjZSBsaSAuZnVuY3Rpb24g
+ewogIC8qIEZyb20gSExKUydzIC5obGpzLXNlY3Rpb24sIC5obGpzLXRpdGxlLCAuaGxqcy10eXBlICov
+CiAgY29sb3I6ICNmZmM2NmQ7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXdlaWdodDog
+NjAwOwp9CgouZWxldmF0aW9uLXo0IHsKICBib3gtc2hhZG93OiAwcHggMnB4IDRweCAtMXB4IHJnYmEo
+MCwgMCwgMCwgMC4yKSwKICAgICAgMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAg
+ICAgIDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAuMTIpOwp9CgphIHsKICBjb2xvcjogI2Nj
+YzsKICBmaWxsOiAjY2NjOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKYTpob3ZlciB7CiAgY29s
+b3I6ICNmZmY7CiAgZmlsbDogI2ZmZjsKfQoKLmFkZC1oaW50LWxpbmsgewogIGRpc3BsYXk6IGlubGlu
+ZS1ibG9jazsKICBtYXJnaW46IDNweDsKfQoKYnV0dG9uLCBhLmJ1dHRvbiB7CiAgYmFja2dyb3VuZC1j
+b2xvcjogIzMzY2NmZjsKICBib3JkZXI6IDJweCBzb2xpZCAjMzdhZWRjOwogIGJvcmRlci1yYWRpdXM6
+IDNweDsKICBwYWRkaW5nOiA2cHggMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogIzI4
+MjgyODsKfQoKYnV0dG9uOmhvdmVyLCAuYnV0dG9uOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAj
+ODBkZmZmOwogIGJvcmRlcjogMnB4IHNvbGlkICM1MmI4ZTA7CiAgY3Vyc29yOiBwb2ludGVyOwp9Cgpi
+dXR0b25bZGlzYWJsZWRdIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2FhOGI4OwogIGNvbG9yOiAjNTA3
+MTc3OwogIGJvcmRlcjogMnB4IHNvbGlkICM1MDcxNzc7CiAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoK
+LnBsYWNlaG9sZGVyIHsKICBjb2xvcjogIzc3NzsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbWFyZ2lu
+LXRvcDogM2VtICFpbXBvcnRhbnQ7Cn0KCi8qKgogKiBITEpTIE92ZXJyaWRlcwogKi8KLmhsanMgewog
+IC8qKgogICAqIFRoaXMgYWxsb3dzIHRoZSBwZXItbGluZSBoaWdobGlnaHRzIHRvIHNob3cuCiAgICov
+CiAgYmFja2dyb3VuZDogbm9uZTsKfQo=
+''';
+
+String _migration_js;
+// migration_dart md5 is '4517c0056bd2b39ccf2a244d0548213d'
+String _migration_js_base64 = '''
+KGZ1bmN0aW9uIGRhcnRQcm9ncmFtKCl7ZnVuY3Rpb24gY29weVByb3BlcnRpZXMoYSxiKXt2YXIgdD1P
+YmplY3Qua2V5cyhhKQpmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9dFtzXQpiW3JdPWFb
+cl19fXZhciB6PWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oKXt9CnQucHJvdG90eXBlPXtwOnt9fQp2
+YXIgcz1uZXcgdCgpCmlmKCEocy5fX3Byb3RvX18mJnMuX19wcm90b19fLnA9PT10LnByb3RvdHlwZS5w
+KSlyZXR1cm4gZmFsc2UKdHJ5e2lmKHR5cGVvZiBuYXZpZ2F0b3IhPSJ1bmRlZmluZWQiJiZ0eXBlb2Yg
+bmF2aWdhdG9yLnVzZXJBZ2VudD09InN0cmluZyImJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigi
+Q2hyb21lLyIpPj0wKXJldHVybiB0cnVlCmlmKHR5cGVvZiB2ZXJzaW9uPT0iZnVuY3Rpb24iJiZ2ZXJz
+aW9uLmxlbmd0aD09MCl7dmFyIHI9dmVyc2lvbigpCmlmKC9eXGQrXC5cZCtcLlxkK1wuXGQrJC8udGVz
+dChyKSlyZXR1cm4gdHJ1ZX19Y2F0Y2gocSl7fXJldHVybiBmYWxzZX0oKQpmdW5jdGlvbiBzZXRGdW5j
+dGlvbk5hbWVzSWZOZWNlc3NhcnkoYSl7ZnVuY3Rpb24gdCgpe307aWYodHlwZW9mIHQubmFtZT09InN0
+cmluZyIpcmV0dXJuCmZvcih2YXIgdD0wO3Q8YS5sZW5ndGg7dCsrKXt2YXIgcz1hW3RdCnZhciByPU9i
+amVjdC5rZXlzKHMpCmZvcih2YXIgcT0wO3E8ci5sZW5ndGg7cSsrKXt2YXIgcD1yW3FdCnZhciBvPXNb
+cF0KaWYodHlwZW9mIG89PSdmdW5jdGlvbicpby5uYW1lPXB9fX1mdW5jdGlvbiBpbmhlcml0KGEsYil7
+YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YQphLnByb3RvdHlwZVsiJGkiK2EubmFtZV09YQppZihiIT1u
+dWxsKXtpZih6KXthLnByb3RvdHlwZS5fX3Byb3RvX189Yi5wcm90b3R5cGUKcmV0dXJufXZhciB0PU9i
+amVjdC5jcmVhdGUoYi5wcm90b3R5cGUpCmNvcHlQcm9wZXJ0aWVzKGEucHJvdG90eXBlLHQpCmEucHJv
+dG90eXBlPXR9fWZ1bmN0aW9uIGluaGVyaXRNYW55KGEsYil7Zm9yKHZhciB0PTA7dDxiLmxlbmd0aDt0
+KyspaW5oZXJpdChiW3RdLGEpfWZ1bmN0aW9uIG1peGluKGEsYil7Y29weVByb3BlcnRpZXMoYi5wcm90
+b3R5cGUsYS5wcm90b3R5cGUpCmEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWF9ZnVuY3Rpb24gbGF6eShh
+LGIsYyxkKXt2YXIgdD1hCmFbYl09dAphW2NdPWZ1bmN0aW9uKCl7YVtjXT1mdW5jdGlvbigpe0guYWco
+Yil9CnZhciBzCnZhciByPWQKdHJ5e2lmKGFbYl09PT10KXtzPWFbYl09cgpzPWFbYl09ZCgpfWVsc2Ug
+cz1hW2JdfWZpbmFsbHl7aWYocz09PXIpYVtiXT1udWxsCmFbY109ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
+c1tiXX19cmV0dXJuIHN9fWZ1bmN0aW9uIG1ha2VDb25zdExpc3QoYSl7YS5pbW11dGFibGUkbGlzdD1B
+cnJheQphLmZpeGVkJGxlbmd0aD1BcnJheQpyZXR1cm4gYX1mdW5jdGlvbiBjb252ZXJ0VG9GYXN0T2Jq
+ZWN0KGEpe2Z1bmN0aW9uIHQoKXt9dC5wcm90b3R5cGU9YQpuZXcgdCgpCnJldHVybiBhfWZ1bmN0aW9u
+IGNvbnZlcnRBbGxUb0Zhc3RPYmplY3QoYSl7Zm9yKHZhciB0PTA7dDxhLmxlbmd0aDsrK3QpY29udmVy
+dFRvRmFzdE9iamVjdChhW3RdKX12YXIgeT0wCmZ1bmN0aW9uIHRlYXJPZmZHZXR0ZXIoYSxiLGMsZCxl
+KXtyZXR1cm4gZT9uZXcgRnVuY3Rpb24oImZ1bmNzIiwiYXBwbHlUcmFtcG9saW5lSW5kZXgiLCJyZWZs
+ZWN0aW9uSW5mbyIsIm5hbWUiLCJIIiwiYyIsInJldHVybiBmdW5jdGlvbiB0ZWFyT2ZmXyIrZCt5Kysr
+IihyZWNlaXZlcikgeyIrImlmIChjID09PSBudWxsKSBjID0gIisiSC5LcSIrIigiKyJ0aGlzLCBmdW5j
+cywgYXBwbHlUcmFtcG9saW5lSW5kZXgsIHJlZmxlY3Rpb25JbmZvLCBmYWxzZSwgdHJ1ZSwgbmFtZSk7
+IisicmV0dXJuIG5ldyBjKHRoaXMsIGZ1bmNzWzBdLCByZWNlaXZlciwgbmFtZSk7IisifSIpKGEsYixj
+LGQsSCxudWxsKTpuZXcgRnVuY3Rpb24oImZ1bmNzIiwiYXBwbHlUcmFtcG9saW5lSW5kZXgiLCJyZWZs
+ZWN0aW9uSW5mbyIsIm5hbWUiLCJIIiwiYyIsInJldHVybiBmdW5jdGlvbiB0ZWFyT2ZmXyIrZCt5Kysr
+IigpIHsiKyJpZiAoYyA9PT0gbnVsbCkgYyA9ICIrIkguS3EiKyIoIisidGhpcywgZnVuY3MsIGFwcGx5
+VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgZmFsc2UsIGZhbHNlLCBuYW1lKTsiKyJyZXR1
+cm4gbmV3IGModGhpcywgZnVuY3NbMF0sIG51bGwsIG5hbWUpOyIrIn0iKShhLGIsYyxkLEgsbnVsbCl9
+ZnVuY3Rpb24gdGVhck9mZihhLGIsYyxkLGUsZil7dmFyIHQ9bnVsbApyZXR1cm4gZD9mdW5jdGlvbigp
+e2lmKHQ9PT1udWxsKXQ9SC5LcSh0aGlzLGEsYixjLHRydWUsZmFsc2UsZSkucHJvdG90eXBlCnJldHVy
+biB0fTp0ZWFyT2ZmR2V0dGVyKGEsYixjLGUsZil9dmFyIHg9MApmdW5jdGlvbiBpbnN0YWxsVGVhck9m
+ZihhLGIsYyxkLGUsZixnLGgsaSxqKXt2YXIgdD1bXQpmb3IodmFyIHM9MDtzPGgubGVuZ3RoO3MrKyl7
+dmFyIHI9aFtzXQppZih0eXBlb2Ygcj09J3N0cmluZycpcj1hW3JdCnIuJGNhbGxOYW1lPWdbc10KdC5w
+dXNoKHIpfXZhciByPXRbMF0Kci4kUj1lCnIuJEQ9Zgp2YXIgcT1pCmlmKHR5cGVvZiBxPT0ibnVtYmVy
+IilxKz14CnZhciBwPWhbMF0Kci4kc3R1Yk5hbWU9cAp2YXIgbz10ZWFyT2ZmKHQsanx8MCxxLGMscCxk
+KQphW2JdPW8KaWYoYylyLiR0ZWFyT2ZmPW99ZnVuY3Rpb24gaW5zdGFsbFN0YXRpY1RlYXJPZmYoYSxi
+LGMsZCxlLGYsZyxoKXtyZXR1cm4gaW5zdGFsbFRlYXJPZmYoYSxiLHRydWUsZmFsc2UsYyxkLGUsZixn
+LGgpfWZ1bmN0aW9uIGluc3RhbGxJbnN0YW5jZVRlYXJPZmYoYSxiLGMsZCxlLGYsZyxoLGkpe3JldHVy
+biBpbnN0YWxsVGVhck9mZihhLGIsZmFsc2UsYyxkLGUsZixnLGgsaSl9ZnVuY3Rpb24gc2V0T3JVcGRh
+dGVJbnRlcmNlcHRvcnNCeVRhZyhhKXt2YXIgdD12LmludGVyY2VwdG9yc0J5VGFnCmlmKCF0KXt2Lmlu
+dGVyY2VwdG9yc0J5VGFnPWEKcmV0dXJufWNvcHlQcm9wZXJ0aWVzKGEsdCl9ZnVuY3Rpb24gc2V0T3JV
+cGRhdGVMZWFmVGFncyhhKXt2YXIgdD12LmxlYWZUYWdzCmlmKCF0KXt2LmxlYWZUYWdzPWEKcmV0dXJu
+fWNvcHlQcm9wZXJ0aWVzKGEsdCl9ZnVuY3Rpb24gdXBkYXRlVHlwZXMoYSl7dmFyIHQ9di50eXBlcwp2
+YXIgcz10Lmxlbmd0aAp0LnB1c2guYXBwbHkodCxhKQpyZXR1cm4gc31mdW5jdGlvbiB1cGRhdGVIb2xk
+ZXIoYSxiKXtjb3B5UHJvcGVydGllcyhiLGEpCnJldHVybiBhfXZhciBodW5rSGVscGVycz1mdW5jdGlv
+bigpe3ZhciB0PWZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIGZ1bmN0aW9uKGYsZyxoLGkpe3JldHVy
+biBpbnN0YWxsSW5zdGFuY2VUZWFyT2ZmKGYsZyxhLGIsYyxkLFtoXSxpLGUpfX0scz1mdW5jdGlvbihh
+LGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZSxmLGcsaCl7cmV0dXJuIGluc3RhbGxTdGF0aWNUZWFyT2Zm
+KGUsZixhLGIsYyxbZ10saCxkKX19CnJldHVybntpbmhlcml0OmluaGVyaXQsaW5oZXJpdE1hbnk6aW5o
+ZXJpdE1hbnksbWl4aW46bWl4aW4saW5zdGFsbFN0YXRpY1RlYXJPZmY6aW5zdGFsbFN0YXRpY1RlYXJP
+ZmYsaW5zdGFsbEluc3RhbmNlVGVhck9mZjppbnN0YWxsSW5zdGFuY2VUZWFyT2ZmLF9pbnN0YW5jZV8w
+dTp0KDAsMCxudWxsLFsiJDAiXSwwKSxfaW5zdGFuY2VfMXU6dCgwLDEsbnVsbCxbIiQxIl0sMCksX2lu
+c3RhbmNlXzJ1OnQoMCwyLG51bGwsWyIkMiJdLDApLF9pbnN0YW5jZV8waTp0KDEsMCxudWxsLFsiJDAi
+XSwwKSxfaW5zdGFuY2VfMWk6dCgxLDEsbnVsbCxbIiQxIl0sMCksX2luc3RhbmNlXzJpOnQoMSwyLG51
+bGwsWyIkMiJdLDApLF9zdGF0aWNfMDpzKDAsbnVsbCxbIiQwIl0sMCksX3N0YXRpY18xOnMoMSxudWxs
+LFsiJDEiXSwwKSxfc3RhdGljXzI6cygyLG51bGwsWyIkMiJdLDApLG1ha2VDb25zdExpc3Q6bWFrZUNv
+bnN0TGlzdCxsYXp5OmxhenksdXBkYXRlSG9sZGVyOnVwZGF0ZUhvbGRlcixjb252ZXJ0VG9GYXN0T2Jq
+ZWN0OmNvbnZlcnRUb0Zhc3RPYmplY3Qsc2V0RnVuY3Rpb25OYW1lc0lmTmVjZXNzYXJ5OnNldEZ1bmN0
+aW9uTmFtZXNJZk5lY2Vzc2FyeSx1cGRhdGVUeXBlczp1cGRhdGVUeXBlcyxzZXRPclVwZGF0ZUludGVy
+Y2VwdG9yc0J5VGFnOnNldE9yVXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcsc2V0T3JVcGRhdGVMZWFmVGFn
+czpzZXRPclVwZGF0ZUxlYWZUYWdzfX0oKQpmdW5jdGlvbiBpbml0aWFsaXplRGVmZXJyZWRIdW5rKGEp
+e3g9di50eXBlcy5sZW5ndGgKYShodW5rSGVscGVycyx2LHcsJCl9ZnVuY3Rpb24gZ2V0R2xvYmFsRnJv
+bU5hbWUoYSl7Zm9yKHZhciB0PTA7dDx3Lmxlbmd0aDt0Kyspe2lmKHdbdF09PUMpY29udGludWUKaWYo
+d1t0XVthXSlyZXR1cm4gd1t0XVthXX19dmFyIEM9e30sSD17Rks6ZnVuY3Rpb24gRksoKXt9LAp5Ujpm
+dW5jdGlvbihhKXtyZXR1cm4gbmV3IEgubmQoYSl9LApvbzpmdW5jdGlvbihhKXt2YXIgdCxzPWFeNDgK
+aWYoczw9OSlyZXR1cm4gcwp0PWF8MzIKaWYoOTc8PXQmJnQ8PTEwMilyZXR1cm4gdC04NwpyZXR1cm4t
+MX0sCnFDOmZ1bmN0aW9uKGEsYixjLGQpe1AuazEoYiwic3RhcnQiKQppZihjIT1udWxsKXtQLmsxKGMs
+ImVuZCIpCmlmKGI+YylILnZoKFAuVEUoYiwwLGMsInN0YXJ0IixudWxsKSl9cmV0dXJuIG5ldyBILm5I
+KGEsYixjLGQuQygibkg8MD4iKSl9LApLMTpmdW5jdGlvbihhLGIsYyxkKXtpZih1Lmd3LmIoYSkpcmV0
+dXJuIG5ldyBILnh5KGEsYixjLkMoIkA8MD4iKS5LcShkKS5DKCJ4eTwxLDI+IikpCnJldHVybiBuZXcg
+SC5pMShhLGIsYy5DKCJAPDA+IikuS3EoZCkuQygiaTE8MSwyPiIpKX0sCldwOmZ1bmN0aW9uKCl7cmV0
+dXJuIG5ldyBQLmxqKCJObyBlbGVtZW50Iil9LApkVTpmdW5jdGlvbigpe3JldHVybiBuZXcgUC5saigi
+VG9vIG1hbnkgZWxlbWVudHMiKX0sCmFyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLmxqKCJUb28gZmV3
+IGVsZW1lbnRzIil9LApuZDpmdW5jdGlvbiBuZChhKXt0aGlzLmE9YX0sCnFqOmZ1bmN0aW9uIHFqKGEp
+e3RoaXMuYT1hfSwKYlE6ZnVuY3Rpb24gYlEoKXt9LAphTDpmdW5jdGlvbiBhTCgpe30sCm5IOmZ1bmN0
+aW9uIG5IKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCmE3OmZ1
+bmN0aW9uIGE3KGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz0wCl8uZD1udWxsCl8uJHRp
+PWN9LAppMTpmdW5jdGlvbiBpMShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sCnh5
+OmZ1bmN0aW9uIHh5KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKTUg6ZnVuY3Rp
+b24gTUgoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPW51bGwKXy5iPWEKXy5jPWIKXy4kdGk9Y30sCmxKOmZ1
+bmN0aW9uIGxKKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKVTU6ZnVuY3Rpb24g
+VTUoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LAp2RzpmdW5jdGlvbiB2RyhhLGIs
+Yyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sClNVOmZ1bmN0aW9uIFNVKCl7fSwKUmU6ZnVu
+Y3Rpb24gUmUoKXt9LAp3MjpmdW5jdGlvbiB3Migpe30sCnd2OmZ1bmN0aW9uIHd2KGEpe3RoaXMuYT1h
+fSwKZGM6ZnVuY3Rpb24oKXt0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUg
+TWFwIikpfSwKTlE6ZnVuY3Rpb24oYSl7dmFyIHQscz1ILkpnKGEpCmlmKHMhPW51bGwpcmV0dXJuIHMK
+dD0ibWluaWZpZWQ6IithCnJldHVybiB0fSwKd1Y6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihiIT1udWxs
+KXt0PWIueAppZih0IT1udWxsKXJldHVybiB0fXJldHVybiB1LmFVLmIoYSl9LApkOmZ1bmN0aW9uKGEp
+e3ZhciB0CmlmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gYQppZih0eXBlb2YgYT09Im51bWJlciIp
+e2lmKGEhPT0wKXJldHVybiIiK2F9ZWxzZSBpZighMD09PWEpcmV0dXJuInRydWUiCmVsc2UgaWYoITE9
+PT1hKXJldHVybiJmYWxzZSIKZWxzZSBpZihhPT1udWxsKXJldHVybiJudWxsIgp0PUouQWMoYSkKaWYo
+dHlwZW9mIHQhPSJzdHJpbmciKXRocm93IEguYihILkkoYSkpCnJldHVybiB0fSwKZVE6ZnVuY3Rpb24o
+YSl7dmFyIHQ9YS4kaWRlbnRpdHlIYXNoCmlmKHQ9PW51bGwpe3Q9TWF0aC5yYW5kb20oKSoweDNmZmZm
+ZmZmfDAKYS4kaWRlbnRpdHlIYXNoPXR9cmV0dXJuIHR9LApIcDpmdW5jdGlvbihhLGIpe3ZhciB0LHMs
+cixxLHAsbyxuPW51bGwKaWYodHlwZW9mIGEhPSJzdHJpbmciKUgudmgoSC5JKGEpKQp0PS9eXHMqWyst
+XT8oKDB4W2EtZjAtOV0rKXwoXGQrKXwoW2EtejAtOV0rKSlccyokL2kuZXhlYyhhKQppZih0PT1udWxs
+KXJldHVybiBuCmlmKDM+PXQubGVuZ3RoKXJldHVybiBILmsodCwzKQpzPUguYyh0WzNdKQppZihiPT1u
+dWxsKXtpZihzIT1udWxsKXJldHVybiBwYXJzZUludChhLDEwKQppZih0WzJdIT1udWxsKXJldHVybiBw
+YXJzZUludChhLDE2KQpyZXR1cm4gbn1pZihiPDJ8fGI+MzYpdGhyb3cgSC5iKFAuVEUoYiwyLDM2LCJy
+YWRpeCIsbikpCmlmKGI9PT0xMCYmcyE9bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwxMCkKaWYoYjwxMHx8
+cz09bnVsbCl7cj1iPD0xMD80NytiOjg2K2IKcT10WzFdCmZvcihwPXEubGVuZ3RoLG89MDtvPHA7Kytv
+KWlmKChDLnhCLlcocSxvKXwzMik+cilyZXR1cm4gbn1yZXR1cm4gcGFyc2VJbnQoYSxiKX0sCmxoOmZ1
+bmN0aW9uKGEpe3ZhciB0PUguSDUoYSkKcmV0dXJuIHR9LApINTpmdW5jdGlvbihhKXt2YXIgdCxzLHIK
+aWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuIEguSihILnEoYSksbnVsbCkKaWYoSi5pYShhKT09PUMu
+T2t8fHUuYWsuYihhKSl7dD1DLndiKGEpCmlmKEguQmUodCkpcmV0dXJuIHQKcz1hLmNvbnN0cnVjdG9y
+CmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXtyPXMubmFtZQppZih0eXBlb2Ygcj09InN0cmluZyImJkgu
+QmUocikpcmV0dXJuIHJ9fXJldHVybiBILkooSC5xKGEpLG51bGwpfSwKQmU6ZnVuY3Rpb24oYSl7dmFy
+IHQ9YSE9PSJPYmplY3QiJiZhIT09IiIKcmV0dXJuIHR9LApNMDpmdW5jdGlvbigpe2lmKCEhc2VsZi5s
+b2NhdGlvbilyZXR1cm4gc2VsZi5sb2NhdGlvbi5ocmVmCnJldHVybiBudWxsfSwKVks6ZnVuY3Rpb24o
+YSl7dmFyIHQscyxyLHEscD1hLmxlbmd0aAppZihwPD01MDApcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNv
+ZGUuYXBwbHkobnVsbCxhKQpmb3IodD0iIixzPTA7czxwO3M9cil7cj1zKzUwMApxPXI8cD9yOnAKdCs9
+U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEuc2xpY2UocyxxKSl9cmV0dXJuIHR9LApDcTpm
+dW5jdGlvbihhKXt2YXIgdCxzLHIscT1ILlZNKFtdLHUudCkKZm9yKHQ9YS5sZW5ndGgscz0wO3M8YS5s
+ZW5ndGg7YS5sZW5ndGg9PT10fHwoMCxILmxrKShhKSwrK3Mpe3I9YVtzXQppZighSC5vayhyKSl0aHJv
+dyBILmIoSC5JKHIpKQppZihyPD02NTUzNSlDLk5tLmkocSxyKQplbHNlIGlmKHI8PTExMTQxMTEpe0Mu
+Tm0uaShxLDU1Mjk2KyhDLmpuLndHKHItNjU1MzYsMTApJjEwMjMpKQpDLk5tLmkocSw1NjMyMCsociYx
+MDIzKSl9ZWxzZSB0aHJvdyBILmIoSC5JKHIpKX1yZXR1cm4gSC5WSyhxKX0sCmVUOmZ1bmN0aW9uKGEp
+e3ZhciB0LHMscgpmb3IodD1hLmxlbmd0aCxzPTA7czx0Oysrcyl7cj1hW3NdCmlmKCFILm9rKHIpKXRo
+cm93IEguYihILkkocikpCmlmKHI8MCl0aHJvdyBILmIoSC5JKHIpKQppZihyPjY1NTM1KXJldHVybiBI
+LkNxKGEpfXJldHVybiBILlZLKGEpfSwKZnc6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxCmlmKGM8
+PTUwMCYmYj09PTAmJmM9PT1hLmxlbmd0aClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShu
+dWxsLGEpCmZvcih0PWIscz0iIjt0PGM7dD1yKXtyPXQrNTAwCnE9cjxjP3I6YwpzKz1TdHJpbmcuZnJv
+bUNoYXJDb2RlLmFwcGx5KG51bGwsYS5zdWJhcnJheSh0LHEpKX1yZXR1cm4gc30sCkx3OmZ1bmN0aW9u
+KGEpe3ZhciB0CmlmKDA8PWEpe2lmKGE8PTY1NTM1KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEp
+CmlmKGE8PTExMTQxMTEpe3Q9YS02NTUzNgpyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoNTUyOTZ8
+Qy5qbi53Ryh0LDEwKSk+Pj4wLDU2MzIwfHQmMTAyMyl9fXRocm93IEguYihQLlRFKGEsMCwxMTE0MTEx
+LG51bGwsbnVsbCkpfSwKbzI6ZnVuY3Rpb24oYSl7aWYoYS5kYXRlPT09dm9pZCAwKWEuZGF0ZT1uZXcg
+RGF0ZShhLmEpCnJldHVybiBhLmRhdGV9LAp0SjpmdW5jdGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldEZ1
+bGxZZWFyKCkrMApyZXR1cm4gdH0sCk5TOmZ1bmN0aW9uKGEpe3ZhciB0PUgubzIoYSkuZ2V0TW9udGgo
+KSsxCnJldHVybiB0fSwKakE6ZnVuY3Rpb24oYSl7dmFyIHQ9SC5vMihhKS5nZXREYXRlKCkrMApyZXR1
+cm4gdH0sCklYOmZ1bmN0aW9uKGEpe3ZhciB0PUgubzIoYSkuZ2V0SG91cnMoKSswCnJldHVybiB0fSwK
+Y2g6ZnVuY3Rpb24oYSl7dmFyIHQ9SC5vMihhKS5nZXRNaW51dGVzKCkrMApyZXR1cm4gdH0sCkpkOmZ1
+bmN0aW9uKGEpe3ZhciB0PUgubzIoYSkuZ2V0U2Vjb25kcygpKzAKcmV0dXJuIHR9LApWYTpmdW5jdGlv
+bihhKXt2YXIgdD1ILm8yKGEpLmdldE1pbGxpc2Vjb25kcygpKzAKcmV0dXJuIHR9LAp6bzpmdW5jdGlv
+bihhLGIsYyl7dmFyIHQscyxyPXt9CnIuYT0wCnQ9W10Kcz1bXQpyLmE9Yi5sZW5ndGgKQy5ObS5GVih0
+LGIpCnIuYj0iIgppZihjIT1udWxsJiZjLmEhPT0wKWMuSygwLG5ldyBILkNqKHIscyx0KSkKIiIrci5h
+CnJldHVybiBKLkp5KGEsbmV3IEguTEkoQy5UZSwwLHQscywwKSl9LApFazpmdW5jdGlvbihhLGIsYyl7
+dmFyIHQscyxyLHEKaWYoYiBpbnN0YW5jZW9mIEFycmF5KXQ9Yz09bnVsbHx8Yy5hPT09MAplbHNlIHQ9
+ITEKaWYodCl7cz1iCnI9cy5sZW5ndGgKaWYocj09PTApe2lmKCEhYS4kMClyZXR1cm4gYS4kMCgpfWVs
+c2UgaWYocj09PTEpe2lmKCEhYS4kMSlyZXR1cm4gYS4kMShzWzBdKX1lbHNlIGlmKHI9PT0yKXtpZigh
+IWEuJDIpcmV0dXJuIGEuJDIoc1swXSxzWzFdKX1lbHNlIGlmKHI9PT0zKXtpZighIWEuJDMpcmV0dXJu
+IGEuJDMoc1swXSxzWzFdLHNbMl0pfWVsc2UgaWYocj09PTQpe2lmKCEhYS4kNClyZXR1cm4gYS4kNChz
+WzBdLHNbMV0sc1syXSxzWzNdKX1lbHNlIGlmKHI9PT01KWlmKCEhYS4kNSlyZXR1cm4gYS4kNShzWzBd
+LHNbMV0sc1syXSxzWzNdLHNbNF0pCnE9YVsiIisiJCIrcl0KaWYocSE9bnVsbClyZXR1cm4gcS5hcHBs
+eShhLHMpfXJldHVybiBILmUxKGEsYixjKX0sCmUxOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxw
+LG8sbixtLGwsaz1iIGluc3RhbmNlb2YgQXJyYXk/YjpQLkNIKGIsITAsdS56KSxqPWsubGVuZ3RoLGk9
+YS4kUgppZihqPGkpcmV0dXJuIEguem8oYSxrLGMpCnQ9YS4kRApzPXQ9PW51bGwKcj0hcz90KCk6bnVs
+bApxPUouaWEoYSkKcD1xLiRDCmlmKHR5cGVvZiBwPT0ic3RyaW5nIilwPXFbcF0KaWYocyl7aWYoYyE9
+bnVsbCYmYy5hIT09MClyZXR1cm4gSC56byhhLGssYykKaWYoaj09PWkpcmV0dXJuIHAuYXBwbHkoYSxr
+KQpyZXR1cm4gSC56byhhLGssYyl9aWYociBpbnN0YW5jZW9mIEFycmF5KXtpZihjIT1udWxsJiZjLmEh
+PT0wKXJldHVybiBILnpvKGEsayxjKQppZihqPmkrci5sZW5ndGgpcmV0dXJuIEguem8oYSxrLG51bGwp
+CkMuTm0uRlYoayxyLnNsaWNlKGotaSkpCnJldHVybiBwLmFwcGx5KGEsayl9ZWxzZXtpZihqPmkpcmV0
+dXJuIEguem8oYSxrLGMpCm89T2JqZWN0LmtleXMocikKaWYoYz09bnVsbClmb3Iocz1vLmxlbmd0aCxu
+PTA7bjxvLmxlbmd0aDtvLmxlbmd0aD09PXN8fCgwLEgubGspKG8pLCsrbilDLk5tLmkoayxyW0guYyhv
+W25dKV0pCmVsc2V7Zm9yKHM9by5sZW5ndGgsbT0wLG49MDtuPG8ubGVuZ3RoO28ubGVuZ3RoPT09c3x8
+KDAsSC5saykobyksKytuKXtsPUguYyhvW25dKQppZihjLng0KGwpKXsrK20KQy5ObS5pKGssYy5xKDAs
+bCkpfWVsc2UgQy5ObS5pKGsscltsXSl9aWYobSE9PWMuYSlyZXR1cm4gSC56byhhLGssYyl9cmV0dXJu
+IHAuYXBwbHkoYSxrKX19LApwWTpmdW5jdGlvbihhKXt0aHJvdyBILmIoSC5JKGEpKX0sCms6ZnVuY3Rp
+b24oYSxiKXtpZihhPT1udWxsKUouSChhKQp0aHJvdyBILmIoSC5IWShhLGIpKX0sCkhZOmZ1bmN0aW9u
+KGEsYil7dmFyIHQscyxyPSJpbmRleCIKaWYoIUgub2soYikpcmV0dXJuIG5ldyBQLkFUKCEwLGIscixu
+dWxsKQp0PUguV1koSi5IKGEpKQppZighKGI8MCkpe2lmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJu
+IEgucFkodCkKcz1iPj10fWVsc2Ugcz0hMAppZihzKXJldHVybiBQLnQoYixhLHIsbnVsbCx0KQpyZXR1
+cm4gUC5PNyhiLHIpfSwKYXU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PW51bGwKaWYoYT5jKXJldHVybiBQ
+LlRFKGEsMCxjLCJzdGFydCIsdCkKaWYoYiE9bnVsbCl7aWYoIUgub2soYikpcmV0dXJuIG5ldyBQLkFU
+KCEwLGIsImVuZCIsdCkKaWYoYjxhfHxiPmMpcmV0dXJuIFAuVEUoYixhLGMsImVuZCIsdCl9cmV0dXJu
+IG5ldyBQLkFUKCEwLGIsImVuZCIsdCl9LApJOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5BVCghMCxh
+LG51bGwsbnVsbCl9LApiOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKGE9PW51bGwpYT1uZXcgUC5MSygpCnQ9
+bmV3IEVycm9yKCkKdC5kYXJ0RXhjZXB0aW9uPWEKaWYoImRlZmluZVByb3BlcnR5IiBpbiBPYmplY3Qp
+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJtZXNzYWdlIix7Z2V0OkguSnV9KQp0Lm5hbWU9IiJ9ZWxz
+ZSB0LnRvU3RyaW5nPUguSnUKcmV0dXJuIHR9LApKdTpmdW5jdGlvbigpe3JldHVybiBKLkFjKHRoaXMu
+ZGFydEV4Y2VwdGlvbil9LAp2aDpmdW5jdGlvbihhKXt0aHJvdyBILmIoYSl9LApsazpmdW5jdGlvbihh
+KXt0aHJvdyBILmIoUC5hNChhKSl9LApjTTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8KYT1ILmVB
+KGEucmVwbGFjZShTdHJpbmcoe30pLCckcmVjZWl2ZXIkJykpCnQ9YS5tYXRjaCgvXFxcJFthLXpBLVpd
+K1xcXCQvZykKaWYodD09bnVsbCl0PUguVk0oW10sdS5zKQpzPXQuaW5kZXhPZigiXFwkYXJndW1lbnRz
+XFwkIikKcj10LmluZGV4T2YoIlxcJGFyZ3VtZW50c0V4cHJcXCQiKQpxPXQuaW5kZXhPZigiXFwkZXhw
+clxcJCIpCnA9dC5pbmRleE9mKCJcXCRtZXRob2RcXCQiKQpvPXQuaW5kZXhPZigiXFwkcmVjZWl2ZXJc
+XCQiKQpyZXR1cm4gbmV3IEguZjkoYS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXCRhcmd1bWVudHNc
+XFxcXFwkJywnZycpLCcoKD86eHxbXnhdKSopJykucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcXFwkYXJn
+dW1lbnRzRXhwclxcXFxcXCQnLCdnJyksJygoPzp4fFteeF0pKiknKS5yZXBsYWNlKG5ldyBSZWdFeHAo
+J1xcXFxcXCRleHByXFxcXFxcJCcsJ2cnKSwnKCg/Onh8W154XSkqKScpLnJlcGxhY2UobmV3IFJlZ0V4
+cCgnXFxcXFxcJG1ldGhvZFxcXFxcXCQnLCdnJyksJygoPzp4fFteeF0pKiknKS5yZXBsYWNlKG5ldyBS
+ZWdFeHAoJ1xcXFxcXCRyZWNlaXZlclxcXFxcXCQnLCdnJyksJygoPzp4fFteeF0pKiknKSxzLHIscSxw
+LG8pfSwKUzc6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCRleHByJCl7dmFyICRhcmd1bWVudHNF
+eHByJD0nJGFyZ3VtZW50cyQnCnRyeXskZXhwciQuJG1ldGhvZCQoJGFyZ3VtZW50c0V4cHIkKX1jYXRj
+aCh0KXtyZXR1cm4gdC5tZXNzYWdlfX0oYSl9LApNajpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24o
+JGV4cHIkKXt0cnl7JGV4cHIkLiRtZXRob2QkfWNhdGNoKHQpe3JldHVybiB0Lm1lc3NhZ2V9fShhKX0s
+CklqOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILlcwKGEsYj09bnVsbD9udWxsOmIubWV0aG9kKX0s
+ClQzOmZ1bmN0aW9uKGEsYil7dmFyIHQ9Yj09bnVsbCxzPXQ/bnVsbDpiLm1ldGhvZApyZXR1cm4gbmV3
+IEguYXooYSxzLHQ/bnVsbDpiLnJlY2VpdmVyKX0sClJ1OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAs
+byxuLG0sbCxrLGosaSxoLGcsZj1udWxsLGU9bmV3IEguQW0oYSkKaWYoYT09bnVsbClyZXR1cm4gZgpp
+ZihhIGluc3RhbmNlb2YgSC5icSlyZXR1cm4gZS4kMShhLmEpCmlmKHR5cGVvZiBhIT09Im9iamVjdCIp
+cmV0dXJuIGEKaWYoImRhcnRFeGNlcHRpb24iIGluIGEpcmV0dXJuIGUuJDEoYS5kYXJ0RXhjZXB0aW9u
+KQplbHNlIGlmKCEoIm1lc3NhZ2UiIGluIGEpKXJldHVybiBhCnQ9YS5tZXNzYWdlCmlmKCJudW1iZXIi
+IGluIGEmJnR5cGVvZiBhLm51bWJlcj09Im51bWJlciIpe3M9YS5udW1iZXIKcj1zJjY1NTM1CmlmKChD
+LmpuLndHKHMsMTYpJjgxOTEpPT09MTApc3dpdGNoKHIpe2Nhc2UgNDM4OnJldHVybiBlLiQxKEguVDMo
+SC5kKHQpKyIgKEVycm9yICIrcisiKSIsZikpCmNhc2UgNDQ1OmNhc2UgNTAwNzpyZXR1cm4gZS4kMShI
+LklqKEguZCh0KSsiIChFcnJvciAiK3IrIikiLGYpKX19aWYoYSBpbnN0YW5jZW9mIFR5cGVFcnJvcil7
+cT0kLlNuKCkKcD0kLmxxKCkKbz0kLk45KCkKbj0kLmlJKCkKbT0kLlVOKCkKbD0kLlpoKCkKaz0kLnJO
+KCkKJC5jMygpCmo9JC5ISygpCmk9JC5yMSgpCmg9cS5xUyh0KQppZihoIT1udWxsKXJldHVybiBlLiQx
+KEguVDMoSC5jKHQpLGgpKQplbHNle2g9cC5xUyh0KQppZihoIT1udWxsKXtoLm1ldGhvZD0iY2FsbCIK
+cmV0dXJuIGUuJDEoSC5UMyhILmModCksaCkpfWVsc2V7aD1vLnFTKHQpCmlmKGg9PW51bGwpe2g9bi5x
+Uyh0KQppZihoPT1udWxsKXtoPW0ucVModCkKaWYoaD09bnVsbCl7aD1sLnFTKHQpCmlmKGg9PW51bGwp
+e2g9ay5xUyh0KQppZihoPT1udWxsKXtoPW4ucVModCkKaWYoaD09bnVsbCl7aD1qLnFTKHQpCmlmKGg9
+PW51bGwpe2g9aS5xUyh0KQpnPWghPW51bGx9ZWxzZSBnPSEwfWVsc2UgZz0hMH1lbHNlIGc9ITB9ZWxz
+ZSBnPSEwfWVsc2UgZz0hMH1lbHNlIGc9ITB9ZWxzZSBnPSEwCmlmKGcpcmV0dXJuIGUuJDEoSC5JaihI
+LmModCksaCkpfX1yZXR1cm4gZS4kMShuZXcgSC52Vih0eXBlb2YgdD09InN0cmluZyI/dDoiIikpfWlm
+KGEgaW5zdGFuY2VvZiBSYW5nZUVycm9yKXtpZih0eXBlb2YgdD09InN0cmluZyImJnQuaW5kZXhPZigi
+Y2FsbCBzdGFjayIpIT09LTEpcmV0dXJuIG5ldyBQLktZKCkKdD1mdW5jdGlvbihiKXt0cnl7cmV0dXJu
+IFN0cmluZyhiKX1jYXRjaChkKXt9cmV0dXJuIG51bGx9KGEpCnJldHVybiBlLiQxKG5ldyBQLkFUKCEx
+LGYsZix0eXBlb2YgdD09InN0cmluZyI/dC5yZXBsYWNlKC9eUmFuZ2VFcnJvcjpccyovLCIiKTp0KSl9
+aWYodHlwZW9mIEludGVybmFsRXJyb3I9PSJmdW5jdGlvbiImJmEgaW5zdGFuY2VvZiBJbnRlcm5hbEVy
+cm9yKWlmKHR5cGVvZiB0PT0ic3RyaW5nIiYmdD09PSJ0b28gbXVjaCByZWN1cnNpb24iKXJldHVybiBu
+ZXcgUC5LWSgpCnJldHVybiBhfSwKdHM6ZnVuY3Rpb24oYSl7dmFyIHQKaWYoYSBpbnN0YW5jZW9mIEgu
+YnEpcmV0dXJuIGEuYgppZihhPT1udWxsKXJldHVybiBuZXcgSC5YTyhhKQp0PWEuJGNhY2hlZFRyYWNl
+CmlmKHQhPW51bGwpcmV0dXJuIHQKcmV0dXJuIGEuJGNhY2hlZFRyYWNlPW5ldyBILlhPKGEpfSwKQjc6
+ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscT1hLmxlbmd0aApmb3IodD0wO3Q8cTt0PXIpe3M9dCsxCnI9
+cysxCmIuWSgwLGFbdF0sYVtzXSl9cmV0dXJuIGJ9LApmdDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dS5a
+LmEoYSkKc3dpdGNoKEguV1koYikpe2Nhc2UgMDpyZXR1cm4gYS4kMCgpCmNhc2UgMTpyZXR1cm4gYS4k
+MShjKQpjYXNlIDI6cmV0dXJuIGEuJDIoYyxkKQpjYXNlIDM6cmV0dXJuIGEuJDMoYyxkLGUpCmNhc2Ug
+NDpyZXR1cm4gYS4kNChjLGQsZSxmKX10aHJvdyBILmIobmV3IFAuQ0QoIlVuc3VwcG9ydGVkIG51bWJl
+ciBvZiBhcmd1bWVudHMgZm9yIHdyYXBwZWQgY2xvc3VyZSIpKX0sCnRSOmZ1bmN0aW9uKGEsYil7dmFy
+IHQKaWYoYT09bnVsbClyZXR1cm4gbnVsbAp0PWEuJGlkZW50aXR5CmlmKCEhdClyZXR1cm4gdAp0PWZ1
+bmN0aW9uKGMsZCxlKXtyZXR1cm4gZnVuY3Rpb24oZixnLGgsaSl7cmV0dXJuIGUoYyxkLGYsZyxoLGkp
+fX0oYSxiLEguZnQpCmEuJGlkZW50aXR5PXQKcmV0dXJuIHR9LAppQTpmdW5jdGlvbihhLGIsYyxkLGUs
+ZixnKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9YlswXSxrPWwuJGNhbGxOYW1lLGo9ZT9PYmplY3QuY3Jl
+YXRlKG5ldyBILnp4KCkuY29uc3RydWN0b3IucHJvdG90eXBlKTpPYmplY3QuY3JlYXRlKG5ldyBILmp5
+KG51bGwsbnVsbCxudWxsLCIiKS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpCmouJGluaXRpYWxpemU9ai5j
+b25zdHJ1Y3RvcgppZihlKXQ9ZnVuY3Rpb24gc3RhdGljX3RlYXJfb2ZmKCl7dGhpcy4kaW5pdGlhbGl6
+ZSgpfQplbHNle3M9JC55agppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLmgoKQokLnlqPXMr
+MQpzPW5ldyBGdW5jdGlvbigiYSxiLGMsZCIrcywidGhpcy4kaW5pdGlhbGl6ZShhLGIsYyxkIitzKyIp
+IikKdD1zfWouY29uc3RydWN0b3I9dAp0LnByb3RvdHlwZT1qCmlmKCFlKXtyPUguYngoYSxsLGYpCnIu
+JHJlZmxlY3Rpb25JbmZvPWR9ZWxzZXtqLiRzdGF0aWNfbmFtZT1nCnI9bH1xPUguaW0oZCxlLGYpCmou
+JFM9cQpqW2tdPXIKZm9yKHA9cixvPTE7bzxiLmxlbmd0aDsrK28pe249YltvXQptPW4uJGNhbGxOYW1l
+CmlmKG0hPW51bGwpe249ZT9uOkguYngoYSxuLGYpCmpbbV09bn1pZihvPT09Yyl7bi4kcmVmbGVjdGlv
+bkluZm89ZApwPW59fWouJEM9cApqLiRSPWwuJFIKai4kRD1sLiRECnJldHVybiB0fSwKaW06ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0CmlmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gZnVuY3Rpb24oZCxlKXty
+ZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZChlKX19KEguQnAsYSkKaWYodHlwZW9mIGE9PSJzdHJpbmci
+KXtpZihiKXRocm93IEguYigiQ2Fubm90IGNvbXB1dGUgc2lnbmF0dXJlIGZvciBzdGF0aWMgdGVhcm9m
+Zi4iKQp0PWM/SC5QVzpILlRuCnJldHVybiBmdW5jdGlvbihkLGUpe3JldHVybiBmdW5jdGlvbigpe3Jl
+dHVybiBlKHRoaXMsZCl9fShhLHQpfXRocm93IEguYigiRXJyb3IgaW4gZnVuY3Rpb25UeXBlIG9mIHRl
+YXJvZmYiKX0sCnZxOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0PUguRFYKc3dpdGNoKGI/LTE6YSl7Y2Fz
+ZSAwOnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBmKHRoaXMpW2Vd
+KCl9fShjLHQpCmNhc2UgMTpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0
+dXJuIGYodGhpcylbZV0oZyl9fShjLHQpCmNhc2UgMjpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4g
+ZnVuY3Rpb24oZyxoKXtyZXR1cm4gZih0aGlzKVtlXShnLGgpfX0oYyx0KQpjYXNlIDM6cmV0dXJuIGZ1
+bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCxpKXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSl9
+fShjLHQpCmNhc2UgNDpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGksail7
+cmV0dXJuIGYodGhpcylbZV0oZyxoLGksail9fShjLHQpCmNhc2UgNTpyZXR1cm4gZnVuY3Rpb24oZSxm
+KXtyZXR1cm4gZnVuY3Rpb24oZyxoLGksaixrKXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSxqLGspfX0o
+Yyx0KQpkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBl
+LmFwcGx5KGYodGhpcyksYXJndW1lbnRzKX19KGQsdCl9fSwKYng6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
+LHMscixxLHAsbyxuCmlmKGMpcmV0dXJuIEguSGYoYSxiKQp0PWIuJHN0dWJOYW1lCnM9Yi5sZW5ndGgK
+cj1hW3RdCnE9Yj09bnVsbD9yPT1udWxsOmI9PT1yCnA9IXF8fHM+PTI3CmlmKHApcmV0dXJuIEgudnEo
+cywhcSx0LGIpCmlmKHM9PT0wKXtxPSQueWoKaWYodHlwZW9mIHEhPT0ibnVtYmVyIilyZXR1cm4gcS5o
+KCkKJC55aj1xKzEKbz0ic2VsZiIrcQpyZXR1cm4gbmV3IEZ1bmN0aW9uKCJyZXR1cm4gZnVuY3Rpb24o
+KXt2YXIgIitvKyIgPSB0aGlzLiIrSC5kKEgub04oKSkrIjtyZXR1cm4gIitvKyIuIitILmQodCkrIigp
+O30iKSgpfW49ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zcGxpdCgiIikuc3BsaWNlKDAscyku
+am9pbigiLCIpCnE9JC55agppZih0eXBlb2YgcSE9PSJudW1iZXIiKXJldHVybiBxLmgoKQokLnlqPXEr
+MQpuKz1xCnJldHVybiBuZXcgRnVuY3Rpb24oInJldHVybiBmdW5jdGlvbigiK24rIil7cmV0dXJuIHRo
+aXMuIitILmQoSC5vTigpKSsiLiIrSC5kKHQpKyIoIituKyIpO30iKSgpfSwKWjQ6ZnVuY3Rpb24oYSxi
+LGMsZCl7dmFyIHQ9SC5EVixzPUgueVMKc3dpdGNoKGI/LTE6YSl7Y2FzZSAwOnRocm93IEguYihILkVm
+KCJJbnRlcmNlcHRlZCBmdW5jdGlvbiB3aXRoIG5vIGFyZ3VtZW50cy4iKSkKY2FzZSAxOnJldHVybiBm
+dW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSl9
+fShjLHQscykKY2FzZSAyOnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgpe3Jl
+dHVybiBmKHRoaXMpW2VdKGcodGhpcyksaCl9fShjLHQscykKY2FzZSAzOnJldHVybiBmdW5jdGlvbihl
+LGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGkpfX0o
+Yyx0LHMpCmNhc2UgNDpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbihoLGksail7
+cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksail9fShjLHQscykKY2FzZSA1OnJldHVybiBmdW5j
+dGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSxqLGspe3JldHVybiBmKHRoaXMpW2VdKGcodGhp
+cyksaCxpLGosayl9fShjLHQscykKY2FzZSA2OnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1
+bmN0aW9uKGgsaSxqLGssbCl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksaixrLGwpfX0oYyx0
+LHMpCmRlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsZixnLGgpe3JldHVybiBmdW5jdGlvbigpe2g9W2co
+dGhpcyldCkFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGgsYXJndW1lbnRzKQpyZXR1cm4gZS5hcHBs
+eShmKHRoaXMpLGgpfX0oZCx0LHMpfX0sCkhmOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG49
+SC5vTigpLG09JC5QNAppZihtPT1udWxsKW09JC5QND1ILkUyKCJyZWNlaXZlciIpCnQ9Yi4kc3R1Yk5h
+bWUKcz1iLmxlbmd0aApyPWFbdF0KcT1iPT1udWxsP3I9PW51bGw6Yj09PXIKcD0hcXx8cz49MjgKaWYo
+cClyZXR1cm4gSC5aNChzLCFxLHQsYikKaWYocz09PTEpe3E9InJldHVybiBmdW5jdGlvbigpe3JldHVy
+biB0aGlzLiIrSC5kKG4pKyIuIitILmQodCkrIih0aGlzLiIrbSsiKTsiCnA9JC55agppZih0eXBlb2Yg
+cCE9PSJudW1iZXIiKXJldHVybiBwLmgoKQokLnlqPXArMQpyZXR1cm4gbmV3IEZ1bmN0aW9uKHErcCsi
+fSIpKCl9bz0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zcGxpY2UoMCxzLTEp
+LmpvaW4oIiwiKQpxPSJyZXR1cm4gZnVuY3Rpb24oIitvKyIpe3JldHVybiB0aGlzLiIrSC5kKG4pKyIu
+IitILmQodCkrIih0aGlzLiIrbSsiLCAiK28rIik7IgpwPSQueWoKaWYodHlwZW9mIHAhPT0ibnVtYmVy
+IilyZXR1cm4gcC5oKCkKJC55aj1wKzEKcmV0dXJuIG5ldyBGdW5jdGlvbihxK3ArIn0iKSgpfSwKS3E6
+ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7cmV0dXJuIEguaUEoYSxiLGMsZCwhIWUsISFmLGcpfSwKVG46
+ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSxILnEoYS5hKSxiKX0sClBXOmZ1
+bmN0aW9uKGEsYil7cmV0dXJuIEguY0Uodi50eXBlVW5pdmVyc2UsSC5xKGEuYyksYil9LApEVjpmdW5j
+dGlvbihhKXtyZXR1cm4gYS5hfSwKeVM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY30sCm9OOmZ1bmN0aW9u
+KCl7dmFyIHQ9JC5tSgpyZXR1cm4gdD09bnVsbD8kLm1KPUguRTIoInNlbGYiKTp0fSwKRTI6ZnVuY3Rp
+b24oYSl7dmFyIHQscyxyLHE9bmV3IEguankoInNlbGYiLCJ0YXJnZXQiLCJyZWNlaXZlciIsIm5hbWUi
+KSxwPUouRXAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocSksdS56KQpmb3IodD1wLmxlbmd0aCxz
+PTA7czx0Oysrcyl7cj1wW3NdCmlmKHFbcl09PT1hKXJldHVybiByfXRocm93IEguYihQLnhZKCJGaWVs
+ZCBuYW1lICIrYSsiIG5vdCBmb3VuZC4iKSl9LApvVDpmdW5jdGlvbihhKXtpZihhPT1udWxsKUguZk8o
+ImJvb2xlYW4gZXhwcmVzc2lvbiBtdXN0IG5vdCBiZSBudWxsIikKcmV0dXJuIGF9LApmTzpmdW5jdGlv
+bihhKXt0aHJvdyBILmIobmV3IEgua1koYSkpfSwKYWc6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKG5ldyBQ
+LnQ3KGEpKX0sCkVmOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5FcShhKX0sCllnOmZ1bmN0aW9uKGEp
+e3JldHVybiB2LmdldElzb2xhdGVUYWcoYSl9LApWTTpmdW5jdGlvbihhLGIpe2Fbdi5hcnJheVJ0aV09
+YgpyZXR1cm4gYX0sCm9YOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIGEu
+JHRpfSwKSU06ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBILlk5KGFbIiRhIitILmQoYyldLEgub1goYikp
+fSwKWTk6ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVybiBiCmE9YS5hcHBseShudWxsLGIpCmlm
+KGE9PW51bGwpcmV0dXJuIG51bGwKaWYoQXJyYXkuaXNBcnJheShhKSlyZXR1cm4gYQppZih0eXBlb2Yg
+YT09ImZ1bmN0aW9uIilyZXR1cm4gYS5hcHBseShudWxsLGIpCnJldHVybiBifSwKSUc6ZnVuY3Rpb24o
+YSxiLGMpe3JldHVybiBhLmFwcGx5KGIsSC5JTShKLmlhKGIpLGIsYykpfSwKaXc6ZnVuY3Rpb24oYSxi
+LGMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOmMsZW51bWVyYWJsZTpmYWxzZSx3cml0
+YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSl9LApHOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHA9
+SC5jKCQueS4kMShhKSksbz0kLmpbcF0KaWYobyE9bnVsbCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEs
+di5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6byxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRy
+dWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gby5pfXQ9JC52W3BdCmlmKHQhPW51bGwpcmV0dXJu
+IHQKcz12LmludGVyY2VwdG9yc0J5VGFnW3BdCmlmKHM9PW51bGwpe3A9SC5jKCQudS4kMihhLHApKQpp
+ZihwIT1udWxsKXtvPSQualtwXQppZihvIT1udWxsKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSx2LmRp
+c3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpvLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxj
+b25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBvLml9dD0kLnZbcF0KaWYodCE9bnVsbClyZXR1cm4gdApz
+PXYuaW50ZXJjZXB0b3JzQnlUYWdbcF19fWlmKHM9PW51bGwpcmV0dXJuIG51bGwKdD1zLnByb3RvdHlw
+ZQpyPXBbMF0KaWYocj09PSIhIil7bz1ILmwodCkKJC5qW3BdPW8KT2JqZWN0LmRlZmluZVByb3BlcnR5
+KGEsdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6byxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxl
+OnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gby5pfWlmKHI9PT0ifiIpeyQudltwXT10CnJl
+dHVybiB0fWlmKHI9PT0iLSIpe3E9SC5sKHQpCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QuZ2V0
+UHJvdG90eXBlT2YoYSksdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6cSxlbnVtZXJhYmxlOmZh
+bHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gcS5pfWlmKHI9PT0iKyIp
+cmV0dXJuIEguTGMoYSx0KQppZihyPT09IioiKXRocm93IEguYihQLm4ocCkpCmlmKHYubGVhZlRhZ3Nb
+cF09PT10cnVlKXtxPUgubCh0KQpPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LmdldFByb3RvdHlw
+ZU9mKGEpLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOnEsZW51bWVyYWJsZTpmYWxzZSx3cml0
+YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIHEuaX1lbHNlIHJldHVybiBILkxjKGEs
+dCl9LApMYzpmdW5jdGlvbihhLGIpe3ZhciB0PU9iamVjdC5nZXRQcm90b3R5cGVPZihhKQpPYmplY3Qu
+ZGVmaW5lUHJvcGVydHkodCx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpKLlF1KGIsdCxudWxs
+LG51bGwpLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJl
+dHVybiBifSwKbDpmdW5jdGlvbihhKXtyZXR1cm4gSi5RdShhLCExLG51bGwsISFhLiRpWGopfSwKVkY6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PWIucHJvdG90eXBlCmlmKHYubGVhZlRhZ3NbYV09PT10cnVlKXJl
+dHVybiBILmwodCkKZWxzZSByZXR1cm4gSi5RdSh0LGMsbnVsbCxudWxsKX0sCk06ZnVuY3Rpb24oKXtp
+ZighMD09PSQuSylyZXR1cm4KJC5LPSEwCkguRCgpfSwKRDpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAs
+byxuLG0KJC5qPU9iamVjdC5jcmVhdGUobnVsbCkKJC52PU9iamVjdC5jcmVhdGUobnVsbCkKSC5hKCkK
+dD12LmludGVyY2VwdG9yc0J5VGFnCnM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkKaWYodHlw
+ZW9mIHdpbmRvdyE9InVuZGVmaW5lZCIpe3dpbmRvdwpyPWZ1bmN0aW9uKCl7fQpmb3IocT0wO3E8cy5s
+ZW5ndGg7KytxKXtwPXNbcV0Kbz0kLng3LiQxKHApCmlmKG8hPW51bGwpe249SC5WRihwLHRbcF0sbykK
+aWYobiE9bnVsbCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KG8sdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7
+dmFsdWU6bixlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpy
+LnByb3RvdHlwZT1vfX19fWZvcihxPTA7cTxzLmxlbmd0aDsrK3Epe3A9c1txXQppZigvXltBLVphLXpf
+XS8udGVzdChwKSl7bT10W3BdCnRbIiEiK3BdPW0KdFsifiIrcF09bQp0WyItIitwXT1tCnRbIisiK3Bd
+PW0KdFsiKiIrcF09bX19fSwKYTpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbyxuPUMuTzQoKQpuPUgu
+RihDLllxLEguRihDLktVLEguRihDLmZRLEguRihDLmZRLEguRihDLmk3LEguRihDLnhpLEguRihDLmRr
+KEMud2IpLG4pKSkpKSkpCmlmKHR5cGVvZiBkYXJ0TmF0aXZlRGlzcGF0Y2hIb29rc1RyYW5zZm9ybWVy
+IT0idW5kZWZpbmVkIil7dD1kYXJ0TmF0aXZlRGlzcGF0Y2hIb29rc1RyYW5zZm9ybWVyCmlmKHR5cGVv
+ZiB0PT0iZnVuY3Rpb24iKXQ9W3RdCmlmKHQuY29uc3RydWN0b3I9PUFycmF5KWZvcihzPTA7czx0Lmxl
+bmd0aDsrK3Mpe3I9dFtzXQppZih0eXBlb2Ygcj09ImZ1bmN0aW9uIiluPXIobil8fG59fXE9bi5nZXRU
+YWcKcD1uLmdldFVua25vd25UYWcKbz1uLnByb3RvdHlwZUZvclRhZwokLnk9bmV3IEgucihxKQokLnU9
+bmV3IEguZEMocCkKJC54Nz1uZXcgSC53TihvKX0sCkY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYShiKXx8
+Yn0sCnY0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgdD1iPyJtIjoiIixzPWM/IiI6ImkiLHI9ZD8i
+dSI6IiIscT1lPyJzIjoiIixwPWY/ImciOiIiLG89ZnVuY3Rpb24oZyxoKXt0cnl7cmV0dXJuIG5ldyBS
+ZWdFeHAoZyxoKX1jYXRjaChuKXtyZXR1cm4gbn19KGEsdCtzK3IrcStwKQppZihvIGluc3RhbmNlb2Yg
+UmVnRXhwKXJldHVybiBvCnRocm93IEguYihQLnJyKCJJbGxlZ2FsIFJlZ0V4cCBwYXR0ZXJuICgiK1N0
+cmluZyhvKSsiKSIsYSxudWxsKSl9LAptMjpmdW5jdGlvbihhLGIsYyl7dmFyIHQKaWYodHlwZW9mIGI9
+PSJzdHJpbmciKXJldHVybiBhLmluZGV4T2YoYixjKT49MAplbHNlIGlmKGIgaW5zdGFuY2VvZiBILlZS
+KXt0PUMueEIuRyhhLGMpCnJldHVybiBiLmIudGVzdCh0KX1lbHNle3Q9Si5GTChiLEMueEIuRyhhLGMp
+KQpyZXR1cm4hdC5nbDAodCl9fSwKQTQ6ZnVuY3Rpb24oYSl7aWYoYS5pbmRleE9mKCIkIiwwKT49MCly
+ZXR1cm4gYS5yZXBsYWNlKC9cJC9nLCIkJCQkIikKcmV0dXJuIGF9LAplQTpmdW5jdGlvbihhKXtpZigv
+W1tcXXt9KCkqKz8uXFxeJHxdLy50ZXN0KGEpKXJldHVybiBhLnJlcGxhY2UoL1tbXF17fSgpKis/Llxc
+XiR8XS9nLCJcXCQmIikKcmV0dXJuIGF9LAp5czpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5uTShhLGIs
+YykKcmV0dXJuIHR9LApuTTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEKaWYoYj09PSIiKXtpZihh
+PT09IiIpcmV0dXJuIGMKdD1hLmxlbmd0aApmb3Iocz1jLHI9MDtyPHQ7KytyKXM9cythW3JdK2MKcmV0
+dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9cT1hLmluZGV4T2YoYiwwKQppZihxPDApcmV0dXJuIGEK
+aWYoYS5sZW5ndGg8NTAwfHxjLmluZGV4T2YoIiQiLDApPj0wKXJldHVybiBhLnNwbGl0KGIpLmpvaW4o
+YykKcmV0dXJuIGEucmVwbGFjZShuZXcgUmVnRXhwKEguZUEoYiksJ2cnKSxILkE0KGMpKX0sClBEOmZ1
+bmN0aW9uIFBEKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCldVOmZ1bmN0aW9uIFdVKCl7fSwKTFA6
+ZnVuY3Rpb24gTFAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwK
+WFI6ZnVuY3Rpb24gWFIoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKTEk6ZnVuY3Rpb24gTEkoYSxi
+LGMsZCxlKXt2YXIgXz10aGlzCl8uYT1hCl8uYz1iCl8uZD1jCl8uZT1kCl8uZj1lfSwKQ2o6ZnVuY3Rp
+b24gQ2ooYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKZjk6ZnVuY3Rpb24gZjkoYSxi
+LGMsZCxlLGYpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWZ9LApX
+MDpmdW5jdGlvbiBXMChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKYXo6ZnVuY3Rpb24gYXooYSxiLGMp
+e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKdlY6ZnVuY3Rpb24gdlYoYSl7dGhpcy5hPWF9LApi
+cTpmdW5jdGlvbiBicShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQW06ZnVuY3Rpb24gQW0oYSl7dGhp
+cy5hPWF9LApYTzpmdW5jdGlvbiBYTyhhKXt0aGlzLmE9YQp0aGlzLmI9bnVsbH0sClRwOmZ1bmN0aW9u
+IFRwKCl7fSwKbGM6ZnVuY3Rpb24gbGMoKXt9LAp6eDpmdW5jdGlvbiB6eCgpe30sCmp5OmZ1bmN0aW9u
+IGp5KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LApFcTpmdW5jdGlv
+biBFcShhKXt0aGlzLmE9YX0sCmtZOmZ1bmN0aW9uIGtZKGEpe3RoaXMuYT1hfSwKTjU6ZnVuY3Rpb24g
+TjUoYSl7dmFyIF89dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4kdGk9
+YX0sCmRiOmZ1bmN0aW9uIGRiKGEsYil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGx9
+LAppNTpmdW5jdGlvbiBpNShhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApONjpmdW5jdGlvbiBONihh
+LGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGwKXy4kdGk9Y30sCnI6ZnVuY3Rp
+b24gcihhKXt0aGlzLmE9YX0sCmRDOmZ1bmN0aW9uIGRDKGEpe3RoaXMuYT1hfSwKd046ZnVuY3Rpb24g
+d04oYSl7dGhpcy5hPWF9LApWUjpmdW5jdGlvbiBWUihhLGIpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIK
+Xy5kPV8uYz1udWxsfSwKRUs6ZnVuY3Rpb24gRUsoYSl7dGhpcy5iPWF9LApLVzpmdW5jdGlvbiBLVyhh
+LGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApQYjpmdW5jdGlvbiBQYihhLGIsYyl7dmFy
+IF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9bnVsbH0sCnRROmZ1bmN0aW9uIHRRKGEsYil7dGhp
+cy5hPWEKdGhpcy5jPWJ9LApORjpmdW5jdGlvbiBORihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhp
+cy5jPWN9LApTZDpmdW5jdGlvbiBTZChhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9Ywpf
+LmQ9bnVsbH0sClhGOmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKb2Q6ZnVuY3Rpb24oYSxiLGMpe2lmKGE+
+Pj4wIT09YXx8YT49Yyl0aHJvdyBILmIoSC5IWShiLGEpKX0sCnJNOmZ1bmN0aW9uKGEsYixjKXt2YXIg
+dAppZighKGE+Pj4wIT09YSkpdD1iPj4+MCE9PWJ8fGE+Ynx8Yj5jCmVsc2UgdD0hMAppZih0KXRocm93
+IEguYihILmF1KGEsYixjKSkKcmV0dXJuIGJ9LApwRjpmdW5jdGlvbiBwRigpe30sCmIwOmZ1bmN0aW9u
+IGIwKCl7fSwKRGc6ZnVuY3Rpb24gRGcoKXt9LApQZzpmdW5jdGlvbiBQZygpe30sCnhqOmZ1bmN0aW9u
+IHhqKCl7fSwKZEU6ZnVuY3Rpb24gZEUoKXt9LApaQTpmdW5jdGlvbiBaQSgpe30sCndmOmZ1bmN0aW9u
+IHdmKCl7fSwKUHE6ZnVuY3Rpb24gUHEoKXt9LAplRTpmdW5jdGlvbiBlRSgpe30sClY2OmZ1bmN0aW9u
+IFY2KCl7fSwKUkc6ZnVuY3Rpb24gUkcoKXt9LApWUDpmdW5jdGlvbiBWUCgpe30sCldCOmZ1bmN0aW9u
+IFdCKCl7fSwKWkc6ZnVuY3Rpb24gWkcoKXt9LApjejpmdW5jdGlvbihhLGIpe3ZhciB0PWIuYwpyZXR1
+cm4gdD09bnVsbD9iLmM9SC5CYyhhLGIueiwhMCk6dH0sCnhaOmZ1bmN0aW9uKGEsYil7dmFyIHQ9Yi5j
+CnJldHVybiB0PT1udWxsP2IuYz1ILlEyKGEsImI4IixbYi56XSk6dH0sClExOmZ1bmN0aW9uKGEpe3Zh
+ciB0PWEueQppZih0PT09Nnx8dD09PTd8fHQ9PT04KXJldHVybiBILlExKGEueikKcmV0dXJuIHQ9PT0x
+MXx8dD09PTEyfSwKbUQ6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5jeQp0LnRvU3RyaW5nCnJldHVybiB0fSwK
+TjA6ZnVuY3Rpb24oYSl7cmV0dXJuIEguRSh2LnR5cGVVbml2ZXJzZSxhLCExKX0sClBMOmZ1bmN0aW9u
+KGEsYixjLGEwKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkPWIueQpzd2l0Y2go
+ZCl7Y2FzZSA1OmNhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpyZXR1cm4gYgpjYXNlIDY6dD1iLnoK
+cz1ILlBMKGEsdCxjLGEwKQppZihzPT09dClyZXR1cm4gYgpyZXR1cm4gSC5TTyhhLHMsITApCmNhc2Ug
+Nzp0PWIuegpzPUguUEwoYSx0LGMsYTApCmlmKHM9PT10KXJldHVybiBiCnJldHVybiBILkJjKGEscywh
+MCkKY2FzZSA4OnQ9Yi56CnM9SC5QTChhLHQsYyxhMCkKaWYocz09PXQpcmV0dXJuIGIKcmV0dXJuIEgu
+TE4oYSxzLCEwKQpjYXNlIDk6cj1iLlEKcT1ILmJaKGEscixjLGEwKQppZihxPT09cilyZXR1cm4gYgpy
+ZXR1cm4gSC5RMihhLGIueixxKQpjYXNlIDEwOnA9Yi56Cm89SC5QTChhLHAsYyxhMCkKbj1iLlEKbT1I
+LmJaKGEsbixjLGEwKQppZihvPT09cCYmbT09PW4pcmV0dXJuIGIKcmV0dXJuIEguYXAoYSxvLG0pCmNh
+c2UgMTE6bD1iLnoKaz1ILlBMKGEsbCxjLGEwKQpqPWIuUQppPUgucVQoYSxqLGMsYTApCmlmKGs9PT1s
+JiZpPT09ailyZXR1cm4gYgpyZXR1cm4gSC5OZihhLGssaSkKY2FzZSAxMjpoPWIuUQphMCs9aC5sZW5n
+dGgKZz1ILmJaKGEsaCxjLGEwKQpwPWIuegpvPUguUEwoYSxwLGMsYTApCmlmKGc9PT1oJiZvPT09cCly
+ZXR1cm4gYgpyZXR1cm4gSC5EUyhhLG8sZywhMCkKY2FzZSAxMzpmPWIuegppZihmPGEwKXJldHVybiBi
+CmU9Y1tmLWEwXQppZihlPT1udWxsKXJldHVybiBiCnJldHVybiBlCmRlZmF1bHQ6dGhyb3cgSC5iKFAu
+aFYoIkF0dGVtcHRlZCB0byBzdWJzdGl0dXRlIHVuZXhwZWN0ZWQgUlRJIGtpbmQgIitkKSl9fSwKYlo6
+ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyLHEscD1iLmxlbmd0aCxvPVtdCmZvcih0PSExLHM9MDtz
+PHA7KytzKXtyPWJbc10KcT1ILlBMKGEscixjLGQpCmlmKHEhPT1yKXQ9ITAKby5wdXNoKHEpfXJldHVy
+biB0P286Yn0sCnZPOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxLHAsbz1iLmxlbmd0aCxuPVtd
+CmZvcih0PSExLHM9MDtzPG87cys9Mil7cj1iW3NdCnE9YltzKzFdCnA9SC5QTChhLHEsYyxkKQppZihw
+IT09cSl0PSEwCm4ucHVzaChyKQpuLnB1c2gocCl9cmV0dXJuIHQ/bjpifSwKcVQ6ZnVuY3Rpb24oYSxi
+LGMsZCl7dmFyIHQscz1iLmEscj1ILmJaKGEscyxjLGQpLHE9Yi5iLHA9SC5iWihhLHEsYyxkKSxvPWIu
+YyxuPUgudk8oYSxvLGMsZCkKaWYocj09PXMmJnA9PT1xJiZuPT09bylyZXR1cm4gYgp0PW5ldyBILkVU
+KCkKdC5hPXIKdC5iPXAKdC5jPW4KcmV0dXJuIHR9LApKUzpmdW5jdGlvbihhKXt2YXIgdD1hLiRTCmlm
+KHQhPW51bGwpe2lmKHR5cGVvZiB0PT0ibnVtYmVyIilyZXR1cm4gSC5CcCh0KQpyZXR1cm4gYS4kUygp
+fXJldHVybiBudWxsfSwKVWU6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihILlExKGIpKWlmKGEgaW5zdGFu
+Y2VvZiBILlRwKXt0PUguSlMoYSkKaWYodCE9bnVsbClyZXR1cm4gdH1yZXR1cm4gSC5xKGEpfSwKcTpm
+dW5jdGlvbihhKXt2YXIgdAppZihhIGluc3RhbmNlb2YgUC5NaCl7dD1hLiR0aQpyZXR1cm4gdCE9bnVs
+bD90OkguVlUoYSl9aWYoQXJyYXkuaXNBcnJheShhKSlyZXR1cm4gSC50NihhKQpyZXR1cm4gSC5WVShK
+LmlhKGEpKX0sCnQ2OmZ1bmN0aW9uKGEpe3ZhciB0PWFbdi5hcnJheVJ0aV0scz11LnYKaWYodD09bnVs
+bClyZXR1cm4gcwppZih0LmNvbnN0cnVjdG9yIT09cy5jb25zdHJ1Y3RvcilyZXR1cm4gcwpyZXR1cm4g
+dH0sCkxoOmZ1bmN0aW9uKGEpe3ZhciB0PWEuJHRpCnJldHVybiB0IT1udWxsP3Q6SC5WVShhKX0sClZV
+OmZ1bmN0aW9uKGEpe3ZhciB0PWEuY29uc3RydWN0b3Iscz10LiRjY2FjaGUKaWYocyE9bnVsbClyZXR1
+cm4gcwpyZXR1cm4gSC5yOShhLHQpfSwKcjk6ZnVuY3Rpb24oYSxiKXt2YXIgdD1hIGluc3RhbmNlb2Yg
+SC5UcD9hLl9fcHJvdG9fXy5fX3Byb3RvX18uY29uc3RydWN0b3I6YixzPUguYWkodi50eXBlVW5pdmVy
+c2UsdC5uYW1lKQpiLiRjY2FjaGU9cwpyZXR1cm4gc30sCkJwOmZ1bmN0aW9uKGEpe3ZhciB0LHM9YSxy
+PXYudHlwZXMscT1yW3NdCmlmKHR5cGVvZiBxPT0ic3RyaW5nIil7dD1ILkUodi50eXBlVW5pdmVyc2Us
+cSwhMSkKcltzXT10CnJldHVybiB0fXJldHVybiBxfSwKSko6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcyxz
+PUguWU8scj11LksKaWYodD09PXIpe3M9SC5rZQp0LmE9SC5UaX1lbHNlIGlmKEguQTgodCl8fHQ9PT1y
+KXtzPUguSXcKdC5hPUguaG59ZWxzZSBpZih0PT09dS5xKXM9SC5vawplbHNlIGlmKHQ9PT11LmdSKXM9
+SC5LSAplbHNlIGlmKHQ9PT11LmRpKXM9SC5LSAplbHNlIGlmKHQ9PT11Lk4pcz1ILk1NCmVsc2UgaWYo
+dD09PXUueSlzPUguclEKZWxzZSBpZih0Lnk9PT05KXtyPXQuegppZih0LlEuZXZlcnkoSC5jYykpe3Qu
+cj0iJGkiK3IKcz1ILnQ0fX10LmI9cwpyZXR1cm4gdC5iKGEpfSwKWU86ZnVuY3Rpb24oYSl7dmFyIHQ9
+dGhpcwpyZXR1cm4gSC5XZSh2LnR5cGVVbml2ZXJzZSxILlVlKGEsdCksbnVsbCx0LG51bGwpfSwKdDQ6
+ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcwp0PXQucgp0LnRvU3RyaW5nCmlmKGEgaW5zdGFuY2VvZiBQLk1o
+KXJldHVybiEhYVt0XQpyZXR1cm4hIUouaWEoYSlbdF19LApPejpmdW5jdGlvbihhKXt2YXIgdD10aGlz
+CmlmKGE9PW51bGwpcmV0dXJuIGEKZWxzZSBpZih0LmIoYSkpcmV0dXJuIGEKdGhyb3cgSC5iKEguWmMo
+SC5wKGEsSC5VZShhLHQpLEguSih0LG51bGwpKSkpfSwKRGg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQ9
+bnVsbAppZihILldlKHYudHlwZVVuaXZlcnNlLGEsdCxiLHQpKXJldHVybiBhCnRocm93IEguYihILlpj
+KCJUaGUgdHlwZSBhcmd1bWVudCAnIitILmQoSC5KKGEsdCkpKyInIGlzIG5vdCBhIHN1YnR5cGUgb2Yg
+dGhlIHR5cGUgdmFyaWFibGUgYm91bmQgJyIrSC5kKEguSihiLHQpKSsiJyBvZiB0eXBlIHZhcmlhYmxl
+ICciK2MrIicgaW4gJyIrSC5kKGQpKyInLiIpKX0sCnA6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PVAuaChh
+KSxzPUguSihiPT1udWxsP0gucShhKTpiLG51bGwpCnJldHVybiB0KyI6IHR5cGUgJyIrSC5kKHMpKyIn
+IGlzIG5vdCBhIHN1YnR5cGUgb2YgdHlwZSAnIitILmQoYykrIicifSwKWmM6ZnVuY3Rpb24oYSl7cmV0
+dXJuIG5ldyBILngoIlR5cGVFcnJvcjogIithKX0sCkI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgu
+eCgiVHlwZUVycm9yOiAiK0gucChhLG51bGwsYikpfSwKa2U6ZnVuY3Rpb24oYSl7cmV0dXJuITB9LApU
+aTpmdW5jdGlvbihhKXtyZXR1cm4gYX0sCkl3OmZ1bmN0aW9uKGEpe3JldHVybiEwfSwKaG46ZnVuY3Rp
+b24oYSl7cmV0dXJuIGF9LApyUTpmdW5jdGlvbihhKXtyZXR1cm4hMD09PWF8fCExPT09YX0sCkU5OmZ1
+bmN0aW9uKGEpe2lmKCEwPT09YXx8ITE9PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhy
+b3cgSC5iKEguQihhLCJib29sIikpfSwKZGo6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIi
+KXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEguQihhLCJkb3VibGUiKSl9LApv
+azpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJudW1iZXIiJiZNYXRoLmZsb29yKGEpPT09YX0s
+CldZOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIiYmTWF0aC5mbG9vcihhKT09PWEpcmV0
+dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5CKGEsImludCIpKX0sCktIOmZ1bmN0
+aW9uKGEpe3JldHVybiB0eXBlb2YgYT09Im51bWJlciJ9LAp1VTpmdW5jdGlvbihhKXtpZih0eXBlb2Yg
+YT09Im51bWJlciIpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5CKGEsIm51
+bSIpKX0sCk1NOmZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09InN0cmluZyJ9LApjOmZ1bmN0aW9u
+KGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93
+IEguYihILkIoYSwiU3RyaW5nIikpfSwKdzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscgpmb3IodD0iIixz
+PSIiLHI9MDtyPGEubGVuZ3RoOysrcixzPSIsICIpdCs9Qy54Qi5oKHMsSC5KKGFbcl0sYikpCnJldHVy
+biB0fSwKZjpmdW5jdGlvbihhMSxhMixhMyl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxm
+LGUsZCxjLGIsYSxhMD0iLCAiCmlmKGEzIT1udWxsKXt0PWEzLmxlbmd0aAppZihhMj09bnVsbCl7YTI9
+SC5WTShbXSx1LnMpCnM9bnVsbH1lbHNlIHM9YTIubGVuZ3RoCnI9YTIubGVuZ3RoCmZvcihxPXQ7cT4w
+Oy0tcSlDLk5tLmkoYTIsIlQiKyhyK3EpKQpmb3IocD11Lkssbz0iPCIsbj0iIixxPTA7cTx0OysrcSxu
+PWEwKXtvKz1uCm09YTIubGVuZ3RoCmw9bS0xLXEKaWYobDwwKXJldHVybiBILmsoYTIsbCkKbz1DLnhC
+LmgobyxhMltsXSkKaz1hM1txXQppZighKEguQTgoayl8fGs9PT1wKSltPSEoaz09PXApCmVsc2UgbT0h
+MQppZihtKW8rPUMueEIuaCgiIGV4dGVuZHMgIixILkooayxhMikpfW8rPSI+In1lbHNle289IiIKcz1u
+dWxsfXA9YTEuegpqPWExLlEKaT1qLmEKaD1pLmxlbmd0aApnPWouYgpmPWcubGVuZ3RoCmU9ai5jCmQ9
+ZS5sZW5ndGgKYz1ILkoocCxhMikKZm9yKGI9IiIsYT0iIixxPTA7cTxoOysrcSxhPWEwKWIrPUMueEIu
+aChhLEguSihpW3FdLGEyKSkKaWYoZj4wKXtiKz1hKyJbIgpmb3IoYT0iIixxPTA7cTxmOysrcSxhPWEw
+KWIrPUMueEIuaChhLEguSihnW3FdLGEyKSkKYis9Il0ifWlmKGQ+MCl7Yis9YSsieyIKZm9yKGE9IiIs
+cT0wO3E8ZDtxKz0yLGE9YTApYis9Qy54Qi5oKGEsSC5KKGVbcSsxXSxhMikpKyIgIitlW3FdCmIrPSJ9
+In1pZihzIT1udWxsKXthMi50b1N0cmluZwphMi5sZW5ndGg9c31yZXR1cm4gbysiKCIrYisiKSA9PiAi
+K0guZChjKX0sCko6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixtPWEueQppZihtPT09NSly
+ZXR1cm4iZXJhc2VkIgppZihtPT09MilyZXR1cm4iZHluYW1pYyIKaWYobT09PTMpcmV0dXJuInZvaWQi
+CmlmKG09PT0xKXJldHVybiJOZXZlciIKaWYobT09PTQpcmV0dXJuImFueSIKaWYobT09PTYpe3Q9SC5K
+KGEueixiKQpyZXR1cm4gdH1pZihtPT09Nyl7cz1hLnoKdD1ILkoocyxiKQpyPXMueQpyZXR1cm4gSi5t
+KHI9PT0xMXx8cj09PTEyP0MueEIuaCgiKCIsdCkrIikiOnQsIj8iKX1pZihtPT09OClyZXR1cm4iRnV0
+dXJlT3I8IitILmQoSC5KKGEueixiKSkrIj4iCmlmKG09PT05KXtxPUguQyhhLnopCnA9YS5RCnJldHVy
+biBwLmxlbmd0aCE9PTA/cSsoIjwiK0gudyhwLGIpKyI+Iik6cX1pZihtPT09MTEpcmV0dXJuIEguZihh
+LGIsbnVsbCkKaWYobT09PTEyKXJldHVybiBILmYoYS56LGIsYS5RKQppZihtPT09MTMpe2IudG9TdHJp
+bmcKbz1hLnoKbj1iLmxlbmd0aApvPW4tMS1vCmlmKG88MHx8bz49bilyZXR1cm4gSC5rKGIsbykKcmV0
+dXJuIGJbb119cmV0dXJuIj8ifSwKQzpmdW5jdGlvbihhKXt2YXIgdCxzPUguSmcoYSkKaWYocyE9bnVs
+bClyZXR1cm4gcwp0PSJtaW5pZmllZDoiK2EKcmV0dXJuIHR9LApRbzpmdW5jdGlvbihhLGIpe3ZhciB0
+PWEudFJbYl0KZm9yKDt0eXBlb2YgdD09InN0cmluZyI7KXQ9YS50Ult0XQpyZXR1cm4gdH0sCmFpOmZ1
+bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPWEuZVQsbj1vW2JdCmlmKG49PW51bGwpcmV0dXJuIEgu
+RShhLGIsITEpCmVsc2UgaWYodHlwZW9mIG49PSJudW1iZXIiKXt0PW4Kcz1ILm1aKGEsNSwiIyIpCnI9
+W10KZm9yKHE9MDtxPHQ7KytxKXIucHVzaChzKQpwPUguUTIoYSxiLHIpCm9bYl09cApyZXR1cm4gcH1l
+bHNlIHJldHVybiBufSwKeGI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5JeChhLnRSLGIpfSwKRkY6ZnVu
+Y3Rpb24oYSxiKXtyZXR1cm4gSC5JeChhLmVULGIpfSwKRTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1h
+LmVDLHI9cy5nZXQoYikKaWYociE9bnVsbClyZXR1cm4gcgp0PUgueihhLG51bGwsYixjKQpzLnNldChi
+LHQpCnJldHVybiB0fSwKY0U6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscj1iLmNoCmlmKHI9PW51bGwp
+cj1iLmNoPW5ldyBNYXAoKQp0PXIuZ2V0KGMpCmlmKHQhPW51bGwpcmV0dXJuIHQKcz1ILnooYSxiLGMs
+ITApCnIuc2V0KGMscykKcmV0dXJuIHN9LAp2NTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscD1i
+LmN4CmlmKHA9PW51bGwpcD1iLmN4PW5ldyBNYXAoKQp0PWMuY3kKdC50b1N0cmluZwpzPXQKcj1wLmdl
+dChzKQppZihyIT1udWxsKXJldHVybiByCnE9SC5hcChhLGIsYy55PT09MTA/Yy5ROltjXSkKcC5zZXQo
+cyxxKQpyZXR1cm4gcX0sCno6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQ9SC5pKEgubyhhLGIsYyxkKSkK
+aWYodCE9bnVsbClyZXR1cm4gdAp0aHJvdyBILmIoUC5uKCdfVW5pdmVyc2UuX3BhcnNlUmVjaXBlKCIn
+K0guZChjKSsnIiknKSl9LApCRDpmdW5jdGlvbihhLGIpe2IuYT1ILk96CmIuYj1ILkpKCnJldHVybiBi
+fSwKbVo6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscj1hLmVDLmdldChjKQppZihyIT1udWxsKXJldHVy
+biByCnQ9bmV3IEguSmMobnVsbCxudWxsKQp0Lnk9Ygp0LmN5PWMKcz1ILkJEKGEsdCkKYS5lQy5zZXQo
+YyxzKQpyZXR1cm4gc30sClNPOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHI9Yi5jeQpyLnRvU3RyaW5n
+CnQ9cisiKiIKcz1hLmVDLmdldCh0KQppZihzIT1udWxsKXJldHVybiBzCnI9SC5aNyhhLGIsdCxjKQph
+LmVDLnNldCh0LHIpCnJldHVybiByfSwKWjc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscwppZihkKXt0
+PWIueQppZihILkE4KGIpfHxiPT09dS5LfHxiPT09dS5QfHx0PT09N3x8dD09PTYpcmV0dXJuIGJ9cz1u
+ZXcgSC5KYyhudWxsLG51bGwpCnMueT02CnMuej1iCnMuY3k9YwpyZXR1cm4gSC5CRChhLHMpfSwKQmM6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscj1iLmN5CnIudG9TdHJpbmcKdD1yKyI/IgpzPWEuZUMuZ2V0
+KHQpCmlmKHMhPW51bGwpcmV0dXJuIHMKcj1ILmxsKGEsYix0LGMpCmEuZUMuc2V0KHQscikKcmV0dXJu
+IHJ9LApsbDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHIscQppZihkKXt0PWIueQppZighSC5BOChi
+KSlpZighKGI9PT11LlApKWlmKHQhPT03KXM9dD09PTgmJkgubFIoYi56KQplbHNlIHM9ITAKZWxzZSBz
+PSEwCmVsc2Ugcz0hMAppZihzKXJldHVybiBiCmVsc2UgaWYodD09PTF8fGI9PT11LmF3KXJldHVybiB1
+LlAKZWxzZSBpZih0PT09Nil7cj1iLnoKaWYoci55PT09OCYmSC5sUihyLnopKXJldHVybiByCmVsc2Ug
+cmV0dXJuIEguY3ooYSxiKX19cT1uZXcgSC5KYyhudWxsLG51bGwpCnEueT03CnEuej1iCnEuY3k9Ywpy
+ZXR1cm4gSC5CRChhLHEpfSwKTE46ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscj1iLmN5CnIudG9TdHJp
+bmcKdD1yKyIvIgpzPWEuZUMuZ2V0KHQpCmlmKHMhPW51bGwpcmV0dXJuIHMKcj1ILmVWKGEsYix0LGMp
+CmEuZUMuc2V0KHQscikKcmV0dXJuIHJ9LAplVjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzCmlmKGQp
+e3Q9Yi55CmlmKEguQTgoYil8fGI9PT11Lkt8fGI9PT11LkspcmV0dXJuIGIKZWxzZSBpZih0PT09MSly
+ZXR1cm4gSC5RMihhLCJiOCIsW2JdKQplbHNlIGlmKGI9PT11LlApcmV0dXJuIHUuYVF9cz1uZXcgSC5K
+YyhudWxsLG51bGwpCnMueT04CnMuej1iCnMuY3k9YwpyZXR1cm4gSC5CRChhLHMpfSwKSGM6ZnVuY3Rp
+b24oYSxiKXt2YXIgdCxzLHI9IiIrYisiXiIscT1hLmVDLmdldChyKQppZihxIT1udWxsKXJldHVybiBx
+CnQ9bmV3IEguSmMobnVsbCxudWxsKQp0Lnk9MTMKdC56PWIKdC5jeT1yCnM9SC5CRChhLHQpCmEuZUMu
+c2V0KHIscykKcmV0dXJuIHN9LApVeDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwPWEubGVuZ3RoCmZv
+cih0PSIiLHM9IiIscj0wO3I8cDsrK3Iscz0iLCIpe3E9YVtyXS5jeQpxLnRvU3RyaW5nCnQrPXMrcX1y
+ZXR1cm4gdH0sClM0OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbz1hLmxlbmd0aApmb3IodD0iIixz
+PSIiLHI9MDtyPG87cis9MixzPSIsIil7cT1hW3JdCnA9YVtyKzFdLmN5CnAudG9TdHJpbmcKdCs9cytx
+KyI6IitwfXJldHVybiB0fSwKUTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxPWIKaWYoYy5sZW5n
+dGghPT0wKXErPSI8IitILlV4KGMpKyI+Igp0PWEuZUMuZ2V0KHEpCmlmKHQhPW51bGwpcmV0dXJuIHQK
+cz1uZXcgSC5KYyhudWxsLG51bGwpCnMueT05CnMuej1iCnMuUT1jCmlmKGMubGVuZ3RoPjApcy5jPWNb
+MF0Kcy5jeT1xCnI9SC5CRChhLHMpCmEuZUMuc2V0KHEscikKcmV0dXJuIHJ9LAphcDpmdW5jdGlvbihh
+LGIsYyl7dmFyIHQscyxyLHEscCxvCmlmKGIueT09PTEwKXt0PWIuegpzPWIuUS5jb25jYXQoYyl9ZWxz
+ZXtzPWMKdD1ifXI9dC5jeQpyLnRvU3RyaW5nCnE9cisiOyIrKCI8IitILlV4KHMpKyI+IikKcD1hLmVD
+LmdldChxKQppZihwIT1udWxsKXJldHVybiBwCm89bmV3IEguSmMobnVsbCxudWxsKQpvLnk9MTAKby56
+PXQKby5RPXMKby5jeT1xCnI9SC5CRChhLG8pCmEuZUMuc2V0KHEscikKcmV0dXJuIHJ9LApOZjpmdW5j
+dGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaj1iLmN5CmoudG9TdHJpbmcKdD1jLmEK
+cz10Lmxlbmd0aApyPWMuYgpxPXIubGVuZ3RoCnA9Yy5jCm89cC5sZW5ndGgKbj0iKCIrSC5VeCh0KQpp
+ZihxPjApbis9KHM+MD8iLCI6IiIpKyJbIitILlV4KHIpKyJdIgppZihvPjApbis9KHM+MD8iLCI6IiIp
+KyJ7IitILlM0KHApKyJ9IgptPWorKG4rIikiKQpsPWEuZUMuZ2V0KG0pCmlmKGwhPW51bGwpcmV0dXJu
+IGwKaz1uZXcgSC5KYyhudWxsLG51bGwpCmsueT0xMQprLno9YgprLlE9YwprLmN5PW0Kaj1ILkJEKGEs
+aykKYS5lQy5zZXQobSxqKQpyZXR1cm4gan0sCkRTOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscj1i
+LmN5CnIudG9TdHJpbmcKdD1yKyI8IitILlV4KGMpKyI+IgpzPWEuZUMuZ2V0KHQpCmlmKHMhPW51bGwp
+cmV0dXJuIHMKcj1ILmh3KGEsYixjLHQsZCkKYS5lQy5zZXQodCxyKQpyZXR1cm4gcn0sCmh3OmZ1bmN0
+aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyLHEscCxvLG4sbQppZihlKXt0PWMubGVuZ3RoCnM9bmV3IEFy
+cmF5KHQpCmZvcihyPTAscT0wO3E8dDsrK3Epe3A9Y1txXQppZihwLnk9PT0xKXtzW3FdPXA7KytyfX1p
+ZihyPjApe289SC5QTChhLGIscywwKQpuPUguYlooYSxjLHMsMCkKcmV0dXJuIEguRFMoYSxvLG4sYyE9
+PW4pfX1tPW5ldyBILkpjKG51bGwsbnVsbCkKbS55PTEyCm0uej1iCm0uUT1jCm0uY3k9ZApyZXR1cm4g
+SC5CRChhLG0pfSwKbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm57dTphLGU6YixyOmMsczpbXSxwOjAs
+bjpkfX0sCmk6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGg9YS5yLGc9YS5z
+CmZvcih0PWgubGVuZ3RoLHM9MDtzPHQ7KXtyPWguY2hhckNvZGVBdChzKQppZihyPj00OCYmcjw9NTcp
+cz1ILkFsKHMrMSxyLGgsZykKZWxzZSBpZigoKChyfDMyKT4+PjApLTk3JjY1NTM1KTwyNnx8cj09PTk1
+fHxyPT09MzYpcz1ILlI4KGEscyxoLGcsITEpCmVsc2UgaWYocj09PTQ2KXM9SC5SOChhLHMsaCxnLCEw
+KQplbHNleysrcwpzd2l0Y2gocil7Y2FzZSA0NDpicmVhawpjYXNlIDU4OmJyZWFrCmNhc2UgNTk6Zy5w
+dXNoKEguS1EoYS51LGEuZSxnLnBvcCgpKSkKYnJlYWsKY2FzZSA5NDpnLnB1c2goSC5IYyhhLnUsZy5w
+b3AoKSkpCmJyZWFrCmNhc2UgMzU6Zy5wdXNoKEgubVooYS51LDUsIiMiKSkKYnJlYWsKY2FzZSA2NDpn
+LnB1c2goSC5tWihhLnUsMiwiQCIpKQpicmVhawpjYXNlIDEyNjpnLnB1c2goSC5tWihhLnUsMywifiIp
+KQpicmVhawpjYXNlIDYwOmcucHVzaChhLnApCmEucD1nLmxlbmd0aApicmVhawpjYXNlIDYyOnE9YS51
+CnA9Zy5zcGxpY2UoYS5wKQpILnJUKGEudSxhLmUscCkKYS5wPWcucG9wKCkKbz1nLnBvcCgpCmlmKHR5
+cGVvZiBvPT0ic3RyaW5nIilnLnB1c2goSC5RMihxLG8scCkpCmVsc2V7bj1ILktRKHEsYS5lLG8pCnN3
+aXRjaChuLnkpe2Nhc2UgMTE6Zy5wdXNoKEguRFMocSxuLHAsYS5uKSkKYnJlYWsKZGVmYXVsdDpnLnB1
+c2goSC5hcChxLG4scCkpCmJyZWFrfX1icmVhawpjYXNlIDM4OkguSTMoYSxnKQpicmVhawpjYXNlIDQy
+Om09YS51CmcucHVzaChILlNPKG0sSC5LUShtLGEuZSxnLnBvcCgpKSxhLm4pKQpicmVhawpjYXNlIDYz
+Om09YS51CmcucHVzaChILkJjKG0sSC5LUShtLGEuZSxnLnBvcCgpKSxhLm4pKQpicmVhawpjYXNlIDQ3
+Om09YS51CmcucHVzaChILkxOKG0sSC5LUShtLGEuZSxnLnBvcCgpKSxhLm4pKQpicmVhawpjYXNlIDQw
+OmcucHVzaChhLnApCmEucD1nLmxlbmd0aApicmVhawpjYXNlIDQxOnE9YS51Cmw9bmV3IEguRVQoKQpr
+PXEuc0VBCmo9cS5zRUEKbz1nLnBvcCgpCmlmKHR5cGVvZiBvPT0ibnVtYmVyIilzd2l0Y2gobyl7Y2Fz
+ZS0xOms9Zy5wb3AoKQpicmVhawpjYXNlLTI6aj1nLnBvcCgpCmJyZWFrCmRlZmF1bHQ6Zy5wdXNoKG8p
+CmJyZWFrfWVsc2UgZy5wdXNoKG8pCnA9Zy5zcGxpY2UoYS5wKQpILnJUKGEudSxhLmUscCkKYS5wPWcu
+cG9wKCkKbC5hPXAKbC5iPWsKbC5jPWoKZy5wdXNoKEguTmYocSxILktRKHEsYS5lLGcucG9wKCkpLGwp
+KQpicmVhawpjYXNlIDkxOmcucHVzaChhLnApCmEucD1nLmxlbmd0aApicmVhawpjYXNlIDkzOnA9Zy5z
+cGxpY2UoYS5wKQpILnJUKGEudSxhLmUscCkKYS5wPWcucG9wKCkKZy5wdXNoKHApCmcucHVzaCgtMSkK
+YnJlYWsKY2FzZSAxMjM6Zy5wdXNoKGEucCkKYS5wPWcubGVuZ3RoCmJyZWFrCmNhc2UgMTI1OnA9Zy5z
+cGxpY2UoYS5wKQpILldTKGEudSxhLmUscCkKYS5wPWcucG9wKCkKZy5wdXNoKHApCmcucHVzaCgtMikK
+YnJlYWsKZGVmYXVsdDp0aHJvdyJCYWQgY2hhcmFjdGVyICIrcn19fWk9Zy5wb3AoKQpyZXR1cm4gSC5L
+UShhLnUsYS5lLGkpfSwKQWw6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyPWItNDgKZm9yKHQ9Yy5s
+ZW5ndGg7YTx0OysrYSl7cz1jLmNoYXJDb2RlQXQoYSkKaWYoIShzPj00OCYmczw9NTcpKWJyZWFrCnI9
+cioxMCsocy00OCl9ZC5wdXNoKHIpCnJldHVybiBhfSwKUjg6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIg
+dCxzLHIscSxwLG8sbj1iKzEKZm9yKHQ9Yy5sZW5ndGg7bjx0Oysrbil7cz1jLmNoYXJDb2RlQXQobikK
+aWYocz09PTQ2KXtpZihlKWJyZWFrCmU9ITB9ZWxzZXtpZighKCgoKHN8MzIpPj4+MCktOTcmNjU1MzUp
+PDI2fHxzPT09OTV8fHM9PT0zNikpcj1zPj00OCYmczw9NTcKZWxzZSByPSEwCmlmKCFyKWJyZWFrfX1x
+PWMuc3Vic3RyaW5nKGIsbikKaWYoZSl7dD1hLnUKcD1hLmUKaWYocC55PT09MTApcD1wLnoKbz1ILlFv
+KHQscC56KVtxXQppZihvPT1udWxsKUgudmgoJ05vICInK3ErJyIgaW4gIicrSC5tRChwKSsnIicpCmQu
+cHVzaChILmNFKHQscCxvKSl9ZWxzZSBkLnB1c2gocSkKcmV0dXJuIG59LApJMzpmdW5jdGlvbihhLGIp
+e3ZhciB0PWIucG9wKCkKaWYoMD09PXQpe2IucHVzaChILm1aKGEudSwxLCIwJiIpKQpyZXR1cm59aWYo
+MT09PXQpe2IucHVzaChILm1aKGEudSw0LCIxJiIpKQpyZXR1cm59dGhyb3cgSC5iKFAuaFYoIlVuZXhw
+ZWN0ZWQgZXh0ZW5kZWQgb3BlcmF0aW9uICIrSC5kKHQpKSl9LApLUTpmdW5jdGlvbihhLGIsYyl7aWYo
+dHlwZW9mIGM9PSJzdHJpbmciKXJldHVybiBILlEyKGEsYyxhLnNFQSkKZWxzZSBpZih0eXBlb2YgYz09
+Im51bWJlciIpcmV0dXJuIEguVFYoYSxiLGMpCmVsc2UgcmV0dXJuIGN9LApyVDpmdW5jdGlvbihhLGIs
+Yyl7dmFyIHQscz1jLmxlbmd0aApmb3IodD0wO3Q8czsrK3QpY1t0XT1ILktRKGEsYixjW3RdKX0sCldT
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPWMubGVuZ3RoCmZvcih0PTE7dDxzO3QrPTIpY1t0XT1ILktR
+KGEsYixjW3RdKX0sClRWOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHI9Yi55CmlmKHI9PT0xMCl7aWYo
+Yz09PTApcmV0dXJuIGIuegp0PWIuUQpzPXQubGVuZ3RoCmlmKGM8PXMpcmV0dXJuIHRbYy0xXQpjLT1z
+CmI9Yi56CnI9Yi55fWVsc2UgaWYoYz09PTApcmV0dXJuIGIKaWYociE9PTkpdGhyb3cgSC5iKFAuaFYo
+IkluZGV4ZWQgYmFzZSBtdXN0IGJlIGFuIGludGVyZmFjZSB0eXBlIikpCnQ9Yi5RCmlmKGM8PXQubGVu
+Z3RoKXJldHVybiB0W2MtMV0KdGhyb3cgSC5iKFAuaFYoIkJhZCBpbmRleCAiK2MrIiBmb3IgIitiLloo
+MCkpKX0sCldlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGsKaWYoYj09
+PWQpcmV0dXJuITAKaWYoSC5BOChkKXx8ZD09PXUuSylyZXR1cm4hMAp0PWIueQppZih0PT09NClyZXR1
+cm4hMAppZihILkE4KGIpKXJldHVybiExCmlmKGI9PT11LlApcmV0dXJuITAKcz10PT09MTMKaWYocylp
+ZihILldlKGEsY1tiLnpdLGMsZCxlKSlyZXR1cm4hMApyPWQueQppZih0PT09NilyZXR1cm4gSC5XZShh
+LGIueixjLGQsZSkKaWYocj09PTYpe3E9ZC56CnJldHVybiBILldlKGEsYixjLHEsZSl9aWYodD09PTgp
+e2lmKCFILldlKGEsYi56LGMsZCxlKSlyZXR1cm4hMQpyZXR1cm4gSC5XZShhLEgueFooYSxiKSxjLGQs
+ZSl9aWYodD09PTcpe3E9SC5XZShhLGIueixjLGQsZSkKcmV0dXJuIHF9aWYocj09PTgpe2lmKEguV2Uo
+YSxiLGMsZC56LGUpKXJldHVybiEwCnJldHVybiBILldlKGEsYixjLEgueFooYSxkKSxlKX1pZihyPT09
+Nyl7cT1ILldlKGEsYixjLGQueixlKQpyZXR1cm4gcX1pZihzKXJldHVybiExCnE9dCE9PTExCmlmKCgh
+cXx8dD09PTEyKSYmZD09PXUuWilyZXR1cm4hMAppZihyPT09MTIpe2lmKGI9PT11LmcpcmV0dXJuITAK
+aWYodCE9PTEyKXJldHVybiExCnA9Yi5RCm89ZC5RCm49cC5sZW5ndGgKaWYobiE9PW8ubGVuZ3RoKXJl
+dHVybiExCmM9Yz09bnVsbD9wOnAuY29uY2F0KGMpCmU9ZT09bnVsbD9vOm8uY29uY2F0KGUpCmZvciht
+PTA7bTxuOysrbSl7bD1wW21dCms9b1ttXQppZighSC5XZShhLGwsYyxrLGUpfHwhSC5XZShhLGssZSxs
+LGMpKXJldHVybiExfXJldHVybiBILmJPKGEsYi56LGMsZC56LGUpfWlmKHI9PT0xMSl7aWYoYj09PXUu
+ZylyZXR1cm4hMAppZihxKXJldHVybiExCnJldHVybiBILmJPKGEsYixjLGQsZSl9aWYodD09PTkpe2lm
+KHIhPT05KXJldHVybiExCnJldHVybiBILnBHKGEsYixjLGQsZSl9cmV0dXJuITF9LApiTzpmdW5jdGlv
+bihhMCxhMSxhMixhMyxhNCl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIs
+YQppZighSC5XZShhMCxhMS56LGEyLGEzLnosYTQpKXJldHVybiExCnQ9YTEuUQpzPWEzLlEKcj10LmEK
+cT1zLmEKcD1yLmxlbmd0aApvPXEubGVuZ3RoCmlmKHA+bylyZXR1cm4hMQpuPW8tcAptPXQuYgpsPXMu
+YgprPW0ubGVuZ3RoCmo9bC5sZW5ndGgKaWYocCtrPG8railyZXR1cm4hMQpmb3IoaT0wO2k8cDsrK2kp
+e2g9cltpXQppZighSC5XZShhMCxxW2ldLGE0LGgsYTIpKXJldHVybiExfWZvcihpPTA7aTxuOysraSl7
+aD1tW2ldCmlmKCFILldlKGEwLHFbcCtpXSxhNCxoLGEyKSlyZXR1cm4hMX1mb3IoaT0wO2k8ajsrK2kp
+e2g9bVtuK2ldCmlmKCFILldlKGEwLGxbaV0sYTQsaCxhMikpcmV0dXJuITF9Zz10LmMKZj1zLmMKZT1n
+Lmxlbmd0aApkPWYubGVuZ3RoCmZvcihpPTAsYz0wO2M8ZDtjKz0yKXtiPWZbY10KZG97aWYoaT49ZSly
+ZXR1cm4hMQphPWdbaV0KaSs9Mn13aGlsZShhPGIpCmlmKGI8YSlyZXR1cm4hMQpoPWdbaS0xXQppZigh
+SC5XZShhMCxmW2MrMV0sYTQsaCxhMikpcmV0dXJuITF9cmV0dXJuITB9LApwRzpmdW5jdGlvbihhLGIs
+YyxkLGUpe3ZhciB0LHMscixxLHAsbyxuLG0sbD1iLnosaz1kLnoKaWYobD09PWspe3Q9Yi5RCnM9ZC5R
+CnI9dC5sZW5ndGgKZm9yKHE9MDtxPHI7KytxKXtwPXRbcV0Kbz1zW3FdCmlmKCFILldlKGEscCxjLG8s
+ZSkpcmV0dXJuITF9cmV0dXJuITB9aWYoZD09PXUuSylyZXR1cm4hMApuPUguUW8oYSxsKQppZihuPT1u
+dWxsKXJldHVybiExCm09bltrXQppZihtPT1udWxsKXJldHVybiExCnI9bS5sZW5ndGgKcz1kLlEKZm9y
+KHE9MDtxPHI7KytxKWlmKCFILldlKGEsSC5jRShhLGIsbVtxXSksYyxzW3FdLGUpKXJldHVybiExCnJl
+dHVybiEwfSwKbFI6ZnVuY3Rpb24oYSl7dmFyIHQscz1hLnkKaWYoIShhPT09dS5QKSlpZighSC5BOChh
+KSlpZihzIT09NylpZighKHM9PT02JiZILmxSKGEueikpKXQ9cz09PTgmJkgubFIoYS56KQplbHNlIHQ9
+ITAKZWxzZSB0PSEwCmVsc2UgdD0hMAplbHNlIHQ9ITAKcmV0dXJuIHR9LApjYzpmdW5jdGlvbihhKXty
+ZXR1cm4gSC5BOChhKXx8YT09PXUuS30sCkE4OmZ1bmN0aW9uKGEpe3ZhciB0LHM9YS55CmlmKHMhPT0y
+KWlmKHMhPT0zKWlmKHMhPT00KWlmKHMhPT01KXt0PXUuSwp0PWE9PT10fHxhPT09dH1lbHNlIHQ9ITAK
+ZWxzZSB0PSEwCmVsc2UgdD0hMAplbHNlIHQ9ITAKcmV0dXJuIHR9LApJeDpmdW5jdGlvbihhLGIpe3Zh
+ciB0LHMscj1PYmplY3Qua2V5cyhiKSxxPXIubGVuZ3RoCmZvcih0PTA7dDxxOysrdCl7cz1yW3RdCmFb
+c109YltzXX19LApKYzpmdW5jdGlvbiBKYyhhLGIpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy54PV8u
+cj1fLmM9bnVsbApfLnk9MApfLmN5PV8uY3g9Xy5jaD1fLlE9Xy56PW51bGx9LApFVDpmdW5jdGlvbiBF
+VCgpe3RoaXMuYz10aGlzLmI9dGhpcy5hPW51bGx9LAp1OTpmdW5jdGlvbiB1OSgpe30sCng6ZnVuY3Rp
+b24geChhKXt0aGlzLmE9YX0sClI5OmZ1bmN0aW9uKGEpe3JldHVybiB1LmQuYihhKXx8dS5CLmIoYSl8
+fHUuZHouYihhKXx8dS5JLmIoYSl8fHUuQS5iKGEpfHx1Lmc0LmIoYSl8fHUuZzIuYihhKX0sCkpnOmZ1
+bmN0aW9uKGEpe3JldHVybiB2Lm1hbmdsZWRHbG9iYWxOYW1lc1thXX19LEo9ewpRdTpmdW5jdGlvbihh
+LGIsYyxkKXtyZXR1cm57aTphLHA6YixlOmMseDpkfX0sCmtzOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixx
+LHA9YVt2LmRpc3BhdGNoUHJvcGVydHlOYW1lXQppZihwPT1udWxsKWlmKCQuSz09bnVsbCl7SC5NKCkK
+cD1hW3YuZGlzcGF0Y2hQcm9wZXJ0eU5hbWVdfWlmKHAhPW51bGwpe3Q9cC5wCmlmKCExPT09dClyZXR1
+cm4gcC5pCmlmKCEwPT09dClyZXR1cm4gYQpzPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKQppZih0PT09
+cylyZXR1cm4gcC5pCmlmKHAuZT09PXMpdGhyb3cgSC5iKFAubigiUmV0dXJuIGludGVyY2VwdG9yIGZv
+ciAiK0guZCh0KGEscCkpKSl9cj1hLmNvbnN0cnVjdG9yCnE9cj09bnVsbD9udWxsOnJbJC5BKCldCmlm
+KHEhPW51bGwpcmV0dXJuIHEKcT1ILkcoYSkKaWYocSE9bnVsbClyZXR1cm4gcQppZih0eXBlb2YgYT09
+ImZ1bmN0aW9uIilyZXR1cm4gQy5ERwp0PU9iamVjdC5nZXRQcm90b3R5cGVPZihhKQppZih0PT1udWxs
+KXJldHVybiBDLlpRCmlmKHQ9PT1PYmplY3QucHJvdG90eXBlKXJldHVybiBDLlpRCmlmKHR5cGVvZiBy
+PT0iZnVuY3Rpb24iKXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwkLkEoKSx7dmFsdWU6Qy52QixlbnVt
+ZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gQy52Qn1y
+ZXR1cm4gQy52Qn0sClFpOmZ1bmN0aW9uKGEsYil7aWYoYTwwfHxhPjQyOTQ5NjcyOTUpdGhyb3cgSC5i
+KFAuVEUoYSwwLDQyOTQ5NjcyOTUsImxlbmd0aCIsbnVsbCkpCnJldHVybiBKLnB5KG5ldyBBcnJheShh
+KSxiKX0sCktoOmZ1bmN0aW9uKGEsYil7aWYoYTwwKXRocm93IEguYihQLnhZKCJMZW5ndGggbXVzdCBi
+ZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyOiAiK2EpKQpyZXR1cm4gSC5WTShuZXcgQXJyYXkoYSksYi5D
+KCJqZDwwPiIpKX0sCnB5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouRXAoSC5WTShhLGIuQygiamQ8MD4i
+KSksYil9LApFcDpmdW5jdGlvbihhLGIpe2EuZml4ZWQkbGVuZ3RoPUFycmF5CnJldHVybiBhfSwKdW46
+ZnVuY3Rpb24oYSl7YS5maXhlZCRsZW5ndGg9QXJyYXkKYS5pbW11dGFibGUkbGlzdD1BcnJheQpyZXR1
+cm4gYX0sCkdhOmZ1bmN0aW9uKGEpe2lmKGE8MjU2KXN3aXRjaChhKXtjYXNlIDk6Y2FzZSAxMDpjYXNl
+IDExOmNhc2UgMTI6Y2FzZSAxMzpjYXNlIDMyOmNhc2UgMTMzOmNhc2UgMTYwOnJldHVybiEwCmRlZmF1
+bHQ6cmV0dXJuITF9c3dpdGNoKGEpe2Nhc2UgNTc2MDpjYXNlIDgxOTI6Y2FzZSA4MTkzOmNhc2UgODE5
+NDpjYXNlIDgxOTU6Y2FzZSA4MTk2OmNhc2UgODE5NzpjYXNlIDgxOTg6Y2FzZSA4MTk5OmNhc2UgODIw
+MDpjYXNlIDgyMDE6Y2FzZSA4MjAyOmNhc2UgODIzMjpjYXNlIDgyMzM6Y2FzZSA4MjM5OmNhc2UgODI4
+NzpjYXNlIDEyMjg4OmNhc2UgNjUyNzk6cmV0dXJuITAKZGVmYXVsdDpyZXR1cm4hMX19LAptbTpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMKZm9yKHQ9YS5sZW5ndGg7Yjx0Oyl7cz1DLnhCLlcoYSxiKQppZihzIT09
+MzImJnMhPT0xMyYmIUouR2EocykpYnJlYWs7KytifXJldHVybiBifSwKYzE6ZnVuY3Rpb24oYSxiKXt2
+YXIgdCxzCmZvcig7Yj4wO2I9dCl7dD1iLTEKcz1DLnhCLm0oYSx0KQppZihzIT09MzImJnMhPT0xMyYm
+IUouR2EocykpYnJlYWt9cmV0dXJuIGJ9LApSRTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiBh
+CmlmKHR5cGVvZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUu
+cHJvdG90eXBlCnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQLk1oKXJldHVybiBhCnJldHVybiBKLmtz
+KGEpfSwKVEo6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBKLnFJLnByb3Rv
+dHlwZQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIEouRHIucHJvdG90eXBlCmlmKGE9PW51bGwp
+cmV0dXJuIGEKaWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXkpcmV0dXJuIEouamQucHJvdG90eXBlCmlmKHR5
+cGVvZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90
+eXBlCnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQLk1oKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwK
+VTY6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQpp
+ZihhPT1udWxsKXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3Rv
+dHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBK
+LmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gYQpyZXR1cm4g
+Si5rcyhhKX0sCmlhOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIil7aWYoTWF0aC5mbG9v
+cihhKT09YSlyZXR1cm4gSi51ci5wcm90b3R5cGUKcmV0dXJuIEouVkEucHJvdG90eXBlfWlmKHR5cGVv
+ZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gSi5ZRS5w
+cm90b3R5cGUKaWYodHlwZW9mIGE9PSJib29sZWFuIilyZXR1cm4gSi55RS5wcm90b3R5cGUKaWYoYS5j
+b25zdHJ1Y3Rvcj09QXJyYXkpcmV0dXJuIEouamQucHJvdG90eXBlCmlmKHR5cGVvZiBhIT0ib2JqZWN0
+Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBhfWlm
+KGEgaW5zdGFuY2VvZiBQLk1oKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKclk6ZnVuY3Rpb24oYSl7
+aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVy
+biBhCmlmKCEoYSBpbnN0YW5jZW9mIFAuTWgpKXJldHVybiBKLmtkLnByb3RvdHlwZQpyZXR1cm4gYX0s
+CncxOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXkp
+cmV0dXJuIEouamQucHJvdG90eXBlCmlmKHR5cGVvZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9PSJm
+dW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQLk1o
+KXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKQWM6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWEoYSkuWihh
+KX0sCkNNOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLlJFKGEpLmR1KGEsYixjLGQpfSwKRkw6ZnVu
+Y3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5kZChhLGIpfSwKR0E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+Si53MShhKS5FKGEsYil9LApHcjpmdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nbVcoYSl9LApIOmZ1
+bmN0aW9uKGEpe3JldHVybiBKLlU2KGEpLmdBKGEpfSwKSVQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudzEo
+YSkuZ2t6KGEpfSwKSnk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5pYShhKS5lNyhhLGIpfSwKS1Y6ZnVu
+Y3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5HKGEsYil9LApMdDpmdW5jdGlvbihhKXtyZXR1cm4gSi5S
+RShhKS53ZyhhKX0sCk0xOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi53MShhKS5FMihhLGIsYyl9LApR
+ejpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLlcoYSxiKX0sClJNOmZ1bmN0aW9uKGEsYil7aWYo
+YT09bnVsbClyZXR1cm4gYj09bnVsbAppZih0eXBlb2YgYSE9Im9iamVjdCIpcmV0dXJuIGIhPW51bGwm
+JmE9PT1iCnJldHVybiBKLmlhKGEpLkROKGEsYil9LApUMDpmdW5jdGlvbihhKXtyZXR1cm4gSi5yWShh
+KS5iUyhhKX0sCmE2OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSkubShhLGIpfSwKYlQ6ZnVuY3Rp
+b24oYSl7cmV0dXJuIEouUkUoYSkuRDQoYSl9LApjSDpmdW5jdGlvbihhKXtyZXR1cm4gSi5yWShhKS5o
+YyhhKX0sCmRSOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdQKGEpfSwKZFo6ZnVuY3Rpb24oYSxi
+LGMsZCl7cmV0dXJuIEouUkUoYSkuT24oYSxiLGMsZCl9LApkZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1
+cm4gSi5yWShhKS5pNyhhLGIsYyxkKX0sCmRoOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLkZGKGEp
+fSwKaGY6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWEoYSkuZ2lPKGEpfSwKaWc6ZnVuY3Rpb24oYSl7cmV0
+dXJuIEouUkUoYSkuZ1FnKGEpfSwKbDU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zaGYoYSxi
+KX0sCmxkOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5yWShhKS5OaihhLGIsYyl9LAptOmZ1bmN0aW9u
+KGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGErYgpy
+ZXR1cm4gSi5USihhKS5oKGEsYil9LApwNDpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLlRjKGEs
+Yil9LApxMDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouclkoYSkuUWkoYSxiLGMpfSwKcUY6ZnVuY3Rp
+b24oYSl7cmV0dXJuIEouUkUoYSkuZ1ZsKGEpfSwKdEg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLlJF
+KGEpLnBrKGEsYixjKX0sCng5OmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGI9PT0ibnVtYmVyIilpZihh
+LmNvbnN0cnVjdG9yPT1BcnJheXx8dHlwZW9mIGE9PSJzdHJpbmcifHxILndWKGEsYVt2LmRpc3BhdGNo
+UHJvcGVydHlOYW1lXSkpaWYoYj4+PjA9PT1iJiZiPGEubGVuZ3RoKXJldHVybiBhW2JdCnJldHVybiBK
+LlU2KGEpLnEoYSxiKX0sCnpsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouVTYoYSkudGcoYSxiKX0sCnZC
+OmZ1bmN0aW9uIHZCKCl7fSwKeUU6ZnVuY3Rpb24geUUoKXt9LApZRTpmdW5jdGlvbiBZRSgpe30sCk1G
+OmZ1bmN0aW9uIE1GKCl7fSwKaUM6ZnVuY3Rpb24gaUMoKXt9LAprZDpmdW5jdGlvbiBrZCgpe30sCmM1
+OmZ1bmN0aW9uIGM1KCl7fSwKamQ6ZnVuY3Rpb24gamQoYSl7dGhpcy4kdGk9YX0sClBvOmZ1bmN0aW9u
+IFBvKGEpe3RoaXMuJHRpPWF9LAptMTpmdW5jdGlvbiBtMShhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpf
+LmI9YgpfLmM9MApfLmQ9bnVsbApfLiR0aT1jfSwKcUk6ZnVuY3Rpb24gcUkoKXt9LAp1cjpmdW5jdGlv
+biB1cigpe30sClZBOmZ1bmN0aW9uIFZBKCl7fSwKRHI6ZnVuY3Rpb24gRHIoKXt9fSxQPXsKT2o6ZnVu
+Y3Rpb24oKXt2YXIgdCxzLHI9e30KaWYoc2VsZi5zY2hlZHVsZUltbWVkaWF0ZSE9bnVsbClyZXR1cm4g
+UC5FWCgpCmlmKHNlbGYuTXV0YXRpb25PYnNlcnZlciE9bnVsbCYmc2VsZi5kb2N1bWVudCE9bnVsbCl7
+dD1zZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCnM9c2VsZi5kb2N1bWVudC5jcmVhdGVF
+bGVtZW50KCJzcGFuIikKci5hPW51bGwKbmV3IHNlbGYuTXV0YXRpb25PYnNlcnZlcihILnRSKG5ldyBQ
+LnRoKHIpLDEpKS5vYnNlcnZlKHQse2NoaWxkTGlzdDp0cnVlfSkKcmV0dXJuIG5ldyBQLmhhKHIsdCxz
+KX1lbHNlIGlmKHNlbGYuc2V0SW1tZWRpYXRlIT1udWxsKXJldHVybiBQLnl0KCkKcmV0dXJuIFAucVco
+KX0sClpWOmZ1bmN0aW9uKGEpe3NlbGYuc2NoZWR1bGVJbW1lZGlhdGUoSC50UihuZXcgUC5Wcyh1Lk0u
+YShhKSksMCkpfSwKb0E6ZnVuY3Rpb24oYSl7c2VsZi5zZXRJbW1lZGlhdGUoSC50UihuZXcgUC5GdCh1
+Lk0uYShhKSksMCkpfSwKQno6ZnVuY3Rpb24oYSl7dS5NLmEoYSkKUC5RTigwLGEpfSwKUU46ZnVuY3Rp
+b24oYSxiKXt2YXIgdD1uZXcgUC5XMygpCnQuQ1koYSxiKQpyZXR1cm4gdH0sCkZYOmZ1bmN0aW9uKGEp
+e3JldHVybiBuZXcgUC5paChuZXcgUC52cygkLlgzLGEuQygidnM8MD4iKSksYS5DKCJpaDwwPiIpKX0s
+CkRJOmZ1bmN0aW9uKGEsYil7YS4kMigwLG51bGwpCmIuYj0hMApyZXR1cm4gYi5hfSwKalE6ZnVuY3Rp
+b24oYSxiKXtQLkplKGEsYil9LAp5QzpmdW5jdGlvbihhLGIpe2IuYU0oMCxhKX0sCmYzOmZ1bmN0aW9u
+KGEsYil7Yi53MChILlJ1KGEpLEgudHMoYSkpfSwKSmU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9bmV3
+IFAuV00oYikscT1uZXcgUC5TWChiKQppZihhIGluc3RhbmNlb2YgUC52cylhLlFkKHIscSx1LnopCmVs
+c2V7dD11LnoKaWYodS5jLmIoYSkpYS5TcShyLHEsdCkKZWxzZXtzPW5ldyBQLnZzKCQuWDMsdS5fKQpz
+LmE9NApzLmM9YQpzLlFkKHIscSx0KX19fSwKbHo6ZnVuY3Rpb24oYSl7dmFyIHQ9ZnVuY3Rpb24oYixj
+KXtyZXR1cm4gZnVuY3Rpb24oZCxlKXt3aGlsZSh0cnVlKXRyeXtiKGQsZSkKYnJlYWt9Y2F0Y2gocyl7
+ZT1zCmQ9Y319fShhLDEpCnJldHVybiAkLlgzLkxqKG5ldyBQLkdzKHQpLHUuUCx1LnEsdS56KX0sCkdR
+OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5GeShhLDEpfSwKVGg6ZnVuY3Rpb24oKXtyZXR1cm4gQy53
+UX0sClltOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5GeShhLDMpfSwKbDA6ZnVuY3Rpb24oYSxiKXty
+ZXR1cm4gbmV3IFAucTQoYSxiLkMoInE0PDA+IikpfSwKazM6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIK
+Yi5hPTEKdHJ5e2EuU3EobmV3IFAucFYoYiksbmV3IFAuVTcoYiksdS5QKX1jYXRjaChyKXt0PUguUnUo
+cikKcz1ILnRzKHIpClAucmIobmV3IFAudnIoYix0LHMpKX19LApBOTpmdW5jdGlvbihhLGIpe3ZhciB0
+LHMscgpmb3IodD11Ll87cz1hLmEscz09PTI7KWE9dC5hKGEuYykKaWYocz49NCl7cj1iLmFoKCkKYi5h
+PWEuYQpiLmM9YS5jClAuSFooYixyKX1lbHNle3I9dS54LmEoYi5jKQpiLmE9MgpiLmM9YQphLmpRKHIp
+fX0sCkhaOmZ1bmN0aW9uKGEsYTApe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQ9
+bnVsbCxjPXt9LGI9Yy5hPWEKZm9yKHQ9dS5uLHM9dS54LHI9dS5jOyEwOyl7cT17fQpwPWIuYT09PTgK
+aWYoYTA9PW51bGwpe2lmKHApe289dC5hKGIuYykKUC5MMihkLGQsYi5iLG8uYSxvLmIpfXJldHVybn1x
+LmE9YTAKbj1hMC5hCmZvcihiPWEwO24hPW51bGw7Yj1uLG49bSl7Yi5hPW51bGwKUC5IWihjLmEsYikK
+cS5hPW4KbT1uLmF9bD1jLmEKaz1sLmMKcS5iPXAKcS5jPWsKaj0hcAppZihqKXtpPWIuYwppPShpJjEp
+IT09MHx8KGkmMTUpPT09OH1lbHNlIGk9ITAKaWYoaSl7aD1iLmIuYgppZihwKXtpPWwuYj09PWgKaT0h
+KGl8fGkpfWVsc2UgaT0hMQppZihpKXt0LmEoaykKUC5MMihkLGQsbC5iLGsuYSxrLmIpCnJldHVybn1n
+PSQuWDMKaWYoZyE9PWgpJC5YMz1oCmVsc2UgZz1kCmI9Yi5jCmlmKChiJjE1KT09PTgpbmV3IFAuUlQo
+cSxjLHApLiQwKCkKZWxzZSBpZihqKXtpZigoYiYxKSE9PTApbmV3IFAucnEocSxrKS4kMCgpfWVsc2Ug
+aWYoKGImMikhPT0wKW5ldyBQLlJXKGMscSkuJDAoKQppZihnIT1udWxsKSQuWDM9ZwpiPXEuYwppZihy
+LmIoYikpe2Y9cS5hLmIKaWYoYi5hPj00KXtlPXMuYShmLmMpCmYuYz1udWxsCmEwPWYuTjgoZSkKZi5h
+PWIuYQpmLmM9Yi5jCmMuYT1iCmNvbnRpbnVlfWVsc2UgUC5BOShiLGYpCnJldHVybn19Zj1xLmEuYgpl
+PXMuYShmLmMpCmYuYz1udWxsCmEwPWYuTjgoZSkKYj1xLmIKbD1xLmMKaWYoIWIpe2YuJHRpLmMuYShs
+KQpmLmE9NApmLmM9bH1lbHNle3QuYShsKQpmLmE9OApmLmM9bH1jLmE9ZgpiPWZ9fSwKVkg6ZnVuY3Rp
+b24oYSxiKXt2YXIgdAppZih1LmFnLmIoYSkpcmV0dXJuIGIuTGooYSx1LnosdS5LLHUubCkKdD11LmJJ
+CmlmKHQuYihhKSlyZXR1cm4gdC5hKGEpCnRocm93IEguYihQLkwzKGEsIm9uRXJyb3IiLCJFcnJvciBo
+YW5kbGVyIG11c3QgYWNjZXB0IG9uZSBPYmplY3Qgb3Igb25lIE9iamVjdCBhbmQgYSBTdGFja1RyYWNl
+IGFzIGFyZ3VtZW50cywgYW5kIHJldHVybiBhIGEgdmFsaWQgcmVzdWx0IikpfSwKcHU6ZnVuY3Rpb24o
+KXt2YXIgdCxzCmZvcih0PSQuUzY7dCE9bnVsbDt0PSQuUzYpeyQubWc9bnVsbApzPXQuYgokLlM2PXMK
+aWYocz09bnVsbCkkLms4PW51bGwKdC5hLiQwKCl9fSwKZU46ZnVuY3Rpb24oKXskLlVEPSEwCnRyeXtQ
+LnB1KCl9ZmluYWxseXskLm1nPW51bGwKJC5VRD0hMQppZigkLlM2IT1udWxsKSQudXQoKS4kMShQLlY5
+KCkpfX0sCmVXOmZ1bmN0aW9uKGEpe3ZhciB0PW5ldyBQLk9NKGEpLHM9JC5rOAppZihzPT1udWxsKXsk
+LlM2PSQuazg9dAppZighJC5VRCkkLnV0KCkuJDEoUC5WOSgpKX1lbHNlICQuazg9cy5iPXR9LApyUjpm
+dW5jdGlvbihhKXt2YXIgdCxzLHIscT0kLlM2CmlmKHE9PW51bGwpe1AuZVcoYSkKJC5tZz0kLms4CnJl
+dHVybn10PW5ldyBQLk9NKGEpCnM9JC5tZwppZihzPT1udWxsKXt0LmI9cQokLlM2PSQubWc9dH1lbHNl
+e3I9cy5iCnQuYj1yCiQubWc9cy5iPXQKaWYocj09bnVsbCkkLms4PXR9fSwKcmI6ZnVuY3Rpb24oYSl7
+dmFyIHQ9bnVsbCxzPSQuWDMKaWYoQy5OVT09PXMpe1AuVGsodCx0LEMuTlUsYSkKcmV0dXJufVAuVGso
+dCx0LHMsdS5NLmEocy5HWShhKSkpfSwKUXc6ZnVuY3Rpb24oYSxiKXtQLlVJKGEsInN0cmVhbSIsYi5D
+KCJxaDwwPiIpKQpyZXR1cm4gbmV3IFAueEkoYi5DKCJ4STwwPiIpKX0sClRsOmZ1bmN0aW9uKGEsYil7
+dmFyIHQ9Yj09bnVsbD9QLnYwKGEpOmIKUC5VSShhLCJlcnJvciIsdS5LKQpyZXR1cm4gbmV3IFAuT0go
+YSx0KX0sCnYwOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKHUuVy5iKGEpKXt0PWEuZ0lJKCkKaWYodCE9bnVs
+bClyZXR1cm4gdH1yZXR1cm4gQy5wZH0sCkwyOmZ1bmN0aW9uKGEsYixjLGQsZSl7UC5yUihuZXcgUC5w
+SyhkLGUpKX0sClQ4OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVy
+biBkLiQwKCkKJC5YMz1jCnQ9cwp0cnl7cz1kLiQwKCkKcmV0dXJuIHN9ZmluYWxseXskLlgzPXR9fSwK
+eXY6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBkLiQx
+KGUpCiQuWDM9Ywp0PXMKdHJ5e3M9ZC4kMShlKQpyZXR1cm4gc31maW5hbGx5eyQuWDM9dH19LApReDpm
+dW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBkLiQy
+KGUsZikKJC5YMz1jCnQ9cwp0cnl7cz1kLiQyKGUsZikKcmV0dXJuIHN9ZmluYWxseXskLlgzPXR9fSwK
+VGs6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQKdS5NLmEoZCkKdD1DLk5VIT09YwppZih0KWQ9ISghdHx8
+ITEpP2MuR1koZCk6Yy5SVChkLHUuSCkKUC5lVyhkKX0sCnRoOmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1h
+fSwKaGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVu
+Y3Rpb24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChhKXt0aGlzLmE9YX0sClczOmZ1bmN0
+aW9uIFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0
+aW9uIGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRpPWJ9LApXTTpmdW5jdGlvbiBXTShh
+KXt0aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7
+dGhpcy5hPWF9LApGeTpmdW5jdGlvbiBGeShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKR1Y6ZnVuY3Rp
+b24gR1YoYSxiKXt2YXIgXz10aGlzCl8uYT1hCl8uZD1fLmM9Xy5iPW51bGwKXy4kdGk9Yn0sCnE0OmZ1
+bmN0aW9uIHE0KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmI4OmZ1bmN0aW9uIGI4KCl7fSwKUGY6
+ZnVuY3Rpb24gUGYoKXt9LApaZjpmdW5jdGlvbiBaZihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApG
+ZTpmdW5jdGlvbiBGZShhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5hPW51bGwKXy5iPWEKXy5jPWIKXy5k
+PWMKXy5lPWQKXy4kdGk9ZX0sCnZzOmZ1bmN0aW9uIHZzKGEsYil7dmFyIF89dGhpcwpfLmE9MApfLmI9
+YQpfLmM9bnVsbApfLiR0aT1ifSwKZGE6ZnVuY3Rpb24gZGEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
+Cm9ROmZ1bmN0aW9uIG9RKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApwVjpmdW5jdGlvbiBwVihhKXt0
+aGlzLmE9YX0sClU3OmZ1bmN0aW9uIFU3KGEpe3RoaXMuYT1hfSwKdnI6ZnVuY3Rpb24gdnIoYSxiLGMp
+e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKckg6ZnVuY3Rpb24gckgoYSxiKXt0aGlzLmE9YQp0
+aGlzLmI9Yn0sCktGOmZ1bmN0aW9uIEtGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApaTDpmdW5jdGlv
+biBaTChhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApSVDpmdW5jdGlvbiBSVChhLGIs
+Yyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApqWjpmdW5jdGlvbiBqWihhKXt0aGlzLmE9YX0s
+CnJxOmZ1bmN0aW9uIHJxKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApSVzpmdW5jdGlvbiBSVyhhLGIp
+e3RoaXMuYT1hCnRoaXMuYj1ifSwKT006ZnVuY3Rpb24gT00oYSl7dGhpcy5hPWEKdGhpcy5iPW51bGx9
+LApxaDpmdW5jdGlvbiBxaCgpe30sCkI1OmZ1bmN0aW9uIEI1KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9
+LAp1TzpmdW5jdGlvbiB1TyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTU86ZnVuY3Rpb24gTU8oKXt9
+LAprVDpmdW5jdGlvbiBrVCgpe30sCnhJOmZ1bmN0aW9uIHhJKGEpe3RoaXMuJHRpPWF9LApPSDpmdW5j
+dGlvbiBPSChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKbTA6ZnVuY3Rpb24gbTAoKXt9LApwSzpmdW5j
+dGlvbiBwSyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSmk6ZnVuY3Rpb24gSmkoKXt9LApoajpmdW5j
+dGlvbiBoaihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApWcDpmdW5jdGlvbiBWcChh
+LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKT1I6ZnVuY3Rpb24gT1IoYSxiLGMpe3RoaXMuYT1hCnRoaXMu
+Yj1iCnRoaXMuYz1jfSwKRUY6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiLkMoIkA8MD4iKS5LcShjKS5D
+KCJGbzwxLDI+IikuYShILkI3KGEsbmV3IEguTjUoYi5DKCJAPDA+IikuS3EoYykuQygiTjU8MSwyPiIp
+KSkpfSwKRmw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEguTjUoYS5DKCJAPDA+IikuS3EoYikuQygi
+TjU8MSwyPiIpKX0sCkxzOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5iNihhLkMoImI2PDA+IikpfSwK
+VDI6ZnVuY3Rpb24oKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpCnRbIjxub24taWRlbnRpZmllci1r
+ZXk+Il09dApkZWxldGUgdFsiPG5vbi1pZGVudGlmaWVyLWtleT4iXQpyZXR1cm4gdH0sCnJqOmZ1bmN0
+aW9uKGEsYixjKXt2YXIgdD1uZXcgUC5sbShhLGIsYy5DKCJsbTwwPiIpKQp0LmM9YS5lCnJldHVybiB0
+fSwKRVA6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMKaWYoUC5oQihhKSl7aWYoYj09PSIoIiYmYz09PSIp
+IilyZXR1cm4iKC4uLikiCnJldHVybiBiKyIuLi4iK2N9dD1ILlZNKFtdLHUucykKQy5ObS5pKCQueGcs
+YSkKdHJ5e1AuVnIoYSx0KX1maW5hbGx5e2lmKDA+PSQueGcubGVuZ3RoKXJldHVybiBILmsoJC54Zywt
+MSkKJC54Zy5wb3AoKX1zPVAudmcoYix1LlIuYSh0KSwiLCAiKStjCnJldHVybiBzLmNoYXJDb2RlQXQo
+MCk9PTA/czpzfSwKV0U6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMKaWYoUC5oQihhKSlyZXR1cm4gYisi
+Li4uIitjCnQ9bmV3IFAuUm4oYikKQy5ObS5pKCQueGcsYSkKdHJ5e3M9dApzLmE9UC52ZyhzLmEsYSwi
+LCAiKX1maW5hbGx5e2lmKDA+PSQueGcubGVuZ3RoKXJldHVybiBILmsoJC54ZywtMSkKJC54Zy5wb3Ao
+KX10LmErPWMKcz10LmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LApoQjpmdW5jdGlvbihh
+KXt2YXIgdCxzCmZvcih0PSQueGcubGVuZ3RoLHM9MDtzPHQ7KytzKWlmKGE9PT0kLnhnW3NdKXJldHVy
+biEwCnJldHVybiExfSwKVnI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixtPWEuZ2t6KGEp
+LGw9MCxrPTAKd2hpbGUoITApe2lmKCEobDw4MHx8azwzKSlicmVhawppZighbS5GKCkpcmV0dXJuCnQ9
+SC5kKG0uZ2woKSkKQy5ObS5pKGIsdCkKbCs9dC5sZW5ndGgrMjsrK2t9aWYoIW0uRigpKXtpZihrPD01
+KXJldHVybgppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5rKGIsLTEpCnM9Yi5wb3AoKQppZigwPj1iLmxl
+bmd0aClyZXR1cm4gSC5rKGIsLTEpCnI9Yi5wb3AoKX1lbHNle3E9bS5nbCgpOysrawppZighbS5GKCkp
+e2lmKGs8PTQpe0MuTm0uaShiLEguZChxKSkKcmV0dXJufXM9SC5kKHEpCmlmKDA+PWIubGVuZ3RoKXJl
+dHVybiBILmsoYiwtMSkKcj1iLnBvcCgpCmwrPXMubGVuZ3RoKzJ9ZWxzZXtwPW0uZ2woKTsrK2sKZm9y
+KDttLkYoKTtxPXAscD1vKXtvPW0uZ2woKTsrK2sKaWYoaz4xMDApe3doaWxlKCEwKXtpZighKGw+NzUm
+Jms+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguayhiLC0xKQpsLT1iLnBvcCgpLmxlbmd0
+aCsyOy0ta31DLk5tLmkoYiwiLi4uIikKcmV0dXJufX1yPUguZChxKQpzPUguZChwKQpsKz1zLmxlbmd0
+aCtyLmxlbmd0aCs0fX1pZihrPmIubGVuZ3RoKzIpe2wrPTUKbj0iLi4uIn1lbHNlIG49bnVsbAp3aGls
+ZSghMCl7aWYoIShsPjgwJiZiLmxlbmd0aD4zKSlicmVhawppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5r
+KGIsLTEpCmwtPWIucG9wKCkubGVuZ3RoKzIKaWYobj09bnVsbCl7bCs9NQpuPSIuLi4ifX1pZihuIT1u
+dWxsKUMuTm0uaShiLG4pCkMuTm0uaShiLHIpCkMuTm0uaShiLHMpfSwKdE06ZnVuY3Rpb24oYSxiKXt2
+YXIgdCxzLHI9UC5McyhiKQpmb3IodD1hLmxlbmd0aCxzPTA7czxhLmxlbmd0aDthLmxlbmd0aD09PXR8
+fCgwLEgubGspKGEpLCsrcylyLmkoMCxiLmEoYVtzXSkpCnJldHVybiByfSwKbk86ZnVuY3Rpb24oYSl7
+dmFyIHQscz17fQppZihQLmhCKGEpKXJldHVybiJ7Li4ufSIKdD1uZXcgUC5SbigiIikKdHJ5e0MuTm0u
+aSgkLnhnLGEpCnQuYSs9InsiCnMuYT0hMAphLksoMCxuZXcgUC5yYShzLHQpKQp0LmErPSJ9In1maW5h
+bGx5e2lmKDA+PSQueGcubGVuZ3RoKXJldHVybiBILmsoJC54ZywtMSkKJC54Zy5wb3AoKX1zPXQuYQpy
+ZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCmI2OmZ1bmN0aW9uIGI2KGEpe3ZhciBfPXRoaXMK
+Xy5hPTAKXy5mPV8uZT1fLmQ9Xy5jPV8uYj1udWxsCl8ucj0wCl8uJHRpPWF9LApibjpmdW5jdGlvbiBi
+bihhKXt0aGlzLmE9YQp0aGlzLmM9dGhpcy5iPW51bGx9LApsbTpmdW5jdGlvbiBsbShhLGIsYyl7dmFy
+IF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGwKXy4kdGk9Y30sCm1XOmZ1bmN0aW9uIG1XKCl7
+fSwKTFU6ZnVuY3Rpb24gTFUoKXt9LApsRDpmdW5jdGlvbiBsRCgpe30sCmlsOmZ1bmN0aW9uIGlsKCl7
+fSwKcmE6ZnVuY3Rpb24gcmEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCllrOmZ1bmN0aW9uIFlrKCl7
+fSwKeVE6ZnVuY3Rpb24geVEoYSl7dGhpcy5hPWF9LApLUDpmdW5jdGlvbiBLUCgpe30sClBuOmZ1bmN0
+aW9uIFBuKCl7fSwKR2o6ZnVuY3Rpb24gR2ooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKTWE6ZnVu
+Y3Rpb24gTWEoKXt9LApWajpmdW5jdGlvbiBWaigpe30sClh2OmZ1bmN0aW9uIFh2KCl7fSwKblk6ZnVu
+Y3Rpb24gblkoKXt9LApUQzpmdW5jdGlvbiBUQygpe30sClJVOmZ1bmN0aW9uIFJVKCl7fSwKQlM6ZnVu
+Y3Rpb24oYSxiKXt2YXIgdCxzLHIscQppZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgSC5iKEguSShh
+KSkKdD1udWxsCnRyeXt0PUpTT04ucGFyc2UoYSl9Y2F0Y2gocil7cz1ILlJ1KHIpCnE9UC5ycihTdHJp
+bmcocyksbnVsbCxudWxsKQp0aHJvdyBILmIocSl9cT1QLlFlKHQpCnJldHVybiBxfSwKUWU6ZnVuY3Rp
+b24oYSl7dmFyIHQKaWYoYT09bnVsbClyZXR1cm4gbnVsbAppZih0eXBlb2YgYSE9Im9iamVjdCIpcmV0
+dXJuIGEKaWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpIT09QXJyYXkucHJvdG90eXBlKXJldHVybiBu
+ZXcgUC51dyhhLE9iamVjdC5jcmVhdGUobnVsbCkpCmZvcih0PTA7dDxhLmxlbmd0aDsrK3QpYVt0XT1Q
+LlFlKGFbdF0pCnJldHVybiBhfSwKa3k6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYiBpbnN0YW5jZW9mIFVp
+bnQ4QXJyYXkpcmV0dXJuIFAuUlAoITEsYixjLGQpCnJldHVybiBudWxsfSwKUlA6ZnVuY3Rpb24oYSxi
+LGMsZCl7dmFyIHQscyxyPSQudEwoKQppZihyPT1udWxsKXJldHVybiBudWxsCnQ9MD09PWMKaWYodCYm
+ITApcmV0dXJuIFAuT1EocixiKQpzPWIubGVuZ3RoCmQ9UC5qQihjLGQscykKaWYodCYmZD09PXMpcmV0
+dXJuIFAuT1EocixiKQpyZXR1cm4gUC5PUShyLGIuc3ViYXJyYXkoYyxkKSl9LApPUTpmdW5jdGlvbihh
+LGIpe2lmKFAuQWooYikpcmV0dXJuIG51bGwKcmV0dXJuIFAuSmgoYSxiKX0sCkpoOmZ1bmN0aW9uKGEs
+Yil7dmFyIHQscwp0cnl7dD1hLmRlY29kZShiKQpyZXR1cm4gdH1jYXRjaChzKXtILlJ1KHMpfXJldHVy
+biBudWxsfSwKQWo6ZnVuY3Rpb24oYSl7dmFyIHQscz1hLmxlbmd0aC0yCmZvcih0PTA7dDxzOysrdClp
+ZihhW3RdPT09MjM3KWlmKChhW3QrMV0mMjI0KT09PTE2MClyZXR1cm4hMApyZXR1cm4hMX0sCmNQOmZ1
+bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIKZm9yKHQ9Si5VNihhKSxzPWI7czxjOysrcyl7cj10LnEoYSxz
+KQppZih0eXBlb2YgciE9PSJudW1iZXIiKXJldHVybiByLnpNKCkKaWYoKHImMTI3KSE9PXIpcmV0dXJu
+IHMtYn1yZXR1cm4gYy1ifSwKeE06ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKEMuam4uelkoZiw0KSE9
+PTApdGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IHBhZGRpbmcsIHBhZGRlZCBsZW5ndGggbXVz
+dCBiZSBtdWx0aXBsZSBvZiBmb3VyLCBpcyAiK2YsYSxjKSkKaWYoZCtlIT09Zil0aHJvdyBILmIoUC5y
+cigiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgJz0nIG5vdCBhdCB0aGUgZW5kIixhLGIpKQppZihlPjIp
+dGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IHBhZGRpbmcsIG1vcmUgdGhhbiB0d28gJz0nIGNo
+YXJhY3RlcnMiLGEsYikpfSwKdXc6ZnVuY3Rpb24gdXcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlz
+LmM9bnVsbH0sCmk4OmZ1bmN0aW9uIGk4KGEpe3RoaXMuYT1hfSwKcGc6ZnVuY3Rpb24gcGcoKXt9LApD
+VjpmdW5jdGlvbiBDVigpe30sClU4OmZ1bmN0aW9uIFU4KCl7fSwKVWs6ZnVuY3Rpb24gVWsoKXt9LAp3
+STpmdW5jdGlvbiB3SSgpe30sClppOmZ1bmN0aW9uIFppKCl7fSwKYnk6ZnVuY3Rpb24gYnkoKXt9LApN
+eDpmdW5jdGlvbiBNeChhKXt0aGlzLmE9YX0sCnU1OmZ1bmN0aW9uIHU1KCl7fSwKRTM6ZnVuY3Rpb24g
+RTMoKXt9LApSdzpmdW5jdGlvbiBSdyhhKXt0aGlzLmI9MAp0aGlzLmM9YX0sCkdZOmZ1bmN0aW9uIEdZ
+KGEpe3RoaXMuYT1hfSwKYno6ZnVuY3Rpb24gYnooYSxiKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8u
+Yz0hMApfLmY9Xy5lPV8uZD0wfSwKUUE6ZnVuY3Rpb24oYSxiKXt2YXIgdD1ILkhwKGEsYikKaWYodCE9
+bnVsbClyZXR1cm4gdAp0aHJvdyBILmIoUC5ycihhLG51bGwsbnVsbCkpfSwKb3M6ZnVuY3Rpb24oYSl7
+aWYoYSBpbnN0YW5jZW9mIEguVHApcmV0dXJuIGEuWigwKQpyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5k
+KEgubGgoYSkpKyInIn0sCk84OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHM9Si5RaShhLGQpCmlmKGEh
+PT0wJiZiIT1udWxsKWZvcih0PTA7dDxzLmxlbmd0aDsrK3QpQy5ObS5ZKHMsdCxiKQpyZXR1cm4gc30s
+CkNIOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPUguVk0oW10sYy5DKCJqZDwwPiIpKQpmb3IodD1KLklU
+KGEpO3QuRigpOylDLk5tLmkocyxjLmEodC5nbCgpKSkKaWYoYilyZXR1cm4gcwpyZXR1cm4gSi5FcChz
+LGMpfSwKZEg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscz1KLktoKGEsZCkKZm9yKHQ9MDt0PGE7Kyt0
+KUMuTm0uWShzLHQsYi4kMSh0KSkKcmV0dXJuIHN9LApBRjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnVu
+KFAuQ0goYSwhMSxiKSl9LApITTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz11LnQKaWYocy5iKGEpKXt0
+PWEubGVuZ3RoCmM9UC5qQihiLGMsdCkKcmV0dXJuIEguZVQoYj4wfHxjPHQ/cy5hKEMuTm0uRDYoYSxi
+LGMpKTphKX1pZih1LmJtLmIoYSkpcmV0dXJuIEguZncoYSxiLFAuakIoYixjLGEubGVuZ3RoKSkKcmV0
+dXJuIFAuYncoYSxiLGMpfSwKT286ZnVuY3Rpb24oYSl7cmV0dXJuIEguTHcoYSl9LApidzpmdW5jdGlv
+bihhLGIsYyl7dmFyIHQscyxyLHEscD1udWxsCmlmKGI8MCl0aHJvdyBILmIoUC5URShiLDAsSi5IKGEp
+LHAscCkpCnQ9Yz09bnVsbAppZighdCYmYzxiKXRocm93IEguYihQLlRFKGMsYixKLkgoYSkscCxwKSkK
+cz1KLklUKGEpCmZvcihyPTA7cjxiOysrcilpZighcy5GKCkpdGhyb3cgSC5iKFAuVEUoYiwwLHIscCxw
+KSkKcT1bXQppZih0KWZvcig7cy5GKCk7KXEucHVzaChzLmdsKCkpCmVsc2UgZm9yKHI9YjtyPGM7Kyty
+KXtpZighcy5GKCkpdGhyb3cgSC5iKFAuVEUoYyxiLHIscCxwKSkKcS5wdXNoKHMuZ2woKSl9cmV0dXJu
+IEguZVQocSl9LApudTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguVlIoYSxILnY0KGEsITEsITAsITEs
+ITEsITEpKX0sCnZnOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1KLklUKGIpCmlmKCF0LkYoKSlyZXR1cm4g
+YQppZihjLmxlbmd0aD09PTApe2RvIGErPUguZCh0LmdsKCkpCndoaWxlKHQuRigpKX1lbHNle2ErPUgu
+ZCh0LmdsKCkpCmZvcig7dC5GKCk7KWE9YStjK0guZCh0LmdsKCkpfXJldHVybiBhfSwKbHI6ZnVuY3Rp
+b24oYSxiLGMsZCl7cmV0dXJuIG5ldyBQLm1wKGEsYixjLGQpfSwKdW86ZnVuY3Rpb24oKXt2YXIgdD1I
+Lk0wKCkKaWYodCE9bnVsbClyZXR1cm4gUC5oSyh0KQp0aHJvdyBILmIoUC5MNCgiJ1VyaS5iYXNlJyBp
+cyBub3Qgc3VwcG9ydGVkIikpfSwKZVA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyLHEscCxvLG49
+IjAxMjM0NTY3ODlBQkNERUYiCmlmKGM9PT1DLnhNKXt0PSQuejQoKS5iCmlmKHR5cGVvZiBiIT0ic3Ry
+aW5nIilILnZoKEguSShiKSkKdD10LnRlc3QoYil9ZWxzZSB0PSExCmlmKHQpcmV0dXJuIGIKSC5MaChj
+KS5DKCJVay5TIikuYShiKQpzPWMuZ1pFKCkuV0ooYikKZm9yKHQ9cy5sZW5ndGgscj0wLHE9IiI7cjx0
+Oysrcil7cD1zW3JdCmlmKHA8MTI4KXtvPXA+Pj40CmlmKG8+PTgpcmV0dXJuIEguayhhLG8pCm89KGFb
+b10mMTw8KHAmMTUpKSE9PTB9ZWxzZSBvPSExCmlmKG8pcSs9SC5MdyhwKQplbHNlIHE9ZCYmcD09PTMy
+P3ErIisiOnErIiUiK25bcD4+PjQmMTVdK25bcCYxNV19cmV0dXJuIHEuY2hhckNvZGVBdCgwKT09MD9x
+OnF9LApHcTpmdW5jdGlvbihhKXt2YXIgdD1NYXRoLmFicyhhKSxzPWE8MD8iLSI6IiIKaWYodD49MTAw
+MClyZXR1cm4iIithCmlmKHQ+PTEwMClyZXR1cm4gcysiMCIrdAppZih0Pj0xMClyZXR1cm4gcysiMDAi
+K3QKcmV0dXJuIHMrIjAwMCIrdH0sClZ4OmZ1bmN0aW9uKGEpe2lmKGE+PTEwMClyZXR1cm4iIithCmlm
+KGE+PTEwKXJldHVybiIwIithCnJldHVybiIwMCIrYX0sCmgwOmZ1bmN0aW9uKGEpe2lmKGE+PTEwKXJl
+dHVybiIiK2EKcmV0dXJuIjAiK2F9LApoOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyInx8
+SC5yUShhKXx8bnVsbD09YSlyZXR1cm4gSi5BYyhhKQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJu
+IEpTT04uc3RyaW5naWZ5KGEpCnJldHVybiBQLm9zKGEpfSwKaFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5l
+dyBQLkM2KGEpfSwKeFk6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkFUKCExLG51bGwsbnVsbCxhKX0s
+CkwzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFAuQVQoITAsYSxiLGMpfSwKVUk6ZnVuY3Rpb24o
+YSxiLGMpe2lmKGE9PW51bGwpdGhyb3cgSC5iKG5ldyBQLkFUKCExLG51bGwsYiwiTXVzdCBub3QgYmUg
+bnVsbCIpKQpyZXR1cm4gYX0sCk83OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLmJKKG51bGwsbnVs
+bCwhMCxhLGIsIlZhbHVlIG5vdCBpbiByYW5nZSIpfSwKVEU6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1
+cm4gbmV3IFAuYkooYixjLCEwLGEsZCwiSW52YWxpZCB2YWx1ZSIpfSwKd0E6ZnVuY3Rpb24oYSxiLGMs
+ZCl7aWYoYTxifHxhPmMpdGhyb3cgSC5iKFAuVEUoYSxiLGMsZCxudWxsKSkKcmV0dXJuIGF9LApqQjpm
+dW5jdGlvbihhLGIsYyl7aWYoMD5hfHxhPmMpdGhyb3cgSC5iKFAuVEUoYSwwLGMsInN0YXJ0IixudWxs
+KSkKaWYoYiE9bnVsbCl7aWYoYT5ifHxiPmMpdGhyb3cgSC5iKFAuVEUoYixhLGMsImVuZCIsbnVsbCkp
+CnJldHVybiBifXJldHVybiBjfSwKazE6ZnVuY3Rpb24oYSxiKXtpZihhPDApdGhyb3cgSC5iKFAuVEUo
+YSwwLG51bGwsYixudWxsKSkKcmV0dXJuIGF9LAp0OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQ9SC5X
+WShlPT1udWxsP0ouSChiKTplKQpyZXR1cm4gbmV3IFAuZVkodCwhMCxhLGMsIkluZGV4IG91dCBvZiBy
+YW5nZSIpfSwKTDQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnViKGEpfSwKbjpmdW5jdGlvbihhKXty
+ZXR1cm4gbmV3IFAuZHMoYSl9LApQVjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAubGooYSl9LAphNDpm
+dW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVVYoYSl9LApycjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5l
+dyBQLmFFKGEsYixjKX0sCmhLOmZ1bmN0aW9uKGE0KXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGks
+aCxnLGYsZSxkLGMsYixhLGEwLGExLGEyPW51bGwsYTM9YTQubGVuZ3RoCmlmKGEzPj01KXt0PSgoSi5R
+eihhNCw0KV41OCkqM3xDLnhCLlcoYTQsMCleMTAwfEMueEIuVyhhNCwxKV45N3xDLnhCLlcoYTQsMile
+MTE2fEMueEIuVyhhNCwzKV45Nyk+Pj4wCmlmKHQ9PT0wKXJldHVybiBQLktEKGEzPGEzP0MueEIuTmoo
+YTQsMCxhMyk6YTQsNSxhMikuZ2xSKCkKZWxzZSBpZih0PT09MzIpcmV0dXJuIFAuS0QoQy54Qi5Oaihh
+NCw1LGEzKSwwLGEyKS5nbFIoKX1zPVAuTzgoOCwwLCExLHUucSkKQy5ObS5ZKHMsMCwwKQpDLk5tLlko
+cywxLC0xKQpDLk5tLlkocywyLC0xKQpDLk5tLlkocyw3LC0xKQpDLk5tLlkocywzLDApCkMuTm0uWShz
+LDQsMCkKQy5ObS5ZKHMsNSxhMykKQy5ObS5ZKHMsNixhMykKaWYoUC5VQihhNCwwLGEzLDAscyk+PTE0
+KUMuTm0uWShzLDcsYTMpCmlmKDE+PXMubGVuZ3RoKXJldHVybiBILmsocywxKQpyPXNbMV0KaWYocj49
+MClpZihQLlVCKGE0LDAsciwyMCxzKT09PTIwKXtpZig3Pj1zLmxlbmd0aClyZXR1cm4gSC5rKHMsNykK
+c1s3XT1yfXE9cy5sZW5ndGgKaWYoMj49cSlyZXR1cm4gSC5rKHMsMikKcD1zWzJdKzEKaWYoMz49cSly
+ZXR1cm4gSC5rKHMsMykKbz1zWzNdCmlmKDQ+PXEpcmV0dXJuIEguayhzLDQpCm49c1s0XQppZig1Pj1x
+KXJldHVybiBILmsocyw1KQptPXNbNV0KaWYoNj49cSlyZXR1cm4gSC5rKHMsNikKbD1zWzZdCmlmKGw8
+bSltPWwKaWYobjxwKW49bQplbHNlIGlmKG48PXIpbj1yKzEKaWYobzxwKW89bgppZig3Pj1xKXJldHVy
+biBILmsocyw3KQprPXNbN108MAppZihrKWlmKHA+ciszKXtqPWEyCms9ITF9ZWxzZXtxPW8+MAppZihx
+JiZvKzE9PT1uKXtqPWEyCms9ITF9ZWxzZXtpZighKG08YTMmJm09PT1uKzImJkoucTAoYTQsIi4uIixu
+KSkpaT1tPm4rMiYmSi5xMChhNCwiLy4uIixtLTMpCmVsc2UgaT0hMAppZihpKXtqPWEyCms9ITF9ZWxz
+ZXtpZihyPT09NClpZihKLnEwKGE0LCJmaWxlIiwwKSl7aWYocDw9MCl7aWYoIUMueEIuUWkoYTQsIi8i
+LG4pKXtoPSJmaWxlOi8vLyIKdD0zfWVsc2V7aD0iZmlsZTovLyIKdD0yfWE0PWgrQy54Qi5OaihhNCxu
+LGEzKQpyLT0wCnE9dC0wCm0rPXEKbCs9cQphMz1hNC5sZW5ndGgKcD03Cm89NwpuPTd9ZWxzZSBpZihu
+PT09bSl7KytsCmc9bSsxCmE0PUMueEIuaTcoYTQsbixtLCIvIik7KythMwptPWd9aj0iZmlsZSJ9ZWxz
+ZSBpZihDLnhCLlFpKGE0LCJodHRwIiwwKSl7aWYocSYmbyszPT09biYmQy54Qi5RaShhNCwiODAiLG8r
+MSkpe2wtPTMKZj1uLTMKbS09MwphND1DLnhCLmk3KGE0LG8sbiwiIikKYTMtPTMKbj1mfWo9Imh0dHAi
+fWVsc2Ugaj1hMgplbHNlIGlmKHI9PT01JiZKLnEwKGE0LCJodHRwcyIsMCkpe2lmKHEmJm8rND09PW4m
+JkoucTAoYTQsIjQ0MyIsbysxKSl7bC09NApmPW4tNAptLT00CmE0PUouZGcoYTQsbyxuLCIiKQphMy09
+MwpuPWZ9aj0iaHR0cHMifWVsc2Ugaj1hMgprPSEwfX19ZWxzZSBqPWEyCmlmKGspe3E9YTQubGVuZ3Ro
+CmlmKGEzPHEpe2E0PUoubGQoYTQsMCxhMykKci09MApwLT0wCm8tPTAKbi09MAptLT0wCmwtPTB9cmV0
+dXJuIG5ldyBQLlVmKGE0LHIscCxvLG4sbSxsLGopfWlmKGo9PW51bGwpaWYocj4wKWo9UC5QaShhNCww
+LHIpCmVsc2V7aWYocj09PTApUC5SMyhhNCwwLCJJbnZhbGlkIGVtcHR5IHNjaGVtZSIpCmo9IiJ9aWYo
+cD4wKXtlPXIrMwpkPWU8cD9QLnpSKGE0LGUscC0xKToiIgpjPVAuT2UoYTQscCxvLCExKQpxPW8rMQpp
+ZihxPG4pe2I9SC5IcChKLmxkKGE0LHEsbiksYTIpCmE9UC53QihiPT1udWxsP0gudmgoUC5ycigiSW52
+YWxpZCBwb3J0IixhNCxxKSk6YixqKX1lbHNlIGE9YTJ9ZWxzZXthPWEyCmM9YQpkPSIifWEwPVAua2Eo
+YTQsbixtLGEyLGosYyE9bnVsbCkKYTE9bTxsP1AubGUoYTQsbSsxLGwsYTIpOmEyCnJldHVybiBuZXcg
+UC5EbihqLGQsYyxhLGEwLGExLGw8YTM/UC50RyhhNCxsKzEsYTMpOmEyKX0sCk10OmZ1bmN0aW9uKGEp
+e0guYyhhKQpyZXR1cm4gUC5rdShhLDAsYS5sZW5ndGgsQy54TSwhMSl9LApXWDpmdW5jdGlvbihhKXt2
+YXIgdD11Lk4KcmV0dXJuIEMuTm0uTjAoSC5WTShhLnNwbGl0KCImIiksdS5zKSxQLkZsKHQsdCksbmV3
+IFAubjEoQy54TSksdS5mKX0sCkhoOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPSJJ
+UHY0IGFkZHJlc3Mgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSA0IHBhcnRzIixsPSJlYWNoIHBhcnQgbXVz
+dCBiZSBpbiB0aGUgcmFuZ2UgMC4uMjU1IixrPW5ldyBQLmNTKGEpLGo9bmV3IFVpbnQ4QXJyYXkoNCkK
+Zm9yKHQ9ai5sZW5ndGgscz1iLHI9cyxxPTA7czxjOysrcyl7cD1DLnhCLm0oYSxzKQppZihwIT09NDYp
+e2lmKChwXjQ4KT45KWsuJDIoImludmFsaWQgY2hhcmFjdGVyIixzKX1lbHNle2lmKHE9PT0zKWsuJDIo
+bSxzKQpvPVAuUUEoQy54Qi5OaihhLHIscyksbnVsbCkKaWYodHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1
+cm4gby5vcygpCmlmKG8+MjU1KWsuJDIobCxyKQpuPXErMQppZihxPj10KXJldHVybiBILmsoaixxKQpq
+W3FdPW8Kcj1zKzEKcT1ufX1pZihxIT09MylrLiQyKG0sYykKbz1QLlFBKEMueEIuTmooYSxyLGMpLG51
+bGwpCmlmKHR5cGVvZiBvIT09Im51bWJlciIpcmV0dXJuIG8ub3MoKQppZihvPjI1NSlrLiQyKGwscikK
+aWYocT49dClyZXR1cm4gSC5rKGoscSkKaltxXT1vCnJldHVybiBqfSwKZWc6ZnVuY3Rpb24oYSxiLGEw
+KXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkPW5ldyBQLlZDKGEpLGM9bmV3IFAu
+SlQoZCxhKQppZihhLmxlbmd0aDwyKWQuJDEoImFkZHJlc3MgaXMgdG9vIHNob3J0IikKdD1ILlZNKFtd
+LHUudCkKZm9yKHM9YixyPXMscT0hMSxwPSExO3M8YTA7KytzKXtvPUMueEIubShhLHMpCmlmKG89PT01
+OCl7aWYocz09PWIpeysrcwppZihDLnhCLm0oYSxzKSE9PTU4KWQuJDIoImludmFsaWQgc3RhcnQgY29s
+b24uIixzKQpyPXN9aWYocz09PXIpe2lmKHEpZC4kMigib25seSBvbmUgd2lsZGNhcmQgYDo6YCBpcyBh
+bGxvd2VkIixzKQpDLk5tLmkodCwtMSkKcT0hMH1lbHNlIEMuTm0uaSh0LGMuJDIocixzKSkKcj1zKzF9
+ZWxzZSBpZihvPT09NDYpcD0hMH1pZih0Lmxlbmd0aD09PTApZC4kMSgidG9vIGZldyBwYXJ0cyIpCm49
+cj09PWEwCm09Qy5ObS5ncloodCkKaWYobiYmbSE9PS0xKWQuJDIoImV4cGVjdGVkIGEgcGFydCBhZnRl
+ciBsYXN0IGA6YCIsYTApCmlmKCFuKWlmKCFwKUMuTm0uaSh0LGMuJDIocixhMCkpCmVsc2V7bD1QLkho
+KGEscixhMCkKQy5ObS5pKHQsKGxbMF08PDh8bFsxXSk+Pj4wKQpDLk5tLmkodCwobFsyXTw8OHxsWzNd
+KT4+PjApfWlmKHEpe2lmKHQubGVuZ3RoPjcpZC4kMSgiYW4gYWRkcmVzcyB3aXRoIGEgd2lsZGNhcmQg
+bXVzdCBoYXZlIGxlc3MgdGhhbiA3IHBhcnRzIil9ZWxzZSBpZih0Lmxlbmd0aCE9PTgpZC4kMSgiYW4g
+YWRkcmVzcyB3aXRob3V0IGEgd2lsZGNhcmQgbXVzdCBjb250YWluIGV4YWN0bHkgOCBwYXJ0cyIpCms9
+bmV3IFVpbnQ4QXJyYXkoMTYpCmZvcihtPXQubGVuZ3RoLGo9ay5sZW5ndGgsaT05LW0scz0wLGg9MDtz
+PG07KytzKXtnPXRbc10KaWYoZz09PS0xKWZvcihmPTA7ZjxpOysrZil7aWYoaDwwfHxoPj1qKXJldHVy
+biBILmsoayxoKQprW2hdPTAKZT1oKzEKaWYoZT49ailyZXR1cm4gSC5rKGssZSkKa1tlXT0wCmgrPTJ9
+ZWxzZXtlPUMuam4ud0coZyw4KQppZihoPDB8fGg+PWopcmV0dXJuIEguayhrLGgpCmtbaF09ZQplPWgr
+MQppZihlPj1qKXJldHVybiBILmsoayxlKQprW2VdPWcmMjU1CmgrPTJ9fXJldHVybiBrfSwKS0w6ZnVu
+Y3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHQscyxyLHEscCxvCmY9Zj09bnVsbD8iIjpQLlBpKGYsMCxm
+Lmxlbmd0aCkKZz1QLnpSKGcsMCxnPT1udWxsPzA6Zy5sZW5ndGgpCmE9UC5PZShhLDAsYT09bnVsbD8w
+OmEubGVuZ3RoLCExKQp0PVAubGUobnVsbCwwLDAsZSkKcz1QLnRHKG51bGwsMCwwKQpkPVAud0IoZCxm
+KQpyPWY9PT0iZmlsZSIKaWYoYT09bnVsbClxPWcubGVuZ3RoIT09MHx8ZCE9bnVsbHx8cgplbHNlIHE9
+ITEKaWYocSlhPSIiCnE9YT09bnVsbApwPSFxCmI9UC5rYShiLDAsYj09bnVsbD8wOmIubGVuZ3RoLGMs
+ZixwKQpvPWYubGVuZ3RoPT09MAppZihvJiZxJiYhQy54Qi5uKGIsIi8iKSliPVAud0YoYiwhb3x8cCkK
+ZWxzZSBiPVAueGUoYikKcmV0dXJuIG5ldyBQLkRuKGYsZyxxJiZDLnhCLm4oYiwiLy8iKT8iIjphLGQs
+Yix0LHMpfSwKd0s6ZnVuY3Rpb24oYSl7aWYoYT09PSJodHRwIilyZXR1cm4gODAKaWYoYT09PSJodHRw
+cyIpcmV0dXJuIDQ0MwpyZXR1cm4gMH0sClIzOmZ1bmN0aW9uKGEsYixjKXt0aHJvdyBILmIoUC5ycihj
+LGEsYikpfSwKWGQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpPW51
+bGwsaD1iLmxlbmd0aAppZihoIT09MCl7cj0wCndoaWxlKCEwKXtpZighKHI8aCkpe3Q9IiIKcz0wCmJy
+ZWFrfWlmKEMueEIuVyhiLHIpPT09NjQpe3Q9Qy54Qi5OaihiLDAscikKcz1yKzEKYnJlYWt9KytyfWlm
+KHM8aCYmQy54Qi5XKGIscyk9PT05MSl7Zm9yKHE9cyxwPS0xO3E8aDsrK3Epe289Qy54Qi5XKGIscSkK
+aWYobz09PTM3JiZwPDApe249Qy54Qi5RaShiLCIyNSIscSsxKT9xKzI6cQpwPXEKcT1ufWVsc2UgaWYo
+bz09PTkzKWJyZWFrfWlmKHE9PT1oKXRocm93IEguYihQLnJyKCJJbnZhbGlkIElQdjYgaG9zdCBlbnRy
+eS4iLGIscykpCm09cDwwP3E6cApQLmVnKGIscysxLG0pOysrcQppZihxIT09aCYmQy54Qi5XKGIscSkh
+PT01OCl0aHJvdyBILmIoUC5ycigiSW52YWxpZCBlbmQgb2YgYXV0aG9yaXR5IixiLHEpKX1lbHNlIHE9
+cwp3aGlsZSghMCl7aWYoIShxPGgpKXtsPWkKYnJlYWt9aWYoQy54Qi5XKGIscSk9PT01OCl7az1DLnhC
+LkcoYixxKzEpCmw9ay5sZW5ndGghPT0wP1AuUUEoayxpKTppCmJyZWFrfSsrcX1qPUMueEIuTmooYixz
+LHEpfWVsc2V7bD1pCmo9bAp0PSIifXJldHVybiBQLktMKGosaSxILlZNKGMuc3BsaXQoIi8iKSx1LnMp
+LGwsZCxhLHQpfSwKa0U6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwCmZvcih0PWEubGVuZ3RoLHM9
+MDtzPHQ7KytzKXtyPWFbc10Kci50b1N0cmluZwpxPUouVTYocikKcD1xLmdBKHIpCmlmKDA+cClILnZo
+KFAuVEUoMCwwLHEuZ0EociksbnVsbCxudWxsKSkKaWYoSC5tMihyLCIvIiwwKSl7dD1QLkw0KCJJbGxl
+Z2FsIHBhdGggY2hhcmFjdGVyICIrSC5kKHIpKQp0aHJvdyBILmIodCl9fX0sCkhOOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgdCxzLHIKZm9yKHQ9SC5xQyhhLGMsbnVsbCxILnQ2KGEpLmMpLHQ9bmV3IEguYTcodCx0
+LmdBKHQpLHQuJHRpLkMoImE3PGFMLkU+IikpO3QuRigpOyl7cz10LmQKcj1QLm51KCdbIiovOjw+P1xc
+XFx8XScpCnMudG9TdHJpbmcKaWYoSC5tMihzLHIsMCkpe3Q9UC5MNCgiSWxsZWdhbCBjaGFyYWN0ZXIg
+aW4gcGF0aDogIitzKQp0aHJvdyBILmIodCl9fX0sCnJnOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoISg2
+NTw9YSYmYTw9OTApKXQ9OTc8PWEmJmE8PTEyMgplbHNlIHQ9ITAKaWYodClyZXR1cm4KdD1QLkw0KCJJ
+bGxlZ2FsIGRyaXZlIGxldHRlciAiK1AuT28oYSkpCnRocm93IEguYih0KX0sCndCOmZ1bmN0aW9uKGEs
+Yil7aWYoYSE9bnVsbCYmYT09PVAud0soYikpcmV0dXJuIG51bGwKcmV0dXJuIGF9LApPZTpmdW5jdGlv
+bihhLGIsYyxkKXt2YXIgdCxzLHIscSxwLG8KaWYoYT09bnVsbClyZXR1cm4gbnVsbAppZihiPT09Yyly
+ZXR1cm4iIgppZihDLnhCLm0oYSxiKT09PTkxKXt0PWMtMQppZihDLnhCLm0oYSx0KSE9PTkzKVAuUjMo
+YSxiLCJNaXNzaW5nIGVuZCBgXWAgdG8gbWF0Y2ggYFtgIGluIGhvc3QiKQpzPWIrMQpyPVAudG8oYSxz
+LHQpCmlmKHI8dCl7cT1yKzEKcD1QLk9BKGEsQy54Qi5RaShhLCIyNSIscSk/ciszOnEsdCwiJTI1Iil9
+ZWxzZSBwPSIiClAuZWcoYSxzLHIpCnJldHVybiBDLnhCLk5qKGEsYixyKS50b0xvd2VyQ2FzZSgpK3Ar
+Il0ifWZvcihvPWI7bzxjOysrbylpZihDLnhCLm0oYSxvKT09PTU4KXtyPUMueEIuWFUoYSwiJSIsYikK
+cj1yPj1iJiZyPGM/cjpjCmlmKHI8Yyl7cT1yKzEKcD1QLk9BKGEsQy54Qi5RaShhLCIyNSIscSk/cisz
+OnEsYywiJTI1Iil9ZWxzZSBwPSIiClAuZWcoYSxiLHIpCnJldHVybiJbIitDLnhCLk5qKGEsYixyKStw
+KyJdIn1yZXR1cm4gUC5PTChhLGIsYyl9LAp0bzpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9Qy54Qi5YVShh
+LCIlIixiKQpyZXR1cm4gdD49YiYmdDxjP3Q6Y30sCk9BOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMs
+cixxLHAsbyxuLG0sbCxrLGo9ZCE9PSIiP25ldyBQLlJuKGQpOm51bGwKZm9yKHQ9YixzPXQscj0hMDt0
+PGM7KXtxPUMueEIubShhLHQpCmlmKHE9PT0zNyl7cD1QLnJ2KGEsdCwhMCkKbz1wPT1udWxsCmlmKG8m
+JnIpe3QrPTMKY29udGludWV9aWYoaj09bnVsbClqPW5ldyBQLlJuKCIiKQpuPWouYSs9Qy54Qi5Oaihh
+LHMsdCkKaWYobylwPUMueEIuTmooYSx0LHQrMykKZWxzZSBpZihwPT09IiUiKVAuUjMoYSx0LCJab25l
+SUQgc2hvdWxkIG5vdCBjb250YWluICUgYW55bW9yZSIpCmouYT1uK3AKdCs9MwpzPXQKcj0hMH1lbHNl
+e2lmKHE8MTI3KXtvPXE+Pj40CmlmKG8+PTgpcmV0dXJuIEguayhDLkYzLG8pCm89KEMuRjNbb10mMTw8
+KHEmMTUpKSE9PTB9ZWxzZSBvPSExCmlmKG8pe2lmKHImJjY1PD1xJiY5MD49cSl7aWYoaj09bnVsbClq
+PW5ldyBQLlJuKCIiKQppZihzPHQpe2ouYSs9Qy54Qi5OaihhLHMsdCkKcz10fXI9ITF9Kyt0fWVsc2V7
+aWYoKHEmNjQ1MTIpPT09NTUyOTYmJnQrMTxjKXttPUMueEIubShhLHQrMSkKaWYoKG0mNjQ1MTIpPT09
+NTYzMjApe3E9NjU1MzZ8KHEmMTAyMyk8PDEwfG0mMTAyMwpsPTJ9ZWxzZSBsPTF9ZWxzZSBsPTEKaz1D
+LnhCLk5qKGEscyx0KQppZihqPT1udWxsKXtqPW5ldyBQLlJuKCIiKQpvPWp9ZWxzZSBvPWoKby5hKz1r
+Cm8uYSs9UC56WChxKQp0Kz1sCnM9dH19fWlmKGo9PW51bGwpcmV0dXJuIEMueEIuTmooYSxiLGMpCmlm
+KHM8YylqLmErPUMueEIuTmooYSxzLGMpCm89ai5hCnJldHVybiBvLmNoYXJDb2RlQXQoMCk9PTA/bzpv
+fSwKT0w6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGoKZm9yKHQ9YixzPXQs
+cj1udWxsLHE9ITA7dDxjOyl7cD1DLnhCLm0oYSx0KQppZihwPT09Mzcpe289UC5ydihhLHQsITApCm49
+bz09bnVsbAppZihuJiZxKXt0Kz0zCmNvbnRpbnVlfWlmKHI9PW51bGwpcj1uZXcgUC5SbigiIikKbT1D
+LnhCLk5qKGEscyx0KQpsPXIuYSs9IXE/bS50b0xvd2VyQ2FzZSgpOm0KaWYobil7bz1DLnhCLk5qKGEs
+dCx0KzMpCms9M31lbHNlIGlmKG89PT0iJSIpe289IiUyNSIKaz0xfWVsc2Ugaz0zCnIuYT1sK28KdCs9
+awpzPXQKcT0hMH1lbHNle2lmKHA8MTI3KXtuPXA+Pj40CmlmKG4+PTgpcmV0dXJuIEguayhDLmVhLG4p
+Cm49KEMuZWFbbl0mMTw8KHAmMTUpKSE9PTB9ZWxzZSBuPSExCmlmKG4pe2lmKHEmJjY1PD1wJiY5MD49
+cCl7aWYocj09bnVsbClyPW5ldyBQLlJuKCIiKQppZihzPHQpe3IuYSs9Qy54Qi5OaihhLHMsdCkKcz10
+fXE9ITF9Kyt0fWVsc2V7aWYocDw9OTMpe249cD4+PjQKaWYobj49OClyZXR1cm4gSC5rKEMuYWssbikK
+bj0oQy5ha1tuXSYxPDwocCYxNSkpIT09MH1lbHNlIG49ITEKaWYobilQLlIzKGEsdCwiSW52YWxpZCBj
+aGFyYWN0ZXIiKQplbHNle2lmKChwJjY0NTEyKT09PTU1Mjk2JiZ0KzE8Yyl7aj1DLnhCLm0oYSx0KzEp
+CmlmKChqJjY0NTEyKT09PTU2MzIwKXtwPTY1NTM2fChwJjEwMjMpPDwxMHxqJjEwMjMKaz0yfWVsc2Ug
+az0xfWVsc2Ugaz0xCm09Qy54Qi5OaihhLHMsdCkKaWYoIXEpbT1tLnRvTG93ZXJDYXNlKCkKaWYocj09
+bnVsbCl7cj1uZXcgUC5SbigiIikKbj1yfWVsc2Ugbj1yCm4uYSs9bQpuLmErPVAuelgocCkKdCs9awpz
+PXR9fX19aWYocj09bnVsbClyZXR1cm4gQy54Qi5OaihhLGIsYykKaWYoczxjKXttPUMueEIuTmooYSxz
+LGMpCnIuYSs9IXE/bS50b0xvd2VyQ2FzZSgpOm19bj1yLmEKcmV0dXJuIG4uY2hhckNvZGVBdCgwKT09
+MD9uOm59LApQaTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEKaWYoYj09PWMpcmV0dXJuIiIKaWYo
+IVAuRXQoSi5yWShhKS5XKGEsYikpKVAuUjMoYSxiLCJTY2hlbWUgbm90IHN0YXJ0aW5nIHdpdGggYWxw
+aGFiZXRpYyBjaGFyYWN0ZXIiKQpmb3IodD1iLHM9ITE7dDxjOysrdCl7cj1DLnhCLlcoYSx0KQppZihy
+PDEyOCl7cT1yPj4+NAppZihxPj04KXJldHVybiBILmsoQy5tSyxxKQpxPShDLm1LW3FdJjE8PChyJjE1
+KSkhPT0wfWVsc2UgcT0hMQppZighcSlQLlIzKGEsdCwiSWxsZWdhbCBzY2hlbWUgY2hhcmFjdGVyIikK
+aWYoNjU8PXImJnI8PTkwKXM9ITB9YT1DLnhCLk5qKGEsYixjKQpyZXR1cm4gUC5ZYShzP2EudG9Mb3dl
+ckNhc2UoKTphKX0sCllhOmZ1bmN0aW9uKGEpe2lmKGE9PT0iaHR0cCIpcmV0dXJuImh0dHAiCmlmKGE9
+PT0iZmlsZSIpcmV0dXJuImZpbGUiCmlmKGE9PT0iaHR0cHMiKXJldHVybiJodHRwcyIKaWYoYT09PSJw
+YWNrYWdlIilyZXR1cm4icGFja2FnZSIKcmV0dXJuIGF9LAp6UjpmdW5jdGlvbihhLGIsYyl7aWYoYT09
+bnVsbClyZXR1cm4iIgpyZXR1cm4gUC5QSShhLGIsYyxDLnRvLCExKX0sCmthOmZ1bmN0aW9uKGEsYixj
+LGQsZSxmKXt2YXIgdCxzLHI9ZT09PSJmaWxlIixxPXJ8fGYKaWYoYT09bnVsbCl7aWYoZD09bnVsbCly
+ZXR1cm4gcj8iLyI6IiIKdD1ILnQ2KGQpCnM9bmV3IEgubEooZCx0LkMoInFVKDEpIikuYShuZXcgUC5S
+WigpKSx0LkMoImxKPDEscVU+IikpLnpWKDAsIi8iKX1lbHNlIGlmKGQhPW51bGwpdGhyb3cgSC5iKFAu
+eFkoIkJvdGggcGF0aCBhbmQgcGF0aFNlZ21lbnRzIHNwZWNpZmllZCIpKQplbHNlIHM9UC5QSShhLGIs
+YyxDLldkLCEwKQppZihzLmxlbmd0aD09PTApe2lmKHIpcmV0dXJuIi8ifWVsc2UgaWYocSYmIUMueEIu
+bihzLCIvIikpcz0iLyIrcwpyZXR1cm4gUC5KcihzLGUsZil9LApKcjpmdW5jdGlvbihhLGIsYyl7dmFy
+IHQ9Yi5sZW5ndGg9PT0wCmlmKHQmJiFjJiYhQy54Qi5uKGEsIi8iKSlyZXR1cm4gUC53RihhLCF0fHxj
+KQpyZXR1cm4gUC54ZShhKX0sCmxlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHM9e30KaWYoYSE9bnVs
+bCl7aWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgiQm90aCBxdWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJz
+IHNwZWNpZmllZCIpKQpyZXR1cm4gUC5QSShhLGIsYyxDLlZDLCEwKX1pZihkPT1udWxsKXJldHVybiBu
+dWxsCnQ9bmV3IFAuUm4oIiIpCnMuYT0iIgpkLksoMCxuZXcgUC55NShuZXcgUC5NRShzLHQpKSkKcz10
+LmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAp0RzpmdW5jdGlvbihhLGIsYyl7aWYoYT09
+bnVsbClyZXR1cm4gbnVsbApyZXR1cm4gUC5QSShhLGIsYyxDLlZDLCEwKX0sCnJ2OmZ1bmN0aW9uKGEs
+YixjKXt2YXIgdCxzLHIscSxwLG89YisyCmlmKG8+PWEubGVuZ3RoKXJldHVybiIlIgp0PUMueEIubShh
+LGIrMSkKcz1DLnhCLm0oYSxvKQpyPUgub28odCkKcT1ILm9vKHMpCmlmKHI8MHx8cTwwKXJldHVybiIl
+IgpwPXIqMTYrcQppZihwPDEyNyl7bz1DLmpuLndHKHAsNCkKaWYobz49OClyZXR1cm4gSC5rKEMuRjMs
+bykKbz0oQy5GM1tvXSYxPDwocCYxNSkpIT09MH1lbHNlIG89ITEKaWYobylyZXR1cm4gSC5MdyhjJiY2
+NTw9cCYmOTA+PXA/KHB8MzIpPj4+MDpwKQppZih0Pj05N3x8cz49OTcpcmV0dXJuIEMueEIuTmooYSxi
+LGIrMykudG9VcHBlckNhc2UoKQpyZXR1cm4gbnVsbH0sCnpYOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixx
+LHAsbyxuLG0sbD0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYTwxMjgpe3Q9bmV3IFVpbnQ4QXJyYXkoMykK
+cz10Lmxlbmd0aAppZigwPj1zKXJldHVybiBILmsodCwwKQp0WzBdPTM3CnI9Qy54Qi5XKGwsYT4+PjQp
+CmlmKDE+PXMpcmV0dXJuIEguayh0LDEpCnRbMV09cgpyPUMueEIuVyhsLGEmMTUpCmlmKDI+PXMpcmV0
+dXJuIEguayh0LDIpCnRbMl09cn1lbHNle2lmKGE+MjA0NylpZihhPjY1NTM1KXtxPTI0MApwPTR9ZWxz
+ZXtxPTIyNApwPTN9ZWxzZXtxPTE5MgpwPTJ9dD1uZXcgVWludDhBcnJheSgzKnApCmZvcihzPXQubGVu
+Z3RoLG89MDstLXAscD49MDtxPTEyOCl7bj1DLmpuLmJmKGEsNipwKSY2M3xxCmlmKG8+PXMpcmV0dXJu
+IEguayh0LG8pCnRbb109MzcKcj1vKzEKbT1DLnhCLlcobCxuPj4+NCkKaWYocj49cylyZXR1cm4gSC5r
+KHQscikKdFtyXT1tCm09bysyCnI9Qy54Qi5XKGwsbiYxNSkKaWYobT49cylyZXR1cm4gSC5rKHQsbSkK
+dFttXT1yCm8rPTN9fXJldHVybiBQLkhNKHQsMCxudWxsKX0sClBJOmZ1bmN0aW9uKGEsYixjLGQsZSl7
+dmFyIHQ9UC5VbChhLGIsYyxkLGUpCnJldHVybiB0PT1udWxsP0MueEIuTmooYSxiLGMpOnR9LApVbDpm
+dW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrPW51bGwKZm9yKHQ9IWUscz1i
+LHI9cyxxPWs7czxjOyl7cD1DLnhCLm0oYSxzKQppZihwPDEyNyl7bz1wPj4+NAppZihvPj04KXJldHVy
+biBILmsoZCxvKQpvPShkW29dJjE8PChwJjE1KSkhPT0wfWVsc2Ugbz0hMQppZihvKSsrcwplbHNle2lm
+KHA9PT0zNyl7bj1QLnJ2KGEscywhMSkKaWYobj09bnVsbCl7cys9Mwpjb250aW51ZX1pZigiJSI9PT1u
+KXtuPSIlMjUiCm09MX1lbHNlIG09M31lbHNle2lmKHQpaWYocDw9OTMpe289cD4+PjQKaWYobz49OCly
+ZXR1cm4gSC5rKEMuYWssbykKbz0oQy5ha1tvXSYxPDwocCYxNSkpIT09MH1lbHNlIG89ITEKZWxzZSBv
+PSExCmlmKG8pe1AuUjMoYSxzLCJJbnZhbGlkIGNoYXJhY3RlciIpCm09awpuPW19ZWxzZXtpZigocCY2
+NDUxMik9PT01NTI5Nil7bz1zKzEKaWYobzxjKXtsPUMueEIubShhLG8pCmlmKChsJjY0NTEyKT09PTU2
+MzIwKXtwPTY1NTM2fChwJjEwMjMpPDwxMHxsJjEwMjMKbT0yfWVsc2UgbT0xfWVsc2UgbT0xfWVsc2Ug
+bT0xCm49UC56WChwKX19aWYocT09bnVsbCl7cT1uZXcgUC5SbigiIikKbz1xfWVsc2Ugbz1xCm8uYSs9
+Qy54Qi5OaihhLHIscykKby5hKz1ILmQobikKaWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gSC5w
+WShtKQpzKz1tCnI9c319aWYocT09bnVsbClyZXR1cm4gawppZihyPGMpcS5hKz1DLnhCLk5qKGEscixj
+KQp0PXEuYQpyZXR1cm4gdC5jaGFyQ29kZUF0KDApPT0wP3Q6dH0sCnlCOmZ1bmN0aW9uKGEpe2lmKEMu
+eEIubihhLCIuIikpcmV0dXJuITAKcmV0dXJuIEMueEIuT1koYSwiLy4iKSE9PS0xfSwKeGU6ZnVuY3Rp
+b24oYSl7dmFyIHQscyxyLHEscCxvLG4KaWYoIVAueUIoYSkpcmV0dXJuIGEKdD1ILlZNKFtdLHUucykK
+Zm9yKHM9YS5zcGxpdCgiLyIpLHI9cy5sZW5ndGgscT0hMSxwPTA7cDxyOysrcCl7bz1zW3BdCmlmKEou
+Uk0obywiLi4iKSl7bj10Lmxlbmd0aAppZihuIT09MCl7aWYoMD49bilyZXR1cm4gSC5rKHQsLTEpCnQu
+cG9wKCkKaWYodC5sZW5ndGg9PT0wKUMuTm0uaSh0LCIiKX1xPSEwfWVsc2UgaWYoIi4iPT09bylxPSEw
+CmVsc2V7Qy5ObS5pKHQsbykKcT0hMX19aWYocSlDLk5tLmkodCwiIikKcmV0dXJuIEMuTm0uelYodCwi
+LyIpfSwKd0Y6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8KaWYoIVAueUIoYSkpcmV0dXJuIWI/
+UC5DMShhKTphCnQ9SC5WTShbXSx1LnMpCmZvcihzPWEuc3BsaXQoIi8iKSxyPXMubGVuZ3RoLHE9ITEs
+cD0wO3A8cjsrK3Ape289c1twXQppZigiLi4iPT09bylpZih0Lmxlbmd0aCE9PTAmJkMuTm0uZ3JaKHQp
+IT09Ii4uIil7aWYoMD49dC5sZW5ndGgpcmV0dXJuIEguayh0LC0xKQp0LnBvcCgpCnE9ITB9ZWxzZXtD
+Lk5tLmkodCwiLi4iKQpxPSExfWVsc2UgaWYoIi4iPT09bylxPSEwCmVsc2V7Qy5ObS5pKHQsbykKcT0h
+MX19cz10Lmxlbmd0aAppZihzIT09MClpZihzPT09MSl7aWYoMD49cylyZXR1cm4gSC5rKHQsMCkKcz10
+WzBdLmxlbmd0aD09PTB9ZWxzZSBzPSExCmVsc2Ugcz0hMAppZihzKXJldHVybiIuLyIKaWYocXx8Qy5O
+bS5ncloodCk9PT0iLi4iKUMuTm0uaSh0LCIiKQppZighYil7aWYoMD49dC5sZW5ndGgpcmV0dXJuIEgu
+ayh0LDApCkMuTm0uWSh0LDAsUC5DMSh0WzBdKSl9cmV0dXJuIEMuTm0uelYodCwiLyIpfSwKQzE6ZnVu
+Y3Rpb24oYSl7dmFyIHQscyxyLHE9YS5sZW5ndGgKaWYocT49MiYmUC5FdChKLlF6KGEsMCkpKWZvcih0
+PTE7dDxxOysrdCl7cz1DLnhCLlcoYSx0KQppZihzPT09NTgpcmV0dXJuIEMueEIuTmooYSwwLHQpKyIl
+M0EiK0MueEIuRyhhLHQrMSkKaWYoczw9MTI3KXtyPXM+Pj40CmlmKHI+PTgpcmV0dXJuIEguayhDLm1L
+LHIpCnI9KEMubUtbcl0mMTw8KHMmMTUpKT09PTB9ZWxzZSByPSEwCmlmKHIpYnJlYWt9cmV0dXJuIGF9
+LAptbjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLmdGaigpLHA9cS5sZW5ndGgKaWYocD4wJiZKLkgo
+cVswXSk9PT0yJiZKLmE2KHFbMF0sMSk9PT01OCl7aWYoMD49cClyZXR1cm4gSC5rKHEsMCkKUC5yZyhK
+LmE2KHFbMF0sMCksITEpClAuSE4ocSwhMSwxKQp0PSEwfWVsc2V7UC5ITihxLCExLDApCnQ9ITF9cz1h
+Lmd0VCgpJiYhdD8iXFwiOiIiCmlmKGEuZ2NqKCkpe3I9YS5nSmYoYSkKaWYoci5sZW5ndGghPT0wKXM9
+cysiXFwiK3IrIlxcIn1zPVAudmcocyxxLCJcXCIpCnA9dCYmcD09PTE/cysiXFwiOnMKcmV0dXJuIHAu
+Y2hhckNvZGVBdCgwKT09MD9wOnB9LApJaDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscgpmb3IodD0wLHM9
+MDtzPDI7KytzKXtyPUMueEIuVyhhLGIrcykKaWYoNDg8PXImJnI8PTU3KXQ9dCoxNityLTQ4CmVsc2V7
+cnw9MzIKaWYoOTc8PXImJnI8PTEwMil0PXQqMTYrci04NwplbHNlIHRocm93IEguYihQLnhZKCJJbnZh
+bGlkIFVSTCBlbmNvZGluZyIpKX19cmV0dXJuIHR9LAprdTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0
+LHMscixxLHA9Si5yWShhKSxvPWIKd2hpbGUoITApe2lmKCEobzxjKSl7dD0hMApicmVha31zPXAuVyhh
+LG8pCmlmKHM8PTEyNylpZihzIT09Mzcpcj1lJiZzPT09NDMKZWxzZSByPSEwCmVsc2Ugcj0hMAppZihy
+KXt0PSExCmJyZWFrfSsrb31pZih0KXtpZihDLnhNIT09ZClyPSExCmVsc2Ugcj0hMAppZihyKXJldHVy
+biBwLk5qKGEsYixjKQplbHNlIHE9bmV3IEgucWoocC5OaihhLGIsYykpfWVsc2V7cT1ILlZNKFtdLHUu
+dCkKZm9yKG89YjtvPGM7KytvKXtzPXAuVyhhLG8pCmlmKHM+MTI3KXRocm93IEguYihQLnhZKCJJbGxl
+Z2FsIHBlcmNlbnQgZW5jb2RpbmcgaW4gVVJJIikpCmlmKHM9PT0zNyl7aWYobyszPmEubGVuZ3RoKXRo
+cm93IEguYihQLnhZKCJUcnVuY2F0ZWQgVVJJIikpCkMuTm0uaShxLFAuSWgoYSxvKzEpKQpvKz0yfWVs
+c2UgaWYoZSYmcz09PTQzKUMuTm0uaShxLDMyKQplbHNlIEMuTm0uaShxLHMpfX11LkwuYShxKQpyZXR1
+cm4gbmV3IFAuR1koITEpLldKKHEpfSwKRXQ6ZnVuY3Rpb24oYSl7dmFyIHQ9YXwzMgpyZXR1cm4gOTc8
+PXQmJnQ8PTEyMn0sCktEOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9IkludmFs
+aWQgTUlNRSB0eXBlIixrPUguVk0oW2ItMV0sdS50KQpmb3IodD1hLmxlbmd0aCxzPWIscj0tMSxxPW51
+bGw7czx0Oysrcyl7cT1DLnhCLlcoYSxzKQppZihxPT09NDR8fHE9PT01OSlicmVhawppZihxPT09NDcp
+e2lmKHI8MCl7cj1zCmNvbnRpbnVlfXRocm93IEguYihQLnJyKGwsYSxzKSl9fWlmKHI8MCYmcz5iKXRo
+cm93IEguYihQLnJyKGwsYSxzKSkKZm9yKDtxIT09NDQ7KXtDLk5tLmkoayxzKTsrK3MKZm9yKHA9LTE7
+czx0Oysrcyl7cT1DLnhCLlcoYSxzKQppZihxPT09NjEpe2lmKHA8MClwPXN9ZWxzZSBpZihxPT09NTl8
+fHE9PT00NClicmVha31pZihwPj0wKUMuTm0uaShrLHApCmVsc2V7bz1DLk5tLmdyWihrKQppZihxIT09
+NDR8fHMhPT1vKzd8fCFDLnhCLlFpKGEsImJhc2U2NCIsbysxKSl0aHJvdyBILmIoUC5ycigiRXhwZWN0
+aW5nICc9JyIsYSxzKSkKYnJlYWt9fUMuTm0uaShrLHMpCm49cysxCmlmKChrLmxlbmd0aCYxKT09PTEp
+YT1DLmg5LnlyKGEsbix0KQplbHNle209UC5VbChhLG4sdCxDLlZDLCEwKQppZihtIT1udWxsKWE9Qy54
+Qi5pNyhhLG4sdCxtKX1yZXR1cm4gbmV3IFAuUEUoYSxrLGMpfSwKS046ZnVuY3Rpb24oKXt2YXIgdD0i
+MDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4
+eXotLl9+ISQmJygpKissOz0iLHM9Ii4iLHI9IjoiLHE9Ii8iLHA9Ij8iLG89IiMiLG49dS5nYyxtPVAu
+ZEgoMjIsbmV3IFAucTMoKSwhMCxuKSxsPW5ldyBQLnlJKG0pLGs9bmV3IFAuYzYoKSxqPW5ldyBQLnFk
+KCksaT1uLmEobC4kMigwLDIyNSkpCmsuJDMoaSx0LDEpCmsuJDMoaSxzLDE0KQprLiQzKGksciwzNCkK
+ay4kMyhpLHEsMykKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5hKGwuJDIoMTQsMjI1KSkK
+ay4kMyhpLHQsMSkKay4kMyhpLHMsMTUpCmsuJDMoaSxyLDM0KQprLiQzKGkscSwyMzQpCmsuJDMoaSxw
+LDE3MikKay4kMyhpLG8sMjA1KQppPW4uYShsLiQyKDE1LDIyNSkpCmsuJDMoaSx0LDEpCmsuJDMoaSwi
+JSIsMjI1KQprLiQzKGksciwzNCkKay4kMyhpLHEsOSkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUp
+Cmk9bi5hKGwuJDIoMSwyMjUpKQprLiQzKGksdCwxKQprLiQzKGksciwzNCkKay4kMyhpLHEsMTApCmsu
+JDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYShsLiQyKDIsMjM1KSkKay4kMyhpLHQsMTM5KQpr
+LiQzKGkscSwxMzEpCmsuJDMoaSxzLDE0NikKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5h
+KGwuJDIoMywyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHEsNjgpCmsuJDMoaSxzLDE4KQprLiQzKGks
+cCwxNzIpCmsuJDMoaSxvLDIwNSkKaT1uLmEobC4kMig0LDIyOSkpCmsuJDMoaSx0LDUpCmouJDMoaSwi
+QVoiLDIyOSkKay4kMyhpLHIsMTAyKQprLiQzKGksIkAiLDY4KQprLiQzKGksIlsiLDIzMikKay4kMyhp
+LHEsMTM4KQprLiQzKGkscCwxNzIpCmsuJDMoaSxvLDIwNSkKaT1uLmEobC4kMig1LDIyOSkpCmsuJDMo
+aSx0LDUpCmouJDMoaSwiQVoiLDIyOSkKay4kMyhpLHIsMTAyKQprLiQzKGksIkAiLDY4KQprLiQzKGks
+cSwxMzgpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYShsLiQyKDYsMjMxKSkKai4kMyhp
+LCIxOSIsNykKay4kMyhpLCJAIiw2OCkKay4kMyhpLHEsMTM4KQprLiQzKGkscCwxNzIpCmsuJDMoaSxv
+LDIwNSkKaT1uLmEobC4kMig3LDIzMSkpCmouJDMoaSwiMDkiLDcpCmsuJDMoaSwiQCIsNjgpCmsuJDMo
+aSxxLDEzOCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmsuJDMobi5hKGwuJDIoOCw4KSksIl0i
+LDUpCmk9bi5hKGwuJDIoOSwyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHMsMTYpCmsuJDMoaSxxLDIz
+NCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5hKGwuJDIoMTYsMjM1KSkKay4kMyhpLHQs
+MTEpCmsuJDMoaSxzLDE3KQprLiQzKGkscSwyMzQpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQpp
+PW4uYShsLiQyKDE3LDIzNSkpCmsuJDMoaSx0LDExKQprLiQzKGkscSw5KQprLiQzKGkscCwxNzIpCmsu
+JDMoaSxvLDIwNSkKaT1uLmEobC4kMigxMCwyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHMsMTgpCmsu
+JDMoaSxxLDIzNCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5hKGwuJDIoMTgsMjM1KSkK
+ay4kMyhpLHQsMTEpCmsuJDMoaSxzLDE5KQprLiQzKGkscSwyMzQpCmsuJDMoaSxwLDE3MikKay4kMyhp
+LG8sMjA1KQppPW4uYShsLiQyKDE5LDIzNSkpCmsuJDMoaSx0LDExKQprLiQzKGkscSwyMzQpCmsuJDMo
+aSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYShsLiQyKDExLDIzNSkpCmsuJDMoaSx0LDExKQprLiQz
+KGkscSwxMCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5hKGwuJDIoMTIsMjM2KSkKay4k
+MyhpLHQsMTIpCmsuJDMoaSxwLDEyKQprLiQzKGksbywyMDUpCmk9bi5hKGwuJDIoMTMsMjM3KSkKay4k
+MyhpLHQsMTMpCmsuJDMoaSxwLDEzKQpqLiQzKG4uYShsLiQyKDIwLDI0NSkpLCJheiIsMjEpCmw9bi5h
+KGwuJDIoMjEsMjQ1KSkKai4kMyhsLCJheiIsMjEpCmouJDMobCwiMDkiLDIxKQprLiQzKGwsIistLiIs
+MjEpCnJldHVybiBtfSwKVUI6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIscSxwLG89JC52Wigp
+CmZvcih0PUouclkoYSkscz1iO3M8YzsrK3Mpe2lmKGQ8MHx8ZD49by5sZW5ndGgpcmV0dXJuIEguayhv
+LGQpCnI9b1tkXQpxPXQuVyhhLHMpXjk2CmlmKHE+OTUpcT0zMQppZihxPj1yLmxlbmd0aClyZXR1cm4g
+SC5rKHIscSkKcD1yW3FdCmQ9cCYzMQpDLk5tLlkoZSxwPj4+NSxzKX1yZXR1cm4gZH0sCldGOmZ1bmN0
+aW9uIFdGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAphMjpmdW5jdGlvbiBhMigpe30sCmlQOmZ1bmN0
+aW9uIGlQKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApDUDpmdW5jdGlvbiBDUCgpe30sClhTOmZ1bmN0
+aW9uIFhTKCl7fSwKQzY6ZnVuY3Rpb24gQzYoYSl7dGhpcy5hPWF9LApMSzpmdW5jdGlvbiBMSygpe30s
+CkFUOmZ1bmN0aW9uIEFUKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9
+LApiSjpmdW5jdGlvbiBiSihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmU9YQpfLmY9YgpfLmE9Ywpf
+LmI9ZApfLmM9ZQpfLmQ9Zn0sCmVZOmZ1bmN0aW9uIGVZKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmY9
+YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCm1wOmZ1bmN0aW9uIG1wKGEsYixjLGQpe3ZhciBfPXRo
+aXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAp1YjpmdW5jdGlvbiB1YihhKXt0aGlzLmE9YX0sCmRz
+OmZ1bmN0aW9uIGRzKGEpe3RoaXMuYT1hfSwKbGo6ZnVuY3Rpb24gbGooYSl7dGhpcy5hPWF9LApVVjpm
+dW5jdGlvbiBVVihhKXt0aGlzLmE9YX0sCms1OmZ1bmN0aW9uIGs1KCl7fSwKS1k6ZnVuY3Rpb24gS1ko
+KXt9LAp0NzpmdW5jdGlvbiB0NyhhKXt0aGlzLmE9YX0sCkNEOmZ1bmN0aW9uIENEKGEpe3RoaXMuYT1h
+fSwKYUU6ZnVuY3Rpb24gYUUoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKRUg6ZnVu
+Y3Rpb24gRUgoKXt9LApJZjpmdW5jdGlvbiBJZigpe30sCmNYOmZ1bmN0aW9uIGNYKCl7fSwKQW46ZnVu
+Y3Rpb24gQW4oKXt9LAp6TTpmdW5jdGlvbiB6TSgpe30sClowOmZ1bmN0aW9uIFowKCl7fSwKTjM6ZnVu
+Y3Rpb24gTjMoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LApjODpmdW5jdGlvbiBj
+OCgpe30sCmxmOmZ1bmN0aW9uIGxmKCl7fSwKTWg6ZnVuY3Rpb24gTWgoKXt9LApPZDpmdW5jdGlvbiBP
+ZCgpe30sCmliOmZ1bmN0aW9uIGliKCl7fSwKeHU6ZnVuY3Rpb24geHUoKXt9LApHejpmdW5jdGlvbiBH
+eigpe30sClpkOmZ1bmN0aW9uIFpkKCl7fSwKcVU6ZnVuY3Rpb24gcVUoKXt9LApSbjpmdW5jdGlvbiBS
+bihhKXt0aGlzLmE9YX0sCkdEOmZ1bmN0aW9uIEdEKCl7fSwKbjE6ZnVuY3Rpb24gbjEoYSl7dGhpcy5h
+PWF9LApjUzpmdW5jdGlvbiBjUyhhKXt0aGlzLmE9YX0sClZDOmZ1bmN0aW9uIFZDKGEpe3RoaXMuYT1h
+fSwKSlQ6ZnVuY3Rpb24gSlQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkRuOmZ1bmN0aW9uIERuKGEs
+YixjLGQsZSxmLGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYK
+Xy5yPWcKXy5RPV8uej1fLnk9Xy54PW51bGx9LApSWjpmdW5jdGlvbiBSWigpe30sCk1FOmZ1bmN0aW9u
+IE1FKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp5NTpmdW5jdGlvbiB5NShhKXt0aGlzLmE9YX0sClBF
+OmZ1bmN0aW9uIFBFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnEzOmZ1bmN0aW9u
+IHEzKCl7fSwKeUk6ZnVuY3Rpb24geUkoYSl7dGhpcy5hPWF9LApjNjpmdW5jdGlvbiBjNigpe30sCnFk
+OmZ1bmN0aW9uIHFkKCl7fSwKVWY6ZnVuY3Rpb24gVWYoYSxiLGMsZCxlLGYsZyxoKXt2YXIgXz10aGlz
+Cl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8ucj1nCl8ueD1oCl8ueT1udWxsfSwK
+cWU6ZnVuY3Rpb24gcWUoYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9Ywpf
+LmQ9ZApfLmU9ZQpfLmY9ZgpfLnI9ZwpfLlE9Xy56PV8ueT1fLng9bnVsbH0sCmlKOmZ1bmN0aW9uIGlK
+KCl7fSwKamc6ZnVuY3Rpb24gamcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClRhOmZ1bmN0aW9uIFRh
+KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApCZjpmdW5jdGlvbiBCZihhLGIpe3RoaXMuYT1hCnRoaXMu
+Yj1ifSwKQXM6ZnVuY3Rpb24gQXMoKXt9LApHRTpmdW5jdGlvbiBHRShhKXt0aGlzLmE9YX0sCk43OmZ1
+bmN0aW9uIE43KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp1UTpmdW5jdGlvbiB1USgpe30sCmhGOmZ1
+bmN0aW9uIGhGKCl7fSwKUjQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyCkguRTkoYikKdS5qLmEo
+ZCkKaWYoSC5vVChiKSl7dD1bY10KQy5ObS5GVih0LGQpCmQ9dH1zPXUuegpyPVAuQ0goSi5NMShkLFAu
+dzAoKSxzKSwhMCxzKQp1LlouYShhKQpyZXR1cm4gUC53WShILkVrKGEscixudWxsKSl9LApEbTpmdW5j
+dGlvbihhLGIsYyl7dmFyIHQKdHJ5e2lmKE9iamVjdC5pc0V4dGVuc2libGUoYSkmJiFPYmplY3QucHJv
+dG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxiKSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7
+dmFsdWU6Y30pCnJldHVybiEwfX1jYXRjaCh0KXtILlJ1KHQpfXJldHVybiExfSwKT206ZnVuY3Rpb24o
+YSxiKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxiKSlyZXR1cm4gYVti
+XQpyZXR1cm4gbnVsbH0sCndZOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGx8fHR5cGVvZiBhPT0ic3RyaW5n
+Inx8dHlwZW9mIGE9PSJudW1iZXIifHxILnJRKGEpKXJldHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQLkU0
+KXJldHVybiBhLmEKaWYoSC5SOShhKSlyZXR1cm4gYQppZih1LncuYihhKSlyZXR1cm4gYQppZihhIGlu
+c3RhbmNlb2YgUC5pUClyZXR1cm4gSC5vMihhKQppZih1LlouYihhKSlyZXR1cm4gUC5oRShhLCIkZGFy
+dF9qc0Z1bmN0aW9uIixuZXcgUC5QQygpKQpyZXR1cm4gUC5oRShhLCJfJGRhcnRfanNPYmplY3QiLG5l
+dyBQLm10KCQua0koKSkpfSwKaEU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PVAuT20oYSxiKQppZih0PT1u
+dWxsKXt0PWMuJDEoYSkKUC5EbShhLGIsdCl9cmV0dXJuIHR9LApMNzpmdW5jdGlvbihhKXt2YXIgdCxz
+CmlmKGE9PW51bGx8fHR5cGVvZiBhPT0ic3RyaW5nInx8dHlwZW9mIGE9PSJudW1iZXIifHx0eXBlb2Yg
+YT09ImJvb2xlYW4iKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCYmSC5SOShhKSly
+ZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmplY3QmJnUudy5iKGEpKXJldHVybiBhCmVsc2Ug
+aWYoYSBpbnN0YW5jZW9mIERhdGUpe3Q9SC5XWShhLmdldFRpbWUoKSkKaWYoTWF0aC5hYnModCk8PTg2
+NGUxMylzPSExCmVsc2Ugcz0hMAppZihzKUgudmgoUC54WSgiRGF0ZVRpbWUgaXMgb3V0c2lkZSB2YWxp
+ZCByYW5nZTogIit0KSkKUC5VSSghMSwiaXNVdGMiLHUueSkKcmV0dXJuIG5ldyBQLmlQKHQsITEpfWVs
+c2UgaWYoYS5jb25zdHJ1Y3Rvcj09PSQua0koKSlyZXR1cm4gYS5vCmVsc2UgcmV0dXJuIFAuTkQoYSl9
+LApORDpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gUC5pUShhLCQud1Eo
+KSxuZXcgUC5OeigpKQppZihhIGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIFAuaVEoYSwkLkNyKCksbmV3
+IFAuUVMoKSkKcmV0dXJuIFAuaVEoYSwkLkNyKCksbmV3IFAubnAoKSl9LAppUTpmdW5jdGlvbihhLGIs
+Yyl7dmFyIHQ9UC5PbShhLGIpCmlmKHQ9PW51bGx8fCEoYSBpbnN0YW5jZW9mIE9iamVjdCkpe3Q9Yy4k
+MShhKQpQLkRtKGEsYix0KX1yZXR1cm4gdH0sClBDOmZ1bmN0aW9uIFBDKCl7fSwKbXQ6ZnVuY3Rpb24g
+bXQoYSl7dGhpcy5hPWF9LApOejpmdW5jdGlvbiBOeigpe30sClFTOmZ1bmN0aW9uIFFTKCl7fSwKbnA6
+ZnVuY3Rpb24gbnAoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlzLmE9YX0sCnI3OmZ1bmN0aW9uIHI3
+KGEpe3RoaXMuYT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKY286
+ZnVuY3Rpb24gY28oKXt9LApiQjpmdW5jdGlvbiBiQigpe30sCktlOmZ1bmN0aW9uIEtlKGEpe3RoaXMu
+YT1hfSwKZDU6ZnVuY3Rpb24gZDUoKXt9LApuNjpmdW5jdGlvbiBuNigpe319LFc9ewp4MzpmdW5jdGlv
+bigpe3JldHVybiB3aW5kb3d9LApacjpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudH0sCko2OmZ1bmN0
+aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCnJldHVybiB0fSwKVTk6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0LHM9ZG9jdW1lbnQuYm9keQpzLnRvU3RyaW5nCnQ9Qy5SWS5yNihzLGEsYixj
+KQp0LnRvU3RyaW5nCnM9dS5hYwpzPW5ldyBILlU1KG5ldyBXLmU3KHQpLHMuQygiYTIobEQuRSkiKS5h
+KG5ldyBXLkN2KCkpLHMuQygiVTU8bEQuRT4iKSkKcmV0dXJuIHUuaC5hKHMuZ3I4KHMpKX0sCnJTOmZ1
+bmN0aW9uKGEpe3ZhciB0LHMscj0iZWxlbWVudCB0YWcgdW5hdmFpbGFibGUiCnRyeXt0PUouUkUoYSkK
+aWYodHlwZW9mIHQuZ25zKGEpPT0ic3RyaW5nIilyPXQuZ25zKGEpfWNhdGNoKHMpe0guUnUocyl9cmV0
+dXJuIHJ9LApxRDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxPW5ldyBQLnZzKCQuWDMsdS5ZKSxwPW5l
+dyBQLlpmKHEsdS5FKSxvPW5ldyBYTUxIdHRwUmVxdWVzdCgpCkMuRHQuZW8obywiR0VUIixhLCEwKQpi
+LksoMCxuZXcgVy5iVShvKSkKdD11LmFuCnM9dC5hKG5ldyBXLmhIKG8scCkpCnUuTS5hKG51bGwpCnI9
+dS5wClcuSkUobywibG9hZCIscywhMSxyKQpXLkpFKG8sImVycm9yIix0LmEocC5nWUooKSksITEscikK
+by5zZW5kKCkKcmV0dXJuIHF9LApDMDpmdW5jdGlvbihhLGIpe2E9NTM2ODcwOTExJmErYgphPTUzNjg3
+MDkxMSZhKygoNTI0Mjg3JmEpPDwxMCkKcmV0dXJuIGFeYT4+PjZ9LApyRTpmdW5jdGlvbihhLGIsYyxk
+KXt2YXIgdD1XLkMwKFcuQzAoVy5DMChXLkMwKDAsYSksYiksYyksZCkscz01MzY4NzA5MTEmdCsoKDY3
+MTA4ODYzJnQpPDwzKQpzXj1zPj4+MTEKcmV0dXJuIDUzNjg3MDkxMSZzKygoMTYzODMmcyk8PDE1KX0s
+ClROOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPWEuY2xhc3NMaXN0CmZvcih0PWIubGVuZ3RoLHM9MDtz
+PGIubGVuZ3RoO2IubGVuZ3RoPT09dHx8KDAsSC5saykoYiksKytzKXIuYWRkKGJbc10pfSwKSkU6ZnVu
+Y3Rpb24oYSxiLGMsZCxlKXt2YXIgdD1XLmFGKG5ldyBXLnZOKGMpLHUuQikKaWYodCE9bnVsbCYmITAp
+Si5kWihhLGIsdCwhMSkKcmV0dXJuIG5ldyBXLnhDKGEsYix0LCExLGUuQygieEM8MD4iKSl9LApUdzpm
+dW5jdGlvbihhKXt2YXIgdD1XLko2KCkscz13aW5kb3cubG9jYXRpb24KdD1uZXcgVy5KUShuZXcgVy5t
+ayh0LHMpKQp0LkNZKGEpCnJldHVybiB0fSwKeVc6ZnVuY3Rpb24oYSxiLGMsZCl7dS5oLmEoYSkKSC5j
+KGIpCkguYyhjKQp1LmNyLmEoZCkKcmV0dXJuITB9LApRVzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxz
+LHIKdS5oLmEoYSkKSC5jKGIpCkguYyhjKQp0PXUuY3IuYShkKS5hCnM9dC5hCnMuaHJlZj1jCnI9cy5o
+b3N0bmFtZQp0PXQuYgppZighKHI9PXQuaG9zdG5hbWUmJnMucG9ydD09dC5wb3J0JiZzLnByb3RvY29s
+PT10LnByb3RvY29sKSlpZihyPT09IiIpaWYocy5wb3J0PT09IiIpe3Q9cy5wcm90b2NvbAp0PXQ9PT0i
+OiJ8fHQ9PT0iIn1lbHNlIHQ9ITEKZWxzZSB0PSExCmVsc2UgdD0hMApyZXR1cm4gdH0sCkJsOmZ1bmN0
+aW9uKCl7dmFyIHQ9dS5OLHM9UC50TShDLlF4LHQpLHI9dS5kRy5hKG5ldyBXLklBKCkpLHE9SC5WTShb
+IlRFTVBMQVRFIl0sdS5zKQp0PW5ldyBXLmN0KHMsUC5Mcyh0KSxQLkxzKHQpLFAuTHModCksbnVsbCkK
+dC5DWShudWxsLG5ldyBILmxKKEMuUXgscix1LmR2KSxxLG51bGwpCnJldHVybiB0fSwKUHY6ZnVuY3Rp
+b24oYSl7aWYoYT09bnVsbClyZXR1cm4gbnVsbApyZXR1cm4gVy5QMShhKX0sCnFjOmZ1bmN0aW9uKGEp
+e3ZhciB0CmlmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYoInBvc3RNZXNzYWdlIiBpbiBhKXt0PVcuUDEo
+YSkKaWYodS51LmIodCkpcmV0dXJuIHQKcmV0dXJuIG51bGx9ZWxzZSByZXR1cm4gdS51LmEoYSl9LApQ
+MTpmdW5jdGlvbihhKXtpZihhPT09d2luZG93KXJldHVybiB1LmNpLmEoYSkKZWxzZSByZXR1cm4gbmV3
+IFcuZFcoYSl9LApISDpmdW5jdGlvbihhKXtpZihhPT09d2luZG93LmxvY2F0aW9uKXJldHVybiBhCmVs
+c2UgcmV0dXJuIG5ldyBXLkZiKCl9LAphRjpmdW5jdGlvbihhLGIpe3ZhciB0PSQuWDMKaWYodD09PUMu
+TlUpcmV0dXJuIGEKcmV0dXJuIHQuUHkoYSxiKX0sCnFFOmZ1bmN0aW9uIHFFKCl7fSwKR2g6ZnVuY3Rp
+b24gR2goKXt9LApmWTpmdW5jdGlvbiBmWSgpe30sCm5COmZ1bmN0aW9uIG5CKCl7fSwKQXo6ZnVuY3Rp
+b24gQXooKXt9LApRUDpmdW5jdGlvbiBRUCgpe30sCm54OmZ1bmN0aW9uIG54KCl7fSwKb0o6ZnVuY3Rp
+b24gb0ooKXt9LAppZDpmdW5jdGlvbiBpZCgpe30sClFGOmZ1bmN0aW9uIFFGKCl7fSwKTmg6ZnVuY3Rp
+b24gTmgoKXt9LApJQjpmdW5jdGlvbiBJQigpe30sCm43OmZ1bmN0aW9uIG43KCl7fSwKd3o6ZnVuY3Rp
+b24gd3ooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKY3Y6ZnVuY3Rpb24gY3YoKXt9LApDdjpmdW5j
+dGlvbiBDdigpe30sCmVhOmZ1bmN0aW9uIGVhKCl7fSwKRDA6ZnVuY3Rpb24gRDAoKXt9LApUNTpmdW5j
+dGlvbiBUNSgpe30sCmg0OmZ1bmN0aW9uIGg0KCl7fSwKYnI6ZnVuY3Rpb24gYnIoKXt9LApWYjpmdW5j
+dGlvbiBWYigpe30sCmZKOmZ1bmN0aW9uIGZKKCl7fSwKYlU6ZnVuY3Rpb24gYlUoYSl7dGhpcy5hPWF9
+LApoSDpmdW5jdGlvbiBoSChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKd2E6ZnVuY3Rpb24gd2EoKXt9
+LApTZzpmdW5jdGlvbiBTZygpe30sCnU4OmZ1bmN0aW9uIHU4KCl7fSwKT0s6ZnVuY3Rpb24gT0soKXt9
+LAplNzpmdW5jdGlvbiBlNyhhKXt0aGlzLmE9YX0sCnVIOmZ1bmN0aW9uIHVIKCl7fSwKQkg6ZnVuY3Rp
+b24gQkgoKXt9LApTTjpmdW5jdGlvbiBTTigpe30sCmV3OmZ1bmN0aW9uIGV3KCl7fSwKbHA6ZnVuY3Rp
+b24gbHAoKXt9LApUYjpmdW5jdGlvbiBUYigpe30sCkl2OmZ1bmN0aW9uIEl2KCl7fSwKV1A6ZnVuY3Rp
+b24gV1AoKXt9LAp5WTpmdW5jdGlvbiB5WSgpe30sCnc2OmZ1bmN0aW9uIHc2KCl7fSwKSzU6ZnVuY3Rp
+b24gSzUoKXt9LApDbTpmdW5jdGlvbiBDbSgpe30sCkNROmZ1bmN0aW9uIENRKCl7fSwKdzQ6ZnVuY3Rp
+b24gdzQoKXt9LApyaDpmdW5jdGlvbiByaCgpe30sCmNmOmZ1bmN0aW9uIGNmKCl7fSwKaTc6ZnVuY3Rp
+b24gaTcoYSl7dGhpcy5hPWF9LApTeTpmdW5jdGlvbiBTeShhKXt0aGlzLmE9YX0sCktTOmZ1bmN0aW9u
+IEtTKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBMzpmdW5jdGlvbiBBMyhhLGIpe3RoaXMuYT1hCnRo
+aXMuYj1ifSwKSTQ6ZnVuY3Rpb24gSTQoYSl7dGhpcy5hPWF9LApGazpmdW5jdGlvbiBGayhhLGIpe3Ro
+aXMuYT1hCnRoaXMuJHRpPWJ9LApSTzpmdW5jdGlvbiBSTyhhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1h
+Cl8uYj1iCl8uYz1jCl8uJHRpPWR9LApldTpmdW5jdGlvbiBldShhLGIsYyxkKXt2YXIgXz10aGlzCl8u
+YT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LAp4QzpmdW5jdGlvbiB4QyhhLGIsYyxkLGUpe3ZhciBfPXRo
+aXMKXy5iPWEKXy5jPWIKXy5kPWMKXy5lPWQKXy4kdGk9ZX0sCnZOOmZ1bmN0aW9uIHZOKGEpe3RoaXMu
+YT1hfSwKSlE6ZnVuY3Rpb24gSlEoYSl7dGhpcy5hPWF9LApHbTpmdW5jdGlvbiBHbSgpe30sCnZEOmZ1
+bmN0aW9uIHZEKGEpe3RoaXMuYT1hfSwKVXY6ZnVuY3Rpb24gVXYoYSl7dGhpcy5hPWF9LApFZzpmdW5j
+dGlvbiBFZyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAptNjpmdW5jdGlvbiBtNigp
+e30sCkVvOmZ1bmN0aW9uIEVvKCl7fSwKV2s6ZnVuY3Rpb24gV2soKXt9LApjdDpmdW5jdGlvbiBjdChh
+LGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5lPWEKXy5hPWIKXy5iPWMKXy5jPWQKXy5kPWV9LApJQTpmdW5j
+dGlvbiBJQSgpe30sCk93OmZ1bmN0aW9uIE93KCl7fSwKVzk6ZnVuY3Rpb24gVzkoYSxiLGMpe3ZhciBf
+PXRoaXMKXy5hPWEKXy5iPWIKXy5jPS0xCl8uZD1udWxsCl8uJHRpPWN9LApkVzpmdW5jdGlvbiBkVyhh
+KXt0aGlzLmE9YX0sCkZiOmZ1bmN0aW9uIEZiKCl7fSwKa0Y6ZnVuY3Rpb24ga0YoKXt9LAptazpmdW5j
+dGlvbiBtayhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24gS28oYSl7dGhpcy5hPWEK
+dGhpcy5iPSExfSwKZm06ZnVuY3Rpb24gZm0oYSl7dGhpcy5hPWF9LApMZTpmdW5jdGlvbiBMZSgpe30s
+Cks3OmZ1bmN0aW9uIEs3KCl7fSwKckI6ZnVuY3Rpb24gckIoKXt9LApYVzpmdW5jdGlvbiBYVygpe30s
+Cm9hOmZ1bmN0aW9uIG9hKCl7fX0sVT17CmpmOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxCmlmKGE9PW51
+bGwpdD1udWxsCmVsc2V7dD1ILlZNKFtdLHUuZkEpCmZvcihzPUouSVQodS5SLmEoYSkpO3MuRigpOyl7
+cj1zLmdsKCkKcT1KLlU2KHIpCkMuTm0uaSh0LG5ldyBVLlNlKEguYyhxLnEociwiZGVzY3JpcHRpb24i
+KSksSC5jKHEucShyLCJocmVmIikpKSl9fXJldHVybiB0fSwKTmQ6ZnVuY3Rpb24oYSl7dmFyIHQscwpp
+ZihhPT1udWxsKXQ9bnVsbAplbHNle3Q9SC5WTShbXSx1LmhoKQpmb3Iocz1KLklUKHUuUi5hKGEpKTtz
+LkYoKTspQy5ObS5pKHQsVS5KaihzLmdsKCkpKX1yZXR1cm4gdH0sCkpqOmZ1bmN0aW9uKGEpe3ZhciB0
+LHMscixxLHAsbz0iZGVzY3JpcHRpb24iLG49Si5VNihhKSxtPUguYyhuLnEoYSxvKSksbD1ILlZNKFtd
+LHUuYUopCmZvcihuPUouSVQodS5SLmEobi5xKGEsImVudHJpZXMiKSkpO24uRigpOyl7dD1uLmdsKCkK
+cz1KLlU2KHQpCnI9SC5jKHMucSh0LG8pKQpxPUguYyhzLnEodCwiZnVuY3Rpb24iKSkKcz1zLnEodCwi
+bGluayIpCmlmKHM9PW51bGwpcz1udWxsCmVsc2V7cD1KLlU2KHMpCnM9bmV3IFUuTWwoSC5jKHAucShz
+LCJocmVmIikpLEguV1kocC5xKHMsImxpbmUiKSksSC5jKHAucShzLCJwYXRoIikpKX1DLk5tLmkobCxu
+ZXcgVS53YihyLHEscykpfXJldHVybiBuZXcgVS55RChtLGwpfSwKZDI6ZnVuY3Rpb24gZDIoYSxiLGMs
+ZCxlKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lfSwKU2U6ZnVuY3Rpb24g
+U2UoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk1sOmZ1bmN0aW9uIE1sKGEsYixjKXt0aGlzLmE9YQp0
+aGlzLmI9Ygp0aGlzLmM9Y30sCnlEOmZ1bmN0aW9uIHlEKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp3
+YjpmdW5jdGlvbiB3YihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9fSxCPXsKWWY6ZnVu
+Y3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxsPUguYyhhLnEoMCwicmVnaW9ucyIpKSxrPUguYyhh
+LnEoMCwibmF2aWdhdGlvbkNvbnRlbnQiKSksaj1ILmMoYS5xKDAsInNvdXJjZUNvZGUiKSksaT1QLkZs
+KHUuTix1LmY0KQpmb3IodD11LlMuYShhLnEoMCwiZWRpdHMiKSksdD10LmdQdSh0KSx0PXQuZ2t6KHQp
+LHM9dS5SLHI9dS5naTt0LkYoKTspe3E9dC5nbCgpCnA9cS5hCm89SC5WTShbXSxyKQpmb3IocT1KLklU
+KHMuYShxLmIpKTtxLkYoKTspe249cS5nbCgpCm09Si5VNihuKQpDLk5tLmkobyxuZXcgQi5qOChILldZ
+KG0ucShuLCJsaW5lIikpLEguYyhtLnEobiwiZXhwbGFuYXRpb24iKSksSC5XWShtLnEobiwib2Zmc2V0
+IikpKSl9aS5ZKDAscCxvKX1yZXR1cm4gbmV3IEIucXAobCxrLGosaSl9LApqODpmdW5jdGlvbiBqOChh
+LGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApxcDpmdW5jdGlvbiBxcChhLGIsYyxkKXt2
+YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKZnY6ZnVuY3Rpb24gZnYoKXt9LApPUzpm
+dW5jdGlvbihhKXt2YXIgdAppZighKGE+PTY1JiZhPD05MCkpdD1hPj05NyYmYTw9MTIyCmVsc2UgdD0h
+MApyZXR1cm4gdH0sCll1OmZ1bmN0aW9uKGEsYil7dmFyIHQ9YS5sZW5ndGgscz1iKzIKaWYodDxzKXJl
+dHVybiExCmlmKCFCLk9TKEMueEIubShhLGIpKSlyZXR1cm4hMQppZihDLnhCLm0oYSxiKzEpIT09NTgp
+cmV0dXJuITEKaWYodD09PXMpcmV0dXJuITAKcmV0dXJuIEMueEIubShhLHMpPT09NDd9fSxUPXttUTpm
+dW5jdGlvbiBtUSgpe319LEw9ewpJcTpmdW5jdGlvbigpe0MuQlouQihkb2N1bWVudCwiRE9NQ29udGVu
+dExvYWRlZCIsbmV3IEwuZSgpKQpDLm9sLkIod2luZG93LCJwb3BzdGF0ZSIsbmV3IEwuTCgpKX0sCmt6
+OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dS5oLmEoYS5wYXJlbnROb2RlKS5xdWVyeVNlbGVjdG9yKCI6c2Nv
+cGUgPiB1bCIpLHI9cy5zdHlsZSxxPSIiK0MuQ0QuelEocy5vZmZzZXRIZWlnaHQpKjIrInB4IgpyLm1h
+eEhlaWdodD1xCnI9Si5xRihhKQpxPXIuJHRpCnQ9cS5DKCJ+KDEpIikuYShuZXcgTC5XeChzLGEpKQp1
+Lk0uYShudWxsKQpXLkpFKHIuYSxyLmIsdCwhMSxxLmMpfSwKeVg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
+LHIscSxwLG89InF1ZXJ5U2VsZWN0b3JBbGwiLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhKSxtPXUu
+aApuLnRvU3RyaW5nCkguRGgobSxtLCJUIixvKQp0PXUuVApzPW5ldyBXLnd6KG4ucXVlcnlTZWxlY3Rv
+ckFsbCgiLm5hdi1saW5rIiksdCkKcy5LKHMsbmV3IEwuQU8oYikpCkguRGgobSxtLCJUIixvKQpyPW5l
+dyBXLnd6KG4ucXVlcnlTZWxlY3RvckFsbCgiLnJlZ2lvbiIpLHQpCmlmKHIuZ0EocikhPT0wKXtxPW4u
+cXVlcnlTZWxlY3RvcigidGFibGVbZGF0YS1wYXRoXSIpCnEudG9TdHJpbmcKci5LKHIsbmV3IEwuSG8o
+cS5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhxKSkuTygicGF0aCIpKSkpfUgu
+RGgobSxtLCJUIixvKQpwPW5ldyBXLnd6KG4ucXVlcnlTZWxlY3RvckFsbCgiLmFkZC1oaW50LWxpbmsi
+KSx0KQpwLksocCxuZXcgTC5JQygpKX0sClE2OmZ1bmN0aW9uKGEsYil7dmFyIHQ9dS5OCnJldHVybiBX
+LnFEKEwuUTQoYSxiKSxQLkVGKFsiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNl
+dD1VVEYtOCJdLHQsdCkpfSwKdHk6ZnVuY3Rpb24oYSl7dmFyIHQ9MCxzPVAuRlgodS5TKSxyLHEscCxv
+LG4sbSxsLGsKdmFyICRhc3luYyR0eT1QLmx6KGZ1bmN0aW9uKGIsYyl7aWYoYj09PTEpcmV0dXJuIFAu
+ZjMoYyxzKQp3aGlsZSh0cnVlKXN3aXRjaCh0KXtjYXNlIDA6bj1uZXcgUC52cygkLlgzLHUuWSkKbT1u
+ZXcgUC5aZihuLHUuRSkKbD1uZXcgWE1MSHR0cFJlcXVlc3QoKQprPXUuTgpDLkR0LmVvKGwsIlBPU1Qi
+LEwuUTQoYSxQLkZsKGssaykpLCEwKQpsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsImFw
+cGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiKQprPXUuYW4KcT1rLmEobmV3IEwuTDEobSxsKSkK
+dS5NLmEobnVsbCkKcD11LnAKVy5KRShsLCJsb2FkIixxLCExLHApClcuSkUobCwiZXJyb3IiLGsuYSht
+LmdZSigpKSwhMSxwKQpsLnNlbmQoKQp0PTMKcmV0dXJuIFAualEobiwkYXN5bmMkdHkpCmNhc2UgMzpv
+PUMuQ3QucFcoMCxsLnJlc3BvbnNlVGV4dCxudWxsKQppZihsLnN0YXR1cz09PTIwMCl7cj11LlMuYShv
+KQp0PTEKYnJlYWt9ZWxzZSB0aHJvdyBILmIobykKY2FzZSAxOnJldHVybiBQLnlDKHIscyl9fSkKcmV0
+dXJuIFAuREkoJGFzeW5jJHR5LHMpfSwKYUs6ZnVuY3Rpb24oYSl7dmFyIHQ9UC5oSyhhKS5naFkoKS5x
+KDAsImxpbmUiKQpyZXR1cm4gdD09bnVsbD9udWxsOkguSHAodCxudWxsKX0sCkc2OmZ1bmN0aW9uKGEp
+e3ZhciB0PVAuaEsoYSkuZ2hZKCkucSgwLCJvZmZzZXQiKQpyZXR1cm4gdD09bnVsbD9udWxsOkguSHAo
+dCxudWxsKX0sCmk2OmZ1bmN0aW9uKGEpe3JldHVybiBMLm5XKHUuVi5hKGEpKX0sCm5XOmZ1bmN0aW9u
+KGEpe3ZhciB0PTAscz1QLkZYKHUueikscj0xLHEscD1bXSxvLG4sbSxsLGsKdmFyICRhc3luYyRpNj1Q
+Lmx6KGZ1bmN0aW9uKGIsYyl7aWYoYj09PTEpe3E9Ywp0PXJ9d2hpbGUodHJ1ZSlzd2l0Y2godCl7Y2Fz
+ZSAwOmw9dS5oLmEoVy5xYyhhLmN1cnJlbnRUYXJnZXQpKS5nZXRBdHRyaWJ1dGUoImhyZWYiKQphLnBy
+ZXZlbnREZWZhdWx0KCkKcj0zCnQ9NgpyZXR1cm4gUC5qUShMLnR5KGwpLCRhc3luYyRpNikKY2FzZSA2
+OnUuYV8uYShKLkdyKFcuUHYoZG9jdW1lbnQuZGVmYXVsdFZpZXcpKSkucmVsb2FkKCkKcj0xCnQ9NQpi
+cmVhawpjYXNlIDM6cj0yCms9cQpvPUguUnUoaykKbj1ILnRzKGspCkwuQzIoIkNvdWxkIG5vdCBhZGQv
+cmVtb3ZlIGhpbnQiLG8sbikKdD01CmJyZWFrCmNhc2UgMjp0PTEKYnJlYWsKY2FzZSA1OnJldHVybiBQ
+LnlDKG51bGwscykKY2FzZSAxOnJldHVybiBQLmYzKHEscyl9fSkKcmV0dXJuIFAuREkoJGFzeW5jJGk2
+LHMpfSwKQzI6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscj0iZXhjZXB0aW9uIixxPSJzdGFja1RyYWNl
+IixwPXUuUy5iKGIpJiZKLlJNKGIucSgwLCJzdWNjZXNzIiksITEpJiZILm9UKGIueDQocikpJiZILm9U
+KGIueDQocSkpLG89Si5pYShiKQppZihwKXt0PUguYyhvLnEoYixyKSkKYz1vLnEoYixxKX1lbHNlIHQ9
+by5aKGIpCnM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBvcHVwLXBhbmUiKQpzLnF1ZXJ5U2VsZWN0
+b3IoImgyIikuaW5uZXJUZXh0PWEKcy5xdWVyeVNlbGVjdG9yKCJwIikuaW5uZXJUZXh0PXQKcy5xdWVy
+eVNlbGVjdG9yKCJwcmUiKS5pbm5lclRleHQ9Si5BYyhjKQpwPXUuTgp1LmJxLmEocy5xdWVyeVNlbGVj
+dG9yKCJhLmJvdHRvbSIpKS5ocmVmPVAuWGQoImh0dHBzIiwiZ2l0aHViLmNvbSIsImRhcnQtbGFuZy9z
+ZGsvaXNzdWVzL25ldyIsUC5FRihbInRpdGxlIiwiSXNzdWUgd2l0aCBOTkJEIG1pZ3JhdGlvbiB0b29s
+OiAiK2EsImxhYmVscyIsImFyZWEtYW5hbHl6ZXIsYW5hbHl6ZXItbm5iZC1taWdyYXRpb24sdHlwZS1i
+dWciLCJib2R5IixhKyJcblxuRXJyb3I6ICIrSC5kKHQpKyJcblxuUGxlYXNlIGZpbGwgaW4gdGhlIGZv
+bGxvd2luZzpcblxuKipOYW1lIG9mIHBhY2thZ2UgYmVpbmcgbWlncmF0ZWQgKGlmIHB1YmxpYykqKjpc
+bioqV2hhdCBJIHdhcyBkb2luZyB3aGVuIHRoaXMgaXNzdWUgb2NjdXJyZWQqKjpcbioqSXMgaXQgcG9z
+c2libGUgdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSoqOlxuKipIYXMgdGhpcyBpc3N1ZSBoYXBwZW5l
+ZCBiZWZvcmUsIGFuZCBpZiBzbywgaG93IG9mdGVuKio6XG4qKkRhcnQgU0RLIHZlcnNpb24qKjogKHZp
+c2libGUgaW4gbG93ZXIgbGVmdCBvZiBtaWdyYXRpb24gcHJldmlldylcbioqQWRkaXRpb25hbCBkZXRh
+aWxzKio6XG5cblRoYW5rcyBmb3IgZmlsaW5nIVxuXG5TdGFja3RyYWNlOiBfYXV0byBwb3B1bGF0ZWQg
+YnkgbWlncmF0aW9uIHByZXZpZXcgdG9vbC5fXG5cbmBgYFxuIitILmQoYykrIlxuYGBgXG4iXSxwLHAp
+KS5nbkQoKQpwPXMuc3R5bGUKcC5kaXNwbGF5PSJpbml0aWFsIgpMLnFKKCJoYW5kbGVQb3N0TGlua0Ns
+aWNrOiAiK0guZChiKSxjKX0sCnQyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbj17fSxt
+PXUuaC5hKFcucWMoYS5jdXJyZW50VGFyZ2V0KSkKYS5wcmV2ZW50RGVmYXVsdCgpCnQ9bi5hPW0uZ2V0
+QXR0cmlidXRlKCJocmVmIikKaWYoSi56bCh0LCI/Iikpe3M9Qy54Qi5Oaih0LDAsQy54Qi5PWSh0LCI/
+IikpCm4uYT1zCnI9c31lbHNlIHI9dAppZihjIT1udWxsKXtxPSQublUoKQpyPW4uYT1xLm81KEQubnIo
+cS50TShjKSxyKSl9cD1MLkc2KHQpCm89TC5hSyh0KQppZihwIT1udWxsKUwuYWYocixwLG8sYixuZXcg
+TC5uVChuLHAsbykpCmVsc2UgTC5hZihyLG51bGwsbnVsbCxiLG5ldyBMLk5ZKG4pKX0sCnZVOmZ1bmN0
+aW9uKCl7dmFyIHQ9ZG9jdW1lbnQscz11LmgKSC5EaChzLHMsIlQiLCJxdWVyeVNlbGVjdG9yQWxsIikK
+dD1uZXcgVy53eih0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jb2RlIiksdS5UKQp0LksodCxuZXcgTC5HSCgp
+KX0sCmhYOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD11Lk4KTC5RNihhLFAuRUYoWyJyZWdpb24iLCJyZWdp
+b24iLCJvZmZzZXQiLEguZChiKV0sdCx0KSkuVzcobmV3IEwuRFQoYSxiLGMpLHUuUCkuT0EobmV3IEwu
+ZUgoYSkpfSwKRzc6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdAppZighSi5wNChhLCIuZGFydCIpKXtM
+LkJFKGEsbmV3IEIucXAoIiIsIiIsIiIsQy5DTSksZCkKTC5CWChhLG51bGwpCmlmKGUhPW51bGwpZS4k
+MCgpCnJldHVybn10PXUuTgpMLlE2KGEsUC5FRihbImlubGluZSIsInRydWUiXSx0LHQpKS5XNyhuZXcg
+TC55dShhLGQsYixjLGUpLHUuUCkuT0EobmV3IEwuekQoYSkpfSwKR2U6ZnVuY3Rpb24oKXt2YXIgdD0i
+L19wcmV2aWV3L25hdmlnYXRpb25UcmVlLmpzb24iCkwuUTYodCxDLldPKS5XNyhuZXcgTC5UVygpLHUu
+UCkuT0EobmV3IEwueHIodCkpfSwKcUo6ZnVuY3Rpb24oYSxiKXt2YXIgdAp3aW5kb3cKaWYodHlwZW9m
+IGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKGEpCndpbmRvdwp0PUguZChi
+KQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUuZXJyb3IodCl9LApx
+TzpmdW5jdGlvbihhKXt2YXIgdCxzPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj1DLkNELnpRKCQu
+ZmkoKS5vZmZzZXRIZWlnaHQpLHE9d2luZG93LmlubmVySGVpZ2h0LHA9Qy5DRC56USgkLkRXKCkub2Zm
+c2V0SGVpZ2h0KQppZih0eXBlb2YgcSE9PSJudW1iZXIiKXJldHVybiBxLkhOKCkKdD1zLmJvdHRvbQpp
+Zih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0Lm9zKCkKaWYodD5xLShwKzE0KSlKLmRoKGEpCmVs
+c2V7cT1zLnRvcAppZih0eXBlb2YgcSE9PSJudW1iZXIiKXJldHVybiBxLkooKQppZihxPHIrMTQpSi5k
+aChhKX19LApmRzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscgppZihhIT1udWxsKXt0PWRvY3VtZW50CnM9
+dC5nZXRFbGVtZW50QnlJZCgibyIrSC5kKGEpKQpyPXQucXVlcnlTZWxlY3RvcigiLmxpbmUtIitILmQo
+YikpCmlmKHMhPW51bGwpe0wucU8ocykKSi5kUihzKS5pKDAsInRhcmdldCIpfWVsc2UgaWYociE9bnVs
+bClMLnFPKHIucGFyZW50RWxlbWVudCkKaWYociE9bnVsbClKLmRSKHUuaC5hKHIucGFyZW50Tm9kZSkp
+LmkoMCwiaGlnaGxpZ2h0Iil9ZWxzZSBMLnFPKCQuRDkoKSl9LAphZjpmdW5jdGlvbihhLGIsYyxkLGUp
+e3ZhciB0LHMscj1MLkc2KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxxPUwuYUsod2luZG93LmxvY2F0aW9u
+LmhyZWYpCmlmKHIhPW51bGwpe3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm8iK0guZChyKSkKaWYo
+dCE9bnVsbClKLmRSKHQpLlIoMCwidGFyZ2V0Iil9aWYocSE9bnVsbCl7cz1kb2N1bWVudC5xdWVyeVNl
+bGVjdG9yKCIubGluZS0iK0guZChxKSkKaWYocyE9bnVsbClKLmRSKHMucGFyZW50RWxlbWVudCkuUigw
+LCJoaWdobGlnaHQiKX1pZihhPT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpe0wuZkcoYixjKQplLiQw
+KCl9ZWxzZSBMLkc3KGEsYixjLGQsZSl9LApRNDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj1QLmhLKGEp
+LHE9dS5OCnE9UC5GbChxLHEpCmZvcih0PXIuZ2hZKCksdD10LmdQdSh0KSx0PXQuZ2t6KHQpO3QuRigp
+Oyl7cz10LmdsKCkKcS5ZKDAscy5hLHMuYil9Zm9yKHQ9Yi5nUHUoYiksdD10Lmdreih0KTt0LkYoKTsp
+e3M9dC5nbCgpCnEuWSgwLHMuYSxzLmIpfXEuWSgwLCJhdXRoVG9rZW4iLCQuVUUoKSkKcmV0dXJuIHIu
+bm0oMCxxKS5nbkQoKX0sClQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrPSQuaEwo
+KQpKLmw1KGssIiIpCmlmKGE9PW51bGwpe3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpCnQudGV4
+dENvbnRlbnQ9IlNlZSBkZXRhaWxzIGFib3V0IGEgcHJvcG9zZWQgZWRpdC4iCkMuTHQuc1AodCxILlZN
+KFsicGxhY2Vob2xkZXIiXSx1LnMpKQprLmFwcGVuZENoaWxkKHQpCkMuTHQuRkYodCkKcmV0dXJufXM9
+YS5kCnI9JC5uVSgpCnE9ci50TShzKQpwPWEuYgpvPWRvY3VtZW50Cm49ci5IUChzLEouVDAoby5xdWVy
+eVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50KSkKbT1hLmMKbD1vLmNyZWF0ZUVsZW1lbnQoInAi
+KQprLmFwcGVuZENoaWxkKGwpCmwuYXBwZW5kQ2hpbGQoby5jcmVhdGVUZXh0Tm9kZShILmQocCkrIiBh
+dCAiK0guZChuKSsiOiIrSC5kKG0pKyIuIikpCkouZGgobCkKTC5DQyhhLGsscSkKTC5GeihhLGspfSwK
+TEg6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGc9JC55UCgpCkou
+bDUoZywiIikKaWYoYi5nQShiKT09PTApe3Q9ZG9jdW1lbnQKcz10LmNyZWF0ZUVsZW1lbnQoInAiKQpn
+LmFwcGVuZENoaWxkKHMpCnMuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZSgiTm8gcHJvcG9zZWQg
+ZWRpdHMiKSl9ZWxzZSBmb3IoZz1iLmdQdShiKSxnPWcuZ2t6KGcpLHQ9dS5RLHI9dC5DKCJ+KDEpIiks
+cT11Lk0sdD10LmM7Zy5GKCk7KXtwPWcuZ2woKQpvPWRvY3VtZW50CnM9by5jcmVhdGVFbGVtZW50KCJw
+IikKbj0kLnlQKCkKbi5hcHBlbmRDaGlsZChzKQpzLmFwcGVuZENoaWxkKG8uY3JlYXRlVGV4dE5vZGUo
+SC5kKHAuYSkrIjoiKSkKbT1vLmNyZWF0ZUVsZW1lbnQoInVsIikKbi5hcHBlbmRDaGlsZChtKQpmb3Io
+cD1KLklUKHAuYik7cC5GKCk7KXtuPXAuZ2woKQpsPW8uY3JlYXRlRWxlbWVudCgibGkiKQptLmFwcGVu
+ZENoaWxkKGwpCkouZFIobCkuaSgwLCJlZGl0IikKaz1vLmNyZWF0ZUVsZW1lbnQoImEiKQpsLmFwcGVu
+ZENoaWxkKGspCmsuY2xhc3NMaXN0LmFkZCgiZWRpdC1saW5rIikKaj1uLmMKaT1ILmQoaikKay5zZXRB
+dHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhrKSkuTygib2Zmc2V0IiksaSkKaD1uLmEK
+aT1ILmQoaCkKay5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhrKSkuTygibGlu
+ZSIpLGkpCmsuYXBwZW5kQ2hpbGQoby5jcmVhdGVUZXh0Tm9kZSgibGluZSAiK0guZChoKSkpCmk9ci5h
+KG5ldyBMLkVFKGosaCxhKSkKcS5hKG51bGwpClcuSkUoaywiY2xpY2siLGksITEsdCkKbC5hcHBlbmRD
+aGlsZChvLmNyZWF0ZVRleHROb2RlKCI6ICIrSC5kKG4uYikpKX19aWYoYylMLlQxKG51bGwpfSwKRnI6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscj13aW5kb3cubG9jYXRpb24scT1QLmhLKChyJiZDLkV4KS5n
+RHIocikrSC5kKGEpKQpyPXUuTgpyPVAuRmwocixyKQppZihiIT1udWxsKXIuWSgwLCJvZmZzZXQiLEgu
+ZChiKSkKaWYoYyE9bnVsbClyLlkoMCwibGluZSIsSC5kKGMpKQpyLlkoMCwiYXV0aFRva2VuIiwkLlVF
+KCkpCnE9cS5ubSgwLHIpCnI9d2luZG93Lmhpc3RvcnkKdD11LnoKcz1xLmduRCgpCnIudG9TdHJpbmcK
+ci5wdXNoU3RhdGUobmV3IFAuQmYoW10sW10pLlB2KFAuRmwodCx0KSksIiIscyl9LApFbjpmdW5jdGlv
+bihhKXt2YXIgdD1KLm0oZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnJvb3QiKS50ZXh0Q29udGVudCwi
+LyIpCmlmKEMueEIubihhLHQpKXJldHVybiBDLnhCLkcoYSx0Lmxlbmd0aCkKZWxzZSByZXR1cm4gYX0s
+CkJYOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXt9CnIuYT1hCmE9TC5FbihhKQpyLmE9YQokLkQ5KCku
+dGV4dENvbnRlbnQ9YQp0PWRvY3VtZW50CnM9dS5oCkguRGgocyxzLCJUIiwicXVlcnlTZWxlY3RvckFs
+bCIpCnQ9bmV3IFcud3oodC5xdWVyeVNlbGVjdG9yQWxsKCIubmF2LXBhbmVsIC5uYXYtbGluayIpLHUu
+VCkKdC5LKHQsbmV3IEwuVlMocikpfSwKQkU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PSIucmVnaW9ucyIs
+cz1kb2N1bWVudCxyPXMucXVlcnlTZWxlY3Rvcih0KSxxPXMucXVlcnlTZWxlY3RvcigiLmNvZGUiKQpK
+LnRIKHIsYi5hLCQuS0coKSkKSi50SChxLGIuYiwkLktHKCkpCkwuTEgoYSxiLmQsYykKTC52VSgpCkwu
+eVgoIi5jb2RlIiwhMCkKTC55WCh0LCEwKX0sCnRYOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxv
+LG4sbSxsLGssaixpLGgsZz1kb2N1bWVudCxmPWcuY3JlYXRlRWxlbWVudCgidWwiKQphLmFwcGVuZENo
+aWxkKGYpCmZvcih0PWIubGVuZ3RoLHM9dS5NLHI9MDtyPGIubGVuZ3RoO2IubGVuZ3RoPT09dHx8KDAs
+SC5saykoYiksKytyKXtxPWJbcl0KcD1nLmNyZWF0ZUVsZW1lbnQoImxpIikKZi5hcHBlbmRDaGlsZChw
+KQpvPUouUkUocCkKaWYocS5hPT09Qy5ZMil7by5nUChwKS5pKDAsImRpciIpCm49Zy5jcmVhdGVFbGVt
+ZW50KCJzcGFuIikKcC5hcHBlbmRDaGlsZChuKQpvPUouUkUobikKby5nUChuKS5pKDAsImFycm93IikK
+by5zaGYobiwiJiN4MjVCQzsiKQptPWcuY3JlYXRlRWxlbWVudCgic3BhbiIpCnAuYXBwZW5kQ2hpbGQo
+bSkKSi5sNShtLCImI3gxRjRDMTsiKQpwLmFwcGVuZENoaWxkKGcuY3JlYXRlVGV4dE5vZGUocS5iKSkK
+TC50WChwLHEuYykKTC5reihuKX1lbHNle28uc2hmKHAsIiYjeDFGNEM0OyIpCmw9Zy5jcmVhdGVFbGVt
+ZW50KCJhIikKcC5hcHBlbmRDaGlsZChsKQpvPUouUkUobCkKby5nUChsKS5pKDAsIm5hdi1saW5rIikK
+bC5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhsKSkuTygibmFtZSIpLHEuZCkK
+bC5zZXRBdHRyaWJ1dGUoImhyZWYiLHEuZSkKbC5hcHBlbmRDaGlsZChnLmNyZWF0ZVRleHROb2RlKHEu
+YikpCm89by5nVmwobCkKaz1vLiR0aQpqPWsuQygifigxKSIpLmEobmV3IEwuVEQoKSkKcy5hKG51bGwp
+ClcuSkUoby5hLG8uYixqLCExLGsuYykKaT1xLmYKaWYodHlwZW9mIGkhPT0ibnVtYmVyIilyZXR1cm4g
+aS5vcygpCmlmKGk+MCl7aD1nLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpwLmFwcGVuZENoaWxkKGgpCkou
+ZFIoaCkuaSgwLCJlZGl0LWNvdW50IikKbz0iIitpKyIgIgppZihpPT09MSlrPSJlZGl0IgplbHNlIGs9
+ImVkaXRzIgpoLnNldEF0dHJpYnV0ZSgidGl0bGUiLG8raykKaC5hcHBlbmRDaGlsZChnLmNyZWF0ZVRl
+eHROb2RlKEMuam4uWihpKSkpfX19fSwKRno6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixt
+LGwsayxqPWEuYQppZihqIT1udWxsKXt0PWRvY3VtZW50CnM9dC5jcmVhdGVFbGVtZW50KCJwIikKYi5h
+cHBlbmRDaGlsZChzKQpmb3Iocj1qLmxlbmd0aCxxPXUucyxwPXUuWCxvPTA7bzxqLmxlbmd0aDtqLmxl
+bmd0aD09PXJ8fCgwLEgubGspKGopLCsrbyl7bj1qW29dCm09dC5jcmVhdGVFbGVtZW50KCJhIikKcy5h
+cHBlbmRDaGlsZChtKQptLmFwcGVuZENoaWxkKHQuY3JlYXRlVGV4dE5vZGUobi5hKSkKbS5zZXRBdHRy
+aWJ1dGUoImhyZWYiLG4uYikKbD1wLmEoSC5WTShbImFkZC1oaW50LWxpbmsiLCJiZWZvcmUtYXBwbHki
+LCJidXR0b24iXSxxKSkKaz1KLmRSKG0pCmsuVjEoMCkKay5GVigwLGwpfX19LApDQzpmdW5jdGlvbihh
+MixhMyxhNCl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYSxhMCxhMT1u
+dWxsCmZvcih0PWEyLmUscz10Lmxlbmd0aCxyPXUucyxxPXUuWCxwPTA7cDx0Lmxlbmd0aDt0Lmxlbmd0
+aD09PXN8fCgwLEgubGspKHQpLCsrcCl7bz10W3BdCm49ZG9jdW1lbnQKbT1uLmNyZWF0ZUVsZW1lbnQo
+InAiKQpsPXEuYShILlZNKFsidHJhY2UiXSxyKSkKaz1KLmRSKG0pCmsuVjEoMCkKay5GVigwLGwpCmo9
+YTMuYXBwZW5kQ2hpbGQobSkKbT1uLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpsPXEuYShILlZNKFsidHlw
+ZS1kZXNjcmlwdGlvbiJdLHIpKQprPUouZFIobSkKay5WMSgwKQprLkZWKDAsbCkKbS5hcHBlbmRDaGls
+ZChuLmNyZWF0ZVRleHROb2RlKG8uYSkpCmouYXBwZW5kQ2hpbGQobSkKai5hcHBlbmRDaGlsZChuLmNy
+ZWF0ZVRleHROb2RlKCI6IikpCm09bi5jcmVhdGVFbGVtZW50KCJ1bCIpCmw9cS5hKEguVk0oWyJ0cmFj
+ZSJdLHIpKQprPUouZFIobSkKay5WMSgwKQprLkZWKDAsbCkKaT1qLmFwcGVuZENoaWxkKG0pCmZvciht
+PW8uYixsPW0ubGVuZ3RoLGg9MDtoPG0ubGVuZ3RoO20ubGVuZ3RoPT09bHx8KDAsSC5saykobSksKyto
+KXtnPW1baF0KZj1uLmNyZWF0ZUVsZW1lbnQoImxpIikKSi5sNShmLCImI3gyNzRGOyAiKQppLmFwcGVu
+ZENoaWxkKGYpCmU9bi5jcmVhdGVFbGVtZW50KCJzcGFuIikKZD1xLmEoSC5WTShbImZ1bmN0aW9uIl0s
+cikpCms9Si5kUihlKQprLlYxKDApCmsuRlYoMCxkKQpkPWcuYgpMLmtEKGUsZD09bnVsbD8idW5rbm93
+biI6ZCkKZi5hcHBlbmRDaGlsZChlKQpjPWcuYwppZihjIT1udWxsKXtmLmFwcGVuZENoaWxkKG4uY3Jl
+YXRlVGV4dE5vZGUoIiAoIikpCmI9Yy5iCmE9bi5jcmVhdGVFbGVtZW50KCJhIikKYS5hcHBlbmRDaGls
+ZChuLmNyZWF0ZVRleHROb2RlKEguZChjLmMpKyI6IitILmQoYikpKQphMD1jLmEKZT0kLm5VKCkKYS5z
+ZXRBdHRyaWJ1dGUoImhyZWYiLGUubzUoZS5xNygwLGE0LGEwLGExLGExLGExLGExLGExLGExKSkpCmEu
+Y2xhc3NMaXN0LmFkZCgibmF2LWxpbmsiKQpmLmFwcGVuZENoaWxkKGEpCmYuYXBwZW5kQ2hpbGQobi5j
+cmVhdGVUZXh0Tm9kZSgiKSIpKX1mLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoIjogIikpCmU9
+Zy5hCkwua0QoZixlPT1udWxsPyJ1bmtub3duIjplKX19fSwKa0Q6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
+LHI9SC5WTShiLnNwbGl0KCIuIiksdS5zKSxxPUMuTm0uZ3RIKHIpLHA9ZG9jdW1lbnQKYS5hcHBlbmRD
+aGlsZChwLmNyZWF0ZVRleHROb2RlKHEpKQpmb3IocT1ILnFDKHIsMSxudWxsLHUuTikscT1uZXcgSC5h
+NyhxLHEuZ0EocSkscS4kdGkuQygiYTc8YUwuRT4iKSksdD1KLlJFKGEpO3EuRigpOyl7cz1xLmQKdC5u
+eihhLCJiZWZvcmVlbmQiLCImIzgyMDM7LiIsbnVsbCxudWxsKQphLmFwcGVuZENoaWxkKHAuY3JlYXRl
+VGV4dE5vZGUocykpfX0sCmU6ZnVuY3Rpb24gZSgpe30sClZXOmZ1bmN0aW9uIFZXKGEsYixjKXt0aGlz
+LmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCm9aOmZ1bmN0aW9uIG9aKCl7fSwKanI6ZnVuY3Rpb24ganIo
+KXt9LApxbDpmdW5jdGlvbiBxbCgpe30sCnk4OmZ1bmN0aW9uIHk4KCl7fSwKSGk6ZnVuY3Rpb24gSGko
+KXt9LApCVDpmdW5jdGlvbiBCVCgpe30sCkw6ZnVuY3Rpb24gTCgpe30sCld4OmZ1bmN0aW9uIFd4KGEs
+Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBTzpmdW5jdGlvbiBBTyhhKXt0aGlzLmE9YX0sCmROOmZ1bmN0
+aW9uIGROKGEpe3RoaXMuYT1hfSwKSG86ZnVuY3Rpb24gSG8oYSl7dGhpcy5hPWF9LAp4ejpmdW5jdGlv
+biB4eihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSUM6ZnVuY3Rpb24gSUMoKXt9LApMMTpmdW5jdGlv
+biBMMShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKblQ6ZnVuY3Rpb24gblQoYSxiLGMpe3RoaXMuYT1h
+CnRoaXMuYj1iCnRoaXMuYz1jfSwKTlk6ZnVuY3Rpb24gTlkoYSl7dGhpcy5hPWF9LApHSDpmdW5jdGlv
+biBHSCgpe30sCkRUOmZ1bmN0aW9uIERUKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30s
+CmVIOmZ1bmN0aW9uIGVIKGEpe3RoaXMuYT1hfSwKeXU6ZnVuY3Rpb24geXUoYSxiLGMsZCxlKXt2YXIg
+Xz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lfSwKekQ6ZnVuY3Rpb24gekQoYSl7dGhp
+cy5hPWF9LApUVzpmdW5jdGlvbiBUVygpe30sCnhyOmZ1bmN0aW9uIHhyKGEpe3RoaXMuYT1hfSwKRUU6
+ZnVuY3Rpb24gRUUoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKUUw6ZnVuY3Rpb24g
+UUwoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClZTOmZ1bmN0aW9uIFZTKGEpe3RoaXMuYT1hfSwKVEQ6
+ZnVuY3Rpb24gVEQoKXt9LApYQTpmdW5jdGlvbiBYQSgpe30sCm1LOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
+cixxLHAsbyxuPUguVk0oW10sdS5maCkKZm9yKHQ9Si5JVCh1LlIuYShhKSk7dC5GKCk7KXtzPXQuZ2wo
+KQpyPUouVTYocykKcT1MLnAyKEguYyhyLnEocywidHlwZSIpKSkKcD1ILmMoci5xKHMsIm5hbWUiKSkK
+bz1yLnEocywic3VidHJlZSIpCm89bz09bnVsbD9udWxsOkwubUsobykKQy5ObS5pKG4sbmV3IEwuWloo
+cSxwLG8sSC5jKHIucShzLCJwYXRoIikpLEguYyhyLnEocywiaHJlZiIpKSxILldZKHIucShzLCJlZGl0
+Q291bnQiKSkpKX1yZXR1cm4gbn0sCnAyOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlImRpcmVjdG9y
+eSI6cmV0dXJuIEMuWTIKY2FzZSJmaWxlIjpyZXR1cm4gQy5yZgpkZWZhdWx0OnRocm93IEguYihQLlBW
+KCJVbnJlY29nbml6ZWQgbmF2aWdhdGlvbiB0cmVlIG5vZGUgdHlwZTogIitILmQoYSkpKX19LApaWjpm
+dW5jdGlvbiBaWihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApf
+LmU9ZQpfLmY9Zn0sCk85OmZ1bmN0aW9uIE85KGEpe3RoaXMuYj1hfSwKSVY6ZnVuY3Rpb24gSVYoYSxi
+LGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9YgpfLmY9YwpfLnI9ZH19LE09ewpZRjpmdW5jdGlvbihh
+LGIpe3ZhciB0LHMscixxLHAsbyxuCmZvcih0PWIubGVuZ3RoLHM9MTtzPHQ7KytzKXtpZihiW3NdPT1u
+dWxsfHxiW3MtMV0hPW51bGwpY29udGludWUKZm9yKDt0Pj0xO3Q9cil7cj10LTEKaWYoYltyXSE9bnVs
+bClicmVha31xPW5ldyBQLlJuKCIiKQpwPWErIigiCnEuYT1wCm89SC5xQyhiLDAsdCxILnQ2KGIpLmMp
+Cm49by4kdGkKbj1wK25ldyBILmxKKG8sbi5DKCJxVShhTC5FKSIpLmEobmV3IE0uTm8oKSksbi5DKCJs
+SjxhTC5FLHFVPiIpKS56VigwLCIsICIpCnEuYT1uCnEuYT1uKygiKTogcGFydCAiKyhzLTEpKyIgd2Fz
+IG51bGwsIGJ1dCBwYXJ0ICIrcysiIHdhcyBub3QuIikKdGhyb3cgSC5iKFAueFkocS5aKDApKSl9fSwK
+bEk6ZnVuY3Rpb24gbEkoYSl7dGhpcy5hPWF9LApNaTpmdW5jdGlvbiBNaSgpe30sCnE3OmZ1bmN0aW9u
+IHE3KCl7fSwKTm86ZnVuY3Rpb24gTm8oKXt9fSxYPXsKQ0w6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIs
+cSxwLG89Yi54WihhKQpiLmhLKGEpCmlmKG8hPW51bGwpYT1KLktWKGEsby5sZW5ndGgpCnQ9dS5zCnM9
+SC5WTShbXSx0KQpyPUguVk0oW10sdCkKdD1hLmxlbmd0aAppZih0IT09MCYmYi5yNChDLnhCLlcoYSww
+KSkpe2lmKDA+PXQpcmV0dXJuIEguayhhLDApCkMuTm0uaShyLGFbMF0pCnE9MX1lbHNle0MuTm0uaShy
+LCIiKQpxPTB9Zm9yKHA9cTtwPHQ7KytwKWlmKGIucjQoQy54Qi5XKGEscCkpKXtDLk5tLmkocyxDLnhC
+Lk5qKGEscSxwKSkKQy5ObS5pKHIsYVtwXSkKcT1wKzF9aWYocTx0KXtDLk5tLmkocyxDLnhCLkcoYSxx
+KSkKQy5ObS5pKHIsIiIpfXJldHVybiBuZXcgWC5XRChiLG8scyxyKX0sCldEOmZ1bmN0aW9uIFdEKGEs
+YixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5kPWMKXy5lPWR9LApxUjpmdW5jdGlvbiBxUihh
+KXt0aGlzLmE9YX0sCkk3OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgWC5kdihhKX0sCmR2OmZ1bmN0aW9u
+IGR2KGEpe3RoaXMuYT1hfX0sTz17ClJoOmZ1bmN0aW9uKCl7dmFyIHQscz1udWxsCmlmKFAudW8oKS5n
+RmkoKSE9PSJmaWxlIilyZXR1cm4gJC5FYigpCnQ9UC51bygpCmlmKCFDLnhCLlRjKHQuZ0lpKHQpLCIv
+IikpcmV0dXJuICQuRWIoKQppZihQLktMKHMsImEvYiIscyxzLHMscyxzKS50NCgpPT09ImFcXGIiKXJl
+dHVybiAkLktrKCkKcmV0dXJuICQuYkQoKX0sCnpMOmZ1bmN0aW9uIHpMKCl7fX0sRT17T0Y6ZnVuY3Rp
+b24gT0YoYSxiLGMpe3RoaXMuZD1hCnRoaXMuZT1iCnRoaXMuZj1jfX0sRj17cnU6ZnVuY3Rpb24gcnUo
+YSxiLGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9YgpfLmY9YwpfLnI9ZH19LEQ9ewpSWDpmdW5jdGlv
+bigpe3ZhciB0LHMscj1QLnVvKCkKaWYoci5ETigwLCQuSTYpKXJldHVybiAkLkZmCiQuSTY9cgppZigk
+LkhrKCk9PSQuRWIoKSlyZXR1cm4gJC5GZj1yLlpJKCIuIikuWigwKQplbHNle3Q9ci50NCgpCnM9dC5s
+ZW5ndGgtMQpyZXR1cm4gJC5GZj1zPT09MD90OkMueEIuTmoodCwwLHMpfX0sCm5yOmZ1bmN0aW9uKGEs
+Yil7dmFyIHQ9bnVsbApyZXR1cm4gJC5uVSgpLnE3KDAsYSxiLHQsdCx0LHQsdCx0KX19CnZhciB3PVtD
+LEgsSixQLFcsVSxCLFQsTCxNLFgsTyxFLEYsRF0KaHVua0hlbHBlcnMuc2V0RnVuY3Rpb25OYW1lc0lm
+TmVjZXNzYXJ5KHcpCnZhciAkPXt9CkguRksucHJvdG90eXBlPXt9CkoudkIucHJvdG90eXBlPXsKRE46
+ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWJ9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEguZVEoYSl9
+LApaOmZ1bmN0aW9uKGEpe3JldHVybiJJbnN0YW5jZSBvZiAnIitILmQoSC5saChhKSkrIicifSwKZTc6
+ZnVuY3Rpb24oYSxiKXt1Lm8uYShiKQp0aHJvdyBILmIoUC5scihhLGIuZ1dhKCksYi5nbmQoKSxiLmdW
+bSgpKSl9fQpKLnlFLnByb3RvdHlwZT17Clo6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCmdp
+TzpmdW5jdGlvbihhKXtyZXR1cm4gYT81MTkwMTg6MjE4MTU5fSwKJGlhMjoxfQpKLllFLnByb3RvdHlw
+ZT17CkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWJ9LApaOmZ1bmN0aW9uKGEpe3JldHVybiJu
+dWxsIn0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gMH0sCmU3OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRo
+aXMuU2ooYSx1Lm8uYShiKSl9LAokaWM4OjF9CkouTUYucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEp
+e3JldHVybiAwfSwKWjpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGl2bToxfQpKLmlDLnBy
+b3RvdHlwZT17fQpKLmtkLnByb3RvdHlwZT17fQpKLmM1LnByb3RvdHlwZT17Clo6ZnVuY3Rpb24oYSl7
+dmFyIHQ9YVskLndRKCldCmlmKHQ9PW51bGwpcmV0dXJuIHRoaXMudChhKQpyZXR1cm4iSmF2YVNjcmlw
+dCBmdW5jdGlvbiBmb3IgIitILmQoSi5BYyh0KSl9LAokUzpmdW5jdGlvbigpe3JldHVybntmdW5jOjEs
+b3B0OlssLCwsLCwsLCwsLCwsLCwsXX19LAokaUVIOjF9CkouamQucHJvdG90eXBlPXsKaTpmdW5jdGlv
+bihhLGIpe0gudDYoYSkuYy5hKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52aChQLkw0KCJhZGQiKSkK
+YS5wdXNoKGIpfSwKVzQ6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZighIWEuZml4ZWQkbGVuZ3RoKUgudmgo
+UC5MNCgicmVtb3ZlQXQiKSkKdD1hLmxlbmd0aAppZihiPj10KXRocm93IEguYihQLk83KGIsbnVsbCkp
+CnJldHVybiBhLnNwbGljZShiLDEpWzBdfSwKVUc6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscgpILnQ2
+KGEpLkMoImNYPDE+IikuYShjKQppZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgiaW5zZXJ0QWxs
+IikpCnQ9YS5sZW5ndGgKUC53QShiLDAsdCwiaW5kZXgiKQpzPWMubGVuZ3RoCnRoaXMuc0EoYSx0K3Mp
+CnI9YitzCnRoaXMuWVcoYSxyLGEubGVuZ3RoLGEsYikKdGhpcy52ZyhhLGIscixjKX0sCm12OmZ1bmN0
+aW9uKGEpe2lmKCEhYS5maXhlZCRsZW5ndGgpSC52aChQLkw0KCJyZW1vdmVMYXN0IikpCmlmKGEubGVu
+Z3RoPT09MCl0aHJvdyBILmIoSC5IWShhLC0xKSkKcmV0dXJuIGEucG9wKCl9LApGVjpmdW5jdGlvbihh
+LGIpe3ZhciB0CkgudDYoYSkuQygiY1g8MT4iKS5hKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52aChQ
+Lkw0KCJhZGRBbGwiKSkKZm9yKHQ9Si5JVChiKTt0LkYoKTspYS5wdXNoKHQuZ2woKSl9LApFMjpmdW5j
+dGlvbihhLGIsYyl7dmFyIHQ9SC50NihhKQpyZXR1cm4gbmV3IEgubEooYSx0LktxKGMpLkMoIjEoMiki
+KS5hKGIpLHQuQygiQDwxPiIpLktxKGMpLkMoImxKPDEsMj4iKSl9LAp6VjpmdW5jdGlvbihhLGIpe3Zh
+ciB0LHM9UC5POChhLmxlbmd0aCwiIiwhMSx1Lk4pCmZvcih0PTA7dDxhLmxlbmd0aDsrK3QpdGhpcy5Z
+KHMsdCxILmQoYVt0XSkpCnJldHVybiBzLmpvaW4oYil9LApOMDpmdW5jdGlvbihhLGIsYyxkKXt2YXIg
+dCxzLHIKZC5hKGIpCkgudDYoYSkuS3EoZCkuQygiMSgxLDIpIikuYShjKQp0PWEubGVuZ3RoCmZvcihz
+PWIscj0wO3I8dDsrK3Ipe3M9Yy4kMihzLGFbcl0pCmlmKGEubGVuZ3RoIT09dCl0aHJvdyBILmIoUC5h
+NChhKSl9cmV0dXJuIHN9LApFOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4g
+SC5rKGEsYikKcmV0dXJuIGFbYl19LApENjpmdW5jdGlvbihhLGIsYyl7aWYoYjwwfHxiPmEubGVuZ3Ro
+KXRocm93IEguYihQLlRFKGIsMCxhLmxlbmd0aCwic3RhcnQiLG51bGwpKQppZihjPGJ8fGM+YS5sZW5n
+dGgpdGhyb3cgSC5iKFAuVEUoYyxiLGEubGVuZ3RoLCJlbmQiLG51bGwpKQppZihiPT09YylyZXR1cm4g
+SC5WTShbXSxILnQ2KGEpKQpyZXR1cm4gSC5WTShhLnNsaWNlKGIsYyksSC50NihhKSl9LApndEg6ZnVu
+Y3Rpb24oYSl7aWYoYS5sZW5ndGg+MClyZXR1cm4gYVswXQp0aHJvdyBILmIoSC5XcCgpKX0sCmdyWjpm
+dW5jdGlvbihhKXt2YXIgdD1hLmxlbmd0aAppZih0PjApcmV0dXJuIGFbdC0xXQp0aHJvdyBILmIoSC5X
+cCgpKX0sCllXOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyLHEscD1ILnQ2KGEpCnAuQygiY1g8
+MT4iKS5hKGQpCmlmKCEhYS5pbW11dGFibGUkbGlzdClILnZoKFAuTDQoInNldFJhbmdlIikpClAuakIo
+YixjLGEubGVuZ3RoKQp0PWMtYgppZih0PT09MClyZXR1cm4KUC5rMShlLCJza2lwQ291bnQiKQppZihw
+LkMoInpNPDE+IikuYihkKSl7cz1lCnI9ZH1lbHNle3I9SC5xQyhkLGUsbnVsbCxILnQ2KGQpLmMpLnR0
+KDAsITEpCnM9MH1pZihzK3Q+ci5sZW5ndGgpdGhyb3cgSC5iKEguYXIoKSkKaWYoczxiKWZvcihxPXQt
+MTtxPj0wOy0tcSl7cD1zK3EKaWYocD49ci5sZW5ndGgpcmV0dXJuIEguayhyLHApCmFbYitxXT1yW3Bd
+fWVsc2UgZm9yKHE9MDtxPHQ7KytxKXtwPXMrcQppZihwPj1yLmxlbmd0aClyZXR1cm4gSC5rKHIscCkK
+YVtiK3FdPXJbcF19fSwKdmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuWVcoYSxiLGMsZCww
+KX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILnQ2KGEpLkMoImEyKDEpIikuYShiKQp0PWEubGVu
+Z3RoCmZvcihzPTA7czx0Oysrcyl7aWYoSC5vVChiLiQxKGFbc10pKSlyZXR1cm4hMAppZihhLmxlbmd0
+aCE9PXQpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgdApm
+b3IodD0wO3Q8YS5sZW5ndGg7Kyt0KWlmKEouUk0oYVt0XSxiKSlyZXR1cm4hMApyZXR1cm4hMX0sClo6
+ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX0sCmdrejpmdW5jdGlvbihhKXtyZXR1cm4g
+bmV3IEoubTEoYSxhLmxlbmd0aCxILnQ2KGEpLkMoIm0xPDE+IikpfSwKZ2lPOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBILmVRKGEpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKc0E6ZnVuY3Rpb24o
+YSxiKXtpZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgic2V0IGxlbmd0aCIpKQphLmxlbmd0aD1i
+fSwKcTpmdW5jdGlvbihhLGIpe0guV1koYikKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJvdyBILmIoSC5I
+WShhLGIpKQpyZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe0gudDYoYSkuYy5hKGMpCmlmKCEh
+YS5pbW11dGFibGUkbGlzdClILnZoKFAuTDQoImluZGV4ZWQgc2V0IikpCmlmKGI+PWEubGVuZ3RofHxi
+PDApdGhyb3cgSC5iKEguSFkoYSxiKSkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0KSi5Q
+by5wcm90b3R5cGU9e30KSi5tMS5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9
+LApGOmZ1bmN0aW9uKCl7dmFyIHQscz10aGlzLHI9cy5hLHE9ci5sZW5ndGgKaWYocy5iIT09cSl0aHJv
+dyBILmIoSC5sayhyKSkKdD1zLmMKaWYodD49cSl7cy5zSChudWxsKQpyZXR1cm4hMX1zLnNIKHJbdF0p
+Oysrcy5jCnJldHVybiEwfSwKc0g6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmMuYShhKX0sCiRp
+QW46MX0KSi5xSS5wcm90b3R5cGU9ewp6UTpmdW5jdGlvbihhKXtpZihhPjApe2lmKGEhPT0xLzApcmV0
+dXJuIE1hdGgucm91bmQoYSl9ZWxzZSBpZihhPi0xLzApcmV0dXJuIDAtTWF0aC5yb3VuZCgwLWEpCnRo
+cm93IEguYihQLkw0KCIiK2ErIi5yb3VuZCgpIikpfSwKV1o6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIs
+cQppZihiPDJ8fGI+MzYpdGhyb3cgSC5iKFAuVEUoYiwyLDM2LCJyYWRpeCIsbnVsbCkpCnQ9YS50b1N0
+cmluZyhiKQppZihDLnhCLm0odCx0Lmxlbmd0aC0xKSE9PTQxKXJldHVybiB0CnM9L14oW1xkYS16XSsp
+KD86XC4oW1xkYS16XSspKT9cKGVcKyhcZCspXCkkLy5leGVjKHQpCmlmKHM9PW51bGwpSC52aChQLkw0
+KCJVbmV4cGVjdGVkIHRvU3RyaW5nIHJlc3VsdDogIit0KSkKcj1zLmxlbmd0aAppZigxPj1yKXJldHVy
+biBILmsocywxKQp0PXNbMV0KaWYoMz49cilyZXR1cm4gSC5rKHMsMykKcT0rc1szXQpyPXNbMl0KaWYo
+ciE9bnVsbCl7dCs9cgpxLT1yLmxlbmd0aH1yZXR1cm4gdCtDLnhCLkl4KCIwIixxKX0sClo6ZnVuY3Rp
+b24oYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiItMC4wIgplbHNlIHJldHVybiIiK2F9LApnaU86ZnVu
+Y3Rpb24oYSl7dmFyIHQscyxyLHEscD1hfDAKaWYoYT09PXApcmV0dXJuIDUzNjg3MDkxMSZwCnQ9TWF0
+aC5hYnMoYSkKcz1NYXRoLmxvZyh0KS8wLjY5MzE0NzE4MDU1OTk0NTN8MApyPU1hdGgucG93KDIscykK
+cT10PDE/dC9yOnIvdApyZXR1cm4gNTM2ODcwOTExJigocSo5MDA3MTk5MjU0NzQwOTkyfDApKyhxKjM1
+NDIyNDMxODExNzY1MjF8MCkpKjU5OTE5NytzKjEyNTl9LAp6WTpmdW5jdGlvbihhLGIpe3ZhciB0PWEl
+YgppZih0PT09MClyZXR1cm4gMAppZih0PjApcmV0dXJuIHQKaWYoYjwwKXJldHVybiB0LWIKZWxzZSBy
+ZXR1cm4gdCtifSwKd0c6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihhPjApdD10aGlzLnAzKGEsYikKZWxz
+ZXt0PWI+MzE/MzE6Ygp0PWE+PnQ+Pj4wfXJldHVybiB0fSwKYmY6ZnVuY3Rpb24oYSxiKXtpZihiPDAp
+dGhyb3cgSC5iKEguSShiKSkKcmV0dXJuIHRoaXMucDMoYSxiKX0sCnAzOmZ1bmN0aW9uKGEsYil7cmV0
+dXJuIGI+MzE/MDphPj4+Yn0sCiRpQ1A6MSwKJGlsZjoxfQpKLnVyLnByb3RvdHlwZT17JGlJZjoxfQpK
+LlZBLnByb3RvdHlwZT17fQpKLkRyLnByb3RvdHlwZT17Cm06ZnVuY3Rpb24oYSxiKXtpZihiPDApdGhy
+b3cgSC5iKEguSFkoYSxiKSkKaWYoYj49YS5sZW5ndGgpSC52aChILkhZKGEsYikpCnJldHVybiBhLmNo
+YXJDb2RlQXQoYil9LApXOmZ1bmN0aW9uKGEsYil7aWYoYj49YS5sZW5ndGgpdGhyb3cgSC5iKEguSFko
+YSxiKSkKcmV0dXJuIGEuY2hhckNvZGVBdChiKX0sCmRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBI
+Lk5GKGIsYSwwKX0sCmg6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYiE9InN0cmluZyIpdGhyb3cgSC5i
+KFAuTDMoYixudWxsLG51bGwpKQpyZXR1cm4gYStifSwKVGM6ZnVuY3Rpb24oYSxiKXt2YXIgdD1iLmxl
+bmd0aCxzPWEubGVuZ3RoCmlmKHQ+cylyZXR1cm4hMQpyZXR1cm4gYj09PXRoaXMuRyhhLHMtdCl9LApp
+NzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdD1QLmpCKGIsYyxhLmxlbmd0aCkscz1hLnN1YnN0cmluZygw
+LGIpLHI9YS5zdWJzdHJpbmcodCkKcmV0dXJuIHMrZCtyfSwKUWk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
+CmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkK
+dD1jK2IubGVuZ3RoCmlmKHQ+YS5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIGI9PT1hLnN1YnN0cmluZyhj
+LHQpfSwKbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlFpKGEsYiwwKX0sCk5qOmZ1bmN0aW9uKGEs
+YixjKXtpZihjPT1udWxsKWM9YS5sZW5ndGgKaWYoYjwwKXRocm93IEguYihQLk83KGIsbnVsbCkpCmlm
+KGI+Yyl0aHJvdyBILmIoUC5PNyhiLG51bGwpKQppZihjPmEubGVuZ3RoKXRocm93IEguYihQLk83KGMs
+bnVsbCkpCnJldHVybiBhLnN1YnN0cmluZyhiLGMpfSwKRzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlz
+Lk5qKGEsYixudWxsKX0sCmhjOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9LApiUzpm
+dW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLnRyaW0oKSxwPXEubGVuZ3RoCmlmKHA9PT0wKXJldHVybiBx
+CmlmKHRoaXMuVyhxLDApPT09MTMzKXt0PUoubW0ocSwxKQppZih0PT09cClyZXR1cm4iIn1lbHNlIHQ9
+MApzPXAtMQpyPXRoaXMubShxLHMpPT09MTMzP0ouYzEocSxzKTpwCmlmKHQ9PT0wJiZyPT09cClyZXR1
+cm4gcQpyZXR1cm4gcS5zdWJzdHJpbmcodCxyKX0sCkl4OmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZigw
+Pj1iKXJldHVybiIiCmlmKGI9PT0xfHxhLmxlbmd0aD09PTApcmV0dXJuIGEKaWYoYiE9PWI+Pj4wKXRo
+cm93IEguYihDLkVxKQpmb3IodD1hLHM9IiI7ITA7KXtpZigoYiYxKT09PTEpcz10K3MKYj1iPj4+MQpp
+ZihiPT09MClicmVhawp0Kz10fXJldHVybiBzfSwKWFU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKGM8
+MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKdD1hLmlu
+ZGV4T2YoYixjKQpyZXR1cm4gdH0sCk9ZOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWFUoYSxiLDAp
+fSwKUGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMKaWYoYz09bnVsbCljPWEubGVuZ3RoCmVsc2UgaWYo
+YzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGMsMCxhLmxlbmd0aCxudWxsLG51bGwpKQp0PWIu
+bGVuZ3RoCnM9YS5sZW5ndGgKaWYoYyt0PnMpYz1zLXQKcmV0dXJuIGEubGFzdEluZGV4T2YoYixjKX0s
+CmNuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUGsoYSxiLG51bGwpfSwKSXM6ZnVuY3Rpb24oYSxi
+LGMpe3ZhciB0PWEubGVuZ3RoCmlmKGM+dCl0aHJvdyBILmIoUC5URShjLDAsdCxudWxsLG51bGwpKQpy
+ZXR1cm4gSC5tMihhLGIsYyl9LAp0ZzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLklzKGEsYiwwKX0s
+Clo6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQscyxyCmZvcih0PWEu
+bGVuZ3RoLHM9MCxyPTA7cjx0Oysrcil7cz01MzY4NzA5MTEmcythLmNoYXJDb2RlQXQocikKcz01MzY4
+NzA5MTEmcysoKDUyNDI4NyZzKTw8MTApCnNePXM+PjZ9cz01MzY4NzA5MTEmcysoKDY3MTA4ODYzJnMp
+PDwzKQpzXj1zPj4xMQpyZXR1cm4gNTM2ODcwOTExJnMrKCgxNjM4MyZzKTw8MTUpfSwKZ0E6ZnVuY3Rp
+b24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guV1koYikKaWYoYj49YS5sZW5n
+dGh8fCExKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhW2JdfSwKJGl2WDoxLAokaXFVOjF9Ckgu
+bmQucHJvdG90eXBlPXsKWjpmdW5jdGlvbihhKXt2YXIgdD0iTGF0ZUluaXRpYWxpemF0aW9uRXJyb3I6
+ICIrdGhpcy5hCnJldHVybiB0fX0KSC5xai5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5hLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gQy54Qi5tKHRoaXMuYSxILldZKGIp
+KX19CkguYlEucHJvdG90eXBlPXt9CkguYUwucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3ZhciB0
+PXRoaXMKcmV0dXJuIG5ldyBILmE3KHQsdC5nQSh0KSxILkxoKHQpLkMoImE3PGFMLkU+IikpfSwKelY6
+ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscT10aGlzLHA9cS5nQShxKQppZihiLmxlbmd0aCE9PTApe2lm
+KHA9PT0wKXJldHVybiIiCnQ9SC5kKHEuRSgwLDApKQppZihwIT09cS5nQShxKSl0aHJvdyBILmIoUC5h
+NChxKSkKZm9yKHM9dCxyPTE7cjxwOysrcil7cz1zK2IrSC5kKHEuRSgwLHIpKQppZihwIT09cS5nQShx
+KSl0aHJvdyBILmIoUC5hNChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9ZWxzZXtmb3Io
+cj0wLHM9IiI7cjxwOysrcil7cys9SC5kKHEuRSgwLHIpKQppZihwIT09cS5nQShxKSl0aHJvdyBILmIo
+UC5hNChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fSwKZXY6ZnVuY3Rpb24oYSxiKXty
+ZXR1cm4gdGhpcy5HRygwLEguTGgodGhpcykuQygiYTIoYUwuRSkiKS5hKGIpKX0sCkUyOmZ1bmN0aW9u
+KGEsYixjKXt2YXIgdD1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5sSih0aGlzLHQuS3EoYykuQygiMShh
+TC5FKSIpLmEoYiksdC5DKCJAPGFMLkU+IikuS3EoYykuQygibEo8MSwyPiIpKX19CkgubkgucHJvdG90
+eXBlPXsKZ1VEOmZ1bmN0aW9uKCl7dmFyIHQ9Si5IKHRoaXMuYSkscz10aGlzLmMKaWYocz09bnVsbHx8
+cz50KXJldHVybiB0CnJldHVybiBzfSwKZ0FzOmZ1bmN0aW9uKCl7dmFyIHQ9Si5IKHRoaXMuYSkscz10
+aGlzLmIKaWYocz50KXJldHVybiB0CnJldHVybiBzfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHQscz1KLkgo
+dGhpcy5hKSxyPXRoaXMuYgppZihyPj1zKXJldHVybiAwCnQ9dGhpcy5jCmlmKHQ9PW51bGx8fHQ+PXMp
+cmV0dXJuIHMtcgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkhOKCkKcmV0dXJuIHQtcn0s
+CkU6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzLHM9dC5nQXMoKStiCmlmKGI8MHx8cz49dC5nVUQoKSl0
+aHJvdyBILmIoUC50KGIsdCwiaW5kZXgiLG51bGwsbnVsbCkpCnJldHVybiBKLkdBKHQuYSxzKX0sCnR0
+OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHE9dGhpcyxwPXEuYixvPXEuYSxuPUouVTYobyksbT1uLmdB
+KG8pLGw9cS5jCmlmKGwhPW51bGwmJmw8bSltPWwKaWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4g
+bS5ITigpCnQ9bS1wCmlmKHQ8PTApe289Si5RaSgwLHEuJHRpLmMpCnJldHVybiBvfXM9UC5POCh0LG4u
+RShvLHApLCExLHEuJHRpLmMpCmZvcihyPTE7cjx0Oysrcil7Qy5ObS5ZKHMscixuLkUobyxwK3IpKQpp
+ZihuLmdBKG8pPG0pdGhyb3cgSC5iKFAuYTQocSkpfXJldHVybiBzfX0KSC5hNy5wcm90b3R5cGU9ewpn
+bDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZApyZXR1cm4gdH0sCkY6ZnVuY3Rpb24oKXt2YXIgdCxzPXRo
+aXMscj1zLmEscT1KLlU2KHIpLHA9cS5nQShyKQppZihzLmIhPT1wKXRocm93IEguYihQLmE0KHIpKQp0
+PXMuYwppZih0Pj1wKXtzLnNJKG51bGwpCnJldHVybiExfXMuc0kocS5FKHIsdCkpOysrcy5jCnJldHVy
+biEwfSwKc0k6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmMuYShhKX0sCiRpQW46MX0KSC5pMS5w
+cm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7dmFyIHQ9SC5MaCh0aGlzKQpyZXR1cm4gbmV3IEguTUgo
+Si5JVCh0aGlzLmEpLHRoaXMuYix0LkMoIkA8MT4iKS5LcSh0LlFbMV0pLkMoIk1IPDEsMj4iKSl9LApn
+QTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IKHRoaXMuYSl9fQpILnh5LnByb3RvdHlwZT17JGliUToxfQpI
+Lk1ILnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5iCmlmKHMuRigpKXt0LnNJ
+KHQuYy4kMShzLmdsKCkpKQpyZXR1cm4hMH10LnNJKG51bGwpCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24o
+KXt2YXIgdD10aGlzLmEKcmV0dXJuIHR9LApzSTpmdW5jdGlvbihhKXt0aGlzLmE9dGhpcy4kdGkuUVsx
+XS5hKGEpfX0KSC5sSi5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IKHRoaXMuYSl9
+LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILlU1LnBy
+b3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEgudkcoSi5JVCh0aGlzLmEpLHRoaXMu
+Yix0aGlzLiR0aS5DKCJ2RzwxPiIpKX19CkgudkcucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciB0
+LHMKZm9yKHQ9dGhpcy5hLHM9dGhpcy5iO3QuRigpOylpZihILm9UKHMuJDEodC5nbCgpKSkpcmV0dXJu
+ITAKcmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19CkguU1UucHJvdG90
+eXBlPXt9CkguUmUucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC5MaCh0aGlzKS5DKCJSZS5F
+IikuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIp
+KX19CkgudzIucHJvdG90eXBlPXt9Ckgud3YucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3ZhciB0
+PXRoaXMuX2hhc2hDb2RlCmlmKHQhPW51bGwpcmV0dXJuIHQKdD01MzY4NzA5MTEmNjY0NTk3KkouaGYo
+dGhpcy5hKQp0aGlzLl9oYXNoQ29kZT10CnJldHVybiB0fSwKWjpmdW5jdGlvbihhKXtyZXR1cm4nU3lt
+Ym9sKCInK0guZCh0aGlzLmEpKyciKSd9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJu
+ITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBILnd2JiZ0aGlzLmE9PWIuYX0sCiRpR0Q6MX0KSC5QRC5wcm90
+b3R5cGU9e30KSC5XVS5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwK
+WTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0LmMuYShiKQp0LlFbMV0uYShjKQpILmRj
+KCl9LApnUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucTQoYSxILkxoKHRoaXMpLkMoIk4zPDEsMj4i
+KSl9LApxNDpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMKcmV0dXJuIFAubDAoZnVuY3Rpb24oKXt2YXIg
+cz1hCnZhciByPTAscT0xLHAsbyxuLG0sbApyZXR1cm4gZnVuY3Rpb24gJGFzeW5jJGdQdShjLGQpe2lm
+KGM9PT0xKXtwPWQKcj1xfXdoaWxlKHRydWUpc3dpdGNoKHIpe2Nhc2UgMDpvPXQuZ1YoKSxvPW8uZ2t6
+KG8pLG49SC5MaCh0KSxuPW4uQygiQDwxPiIpLktxKG4uUVsxXSkuQygiTjM8MSwyPiIpCmNhc2UgMjpp
+Zighby5GKCkpe3I9MwpicmVha31tPW8uZ2woKQpsPXQucSgwLG0pCmwudG9TdHJpbmcKcj00CnJldHVy
+biBuZXcgUC5OMyhtLGwsbikKY2FzZSA0OnI9MgpicmVhawpjYXNlIDM6cmV0dXJuIFAuVGgoKQpjYXNl
+IDE6cmV0dXJuIFAuWW0ocCl9fX0sYil9LAokaVowOjF9CkguTFAucHJvdG90eXBlPXsKZ0E6ZnVuY3Rp
+b24oYSl7cmV0dXJuIHRoaXMuYX0sCng0OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIily
+ZXR1cm4hMQppZigiX19wcm90b19fIj09PWEpcmV0dXJuITEKcmV0dXJuIHRoaXMuYi5oYXNPd25Qcm9w
+ZXJ0eShhKX0sCnE6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy54NChiKSlyZXR1cm4gbnVsbApyZXR1cm4g
+dGhpcy5EKGIpfSwKRDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iW0guYyhhKV19LApLOmZ1bmN0aW9u
+KGEsYil7dmFyIHQscyxyLHEscD1ILkxoKHRoaXMpCnAuQygifigxLDIpIikuYShiKQp0PXRoaXMuYwpm
+b3Iocz10Lmxlbmd0aCxwPXAuUVsxXSxyPTA7cjxzOysrcil7cT10W3JdCmIuJDIocSxwLmEodGhpcy5E
+KHEpKSl9fSwKZ1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguWFIodGhpcyxILkxoKHRoaXMpLkMoIlhS
+PDE+IikpfX0KSC5YUi5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hLmMKcmV0
+dXJuIG5ldyBKLm0xKHQsdC5sZW5ndGgsSC50Nih0KS5DKCJtMTwxPiIpKX0sCmdBOmZ1bmN0aW9uKGEp
+e3JldHVybiB0aGlzLmEuYy5sZW5ndGh9fQpILkxJLnByb3RvdHlwZT17CmdXYTpmdW5jdGlvbigpe3Zh
+ciB0PXRoaXMuYQpyZXR1cm4gdH0sCmduZDpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcwppZihw
+LmM9PT0xKXJldHVybiBDLmRuCnQ9cC5kCnM9dC5sZW5ndGgtcC5lLmxlbmd0aC1wLmYKaWYocz09PTAp
+cmV0dXJuIEMuZG4Kcj1bXQpmb3IocT0wO3E8czsrK3Epe2lmKHE+PXQubGVuZ3RoKXJldHVybiBILmso
+dCxxKQpyLnB1c2godFtxXSl9cmV0dXJuIEoudW4ocil9LApnVm06ZnVuY3Rpb24oKXt2YXIgdCxzLHIs
+cSxwLG8sbixtLGw9dGhpcwppZihsLmMhPT0wKXJldHVybiBDLkR4CnQ9bC5lCnM9dC5sZW5ndGgKcj1s
+LmQKcT1yLmxlbmd0aC1zLWwuZgppZihzPT09MClyZXR1cm4gQy5EeApwPW5ldyBILk41KHUuZW8pCmZv
+cihvPTA7bzxzOysrbyl7aWYobz49dC5sZW5ndGgpcmV0dXJuIEguayh0LG8pCm49dFtvXQptPXErbwpp
+ZihtPDB8fG0+PXIubGVuZ3RoKXJldHVybiBILmsocixtKQpwLlkoMCxuZXcgSC53dihuKSxyW21dKX1y
+ZXR1cm4gbmV3IEguUEQocCx1LmdGKX0sCiRpdlE6MX0KSC5Dai5wcm90b3R5cGU9ewokMjpmdW5jdGlv
+bihhLGIpe3ZhciB0CkguYyhhKQp0PXRoaXMuYQp0LmI9dC5iKyIkIitILmQoYSkKQy5ObS5pKHRoaXMu
+YixhKQpDLk5tLmkodGhpcy5jLGIpOysrdC5hfSwKJFM6MTN9CkguZjkucHJvdG90eXBlPXsKcVM6ZnVu
+Y3Rpb24oYSl7dmFyIHQscyxyPXRoaXMscT1uZXcgUmVnRXhwKHIuYSkuZXhlYyhhKQppZihxPT1udWxs
+KXJldHVybiBudWxsCnQ9T2JqZWN0LmNyZWF0ZShudWxsKQpzPXIuYgppZihzIT09LTEpdC5hcmd1bWVu
+dHM9cVtzKzFdCnM9ci5jCmlmKHMhPT0tMSl0LmFyZ3VtZW50c0V4cHI9cVtzKzFdCnM9ci5kCmlmKHMh
+PT0tMSl0LmV4cHI9cVtzKzFdCnM9ci5lCmlmKHMhPT0tMSl0Lm1ldGhvZD1xW3MrMV0Kcz1yLmYKaWYo
+cyE9PS0xKXQucmVjZWl2ZXI9cVtzKzFdCnJldHVybiB0fX0KSC5XMC5wcm90b3R5cGU9ewpaOmZ1bmN0
+aW9uKGEpe3ZhciB0PXRoaXMuYgppZih0PT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIitI
+LmQodGhpcy5hKQpyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK3Qr
+Iicgb24gbnVsbCJ9fQpILmF6LnByb3RvdHlwZT17Clo6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLHI9
+Ik5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIixxPXMuYgppZihxPT1udWxsKXJl
+dHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIitILmQocy5hKQp0PXMuYwppZih0PT1udWxsKXJldHVybiBy
+K3ErIicgKCIrSC5kKHMuYSkrIikiCnJldHVybiByK3ErIicgb24gJyIrdCsiJyAoIitILmQocy5hKSsi
+KSJ9fQpILnZWLnByb3RvdHlwZT17Clo6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybiB0Lmxl
+bmd0aD09PTA/IkVycm9yIjoiRXJyb3I6ICIrdH19CkguYnEucHJvdG90eXBlPXt9CkguQW0ucHJvdG90
+eXBlPXsKJDE6ZnVuY3Rpb24oYSl7aWYodS5XLmIoYSkpaWYoYS4kdGhyb3duSnNFcnJvcj09bnVsbClh
+LiR0aHJvd25Kc0Vycm9yPXRoaXMuYQpyZXR1cm4gYX0sCiRTOjZ9CkguWE8ucHJvdG90eXBlPXsKWjpm
+dW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuYgppZihzIT1udWxsKXJldHVybiBzCnM9dGhpcy5hCnQ9cyE9
+PW51bGwmJnR5cGVvZiBzPT09Im9iamVjdCI/cy5zdGFjazpudWxsCnJldHVybiB0aGlzLmI9dD09bnVs
+bD8iIjp0fSwKJGlHejoxfQpILlRwLnByb3RvdHlwZT17Clo6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5j
+b25zdHJ1Y3RvcixzPXQ9PW51bGw/bnVsbDp0Lm5hbWUKcmV0dXJuIkNsb3N1cmUgJyIrSC5OUShzPT1u
+dWxsPyJ1bmtub3duIjpzKSsiJyJ9LAokaUVIOjEsCmdRbDpmdW5jdGlvbigpe3JldHVybiB0aGlzfSwK
+JEM6IiQxIiwKJFI6MSwKJEQ6bnVsbH0KSC5sYy5wcm90b3R5cGU9e30KSC56eC5wcm90b3R5cGU9ewpa
+OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuJHN0YXRpY19uYW1lCmlmKHQ9PW51bGwpcmV0dXJuIkNsb3N1
+cmUgb2YgdW5rbm93biBzdGF0aWMgbWV0aG9kIgpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHQpKyInIn19
+CkguankucHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzCmlmKGI9PW51bGwpcmV0
+dXJuITEKaWYodD09PWIpcmV0dXJuITAKaWYoIShiIGluc3RhbmNlb2YgSC5qeSkpcmV0dXJuITEKcmV0
+dXJuIHQuYT09PWIuYSYmdC5iPT09Yi5iJiZ0LmM9PT1iLmN9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQs
+cz10aGlzLmMKaWYocz09bnVsbCl0PUguZVEodGhpcy5hKQplbHNlIHQ9dHlwZW9mIHMhPT0ib2JqZWN0
+Ij9KLmhmKHMpOkguZVEocykKcmV0dXJuKHReSC5lUSh0aGlzLmIpKT4+PjB9LApaOmZ1bmN0aW9uKGEp
+e3ZhciB0PXRoaXMuYwppZih0PT1udWxsKXQ9dGhpcy5hCnJldHVybiJDbG9zdXJlICciK0guZCh0aGlz
+LmQpKyInIG9mICIrKCJJbnN0YW5jZSBvZiAnIitILmQoSC5saCh0KSkrIiciKX19CkguRXEucHJvdG90
+eXBlPXsKWjpmdW5jdGlvbihhKXtyZXR1cm4iUnVudGltZUVycm9yOiAiK0guZCh0aGlzLmEpfX0KSC5r
+WS5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3JldHVybiJBc3NlcnRpb24gZmFpbGVkOiAiK1AuaCh0
+aGlzLmEpfX0KSC5ONS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKZ1Y6
+ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguaTUodGhpcyxILkxoKHRoaXMpLkMoImk1PDE+IikpfSwKeDQ6
+ZnVuY3Rpb24oYSl7dmFyIHQscwppZih0eXBlb2YgYT09InN0cmluZyIpe3Q9dGhpcy5iCmlmKHQ9PW51
+bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMuWHUodCxhKX1lbHNle3M9dGhpcy5DWChhKQpyZXR1cm4gc319
+LApDWDpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmQKaWYodD09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhp
+cy5GaCh0aGlzLkJ0KHQsSi5oZihhKSYweDNmZmZmZmYpLGEpPj0wfSwKcTpmdW5jdGlvbihhLGIpe3Zh
+ciB0LHMscixxLHA9dGhpcyxvPW51bGwKaWYodHlwZW9mIGI9PSJzdHJpbmciKXt0PXAuYgppZih0PT1u
+dWxsKXJldHVybiBvCnM9cC5qMih0LGIpCnI9cz09bnVsbD9vOnMuYgpyZXR1cm4gcn1lbHNlIGlmKHR5
+cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3E9cC5jCmlmKHE9PW51bGwpcmV0dXJu
+IG8Kcz1wLmoyKHEsYikKcj1zPT1udWxsP286cy5iCnJldHVybiByfWVsc2UgcmV0dXJuIHAuYWEoYil9
+LAphYTpmdW5jdGlvbihhKXt2YXIgdCxzLHI9dGhpcy5kCmlmKHI9PW51bGwpcmV0dXJuIG51bGwKdD10
+aGlzLkJ0KHIsSi5oZihhKSYweDNmZmZmZmYpCnM9dGhpcy5GaCh0LGEpCmlmKHM8MClyZXR1cm4gbnVs
+bApyZXR1cm4gdFtzXS5ifSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvLG49dGhpcyxt
+PUguTGgobikKbS5jLmEoYikKbS5RWzFdLmEoYykKaWYodHlwZW9mIGI9PSJzdHJpbmciKXt0PW4uYgpu
+LkVIKHQ9PW51bGw/bi5iPW4ueksoKTp0LGIsYyl9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihi
+JjB4M2ZmZmZmZik9PT1iKXtzPW4uYwpuLkVIKHM9PW51bGw/bi5jPW4ueksoKTpzLGIsYyl9ZWxzZXty
+PW4uZAppZihyPT1udWxsKXI9bi5kPW4ueksoKQpxPUouaGYoYikmMHgzZmZmZmZmCnA9bi5CdChyLHEp
+CmlmKHA9PW51bGwpbi5FSShyLHEsW24uSG4oYixjKV0pCmVsc2V7bz1uLkZoKHAsYikKaWYobz49MClw
+W29dLmI9YwplbHNlIHAucHVzaChuLkhuKGIsYykpfX19LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxy
+PXRoaXMKSC5MaChyKS5DKCJ+KDEsMikiKS5hKGIpCnQ9ci5lCnM9ci5yCmZvcig7dCE9bnVsbDspe2Iu
+JDIodC5hLHQuYikKaWYocyE9PXIucil0aHJvdyBILmIoUC5hNChyKSkKdD10LmN9fSwKRUg6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0LHM9dGhpcyxyPUguTGgocykKci5jLmEoYikKci5RWzFdLmEoYykKdD1zLmoy
+KGEsYikKaWYodD09bnVsbClzLkVJKGEsYixzLkhuKGIsYykpCmVsc2UgdC5iPWN9LAprczpmdW5jdGlv
+bigpe3RoaXMucj10aGlzLnIrMSY2NzEwODg2M30sCkhuOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcyxz
+PUguTGgodCkscj1uZXcgSC5kYihzLmMuYShhKSxzLlFbMV0uYShiKSkKaWYodC5lPT1udWxsKXQuZT10
+LmY9cgplbHNle3M9dC5mCnMudG9TdHJpbmcKci5kPXMKdC5mPXMuYz1yfSsrdC5hCnQua3MoKQpyZXR1
+cm4gcn0sCkZoOmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZihhPT1udWxsKXJldHVybi0xCnQ9YS5sZW5n
+dGgKZm9yKHM9MDtzPHQ7KytzKWlmKEouUk0oYVtzXS5hLGIpKXJldHVybiBzCnJldHVybi0xfSwKWjpm
+dW5jdGlvbihhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCmoyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbYl19
+LApCdDpmdW5jdGlvbihhLGIpe3JldHVybiBhW2JdfSwKRUk6ZnVuY3Rpb24oYSxiLGMpe2FbYl09Y30s
+CnJuOmZ1bmN0aW9uKGEsYil7ZGVsZXRlIGFbYl19LApYdTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlz
+LmoyKGEsYikhPW51bGx9LAp6SzpmdW5jdGlvbigpe3ZhciB0PSI8bm9uLWlkZW50aWZpZXIta2V5PiIs
+cz1PYmplY3QuY3JlYXRlKG51bGwpCnRoaXMuRUkocyx0LHMpCnRoaXMucm4ocyx0KQpyZXR1cm4gc30s
+CiRpRm86MX0KSC5kYi5wcm90b3R5cGU9e30KSC5pNS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXty
+ZXR1cm4gdGhpcy5hLmF9LApna3o6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hLHM9bmV3IEguTjYodCx0
+LnIsdGhpcy4kdGkuQygiTjY8MT4iKSkKcy5jPXQuZQpyZXR1cm4gc30sCnRnOmZ1bmN0aW9uKGEsYil7
+cmV0dXJuIHRoaXMuYS54NChiKX19CkguTjYucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4g
+dGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciB0LHM9dGhpcyxyPXMuYQppZihzLmIhPT1yLnIpdGhyb3cg
+SC5iKFAuYTQocikpCnQ9cy5jCmlmKHQ9PW51bGwpe3Muc3FZKG51bGwpCnJldHVybiExfWVsc2V7cy5z
+cVkodC5hKQpzLmM9dC5jCnJldHVybiEwfX0sCnNxWTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGku
+Yy5hKGEpfSwKJGlBbjoxfQpILnIucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+YShhKX0sCiRTOjZ9CkguZEMucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5h
+KGEsYil9LAokUzoyNn0KSC53Ti5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5h
+KEguYyhhKSl9LAokUzoyMX0KSC5WUi5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3JldHVybiJSZWdF
+eHAvIit0aGlzLmErIi8iK3RoaXMuYi5mbGFnc30sCmdIYzpmdW5jdGlvbigpe3ZhciB0PXRoaXMscz10
+LmMKaWYocyE9bnVsbClyZXR1cm4gcwpzPXQuYgpyZXR1cm4gdC5jPUgudjQodC5hLHMubXVsdGlsaW5l
+LCFzLmlnbm9yZUNhc2Uscy51bmljb2RlLHMuZG90QWxsLCEwKX0sCmRkOmZ1bmN0aW9uKGEsYil7cmV0
+dXJuIG5ldyBILktXKHRoaXMsYiwwKX0sClVaOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzLmdIYygp
+CnMubGFzdEluZGV4PWIKdD1zLmV4ZWMoYSkKaWYodD09bnVsbClyZXR1cm4gbnVsbApyZXR1cm4gbmV3
+IEguRUsodCl9LAokaXZYOjEsCiRpd0w6MX0KSC5FSy5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7
+dmFyIHQKSC5XWShiKQp0PXRoaXMuYgppZihiPj10Lmxlbmd0aClyZXR1cm4gSC5rKHQsYikKcmV0dXJu
+IHRbYl19LAokaU9kOjEsCiRpaWI6MX0KSC5LVy5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7cmV0
+dXJuIG5ldyBILlBiKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX19CkguUGIucHJvdG90eXBlPXsKZ2w6ZnVu
+Y3Rpb24oKXt2YXIgdD10aGlzLmQKdC50b1N0cmluZwpyZXR1cm4gdH0sCkY6ZnVuY3Rpb24oKXt2YXIg
+dCxzLHIscSxwLG8sbj10aGlzLG09bi5iCmlmKG09PW51bGwpcmV0dXJuITEKdD1uLmMKcz1tLmxlbmd0
+aAppZih0PD1zKXtyPW4uYQpxPXIuVVoobSx0KQppZihxIT1udWxsKXtuLmQ9cQp0PXEuYgpwPXQuaW5k
+ZXgKbz1wK3RbMF0ubGVuZ3RoCmlmKHA9PT1vKXtpZihyLmIudW5pY29kZSl7dD1uLmMKcj10KzEKaWYo
+cjxzKXt0PUMueEIubShtLHQpCmlmKHQ+PTU1Mjk2JiZ0PD01NjMxOSl7dD1DLnhCLm0obSxyKQp0PXQ+
+PTU2MzIwJiZ0PD01NzM0M31lbHNlIHQ9ITF9ZWxzZSB0PSExfWVsc2UgdD0hMQpvPSh0P28rMTpvKSsx
+fW4uYz1vCnJldHVybiEwfX1uLmI9bi5kPW51bGwKcmV0dXJuITF9LAokaUFuOjF9CkgudFEucHJvdG90
+eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guV1koYikKaWYoYiE9PTApSC52aChQLk83KGIsbnVsbCkpCnJl
+dHVybiB0aGlzLmN9LAokaU9kOjF9CkguTkYucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3JldHVy
+biBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpILlNkLnByb3RvdHlwZT17CkY6ZnVuY3Rp
+b24oKXt2YXIgdCxzLHI9dGhpcyxxPXIuYyxwPXIuYixvPXAubGVuZ3RoLG49ci5hLG09bi5sZW5ndGgK
+aWYocStvPm0pe3IuZD1udWxsCnJldHVybiExfXQ9bi5pbmRleE9mKHAscSkKaWYodDwwKXtyLmM9bSsx
+CnIuZD1udWxsCnJldHVybiExfXM9dCtvCnIuZD1uZXcgSC50USh0LHApCnIuYz1zPT09ci5jP3MrMTpz
+CnJldHVybiEwfSwKZ2w6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmQKdC50b1N0cmluZwpyZXR1cm4gdH0s
+CiRpQW46MX0KSC5wRi5wcm90b3R5cGU9eyRpcEY6MSwkaUFTOjF9CkguYjAucHJvdG90eXBlPXsKZ0E6
+ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKJGlYajoxfQpILkRnLnByb3RvdHlwZT17CnE6ZnVu
+Y3Rpb24oYSxiKXtILldZKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sClk6ZnVuY3Rp
+b24oYSxiLGMpe0guZGooYykKSC5vZChiLGEsYS5sZW5ndGgpCmFbYl09Y30sCiRpYlE6MSwKJGljWDox
+LAokaXpNOjF9CkguUGcucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC5XWShjKQpILm9kKGIs
+YSxhLmxlbmd0aCkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0KSC54ai5wcm90b3R5cGU9
+ewpxOmZ1bmN0aW9uKGEsYil7SC5XWShiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpI
+LmRFLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILldZKGIpCkgub2QoYixhLGEubGVuZ3RoKQpy
+ZXR1cm4gYVtiXX19CkguWkEucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guV1koYikKSC5vZChi
+LGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC53Zi5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7
+SC5XWShiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlBxLnByb3RvdHlwZT17CnE6
+ZnVuY3Rpb24oYSxiKXtILldZKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZUUu
+cHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIp
+e0guV1koYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5WNi5wcm90b3R5cGU9ewpn
+QTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC5XWShiKQpILm9k
+KGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LAokaVY2OjEsCiRpbjY6MX0KSC5SRy5wcm90b3R5cGU9
+e30KSC5WUC5wcm90b3R5cGU9e30KSC5XQi5wcm90b3R5cGU9e30KSC5aRy5wcm90b3R5cGU9e30KSC5K
+Yy5wcm90b3R5cGU9ewpDOmZ1bmN0aW9uKGEpe3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLHRoaXMs
+YSl9LApLcTpmdW5jdGlvbihhKXtyZXR1cm4gSC52NSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfX0KSC5F
+VC5wcm90b3R5cGU9e30KSC51OS5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9
+fQpILngucHJvdG90eXBlPXt9ClAudGgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhp
+cy5hLHM9dC5hCnQuYT1udWxsCnMuJDAoKX0sCiRTOjEyfQpQLmhhLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3ZhciB0LHMKdGhpcy5hLmE9dS5NLmEoYSkKdD10aGlzLmIKcz10aGlzLmMKdC5maXJzdENo
+aWxkP3QucmVtb3ZlQ2hpbGQocyk6dC5hcHBlbmRDaGlsZChzKX0sCiRTOjQ1fQpQLlZzLnByb3RvdHlw
+ZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLiQwKCl9LAokQzoiJDAiLAokUjowLAokUzowfQpQLkZ0LnBy
+b3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLiQwKCl9LAokQzoiJDAiLAokUjowLAokUzowfQpQ
+LlczLnByb3RvdHlwZT17CkNZOmZ1bmN0aW9uKGEsYil7aWYoc2VsZi5zZXRUaW1lb3V0IT1udWxsKXNl
+bGYuc2V0VGltZW91dChILnRSKG5ldyBQLnlIKHRoaXMsYiksMCksYSkKZWxzZSB0aHJvdyBILmIoUC5M
+NCgiYHNldFRpbWVvdXQoKWAgbm90IGZvdW5kLiIpKX19ClAueUgucHJvdG90eXBlPXsKJDA6ZnVuY3Rp
+b24oKXt0aGlzLmIuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjF9ClAuaWgucHJvdG90eXBlPXsKYU06
+ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9dGhpcy4kdGkKci5DKCIxLyIpLmEoYikKdD0hdGhpcy5ifHxy
+LkMoImI4PDE+IikuYihiKQpzPXRoaXMuYQppZih0KXMuWGYoYikKZWxzZSBzLlgyKHIuYy5hKGIpKX0s
+CncwOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYj09bnVsbCliPVAudjAoYSkKdD10aGlzLmEKaWYodGhp
+cy5iKXQuWkwoYSxiKQplbHNlIHQuTmsoYSxiKX19ClAuV00ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24o
+YSl7cmV0dXJuIHRoaXMuYS4kMigwLGEpfSwKJFM6Mjd9ClAuU1gucHJvdG90eXBlPXsKJDI6ZnVuY3Rp
+b24oYSxiKXt0aGlzLmEuJDIoMSxuZXcgSC5icShhLHUubC5hKGIpKSl9LAokQzoiJDIiLAokUjoyLAok
+UzoyOX0KUC5Hcy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYShILldZKGEpLGIpfSwK
+JFM6MzB9ClAuRnkucHJvdG90eXBlPXsKWjpmdW5jdGlvbihhKXtyZXR1cm4iSXRlcmF0aW9uTWFya2Vy
+KCIrdGhpcy5iKyIsICIrSC5kKHRoaXMuYSkrIikifX0KUC5HVi5wcm90b3R5cGU9ewpnbDpmdW5jdGlv
+bigpe3ZhciB0PXRoaXMuYyxzPXQhPW51bGw/dC5nbCgpOnRoaXMuYgpyZXR1cm4gdGhpcy4kdGkuYy5h
+KHMpfSwKRjpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbz10aGlzCmZvcig7ITA7KXt0PW8uYwppZih0
+IT1udWxsKWlmKHQuRigpKXJldHVybiEwCmVsc2Ugby5jPW51bGwKcz1mdW5jdGlvbihhLGIsYyl7dmFy
+IG4sbT1iCndoaWxlKHRydWUpdHJ5e3JldHVybiBhKG0sbil9Y2F0Y2gobCl7bj1sCm09Y319KG8uYSww
+LDEpCmlmKHMgaW5zdGFuY2VvZiBQLkZ5KXtyPXMuYgppZihyPT09Mil7cT1vLmQKaWYocT09bnVsbHx8
+cS5sZW5ndGg9PT0wKXtvLnNFQyhudWxsKQpyZXR1cm4hMX1pZigwPj1xLmxlbmd0aClyZXR1cm4gSC5r
+KHEsLTEpCm8uYT1xLnBvcCgpCmNvbnRpbnVlfWVsc2V7dD1zLmEKaWYocj09PTMpdGhyb3cgdAplbHNl
+e3A9Si5JVCh0KQppZihwIGluc3RhbmNlb2YgUC5HVil7dD1vLmQKaWYodD09bnVsbCl0PW8uZD1bXQpD
+Lk5tLmkodCxvLmEpCm8uYT1wLmEKY29udGludWV9ZWxzZXtvLmM9cApjb250aW51ZX19fX1lbHNle28u
+c0VDKHMpCnJldHVybiEwfX1yZXR1cm4hMX0sCnNFQzpmdW5jdGlvbihhKXt0aGlzLmI9dGhpcy4kdGku
+Yy5hKGEpfSwKJGlBbjoxfQpQLnE0LnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3
+IFAuR1YodGhpcy5hKCksdGhpcy4kdGkuQygiR1Y8MT4iKSl9fQpQLmI4LnByb3RvdHlwZT17fQpQLlBm
+LnByb3RvdHlwZT17CncwOmZ1bmN0aW9uKGEsYil7dmFyIHQKUC5VSShhLCJlcnJvciIsdS5LKQp0PXRo
+aXMuYQppZih0LmEhPT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkK
+aWYoYj09bnVsbCliPVAudjAoYSkKdC5OayhhLGIpfSwKcG06ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+dzAoYSxudWxsKX19ClAuWmYucHJvdG90eXBlPXsKYU06ZnVuY3Rpb24oYSxiKXt2YXIgdAp0aGlzLiR0
+aS5DKCIxLyIpLmEoYikKdD10aGlzLmEKaWYodC5hIT09MCl0aHJvdyBILmIoUC5QVigiRnV0dXJlIGFs
+cmVhZHkgY29tcGxldGVkIikpCnQuWGYoYil9fQpQLkZlLnByb3RvdHlwZT17CkhSOmZ1bmN0aW9uKGEp
+e2lmKCh0aGlzLmMmMTUpIT09NilyZXR1cm4hMApyZXR1cm4gdGhpcy5iLmIuYnYodS5tLmEodGhpcy5k
+KSxhLmEsdS55LHUuSyl9LApLdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmUscz11Lnoscj11LksscT10
+aGlzLiR0aS5DKCIyLyIpLHA9dGhpcy5iLmIKaWYodS5hZy5iKHQpKXJldHVybiBxLmEocC5ycCh0LGEu
+YSxhLmIscyxyLHUubCkpCmVsc2UgcmV0dXJuIHEuYShwLmJ2KHUuYkkuYSh0KSxhLmEscyxyKSl9fQpQ
+LnZzLnByb3RvdHlwZT17ClNxOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscT10aGlzLiR0aQpxLktx
+KGMpLkMoIjEvKDIpIikuYShhKQp0PSQuWDMKaWYodCE9PUMuTlUpe2MuQygiQDwwLz4iKS5LcShxLmMp
+LkMoIjEoMikiKS5hKGEpCmlmKGIhPW51bGwpYj1QLlZIKGIsdCl9cz1uZXcgUC52cygkLlgzLGMuQygi
+dnM8MD4iKSkKcj1iPT1udWxsPzE6Mwp0aGlzLnhmKG5ldyBQLkZlKHMscixhLGIscS5DKCJAPDE+Iiku
+S3EoYykuQygiRmU8MSwyPiIpKSkKcmV0dXJuIHN9LApXNzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlz
+LlNxKGEsbnVsbCxiKX0sClFkOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPXRoaXMuJHRpCnMuS3EoYyku
+QygiMS8oMikiKS5hKGEpCnQ9bmV3IFAudnMoJC5YMyxjLkMoInZzPDA+IikpCnRoaXMueGYobmV3IFAu
+RmUodCwxOSxhLGIscy5DKCJAPDE+IikuS3EoYykuQygiRmU8MSwyPiIpKSkKcmV0dXJuIHR9LApPQTpm
+dW5jdGlvbihhKXt2YXIgdCxzLHIKdS5tLmEobnVsbCkKdD10aGlzLiR0aQpzPSQuWDMKcj1uZXcgUC52
+cyhzLHQpCmlmKHMhPT1DLk5VKWE9UC5WSChhLHMpCnRoaXMueGYobmV3IFAuRmUociwyLG51bGwsYSx0
+LkMoIkA8MT4iKS5LcSh0LmMpLkMoIkZlPDEsMj4iKSkpCnJldHVybiByfSwKeGY6ZnVuY3Rpb24oYSl7
+dmFyIHQscz10aGlzLHI9cy5hCmlmKHI8PTEpe2EuYT11LnguYShzLmMpCnMuYz1hfWVsc2V7aWYocj09
+PTIpe3Q9dS5fLmEocy5jKQpyPXQuYQppZihyPDQpe3QueGYoYSkKcmV0dXJufXMuYT1yCnMuYz10LmN9
+UC5UayhudWxsLG51bGwscy5iLHUuTS5hKG5ldyBQLmRhKHMsYSkpKX19LApqUTpmdW5jdGlvbihhKXt2
+YXIgdCxzLHIscSxwLG8sbj10aGlzLG09e30KbS5hPWEKaWYoYT09bnVsbClyZXR1cm4KdD1uLmEKaWYo
+dDw9MSl7cz11LnguYShuLmMpCm4uYz1hCmlmKHMhPW51bGwpe3I9YS5hCmZvcihxPWE7ciE9bnVsbDtx
+PXIscj1wKXA9ci5hCnEuYT1zfX1lbHNle2lmKHQ9PT0yKXtvPXUuXy5hKG4uYykKdD1vLmEKaWYodDw0
+KXtvLmpRKGEpCnJldHVybn1uLmE9dApuLmM9by5jfW0uYT1uLk44KGEpClAuVGsobnVsbCxudWxsLG4u
+Yix1Lk0uYShuZXcgUC5vUShtLG4pKSl9fSwKYWg6ZnVuY3Rpb24oKXt2YXIgdD11LnguYSh0aGlzLmMp
+CnRoaXMuYz1udWxsCnJldHVybiB0aGlzLk44KHQpfSwKTjg6ZnVuY3Rpb24oYSl7dmFyIHQscyxyCmZv
+cih0PWEscz1udWxsO3QhPW51bGw7cz10LHQ9cil7cj10LmEKdC5hPXN9cmV0dXJuIHN9LApISDpmdW5j
+dGlvbihhKXt2YXIgdCxzPXRoaXMscj1zLiR0aQpyLkMoIjEvIikuYShhKQppZihyLkMoImI4PDE+Iiku
+YihhKSlpZihyLmIoYSkpUC5BOShhLHMpCmVsc2UgUC5rMyhhLHMpCmVsc2V7dD1zLmFoKCkKcj1yLmMK
+YT1yLmEoci5hKGEpKQpzLmE9NApzLmM9YQpQLkhaKHMsdCl9fSwKWDI6ZnVuY3Rpb24oYSl7dmFyIHQs
+cz10aGlzCnMuJHRpLmMuYShhKQp0PXMuYWgoKQpzLmE9NApzLmM9YQpQLkhaKHMsdCl9LApaTDpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscj10aGlzCnUubC5hKGIpCnQ9ci5haCgpCnM9UC5UbChhLGIpCnIuYT04
+CnIuYz1zClAuSFoocix0KX0sClhmOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMoIjEv
+IikuYShhKQppZihzLkMoImI4PDE+IikuYihhKSl7dC5jVShhKQpyZXR1cm59dC5hPTEKUC5UayhudWxs
+LG51bGwsdC5iLHUuTS5hKG5ldyBQLnJIKHQsYSkpKX0sCmNVOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMs
+cz10LiR0aQpzLkMoImI4PDE+IikuYShhKQppZihzLmIoYSkpe2lmKGEuYT09PTgpe3QuYT0xClAuVGso
+bnVsbCxudWxsLHQuYix1Lk0uYShuZXcgUC5LRih0LGEpKSl9ZWxzZSBQLkE5KGEsdCkKcmV0dXJufVAu
+azMoYSx0KX0sCk5rOmZ1bmN0aW9uKGEsYil7dGhpcy5hPTEKUC5UayhudWxsLG51bGwsdGhpcy5iLHUu
+TS5hKG5ldyBQLlpMKHRoaXMsYSxiKSkpfSwKJGliODoxfQpQLmRhLnByb3RvdHlwZT17CiQwOmZ1bmN0
+aW9uKCl7UC5IWih0aGlzLmEsdGhpcy5iKX0sCiRTOjB9ClAub1EucHJvdG90eXBlPXsKJDA6ZnVuY3Rp
+b24oKXtQLkhaKHRoaXMuYix0aGlzLmEuYSl9LAokUzowfQpQLnBWLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3ZhciB0PXRoaXMuYQp0LmE9MAp0LkhIKGEpfSwKJFM6MTJ9ClAuVTcucHJvdG90eXBlPXsK
+JDI6ZnVuY3Rpb24oYSxiKXt1LmwuYShiKQp0aGlzLmEuWkwoYSxiKX0sCiRDOiIkMiIsCiRSOjIsCiRT
+OjM0fQpQLnZyLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlzLmMp
+fSwKJFM6MH0KUC5ySC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYQp0LlgyKHQu
+JHRpLmMuYSh0aGlzLmIpKX0sCiRTOjB9ClAuS0YucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkE5
+KHRoaXMuYix0aGlzLmEpfSwKJFM6MH0KUC5aTC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMu
+YS5aTCh0aGlzLmIsdGhpcy5jKX0sCiRTOjB9ClAuUlQucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2
+YXIgdCxzLHIscSxwLG8sbj10aGlzLG09bnVsbAp0cnl7cj1uLmEuYQptPXIuYi5iLnp6KHUuZk8uYShy
+LmQpLHUueil9Y2F0Y2gocSl7dD1ILlJ1KHEpCnM9SC50cyhxKQppZihuLmMpe3I9dS5uLmEobi5iLmEu
+YykuYQpwPXQKcD1yPT1udWxsP3A9PW51bGw6cj09PXAKcj1wfWVsc2Ugcj0hMQpwPW4uYQppZihyKXAu
+Yz11Lm4uYShuLmIuYS5jKQplbHNlIHAuYz1QLlRsKHQscykKcC5iPSEwCnJldHVybn1pZih1LmMuYiht
+KSl7aWYobSBpbnN0YW5jZW9mIFAudnMmJm0uYT49NCl7aWYobS5hPT09OCl7cj1uLmEKci5jPXUubi5h
+KG0uYykKci5iPSEwfXJldHVybn1vPW4uYi5hCnI9bi5hCnIuYz1tLlc3KG5ldyBQLmpaKG8pLHUueikK
+ci5iPSExfX0sCiRTOjF9ClAualoucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+YX0sCiRTOjM4fQpQLnJxLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscCxvLG4s
+bQp0cnl7cj10aGlzLmEKcT1yLmEKcD1xLiR0aQpvPXAuYwpuPW8uYSh0aGlzLmIpCnIuYz1xLmIuYi5i
+dihwLkMoIjIvKDEpIikuYShxLmQpLG4scC5DKCIyLyIpLG8pfWNhdGNoKG0pe3Q9SC5SdShtKQpzPUgu
+dHMobSkKcj10aGlzLmEKci5jPVAuVGwodCxzKQpyLmI9ITB9fSwKJFM6MX0KUC5SVy5wcm90b3R5cGU9
+ewokMDpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbyxuLG0sbD10aGlzCnRyeXt0PXUubi5hKGwuYS5h
+LmMpCnE9bC5iCmlmKEgub1QocS5hLkhSKHQpKSYmcS5hLmUhPW51bGwpe3EuYz1xLmEuS3codCkKcS5i
+PSExfX1jYXRjaChwKXtzPUguUnUocCkKcj1ILnRzKHApCnE9dS5uLmEobC5hLmEuYykKbz1xLmEKbj1z
+Cm09bC5iCmlmKG89PW51bGw/bj09bnVsbDpvPT09biltLmM9cQplbHNlIG0uYz1QLlRsKHMscikKbS5i
+PSEwfX0sCiRTOjF9ClAuT00ucHJvdG90eXBlPXt9ClAucWgucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24o
+YSl7dmFyIHQscyxyPXRoaXMscT17fSxwPW5ldyBQLnZzKCQuWDMsdS5mSikKcS5hPTAKdD1ILkxoKHIp
+CnM9dC5DKCJ+KDEpIikuYShuZXcgUC5CNShxLHIpKQp1Lk0uYShuZXcgUC51TyhxLHApKQpXLkpFKHIu
+YSxyLmIscywhMSx0LmMpCnJldHVybiBwfX0KUC5CNS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtI
+LkxoKHRoaXMuYikuYy5hKGEpOysrdGhpcy5hLmF9LAokUzpmdW5jdGlvbigpe3JldHVybiBILkxoKHRo
+aXMuYikuQygiYzgoMSkiKX19ClAudU8ucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmIuSEgo
+dGhpcy5hLmEpfSwKJFM6MH0KUC5NTy5wcm90b3R5cGU9e30KUC5rVC5wcm90b3R5cGU9e30KUC54SS5w
+cm90b3R5cGU9e30KUC5PSC5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5h
+KX0sCiRpWFM6MSwKZ0lJOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYn19ClAubTAucHJvdG90eXBlPXsk
+aUpCOjF9ClAucEsucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdD1ILmIodGhpcy5hKQp0LnN0
+YWNrPUouQWModGhpcy5iKQp0aHJvdyB0fSwKJFM6MH0KUC5KaS5wcm90b3R5cGU9ewpiSDpmdW5jdGlv
+bihhKXt2YXIgdCxzLHIscT1udWxsCnUuTS5hKGEpCnRyeXtpZihDLk5VPT09JC5YMyl7YS4kMCgpCnJl
+dHVybn1QLlQ4KHEscSx0aGlzLGEsdS5IKX1jYXRjaChyKXt0PUguUnUocikKcz1ILnRzKHIpClAuTDIo
+cSxxLHRoaXMsdCx1LmwuYShzKSl9fSwKRGw6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxPW51bGwK
+Yy5DKCJ+KDApIikuYShhKQpjLmEoYikKdHJ5e2lmKEMuTlU9PT0kLlgzKXthLiQxKGIpCnJldHVybn1Q
+Lnl2KHEscSx0aGlzLGEsYix1LkgsYyl9Y2F0Y2gocil7dD1ILlJ1KHIpCnM9SC50cyhyKQpQLkwyKHEs
+cSx0aGlzLHQsdS5sLmEocykpfX0sClJUOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLmhqKHRoaXMs
+Yi5DKCIwKCkiKS5hKGEpLGIpfSwKR1k6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlZwKHRoaXMsdS5N
+LmEoYSkpfSwKUHk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAuT1IodGhpcyxiLkMoIn4oMCkiKS5h
+KGEpLGIpfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsfSwKeno6ZnVuY3Rpb24oYSxiKXtiLkMo
+IjAoKSIpLmEoYSkKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDAoKQpyZXR1cm4gUC5UOChudWxsLG51
+bGwsdGhpcyxhLGIpfSwKYnY6ZnVuY3Rpb24oYSxiLGMsZCl7Yy5DKCJAPDA+IikuS3EoZCkuQygiMSgy
+KSIpLmEoYSkKZC5hKGIpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQxKGIpCnJldHVybiBQLnl2KG51
+bGwsbnVsbCx0aGlzLGEsYixjLGQpfSwKcnA6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2QuQygiQDwwPiIp
+LktxKGUpLktxKGYpLkMoIjEoMiwzKSIpLmEoYSkKZS5hKGIpCmYuYShjKQppZigkLlgzPT09Qy5OVSly
+ZXR1cm4gYS4kMihiLGMpCnJldHVybiBQLlF4KG51bGwsbnVsbCx0aGlzLGEsYixjLGQsZSxmKX0sCkxq
+OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiLkMoIkA8MD4iKS5LcShjKS5LcShkKS5DKCIxKDIsMyki
+KS5hKGEpfX0KUC5oai5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuenoodGhp
+cy5iLHRoaXMuYyl9LAokUzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMuQygiMCgpIil9fQpQLlZwLnBy
+b3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5iSCh0aGlzLmIpfSwKJFM6MX0KUC5P
+Ui5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmMKcmV0dXJuIHRoaXMuYS5EbCh0
+aGlzLmIsdC5hKGEpLHQpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLkMoIn4oMCkiKX19ClAu
+YjYucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz1uZXcgUC5sbSh0LHQucixI
+LkxoKHQpLkMoImxtPDE+IikpCnMuYz10LmUKcmV0dXJuIHN9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5hfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9
+PSJfX3Byb3RvX18iKXt0PXRoaXMuYgppZih0PT1udWxsKXJldHVybiExCnJldHVybiB1LkouYSh0W2Jd
+KSE9bnVsbH1lbHNle3M9dGhpcy5QUihiKQpyZXR1cm4gc319LApQUjpmdW5jdGlvbihhKXt2YXIgdD10
+aGlzLmQKaWYodD09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhpcy5ERih0W3RoaXMuTihhKV0sYSk+PTB9
+LAppOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXRoaXMKSC5MaChyKS5jLmEoYikKaWYodHlwZW9mIGI9
+PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIpe3Q9ci5iCnJldHVybiByLlModD09bnVsbD9yLmI9UC5U
+MigpOnQsYil9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjEwNzM3NDE4MjMpPT09Yil7cz1y
+LmMKcmV0dXJuIHIuUyhzPT1udWxsP3IuYz1QLlQyKCk6cyxiKX1lbHNlIHJldHVybiByLkI3KGIpfSwK
+Qjc6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9dGhpcwpILkxoKHEpLmMuYShhKQp0PXEuZAppZih0PT1u
+dWxsKXQ9cS5kPVAuVDIoKQpzPXEuTihhKQpyPXRbc10KaWYocj09bnVsbCl0W3NdPVtxLnlvKGEpXQpl
+bHNle2lmKHEuREYocixhKT49MClyZXR1cm4hMQpyLnB1c2gocS55byhhKSl9cmV0dXJuITB9LApSOmZ1
+bmN0aW9uKGEsYil7dmFyIHQ9dGhpcwppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19f
+IilyZXR1cm4gdC5INCh0LmIsYikKZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjEwNzM3NDE4
+MjMpPT09YilyZXR1cm4gdC5INCh0LmMsYikKZWxzZSByZXR1cm4gdC5xZyhiKX0sCnFnOmZ1bmN0aW9u
+KGEpe3ZhciB0LHMscixxLHA9dGhpcyxvPXAuZAppZihvPT1udWxsKXJldHVybiExCnQ9cC5OKGEpCnM9
+b1t0XQpyPXAuREYocyxhKQppZihyPDApcmV0dXJuITEKcT1zLnNwbGljZShyLDEpWzBdCmlmKDA9PT1z
+Lmxlbmd0aClkZWxldGUgb1t0XQpwLkdTKHEpCnJldHVybiEwfSwKUzpmdW5jdGlvbihhLGIpe0guTGgo
+dGhpcykuYy5hKGIpCmlmKHUuSi5hKGFbYl0pIT1udWxsKXJldHVybiExCmFbYl09dGhpcy55byhiKQpy
+ZXR1cm4hMH0sCkg0OmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYT09bnVsbClyZXR1cm4hMQp0PXUuSi5h
+KGFbYl0pCmlmKHQ9PW51bGwpcmV0dXJuITEKdGhpcy5HUyh0KQpkZWxldGUgYVtiXQpyZXR1cm4hMH0s
+Clg6ZnVuY3Rpb24oKXt0aGlzLnI9MTA3Mzc0MTgyMyZ0aGlzLnIrMX0sCnlvOmZ1bmN0aW9uKGEpe3Zh
+ciB0LHM9dGhpcyxyPW5ldyBQLmJuKEguTGgocykuYy5hKGEpKQppZihzLmU9PW51bGwpcy5lPXMuZj1y
+CmVsc2V7dD1zLmYKdC50b1N0cmluZwpyLmM9dApzLmY9dC5iPXJ9KytzLmEKcy5YKCkKcmV0dXJuIHJ9
+LApHUzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLHM9YS5jLHI9YS5iCmlmKHM9PW51bGwpdC5lPXIKZWxz
+ZSBzLmI9cgppZihyPT1udWxsKXQuZj1zCmVsc2Ugci5jPXM7LS10LmEKdC5YKCl9LApOOmZ1bmN0aW9u
+KGEpe3JldHVybiBKLmhmKGEpJjEwNzM3NDE4MjN9LApERjpmdW5jdGlvbihhLGIpe3ZhciB0LHMKaWYo
+YT09bnVsbClyZXR1cm4tMQp0PWEubGVuZ3RoCmZvcihzPTA7czx0OysrcylpZihKLlJNKGFbc10uYSxi
+KSlyZXR1cm4gcwpyZXR1cm4tMX19ClAuYm4ucHJvdG90eXBlPXt9ClAubG0ucHJvdG90eXBlPXsKZ2w6
+ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciB0PXRoaXMscz10LmMscj10
+LmEKaWYodC5iIT09ci5yKXRocm93IEguYihQLmE0KHIpKQplbHNlIGlmKHM9PW51bGwpe3Quc2oobnVs
+bCkKcmV0dXJuITF9ZWxzZXt0LnNqKHQuJHRpLmMuYShzLmEpKQp0LmM9cy5iCnJldHVybiEwfX0sCnNq
+OmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5jLmEoYSl9LAokaUFuOjF9ClAubVcucHJvdG90eXBl
+PXt9ClAuTFUucHJvdG90eXBlPXskaWJROjEsJGljWDoxLCRpek06MX0KUC5sRC5wcm90b3R5cGU9ewpn
+a3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmE3KGEsdGhpcy5nQShhKSxILnEoYSkuQygiYTc8bEQu
+RT4iKSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucShhLGIpfSwKSzpmdW5jdGlvbihhLGIp
+e3ZhciB0LHMKSC5xKGEpLkMoIn4obEQuRSkiKS5hKGIpCnQ9dGhpcy5nQShhKQpmb3Iocz0wO3M8dDsr
+K3Mpe2IuJDEodGhpcy5xKGEscykpCmlmKHQhPT10aGlzLmdBKGEpKXRocm93IEguYihQLmE0KGEpKX19
+LApFMjpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5xKGEpCnJldHVybiBuZXcgSC5sSihhLHQuS3EoYyku
+QygiMShsRC5FKSIpLmEoYiksdC5DKCJAPGxELkU+IikuS3EoYykuQygibEo8MSwyPiIpKX0sCmR1OmZ1
+bmN0aW9uKGEsYixjLGQpe3ZhciB0CkgucShhKS5DKCJsRC5FIikuYShkKQpQLmpCKGIsYyx0aGlzLmdB
+KGEpKQpmb3IodD1iO3Q8YzsrK3QpdGhpcy5ZKGEsdCxkKX0sClo6ZnVuY3Rpb24oYSl7cmV0dXJuIFAu
+V0UoYSwiWyIsIl0iKX19ClAuaWwucHJvdG90eXBlPXt9ClAucmEucHJvdG90eXBlPXsKJDI6ZnVuY3Rp
+b24oYSxiKXt2YXIgdCxzPXRoaXMuYQppZighcy5hKXRoaXMuYi5hKz0iLCAiCnMuYT0hMQpzPXRoaXMu
+Ygp0PXMuYSs9SC5kKGEpCnMuYT10KyI6ICIKcy5hKz1ILmQoYil9LAokUzozOX0KUC5Zay5wcm90b3R5
+cGU9ewpLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILkxoKHRoaXMpLkMoIn4oWWsuSyxZay5WKSIpLmEo
+YikKZm9yKHQ9Si5JVCh0aGlzLmdWKCkpO3QuRigpOyl7cz10LmdsKCkKYi4kMihzLHRoaXMucSgwLHMp
+KX19LApnUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTTEodGhpcy5nVigpLG5ldyBQLnlRKHRoaXMpLEgu
+TGgodGhpcykuQygiTjM8WWsuSyxZay5WPiIpKX0sCng0OmZ1bmN0aW9uKGEpe3JldHVybiBKLnpsKHRo
+aXMuZ1YoKSxhKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkgodGhpcy5nVigpKX0sClo6ZnVuY3Rp
+b24oYSl7cmV0dXJuIFAubk8odGhpcyl9LAokaVowOjF9ClAueVEucHJvdG90eXBlPXsKJDE6ZnVuY3Rp
+b24oYSl7dmFyIHQ9dGhpcy5hLHM9SC5MaCh0KQpzLkMoIllrLksiKS5hKGEpCnJldHVybiBuZXcgUC5O
+MyhhLHQucSgwLGEpLHMuQygiQDxZay5LPiIpLktxKHMuQygiWWsuViIpKS5DKCJOMzwxLDI+IikpfSwK
+JFM6ZnVuY3Rpb24oKXtyZXR1cm4gSC5MaCh0aGlzLmEpLkMoIk4zPFlrLkssWWsuVj4oWWsuSykiKX19
+ClAuS1AucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0LmMuYShi
+KQp0LlFbMV0uYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFw
+IikpfX0KUC5Qbi5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS5xKDAsYil9
+LApZOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILkxoKHRoaXMpCnRoaXMuYS5ZKDAsdC5jLmEoYiksdC5R
+WzFdLmEoYykpfSwKeDQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS54NChhKX0sCks6ZnVuY3Rpb24o
+YSxiKXt0aGlzLmEuSygwLEguTGgodGhpcykuQygifigxLDIpIikuYShiKSl9LApnQTpmdW5jdGlvbihh
+KXt2YXIgdD10aGlzLmEKcmV0dXJuIHQuZ0EodCl9LApaOmZ1bmN0aW9uKGEpe3JldHVybiBKLkFjKHRo
+aXMuYSl9LApnUHU6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybiB0LmdQdSh0KX0sCiRpWjA6
+MX0KUC5Hai5wcm90b3R5cGU9e30KUC5NYS5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3JldHVybiBQ
+LldFKHRoaXMsInsiLCJ9Iil9fQpQLlZqLnByb3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXh1OjF9ClAu
+WHYucHJvdG90eXBlPXsKRlY6ZnVuY3Rpb24oYSxiKXt2YXIgdApmb3IodD1KLklUKEguTGgodGhpcyku
+QygiY1g8MT4iKS5hKGIpKTt0LkYoKTspdGhpcy5pKDAsdC5nbCgpKX0sClo6ZnVuY3Rpb24oYSl7cmV0
+dXJuIFAuV0UodGhpcywieyIsIn0iKX0sCnpWOmZ1bmN0aW9uKGEsYil7dmFyIHQscz1QLnJqKHRoaXMs
+dGhpcy5yLEguTGgodGhpcykuYykKaWYoIXMuRigpKXJldHVybiIiCmlmKGI9PT0iIil7dD0iIgpkbyB0
+Kz1ILmQocy5kKQp3aGlsZShzLkYoKSl9ZWxzZXt0PUguZChzLmQpCmZvcig7cy5GKCk7KXQ9dCtiK0gu
+ZChzLmQpfXJldHVybiB0LmNoYXJDb2RlQXQoMCk9PTA/dDp0fSwKJGliUToxLAokaWNYOjEsCiRpeHU6
+MX0KUC5uWS5wcm90b3R5cGU9e30KUC5UQy5wcm90b3R5cGU9e30KUC5SVS5wcm90b3R5cGU9e30KUC51
+dy5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzLmIKaWYocz09bnVsbClyZXR1
+cm4gdGhpcy5jLnEoMCxiKQplbHNlIGlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gbnVsbAplbHNl
+e3Q9c1tiXQpyZXR1cm4gdHlwZW9mIHQ9PSJ1bmRlZmluZWQiP3RoaXMuZmIoYik6dH19LApnQTpmdW5j
+dGlvbihhKXtyZXR1cm4gdGhpcy5iPT1udWxsP3RoaXMuYy5hOnRoaXMuQ2YoKS5sZW5ndGh9LApnVjpm
+dW5jdGlvbigpe2lmKHRoaXMuYj09bnVsbCl7dmFyIHQ9dGhpcy5jCnJldHVybiBuZXcgSC5pNSh0LEgu
+TGgodCkuQygiaTU8MT4iKSl9cmV0dXJuIG5ldyBQLmk4KHRoaXMpfSwKWTpmdW5jdGlvbihhLGIsYyl7
+dmFyIHQscyxyPXRoaXMKaWYoci5iPT1udWxsKXIuYy5ZKDAsYixjKQplbHNlIGlmKHIueDQoYikpe3Q9
+ci5iCnRbYl09YwpzPXIuYQppZihzPT1udWxsP3QhPW51bGw6cyE9PXQpc1tiXT1udWxsfWVsc2Ugci5Y
+SygpLlkoMCxiLGMpfSwKeDQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iPT1udWxsKXJldHVybiB0aGlzLmMu
+eDQoYSkKcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSl9
+LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscD10aGlzCnUuY0EuYShiKQppZihwLmI9PW51bGwp
+cmV0dXJuIHAuYy5LKDAsYikKdD1wLkNmKCkKZm9yKHM9MDtzPHQubGVuZ3RoOysrcyl7cj10W3NdCnE9
+cC5iW3JdCmlmKHR5cGVvZiBxPT0idW5kZWZpbmVkIil7cT1QLlFlKHAuYVtyXSkKcC5iW3JdPXF9Yi4k
+MihyLHEpCmlmKHQhPT1wLmMpdGhyb3cgSC5iKFAuYTQocCkpfX0sCkNmOmZ1bmN0aW9uKCl7dmFyIHQ9
+dS5qLmEodGhpcy5jKQppZih0PT1udWxsKXQ9dGhpcy5jPUguVk0oT2JqZWN0LmtleXModGhpcy5hKSx1
+LnMpCnJldHVybiB0fSwKWEs6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG89dGhpcwppZihvLmI9PW51
+bGwpcmV0dXJuIG8uYwp0PVAuRmwodS5OLHUueikKcz1vLkNmKCkKZm9yKHI9MDtxPXMubGVuZ3RoLHI8
+cTsrK3Ipe3A9c1tyXQp0LlkoMCxwLG8ucSgwLHApKX1pZihxPT09MClDLk5tLmkocywiIikKZWxzZSBD
+Lk5tLnNBKHMsMCkKby5hPW8uYj1udWxsCnJldHVybiBvLmM9dH0sCmZiOmZ1bmN0aW9uKGEpe3ZhciB0
+CmlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hLGEpKXJldHVybiBu
+dWxsCnQ9UC5RZSh0aGlzLmFbYV0pCnJldHVybiB0aGlzLmJbYV09dH19ClAuaTgucHJvdG90eXBlPXsK
+Z0E6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybiB0LmdBKHQpfSwKRTpmdW5jdGlvbihhLGIp
+e3ZhciB0PXRoaXMuYQppZih0LmI9PW51bGwpdD10LmdWKCkuRSgwLGIpCmVsc2V7dD10LkNmKCkKaWYo
+YjwwfHxiPj10Lmxlbmd0aClyZXR1cm4gSC5rKHQsYikKdD10W2JdfXJldHVybiB0fSwKZ2t6OmZ1bmN0
+aW9uKGEpe3ZhciB0PXRoaXMuYQppZih0LmI9PW51bGwpe3Q9dC5nVigpCnQ9dC5na3oodCl9ZWxzZXt0
+PXQuQ2YoKQp0PW5ldyBKLm0xKHQsdC5sZW5ndGgsSC50Nih0KS5DKCJtMTwxPiIpKX1yZXR1cm4gdH0s
+CnRnOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS54NChiKX19ClAucGcucHJvdG90eXBlPXsKJDA6
+ZnVuY3Rpb24oKXt2YXIgdCxzCnRyeXt0PW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtmYXRhbDp0cnVl
+fSkKcmV0dXJuIHR9Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4gbnVsbH0sCiRTOjQzfQpQLkNWLnByb3Rv
+dHlwZT17CnlyOmZ1bmN0aW9uKGEsYTAsYTEpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcs
+ZixlLGQsYyxiPSJJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggIgphMT1QLmpCKGEwLGExLGEu
+bGVuZ3RoKQp0PSQuVjcoKQpmb3Iocz1hMCxyPXMscT1udWxsLHA9LTEsbz0tMSxuPTA7czxhMTtzPW0p
+e209cysxCmw9Qy54Qi5XKGEscykKaWYobD09PTM3KXtrPW0rMgppZihrPD1hMSl7aj1ILm9vKEMueEIu
+VyhhLG0pKQppPUgub28oQy54Qi5XKGEsbSsxKSkKaD1qKjE2K2ktKGkmMjU2KQppZihoPT09MzcpaD0t
+MQptPWt9ZWxzZSBoPS0xfWVsc2UgaD1sCmlmKDA8PWgmJmg8PTEyNyl7aWYoaDwwfHxoPj10Lmxlbmd0
+aClyZXR1cm4gSC5rKHQsaCkKZz10W2hdCmlmKGc+PTApe2g9Qy54Qi5tKCJBQkNERUZHSElKS0xNTk9Q
+UVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixnKQppZihoPT09
+bCljb250aW51ZQpsPWh9ZWxzZXtpZihnPT09LTEpe2lmKHA8MCl7Zj1xPT1udWxsP251bGw6cS5hLmxl
+bmd0aAppZihmPT1udWxsKWY9MApwPWYrKHMtcikKbz1zfSsrbgppZihsPT09NjEpY29udGludWV9bD1o
+fWlmKGchPT0tMil7aWYocT09bnVsbCl7cT1uZXcgUC5SbigiIikKZj1xfWVsc2UgZj1xCmYuYSs9Qy54
+Qi5OaihhLHIscykKZi5hKz1ILkx3KGwpCnI9bQpjb250aW51ZX19dGhyb3cgSC5iKFAucnIoIkludmFs
+aWQgYmFzZTY0IGRhdGEiLGEscykpfWlmKHEhPW51bGwpe2Y9cS5hKz1DLnhCLk5qKGEscixhMSkKZT1m
+Lmxlbmd0aAppZihwPj0wKVAueE0oYSxvLGExLHAsbixlKQplbHNle2Q9Qy5qbi56WShlLTEsNCkrMQpp
+ZihkPT09MSl0aHJvdyBILmIoUC5ycihiLGEsYTEpKQpmb3IoO2Q8NDspe2YrPSI9IgpxLmE9ZjsrK2R9
+fWY9cS5hCnJldHVybiBDLnhCLmk3KGEsYTAsYTEsZi5jaGFyQ29kZUF0KDApPT0wP2Y6Zil9Yz1hMS1h
+MAppZihwPj0wKVAueE0oYSxvLGExLHAsbixjKQplbHNle2Q9Qy5qbi56WShjLDQpCmlmKGQ9PT0xKXRo
+cm93IEguYihQLnJyKGIsYSxhMSkpCmlmKGQ+MSlhPUMueEIuaTcoYSxhMSxhMSxkPT09Mj8iPT0iOiI9
+Iil9cmV0dXJuIGF9fQpQLlU4LnByb3RvdHlwZT17fQpQLlVrLnByb3RvdHlwZT17fQpQLndJLnByb3Rv
+dHlwZT17fQpQLlppLnByb3RvdHlwZT17fQpQLmJ5LnByb3RvdHlwZT17CnBXOmZ1bmN0aW9uKGEsYixj
+KXt2YXIgdAp1LmNhLmEoYykKdD1QLkJTKGIsdGhpcy5nSGUoKS5hKQpyZXR1cm4gdH0sCmdIZTpmdW5j
+dGlvbigpe3JldHVybiBDLkEzfX0KUC5NeC5wcm90b3R5cGU9e30KUC51NS5wcm90b3R5cGU9ewpnWkU6
+ZnVuY3Rpb24oKXtyZXR1cm4gQy5Ra319ClAuRTMucHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7dmFy
+IHQscyxyPVAuakIoMCxudWxsLGEubGVuZ3RoKSxxPXItMAppZihxPT09MClyZXR1cm4gbmV3IFVpbnQ4
+QXJyYXkoMCkKdD1uZXcgVWludDhBcnJheShxKjMpCnM9bmV3IFAuUncodCkKaWYocy5HeChhLDAscikh
+PT1yKXMuTzYoSi5hNihhLHItMSksMCkKcmV0dXJuIG5ldyBVaW50OEFycmF5KHQuc3ViYXJyYXkoMCxI
+LnJNKDAscy5iLHQubGVuZ3RoKSkpfX0KUC5Sdy5wcm90b3R5cGU9ewpPNjpmdW5jdGlvbihhLGIpe3Zh
+ciB0LHM9dGhpcyxyPXMuYyxxPXMuYixwPXErMSxvPXIubGVuZ3RoCmlmKChiJjY0NTEyKT09PTU2MzIw
+KXt0PTY1NTM2KygoYSYxMDIzKTw8MTApfGImMTAyMwpzLmI9cAppZihxPj1vKXJldHVybiBILmsocixx
+KQpyW3FdPTI0MHx0Pj4+MTgKcT1zLmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguayhyLHApCnJbcF09MTI4
+fHQ+Pj4xMiY2MwpwPXMuYj1xKzEKaWYocT49bylyZXR1cm4gSC5rKHIscSkKcltxXT0xMjh8dD4+PjYm
+NjMKcy5iPXArMQppZihwPj1vKXJldHVybiBILmsocixwKQpyW3BdPTEyOHx0JjYzCnJldHVybiEwfWVs
+c2V7cy5iPXAKaWYocT49bylyZXR1cm4gSC5rKHIscSkKcltxXT0yMjR8YT4+PjEyCnE9cy5iPXArMQpp
+ZihwPj1vKXJldHVybiBILmsocixwKQpyW3BdPTEyOHxhPj4+NiY2MwpzLmI9cSsxCmlmKHE+PW8pcmV0
+dXJuIEguayhyLHEpCnJbcV09MTI4fGEmNjMKcmV0dXJuITF9fSwKR3g6ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciB0LHMscixxLHAsbyxuLG09dGhpcwppZihiIT09YyYmKEMueEIubShhLGMtMSkmNjQ1MTIpPT09NTUy
+OTYpLS1jCmZvcih0PW0uYyxzPXQubGVuZ3RoLHI9YjtyPGM7KytyKXtxPUMueEIuVyhhLHIpCmlmKHE8
+PTEyNyl7cD1tLmIKaWYocD49cylicmVhawptLmI9cCsxCnRbcF09cX1lbHNlIGlmKChxJjY0NTEyKT09
+PTU1Mjk2KXtpZihtLmIrMz49cylicmVhawpvPXIrMQppZihtLk82KHEsQy54Qi5XKGEsbykpKXI9b31l
+bHNlIGlmKHE8PTIwNDcpe3A9bS5iCm49cCsxCmlmKG4+PXMpYnJlYWsKbS5iPW4KaWYocD49cylyZXR1
+cm4gSC5rKHQscCkKdFtwXT0xOTJ8cT4+PjYKbS5iPW4rMQp0W25dPTEyOHxxJjYzfWVsc2V7cD1tLmIK
+aWYocCsyPj1zKWJyZWFrCm49bS5iPXArMQppZihwPj1zKXJldHVybiBILmsodCxwKQp0W3BdPTIyNHxx
+Pj4+MTIKcD1tLmI9bisxCmlmKG4+PXMpcmV0dXJuIEguayh0LG4pCnRbbl09MTI4fHE+Pj42JjYzCm0u
+Yj1wKzEKaWYocD49cylyZXR1cm4gSC5rKHQscCkKdFtwXT0xMjh8cSY2M319cmV0dXJuIHJ9fQpQLkdZ
+LnByb3RvdHlwZT17CldKOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG0sbAp1LkwuYShhKQp0
+PVAua3koITEsYSwwLG51bGwpCmlmKHQhPW51bGwpcmV0dXJuIHQKcz1QLmpCKDAsbnVsbCxKLkgoYSkp
+CnI9UC5jUChhLDAscykKaWYocj4wKXtxPVAuSE0oYSwwLHIpCmlmKHI9PT1zKXJldHVybiBxCnA9bmV3
+IFAuUm4ocSkKbz1yCm49ITF9ZWxzZXtwPW5ldyBQLlJuKCIiKQpvPTAKbj0hMH1tPW5ldyBQLmJ6KCEx
+LHApCm0uYz1uCm0uTUUoYSxvLHMpCmlmKG0uZT4wKXtILnZoKFAucnIoIlVuZmluaXNoZWQgVVRGLTgg
+b2N0ZXQgc2VxdWVuY2UiLGEscykpCnAuYSs9SC5Mdyg2NTUzMykKbS5mPW0uZT1tLmQ9MH1sPXAuYQpy
+ZXR1cm4gbC5jaGFyQ29kZUF0KDApPT0wP2w6bH19ClAuYnoucHJvdG90eXBlPXsKTUU6ZnVuY3Rpb24o
+YSxiLGMpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoPXRoaXMsZz0iQmFkIFVURi04IGVuY29k
+aW5nIDB4Igp1LkwuYShhKQp0PWguZApzPWguZQpyPWguZgpoLmY9aC5lPWguZD0wCiRsYWJlbDAkMDpm
+b3IocT1KLlU2KGEpLHA9aC5iLG89YjshMDtvPWopeyRsYWJlbDEkMTppZihzPjApe2Rve2lmKG89PT1j
+KWJyZWFrICRsYWJlbDAkMApuPXEucShhLG8pCmlmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0dXJuIG4u
+ek0oKQppZigobiYxOTIpIT09MTI4KXttPVAucnIoZytDLmpuLldaKG4sMTYpLGEsbykKdGhyb3cgSC5i
+KG0pfWVsc2V7dD0odDw8NnxuJjYzKT4+PjA7LS1zOysrb319d2hpbGUocz4wKQptPXItMQppZihtPDB8
+fG0+PTQpcmV0dXJuIEguayhDLkdiLG0pCmlmKHQ8PUMuR2JbbV0pe209UC5ycigiT3ZlcmxvbmcgZW5j
+b2Rpbmcgb2YgMHgiK0Muam4uV1oodCwxNiksYSxvLXItMSkKdGhyb3cgSC5iKG0pfWlmKHQ+MTExNDEx
+MSl7bT1QLnJyKCJDaGFyYWN0ZXIgb3V0c2lkZSB2YWxpZCBVbmljb2RlIHJhbmdlOiAweCIrQy5qbi5X
+Wih0LDE2KSxhLG8tci0xKQp0aHJvdyBILmIobSl9aWYoIWguY3x8dCE9PTY1Mjc5KXAuYSs9SC5Mdyh0
+KQpoLmM9ITF9Zm9yKG09bzxjO207KXtsPVAuY1AoYSxvLGMpCmlmKGw+MCl7aC5jPSExCms9bytsCnAu
+YSs9UC5ITShhLG8saykKaWYoaz09PWMpYnJlYWt9ZWxzZSBrPW8Kaj1rKzEKbj1xLnEoYSxrKQppZih0
+eXBlb2YgbiE9PSJudW1iZXIiKXJldHVybiBuLkooKQppZihuPDApe2k9UC5ycigiTmVnYXRpdmUgVVRG
+LTggY29kZSB1bml0OiAtMHgiK0Muam4uV1ooLW4sMTYpLGEsai0xKQp0aHJvdyBILmIoaSl9ZWxzZXtp
+ZigobiYyMjQpPT09MTkyKXt0PW4mMzEKcz0xCnI9MQpjb250aW51ZSAkbGFiZWwwJDB9aWYoKG4mMjQw
+KT09PTIyNCl7dD1uJjE1CnM9MgpyPTIKY29udGludWUgJGxhYmVsMCQwfWlmKChuJjI0OCk9PT0yNDAm
+Jm48MjQ1KXt0PW4mNwpzPTMKcj0zCmNvbnRpbnVlICRsYWJlbDAkMH1pPVAucnIoZytDLmpuLldaKG4s
+MTYpLGEsai0xKQp0aHJvdyBILmIoaSl9fWJyZWFrICRsYWJlbDAkMH1pZihzPjApe2guZD10CmguZT1z
+CmguZj1yfX19ClAuV0YucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIKdS5mby5h
+KGEpCnQ9dGhpcy5iCnM9dGhpcy5hCnQuYSs9cy5hCnI9dC5hKz1ILmQoYS5hKQp0LmE9cisiOiAiCnQu
+YSs9UC5oKGIpCnMuYT0iLCAifSwKJFM6NDR9ClAuYTIucHJvdG90eXBlPXt9ClAuaVAucHJvdG90eXBl
+PXsKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2Yg
+UC5pUCYmdGhpcy5hPT09Yi5hJiYhMH0sCmdpTzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJu
+KHReQy5qbi53Ryh0LDMwKSkmMTA3Mzc0MTgyM30sClo6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcyxzPVAu
+R3EoSC50Sih0KSkscj1QLmgwKEguTlModCkpLHE9UC5oMChILmpBKHQpKSxwPVAuaDAoSC5JWCh0KSks
+bz1QLmgwKEguY2godCkpLG49UC5oMChILkpkKHQpKSxtPVAuVngoSC5WYSh0KSksbD1zKyItIityKyIt
+IitxKyIgIitwKyI6IitvKyI6IituKyIuIittCnJldHVybiBsfX0KUC5DUC5wcm90b3R5cGU9e30KUC5Y
+Uy5wcm90b3R5cGU9ewpnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gSC50cyh0aGlzLiR0aHJvd25Kc0Vycm9y
+KX19ClAuQzYucHJvdG90eXBlPXsKWjpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKaWYodCE9bnVsbCly
+ZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLmgodCkKcmV0dXJuIkFzc2VydGlvbiBmYWlsZWQifX0K
+UC5MSy5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3JldHVybiJUaHJvdyBvZiBudWxsLiJ9fQpQLkFU
+LnByb3RvdHlwZT17CmdMOmZ1bmN0aW9uKCl7cmV0dXJuIkludmFsaWQgYXJndW1lbnQiKyghdGhpcy5h
+PyIocykiOiIiKX0sCmd1OmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LApaOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
+cj10aGlzLHE9ci5jLHA9cT09bnVsbD8iIjoiICgiK3ErIikiLG89ci5kLG49bz09bnVsbD8iIjoiOiAi
+K0guZChvKSxtPXIuZ0woKStwK24KaWYoIXIuYSlyZXR1cm4gbQp0PXIuZ3UoKQpzPVAuaChyLmIpCnJl
+dHVybiBtK3QrIjogIitzfX0KUC5iSi5wcm90b3R5cGU9ewpnTDpmdW5jdGlvbigpe3JldHVybiJSYW5n
+ZUVycm9yIn0sCmd1OmZ1bmN0aW9uKCl7dmFyIHQscz10aGlzLmUscj10aGlzLmYKaWYocz09bnVsbCl0
+PXIhPW51bGw/IjogTm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byAiK0guZChyKToiIgplbHNlIGlmKHI9
+PW51bGwpdD0iOiBOb3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIrSC5kKHMpCmVsc2UgaWYocj5z
+KXQ9IjogTm90IGluIHJhbmdlICIrSC5kKHMpKyIuLiIrSC5kKHIpKyIsIGluY2x1c2l2ZSIKZWxzZSB0
+PXI8cz8iOiBWYWxpZCB2YWx1ZSByYW5nZSBpcyBlbXB0eSI6IjogT25seSB2YWxpZCB2YWx1ZSBpcyAi
+K0guZChzKQpyZXR1cm4gdH19ClAuZVkucHJvdG90eXBlPXsKZ0w6ZnVuY3Rpb24oKXtyZXR1cm4iUmFu
+Z2VFcnJvciJ9LApndTpmdW5jdGlvbigpe3ZhciB0LHM9SC5XWSh0aGlzLmIpCmlmKHR5cGVvZiBzIT09
+Im51bWJlciIpcmV0dXJuIHMuSigpCmlmKHM8MClyZXR1cm4iOiBpbmRleCBtdXN0IG5vdCBiZSBuZWdh
+dGl2ZSIKdD10aGlzLmYKaWYodD09PTApcmV0dXJuIjogbm8gaW5kaWNlcyBhcmUgdmFsaWQiCnJldHVy
+biI6IGluZGV4IHNob3VsZCBiZSBsZXNzIHRoYW4gIitILmQodCl9LApnQTpmdW5jdGlvbihhKXtyZXR1
+cm4gdGhpcy5mfX0KUC5tcC5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxu
+LG0sbD10aGlzLGs9e30saj1uZXcgUC5SbigiIikKay5hPSIiCnQ9bC5jCmZvcihzPXQubGVuZ3RoLHI9
+MCxxPSIiLHA9IiI7cjxzOysrcixwPSIsICIpe289dFtyXQpqLmE9cStwCnE9ai5hKz1QLmgobykKay5h
+PSIsICJ9bC5kLksoMCxuZXcgUC5XRihrLGopKQpuPVAuaChsLmEpCm09ai5aKDApCnM9Ik5vU3VjaE1l
+dGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIitILmQobC5iLmEpKyInXG5SZWNlaXZlcjogIitu
+KyJcbkFyZ3VtZW50czogWyIrbSsiXSIKcmV0dXJuIHN9fQpQLnViLnByb3RvdHlwZT17Clo6ZnVuY3Rp
+b24oYSl7cmV0dXJuIlVuc3VwcG9ydGVkIG9wZXJhdGlvbjogIit0aGlzLmF9fQpQLmRzLnByb3RvdHlw
+ZT17Clo6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybiB0IT1udWxsPyJVbmltcGxlbWVudGVk
+RXJyb3I6ICIrdDoiVW5pbXBsZW1lbnRlZEVycm9yIn19ClAubGoucHJvdG90eXBlPXsKWjpmdW5jdGlv
+bihhKXtyZXR1cm4iQmFkIHN0YXRlOiAiK3RoaXMuYX19ClAuVVYucHJvdG90eXBlPXsKWjpmdW5jdGlv
+bihhKXt2YXIgdD10aGlzLmEKaWYodD09bnVsbClyZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24g
+ZHVyaW5nIGl0ZXJhdGlvbi4iCnJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRl
+cmF0aW9uOiAiK1AuaCh0KSsiLiJ9fQpQLms1LnByb3RvdHlwZT17Clo6ZnVuY3Rpb24oYSl7cmV0dXJu
+Ik91dCBvZiBNZW1vcnkifSwKZ0lJOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LAokaVhTOjF9ClAuS1ku
+cHJvdG90eXBlPXsKWjpmdW5jdGlvbihhKXtyZXR1cm4iU3RhY2sgT3ZlcmZsb3cifSwKZ0lJOmZ1bmN0
+aW9uKCl7cmV0dXJuIG51bGx9LAokaVhTOjF9ClAudDcucHJvdG90eXBlPXsKWjpmdW5jdGlvbihhKXt2
+YXIgdD10aGlzLmEKcmV0dXJuIHQ9PW51bGw/IlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlIGR1cmluZyBp
+dHMgaW5pdGlhbGl6YXRpb24iOiJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSAnIit0KyInIGR1cmluZyBp
+dHMgaW5pdGlhbGl6YXRpb24ifX0KUC5DRC5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3JldHVybiJF
+eGNlcHRpb246ICIrdGhpcy5hfX0KUC5hRS5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
+cixxLHAsbyxuLG0sbCxrLGosaSxoPXRoaXMuYSxnPWghPW51bGwmJiIiIT09aD8iRm9ybWF0RXhjZXB0
+aW9uOiAiK0guZChoKToiRm9ybWF0RXhjZXB0aW9uIixmPXRoaXMuYyxlPXRoaXMuYgppZih0eXBlb2Yg
+ZT09InN0cmluZyIpe2lmKGYhPW51bGwpdD1mPDB8fGY+ZS5sZW5ndGgKZWxzZSB0PSExCmlmKHQpZj1u
+dWxsCmlmKGY9PW51bGwpe2lmKGUubGVuZ3RoPjc4KWU9Qy54Qi5OaihlLDAsNzUpKyIuLi4iCnJldHVy
+biBnKyJcbiIrZX1mb3Iocz0xLHI9MCxxPSExLHA9MDtwPGY7KytwKXtvPUMueEIuVyhlLHApCmlmKG89
+PT0xMCl7aWYociE9PXB8fCFxKSsrcwpyPXArMQpxPSExfWVsc2UgaWYobz09PTEzKXsrK3MKcj1wKzEK
+cT0hMH19Zz1zPjE/ZysoIiAoYXQgbGluZSAiK3MrIiwgY2hhcmFjdGVyICIrKGYtcisxKSsiKVxuIik6
+ZysoIiAoYXQgY2hhcmFjdGVyICIrKGYrMSkrIilcbiIpCm49ZS5sZW5ndGgKZm9yKHA9ZjtwPG47Kytw
+KXtvPUMueEIubShlLHApCmlmKG89PT0xMHx8bz09PTEzKXtuPXAKYnJlYWt9fWlmKG4tcj43OClpZihm
+LXI8NzUpe209cis3NQpsPXIKaz0iIgpqPSIuLi4ifWVsc2V7aWYobi1mPDc1KXtsPW4tNzUKbT1uCmo9
+IiJ9ZWxzZXtsPWYtMzYKbT1mKzM2Cmo9Ii4uLiJ9az0iLi4uIn1lbHNle209bgpsPXIKaz0iIgpqPSIi
+fWk9Qy54Qi5OaihlLGwsbSkKcmV0dXJuIGcraytpK2orIlxuIitDLnhCLkl4KCIgIixmLWwray5sZW5n
+dGgpKyJeXG4ifWVsc2UgcmV0dXJuIGYhPW51bGw/ZysoIiAoYXQgb2Zmc2V0ICIrSC5kKGYpKyIpIik6
+Z319ClAuRUgucHJvdG90eXBlPXt9ClAuSWYucHJvdG90eXBlPXt9ClAuY1gucHJvdG90eXBlPXsKRTI6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PUguTGgodGhpcykKcmV0dXJuIEguSzEodGhpcyx0LktxKGMpLkMo
+IjEoY1guRSkiKS5hKGIpLHQuQygiY1guRSIpLGMpfSwKZXY6ZnVuY3Rpb24oYSxiKXt2YXIgdD1ILkxo
+KHRoaXMpCnJldHVybiBuZXcgSC5VNSh0aGlzLHQuQygiYTIoY1guRSkiKS5hKGIpLHQuQygiVTU8Y1gu
+RT4iKSl9LApnQTpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuZ2t6KHRoaXMpCmZvcih0PTA7cy5GKCk7
+KSsrdApyZXR1cm4gdH0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4hdGhpcy5na3oodGhpcykuRigpfSwK
+Z3I4OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5na3oodGhpcykKaWYoIXMuRigpKXRocm93IEguYihI
+LldwKCkpCnQ9cy5nbCgpCmlmKHMuRigpKXRocm93IEguYihILmRVKCkpCnJldHVybiB0fSwKRTpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscgpQLmsxKGIsImluZGV4IikKZm9yKHQ9dGhpcy5na3oodGhpcykscz0w
+O3QuRigpOyl7cj10LmdsKCkKaWYoYj09PXMpcmV0dXJuIHI7KytzfXRocm93IEguYihQLnQoYix0aGlz
+LCJpbmRleCIsbnVsbCxzKSl9LApaOmZ1bmN0aW9uKGEpe3JldHVybiBQLkVQKHRoaXMsIigiLCIpIil9
+fQpQLkFuLnByb3RvdHlwZT17fQpQLnpNLnByb3RvdHlwZT17JGliUToxLCRpY1g6MX0KUC5aMC5wcm90
+b3R5cGU9e30KUC5OMy5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3JldHVybiJNYXBFbnRyeSgiK0gu
+ZChKLkFjKHRoaXMuYSkpKyI6ICIrSC5kKEouQWModGhpcy5iKSkrIikifX0KUC5jOC5wcm90b3R5cGU9
+ewpnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIFAuTWgucHJvdG90eXBlLmdpTy5jYWxsKHRoaXMsdGhpcyl9
+LApaOmZ1bmN0aW9uKGEpe3JldHVybiJudWxsIn19ClAubGYucHJvdG90eXBlPXt9ClAuTWgucHJvdG90
+eXBlPXtjb25zdHJ1Y3RvcjpQLk1oLCRpTWg6MSwKRE46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcz09
+PWJ9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEguZVEodGhpcyl9LApaOmZ1bmN0aW9uKGEpe3JldHVy
+biJJbnN0YW5jZSBvZiAnIitILmQoSC5saCh0aGlzKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1Lm8u
+YShiKQp0aHJvdyBILmIoUC5scih0aGlzLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9LAp0b1N0cmlu
+ZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLloodGhpcyl9fQpQLk9kLnByb3RvdHlwZT17fQpQLmliLnBy
+b3RvdHlwZT17JGlPZDoxfQpQLnh1LnByb3RvdHlwZT17fQpQLkd6LnByb3RvdHlwZT17fQpQLlpkLnBy
+b3RvdHlwZT17Clo6ZnVuY3Rpb24oYSl7cmV0dXJuIiJ9LAokaUd6OjF9ClAucVUucHJvdG90eXBlPXsk
+aXZYOjF9ClAuUm4ucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9
+LApaOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdC5jaGFyQ29kZUF0KDApPT0wP3Q6dH0s
+CiRpQkw6MX0KUC5HRC5wcm90b3R5cGU9e30KUC5uMS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIp
+e3ZhciB0LHMscixxCnUuZi5hKGEpCkguYyhiKQp0PUouclkoYikuT1koYiwiPSIpCmlmKHQ9PT0tMSl7
+aWYoYiE9PSIiKWEuWSgwLFAua3UoYiwwLGIubGVuZ3RoLHRoaXMuYSwhMCksIiIpfWVsc2UgaWYodCE9
+PTApe3M9Qy54Qi5OaihiLDAsdCkKcj1DLnhCLkcoYix0KzEpCnE9dGhpcy5hCmEuWSgwLFAua3Uocyww
+LHMubGVuZ3RoLHEsITApLFAua3UociwwLHIubGVuZ3RoLHEsITApKX1yZXR1cm4gYX0sCiRTOjE5fQpQ
+LmNTLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhyb3cgSC5iKFAucnIoIklsbGVnYWwgSVB2
+NCBhZGRyZXNzLCAiK2EsdGhpcy5hLGIpKX0sCiRTOjQ3fQpQLlZDLnByb3RvdHlwZT17CiQyOmZ1bmN0
+aW9uKGEsYil7dGhyb3cgSC5iKFAucnIoIklsbGVnYWwgSVB2NiBhZGRyZXNzLCAiK2EsdGhpcy5hLGIp
+KX0sCiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiQyKGEsbnVsbCl9LAokUzo0OH0KUC5KVC5wcm90
+b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGItYT40KXRoaXMuYS4kMigiYW4gSVB2NiBw
+YXJ0IGNhbiBvbmx5IGNvbnRhaW4gYSBtYXhpbXVtIG9mIDQgaGV4IGRpZ2l0cyIsYSkKdD1QLlFBKEMu
+eEIuTmoodGhpcy5iLGEsYiksMTYpCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuSigpCmlm
+KHQ8MHx8dD42NTUzNSl0aGlzLmEuJDIoImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBg
+MHgwLi4weEZGRkZgIixhKQpyZXR1cm4gdH0sCiRTOjIwfQpQLkRuLnByb3RvdHlwZT17CmduRDpmdW5j
+dGlvbigpe3ZhciB0LHMscixxPXRoaXMscD1xLngKaWYocD09bnVsbCl7cD1xLmEKdD1wLmxlbmd0aCE9
+PTA/cCsiOiI6IiIKcz1xLmMKcj1zPT1udWxsCmlmKCFyfHxwPT09ImZpbGUiKXtwPXQrIi8vIgp0PXEu
+YgppZih0Lmxlbmd0aCE9PTApcD1wK3QrIkAiCmlmKCFyKXArPXMKdD1xLmQKaWYodCE9bnVsbClwPXAr
+IjoiK0guZCh0KX1lbHNlIHA9dApwKz1xLmUKdD1xLmYKaWYodCE9bnVsbClwPXArIj8iK3QKdD1xLnIK
+aWYodCE9bnVsbClwPXArIiMiK3QKcD1wLmNoYXJDb2RlQXQoMCk9PTA/cDpwCmlmKHEueD09bnVsbClx
+Lng9cAplbHNlIHA9SC52aChILnlSKCJGaWVsZCAnX3RleHQnIGhhcyBiZWVuIGFzc2lnbmVkIGR1cmlu
+ZyBpbml0aWFsaXphdGlvbi4iKSl9cmV0dXJuIHB9LApnRmo6ZnVuY3Rpb24oKXt2YXIgdCxzPXRoaXMs
+cj1zLnkKaWYocj09bnVsbCl7dD1zLmUKaWYodC5sZW5ndGghPT0wJiZDLnhCLlcodCwwKT09PTQ3KXQ9
+Qy54Qi5HKHQsMSkKcj10Lmxlbmd0aD09PTA/Qy54RDpQLkFGKG5ldyBILmxKKEguVk0odC5zcGxpdCgi
+LyIpLHUucyksdS5kTy5hKFAuUEgoKSksdS5kbyksdS5OKQppZihzLnk9PW51bGwpcy5zS3AocikKZWxz
+ZSByPUgudmgoSC55UigiRmllbGQgJ3BhdGhTZWdtZW50cycgaGFzIGJlZW4gYXNzaWduZWQgZHVyaW5n
+IGluaXRpYWxpemF0aW9uLiIpKX1yZXR1cm4gcn0sCmdpTzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLHM9
+dC56CmlmKHM9PW51bGwpe3M9Qy54Qi5naU8odC5nbkQoKSkKaWYodC56PT1udWxsKXQuej1zCmVsc2Ug
+cz1ILnZoKEgueVIoIkZpZWxkICdoYXNoQ29kZScgaGFzIGJlZW4gYXNzaWduZWQgZHVyaW5nIGluaXRp
+YWxpemF0aW9uLiIpKX1yZXR1cm4gc30sCmdoWTpmdW5jdGlvbigpe3ZhciB0PXRoaXMscz10LlEKaWYo
+cz09bnVsbCl7cz1uZXcgUC5HaihQLldYKHQuZ3RQKCkpLHUuRCkKaWYodC5RPT1udWxsKXQuc05NKHMp
+CmVsc2Ugcz1ILnZoKEgueVIoIkZpZWxkICdxdWVyeVBhcmFtZXRlcnMnIGhhcyBiZWVuIGFzc2lnbmVk
+IGR1cmluZyBpbml0aWFsaXphdGlvbi4iKSl9cmV0dXJuIHN9LApna3U6ZnVuY3Rpb24oKXtyZXR1cm4g
+dGhpcy5ifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYwppZih0PT1udWxsKXJldHVybiIiCmlm
+KEMueEIubih0LCJbIikpcmV0dXJuIEMueEIuTmoodCwxLHQubGVuZ3RoLTEpCnJldHVybiB0fSwKZ3Rw
+OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuZApyZXR1cm4gdD09bnVsbD9QLndLKHRoaXMuYSk6dH0sCmd0
+UDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZgpyZXR1cm4gdD09bnVsbD8iIjp0fSwKZ0thOmZ1bmN0aW9u
+KCl7dmFyIHQ9dGhpcy5yCnJldHVybiB0PT1udWxsPyIiOnR9LApubTpmdW5jdGlvbihhLGIpe3ZhciB0
+LHMscixxLHAsbyxuLG0sbCxrPXRoaXMKdS5YLmEobnVsbCkKdS5iLmEoYikKdD1rLmEKcz10PT09ImZp
+bGUiCnI9ay5iCnE9ay5kCnA9ay5jCmlmKCEocCE9bnVsbCkpcD1yLmxlbmd0aCE9PTB8fHEhPW51bGx8
+fHM/IiI6bnVsbApvPWsuZQppZighcyluPXAhPW51bGwmJm8ubGVuZ3RoIT09MAplbHNlIG49ITAKaWYo
+biYmIUMueEIubihvLCIvIikpbz0iLyIrbwptPW8KbD1QLmxlKG51bGwsMCwwLGIpCnJldHVybiBuZXcg
+UC5Ebih0LHIscCxxLG0sbCxrLnIpfSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8KZm9y
+KHQ9MCxzPTA7Qy54Qi5RaShiLCIuLi8iLHMpOyl7cys9MzsrK3R9cj1DLnhCLmNuKGEsIi8iKQp3aGls
+ZSghMCl7aWYoIShyPjAmJnQ+MCkpYnJlYWsKcT1DLnhCLlBrKGEsIi8iLHItMSkKaWYocTwwKWJyZWFr
+CnA9ci1xCm89cCE9PTIKaWYoIW98fHA9PT0zKWlmKEMueEIubShhLHErMSk9PT00NilvPSFvfHxDLnhC
+Lm0oYSxxKzIpPT09NDYKZWxzZSBvPSExCmVsc2Ugbz0hMQppZihvKWJyZWFrOy0tdApyPXF9cmV0dXJu
+IEMueEIuaTcoYSxyKzEsbnVsbCxDLnhCLkcoYixzLTMqdCkpfSwKWkk6ZnVuY3Rpb24oYSl7cmV0dXJu
+IHRoaXMubVMoUC5oSyhhKSl9LAptUzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsaz10
+aGlzLGo9bnVsbAppZihhLmdGaSgpLmxlbmd0aCE9PTApe3Q9YS5nRmkoKQppZihhLmdjaigpKXtzPWEu
+Z2t1KCkKcj1hLmdKZihhKQpxPWEuZ3hBKCk/YS5ndHAoYSk6an1lbHNle3E9agpyPXEKcz0iIn1wPVAu
+eGUoYS5nSWkoYSkpCm89YS5nUUQoKT9hLmd0UCgpOmp9ZWxzZXt0PWsuYQppZihhLmdjaigpKXtzPWEu
+Z2t1KCkKcj1hLmdKZihhKQpxPVAud0IoYS5neEEoKT9hLmd0cChhKTpqLHQpCnA9UC54ZShhLmdJaShh
+KSkKbz1hLmdRRCgpP2EuZ3RQKCk6an1lbHNle3M9ay5iCnI9ay5jCnE9ay5kCmlmKGEuZ0lpKGEpPT09
+IiIpe3A9ay5lCm89YS5nUUQoKT9hLmd0UCgpOmsuZn1lbHNle2lmKGEuZ3RUKCkpcD1QLnhlKGEuZ0lp
+KGEpKQplbHNle249ay5lCmlmKG4ubGVuZ3RoPT09MClpZihyPT1udWxsKXA9dC5sZW5ndGg9PT0wP2Eu
+Z0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2UgcD1QLnhlKCIvIithLmdJaShhKSkKZWxzZXttPWsuSmgo
+bixhLmdJaShhKSkKbD10Lmxlbmd0aD09PTAKaWYoIWx8fHIhPW51bGx8fEMueEIubihuLCIvIikpcD1Q
+LnhlKG0pCmVsc2UgcD1QLndGKG0sIWx8fHIhPW51bGwpfX1vPWEuZ1FEKCk/YS5ndFAoKTpqfX19cmV0
+dXJuIG5ldyBQLkRuKHQscyxyLHEscCxvLGEuZ1o4KCk/YS5nS2EoKTpqKX0sCmdjajpmdW5jdGlvbigp
+e3JldHVybiB0aGlzLmMhPW51bGx9LApneEE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kIT1udWxsfSwK
+Z1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZiE9bnVsbH0sCmdaODpmdW5jdGlvbigpe3JldHVybiB0
+aGlzLnIhPW51bGx9LApndFQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy54Qi5uKHRoaXMuZSwiLyIpfSwKdDQ6
+ZnVuY3Rpb24oKXt2YXIgdCxzPXRoaXMscj1zLmEKaWYociE9PSIiJiZyIT09ImZpbGUiKXRocm93IEgu
+YihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgIityKyIgVVJJIikpCmlmKHMu
+Z3RQKCkhPT0iIil0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBh
+IFVSSSB3aXRoIGEgcXVlcnkgY29tcG9uZW50IikpCmlmKHMuZ0thKCkhPT0iIil0aHJvdyBILmIoUC5M
+NCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29t
+cG9uZW50IikpCnI9JC5PeCgpCmlmKEgub1Qocikpcj1QLm1uKHMpCmVsc2V7aWYocy5jIT1udWxsJiZz
+LmdKZihzKSE9PSIiKUgudmgoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93cyBmaWxlIHBh
+dGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5IikpCnQ9cy5nRmooKQpQLmtFKHQsITEp
+CnI9UC52ZyhDLnhCLm4ocy5lLCIvIik/Ii8iOiIiLHQsIi8iKQpyPXIuY2hhckNvZGVBdCgwKT09MD9y
+OnJ9cmV0dXJuIHJ9LApaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmduRCgpfSwKRE46ZnVuY3Rpb24o
+YSxiKXt2YXIgdD10aGlzCmlmKGI9PW51bGwpcmV0dXJuITEKaWYodD09PWIpcmV0dXJuITAKcmV0dXJu
+IHUuRi5iKGIpJiZ0LmE9PT1iLmdGaSgpJiZ0LmMhPW51bGw9PT1iLmdjaigpJiZ0LmI9PT1iLmdrdSgp
+JiZ0LmdKZih0KT09PWIuZ0pmKGIpJiZ0Lmd0cCh0KT09PWIuZ3RwKGIpJiZ0LmU9PT1iLmdJaShiKSYm
+dC5mIT1udWxsPT09Yi5nUUQoKSYmdC5ndFAoKT09PWIuZ3RQKCkmJnQuciE9bnVsbD09PWIuZ1o4KCkm
+JnQuZ0thKCk9PT1iLmdLYSgpfSwKc0twOmZ1bmN0aW9uKGEpe3RoaXMueT11LmEuYShhKX0sCnNOTTpm
+dW5jdGlvbihhKXt0aGlzLlE9dS5mLmEoYSl9LAokaWlEOjEsCmdGaTpmdW5jdGlvbigpe3JldHVybiB0
+aGlzLmF9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZX19ClAuUloucHJvdG90eXBlPXsKJDE6
+ZnVuY3Rpb24oYSl7cmV0dXJuIFAuZVAoQy5aSixILmMoYSksQy54TSwhMSl9LAokUzo0fQpQLk1FLnBy
+b3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcy5iLHM9dGhpcy5hCnQuYSs9cy5hCnMu
+YT0iJiIKcz10LmErPUguZChQLmVQKEMuRjMsYSxDLnhNLCEwKSkKaWYoYiE9bnVsbCYmYi5sZW5ndGgh
+PT0wKXt0LmE9cysiPSIKdC5hKz1ILmQoUC5lUChDLkYzLGIsQy54TSwhMCkpfX0sCiRTOjIyfQpQLnk1
+LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILmMoYSkKaWYoYj09bnVsbHx8dHlw
+ZW9mIGI9PSJzdHJpbmciKXRoaXMuYS4kMihhLEguYyhiKSkKZWxzZSBmb3IodD1KLklUKHUuUi5hKGIp
+KSxzPXRoaXMuYTt0LkYoKTspcy4kMihhLEguYyh0LmdsKCkpKX0sCiRTOjEzfQpQLlBFLnByb3RvdHlw
+ZT17CmdsUjpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcyxvPW51bGwsbj1wLmMKaWYobj09bnVs
+bCl7bj1wLmIKaWYoMD49bi5sZW5ndGgpcmV0dXJuIEguayhuLDApCnQ9cC5hCm49blswXSsxCnM9Qy54
+Qi5YVSh0LCI/IixuKQpyPXQubGVuZ3RoCmlmKHM+PTApe3E9UC5QSSh0LHMrMSxyLEMuVkMsITEpCnI9
+c31lbHNlIHE9bwpuPXAuYz1uZXcgUC5xZSgiZGF0YSIsIiIsbyxvLFAuUEkodCxuLHIsQy5XZCwhMSks
+cSxvKX1yZXR1cm4gbn0sClo6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLmIKaWYoMD49cy5sZW5ndGgp
+cmV0dXJuIEguayhzLDApCnQ9dGhpcy5hCnJldHVybiBzWzBdPT09LTE/ImRhdGE6Iit0OnR9fQpQLnEz
+LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVWludDhBcnJheSg5Nil9LAokUzoy
+M30KUC55SS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYQppZihhPj10Lmxl
+bmd0aClyZXR1cm4gSC5rKHQsYSkKdD10W2FdCkouQ00odCwwLDk2LGIpCnJldHVybiB0fSwKJFM6MjR9
+ClAuYzYucHJvdG90eXBlPXsKJDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxCmZvcih0PWIubGVu
+Z3RoLHM9YS5sZW5ndGgscj0wO3I8dDsrK3Ipe3E9Qy54Qi5XKGIscileOTYKaWYocT49cylyZXR1cm4g
+SC5rKGEscSkKYVtxXT1jfX19ClAucWQucHJvdG90eXBlPXsKJDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
+LHMscixxCmZvcih0PUMueEIuVyhiLDApLHM9Qy54Qi5XKGIsMSkscj1hLmxlbmd0aDt0PD1zOysrdCl7
+cT0odF45Nik+Pj4wCmlmKHE+PXIpcmV0dXJuIEguayhhLHEpCmFbcV09Y319fQpQLlVmLnByb3RvdHlw
+ZT17CmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3JldHVybiB0
+aGlzLmM+MCYmdGhpcy5kKzE8dGhpcy5lfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZjx0aGlz
+LnJ9LApnWjg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yPHRoaXMuYS5sZW5ndGh9LApnTnc6ZnVuY3Rp
+b24oKXtyZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uKHRoaXMuYSwiZmlsZSIpfSwKZ3ZoOmZ1bmN0aW9u
+KCl7cmV0dXJuIHRoaXMuYj09PTQmJkMueEIubih0aGlzLmEsImh0dHAiKX0sCmdSZTpmdW5jdGlvbigp
+e3JldHVybiB0aGlzLmI9PT01JiZDLnhCLm4odGhpcy5hLCJodHRwcyIpfSwKZ3RUOmZ1bmN0aW9uKCl7
+cmV0dXJuIEMueEIuUWkodGhpcy5hLCIvIix0aGlzLmUpfSwKZ0ZpOmZ1bmN0aW9uKCl7dmFyIHQ9dGhp
+cy54CnJldHVybiB0PT1udWxsP3RoaXMueD10aGlzLlUyKCk6dH0sClUyOmZ1bmN0aW9uKCl7dmFyIHQ9
+dGhpcyxzPXQuYgppZihzPD0wKXJldHVybiIiCmlmKHQuZ3ZoKCkpcmV0dXJuImh0dHAiCmlmKHQuZ1Jl
+KCkpcmV0dXJuImh0dHBzIgppZih0LmdOdygpKXJldHVybiJmaWxlIgppZihzPT09NyYmQy54Qi5uKHQu
+YSwicGFja2FnZSIpKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gQy54Qi5Oaih0LmEsMCxzKX0sCmdrdTpm
+dW5jdGlvbigpe3ZhciB0PXRoaXMuYyxzPXRoaXMuYiszCnJldHVybiB0PnM/Qy54Qi5Oaih0aGlzLmEs
+cyx0LTEpOiIifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYwpyZXR1cm4gdD4wP0MueEIuTmoo
+dGhpcy5hLHQsdGhpcy5kKToiIn0sCmd0cDpmdW5jdGlvbihhKXt2YXIgdD10aGlzCmlmKHQuZ3hBKCkp
+cmV0dXJuIFAuUUEoQy54Qi5Oaih0LmEsdC5kKzEsdC5lKSxudWxsKQppZih0Lmd2aCgpKXJldHVybiA4
+MAppZih0LmdSZSgpKXJldHVybiA0NDMKcmV0dXJuIDB9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIEMu
+eEIuTmoodGhpcy5hLHRoaXMuZSx0aGlzLmYpfSwKZ3RQOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mLHM9
+dGhpcy5yCnJldHVybiB0PHM/Qy54Qi5Oaih0aGlzLmEsdCsxLHMpOiIifSwKZ0thOmZ1bmN0aW9uKCl7
+dmFyIHQ9dGhpcy5yLHM9dGhpcy5hCnJldHVybiB0PHMubGVuZ3RoP0MueEIuRyhzLHQrMSk6IiJ9LApn
+Rmo6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcy5lLHE9dGhpcy5mLHA9dGhpcy5hCmlmKEMueEIuUWko
+cCwiLyIscikpKytyCmlmKHI9PT1xKXJldHVybiBDLnhECnQ9SC5WTShbXSx1LnMpCmZvcihzPXI7czxx
+OysrcylpZihDLnhCLm0ocCxzKT09PTQ3KXtDLk5tLmkodCxDLnhCLk5qKHAscixzKSkKcj1zKzF9Qy5O
+bS5pKHQsQy54Qi5OaihwLHIscSkpCnJldHVybiBQLkFGKHQsdS5OKX0sCmdoWTpmdW5jdGlvbigpe2lm
+KHRoaXMuZj49dGhpcy5yKXJldHVybiBDLldPCnJldHVybiBuZXcgUC5HaihQLldYKHRoaXMuZ3RQKCkp
+LHUuRCl9LAprWDpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmQrMQpyZXR1cm4gdCthLmxlbmd0aD09PXRo
+aXMuZSYmQy54Qi5RaSh0aGlzLmEsYSx0KX0sCk45OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxzPXQucixy
+PXQuYQppZihzPj1yLmxlbmd0aClyZXR1cm4gdApyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihyLDAscyks
+dC5iLHQuYyx0LmQsdC5lLHQuZixzLHQueCl9LApubTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAs
+byxuLG0sbCxrLGo9dGhpcyxpPW51bGwKdS5YLmEobnVsbCkKdS5iLmEoYikKdD1qLmdGaSgpCnM9dD09
+PSJmaWxlIgpyPWouYwpxPXI+MD9DLnhCLk5qKGouYSxqLmIrMyxyKToiIgpwPWouZ3hBKCk/ai5ndHAo
+aik6aQpyPWouYwppZihyPjApbz1DLnhCLk5qKGouYSxyLGouZCkKZWxzZSBvPXEubGVuZ3RoIT09MHx8
+cCE9bnVsbHx8cz8iIjppCnI9ai5hCm49Qy54Qi5OaihyLGouZSxqLmYpCmlmKCFzKW09byE9bnVsbCYm
+bi5sZW5ndGghPT0wCmVsc2UgbT0hMAppZihtJiYhQy54Qi5uKG4sIi8iKSluPSIvIituCmw9UC5sZShp
+LDAsMCxiKQptPWoucgprPW08ci5sZW5ndGg/Qy54Qi5HKHIsbSsxKTppCnJldHVybiBuZXcgUC5Ebih0
+LHEsbyxwLG4sbCxrKX0sClpJOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVM6
+ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpyZXR1
+cm4gdGhpcy52cygpLm1TKGEpfSwKdTE6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixtLGws
+ayxqLGksaD1iLmIKaWYoaD4wKXJldHVybiBiCnQ9Yi5jCmlmKHQ+MCl7cz1hLmIKaWYoczw9MClyZXR1
+cm4gYgppZihhLmdOdygpKXI9Yi5lIT09Yi5mCmVsc2UgaWYoYS5ndmgoKSlyPSFiLmtYKCI4MCIpCmVs
+c2Ugcj0hYS5nUmUoKXx8IWIua1goIjQ0MyIpCmlmKHIpe3E9cysxCnJldHVybiBuZXcgUC5VZihDLnhC
+Lk5qKGEuYSwwLHEpK0MueEIuRyhiLmEsaCsxKSxzLHQrcSxiLmQrcSxiLmUrcSxiLmYrcSxiLnIrcSxh
+LngpfWVsc2UgcmV0dXJuIHRoaXMudnMoKS5tUyhiKX1wPWIuZQpoPWIuZgppZihwPT09aCl7dD1iLnIK
+aWYoaDx0KXtzPWEuZgpxPXMtaApyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxzKStDLnhCLkco
+Yi5hLGgpLGEuYixhLmMsYS5kLGEuZSxoK3EsdCtxLGEueCl9aD1iLmEKaWYodDxoLmxlbmd0aCl7cz1h
+LnIKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAscykrQy54Qi5HKGgsdCksYS5iLGEuYyxhLmQs
+YS5lLGEuZix0KyhzLXQpLGEueCl9cmV0dXJuIGEuTjkoKX10PWIuYQppZihDLnhCLlFpKHQsIi8iLHAp
+KXtzPWEuZQpxPXMtcApyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxzKStDLnhCLkcodCxwKSxh
+LmIsYS5jLGEuZCxzLGgrcSxiLnIrcSxhLngpfW89YS5lCm49YS5mCmlmKG89PT1uJiZhLmM+MCl7Zm9y
+KDtDLnhCLlFpKHQsIi4uLyIscCk7KXArPTMKcT1vLXArMQpyZXR1cm4gbmV3IFAuVWYoQy54Qi5Oaihh
+LmEsMCxvKSsiLyIrQy54Qi5HKHQscCksYS5iLGEuYyxhLmQsbyxoK3EsYi5yK3EsYS54KX1tPWEuYQpm
+b3IobD1vO0MueEIuUWkobSwiLi4vIixsKTspbCs9MwprPTAKd2hpbGUoITApe2o9cCszCmlmKCEoajw9
+aCYmQy54Qi5RaSh0LCIuLi8iLHApKSlicmVhazsrK2sKcD1qfWZvcihpPSIiO24+bDspey0tbgppZihD
+LnhCLm0obSxuKT09PTQ3KXtpZihrPT09MCl7aT0iLyIKYnJlYWt9LS1rCmk9Ii8ifX1pZihuPT09bCYm
+YS5iPD0wJiYhQy54Qi5RaShtLCIvIixvKSl7cC09ayozCmk9IiJ9cT1uLXAraS5sZW5ndGgKcmV0dXJu
+IG5ldyBQLlVmKEMueEIuTmoobSwwLG4pK2krQy54Qi5HKHQscCksYS5iLGEuYyxhLmQsbyxoK3EsYi5y
+K3EsYS54KX0sCnQ0OmZ1bmN0aW9uKCl7dmFyIHQscyxyLHE9dGhpcwppZihxLmI+PTAmJiFxLmdOdygp
+KXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgIitxLmdGaSgp
+KyIgVVJJIikpCnQ9cS5mCnM9cS5hCmlmKHQ8cy5sZW5ndGgpe2lmKHQ8cS5yKXRocm93IEguYihQLkw0
+KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBxdWVyeSBjb21wb25l
+bnQiKSkKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkg
+d2l0aCBhIGZyYWdtZW50IGNvbXBvbmVudCIpKX1yPSQuT3goKQppZihILm9UKHIpKXQ9UC5tbihxKQpl
+bHNle2lmKHEuYzxxLmQpSC52aChQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIG5vbi1XaW5kb3dzIGZpbGUg
+cGF0aCBmcm9tIGEgZmlsZSBVUkkgd2l0aCBhbiBhdXRob3JpdHkiKSkKdD1DLnhCLk5qKHMscS5lLHQp
+fXJldHVybiB0fSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMueQpyZXR1cm4gdD09bnVsbD90aGlz
+Lnk9Qy54Qi5naU8odGhpcy5hKTp0fSwKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiEx
+CmlmKHRoaXM9PT1iKXJldHVybiEwCnJldHVybiB1LkYuYihiKSYmdGhpcy5hPT09Yi5aKDApfSwKdnM6
+ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9bnVsbCxyPXQuZ0ZpKCkscT10LmdrdSgpLHA9dC5jPjA/dC5n
+SmYodCk6cyxvPXQuZ3hBKCk/dC5ndHAodCk6cyxuPXQuYSxtPXQuZixsPUMueEIuTmoobix0LmUsbSks
+az10LnIKbT1tPGs/dC5ndFAoKTpzCnJldHVybiBuZXcgUC5EbihyLHEscCxvLGwsbSxrPG4ubGVuZ3Ro
+P3QuZ0thKCk6cyl9LApaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LAokaWlEOjF9ClAucWUucHJv
+dG90eXBlPXt9ClcucUUucHJvdG90eXBlPXt9ClcuR2gucHJvdG90eXBlPXsKWjpmdW5jdGlvbihhKXty
+ZXR1cm4gU3RyaW5nKGEpfSwKJGlHaDoxfQpXLmZZLnByb3RvdHlwZT17Clo6ZnVuY3Rpb24oYSl7cmV0
+dXJuIFN0cmluZyhhKX19ClcubkIucHJvdG90eXBlPXskaW5COjF9ClcuQXoucHJvdG90eXBlPXskaUF6
+OjF9ClcuUVAucHJvdG90eXBlPXskaVFQOjF9ClcubngucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7
+cmV0dXJuIGEubGVuZ3RofX0KVy5vSi5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5s
+ZW5ndGh9fQpXLmlkLnByb3RvdHlwZT17fQpXLlFGLnByb3RvdHlwZT17fQpXLk5oLnByb3RvdHlwZT17
+Clo6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX19ClcuSUIucHJvdG90eXBlPXsKWjpmdW5jdGlv
+bihhKXtyZXR1cm4iUmVjdGFuZ2xlICgiK0guZChhLmxlZnQpKyIsICIrSC5kKGEudG9wKSsiKSAiK0gu
+ZChhLndpZHRoKSsiIHggIitILmQoYS5oZWlnaHQpfSwKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxs
+KXJldHVybiExCnJldHVybiB1Lk8uYihiKSYmYS5sZWZ0PT1iLmxlZnQmJmEudG9wPT1iLnRvcCYmYS53
+aWR0aD09Yi53aWR0aCYmYS5oZWlnaHQ9PWIuaGVpZ2h0fSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBX
+LnJFKEouaGYoYS5sZWZ0KSxKLmhmKGEudG9wKSxKLmhmKGEud2lkdGgpLEouaGYoYS5oZWlnaHQpKX0s
+CiRpdG46MX0KVy5uNy5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpX
+Lnd6LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKcTpmdW5j
+dGlvbihhLGIpe3ZhciB0CkguV1koYikKdD10aGlzLmEKaWYoYjwwfHxiPj10Lmxlbmd0aClyZXR1cm4g
+SC5rKHQsYikKcmV0dXJuIHRoaXMuJHRpLmMuYSh0W2JdKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3RoaXMu
+JHRpLmMuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSBsaXN0IikpfX0KVy5jdi5wcm90
+b3R5cGU9ewpnUWc6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLmk3KGEpfSwKZ1A6ZnVuY3Rpb24oYSl7
+cmV0dXJuIG5ldyBXLkk0KGEpfSwKc1A6ZnVuY3Rpb24oYSxiKXt2YXIgdAp1LlguYShiKQp0PXRoaXMu
+Z1AoYSkKdC5WMSgwKQp0LkZWKDAsYil9LApaOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxvY2FsTmFtZX0s
+CkZGOmZ1bmN0aW9uKGEpe3ZhciB0PSEhYS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkCmlmKHQpYS5zY3Jv
+bGxJbnRvVmlld0lmTmVlZGVkKCkKZWxzZSBhLnNjcm9sbEludG9WaWV3KCl9LApuejpmdW5jdGlvbihh
+LGIsYyxkLGUpe3ZhciB0LHM9dGhpcy5yNihhLGMsZCxlKQpzd2l0Y2goYi50b0xvd2VyQ2FzZSgpKXtj
+YXNlImJlZm9yZWJlZ2luIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHMsYSkKYnJlYWsKY2FzZSJh
+ZnRlcmJlZ2luIjp0PWEuY2hpbGROb2RlcwphLmluc2VydEJlZm9yZShzLHQubGVuZ3RoPjA/dFswXTpu
+dWxsKQpicmVhawpjYXNlImJlZm9yZWVuZCI6YS5hcHBlbmRDaGlsZChzKQpicmVhawpjYXNlImFmdGVy
+ZW5kIjp0PWEucGFyZW50Tm9kZQp0LnRvU3RyaW5nCnQuaW5zZXJ0QmVmb3JlKHMsYS5uZXh0U2libGlu
+ZykKYnJlYWsKZGVmYXVsdDpILnZoKFAueFkoIkludmFsaWQgcG9zaXRpb24gIitiKSl9fSwKcjY6ZnVu
+Y3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyLHEKaWYoYz09bnVsbCl7aWYoZD09bnVsbCl7dD0kLmx0Cmlm
+KHQ9PW51bGwpe3Q9SC5WTShbXSx1LmspCnM9bmV3IFcudkQodCkKQy5ObS5pKHQsVy5UdyhudWxsKSkK
+Qy5ObS5pKHQsVy5CbCgpKQokLmx0PXMKZD1zfWVsc2UgZD10fXQ9JC5FVQppZih0PT1udWxsKXt0PW5l
+dyBXLktvKGQpCiQuRVU9dApjPXR9ZWxzZXt0LmE9ZApjPXR9fWVsc2UgaWYoZCE9bnVsbCl0aHJvdyBI
+LmIoUC54WSgidmFsaWRhdG9yIGNhbiBvbmx5IGJlIHBhc3NlZCBpZiB0cmVlU2FuaXRpemVyIGlzIG51
+bGwiKSkKaWYoJC54bz09bnVsbCl7dD1kb2N1bWVudApzPXQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRN
+TERvY3VtZW50KCIiKQokLnhvPXMKJC5CTz1zLmNyZWF0ZVJhbmdlKCkKcz0kLnhvLmNyZWF0ZUVsZW1l
+bnQoImJhc2UiKQp1LmNSLmEocykKcy5ocmVmPXQuYmFzZVVSSQokLnhvLmhlYWQuYXBwZW5kQ2hpbGQo
+cyl9dD0kLnhvCmlmKHQuYm9keT09bnVsbCl7cz10LmNyZWF0ZUVsZW1lbnQoImJvZHkiKQp0LmJvZHk9
+dS5pLmEocyl9dD0kLnhvCmlmKHUuaS5iKGEpKXt0PXQuYm9keQp0LnRvU3RyaW5nCnI9dH1lbHNle3Qu
+dG9TdHJpbmcKcj10LmNyZWF0ZUVsZW1lbnQoYS50YWdOYW1lKQokLnhvLmJvZHkuYXBwZW5kQ2hpbGQo
+cil9aWYoImNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCIgaW4gd2luZG93LlJhbmdlLnByb3RvdHlwZSYm
+IUMuTm0udGcoQy5TcSxhLnRhZ05hbWUpKXskLkJPLnNlbGVjdE5vZGVDb250ZW50cyhyKQpxPSQuQk8u
+Y3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGIpfWVsc2V7ci5pbm5lckhUTUw9YgpxPSQueG8uY3JlYXRl
+RG9jdW1lbnRGcmFnbWVudCgpCmZvcig7dD1yLmZpcnN0Q2hpbGQsdCE9bnVsbDspcS5hcHBlbmRDaGls
+ZCh0KX1pZihyIT09JC54by5ib2R5KUouTHQocikKYy5QbihxKQpkb2N1bWVudC5hZG9wdE5vZGUocSkK
+cmV0dXJuIHF9LApBSDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMucjYoYSxiLGMsbnVsbCl9LApz
+aGY6ZnVuY3Rpb24oYSxiKXt0aGlzLllDKGEsYil9LApwazpmdW5jdGlvbihhLGIsYyl7YS50ZXh0Q29u
+dGVudD1udWxsCmEuYXBwZW5kQ2hpbGQodGhpcy5yNihhLGIsbnVsbCxjKSl9LApZQzpmdW5jdGlvbihh
+LGIpe3JldHVybiB0aGlzLnBrKGEsYixudWxsKX0sCmduczpmdW5jdGlvbihhKXtyZXR1cm4gYS50YWdO
+YW1lfSwKZ1ZsOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVy5ldShhLCJjbGljayIsITEsdS5RKX0sCiRp
+Y3Y6MX0KVy5Ddi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5oLmIodS5BLmEoYSkp
+fSwKJFM6MjV9ClcuZWEucHJvdG90eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBlPXsKT246ZnVuY3Rp
+b24oYSxiLGMsZCl7dS5VLmEoYykKaWYoYyE9bnVsbCl0aGlzLnYoYSxiLGMsZCl9LApCOmZ1bmN0aW9u
+KGEsYixjKXtyZXR1cm4gdGhpcy5PbihhLGIsYyxudWxsKX0sCnY6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0
+dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcihiLEgudFIodS5VLmEoYyksMSksZCl9LAokaUQwOjF9ClcuVDUu
+cHJvdG90eXBlPXskaVQ1OjF9ClcuaDQucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEu
+bGVuZ3RofX0KVy5ici5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpX
+LlZiLnByb3RvdHlwZT17fQpXLmZKLnByb3RvdHlwZT17CmVvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVy
+biBhLm9wZW4oYixjLCEwKX0sCiRpZko6MX0KVy5iVS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIp
+e3RoaXMuYS5zZXRSZXF1ZXN0SGVhZGVyKEguYyhhKSxILmMoYikpfSwKJFM6OH0KVy5oSC5wcm90b3R5
+cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwCnUucC5hKGEpCnQ9dGhpcy5hCnM9dC5zdGF0
+dXMKaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy50QigpCnI9cz49MjAwJiZzPDMwMApxPXM+
+MzA3JiZzPDQwMApzPXJ8fHM9PT0wfHxzPT09MzA0fHxxCnA9dGhpcy5iCmlmKHMpcC5hTSgwLHQpCmVs
+c2UgcC5wbShhKX0sCiRTOjE0fQpXLndhLnByb3RvdHlwZT17fQpXLlNnLnByb3RvdHlwZT17JGlTZzox
+fQpXLnU4LnByb3RvdHlwZT17CmdEcjpmdW5jdGlvbihhKXtpZigib3JpZ2luIiBpbiBhKXJldHVybiBh
+Lm9yaWdpbgpyZXR1cm4gSC5kKGEucHJvdG9jb2wpKyIvLyIrSC5kKGEuaG9zdCl9LApaOmZ1bmN0aW9u
+KGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXU4OjF9ClcuT0sucHJvdG90eXBlPXskaU9LOjF9ClcuZTcu
+cHJvdG90eXBlPXsKZ3I4OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYSxzPXQuY2hpbGROb2Rlcy5sZW5n
+dGgKaWYocz09PTApdGhyb3cgSC5iKFAuUFYoIk5vIGVsZW1lbnRzIikpCmlmKHM+MSl0aHJvdyBILmIo
+UC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50IikpCnJldHVybiB0LmZpcnN0Q2hpbGR9LApGVjpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscixxLHAKdS5laC5hKGIpCnQ9Yi5hCnM9dGhpcy5hCmlmKHQhPT1zKWZv
+cihyPXQuY2hpbGROb2Rlcy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9dC5maXJzdENoaWxkCnAudG9TdHJp
+bmcKcy5hcHBlbmRDaGlsZChwKX1yZXR1cm59LApZOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzCnUuQS5h
+KGMpCnQ9dGhpcy5hCnM9dC5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49cy5sZW5ndGgpcmV0dXJuIEguayhz
+LGIpCnQucmVwbGFjZUNoaWxkKGMsc1tiXSl9LApna3o6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hLmNo
+aWxkTm9kZXMKcmV0dXJuIG5ldyBXLlc5KHQsdC5sZW5ndGgsSC5xKHQpLkMoIlc5PEdtLkU+IikpfSwK
+Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5jaGlsZE5vZGVzLmxlbmd0aH0sCnE6ZnVuY3Rpb24o
+YSxiKXt2YXIgdApILldZKGIpCnQ9dGhpcy5hLmNoaWxkTm9kZXMKaWYoYjwwfHxiPj10Lmxlbmd0aCly
+ZXR1cm4gSC5rKHQsYikKcmV0dXJuIHRbYl19fQpXLnVILnByb3RvdHlwZT17CndnOmZ1bmN0aW9uKGEp
+e3ZhciB0PWEucGFyZW50Tm9kZQppZih0IT1udWxsKXQucmVtb3ZlQ2hpbGQoYSl9LApENDpmdW5jdGlv
+bihhKXt2YXIgdApmb3IoO3Q9YS5maXJzdENoaWxkLHQhPW51bGw7KWEucmVtb3ZlQ2hpbGQodCl9LApa
+OmZ1bmN0aW9uKGEpe3ZhciB0PWEubm9kZVZhbHVlCnJldHVybiB0PT1udWxsP3RoaXMuVShhKTp0fSwK
+JGl1SDoxfQpXLkJILnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6
+ZnVuY3Rpb24oYSxiKXtILldZKGIpCmlmKGI+Pj4wIT09Ynx8Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAu
+dChiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe3UuQS5h
+KGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgYXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxlIExpc3Qu
+IikpfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguayhhLGIpCnJl
+dHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLlNOLnByb3RvdHlwZT17
+fQpXLmV3LnByb3RvdHlwZT17JGlldzoxfQpXLmxwLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBhLmxlbmd0aH19ClcuVGIucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQs
+cwppZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlKXJl
+dHVybiB0aGlzLkRXKGEsYixjLGQpCnQ9Vy5VOSgiPHRhYmxlPiIrSC5kKGIpKyI8L3RhYmxlPiIsYyxk
+KQpzPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpzLnRvU3RyaW5nCnQudG9TdHJpbmcK
+bmV3IFcuZTcocykuRlYoMCxuZXcgVy5lNyh0KSkKcmV0dXJuIHN9fQpXLkl2LnByb3RvdHlwZT17CnI2
+OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQi
+IGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKdD1kb2N1bWVu
+dApzPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnQ9Qy5JZS5yNih0LmNyZWF0ZUVsZW1lbnQoInRh
+YmxlIiksYixjLGQpCnQudG9TdHJpbmcKdD1uZXcgVy5lNyh0KQpyPXQuZ3I4KHQpCnIudG9TdHJpbmcK
+dD1uZXcgVy5lNyhyKQpxPXQuZ3I4KHQpCnMudG9TdHJpbmcKcS50b1N0cmluZwpuZXcgVy5lNyhzKS5G
+VigwLG5ldyBXLmU3KHEpKQpyZXR1cm4gc319ClcuV1AucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24oYSxi
+LGMsZCl7dmFyIHQscyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5n
+ZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKdD1kb2N1bWVudApzPXQuY3JlYXRlRG9j
+dW1lbnRGcmFnbWVudCgpCnQ9Qy5JZS5yNih0LmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnQu
+dG9TdHJpbmcKdD1uZXcgVy5lNyh0KQpyPXQuZ3I4KHQpCnMudG9TdHJpbmcKci50b1N0cmluZwpuZXcg
+Vy5lNyhzKS5GVigwLG5ldyBXLmU3KHIpKQpyZXR1cm4gc319ClcueVkucHJvdG90eXBlPXsKcGs6ZnVu
+Y3Rpb24oYSxiLGMpe3ZhciB0LHMKYS50ZXh0Q29udGVudD1udWxsCnQ9YS5jb250ZW50CnQudG9TdHJp
+bmcKSi5iVCh0KQpzPXRoaXMucjYoYSxiLG51bGwsYykKYS5jb250ZW50LmFwcGVuZENoaWxkKHMpfSwK
+WUM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wayhhLGIsbnVsbCl9LAokaXlZOjF9ClcudzYucHJv
+dG90eXBlPXt9ClcuSzUucHJvdG90eXBlPXsKUG86ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PVcuUDEoYS5v
+cGVuKGIsYykpCnJldHVybiB0fSwKZ21XOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxvY2F0aW9ufSwKJGlL
+NToxLAokaXY2OjF9ClcuQ20ucHJvdG90eXBlPXskaUNtOjF9ClcuQ1EucHJvdG90eXBlPXskaUNROjF9
+ClcudzQucHJvdG90eXBlPXsKWjpmdW5jdGlvbihhKXtyZXR1cm4iUmVjdGFuZ2xlICgiK0guZChhLmxl
+ZnQpKyIsICIrSC5kKGEudG9wKSsiKSAiK0guZChhLndpZHRoKSsiIHggIitILmQoYS5oZWlnaHQpfSwK
+RE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVybiB1Lk8uYihiKSYmYS5sZWZ0
+PT1iLmxlZnQmJmEudG9wPT1iLnRvcCYmYS53aWR0aD09Yi53aWR0aCYmYS5oZWlnaHQ9PWIuaGVpZ2h0
+fSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBXLnJFKEouaGYoYS5sZWZ0KSxKLmhmKGEudG9wKSxKLmhm
+KGEud2lkdGgpLEouaGYoYS5oZWlnaHQpKX19ClcucmgucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7
+cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guV1koYikKaWYoYj4+PjAhPT1ifHxiPj1h
+Lmxlbmd0aCl0aHJvdyBILmIoUC50KGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpm
+dW5jdGlvbihhLGIsYyl7dS5BLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVu
+dCBvZiBpbW11dGFibGUgTGlzdC4iKSl9LApFOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0
+aClyZXR1cm4gSC5rKGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGljWDoxLAokaXpN
+OjF9ClcuY2YucHJvdG90eXBlPXsKSzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAKdS5lQS5hKGIp
+CmZvcih0PXRoaXMuZ1YoKSxzPXQubGVuZ3RoLHI9dGhpcy5hLHE9MDtxPHQubGVuZ3RoO3QubGVuZ3Ro
+PT09c3x8KDAsSC5saykodCksKytxKXtwPXRbcV0KYi4kMihwLHIuZ2V0QXR0cmlidXRlKHApKX19LApn
+VjpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcy5hLmF0dHJpYnV0ZXMsbz1ILlZNKFtdLHUucykK
+Zm9yKHQ9cC5sZW5ndGgscz11Lmg5LHI9MDtyPHQ7KytyKXtpZihyPj1wLmxlbmd0aClyZXR1cm4gSC5r
+KHAscikKcT1zLmEocFtyXSkKaWYocS5uYW1lc3BhY2VVUkk9PW51bGwpQy5ObS5pKG8scS5uYW1lKX1y
+ZXR1cm4gb319ClcuaTcucHJvdG90eXBlPXsKeDQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5oYXNB
+dHRyaWJ1dGUoYSl9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS5nZXRBdHRyaWJ1dGUoSC5j
+KGIpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoYixjKX0sCmdBOmZ1bmN0
+aW9uKGEpe3JldHVybiB0aGlzLmdWKCkubGVuZ3RofX0KVy5TeS5wcm90b3R5cGU9ewp4NDpmdW5jdGlv
+bihhKXtyZXR1cm4gdGhpcy5hLmEuaGFzQXR0cmlidXRlKCJkYXRhLSIrdGhpcy5PKGEpKX0sCnE6ZnVu
+Y3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hLmEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrdGhpcy5PKEguYyhi
+KSkpfSwKWTpmdW5jdGlvbihhLGIsYyl7dGhpcy5hLmEuc2V0QXR0cmlidXRlKCJkYXRhLSIrdGhpcy5P
+KGIpLGMpfSwKSzpmdW5jdGlvbihhLGIpe3RoaXMuYS5LKDAsbmV3IFcuS1ModGhpcyx1LmVBLmEoYikp
+KX0sCmdWOmZ1bmN0aW9uKCl7dmFyIHQ9SC5WTShbXSx1LnMpCnRoaXMuYS5LKDAsbmV3IFcuQTModGhp
+cyx0KSkKcmV0dXJuIHR9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aH0sCms6
+ZnVuY3Rpb24oYSl7dmFyIHQscyxyPUguVk0oYS5zcGxpdCgiLSIpLHUucykKZm9yKHQ9MTt0PHIubGVu
+Z3RoOysrdCl7cz1yW3RdCmlmKHMubGVuZ3RoPjApQy5ObS5ZKHIsdCxzWzBdLnRvVXBwZXJDYXNlKCkr
+Si5LVihzLDEpKX1yZXR1cm4gQy5ObS56VihyLCIiKX0sCk86ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEs
+cApmb3IodD1hLmxlbmd0aCxzPTAscj0iIjtzPHQ7KytzKXtxPWFbc10KcD1xLnRvTG93ZXJDYXNlKCkK
+cj0ocSE9PXAmJnM+MD9yKyItIjpyKStwfXJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfX0KVy5L
+Uy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIpKXRoaXMu
+Yi4kMih0aGlzLmEuayhDLnhCLkcoYSw1KSksYil9LAokUzo4fQpXLkEzLnByb3RvdHlwZT17CiQyOmZ1
+bmN0aW9uKGEsYil7aWYoSi5yWShhKS5uKGEsImRhdGEtIikpQy5ObS5pKHRoaXMuYix0aGlzLmEuayhD
+LnhCLkcoYSw1KSkpfSwKJFM6OH0KVy5JNC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKCl7dmFyIHQscyxy
+LHEscD1QLkxzKHUuTikKZm9yKHQ9dGhpcy5hLmNsYXNzTmFtZS5zcGxpdCgiICIpLHM9dC5sZW5ndGgs
+cj0wO3I8czsrK3Ipe3E9Si5UMCh0W3JdKQppZihxLmxlbmd0aCE9PTApcC5pKDAscSl9cmV0dXJuIHB9
+LApwOmZ1bmN0aW9uKGEpe3RoaXMuYS5jbGFzc05hbWU9dS5DLmEoYSkuelYoMCwiICIpfSwKZ0E6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5jbGFzc0xpc3QubGVuZ3RofSwKVjE6ZnVuY3Rpb24oYSl7dGhp
+cy5hLmNsYXNzTmFtZT0iIn0sCnRnOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdC5j
+b250YWlucyhiKQpyZXR1cm4gdH0sCmk6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzLmEuY2xhc3NMaXN0
+LHM9dC5jb250YWlucyhiKQp0LmFkZChiKQpyZXR1cm4hc30sClI6ZnVuY3Rpb24oYSxiKXt2YXIgdD10
+aGlzLmEuY2xhc3NMaXN0LHM9dC5jb250YWlucyhiKQp0LnJlbW92ZShiKQpyZXR1cm4gc30sCkZWOmZ1
+bmN0aW9uKGEsYil7Vy5UTih0aGlzLmEsdS5YLmEoYikpfX0KVy5Gay5wcm90b3R5cGU9e30KVy5STy5w
+cm90b3R5cGU9e30KVy5ldS5wcm90b3R5cGU9e30KVy54Qy5wcm90b3R5cGU9e30KVy52Ti5wcm90b3R5
+cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLiQxKHUuQi5hKGEpKX0sCiRTOjI4fQpXLkpR
+LnByb3RvdHlwZT17CkNZOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKCQub3IuYT09PTApe2Zvcih0PTA7dDwy
+NjI7Kyt0KSQub3IuWSgwLEMuY21bdF0sVy5wUygpKQpmb3IodD0wO3Q8MTI7Kyt0KSQub3IuWSgwLEMu
+QklbdF0sVy5WNCgpKX19LAppMDpmdW5jdGlvbihhKXtyZXR1cm4gJC5BTigpLnRnKDAsVy5yUyhhKSl9
+LApFYjpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9JC5vci5xKDAsSC5kKFcuclMoYSkpKyI6OiIrYikKaWYo
+dD09bnVsbCl0PSQub3IucSgwLCIqOjoiK2IpCmlmKHQ9PW51bGwpcmV0dXJuITEKcmV0dXJuIEguRTko
+dC4kNChhLGIsYyx0aGlzKSl9LAokaWtGOjF9ClcuR20ucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEp
+e3JldHVybiBuZXcgVy5XOShhLHRoaXMuZ0EoYSksSC5xKGEpLkMoIlc5PEdtLkU+IikpfX0KVy52RC5w
+cm90b3R5cGU9ewppMDpmdW5jdGlvbihhKXtyZXR1cm4gQy5ObS5Wcih0aGlzLmEsbmV3IFcuVXYoYSkp
+fSwKRWI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5FZyhhLGIsYykp
+fSwKJGlrRjoxfQpXLlV2LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB1LmUuYShhKS5p
+MCh0aGlzLmEpfSwKJFM6MTV9ClcuRWcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHUu
+ZS5hKGEpLkViKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjE1fQpXLm02LnByb3RvdHlwZT17CkNZ
+OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscgp0aGlzLmEuRlYoMCxjKQp0PWIuZXYoMCxuZXcgVy5F
+bygpKQpzPWIuZXYoMCxuZXcgVy5XaygpKQp0aGlzLmIuRlYoMCx0KQpyPXRoaXMuYwpyLkZWKDAsQy54
+RCkKci5GVigwLHMpfSwKaTA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS50ZygwLFcuclMoYSkpfSwK
+RWI6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PXRoaXMscz1XLnJTKGEpLHI9dC5jCmlmKHIudGcoMCxILmQo
+cykrIjo6IitiKSlyZXR1cm4gdC5kLkR0KGMpCmVsc2UgaWYoci50ZygwLCIqOjoiK2IpKXJldHVybiB0
+LmQuRHQoYykKZWxzZXtyPXQuYgppZihyLnRnKDAsSC5kKHMpKyI6OiIrYikpcmV0dXJuITAKZWxzZSBp
+ZihyLnRnKDAsIio6OiIrYikpcmV0dXJuITAKZWxzZSBpZihyLnRnKDAsSC5kKHMpKyI6OioiKSlyZXR1
+cm4hMAplbHNlIGlmKHIudGcoMCwiKjo6KiIpKXJldHVybiEwfXJldHVybiExfSwKJGlrRjoxfQpXLkVv
+LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiFDLk5tLnRnKEMuQkksSC5jKGEpKX0sCiRT
+Ojd9ClcuV2sucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEMuTm0udGcoQy5CSSxILmMo
+YSkpfSwKJFM6N30KVy5jdC5wcm90b3R5cGU9ewpFYjpmdW5jdGlvbihhLGIsYyl7aWYodGhpcy5qRihh
+LGIsYykpcmV0dXJuITAKaWYoYj09PSJ0ZW1wbGF0ZSImJmM9PT0iIilyZXR1cm4hMAppZihhLmdldEF0
+dHJpYnV0ZSgidGVtcGxhdGUiKT09PSIiKXJldHVybiB0aGlzLmUudGcoMCxiKQpyZXR1cm4hMX19Clcu
+SUEucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIlRFTVBMQVRFOjoiK0guZChILmMoYSkp
+fSwKJFM6NH0KVy5Pdy5wcm90b3R5cGU9ewppMDpmdW5jdGlvbihhKXt2YXIgdAppZih1LmV3LmIoYSkp
+cmV0dXJuITEKdD11Lmc3LmIoYSkKaWYodCYmVy5yUyhhKT09PSJmb3JlaWduT2JqZWN0IilyZXR1cm4h
+MQppZih0KXJldHVybiEwCnJldHVybiExfSwKRWI6ZnVuY3Rpb24oYSxiLGMpe2lmKGI9PT0iaXMifHxD
+LnhCLm4oYiwib24iKSlyZXR1cm4hMQpyZXR1cm4gdGhpcy5pMChhKX0sCiRpa0Y6MX0KVy5XOS5wcm90
+b3R5cGU9ewpGOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxzPXQuYysxLHI9dC5iCmlmKHM8cil7dC5zTShK
+Lng5KHQuYSxzKSkKdC5jPXMKcmV0dXJuITB9dC5zTShudWxsKQp0LmM9cgpyZXR1cm4hMX0sCmdsOmZ1
+bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCnNNOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5jLmEo
+YSl9LAokaUFuOjF9ClcuZFcucHJvdG90eXBlPXsKZ21XOmZ1bmN0aW9uKGEpe3JldHVybiBXLkhIKHRo
+aXMuYS5sb2NhdGlvbil9LAokaUQwOjEsCiRpdjY6MX0KVy5GYi5wcm90b3R5cGU9e30KVy5rRi5wcm90
+b3R5cGU9e30KVy5tay5wcm90b3R5cGU9eyRpeTA6MX0KVy5Lby5wcm90b3R5cGU9ewpQbjpmdW5jdGlv
+bihhKXt2YXIgdD10aGlzLHM9bmV3IFcuZm0odCkKdC5iPSExCnMuJDIoYSxudWxsKQpmb3IoO3QuYjsp
+e3QuYj0hMQpzLiQyKGEsbnVsbCl9fSwKRVA6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzLmI9ITAKaWYo
+YiE9bnVsbD9iIT09YS5wYXJlbnROb2RlOnQpSi5MdChhKQplbHNlIGIucmVtb3ZlQ2hpbGQoYSl9LApJ
+NDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbz0hMCxuPW51bGwsbT1udWxsCnRyeXtuPUouaWco
+YSkKbT1uLmEuZ2V0QXR0cmlidXRlKCJpcyIpCnUuaC5hKGEpCnQ9ZnVuY3Rpb24oYyl7aWYoIShjLmF0
+dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApKXJldHVybiB0cnVlCmlmKGMuaWQ9PSdsYXN0
+Q2hpbGQnfHxjLm5hbWU9PSdsYXN0Q2hpbGQnfHxjLmlkPT0ncHJldmlvdXNTaWJsaW5nJ3x8Yy5uYW1l
+PT0ncHJldmlvdXNTaWJsaW5nJ3x8Yy5pZD09J2NoaWxkcmVuJ3x8Yy5uYW1lPT0nY2hpbGRyZW4nKXJl
+dHVybiB0cnVlCnZhciBsPWMuY2hpbGROb2RlcwppZihjLmxhc3RDaGlsZCYmYy5sYXN0Q2hpbGQhPT1s
+W2wubGVuZ3RoLTFdKXJldHVybiB0cnVlCmlmKGMuY2hpbGRyZW4paWYoIShjLmNoaWxkcmVuIGluc3Rh
+bmNlb2YgSFRNTENvbGxlY3Rpb258fGMuY2hpbGRyZW4gaW5zdGFuY2VvZiBOb2RlTGlzdCkpcmV0dXJu
+IHRydWUKdmFyIGs9MAppZihjLmNoaWxkcmVuKWs9Yy5jaGlsZHJlbi5sZW5ndGgKZm9yKHZhciBqPTA7
+ajxrO2orKyl7dmFyIGk9Yy5jaGlsZHJlbltqXQppZihpLmlkPT0nYXR0cmlidXRlcyd8fGkubmFtZT09
+J2F0dHJpYnV0ZXMnfHxpLmlkPT0nbGFzdENoaWxkJ3x8aS5uYW1lPT0nbGFzdENoaWxkJ3x8aS5pZD09
+J3ByZXZpb3VzU2libGluZyd8fGkubmFtZT09J3ByZXZpb3VzU2libGluZyd8fGkuaWQ9PSdjaGlsZHJl
+bid8fGkubmFtZT09J2NoaWxkcmVuJylyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9KGEpCm89SC5vVCh0
+KT8hMDohKGEuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCl9Y2F0Y2gocSl7SC5SdShx
+KX1zPSJlbGVtZW50IHVucHJpbnRhYmxlIgp0cnl7cz1KLkFjKGEpfWNhdGNoKHEpe0guUnUocSl9dHJ5
+e3I9Vy5yUyhhKQp0aGlzLmtSKHUuaC5hKGEpLGIsbyxzLHIsdS5HLmEobiksSC5jKG0pKX1jYXRjaChx
+KXtpZihILlJ1KHEpIGluc3RhbmNlb2YgUC5BVCl0aHJvdyBxCmVsc2V7dGhpcy5FUChhLGIpCndpbmRv
+dwpwPSJSZW1vdmluZyBjb3JydXB0ZWQgZWxlbWVudCAiK0guZChzKQppZih0eXBlb2YgY29uc29sZSE9
+InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihwKX19fSwKa1I6ZnVuY3Rpb24oYSxiLGMsZCxl
+LGYsZyl7dmFyIHQscyxyLHEscCxvLG49dGhpcwppZihjKXtuLkVQKGEsYikKd2luZG93CnQ9IlJlbW92
+aW5nIGVsZW1lbnQgZHVlIHRvIGNvcnJ1cHRlZCBhdHRyaWJ1dGVzIG9uIDwiK2QrIj4iCmlmKHR5cGVv
+ZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHQpCnJldHVybn1pZighbi5h
+LmkwKGEpKXtuLkVQKGEsYikKd2luZG93CnQ9IlJlbW92aW5nIGRpc2FsbG93ZWQgZWxlbWVudCA8IitI
+LmQoZSkrIj4gZnJvbSAiK0guZChiKQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93
+LmNvbnNvbGUud2Fybih0KQpyZXR1cm59aWYoZyE9bnVsbClpZighbi5hLkViKGEsImlzIixnKSl7bi5F
+UChhLGIpCndpbmRvdwp0PSJSZW1vdmluZyBkaXNhbGxvd2VkIHR5cGUgZXh0ZW5zaW9uIDwiK0guZChl
+KSsnIGlzPSInK2crJyI+JwppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNv
+bGUud2Fybih0KQpyZXR1cm59dD1mLmdWKCkKcz1ILlZNKHQuc2xpY2UoMCksSC50Nih0KS5DKCJqZDwx
+PiIpKQpmb3Iocj1mLmdWKCkubGVuZ3RoLTEsdD1mLmE7cj49MDstLXIpe2lmKHI+PXMubGVuZ3RoKXJl
+dHVybiBILmsocyxyKQpxPXNbcl0KcD1uLmEKbz1KLmNIKHEpCkguYyhxKQppZighcC5FYihhLG8sdC5n
+ZXRBdHRyaWJ1dGUocSkpKXt3aW5kb3cKcD0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBhdHRyaWJ1dGUgPCIr
+SC5kKGUpKyIgIitxKyc9IicrSC5kKHQuZ2V0QXR0cmlidXRlKHEpKSsnIj4nCmlmKHR5cGVvZiBjb25z
+b2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHApCnQucmVtb3ZlQXR0cmlidXRlKHEp
+fX1pZih1LmFXLmIoYSkpbi5QbihhLmNvbnRlbnQpfSwKJGlvbjoxfQpXLmZtLnByb3RvdHlwZT17CiQy
+OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG49dGhpcy5hCnN3aXRjaChhLm5vZGVUeXBlKXtj
+YXNlIDE6bi5JNChhLGIpCmJyZWFrCmNhc2UgODpjYXNlIDExOmNhc2UgMzpjYXNlIDQ6YnJlYWsKZGVm
+YXVsdDpuLkVQKGEsYil9dD1hLmxhc3RDaGlsZApmb3Iocj11LkE7bnVsbCE9dDspe3M9bnVsbAp0cnl7
+cz10LnByZXZpb3VzU2libGluZwppZihzIT1udWxsKXtxPXMubmV4dFNpYmxpbmcKcD10CnA9cT09bnVs
+bD9wIT1udWxsOnEhPT1wCnE9cH1lbHNlIHE9ITEKaWYocSl7cT1QLlBWKCJDb3JydXB0IEhUTUwiKQp0
+aHJvdyBILmIocSl9fWNhdGNoKG8pe0guUnUobykKcT1yLmEodCkKbi5iPSEwCnA9cS5wYXJlbnROb2Rl
+CnA9YT09bnVsbD9wIT1udWxsOmEhPT1wCmlmKHApe3A9cS5wYXJlbnROb2RlCmlmKHAhPW51bGwpcC5y
+ZW1vdmVDaGlsZChxKX1lbHNlIGEucmVtb3ZlQ2hpbGQocSkKdD1udWxsCnM9YS5sYXN0Q2hpbGR9aWYo
+dCE9bnVsbCl0aGlzLiQyKHQsYSkKdD1zfX0sCiRTOjMxfQpXLkxlLnByb3RvdHlwZT17fQpXLks3LnBy
+b3RvdHlwZT17fQpXLnJCLnByb3RvdHlwZT17fQpXLlhXLnByb3RvdHlwZT17fQpXLm9hLnByb3RvdHlw
+ZT17fQpQLmlKLnByb3RvdHlwZT17ClZIOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5hLHI9cy5sZW5n
+dGgKZm9yKHQ9MDt0PHI7Kyt0KWlmKHNbdF09PT1hKXJldHVybiB0CkMuTm0uaShzLGEpCkMuTm0uaSh0
+aGlzLmIsbnVsbCkKcmV0dXJuIHJ9LApQdjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT10aGlzLHA9e30K
+aWYoYT09bnVsbClyZXR1cm4gYQppZihILnJRKGEpKXJldHVybiBhCmlmKHR5cGVvZiBhPT0ibnVtYmVy
+IilyZXR1cm4gYQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGEKaWYoYSBpbnN0YW5jZW9mIFAu
+aVApcmV0dXJuIG5ldyBEYXRlKGEuYSkKaWYodS5mdi5iKGEpKXRocm93IEguYihQLm4oInN0cnVjdHVy
+ZWQgY2xvbmUgb2YgUmVnRXhwIikpCmlmKHUuYzguYihhKSlyZXR1cm4gYQppZih1LmQuYihhKSlyZXR1
+cm4gYQppZih1LkkuYihhKSlyZXR1cm4gYQp0PXUuZEQuYihhKXx8ITEKaWYodClyZXR1cm4gYQppZih1
+LkcuYihhKSl7cz1xLlZIKGEpCnQ9cS5iCmlmKHM+PXQubGVuZ3RoKXJldHVybiBILmsodCxzKQpyPXAu
+YT10W3NdCmlmKHIhPW51bGwpcmV0dXJuIHIKcj17fQpwLmE9cgpDLk5tLlkodCxzLHIpCmEuSygwLG5l
+dyBQLmpnKHAscSkpCnJldHVybiBwLmF9aWYodS5qLmIoYSkpe3M9cS5WSChhKQpwPXEuYgppZihzPj1w
+Lmxlbmd0aClyZXR1cm4gSC5rKHAscykKcj1wW3NdCmlmKHIhPW51bGwpcmV0dXJuIHIKcmV0dXJuIHEu
+ZWsoYSxzKX1pZih1LmVILmIoYSkpe3M9cS5WSChhKQp0PXEuYgppZihzPj10Lmxlbmd0aClyZXR1cm4g
+SC5rKHQscykKcj1wLmI9dFtzXQppZihyIT1udWxsKXJldHVybiByCnI9e30KcC5iPXIKQy5ObS5ZKHQs
+cyxyKQpxLmltKGEsbmV3IFAuVGEocCxxKSkKcmV0dXJuIHAuYn10aHJvdyBILmIoUC5uKCJzdHJ1Y3R1
+cmVkIGNsb25lIG9mIG90aGVyIHR5cGUiKSl9LAplazpmdW5jdGlvbihhLGIpe3ZhciB0LHM9Si5VNihh
+KSxyPXMuZ0EoYSkscT1uZXcgQXJyYXkocikKQy5ObS5ZKHRoaXMuYixiLHEpCmZvcih0PTA7dDxyOysr
+dClDLk5tLlkocSx0LHRoaXMuUHYocy5xKGEsdCkpKQpyZXR1cm4gcX19ClAuamcucHJvdG90eXBlPXsK
+JDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYVthXT10aGlzLmIuUHYoYil9LAokUzoyfQpQLlRhLnByb3Rv
+dHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLmJbYV09dGhpcy5iLlB2KGIpfSwKJFM6Mn0KUC5C
+Zi5wcm90b3R5cGU9ewppbTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxCnUuYjguYShiKQpmb3IodD1P
+YmplY3Qua2V5cyhhKSxzPXQubGVuZ3RoLHI9MDtyPHM7KytyKXtxPXRbcl0KYi4kMihxLGFbcV0pfX19
+ClAuQXMucHJvdG90eXBlPXsKVDpmdW5jdGlvbihhKXt2YXIgdApILmMoYSkKdD0kLmhHKCkuYgppZih0
+eXBlb2YgYSE9InN0cmluZyIpSC52aChILkkoYSkpCmlmKHQudGVzdChhKSlyZXR1cm4gYQp0aHJvdyBI
+LmIoUC5MMyhhLCJ2YWx1ZSIsIk5vdCBhIHZhbGlkIGNsYXNzIHRva2VuIikpfSwKWjpmdW5jdGlvbihh
+KXtyZXR1cm4gdGhpcy53KCkuelYoMCwiICIpfSwKZ2t6OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMudygp
+CnJldHVybiBQLnJqKHQsdC5yLEguTGgodCkuYyl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy53
+KCkuYX0sCnRnOmZ1bmN0aW9uKGEsYil7dGhpcy5UKGIpCnJldHVybiB0aGlzLncoKS50ZygwLGIpfSwK
+aTpmdW5jdGlvbihhLGIpe3RoaXMuVChiKQpyZXR1cm4gSC5FOSh0aGlzLk9TKG5ldyBQLkdFKGIpKSl9
+LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQscwp0aGlzLlQoYikKdD10aGlzLncoKQpzPXQuUigwLGIpCnRo
+aXMucCh0KQpyZXR1cm4gc30sCkZWOmZ1bmN0aW9uKGEsYil7dGhpcy5PUyhuZXcgUC5ONyh0aGlzLHUu
+WC5hKGIpKSl9LApWMTpmdW5jdGlvbihhKXt0aGlzLk9TKG5ldyBQLnVRKCkpfSwKT1M6ZnVuY3Rpb24o
+YSl7dmFyIHQscwp1LmJVLmEoYSkKdD10aGlzLncoKQpzPWEuJDEodCkKdGhpcy5wKHQpCnJldHVybiBz
+fX0KUC5HRS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5DLmEoYSkuaSgwLHRoaXMu
+YSl9LAokUzo1MH0KUC5ONy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmIscz1I
+LnQ2KHQpCnJldHVybiB1LkMuYShhKS5GVigwLG5ldyBILmxKKHQscy5DKCJxVSgxKSIpLmEodGhpcy5h
+Lmd1TSgpKSxzLkMoImxKPDEscVU+IikpKX0sCiRTOjE2fQpQLnVRLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3UuQy5hKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEuZD1hLmU9YS5mPW51bGwKYS5hPTAKYS5Y
+KCl9cmV0dXJuIG51bGx9LAokUzoxNn0KUC5oRi5wcm90b3R5cGU9eyRpaEY6MX0KUC5QQy5wcm90b3R5
+cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlouYShhKQp0PWZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4g
+ZnVuY3Rpb24oKXtyZXR1cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJn
+dW1lbnRzKSl9fShQLlI0LGEsITEpClAuRG0odCwkLndRKCksYSkKcmV0dXJuIHR9LAokUzo2fQpQLm10
+LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgdGhpcy5hKGEpfSwKJFM6Nn0KUC5O
+ei5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAucjcoYSl9LAokUzozNX0KUC5R
+Uy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVHooYSx1LmFtKX0sCiRTOjM2
+fQpQLm5wLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5FNChhKX0sCiRTOjM3
+fQpQLkU0LnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5
+cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9y
+IG51bSIpKQpyZXR1cm4gUC5MNyh0aGlzLmFbYl0pfSwKWTpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9m
+IGIhPSJzdHJpbmciJiZ0eXBlb2YgYiE9Im51bWJlciIpdGhyb3cgSC5iKFAueFkoInByb3BlcnR5IGlz
+IG5vdCBhIFN0cmluZyBvciBudW0iKSkKdGhpcy5hW2JdPVAud1koYyl9LApETjpmdW5jdGlvbihhLGIp
+e2lmKGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBQLkU0JiZ0aGlzLmE9PT1iLmF9
+LApaOmZ1bmN0aW9uKGEpe3ZhciB0LHMKdHJ5e3Q9U3RyaW5nKHRoaXMuYSkKcmV0dXJuIHR9Y2F0Y2go
+cyl7SC5SdShzKQp0PXRoaXMueGIoMCkKcmV0dXJuIHR9fSwKVjc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
+PXRoaXMuYQppZihiPT1udWxsKXQ9bnVsbAplbHNle3Q9SC50NihiKQp0PVAuQ0gobmV3IEgubEooYix0
+LkMoIkAoMSkiKS5hKFAuaUcoKSksdC5DKCJsSjwxLEA+IikpLCEwLHUueil9cmV0dXJuIFAuTDcoc1th
+XS5hcHBseShzLHQpKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gMH19ClAucjcucHJvdG90eXBlPXt9
+ClAuVHoucHJvdG90eXBlPXsKY1A6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcyxzPWE8MHx8YT49dC5nQSh0
+KQppZihzKXRocm93IEguYihQLlRFKGEsMCx0LmdBKHQpLG51bGwsbnVsbCkpfSwKcTpmdW5jdGlvbihh
+LGIpe2lmKEgub2soYikpdGhpcy5jUChiKQpyZXR1cm4gdGhpcy4kdGkuYy5hKHRoaXMuVXIoMCxiKSl9
+LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNQKGIpCnRoaXMuZTQoMCxiLGMpfSwKZ0E6ZnVuY3Rpb24o
+YSl7dmFyIHQ9dGhpcy5hLmxlbmd0aAppZih0eXBlb2YgdD09PSJudW1iZXIiJiZ0Pj4+MD09PXQpcmV0
+dXJuIHQKdGhyb3cgSC5iKFAuUFYoIkJhZCBKc0FycmF5IGxlbmd0aCIpKX0sCiRpYlE6MSwKJGljWDox
+LAokaXpNOjF9ClAuY28ucHJvdG90eXBlPXt9ClAuYkIucHJvdG90eXBlPXskaWJCOjF9ClAuS2UucHJv
+dG90eXBlPXsKdzpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcy5hLmdldEF0dHJpYnV0ZSgiY2xh
+c3MiKSxvPVAuTHModS5OKQppZihwPT1udWxsKXJldHVybiBvCmZvcih0PXAuc3BsaXQoIiAiKSxzPXQu
+bGVuZ3RoLHI9MDtyPHM7KytyKXtxPUouVDAodFtyXSkKaWYocS5sZW5ndGghPT0wKW8uaSgwLHEpfXJl
+dHVybiBvfSwKcDpmdW5jdGlvbihhKXt0aGlzLmEuc2V0QXR0cmlidXRlKCJjbGFzcyIsYS56VigwLCIg
+IikpfX0KUC5kNS5wcm90b3R5cGU9ewpnUDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuS2UoYSl9LApz
+aGY6ZnVuY3Rpb24oYSxiKXt0aGlzLllDKGEsYil9LApyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxz
+LHIscSxwLG8KaWYoZD09bnVsbCl7dD1ILlZNKFtdLHUuaykKZD1uZXcgVy52RCh0KQpDLk5tLmkodCxX
+LlR3KG51bGwpKQpDLk5tLmkodCxXLkJsKCkpCkMuTm0uaSh0LG5ldyBXLk93KCkpfWM9bmV3IFcuS28o
+ZCkKcz0nPHN2ZyB2ZXJzaW9uPSIxLjEiPicrSC5kKGIpKyI8L3N2Zz4iCnQ9ZG9jdW1lbnQKcj10LmJv
+ZHkKci50b1N0cmluZwpxPUMuUlkuQUgocixzLGMpCnA9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkK
+cS50b1N0cmluZwp0PW5ldyBXLmU3KHEpCm89dC5ncjgodCkKZm9yKDt0PW8uZmlyc3RDaGlsZCx0IT1u
+dWxsOylwLmFwcGVuZENoaWxkKHQpCnJldHVybiBwfSwKbno6ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aHJv
+dyBILmIoUC5MNCgiQ2Fubm90IGludm9rZSBpbnNlcnRBZGphY2VudEh0bWwgb24gU1ZHLiIpKX0sCmdW
+bDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuZXUoYSwiY2xpY2siLCExLHUuUSl9LAokaWQ1OjF9ClAu
+bjYucHJvdG90eXBlPXskaWJROjEsJGljWDoxLCRpek06MSwkaUFTOjF9ClUuZDIucHJvdG90eXBlPXt9
+ClUuU2UucHJvdG90eXBlPXt9ClUuTWwucHJvdG90eXBlPXt9ClUueUQucHJvdG90eXBlPXt9ClUud2Iu
+cHJvdG90eXBlPXt9CkIuajgucHJvdG90eXBlPXt9CkIucXAucHJvdG90eXBlPXt9ClQubVEucHJvdG90
+eXBlPXt9CkwuZS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbgp1LkIu
+YShhKQp0PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpzPUwuRzYod2luZG93LmxvY2F0aW9uLmhyZWYp
+CnI9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKTC5HZSgpCmlmKHQhPT0iLyImJnQhPT1KLlQwKGRv
+Y3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQpKUwuRzcodCxzLHIsITAsbmV3
+IEwuVlcodCxzLHIpKQpxPWRvY3VtZW50CnA9Si5xRihxLnF1ZXJ5U2VsZWN0b3IoIi5hcHBseS1taWdy
+YXRpb24iKSkKbz1wLiR0aQpuPW8uQygifigxKSIpLmEobmV3IEwub1ooKSkKdS5NLmEobnVsbCkKVy5K
+RShwLmEscC5iLG4sITEsby5jKQpvPUoucUYocS5xdWVyeVNlbGVjdG9yKCIucmVydW4tbWlncmF0aW9u
+IikpCm49by4kdGkKVy5KRShvLmEsby5iLG4uQygifigxKSIpLmEobmV3IEwueTgoKSksITEsbi5jKQpu
+PUoucUYocS5xdWVyeVNlbGVjdG9yKCIucmVwb3J0LXByb2JsZW0iKSkKbz1uLiR0aQpXLkpFKG4uYSxu
+LmIsby5DKCJ+KDEpIikuYShuZXcgTC5IaSgpKSwhMSxvLmMpCnE9Si5xRihxLnF1ZXJ5U2VsZWN0b3Io
+Ii5wb3B1cC1wYW5lIC5jbG9zZSIpKQpvPXEuJHRpClcuSkUocS5hLHEuYixvLkMoIn4oMSkiKS5hKG5l
+dyBMLkJUKCkpLCExLG8uYyl9LAokUzoxN30KTC5WVy5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wu
+RnIodGhpcy5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KTC5vWi5wcm90b3R5cGU9ewokMTpmdW5jdGlv
+bihhKXt1LlYuYShhKQppZihILm9UKHdpbmRvdy5jb25maXJtKCJUaGlzIHdpbGwgYXBwbHkgdGhlIGNo
+YW5nZXMgeW91J3ZlIHByZXZpZXdlZCB0byB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5LiBJdCBpcyByZWNv
+bW1lbmRlZCB5b3UgY29tbWl0IGFueSBjaGFuZ2VzIHlvdSBtYWRlIGJlZm9yZSBkb2luZyB0aGlzLiIp
+KSlMLnR5KCIvYXBwbHktbWlncmF0aW9uIikuVzcobmV3IEwuanIoKSx1LlApLk9BKG5ldyBMLnFsKCkp
+fSwKJFM6M30KTC5qci5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlMuYShhKQp0PWRv
+Y3VtZW50LmJvZHkKdC5jbGFzc0xpc3QucmVtb3ZlKCJwcm9wb3NlZCIpCnQuY2xhc3NMaXN0LmFkZCgi
+YXBwbGllZCIpfSwKJFM6NDB9CkwucWwucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtMLkMyKCJD
+b3VsZCBub3QgYXBwbHkgbWlncmF0aW9uIixhLGIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6Mn0KTC55OC5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54bih1LlYuYShhKSl9LAp4bjpmdW5j
+dGlvbihhKXt2YXIgdD0wLHM9UC5GWCh1LlApLHI9MSxxLHA9W10sbyxuLG0sbAp2YXIgJGFzeW5jJCQx
+PVAubHooZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cT1jCnQ9cn13aGlsZSh0cnVlKXN3aXRjaCh0KXtj
+YXNlIDA6cj0zCmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicmVydW5uaW5nIikKdD02CnJldHVy
+biBQLmpRKEwudHkoIi9yZXJ1bi1taWdyYXRpb24iKSwkYXN5bmMkJDEpCmNhc2UgNjp3aW5kb3cubG9j
+YXRpb24ucmVsb2FkKCkKcC5wdXNoKDUpCnQ9NApicmVhawpjYXNlIDM6cj0yCmw9cQpvPUguUnUobCkK
+bj1ILnRzKGwpCkwuQzIoIkZhaWxlZCB0byByZXJ1biBtaWdyYXRpb24iLG8sbikKcC5wdXNoKDUpCnQ9
+NApicmVhawpjYXNlIDI6cD1bMV0KY2FzZSA0OnI9MQpkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1v
+dmUoInJlcnVubmluZyIpCnQ9cC5wb3AoKQpicmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxzKQpj
+YXNlIDE6cmV0dXJuIFAuZjMocSxzKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkJDEscyl9LAokUzo0MX0K
+TC5IaS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt1LlYuYShhKQpDLm9sLlBvKHdpbmRvdywiaHR0
+cHM6Ly9nb28uZ2xlL2RhcnQtbnVsbC1zYWZldHktbWlncmF0aW9uLXRvb2wtaXNzdWUiLCJyZXBvcnQt
+cHJvYmxlbSIpfSwKJFM6M30KTC5CVC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlYu
+YShhKQp0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIikuc3R5bGUKdC5kaXNwbGF5
+PSJub25lIgpyZXR1cm4ibm9uZSJ9LAokUzo0Mn0KTC5MLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
+e3ZhciB0LHMscgp1LkIuYShhKQp0PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpzPUwuRzYod2luZG93
+LmxvY2F0aW9uLmhyZWYpCnI9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKaWYodC5sZW5ndGg+MSlM
+Lkc3KHQscyxyLCExLG51bGwpCmVsc2V7TC5CRSh0LG5ldyBCLnFwKCIiLCIiLCIiLEMuQ00pLCEwKQpM
+LkJYKCImbmJzcDsiLG51bGwpfX0sCiRTOjE3fQpMLld4LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
+e3ZhciB0LHMscixxPSJjb2xsYXBzZWQiCnUuVi5hKGEpCnQ9dGhpcy5hCnM9Si5SRSh0KQpyPXRoaXMu
+YgppZighcy5nUCh0KS50ZygwLHEpKXtzLmdQKHQpLmkoMCxxKQpKLmRSKHIpLmkoMCxxKX1lbHNle3Mu
+Z1AodCkuUigwLHEpCkouZFIocikuUigwLHEpfX0sCiRTOjN9CkwuQU8ucHJvdG90eXBlPXsKJDE6ZnVu
+Y3Rpb24oYSl7dmFyIHQ9Si5xRih1LmguYShhKSkscz10LiR0aSxyPXMuQygifigxKSIpLmEobmV3IEwu
+ZE4odGhpcy5hKSkKdS5NLmEobnVsbCkKVy5KRSh0LmEsdC5iLHIsITEscy5jKX0sCiRTOjV9CkwuZE4u
+cHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQKdS5WLmEoYSkKdD1kb2N1bWVudC5xdWVyeVNl
+bGVjdG9yKCJ0YWJsZVtkYXRhLXBhdGhdIikKdC50b1N0cmluZwpMLnQyKGEsdGhpcy5hLHQuZ2V0QXR0
+cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcodCkpLk8oInBhdGgiKSkpfSwKJFM6M30KTC5I
+by5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIKdS5oLmEoYSkKdD1KLnFGKGEpCnM9
+dC4kdGkKcj1zLkMoIn4oMSkiKS5hKG5ldyBMLnh6KGEsdGhpcy5hKSkKdS5NLmEobnVsbCkKVy5KRSh0
+LmEsdC5iLHIsITEscy5jKX0sCiRTOjV9CkwueHoucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFy
+IHQKdS5WLmEoYSkKdD10aGlzLmEKTC5oWCh0aGlzLmIsUC5RQSh0LmdldEF0dHJpYnV0ZSgiZGF0YS0i
+K25ldyBXLlN5KG5ldyBXLmk3KHQpKS5PKCJvZmZzZXQiKSksbnVsbCksUC5RQSh0LmdldEF0dHJpYnV0
+ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KHQpKS5PKCJsaW5lIikpLG51bGwpKX0sCiRTOjN9Ckwu
+SUMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9Si5xRih1LmguYShhKSkscz10LiR0aQpz
+LkMoIn4oMSkiKS5hKEwuaVMoKSkKdS5NLmEobnVsbCkKVy5KRSh0LmEsdC5iLEwuaVMoKSwhMSxzLmMp
+fSwKJFM6NX0KTC5MMS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt1LnAuYShhKQp0aGlzLmEuYU0o
+MCx0aGlzLmIpfSwKJFM6MTR9CkwublQucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMu
+YS5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KTC5OWS5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wu
+RnIodGhpcy5hLmEsbnVsbCxudWxsKX0sCiRTOjB9CkwuR0gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24o
+YSl7dS5oLmEoYSkKJC56QigpLnRvU3RyaW5nCnUuaGIuYSgkLm93KCkucSgwLCJobGpzIikpLlY3KCJo
+aWdobGlnaHRCbG9jayIsW2FdKX0sCiRTOjV9CkwuRFQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7
+dmFyIHQscwp1LnIuYShhKQp0PWEuc3RhdHVzCmlmKHQ9PT0yMDApe3Q9Qy5DdC5wVygwLGEucmVzcG9u
+c2VUZXh0LG51bGwpCnM9Si5VNih0KQpMLlQxKG5ldyBVLmQyKFUuamYocy5xKHQsImVkaXRzIikpLEgu
+YyhzLnEodCwiZXhwbGFuYXRpb24iKSksSC5XWShzLnEodCwibGluZSIpKSxILmMocy5xKHQsInBhdGgi
+KSksVS5OZChzLnEodCwidHJhY2VzIikpKSkKTC5Gcih0aGlzLmEsdGhpcy5iLHRoaXMuYykKTC55WCgi
+LmVkaXQtcGFuZWwgLnBhbmVsLWNvbnRlbnQiLCExKX1lbHNlIHdpbmRvdy5hbGVydCgiUmVxdWVzdCBm
+YWlsZWQ7IHN0YXR1cyBvZiAiK0guZCh0KSl9LAokUzo5fQpMLmVILnByb3RvdHlwZT17CiQyOmZ1bmN0
+aW9uKGEsYil7TC5xSigibG9hZFJlZ2lvbkV4cGxhbmF0aW9uOiAiK0guZChhKSxiKQp3aW5kb3cuYWxl
+cnQoIkNvdWxkIG5vdCBsb2FkICIrSC5kKHRoaXMuYSkrIiAoIitILmQoYSkrIikuIil9LAokQzoiJDIi
+LAokUjoyLAokUzoyfQpMLnl1LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj10aGlz
+CnUuci5hKGEpCnQ9YS5zdGF0dXMKaWYodD09PTIwMCl7cz1yLmEKTC5CRShzLEIuWWYodS5iLmEoQy5D
+dC5wVygwLGEucmVzcG9uc2VUZXh0LG51bGwpKSksci5iKQp0PXIuYwpMLmZHKHQsci5kKQpMLkJYKEMu
+eEIudGcocywiPyIpP0MueEIuTmoocywwLEMueEIuT1kocywiPyIpKTpzLHQpCnQ9ci5lCmlmKHQhPW51
+bGwpdC4kMCgpfWVsc2Ugd2luZG93LmFsZXJ0KCJSZXF1ZXN0IGZhaWxlZDsgc3RhdHVzIG9mICIrSC5k
+KHQpKX0sCiRTOjl9CkwuekQucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtMLnFKKCJsb2FkRmls
+ZTogIitILmQoYSksYikKd2luZG93LmFsZXJ0KCJDb3VsZCBub3QgbG9hZCAiK3RoaXMuYSsiICgiK0gu
+ZChhKSsiKS4iKX0sCiRDOiIkMiIsCiRSOjIsCiRTOjJ9CkwuVFcucHJvdG90eXBlPXsKJDE6ZnVuY3Rp
+b24oYSl7dmFyIHQscyxyCnUuci5hKGEpCnQ9YS5zdGF0dXMKaWYodD09PTIwMCl7cz1DLkN0LnBXKDAs
+YS5yZXNwb25zZVRleHQsbnVsbCkKcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubmF2LXRyZWUiKQpK
+Lmw1KHIsIiIpCkwudFgocixMLm1LKHMpKX1lbHNlIHdpbmRvdy5hbGVydCgiUmVxdWVzdCBmYWlsZWQ7
+IHN0YXR1cyBvZiAiK0guZCh0KSl9LAokUzo5fQpMLnhyLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEs
+Yil7TC5xSigibG9hZE5hdmlnYXRpb25UcmVlOiAiK0guZChhKSxiKQp3aW5kb3cuYWxlcnQoIkNvdWxk
+IG5vdCBsb2FkICIrdGhpcy5hKyIgKCIrSC5kKGEpKyIpLiIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6Mn0K
+TC5FRS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzCnUuVi5hKGEpCnQ9dGhpcy5hCnM9
+dGhpcy5iCkwuYWYod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHQscywhMCxuZXcgTC5RTCh0LHMpKQpM
+LmhYKHRoaXMuYyx0LHMpfSwKJFM6M30KTC5RTC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wuRnIo
+d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHRoaXMuYSx0aGlzLmIpfSwKJFM6MH0KTC5WUy5wcm90b3R5
+cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzPSJzZWxlY3RlZC1maWxlIgp1LmguYShhKQphLnRvU3Ry
+aW5nCnQ9Si5SRShhKQppZihhLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGEp
+KS5PKCJuYW1lIikpPT09dGhpcy5hLmEpdC5nUChhKS5pKDAscykKZWxzZSB0LmdQKGEpLlIoMCxzKX0s
+CiRTOjV9CkwuVEQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEwudDIodS5WLmEoYSks
+ITAsbnVsbCl9LAokUzoxOH0KTC5YQS5wcm90b3R5cGU9ewpFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJu
+ITB9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4hMH0sCiRpa0Y6MX0KTC5aWi5wcm90b3R5cGU9e30KTC5P
+OS5wcm90b3R5cGU9ewpaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJ9fQpNLmxJLnByb3RvdHlwZT17
+CldPOmZ1bmN0aW9uKGEsYil7dmFyIHQscz1udWxsCk0uWUYoImFic29sdXRlIixILlZNKFtiLG51bGws
+bnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSx1LnMpKQp0PXRoaXMuYQp0PXQuWXIoYik+MCYmIXQuaEso
+YikKaWYodClyZXR1cm4gYgp0PUQuUlgoKQpyZXR1cm4gdGhpcy5xNygwLHQsYixzLHMscyxzLHMscyl9
+LAp0TTpmdW5jdGlvbihhKXt2YXIgdCxzLHI9WC5DTChhLHRoaXMuYSkKci5JVigpCnQ9ci5kCnM9dC5s
+ZW5ndGgKaWYocz09PTApe3Q9ci5iCnJldHVybiB0PT1udWxsPyIuIjp0fWlmKHM9PT0xKXt0PXIuYgpy
+ZXR1cm4gdD09bnVsbD8iLiI6dH1pZigwPj1zKXJldHVybiBILmsodCwtMSkKdC5wb3AoKQpDLk5tLm12
+KHIuZSkKci5JVigpCnJldHVybiByLlooMCl9LApxNzpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7
+dmFyIHQ9SC5WTShbYixjLGQsZSxmLGcsaCxpXSx1LnMpCk0uWUYoImpvaW4iLHQpCnJldHVybiB0aGlz
+LklQKG5ldyBILlU1KHQsdS5iQi5hKG5ldyBNLk1pKCkpLHUuY2MpKX0sCklQOmZ1bmN0aW9uKGEpe3Zh
+ciB0LHMscixxLHAsbyxuLG0sbAp1LlguYShhKQpmb3IodD1hLiR0aSxzPXQuQygiYTIoY1guRSkiKS5h
+KG5ldyBNLnE3KCkpLHI9YS5na3ooYSksdD1uZXcgSC52RyhyLHMsdC5DKCJ2RzxjWC5FPiIpKSxzPXRo
+aXMuYSxxPSExLHA9ITEsbz0iIjt0LkYoKTspe249ci5nbCgpCmlmKHMuaEsobikmJnApe209WC5DTChu
+LHMpCmw9by5jaGFyQ29kZUF0KDApPT0wP286bwpvPUMueEIuTmoobCwwLHMuU3AobCwhMCkpCm0uYj1v
+CmlmKHMuZHMobykpQy5ObS5ZKG0uZSwwLHMuZ21JKCkpCm89bS5aKDApfWVsc2UgaWYocy5ZcihuKT4w
+KXtwPSFzLmhLKG4pCm89SC5kKG4pfWVsc2V7aWYoIShuLmxlbmd0aD4wJiZzLlVkKG5bMF0pKSlpZihx
+KW8rPXMuZ21JKCkKbys9SC5kKG4pfXE9cy5kcyhuKX1yZXR1cm4gby5jaGFyQ29kZUF0KDApPT0wP286
+b30sCm81OmZ1bmN0aW9uKGEpe3ZhciB0CmlmKCF0aGlzLnkzKGEpKXJldHVybiBhCnQ9WC5DTChhLHRo
+aXMuYSkKdC5yUigpCnJldHVybiB0LlooMCl9LAp5MzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8s
+bixtLGwsawphLnRvU3RyaW5nCnQ9dGhpcy5hCnM9dC5ZcihhKQppZihzIT09MCl7aWYodD09PSQuS2so
+KSlmb3Iocj0wO3I8czsrK3IpaWYoQy54Qi5XKGEscik9PT00NylyZXR1cm4hMApxPXMKcD00N31lbHNl
+e3E9MApwPW51bGx9Zm9yKG89bmV3IEgucWooYSkuYSxuPW8ubGVuZ3RoLHI9cSxtPW51bGw7cjxuOysr
+cixtPXAscD1sKXtsPUMueEIubShvLHIpCmlmKHQucjQobCkpe2lmKHQ9PT0kLktrKCkmJmw9PT00Nyly
+ZXR1cm4hMAppZihwIT1udWxsJiZ0LnI0KHApKXJldHVybiEwCmlmKHA9PT00NilrPW09PW51bGx8fG09
+PT00Nnx8dC5yNChtKQplbHNlIGs9ITEKaWYoaylyZXR1cm4hMH19aWYocD09bnVsbClyZXR1cm4hMApp
+Zih0LnI0KHApKXJldHVybiEwCmlmKHA9PT00Nil0PW09PW51bGx8fHQucjQobSl8fG09PT00NgplbHNl
+IHQ9ITEKaWYodClyZXR1cm4hMApyZXR1cm4hMX0sCkhQOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEs
+cCxvPXRoaXMsbj0nVW5hYmxlIHRvIGZpbmQgYSBwYXRoIHRvICInCmI9by5XTygwLGIpCnQ9by5hCmlm
+KHQuWXIoYik8PTAmJnQuWXIoYSk+MClyZXR1cm4gby5vNShhKQppZih0LllyKGEpPD0wfHx0LmhLKGEp
+KWE9by5XTygwLGEpCmlmKHQuWXIoYSk8PTAmJnQuWXIoYik+MCl0aHJvdyBILmIoWC5JNyhuK0guZChh
+KSsnIiBmcm9tICInK0guZChiKSsnIi4nKSkKcz1YLkNMKGIsdCkKcy5yUigpCnI9WC5DTChhLHQpCnIu
+clIoKQpxPXMuZAppZihxLmxlbmd0aD4wJiZKLlJNKHFbMF0sIi4iKSlyZXR1cm4gci5aKDApCnE9cy5i
+CnA9ci5iCmlmKHEhPXApcT1xPT1udWxsfHxwPT1udWxsfHwhdC5OYyhxLHApCmVsc2UgcT0hMQppZihx
+KXJldHVybiByLlooMCkKd2hpbGUoITApe3E9cy5kCmlmKHEubGVuZ3RoPjApe3A9ci5kCnE9cC5sZW5n
+dGg+MCYmdC5OYyhxWzBdLHBbMF0pfWVsc2UgcT0hMQppZighcSlicmVhawpDLk5tLlc0KHMuZCwwKQpD
+Lk5tLlc0KHMuZSwxKQpDLk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKX1xPXMuZAppZihxLmxlbmd0
+aD4wJiZKLlJNKHFbMF0sIi4uIikpdGhyb3cgSC5iKFguSTcobitILmQoYSkrJyIgZnJvbSAiJytILmQo
+YikrJyIuJykpCnE9dS5OCkMuTm0uVUcoci5kLDAsUC5POChzLmQubGVuZ3RoLCIuLiIsITEscSkpCkMu
+Tm0uWShyLmUsMCwiIikKQy5ObS5VRyhyLmUsMSxQLk84KHMuZC5sZW5ndGgsdC5nbUkoKSwhMSxxKSkK
+dD1yLmQKcT10Lmxlbmd0aAppZihxPT09MClyZXR1cm4iLiIKaWYocT4xJiZKLlJNKEMuTm0uZ3JaKHQp
+LCIuIikpe3Q9ci5kCmlmKDA+PXQubGVuZ3RoKXJldHVybiBILmsodCwtMSkKdC5wb3AoKQp0PXIuZQpD
+Lk5tLm12KHQpCkMuTm0ubXYodCkKQy5ObS5pKHQsIiIpfXIuYj0iIgpyLklWKCkKcmV0dXJuIHIuWigw
+KX19Ck0uTWkucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEguYyhhKSE9bnVsbH0sCiRT
+Ojd9Ck0ucTcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEguYyhhKSE9PSIifSwKJFM6
+N30KTS5Oby5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtILmMoYSkKcmV0dXJuIGE9PW51bGw/Im51
+bGwiOiciJythKyciJ30sCiRTOjR9CkIuZnYucHJvdG90eXBlPXsKeFo6ZnVuY3Rpb24oYSl7dmFyIHQs
+cz10aGlzLllyKGEpCmlmKHM+MClyZXR1cm4gSi5sZChhLDAscykKaWYodGhpcy5oSyhhKSl7aWYoMD49
+YS5sZW5ndGgpcmV0dXJuIEguayhhLDApCnQ9YVswXX1lbHNlIHQ9bnVsbApyZXR1cm4gdH0sCk5jOmZ1
+bmN0aW9uKGEsYil7cmV0dXJuIGE9PWJ9fQpYLldELnByb3RvdHlwZT17CklWOmZ1bmN0aW9uKCl7dmFy
+IHQscyxyPXRoaXMKd2hpbGUoITApe3Q9ci5kCmlmKCEodC5sZW5ndGghPT0wJiZKLlJNKEMuTm0uZ3Ja
+KHQpLCIiKSkpYnJlYWsKdD1yLmQKaWYoMD49dC5sZW5ndGgpcmV0dXJuIEguayh0LC0xKQp0LnBvcCgp
+CkMuTm0ubXYoci5lKX10PXIuZQpzPXQubGVuZ3RoCmlmKHM+MClDLk5tLlkodCxzLTEsIiIpfSwKclI6
+ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMsbD1ILlZNKFtdLHUucykKZm9yKHQ9bS5k
+LHM9dC5sZW5ndGgscj0wLHE9MDtxPHQubGVuZ3RoO3QubGVuZ3RoPT09c3x8KDAsSC5saykodCksKytx
+KXtwPXRbcV0Kbz1KLmlhKHApCmlmKCEoby5ETihwLCIuIil8fG8uRE4ocCwiIikpKWlmKG8uRE4ocCwi
+Li4iKSlpZihsLmxlbmd0aD4wKWwucG9wKCkKZWxzZSArK3IKZWxzZSBDLk5tLmkobCxwKX1pZihtLmI9
+PW51bGwpQy5ObS5VRyhsLDAsUC5POChyLCIuLiIsITEsdS5OKSkKaWYobC5sZW5ndGg9PT0wJiZtLmI9
+PW51bGwpQy5ObS5pKGwsIi4iKQpuPVAuZEgobC5sZW5ndGgsbmV3IFgucVIobSksITAsdS5OKQp0PW0u
+Ygp0PXQhPW51bGwmJmwubGVuZ3RoPjAmJm0uYS5kcyh0KT9tLmEuZ21JKCk6IiIKSC50NihuKS5jLmEo
+dCkKaWYoISFuLmZpeGVkJGxlbmd0aClILnZoKFAuTDQoImluc2VydCIpKQpuLnNwbGljZSgwLDAsdCkK
+bS5zbkoobCkKbS5zUGgobikKdD1tLmIKaWYodCE9bnVsbCYmbS5hPT09JC5LaygpKXt0LnRvU3RyaW5n
+Cm0uYj1ILnlzKHQsIi8iLCJcXCIpfW0uSVYoKX0sClo6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPXRoaXMs
+cT1yLmIKcT1xIT1udWxsP3E6IiIKZm9yKHQ9MDt0PHIuZC5sZW5ndGg7Kyt0KXtzPXIuZQppZih0Pj1z
+Lmxlbmd0aClyZXR1cm4gSC5rKHMsdCkKcz1xK0guZChzW3RdKQpxPXIuZAppZih0Pj1xLmxlbmd0aCly
+ZXR1cm4gSC5rKHEsdCkKcT1zK0guZChxW3RdKX1xKz1ILmQoQy5ObS5nclooci5lKSkKcmV0dXJuIHEu
+Y2hhckNvZGVBdCgwKT09MD9xOnF9LApzbko6ZnVuY3Rpb24oYSl7dGhpcy5kPXUuYS5hKGEpfSwKc1Bo
+OmZ1bmN0aW9uKGEpe3RoaXMuZT11LmEuYShhKX19ClgucVIucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24o
+YSl7cmV0dXJuIHRoaXMuYS5hLmdtSSgpfSwKJFM6NDZ9ClguZHYucHJvdG90eXBlPXsKWjpmdW5jdGlv
+bihhKXtyZXR1cm4iUGF0aEV4Y2VwdGlvbjogIit0aGlzLmF9fQpPLnpMLnByb3RvdHlwZT17Clo6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIHRoaXMuZ29jKHRoaXMpfX0KRS5PRi5wcm90b3R5cGU9ewpVZDpmdW5jdGlv
+bihhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwK
+ZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKcmV0dXJuIHQhPT0wJiZDLnhCLm0oYSx0LTEpIT09
+NDd9LApTcDpmdW5jdGlvbihhLGIpe2lmKGEubGVuZ3RoIT09MCYmQy54Qi5XKGEsMCk9PT00NylyZXR1
+cm4gMQpyZXR1cm4gMH0sCllyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVu
+Y3Rpb24oYSl7cmV0dXJuITF9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4icG9zaXgifSwKZ21JOmZ1bmN0
+aW9uKCl7cmV0dXJuIi8ifX0KRi5ydS5wcm90b3R5cGU9ewpVZDpmdW5jdGlvbihhKXtyZXR1cm4gQy54
+Qi50ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwKZHM6ZnVuY3Rpb24oYSl7
+dmFyIHQ9YS5sZW5ndGgKaWYodD09PTApcmV0dXJuITEKaWYoQy54Qi5tKGEsdC0xKSE9PTQ3KXJldHVy
+biEwCnJldHVybiBDLnhCLlRjKGEsIjovLyIpJiZ0aGlzLllyKGEpPT09dH0sClNwOmZ1bmN0aW9uKGEs
+Yil7dmFyIHQscyxyLHEscD1hLmxlbmd0aAppZihwPT09MClyZXR1cm4gMAppZihDLnhCLlcoYSwwKT09
+PTQ3KXJldHVybiAxCmZvcih0PTA7dDxwOysrdCl7cz1DLnhCLlcoYSx0KQppZihzPT09NDcpcmV0dXJu
+IDAKaWYocz09PTU4KXtpZih0PT09MClyZXR1cm4gMApyPUMueEIuWFUoYSwiLyIsQy54Qi5RaShhLCIv
+LyIsdCsxKT90KzM6dCkKaWYocjw9MClyZXR1cm4gcAppZighYnx8cDxyKzMpcmV0dXJuIHIKaWYoIUMu
+eEIubihhLCJmaWxlOi8vIikpcmV0dXJuIHIKaWYoIUIuWXUoYSxyKzEpKXJldHVybiByCnE9ciszCnJl
+dHVybiBwPT09cT9xOnIrNH19cmV0dXJuIDB9LApZcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChh
+LCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aCE9PTAmJkMueEIuVyhhLDApPT09NDd9
+LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4idXJsIn0sCmdtSTpmdW5jdGlvbigpe3JldHVybiIvIn19Ckwu
+SVYucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIGE9PT00N3x8YT09PTkyfSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5n
+dGgKaWYodD09PTApcmV0dXJuITEKdD1DLnhCLm0oYSx0LTEpCnJldHVybiEodD09PTQ3fHx0PT09OTIp
+fSwKU3A6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9YS5sZW5ndGgKaWYocj09PTApcmV0dXJuIDAKdD1D
+LnhCLlcoYSwwKQppZih0PT09NDcpcmV0dXJuIDEKaWYodD09PTkyKXtpZihyPDJ8fEMueEIuVyhhLDEp
+IT09OTIpcmV0dXJuIDEKcz1DLnhCLlhVKGEsIlxcIiwyKQppZihzPjApe3M9Qy54Qi5YVShhLCJcXCIs
+cysxKQppZihzPjApcmV0dXJuIHN9cmV0dXJuIHJ9aWYocjwzKXJldHVybiAwCmlmKCFCLk9TKHQpKXJl
+dHVybiAwCmlmKEMueEIuVyhhLDEpIT09NTgpcmV0dXJuIDAKcj1DLnhCLlcoYSwyKQppZighKHI9PT00
+N3x8cj09PTkyKSlyZXR1cm4gMApyZXR1cm4gM30sCllyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNw
+KGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWXIoYSk9PT0xfSwKT3Q6ZnVuY3Rpb24o
+YSxiKXt2YXIgdAppZihhPT09YilyZXR1cm4hMAppZihhPT09NDcpcmV0dXJuIGI9PT05MgppZihhPT09
+OTIpcmV0dXJuIGI9PT00NwppZigoYV5iKSE9PTMyKXJldHVybiExCnQ9YXwzMgpyZXR1cm4gdD49OTcm
+JnQ8PTEyMn0sCk5jOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCmlmKGE9PWIpcmV0dXJuITAKdD1hLmxl
+bmd0aAppZih0IT09Yi5sZW5ndGgpcmV0dXJuITEKZm9yKHM9Si5yWShiKSxyPTA7cjx0OysrcilpZigh
+dGhpcy5PdChDLnhCLlcoYSxyKSxzLlcoYixyKSkpcmV0dXJuITEKcmV0dXJuITB9LApnb2M6ZnVuY3Rp
+b24oKXtyZXR1cm4id2luZG93cyJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iXFwifX07KGZ1bmN0aW9u
+IGFsaWFzZXMoKXt2YXIgdD1KLnZCLnByb3RvdHlwZQp0LlU9dC5aCnQuU2o9dC5lNwp0PUouTUYucHJv
+dG90eXBlCnQudD10LloKdD1QLmNYLnByb3RvdHlwZQp0LkdHPXQuZXYKdD1QLk1oLnByb3RvdHlwZQp0
+LnhiPXQuWgp0PVcuY3YucHJvdG90eXBlCnQuRFc9dC5yNgp0PVcubTYucHJvdG90eXBlCnQuakY9dC5F
+Ygp0PVAuRTQucHJvdG90eXBlCnQuVXI9dC5xCnQuZTQ9dC5ZfSkoKTsoZnVuY3Rpb24gaW5zdGFsbFRl
+YXJPZmZzKCl7dmFyIHQ9aHVua0hlbHBlcnMuX3N0YXRpY18xLHM9aHVua0hlbHBlcnMuX3N0YXRpY18w
+LHI9aHVua0hlbHBlcnMuaW5zdGFsbEluc3RhbmNlVGVhck9mZixxPWh1bmtIZWxwZXJzLmluc3RhbGxT
+dGF0aWNUZWFyT2ZmLHA9aHVua0hlbHBlcnMuX2luc3RhbmNlXzF1CnQoUCwiRVgiLCJaViIsMTApCnQo
+UCwieXQiLCJvQSIsMTApCnQoUCwicVciLCJCeiIsMTApCnMoUCwiVjkiLCJlTiIsMSkKcihQLlBmLnBy
+b3RvdHlwZSwiZ1lKIiwwLDEsbnVsbCxbIiQyIiwiJDEiXSxbIncwIiwicG0iXSwzMiwwKQp0KFAsIlBI
+IiwiTXQiLDQpCnEoVywicFMiLDQsbnVsbCxbIiQ0Il0sWyJ5VyJdLDExLDApCnEoVywiVjQiLDQsbnVs
+bCxbIiQ0Il0sWyJRVyJdLDExLDApCnAoUC5Bcy5wcm90b3R5cGUsImd1TSIsIlQiLDQpCnQoUCwiaUci
+LCJ3WSIsNDkpCnQoUCwidzAiLCJMNyIsMzMpCnQoTCwiaVMiLCJpNiIsMTgpfSkoKTsoZnVuY3Rpb24g
+aW5oZXJpdGFuY2UoKXt2YXIgdD1odW5rSGVscGVycy5taXhpbixzPWh1bmtIZWxwZXJzLmluaGVyaXQs
+cj1odW5rSGVscGVycy5pbmhlcml0TWFueQpzKFAuTWgsbnVsbCkKcihQLk1oLFtILkZLLEoudkIsSi5t
+MSxQLlhTLFAublksUC5jWCxILmE3LFAuQW4sSC5TVSxILlJlLEgud3YsUC5QbixILldVLEguTEksSC5U
+cCxILmY5LEguYnEsSC5YTyxQLllrLEguZGIsSC5ONixILlZSLEguRUssSC5QYixILnRRLEguU2QsSC5K
+YyxILkVULFAuVzMsUC5paCxQLkZ5LFAuR1YsUC5iOCxQLlBmLFAuRmUsUC52cyxQLk9NLFAucWgsUC5N
+TyxQLmtULFAueEksUC5PSCxQLm0wLFAuWHYsUC5ibixQLmxtLFAubEQsUC5LUCxQLk1hLFAuVEMsUC5V
+ayxQLlJ3LFAuYnosUC5hMixQLmlQLFAubGYsUC5rNSxQLktZLFAuQ0QsUC5hRSxQLkVILFAuek0sUC5a
+MCxQLk4zLFAuYzgsUC5PZCxQLmliLFAuR3osUC5aZCxQLnFVLFAuUm4sUC5HRCxQLkRuLFAuUEUsUC5V
+ZixXLmlkLFcuRmssVy5KUSxXLkdtLFcudkQsVy5tNixXLk93LFcuVzksVy5kVyxXLkZiLFcua0YsVy5t
+ayxXLktvLFAuaUosUC5FNCxQLm42LFUuZDIsVS5TZSxVLk1sLFUueUQsVS53YixCLmo4LEIucXAsVC5t
+USxMLlhBLEwuWlosTC5POSxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcihKLnZCLFtKLnlFLEouWUUsSi5N
+RixKLmpkLEoucUksSi5EcixILnBGLFcuRDAsVy5BeixXLkxlLFcuTmgsVy5JQixXLm43LFcuZWEsVy5i
+cixXLlNnLFcudTgsVy5LNyxXLlhXLFAuaEZdKQpyKEouTUYsW0ouaUMsSi5rZCxKLmM1XSkKcyhKLlBv
+LEouamQpCnIoSi5xSSxbSi51cixKLlZBXSkKcihQLlhTLFtILm5kLEguVzAsSC5heixILnZWLEguRXEs
+UC5DNixILnU5LFAuTEssUC5BVCxQLm1wLFAudWIsUC5kcyxQLmxqLFAuVVYsUC50N10pCnMoUC5MVSxQ
+Lm5ZKQpyKFAuTFUsW0gudzIsVy53eixXLmU3XSkKcyhILnFqLEgudzIpCnIoUC5jWCxbSC5iUSxILmkx
+LEguVTUsSC5YUixQLm1XLEguTkZdKQpyKEguYlEsW0guYUwsSC5pNSxQLnh1XSkKcihILmFMLFtILm5I
+LEgubEosUC5pOF0pCnMoSC54eSxILmkxKQpyKFAuQW4sW0guTUgsSC52R10pCnMoUC5SVSxQLlBuKQpz
+KFAuR2osUC5SVSkKcyhILlBELFAuR2opCnMoSC5MUCxILldVKQpyKEguVHAsW0guQ2osSC5BbSxILmxj
+LEgucixILmRDLEgud04sUC50aCxQLmhhLFAuVnMsUC5GdCxQLnlILFAuV00sUC5TWCxQLkdzLFAuZGEs
+UC5vUSxQLnBWLFAuVTcsUC52cixQLnJILFAuS0YsUC5aTCxQLlJULFAualosUC5ycSxQLlJXLFAuQjUs
+UC51TyxQLnBLLFAuaGosUC5WcCxQLk9SLFAucmEsUC55USxQLnBnLFAuV0YsUC5uMSxQLmNTLFAuVkMs
+UC5KVCxQLlJaLFAuTUUsUC55NSxQLnEzLFAueUksUC5jNixQLnFkLFcuQ3YsVy5iVSxXLmhILFcuS1Ms
+Vy5BMyxXLnZOLFcuVXYsVy5FZyxXLkVvLFcuV2ssVy5JQSxXLmZtLFAuamcsUC5UYSxQLkdFLFAuTjcs
+UC51USxQLlBDLFAubXQsUC5OeixQLlFTLFAubnAsTC5lLEwuVlcsTC5vWixMLmpyLEwucWwsTC55OCxM
+LkhpLEwuQlQsTC5MLEwuV3gsTC5BTyxMLmROLEwuSG8sTC54eixMLklDLEwuTDEsTC5uVCxMLk5ZLEwu
+R0gsTC5EVCxMLmVILEwueXUsTC56RCxMLlRXLEwueHIsTC5FRSxMLlFMLEwuVlMsTC5URCxNLk1pLE0u
+cTcsTS5ObyxYLnFSXSkKcihILmxjLFtILnp4LEguanldKQpzKEgua1ksUC5DNikKcyhQLmlsLFAuWWsp
+CnIoUC5pbCxbSC5ONSxQLnV3LFcuY2YsVy5TeV0pCnIoUC5tVyxbSC5LVyxQLnE0XSkKcyhILmIwLEgu
+cEYpCnIoSC5iMCxbSC5SRyxILldCXSkKcyhILlZQLEguUkcpCnMoSC5EZyxILlZQKQpzKEguWkcsSC5X
+QikKcyhILlBnLEguWkcpCnIoSC5QZyxbSC54aixILmRFLEguWkEsSC53ZixILlBxLEguZUUsSC5WNl0p
+CnMoSC54LEgudTkpCnMoUC5aZixQLlBmKQpzKFAuSmksUC5tMCkKcyhQLmI2LFAuWHYpCnMoUC5WaixQ
+LlRDKQpyKFAuVWssW1AuQ1YsUC5aaSxQLmJ5XSkKcyhQLndJLFAua1QpCnIoUC53SSxbUC5VOCxQLk14
+LFAuRTMsUC5HWV0pCnMoUC51NSxQLlppKQpyKFAubGYsW1AuQ1AsUC5JZl0pCnIoUC5BVCxbUC5iSixQ
+LmVZXSkKcyhQLnFlLFAuRG4pCnIoVy5EMCxbVy51SCxXLndhLFcuSzUsVy5DbV0pCnIoVy51SCxbVy5j
+dixXLm54LFcuUUYsVy5DUV0pCnIoVy5jdixbVy5xRSxQLmQ1XSkKcihXLnFFLFtXLkdoLFcuZlksVy5u
+QixXLlFQLFcuaDQsVy5TTixXLmxwLFcuVGIsVy5JdixXLldQLFcueVldKQpzKFcub0osVy5MZSkKcyhX
+LlQ1LFcuQXopCnMoVy5WYixXLlFGKQpzKFcuZkosVy53YSkKcihXLmVhLFtXLnc2LFcuZXddKQpzKFcu
+T0ssVy53NikKcyhXLnJCLFcuSzcpCnMoVy5CSCxXLnJCKQpzKFcudzQsVy5JQikKcyhXLm9hLFcuWFcp
+CnMoVy5yaCxXLm9hKQpzKFcuaTcsVy5jZikKcyhQLkFzLFAuVmopCnIoUC5BcyxbVy5JNCxQLktlXSkK
+cyhXLlJPLFAucWgpCnMoVy5ldSxXLlJPKQpzKFcueEMsUC5NTykKcyhXLmN0LFcubTYpCnMoUC5CZixQ
+LmlKKQpyKFAuRTQsW1AucjcsUC5jb10pCnMoUC5UeixQLmNvKQpzKFAuYkIsUC5kNSkKcyhCLmZ2LE8u
+ekwpCnIoQi5mdixbRS5PRixGLnJ1LEwuSVZdKQp0KEgudzIsSC5SZSkKdChILlJHLFAubEQpCnQoSC5W
+UCxILlNVKQp0KEguV0IsUC5sRCkKdChILlpHLEguU1UpCnQoUC5uWSxQLmxEKQp0KFAuVEMsUC5NYSkK
+dChQLlJVLFAuS1ApCnQoVy5MZSxXLmlkKQp0KFcuSzcsUC5sRCkKdChXLnJCLFcuR20pCnQoVy5YVyxQ
+LmxEKQp0KFcub2EsVy5HbSkKdChQLmNvLFAubEQpfSkoKQp2YXIgdj17dHlwZVVuaXZlcnNlOntlQzpu
+ZXcgTWFwKCksdFI6e30sZVQ6e30sdFBWOnt9LHNFQTpbXX0sbWFuZ2xlZEdsb2JhbE5hbWVzOntJZjoi
+aW50IixDUDoiZG91YmxlIixsZjoibnVtIixxVToiU3RyaW5nIixhMjoiYm9vbCIsYzg6Ik51bGwiLHpN
+OiJMaXN0In0sbWFuZ2xlZE5hbWVzOnt9LGdldFR5cGVGcm9tTmFtZTpnZXRHbG9iYWxGcm9tTmFtZSxt
+ZXRhZGF0YTpbXSx0eXBlczpbImM4KCkiLCJ+KCkiLCJjOChALEApIiwiYzgoT0spIiwicVUocVUpIiwi
+YzgoY3YpIiwiQChAKSIsImEyKHFVKSIsImM4KHFVLHFVKSIsImM4KGZKKSIsIn4ofigpKSIsImEyKGN2
+LHFVLHFVLEpRKSIsImM4KEApIiwiYzgocVUsQCkiLCJjOChldykiLCJhMihrRikiLCJ+KHh1PHFVPiki
+LCJjOChlYSkiLCJ+KE9LKSIsIlowPHFVLHFVPihaMDxxVSxxVT4scVUpIiwiSWYoSWYsSWYpIiwiQChx
+VSkiLCJ+KHFVLHFVKSIsIm42KElmKSIsIm42KEAsQCkiLCJhMih1SCkiLCJAKEAscVUpIiwifihAKSIs
+IkAoZWEpIiwiYzgoQCxHeikiLCJjOChJZixAKSIsIn4odUgsdUgpIiwifihNaFtHel0pIiwiTWgoQCki
+LCJjOChNaCxHeikiLCJyNyhAKSIsIlR6PEA+KEApIiwiRTQoQCkiLCJ2czxAPihAKSIsImM4KE1oLE1o
+KSIsImM4KFowPHFVLE1oPikiLCJiODxjOD4oT0spIiwicVUoT0spIiwiQCgpIiwiYzgoR0QsQCkiLCJj
+OCh+KCkpIiwicVUoSWYpIiwifihxVSxJZikiLCJ+KHFVW0BdKSIsIk1oKE1oKSIsImEyKHh1PHFVPiki
+XSxpbnRlcmNlcHRvcnNCeVRhZzpudWxsLGxlYWZUYWdzOm51bGwsYXJyYXlSdGk6dHlwZW9mIFN5bWJv
+bD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbCgpPT0ic3ltYm9sIj9TeW1ib2woIiR0aSIpOiIkdGki
+fQpILnhiKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3siYzUiOiJNRiIsImlDIjoiTUYiLCJrZCI6
+Ik1GIiwicngiOiJlYSIsImU1IjoiZWEiLCJZMCI6ImQ1IiwidHAiOiJkNSIsIkc4IjoiZXciLCJNciI6
+InFFIiwiZUwiOiJxRSIsIkkwIjoidUgiLCJocyI6InVIIiwiWGciOiJRRiIsInljIjoiT0siLCJ5NCI6
+Inc2IiwiYVAiOiJDbSIsInhjIjoibngiLCJrSiI6Im54IiwielUiOiJEZyIsImRmIjoicEYiLCJ5RSI6
+eyJhMiI6W119LCJZRSI6eyJjOCI6W119LCJNRiI6eyJ2bSI6W10sIkVIIjpbXX0sImpkIjp7InpNIjpb
+IjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJQbyI6eyJqZCI6WyIxIl0sInpNIjpbIjEiXSwiYlEi
+OlsiMSJdLCJjWCI6WyIxIl19LCJtMSI6eyJBbiI6WyIxIl19LCJxSSI6eyJDUCI6W10sImxmIjpbXX0s
+InVyIjp7IklmIjpbXSwiQ1AiOltdLCJsZiI6W119LCJWQSI6eyJDUCI6W10sImxmIjpbXX0sIkRyIjp7
+InFVIjpbXSwidlgiOltdfSwibmQiOnsiWFMiOltdfSwicWoiOnsiUmUiOlsiSWYiXSwibEQiOlsiSWYi
+XSwiek0iOlsiSWYiXSwiYlEiOlsiSWYiXSwiY1giOlsiSWYiXSwibEQuRSI6IklmIiwiUmUuRSI6Iklm
+In0sImJRIjp7ImNYIjpbIjEiXX0sImFMIjp7ImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibkgiOnsiYUwi
+OlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXSwiYUwuRSI6IjEiLCJjWC5FIjoiMSJ9LCJhNyI6eyJB
+biI6WyIxIl19LCJpMSI6eyJjWCI6WyIyIl0sImNYLkUiOiIyIn0sInh5Ijp7ImkxIjpbIjEiLCIyIl0s
+ImJRIjpbIjIiXSwiY1giOlsiMiJdLCJjWC5FIjoiMiJ9LCJNSCI6eyJBbiI6WyIyIl19LCJsSiI6eyJh
+TCI6WyIyIl0sImJRIjpbIjIiXSwiY1giOlsiMiJdLCJhTC5FIjoiMiIsImNYLkUiOiIyIn0sIlU1Ijp7
+ImNYIjpbIjEiXSwiY1guRSI6IjEifSwidkciOnsiQW4iOlsiMSJdfSwidzIiOnsiUmUiOlsiMSJdLCJs
+RCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ3diI6eyJHRCI6W119LCJQ
+RCI6eyJHaiI6WyIxIiwiMiJdLCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwiMiJdLCJLUCI6WyIxIiwi
+MiJdLCJaMCI6WyIxIiwiMiJdfSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0sIkxQIjp7IldVIjpbIjEiLCIy
+Il0sIlowIjpbIjEiLCIyIl19LCJYUiI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkxJIjp7InZRIjpb
+XX0sIlcwIjp7IlhTIjpbXX0sImF6Ijp7IlhTIjpbXX0sInZWIjp7IlhTIjpbXX0sIlhPIjp7Ikd6Ijpb
+XX0sIlRwIjp7IkVIIjpbXX0sImxjIjp7IkVIIjpbXX0sInp4Ijp7IkVIIjpbXX0sImp5Ijp7IkVIIjpb
+XX0sIkVxIjp7IlhTIjpbXX0sImtZIjp7IlhTIjpbXX0sIk41Ijp7IkZvIjpbIjEiLCIyIl0sIllrIjpb
+IjEiLCIyIl0sIlowIjpbIjEiLCIyIl0sIllrLksiOiIxIiwiWWsuViI6IjIifSwiaTUiOnsiYlEiOlsi
+MSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIk42Ijp7IkFuIjpbIjEiXX0sIlZSIjp7IndMIjpbXSwi
+dlgiOltdfSwiRUsiOnsiaWIiOltdLCJPZCI6W119LCJLVyI6eyJjWCI6WyJpYiJdLCJjWC5FIjoiaWIi
+fSwiUGIiOnsiQW4iOlsiaWIiXX0sInRRIjp7Ik9kIjpbXX0sIk5GIjp7ImNYIjpbIk9kIl0sImNYLkUi
+OiJPZCJ9LCJTZCI6eyJBbiI6WyJPZCJdfSwicEYiOnsiQVMiOltdfSwiYjAiOnsiWGoiOlsiMSJdLCJw
+RiI6W10sIkFTIjpbXX0sIkRnIjp7ImxEIjpbIkNQIl0sIlhqIjpbIkNQIl0sInpNIjpbIkNQIl0sInBG
+IjpbXSwiYlEiOlsiQ1AiXSwiU1UiOlsiQ1AiXSwiQVMiOltdLCJjWCI6WyJDUCJdLCJsRC5FIjoiQ1Ai
+fSwiUGciOnsibEQiOlsiSWYiXSwiek0iOlsiSWYiXSwiWGoiOlsiSWYiXSwicEYiOltdLCJiUSI6WyJJ
+ZiJdLCJTVSI6WyJJZiJdLCJBUyI6W10sImNYIjpbIklmIl19LCJ4aiI6eyJsRCI6WyJJZiJdLCJ6TSI6
+WyJJZiJdLCJYaiI6WyJJZiJdLCJwRiI6W10sImJRIjpbIklmIl0sIlNVIjpbIklmIl0sIkFTIjpbXSwi
+Y1giOlsiSWYiXSwibEQuRSI6IklmIn0sImRFIjp7ImxEIjpbIklmIl0sInpNIjpbIklmIl0sIlhqIjpb
+IklmIl0sInBGIjpbXSwiYlEiOlsiSWYiXSwiU1UiOlsiSWYiXSwiQVMiOltdLCJjWCI6WyJJZiJdLCJs
+RC5FIjoiSWYifSwiWkEiOnsibEQiOlsiSWYiXSwiek0iOlsiSWYiXSwiWGoiOlsiSWYiXSwicEYiOltd
+LCJiUSI6WyJJZiJdLCJTVSI6WyJJZiJdLCJBUyI6W10sImNYIjpbIklmIl0sImxELkUiOiJJZiJ9LCJ3
+ZiI6eyJsRCI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJYaiI6WyJJZiJdLCJwRiI6W10sImJRIjpbIklmIl0s
+IlNVIjpbIklmIl0sIkFTIjpbXSwiY1giOlsiSWYiXSwibEQuRSI6IklmIn0sIlBxIjp7ImxEIjpbIklm
+Il0sInpNIjpbIklmIl0sIlhqIjpbIklmIl0sInBGIjpbXSwiYlEiOlsiSWYiXSwiU1UiOlsiSWYiXSwi
+QVMiOltdLCJjWCI6WyJJZiJdLCJsRC5FIjoiSWYifSwiZUUiOnsibEQiOlsiSWYiXSwiek0iOlsiSWYi
+XSwiWGoiOlsiSWYiXSwicEYiOltdLCJiUSI6WyJJZiJdLCJTVSI6WyJJZiJdLCJBUyI6W10sImNYIjpb
+IklmIl0sImxELkUiOiJJZiJ9LCJWNiI6eyJuNiI6W10sImxEIjpbIklmIl0sInpNIjpbIklmIl0sIlhq
+IjpbIklmIl0sInBGIjpbXSwiYlEiOlsiSWYiXSwiU1UiOlsiSWYiXSwiQVMiOltdLCJjWCI6WyJJZiJd
+LCJsRC5FIjoiSWYifSwidTkiOnsiWFMiOltdfSwieCI6eyJYUyI6W119LCJHViI6eyJBbiI6WyIxIl19
+LCJxNCI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIlpmIjp7IlBmIjpbIjEiXX0sInZzIjp7ImI4Ijpb
+IjEiXX0sIk9IIjp7IlhTIjpbXX0sIm0wIjp7IkpCIjpbXX0sIkppIjp7Im0wIjpbXSwiSkIiOltdfSwi
+YjYiOnsiWHYiOlsiMSJdLCJ4dSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibG0iOnsiQW4i
+OlsiMSJdfSwibVciOnsiY1giOlsiMSJdfSwiTFUiOnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpb
+IjEiXSwiY1giOlsiMSJdfSwiaWwiOnsiWWsiOlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIllrIjp7
+IlowIjpbIjEiLCIyIl19LCJQbiI6eyJaMCI6WyIxIiwiMiJdfSwiR2oiOnsiUlUiOlsiMSIsIjIiXSwi
+UG4iOlsiMSIsIjIiXSwiS1AiOlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIlZqIjp7Ik1hIjpbIjEi
+XSwieHUiOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIlh2Ijp7Inh1IjpbIjEiXSwiYlEiOlsi
+MSJdLCJjWCI6WyIxIl19LCJ1dyI6eyJZayI6WyJxVSIsIkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksi
+OiJxVSIsIllrLlYiOiJAIn0sImk4Ijp7ImFMIjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0s
+ImFMLkUiOiJxVSIsImNYLkUiOiJxVSJ9LCJDViI6eyJVayI6WyJ6TTxJZj4iLCJxVSJdLCJVay5TIjoi
+ek08SWY+In0sIlU4Ijp7IndJIjpbInpNPElmPiIsInFVIl19LCJaaSI6eyJVayI6WyJxVSIsInpNPElm
+PiJdfSwiYnkiOnsiVWsiOlsiTWgiLCJxVSJdLCJVay5TIjoiTWgifSwiTXgiOnsid0kiOlsicVUiLCJN
+aCJdfSwidTUiOnsiVWsiOlsicVUiLCJ6TTxJZj4iXSwiVWsuUyI6InFVIn0sIkUzIjp7IndJIjpbInFV
+Iiwiek08SWY+Il19LCJHWSI6eyJ3SSI6WyJ6TTxJZj4iLCJxVSJdfSwiQ1AiOnsibGYiOltdfSwiQzYi
+OnsiWFMiOltdfSwiTEsiOnsiWFMiOltdfSwiQVQiOnsiWFMiOltdfSwiYkoiOnsiWFMiOltdfSwiZVki
+OnsiWFMiOltdfSwibXAiOnsiWFMiOltdfSwidWIiOnsiWFMiOltdfSwiZHMiOnsiWFMiOltdfSwibGoi
+OnsiWFMiOltdfSwiVVYiOnsiWFMiOltdfSwiazUiOnsiWFMiOltdfSwiS1kiOnsiWFMiOltdfSwidDci
+OnsiWFMiOltdfSwiSWYiOnsibGYiOltdfSwiek0iOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJpYiI6
+eyJPZCI6W119LCJ4dSI6eyJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIlpkIjp7Ikd6IjpbXX0sInFVIjp7
+InZYIjpbXX0sIlJuIjp7IkJMIjpbXX0sIkRuIjp7ImlEIjpbXX0sIlVmIjp7ImlEIjpbXX0sInFlIjp7
+ImlEIjpbXX0sInFFIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJHaCI6eyJjdiI6W10sInVIIjpb
+XSwiRDAiOltdfSwiZlkiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIm5CIjp7ImN2IjpbXSwidUgi
+OltdLCJEMCI6W119LCJRUCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwibngiOnsidUgiOltdLCJE
+MCI6W119LCJRRiI6eyJ1SCI6W10sIkQwIjpbXX0sIklCIjp7InRuIjpbImxmIl19LCJ3eiI6eyJsRCI6
+WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sImN2Ijp7InVI
+IjpbXSwiRDAiOltdfSwiVDUiOnsiQXoiOltdfSwiaDQiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0s
+IlZiIjp7InVIIjpbXSwiRDAiOltdfSwiZkoiOnsiRDAiOltdfSwid2EiOnsiRDAiOltdfSwiT0siOnsi
+ZWEiOltdfSwiZTciOnsibEQiOlsidUgiXSwiek0iOlsidUgiXSwiYlEiOlsidUgiXSwiY1giOlsidUgi
+XSwibEQuRSI6InVIIn0sInVIIjp7IkQwIjpbXX0sIkJIIjp7IkdtIjpbInVIIl0sImxEIjpbInVIIl0s
+InpNIjpbInVIIl0sIlhqIjpbInVIIl0sImJRIjpbInVIIl0sImNYIjpbInVIIl0sIkdtLkUiOiJ1SCIs
+ImxELkUiOiJ1SCJ9LCJTTiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiZXciOnsiZWEiOltdfSwi
+bHAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlRiIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119
+LCJJdiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiV1AiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpb
+XX0sInlZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJ3NiI6eyJlYSI6W119LCJLNSI6eyJ2NiI6
+W10sIkQwIjpbXX0sIkNtIjp7IkQwIjpbXX0sIkNRIjp7InVIIjpbXSwiRDAiOltdfSwidzQiOnsidG4i
+OlsibGYiXX0sInJoIjp7IkdtIjpbInVIIl0sImxEIjpbInVIIl0sInpNIjpbInVIIl0sIlhqIjpbInVI
+Il0sImJRIjpbInVIIl0sImNYIjpbInVIIl0sIkdtLkUiOiJ1SCIsImxELkUiOiJ1SCJ9LCJjZiI6eyJZ
+ayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXX0sImk3Ijp7IllrIjpbInFVIiwicVUiXSwiWjAi
+OlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUifSwiU3kiOnsiWWsiOlsicVUiLCJxVSJd
+LCJaMCI6WyJxVSIsInFVIl0sIllrLksiOiJxVSIsIllrLlYiOiJxVSJ9LCJJNCI6eyJNYSI6WyJxVSJd
+LCJ4dSI6WyJxVSJdLCJiUSI6WyJxVSJdLCJjWCI6WyJxVSJdfSwiUk8iOnsicWgiOlsiMSJdfSwiZXUi
+OnsiUk8iOlsiMSJdLCJxaCI6WyIxIl19LCJ4QyI6eyJNTyI6WyIxIl19LCJKUSI6eyJrRiI6W119LCJ2
+RCI6eyJrRiI6W119LCJtNiI6eyJrRiI6W119LCJjdCI6eyJrRiI6W119LCJPdyI6eyJrRiI6W119LCJX
+OSI6eyJBbiI6WyIxIl19LCJkVyI6eyJ2NiI6W10sIkQwIjpbXX0sIm1rIjp7InkwIjpbXX0sIktvIjp7
+Im9uIjpbXX0sIkFzIjp7Ik1hIjpbInFVIl0sInh1IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFV
+Il19LCJyNyI6eyJFNCI6W119LCJUeiI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJF
+NCI6W10sImNYIjpbIjEiXSwibEQuRSI6IjEifSwiYkIiOnsiZDUiOltdLCJjdiI6W10sInVIIjpbXSwi
+RDAiOltdfSwiS2UiOnsiTWEiOlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUi
+XX0sImQ1Ijp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJuNiI6eyJ6TSI6WyJJZiJdLCJiUSI6WyJJ
+ZiJdLCJBUyI6W10sImNYIjpbIklmIl19LCJYQSI6eyJrRiI6W119LCJPRiI6eyJmdiI6W119LCJydSI6
+eyJmdiI6W119LCJJViI6eyJmdiI6W119fScpKQpILkZGKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2Uo
+J3siYlEiOjEsIncyIjoxLCJiMCI6MSwia1QiOjIsIm1XIjoxLCJMVSI6MSwiaWwiOjIsIlZqIjoxLCJu
+WSI6MSwiVEMiOjEsImNvIjoxfScpKQp2YXIgdT0oZnVuY3Rpb24gcnRpaSgpe3ZhciB0PUguTjAKcmV0
+dXJue2JxOnQoIkdoIiksbjp0KCJPSCIpLGNSOnQoIm5CIiksZDp0KCJBeiIpLGk6dCgiUVAiKSxnRjp0
+KCJQRDxHRCxAPiIpLGd3OnQoImJRPEA+IiksaDp0KCJjdiIpLFc6dCgiWFMiKSxCOnQoImVhIiksdTp0
+KCJEMCIpLGM4OnQoIlQ1IiksWjp0KCJFSCIpLGFROnQoImI4PGM4PiIpLGM6dCgiYjg8QD4iKSxyOnQo
+ImZKIiksSTp0KCJTZyIpLG86dCgidlEiKSxlaDp0KCJjWDx1SD4iKSxYOnQoImNYPHFVPiIpLFI6dCgi
+Y1g8QD4iKSxmQTp0KCJqZDxTZT4iKSxnaTp0KCJqZDxqOD4iKSxmaDp0KCJqZDxaWj4iKSxrOnQoImpk
+PGtGPiIpLHM6dCgiamQ8cVU+IiksaGg6dCgiamQ8eUQ+IiksYUo6dCgiamQ8d2I+Iiksdjp0KCJqZDxA
+PiIpLHQ6dCgiamQ8SWY+IiksZUg6dCgidm0iKSxnOnQoImM1IiksYVU6dCgiWGo8QD4iKSxhbTp0KCJU
+ejxAPiIpLGVvOnQoIk41PEdELEA+IiksaGI6dCgiRTQiKSxkejp0KCJoRiIpLGY0OnQoInpNPGo4PiIp
+LGE6dCgiek08cVU+Iiksajp0KCJ6TTxAPiIpLEw6dCgiek08SWY+IiksYV86dCgidTgiKSxTOnQoIlow
+PHFVLE1oPiIpLGY6dCgiWjA8cVUscVU+IiksYjp0KCJaMDxxVSxAPiIpLEc6dCgiWjA8QCxAPiIpLGR2
+OnQoImxKPHFVLHFVPiIpLGRvOnQoImxKPHFVLEA+IiksVjp0KCJPSyIpLGREOnQoInBGIiksYm06dCgi
+VjYiKSxBOnQoInVIIiksZTp0KCJrRiIpLFA6dCgiYzgiKSxLOnQoIk1oIiksY2E6dCgiTWgoTWgsTWgp
+IikscDp0KCJldyIpLE86dCgidG48bGY+IiksZnY6dCgid0wiKSxldzp0KCJiQiIpLEM6dCgieHU8cVU+
+IiksbDp0KCJHeiIpLE46dCgicVUiKSxkRzp0KCJxVShxVSkiKSxnNzp0KCJkNSIpLGZvOnQoIkdEIiks
+YVc6dCgieVkiKSx3OnQoIkFTIiksZ2M6dCgibjYiKSxhazp0KCJrZCIpLEQ6dCgiR2o8cVUscVU+Iiks
+Rjp0KCJpRCIpLGNjOnQoIlU1PHFVPiIpLGc0OnQoIks1IiksY2k6dCgidjYiKSxnMjp0KCJDbSIpLEU6
+dCgiWmY8Zko+IiksaDk6dCgiQ1EiKSxhYzp0KCJlNyIpLFE6dCgiZXU8T0s+IiksVDp0KCJ3ejxjdj4i
+KSx4OnQoIkZlPEAsQD4iKSxZOnQoInZzPGZKPiIpLF86dCgidnM8QD4iKSxmSjp0KCJ2czxJZj4iKSxj
+cjp0KCJKUSIpLEo6dCgiYm4iKSx5OnQoImEyIiksbTp0KCJhMihNaCkiKSxiQjp0KCJhMihxVSkiKSxn
+Ujp0KCJDUCIpLHo6dCgiQCIpLGZPOnQoIkAoKSIpLFU6dCgiQChlYSkiKSxiSTp0KCJAKE1oKSIpLGFn
+OnQoIkAoTWgsR3opIiksYlU6dCgiQCh4dTxxVT4pIiksZE86dCgiQChxVSkiKSxiODp0KCJAKEAsQCki
+KSxxOnQoIklmIiksYXc6dCgiMCYqIiksZGk6dCgibGYiKSxIOnQoIn4iKSxNOnQoIn4oKSIpLGFuOnQo
+In4oZXcpIiksZUE6dCgifihxVSxxVSkiKSxjQTp0KCJ+KHFVLEApIil9fSkoKTsoZnVuY3Rpb24gY29u
+c3RhbnRzKCl7dmFyIHQ9aHVua0hlbHBlcnMubWFrZUNvbnN0TGlzdApDLlJZPVcuUVAucHJvdG90eXBl
+CkMuQlo9Vy5WYi5wcm90b3R5cGUKQy5EdD1XLmZKLnByb3RvdHlwZQpDLk9rPUoudkIucHJvdG90eXBl
+CkMuTm09Si5qZC5wcm90b3R5cGUKQy5qbj1KLnVyLnByb3RvdHlwZQpDLkNEPUoucUkucHJvdG90eXBl
+CkMueEI9Si5Eci5wcm90b3R5cGUKQy5ERz1KLmM1LnByb3RvdHlwZQpDLkV4PVcudTgucHJvdG90eXBl
+CkMuTHQ9Vy5TTi5wcm90b3R5cGUKQy5aUT1KLmlDLnByb3RvdHlwZQpDLkllPVcuVGIucHJvdG90eXBl
+CkMudkI9Si5rZC5wcm90b3R5cGUKQy5vbD1XLks1LnByb3RvdHlwZQpDLnk4PW5ldyBQLlU4KCkKQy5o
+OT1uZXcgUC5DVigpCkMud2I9ZnVuY3Rpb24gZ2V0VGFnRmFsbGJhY2sobykgewogIHZhciBzID0gT2Jq
+ZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pOwogIHJldHVybiBzLnN1YnN0cmluZyg4LCBzLmxl
+bmd0aCAtIDEpOwp9CkMuTzQ9ZnVuY3Rpb24oKSB7CiAgdmFyIHRvU3RyaW5nRnVuY3Rpb24gPSBPYmpl
+Y3QucHJvdG90eXBlLnRvU3RyaW5nOwogIGZ1bmN0aW9uIGdldFRhZyhvKSB7CiAgICB2YXIgcyA9IHRv
+U3RyaW5nRnVuY3Rpb24uY2FsbChvKTsKICAgIHJldHVybiBzLnN1YnN0cmluZyg4LCBzLmxlbmd0aCAt
+IDEpOwogIH0KICBmdW5jdGlvbiBnZXRVbmtub3duVGFnKG9iamVjdCwgdGFnKSB7CiAgICBpZiAoL15I
+VE1MW0EtWl0uKkVsZW1lbnQkLy50ZXN0KHRhZykpIHsKICAgICAgdmFyIG5hbWUgPSB0b1N0cmluZ0Z1
+bmN0aW9uLmNhbGwob2JqZWN0KTsKICAgICAgaWYgKG5hbWUgPT0gIltvYmplY3QgT2JqZWN0XSIpIHJl
+dHVybiBudWxsOwogICAgICByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAgIH0KICB9CiAgZnVuY3Rpb24g
+Z2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2VyKG9iamVjdCwgdGFnKSB7CiAgICBpZiAoc2VsZi5IVE1M
+RWxlbWVudCAmJiBvYmplY3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgcmV0dXJuICJIVE1MRWxlbWVu
+dCI7CiAgICByZXR1cm4gZ2V0VW5rbm93blRhZyhvYmplY3QsIHRhZyk7CiAgfQogIGZ1bmN0aW9uIHBy
+b3RvdHlwZUZvclRhZyh0YWcpIHsKICAgIGlmICh0eXBlb2Ygd2luZG93ID09ICJ1bmRlZmluZWQiKSBy
+ZXR1cm4gbnVsbDsKICAgIGlmICh0eXBlb2Ygd2luZG93W3RhZ10gPT0gInVuZGVmaW5lZCIpIHJldHVy
+biBudWxsOwogICAgdmFyIGNvbnN0cnVjdG9yID0gd2luZG93W3RhZ107CiAgICBpZiAodHlwZW9mIGNv
+bnN0cnVjdG9yICE9ICJmdW5jdGlvbiIpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGNvbnN0cnVjdG9y
+LnByb3RvdHlwZTsKICB9CiAgZnVuY3Rpb24gZGlzY3JpbWluYXRvcih0YWcpIHsgcmV0dXJuIG51bGw7
+IH0KICB2YXIgaXNCcm93c2VyID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0IjsKICByZXR1cm4g
+ewogICAgZ2V0VGFnOiBnZXRUYWcsCiAgICBnZXRVbmtub3duVGFnOiBpc0Jyb3dzZXIgPyBnZXRVbmtu
+b3duVGFnR2VuZXJpY0Jyb3dzZXIgOiBnZXRVbmtub3duVGFnLAogICAgcHJvdG90eXBlRm9yVGFnOiBw
+cm90b3R5cGVGb3JUYWcsCiAgICBkaXNjcmltaW5hdG9yOiBkaXNjcmltaW5hdG9yIH07Cn0KQy5kaz1m
+dW5jdGlvbihnZXRUYWdGYWxsYmFjaykgewogIHJldHVybiBmdW5jdGlvbihob29rcykgewogICAgaWYg
+KHR5cGVvZiBuYXZpZ2F0b3IgIT0gIm9iamVjdCIpIHJldHVybiBob29rczsKICAgIHZhciB1YSA9IG5h
+dmlnYXRvci51c2VyQWdlbnQ7CiAgICBpZiAodWEuaW5kZXhPZigiRHVtcFJlbmRlclRyZWUiKSA+PSAw
+KSByZXR1cm4gaG9va3M7CiAgICBpZiAodWEuaW5kZXhPZigiQ2hyb21lIikgPj0gMCkgewogICAgICBm
+dW5jdGlvbiBjb25maXJtKHApIHsKICAgICAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PSAib2JqZWN0
+IiAmJiB3aW5kb3dbcF0gJiYgd2luZG93W3BdLm5hbWUgPT0gcDsKICAgICAgfQogICAgICBpZiAoY29u
+ZmlybSgiV2luZG93IikgJiYgY29uZmlybSgiSFRNTEVsZW1lbnQiKSkgcmV0dXJuIGhvb2tzOwogICAg
+fQogICAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnRmFsbGJhY2s7CiAgfTsKfQpDLllxPWZ1bmN0aW9uKGhv
+b2tzKSB7CiAgaWYgKHR5cGVvZiBkYXJ0RXhwZXJpbWVudGFsRml4dXBHZXRUYWcgIT0gImZ1bmN0aW9u
+IikgcmV0dXJuIGhvb2tzOwogIGhvb2tzLmdldFRhZyA9IGRhcnRFeHBlcmltZW50YWxGaXh1cEdldFRh
+Zyhob29rcy5nZXRUYWcpOwp9CkMuS1U9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgZ2V0VGFnID0gaG9v
+a3MuZ2V0VGFnOwogIHZhciBwcm90b3R5cGVGb3JUYWcgPSBob29rcy5wcm90b3R5cGVGb3JUYWc7CiAg
+ZnVuY3Rpb24gZ2V0VGFnRml4ZWQobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIGlmICh0
+YWcgPT0gIkRvY3VtZW50IikgewogICAgICBpZiAoISFvLnhtbFZlcnNpb24pIHJldHVybiAiIURvY3Vt
+ZW50IjsKICAgICAgcmV0dXJuICIhSFRNTERvY3VtZW50IjsKICAgIH0KICAgIHJldHVybiB0YWc7CiAg
+fQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRhZ0ZpeGVkKHRhZykgewogICAgaWYgKHRhZyA9PSAiRG9j
+dW1lbnQiKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBwcm90b3R5cGVGb3JUYWcodGFnKTsKICB9CiAg
+aG9va3MuZ2V0VGFnID0gZ2V0VGFnRml4ZWQ7CiAgaG9va3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90
+eXBlRm9yVGFnRml4ZWQ7Cn0KQy54aT1mdW5jdGlvbihob29rcykgewogIHZhciB1c2VyQWdlbnQgPSB0
+eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICIiOwogIGlm
+ICh1c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpID09IC0xKSByZXR1cm4gaG9va3M7CiAgdmFyIGdl
+dFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcXVpY2tNYXAgPSB7CiAgICAiQmVmb3JlVW5sb2FkRXZl
+bnQiOiAiRXZlbnQiLAogICAgIkRhdGFUcmFuc2ZlciI6ICJDbGlwYm9hcmQiLAogICAgIkdlb0dlb2xv
+Y2F0aW9uIjogIkdlb2xvY2F0aW9uIiwKICAgICJMb2NhdGlvbiI6ICIhTG9jYXRpb24iLAogICAgIldv
+cmtlck1lc3NhZ2VFdmVudCI6ICJNZXNzYWdlRXZlbnQiLAogICAgIlhNTERvY3VtZW50IjogIiFEb2N1
+bWVudCJ9OwogIGZ1bmN0aW9uIGdldFRhZ0ZpcmVmb3gobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhv
+KTsKICAgIHJldHVybiBxdWlja01hcFt0YWddIHx8IHRhZzsKICB9CiAgaG9va3MuZ2V0VGFnID0gZ2V0
+VGFnRmlyZWZveDsKfQpDLmk3PWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIHVzZXJBZ2VudCA9IHR5cGVv
+ZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogIiI7CiAgaWYgKHVz
+ZXJBZ2VudC5pbmRleE9mKCJUcmlkZW50LyIpID09IC0xKSByZXR1cm4gaG9va3M7CiAgdmFyIGdldFRh
+ZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcXVpY2tNYXAgPSB7CiAgICAiQmVmb3JlVW5sb2FkRXZlbnQi
+OiAiRXZlbnQiLAogICAgIkRhdGFUcmFuc2ZlciI6ICJDbGlwYm9hcmQiLAogICAgIkhUTUxEREVsZW1l
+bnQiOiAiSFRNTEVsZW1lbnQiLAogICAgIkhUTUxEVEVsZW1lbnQiOiAiSFRNTEVsZW1lbnQiLAogICAg
+IkhUTUxQaHJhc2VFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJQb3NpdGlvbiI6ICJHZW9wb3Np
+dGlvbiIKICB9OwogIGZ1bmN0aW9uIGdldFRhZ0lFKG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7
+CiAgICB2YXIgbmV3VGFnID0gcXVpY2tNYXBbdGFnXTsKICAgIGlmIChuZXdUYWcpIHJldHVybiBuZXdU
+YWc7CiAgICBpZiAodGFnID09ICJPYmplY3QiKSB7CiAgICAgIGlmICh3aW5kb3cuRGF0YVZpZXcgJiYg
+KG8gaW5zdGFuY2VvZiB3aW5kb3cuRGF0YVZpZXcpKSByZXR1cm4gIkRhdGFWaWV3IjsKICAgIH0KICAg
+IHJldHVybiB0YWc7CiAgfQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRhZ0lFKHRhZykgewogICAgdmFy
+IGNvbnN0cnVjdG9yID0gd2luZG93W3RhZ107CiAgICBpZiAoY29uc3RydWN0b3IgPT0gbnVsbCkgcmV0
+dXJuIG51bGw7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlOwogIH0KICBob29rcy5nZXRU
+YWcgPSBnZXRUYWdJRTsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBwcm90b3R5cGVGb3JUYWdJRTsK
+fQpDLmZRPWZ1bmN0aW9uKGhvb2tzKSB7IHJldHVybiBob29rczsgfQoKQy5DdD1uZXcgUC5ieSgpCkMu
+RXE9bmV3IFAuazUoKQpDLnhNPW5ldyBQLnU1KCkKQy5Raz1uZXcgUC5FMygpCkMuTlU9bmV3IFAuSmko
+KQpDLnBkPW5ldyBQLlpkKCkKQy5BMz1uZXcgUC5NeChudWxsKQpDLkdiPUguVk0odChbMTI3LDIwNDcs
+NjU1MzUsMTExNDExMV0pLHUudCkKQy5haz1ILlZNKHQoWzAsMCwzMjc3NiwzMzc5MiwxLDEwMjQwLDAs
+MF0pLHUudCkKQy5jbT1ILlZNKHQoWyIqOjpjbGFzcyIsIio6OmRpciIsIio6OmRyYWdnYWJsZSIsIio6
+OmhpZGRlbiIsIio6OmlkIiwiKjo6aW5lcnQiLCIqOjppdGVtcHJvcCIsIio6Oml0ZW1yZWYiLCIqOjpp
+dGVtc2NvcGUiLCIqOjpsYW5nIiwiKjo6c3BlbGxjaGVjayIsIio6OnRpdGxlIiwiKjo6dHJhbnNsYXRl
+IiwiQTo6YWNjZXNza2V5IiwiQTo6Y29vcmRzIiwiQTo6aHJlZmxhbmciLCJBOjpuYW1lIiwiQTo6c2hh
+cGUiLCJBOjp0YWJpbmRleCIsIkE6OnRhcmdldCIsIkE6OnR5cGUiLCJBUkVBOjphY2Nlc3NrZXkiLCJB
+UkVBOjphbHQiLCJBUkVBOjpjb29yZHMiLCJBUkVBOjpub2hyZWYiLCJBUkVBOjpzaGFwZSIsIkFSRUE6
+OnRhYmluZGV4IiwiQVJFQTo6dGFyZ2V0IiwiQVVESU86OmNvbnRyb2xzIiwiQVVESU86Omxvb3AiLCJB
+VURJTzo6bWVkaWFncm91cCIsIkFVRElPOjptdXRlZCIsIkFVRElPOjpwcmVsb2FkIiwiQkRPOjpkaXIi
+LCJCT0RZOjphbGluayIsIkJPRFk6OmJnY29sb3IiLCJCT0RZOjpsaW5rIiwiQk9EWTo6dGV4dCIsIkJP
+RFk6OnZsaW5rIiwiQlI6OmNsZWFyIiwiQlVUVE9OOjphY2Nlc3NrZXkiLCJCVVRUT046OmRpc2FibGVk
+IiwiQlVUVE9OOjpuYW1lIiwiQlVUVE9OOjp0YWJpbmRleCIsIkJVVFRPTjo6dHlwZSIsIkJVVFRPTjo6
+dmFsdWUiLCJDQU5WQVM6OmhlaWdodCIsIkNBTlZBUzo6d2lkdGgiLCJDQVBUSU9OOjphbGlnbiIsIkNP
+TDo6YWxpZ24iLCJDT0w6OmNoYXIiLCJDT0w6OmNoYXJvZmYiLCJDT0w6OnNwYW4iLCJDT0w6OnZhbGln
+biIsIkNPTDo6d2lkdGgiLCJDT0xHUk9VUDo6YWxpZ24iLCJDT0xHUk9VUDo6Y2hhciIsIkNPTEdST1VQ
+OjpjaGFyb2ZmIiwiQ09MR1JPVVA6OnNwYW4iLCJDT0xHUk9VUDo6dmFsaWduIiwiQ09MR1JPVVA6Ondp
+ZHRoIiwiQ09NTUFORDo6Y2hlY2tlZCIsIkNPTU1BTkQ6OmNvbW1hbmQiLCJDT01NQU5EOjpkaXNhYmxl
+ZCIsIkNPTU1BTkQ6OmxhYmVsIiwiQ09NTUFORDo6cmFkaW9ncm91cCIsIkNPTU1BTkQ6OnR5cGUiLCJE
+QVRBOjp2YWx1ZSIsIkRFTDo6ZGF0ZXRpbWUiLCJERVRBSUxTOjpvcGVuIiwiRElSOjpjb21wYWN0Iiwi
+RElWOjphbGlnbiIsIkRMOjpjb21wYWN0IiwiRklFTERTRVQ6OmRpc2FibGVkIiwiRk9OVDo6Y29sb3Ii
+LCJGT05UOjpmYWNlIiwiRk9OVDo6c2l6ZSIsIkZPUk06OmFjY2VwdCIsIkZPUk06OmF1dG9jb21wbGV0
+ZSIsIkZPUk06OmVuY3R5cGUiLCJGT1JNOjptZXRob2QiLCJGT1JNOjpuYW1lIiwiRk9STTo6bm92YWxp
+ZGF0ZSIsIkZPUk06OnRhcmdldCIsIkZSQU1FOjpuYW1lIiwiSDE6OmFsaWduIiwiSDI6OmFsaWduIiwi
+SDM6OmFsaWduIiwiSDQ6OmFsaWduIiwiSDU6OmFsaWduIiwiSDY6OmFsaWduIiwiSFI6OmFsaWduIiwi
+SFI6Om5vc2hhZGUiLCJIUjo6c2l6ZSIsIkhSOjp3aWR0aCIsIkhUTUw6OnZlcnNpb24iLCJJRlJBTUU6
+OmFsaWduIiwiSUZSQU1FOjpmcmFtZWJvcmRlciIsIklGUkFNRTo6aGVpZ2h0IiwiSUZSQU1FOjptYXJn
+aW5oZWlnaHQiLCJJRlJBTUU6Om1hcmdpbndpZHRoIiwiSUZSQU1FOjp3aWR0aCIsIklNRzo6YWxpZ24i
+LCJJTUc6OmFsdCIsIklNRzo6Ym9yZGVyIiwiSU1HOjpoZWlnaHQiLCJJTUc6OmhzcGFjZSIsIklNRzo6
+aXNtYXAiLCJJTUc6Om5hbWUiLCJJTUc6OnVzZW1hcCIsIklNRzo6dnNwYWNlIiwiSU1HOjp3aWR0aCIs
+IklOUFVUOjphY2NlcHQiLCJJTlBVVDo6YWNjZXNza2V5IiwiSU5QVVQ6OmFsaWduIiwiSU5QVVQ6OmFs
+dCIsIklOUFVUOjphdXRvY29tcGxldGUiLCJJTlBVVDo6YXV0b2ZvY3VzIiwiSU5QVVQ6OmNoZWNrZWQi
+LCJJTlBVVDo6ZGlzYWJsZWQiLCJJTlBVVDo6aW5wdXRtb2RlIiwiSU5QVVQ6OmlzbWFwIiwiSU5QVVQ6
+Omxpc3QiLCJJTlBVVDo6bWF4IiwiSU5QVVQ6Om1heGxlbmd0aCIsIklOUFVUOjptaW4iLCJJTlBVVDo6
+bXVsdGlwbGUiLCJJTlBVVDo6bmFtZSIsIklOUFVUOjpwbGFjZWhvbGRlciIsIklOUFVUOjpyZWFkb25s
+eSIsIklOUFVUOjpyZXF1aXJlZCIsIklOUFVUOjpzaXplIiwiSU5QVVQ6OnN0ZXAiLCJJTlBVVDo6dGFi
+aW5kZXgiLCJJTlBVVDo6dHlwZSIsIklOUFVUOjp1c2VtYXAiLCJJTlBVVDo6dmFsdWUiLCJJTlM6OmRh
+dGV0aW1lIiwiS0VZR0VOOjpkaXNhYmxlZCIsIktFWUdFTjo6a2V5dHlwZSIsIktFWUdFTjo6bmFtZSIs
+IkxBQkVMOjphY2Nlc3NrZXkiLCJMQUJFTDo6Zm9yIiwiTEVHRU5EOjphY2Nlc3NrZXkiLCJMRUdFTkQ6
+OmFsaWduIiwiTEk6OnR5cGUiLCJMSTo6dmFsdWUiLCJMSU5LOjpzaXplcyIsIk1BUDo6bmFtZSIsIk1F
+TlU6OmNvbXBhY3QiLCJNRU5VOjpsYWJlbCIsIk1FTlU6OnR5cGUiLCJNRVRFUjo6aGlnaCIsIk1FVEVS
+Ojpsb3ciLCJNRVRFUjo6bWF4IiwiTUVURVI6Om1pbiIsIk1FVEVSOjp2YWx1ZSIsIk9CSkVDVDo6dHlw
+ZW11c3RtYXRjaCIsIk9MOjpjb21wYWN0IiwiT0w6OnJldmVyc2VkIiwiT0w6OnN0YXJ0IiwiT0w6OnR5
+cGUiLCJPUFRHUk9VUDo6ZGlzYWJsZWQiLCJPUFRHUk9VUDo6bGFiZWwiLCJPUFRJT046OmRpc2FibGVk
+IiwiT1BUSU9OOjpsYWJlbCIsIk9QVElPTjo6c2VsZWN0ZWQiLCJPUFRJT046OnZhbHVlIiwiT1VUUFVU
+Ojpmb3IiLCJPVVRQVVQ6Om5hbWUiLCJQOjphbGlnbiIsIlBSRTo6d2lkdGgiLCJQUk9HUkVTUzo6bWF4
+IiwiUFJPR1JFU1M6Om1pbiIsIlBST0dSRVNTOjp2YWx1ZSIsIlNFTEVDVDo6YXV0b2NvbXBsZXRlIiwi
+U0VMRUNUOjpkaXNhYmxlZCIsIlNFTEVDVDo6bXVsdGlwbGUiLCJTRUxFQ1Q6Om5hbWUiLCJTRUxFQ1Q6
+OnJlcXVpcmVkIiwiU0VMRUNUOjpzaXplIiwiU0VMRUNUOjp0YWJpbmRleCIsIlNPVVJDRTo6dHlwZSIs
+IlRBQkxFOjphbGlnbiIsIlRBQkxFOjpiZ2NvbG9yIiwiVEFCTEU6OmJvcmRlciIsIlRBQkxFOjpjZWxs
+cGFkZGluZyIsIlRBQkxFOjpjZWxsc3BhY2luZyIsIlRBQkxFOjpmcmFtZSIsIlRBQkxFOjpydWxlcyIs
+IlRBQkxFOjpzdW1tYXJ5IiwiVEFCTEU6OndpZHRoIiwiVEJPRFk6OmFsaWduIiwiVEJPRFk6OmNoYXIi
+LCJUQk9EWTo6Y2hhcm9mZiIsIlRCT0RZOjp2YWxpZ24iLCJURDo6YWJiciIsIlREOjphbGlnbiIsIlRE
+OjpheGlzIiwiVEQ6OmJnY29sb3IiLCJURDo6Y2hhciIsIlREOjpjaGFyb2ZmIiwiVEQ6OmNvbHNwYW4i
+LCJURDo6aGVhZGVycyIsIlREOjpoZWlnaHQiLCJURDo6bm93cmFwIiwiVEQ6OnJvd3NwYW4iLCJURDo6
+c2NvcGUiLCJURDo6dmFsaWduIiwiVEQ6OndpZHRoIiwiVEVYVEFSRUE6OmFjY2Vzc2tleSIsIlRFWFRB
+UkVBOjphdXRvY29tcGxldGUiLCJURVhUQVJFQTo6Y29scyIsIlRFWFRBUkVBOjpkaXNhYmxlZCIsIlRF
+WFRBUkVBOjppbnB1dG1vZGUiLCJURVhUQVJFQTo6bmFtZSIsIlRFWFRBUkVBOjpwbGFjZWhvbGRlciIs
+IlRFWFRBUkVBOjpyZWFkb25seSIsIlRFWFRBUkVBOjpyZXF1aXJlZCIsIlRFWFRBUkVBOjpyb3dzIiwi
+VEVYVEFSRUE6OnRhYmluZGV4IiwiVEVYVEFSRUE6OndyYXAiLCJURk9PVDo6YWxpZ24iLCJURk9PVDo6
+Y2hhciIsIlRGT09UOjpjaGFyb2ZmIiwiVEZPT1Q6OnZhbGlnbiIsIlRIOjphYmJyIiwiVEg6OmFsaWdu
+IiwiVEg6OmF4aXMiLCJUSDo6Ymdjb2xvciIsIlRIOjpjaGFyIiwiVEg6OmNoYXJvZmYiLCJUSDo6Y29s
+c3BhbiIsIlRIOjpoZWFkZXJzIiwiVEg6OmhlaWdodCIsIlRIOjpub3dyYXAiLCJUSDo6cm93c3BhbiIs
+IlRIOjpzY29wZSIsIlRIOjp2YWxpZ24iLCJUSDo6d2lkdGgiLCJUSEVBRDo6YWxpZ24iLCJUSEVBRDo6
+Y2hhciIsIlRIRUFEOjpjaGFyb2ZmIiwiVEhFQUQ6OnZhbGlnbiIsIlRSOjphbGlnbiIsIlRSOjpiZ2Nv
+bG9yIiwiVFI6OmNoYXIiLCJUUjo6Y2hhcm9mZiIsIlRSOjp2YWxpZ24iLCJUUkFDSzo6ZGVmYXVsdCIs
+IlRSQUNLOjpraW5kIiwiVFJBQ0s6OmxhYmVsIiwiVFJBQ0s6OnNyY2xhbmciLCJVTDo6Y29tcGFjdCIs
+IlVMOjp0eXBlIiwiVklERU86OmNvbnRyb2xzIiwiVklERU86OmhlaWdodCIsIlZJREVPOjpsb29wIiwi
+VklERU86Om1lZGlhZ3JvdXAiLCJWSURFTzo6bXV0ZWQiLCJWSURFTzo6cHJlbG9hZCIsIlZJREVPOjp3
+aWR0aCJdKSx1LnMpCkMuVkM9SC5WTSh0KFswLDAsNjU0OTAsNDUwNTUsNjU1MzUsMzQ4MTUsNjU1MzQs
+MTg0MzFdKSx1LnQpCkMubUs9SC5WTSh0KFswLDAsMjY2MjQsMTAyMyw2NTUzNCwyMDQ3LDY1NTM0LDIw
+NDddKSx1LnQpCkMuU3E9SC5WTSh0KFsiSEVBRCIsIkFSRUEiLCJCQVNFIiwiQkFTRUZPTlQiLCJCUiIs
+IkNPTCIsIkNPTEdST1VQIiwiRU1CRUQiLCJGUkFNRSIsIkZSQU1FU0VUIiwiSFIiLCJJTUFHRSIsIklN
+RyIsIklOUFVUIiwiSVNJTkRFWCIsIkxJTksiLCJNRVRBIiwiUEFSQU0iLCJTT1VSQ0UiLCJTVFlMRSIs
+IlRJVExFIiwiV0JSIl0pLHUucykKQy54RD1ILlZNKHQoW10pLHUucykKQy5kbj1ILlZNKHQoW10pLHUu
+dikKQy50bz1ILlZNKHQoWzAsMCwzMjcyMiwxMjI4Nyw2NTUzNCwzNDgxNSw2NTUzNCwxODQzMV0pLHUu
+dCkKQy5GMz1ILlZNKHQoWzAsMCwyNDU3NiwxMDIzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdS50
+KQpDLmVhPUguVk0odChbMCwwLDMyNzU0LDExMjYzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdS50
+KQpDLlpKPUguVk0odChbMCwwLDMyNzIyLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdS50
+KQpDLldkPUguVk0odChbMCwwLDY1NDkwLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdS50
+KQpDLlF4PUguVk0odChbImJpbmQiLCJpZiIsInJlZiIsInJlcGVhdCIsInN5bnRheCJdKSx1LnMpCkMu
+Qkk9SC5WTSh0KFsiQTo6aHJlZiIsIkFSRUE6OmhyZWYiLCJCTE9DS1FVT1RFOjpjaXRlIiwiQk9EWTo6
+YmFja2dyb3VuZCIsIkNPTU1BTkQ6Omljb24iLCJERUw6OmNpdGUiLCJGT1JNOjphY3Rpb24iLCJJTUc6
+OnNyYyIsIklOUFVUOjpzcmMiLCJJTlM6OmNpdGUiLCJROjpjaXRlIiwiVklERU86OnBvc3RlciJdKSx1
+LnMpCkMuQ009bmV3IEguTFAoMCx7fSxDLnhELEguTjAoIkxQPHFVLHpNPGo4Pj4iKSkKQy5XTz1uZXcg
+SC5MUCgwLHt9LEMueEQsSC5OMCgiTFA8cVUscVU+IikpCkMuaFU9SC5WTSh0KFtdKSxILk4wKCJqZDxH
+RD4iKSkKQy5EeD1uZXcgSC5MUCgwLHt9LEMuaFUsSC5OMCgiTFA8R0QsQD4iKSkKQy5ZMj1uZXcgTC5P
+OSgiTmF2aWdhdGlvblRyZWVOb2RlVHlwZS5kaXJlY3RvcnkiKQpDLnJmPW5ldyBMLk85KCJOYXZpZ2F0
+aW9uVHJlZU5vZGVUeXBlLmZpbGUiKQpDLlRlPW5ldyBILnd2KCJjYWxsIikKQy53UT1uZXcgUC5GeShu
+dWxsLDIpfSkoKTsoZnVuY3Rpb24gc3RhdGljRmllbGRzKCl7JC55aj0wCiQubUo9bnVsbAokLlA0PW51
+bGwKJC55PW51bGwKJC51PW51bGwKJC54Nz1udWxsCiQuaj1udWxsCiQudj1udWxsCiQuSz1udWxsCiQu
+UzY9bnVsbAokLms4PW51bGwKJC5tZz1udWxsCiQuVUQ9ITEKJC5YMz1DLk5VCiQueGc9W10KJC54bz1u
+dWxsCiQuQk89bnVsbAokLmx0PW51bGwKJC5FVT1udWxsCiQub3I9UC5GbCh1Lk4sdS5aKQokLkk2PW51
+bGwKJC5GZj1udWxsfSkoKTsoZnVuY3Rpb24gbGF6eUluaXRpYWxpemVycygpe3ZhciB0PWh1bmtIZWxw
+ZXJzLmxhenkKdCgkLCJmYSIsIndRIixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFydENs
+b3N1cmUiKX0pCnQoJCwiWTIiLCJBIixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfanMiKX0p
+CnQoJCwiVTIiLCJTbiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rp
+b24oKXtyZXR1cm4iJHJlY2VpdmVyJCJ9fSkpfSkKdCgkLCJ4cSIsImxxIixmdW5jdGlvbigpe3JldHVy
+biBILmNNKEguUzcoeyRtZXRob2QkOm51bGwsCnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNl
+aXZlciQifX0pKX0pCnQoJCwiUjEiLCJOOSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KG51bGwp
+KX0pCnQoJCwiZk4iLCJpSSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3ZhciAkYXJn
+dW1lbnRzRXhwciQ9JyRhcmd1bWVudHMkJwp0cnl7bnVsbC4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQp
+fWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0pCnQoJCwicWkiLCJVTiIsZnVuY3Rpb24oKXty
+ZXR1cm4gSC5jTShILlM3KHZvaWQgMCkpfSkKdCgkLCJyWiIsIlpoIixmdW5jdGlvbigpe3JldHVybiBI
+LmNNKGZ1bmN0aW9uKCl7dmFyICRhcmd1bWVudHNFeHByJD0nJGFyZ3VtZW50cyQnCnRyeXsodm9pZCAw
+KS4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0p
+CnQoJCwia3EiLCJyTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKG51bGwpKX0pCnQoJCwidHQi
+LCJjMyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXtudWxsLiRtZXRob2QkfWNh
+dGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0pCnQoJCwiZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1
+cm4gSC5jTShILk1qKHZvaWQgMCkpfSkKdCgkLCJBNyIsInIxIixmdW5jdGlvbigpe3JldHVybiBILmNN
+KGZ1bmN0aW9uKCl7dHJ5eyh2b2lkIDApLiRtZXRob2QkfWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9
+fSgpKX0pCnQoJCwiV2MiLCJ1dCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5PaigpfSkKdCgkLCJraCIsInRM
+IixmdW5jdGlvbigpe3JldHVybiBuZXcgUC5wZygpLiQwKCl9KQp0KCQsImJ0IiwiVjciLGZ1bmN0aW9u
+KCl7cmV0dXJuIG5ldyBJbnQ4QXJyYXkoSC5YRihILlZNKFstMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwt
+MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwt
+MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMSwtMiwtMiwtMiwtMiwtMiw2MiwtMiw2MiwtMiw2Myw1
+Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMiwtMiwtMiwtMSwtMiwtMiwtMiwwLDEsMiwzLDQs
+NSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LC0y
+LC0yLC0yLC0yLDYzLC0yLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQw
+LDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0yLC0yLC0yLC0yLC0yXSx1LnQpKSl9KQp0
+KCQsIk01IiwiT3giLGZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYm
+T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT0iW29iamVjdCBwcm9jZXNzXSIm
+JnByb2Nlc3MucGxhdGZvcm09PSJ3aW4zMiJ9KQp0KCQsIm1mIiwiejQiLGZ1bmN0aW9uKCl7cmV0dXJu
+IFAubnUoIl5bXFwtXFwuMC05QS1aX2Eten5dKiQiKX0pCnQoJCwiSkciLCJ2WiIsZnVuY3Rpb24oKXty
+ZXR1cm4gUC5LTigpfSkKdCgkLCJTQyIsIkFOIixmdW5jdGlvbigpe3JldHVybiBQLnRNKFsiQSIsIkFC
+QlIiLCJBQ1JPTllNIiwiQUREUkVTUyIsIkFSRUEiLCJBUlRJQ0xFIiwiQVNJREUiLCJBVURJTyIsIkIi
+LCJCREkiLCJCRE8iLCJCSUciLCJCTE9DS1FVT1RFIiwiQlIiLCJCVVRUT04iLCJDQU5WQVMiLCJDQVBU
+SU9OIiwiQ0VOVEVSIiwiQ0lURSIsIkNPREUiLCJDT0wiLCJDT0xHUk9VUCIsIkNPTU1BTkQiLCJEQVRB
+IiwiREFUQUxJU1QiLCJERCIsIkRFTCIsIkRFVEFJTFMiLCJERk4iLCJESVIiLCJESVYiLCJETCIsIkRU
+IiwiRU0iLCJGSUVMRFNFVCIsIkZJR0NBUFRJT04iLCJGSUdVUkUiLCJGT05UIiwiRk9PVEVSIiwiRk9S
+TSIsIkgxIiwiSDIiLCJIMyIsIkg0IiwiSDUiLCJINiIsIkhFQURFUiIsIkhHUk9VUCIsIkhSIiwiSSIs
+IklGUkFNRSIsIklNRyIsIklOUFVUIiwiSU5TIiwiS0JEIiwiTEFCRUwiLCJMRUdFTkQiLCJMSSIsIk1B
+UCIsIk1BUksiLCJNRU5VIiwiTUVURVIiLCJOQVYiLCJOT0JSIiwiT0wiLCJPUFRHUk9VUCIsIk9QVElP
+TiIsIk9VVFBVVCIsIlAiLCJQUkUiLCJQUk9HUkVTUyIsIlEiLCJTIiwiU0FNUCIsIlNFQ1RJT04iLCJT
+RUxFQ1QiLCJTTUFMTCIsIlNPVVJDRSIsIlNQQU4iLCJTVFJJS0UiLCJTVFJPTkciLCJTVUIiLCJTVU1N
+QVJZIiwiU1VQIiwiVEFCTEUiLCJUQk9EWSIsIlREIiwiVEVYVEFSRUEiLCJURk9PVCIsIlRIIiwiVEhF
+QUQiLCJUSU1FIiwiVFIiLCJUUkFDSyIsIlRUIiwiVSIsIlVMIiwiVkFSIiwiVklERU8iLCJXQlIiXSx1
+Lk4pfSkKdCgkLCJYNCIsImhHIixmdW5jdGlvbigpe3JldHVybiBQLm51KCJeXFxTKyQiKX0pCnQoJCwi
+d08iLCJvdyIsZnVuY3Rpb24oKXtyZXR1cm4gUC5ORChzZWxmKX0pCnQoJCwia3QiLCJDciIsZnVuY3Rp
+b24oKXtyZXR1cm4gSC5ZZygiXyRkYXJ0X2RhcnRPYmplY3QiKX0pCnQoJCwiZksiLCJrSSIsZnVuY3Rp
+b24oKXtyZXR1cm4gZnVuY3Rpb24gRGFydE9iamVjdChhKXt0aGlzLm89YX19KQp0KCQsInF0IiwiekIi
+LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBULm1RKCl9KQp0KCQsIk9sIiwiVUUiLGZ1bmN0aW9uKCl7cmV0
+dXJuIFAuaEsoQy5vbC5nbVcoVy54MygpKS5ocmVmKS5naFkoKS5xKDAsImF1dGhUb2tlbiIpfSkKdCgk
+LCJoVCIsInlQIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiLmVkaXQtbGlz
+dCAucGFuZWwtY29udGVudCIpfSkKdCgkLCJXNiIsImhMIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCku
+cXVlcnlTZWxlY3RvcigiLmVkaXQtcGFuZWwgLnBhbmVsLWNvbnRlbnQiKX0pCnQoJCwiVFIiLCJEVyIs
+ZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoImZvb3RlciIpfSkKdCgkLCJFWSIs
+ImZpIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiaGVhZGVyIil9KQp0KCQs
+ImF2IiwiRDkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIjdW5pdC1uYW1l
+Iil9KQp0KCQsImZlIiwiS0ciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMLlhBKCl9KQp0KCQsImVvIiwi
+blUiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLmxJKCQuSGsoKSl9KQp0KCQsInlyIiwiYkQiLGZ1bmN0
+aW9uKCl7cmV0dXJuIG5ldyBFLk9GKFAubnUoIi8iKSxQLm51KCJbXi9dJCIpLFAubnUoIl4vIikpfSkK
+dCgkLCJNayIsIktrIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5JVihQLm51KCJbL1xcXFxdIiksUC5u
+dSgiW14vXFxcXF0kIiksUC5udSgiXihcXFxcXFxcXFteXFxcXF0rXFxcXFteXFxcXC9dK3xbYS16QS1a
+XTpbL1xcXFxdKSIpLFAubnUoIl5bL1xcXFxdKD8hWy9cXFxcXSkiKSl9KQp0KCQsImFrIiwiRWIiLGZ1
+bmN0aW9uKCl7cmV0dXJuIG5ldyBGLnJ1KFAubnUoIi8iKSxQLm51KCIoXlthLXpBLVpdWy0rLmEtekEt
+WlxcZF0qOi8vfFteL10pJCIpLFAubnUoIlthLXpBLVpdWy0rLmEtekEtWlxcZF0qOi8vW14vXSoiKSxQ
+Lm51KCJeLyIpKX0pCnQoJCwibHMiLCJIayIsZnVuY3Rpb24oKXtyZXR1cm4gTy5SaCgpfSl9KSgpOyhm
+dW5jdGlvbiBuYXRpdmVTdXBwb3J0KCl7IWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIG49
+e30KblthXT0xCnJldHVybiBPYmplY3Qua2V5cyhodW5rSGVscGVycy5jb252ZXJ0VG9GYXN0T2JqZWN0
+KG4pKVswXX0Kdi5nZXRJc29sYXRlVGFnPWZ1bmN0aW9uKGEpe3JldHVybiB0KCJfX19kYXJ0XyIrYSt2
+Lmlzb2xhdGVUYWcpfQp2YXIgcz0iX19fZGFydF9pc29sYXRlX3RhZ3NfIgp2YXIgcj1PYmplY3Rbc118
+fChPYmplY3Rbc109T2JqZWN0LmNyZWF0ZShudWxsKSkKdmFyIHE9Il9aeFl4WCIKZm9yKHZhciBwPTA7
+O3ArKyl7dmFyIG89dChxKyJfIitwKyJfIikKaWYoIShvIGluIHIpKXtyW29dPTEKdi5pc29sYXRlVGFn
+PW8KYnJlYWt9fXYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWU9di5nZXRJc29sYXRlVGFnKCJkaXNwYXRjaF9y
+ZWNvcmQiKX0oKQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnKHtET01FcnJv
+cjpKLnZCLERPTUltcGxlbWVudGF0aW9uOkoudkIsTWVkaWFFcnJvcjpKLnZCLE5hdmlnYXRvcjpKLnZC
+LE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTpKLnZCLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOkou
+dkIsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6Si52QixQb3NpdGlvbkVycm9yOkoudkIsUmFuZ2U6Si52QixT
+UUxFcnJvcjpKLnZCLERhdGFWaWV3OkgucEYsQXJyYXlCdWZmZXJWaWV3OkgucEYsRmxvYXQzMkFycmF5
+OkguRGcsRmxvYXQ2NEFycmF5OkguRGcsSW50MTZBcnJheTpILnhqLEludDMyQXJyYXk6SC5kRSxJbnQ4
+QXJyYXk6SC5aQSxVaW50MTZBcnJheTpILndmLFVpbnQzMkFycmF5OkguUHEsVWludDhDbGFtcGVkQXJy
+YXk6SC5lRSxDYW52YXNQaXhlbEFycmF5OkguZUUsVWludDhBcnJheTpILlY2LEhUTUxBdWRpb0VsZW1l
+bnQ6Vy5xRSxIVE1MQlJFbGVtZW50OlcucUUsSFRNTEJ1dHRvbkVsZW1lbnQ6Vy5xRSxIVE1MQ2FudmFz
+RWxlbWVudDpXLnFFLEhUTUxDb250ZW50RWxlbWVudDpXLnFFLEhUTUxETGlzdEVsZW1lbnQ6Vy5xRSxI
+VE1MRGF0YUVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUxpc3RFbGVtZW50OlcucUUsSFRNTERldGFpbHNFbGVt
+ZW50OlcucUUsSFRNTERpYWxvZ0VsZW1lbnQ6Vy5xRSxIVE1MRGl2RWxlbWVudDpXLnFFLEhUTUxFbWJl
+ZEVsZW1lbnQ6Vy5xRSxIVE1MRmllbGRTZXRFbGVtZW50OlcucUUsSFRNTEhSRWxlbWVudDpXLnFFLEhU
+TUxIZWFkRWxlbWVudDpXLnFFLEhUTUxIZWFkaW5nRWxlbWVudDpXLnFFLEhUTUxIdG1sRWxlbWVudDpX
+LnFFLEhUTUxJRnJhbWVFbGVtZW50OlcucUUsSFRNTEltYWdlRWxlbWVudDpXLnFFLEhUTUxJbnB1dEVs
+ZW1lbnQ6Vy5xRSxIVE1MTElFbGVtZW50OlcucUUsSFRNTExhYmVsRWxlbWVudDpXLnFFLEhUTUxMZWdl
+bmRFbGVtZW50OlcucUUsSFRNTExpbmtFbGVtZW50OlcucUUsSFRNTE1hcEVsZW1lbnQ6Vy5xRSxIVE1M
+TWVkaWFFbGVtZW50OlcucUUsSFRNTE1lbnVFbGVtZW50OlcucUUsSFRNTE1ldGFFbGVtZW50OlcucUUs
+SFRNTE1ldGVyRWxlbWVudDpXLnFFLEhUTUxNb2RFbGVtZW50OlcucUUsSFRNTE9MaXN0RWxlbWVudDpX
+LnFFLEhUTUxPYmplY3RFbGVtZW50OlcucUUsSFRNTE9wdEdyb3VwRWxlbWVudDpXLnFFLEhUTUxPcHRp
+b25FbGVtZW50OlcucUUsSFRNTE91dHB1dEVsZW1lbnQ6Vy5xRSxIVE1MUGFyYW1FbGVtZW50OlcucUUs
+SFRNTFBpY3R1cmVFbGVtZW50OlcucUUsSFRNTFByZUVsZW1lbnQ6Vy5xRSxIVE1MUHJvZ3Jlc3NFbGVt
+ZW50OlcucUUsSFRNTFF1b3RlRWxlbWVudDpXLnFFLEhUTUxTY3JpcHRFbGVtZW50OlcucUUsSFRNTFNo
+YWRvd0VsZW1lbnQ6Vy5xRSxIVE1MU2xvdEVsZW1lbnQ6Vy5xRSxIVE1MU291cmNlRWxlbWVudDpXLnFF
+LEhUTUxTcGFuRWxlbWVudDpXLnFFLEhUTUxTdHlsZUVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVDYXB0aW9u
+RWxlbWVudDpXLnFFLEhUTUxUYWJsZUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlRGF0YUNlbGxFbGVt
+ZW50OlcucUUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVDb2xFbGVtZW50
+OlcucUUsSFRNTFRleHRBcmVhRWxlbWVudDpXLnFFLEhUTUxUaW1lRWxlbWVudDpXLnFFLEhUTUxUaXRs
+ZUVsZW1lbnQ6Vy5xRSxIVE1MVHJhY2tFbGVtZW50OlcucUUsSFRNTFVMaXN0RWxlbWVudDpXLnFFLEhU
+TUxVbmtub3duRWxlbWVudDpXLnFFLEhUTUxWaWRlb0VsZW1lbnQ6Vy5xRSxIVE1MRGlyZWN0b3J5RWxl
+bWVudDpXLnFFLEhUTUxGb250RWxlbWVudDpXLnFFLEhUTUxGcmFtZUVsZW1lbnQ6Vy5xRSxIVE1MRnJh
+bWVTZXRFbGVtZW50OlcucUUsSFRNTE1hcnF1ZWVFbGVtZW50OlcucUUsSFRNTEVsZW1lbnQ6Vy5xRSxI
+VE1MQW5jaG9yRWxlbWVudDpXLkdoLEhUTUxBcmVhRWxlbWVudDpXLmZZLEhUTUxCYXNlRWxlbWVudDpX
+Lm5CLEJsb2I6Vy5BeixIVE1MQm9keUVsZW1lbnQ6Vy5RUCxDREFUQVNlY3Rpb246Vy5ueCxDaGFyYWN0
+ZXJEYXRhOlcubngsQ29tbWVudDpXLm54LFByb2Nlc3NpbmdJbnN0cnVjdGlvbjpXLm54LFRleHQ6Vy5u
+eCxDU1NTdHlsZURlY2xhcmF0aW9uOlcub0osTVNTdHlsZUNTU1Byb3BlcnRpZXM6Vy5vSixDU1MyUHJv
+cGVydGllczpXLm9KLFhNTERvY3VtZW50OlcuUUYsRG9jdW1lbnQ6Vy5RRixET01FeGNlcHRpb246Vy5O
+aCxET01SZWN0UmVhZE9ubHk6Vy5JQixET01Ub2tlbkxpc3Q6Vy5uNyxFbGVtZW50OlcuY3YsQWJvcnRQ
+YXltZW50RXZlbnQ6Vy5lYSxBbmltYXRpb25FdmVudDpXLmVhLEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6
+Vy5lYSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaENsaWNrRXZl
+bnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaEZhaWxFdmVudDpX
+LmVhLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6Vy5lYSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZlbnQ6Vy5l
+YSxCZWZvcmVVbmxvYWRFdmVudDpXLmVhLEJsb2JFdmVudDpXLmVhLENhbk1ha2VQYXltZW50RXZlbnQ6
+Vy5lYSxDbGlwYm9hcmRFdmVudDpXLmVhLENsb3NlRXZlbnQ6Vy5lYSxDdXN0b21FdmVudDpXLmVhLERl
+dmljZU1vdGlvbkV2ZW50OlcuZWEsRGV2aWNlT3JpZW50YXRpb25FdmVudDpXLmVhLEVycm9yRXZlbnQ6
+Vy5lYSxFeHRlbmRhYmxlRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OlcuZWEsRmV0Y2hF
+dmVudDpXLmVhLEZvbnRGYWNlU2V0TG9hZEV2ZW50OlcuZWEsRm9yZWlnbkZldGNoRXZlbnQ6Vy5lYSxH
+YW1lcGFkRXZlbnQ6Vy5lYSxIYXNoQ2hhbmdlRXZlbnQ6Vy5lYSxJbnN0YWxsRXZlbnQ6Vy5lYSxNZWRp
+YUVuY3J5cHRlZEV2ZW50OlcuZWEsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6Vy5lYSxNZWRpYVF1ZXJ5TGlz
+dEV2ZW50OlcuZWEsTWVkaWFTdHJlYW1FdmVudDpXLmVhLE1lZGlhU3RyZWFtVHJhY2tFdmVudDpXLmVh
+LE1lc3NhZ2VFdmVudDpXLmVhLE1JRElDb25uZWN0aW9uRXZlbnQ6Vy5lYSxNSURJTWVzc2FnZUV2ZW50
+OlcuZWEsTXV0YXRpb25FdmVudDpXLmVhLE5vdGlmaWNhdGlvbkV2ZW50OlcuZWEsUGFnZVRyYW5zaXRp
+b25FdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0RXZlbnQ6Vy5lYSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2
+ZW50OlcuZWEsUG9wU3RhdGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVF
+dmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OlcuZWEsUHJvbWlzZVJlamVj
+dGlvbkV2ZW50OlcuZWEsUHVzaEV2ZW50OlcuZWEsUlRDRGF0YUNoYW5uZWxFdmVudDpXLmVhLFJUQ0RU
+TUZUb25lQ2hhbmdlRXZlbnQ6Vy5lYSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50OlcuZWEsUlRDVHJh
+Y2tFdmVudDpXLmVhLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6Vy5lYSxTZW5zb3JFcnJvckV2
+ZW50OlcuZWEsU3BlZWNoUmVjb2duaXRpb25FcnJvcjpXLmVhLFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6
+Vy5lYSxTcGVlY2hTeW50aGVzaXNFdmVudDpXLmVhLFN0b3JhZ2VFdmVudDpXLmVhLFN5bmNFdmVudDpX
+LmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxXZWJLaXRUcmFuc2l0aW9uRXZl
+bnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJEaXNwbGF5RXZlbnQ6Vy5lYSxWUlNlc3Npb25FdmVu
+dDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6Vy5lYSxVU0JDb25uZWN0aW9uRXZlbnQ6Vy5l
+YSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxBdWRpb1Byb2Nlc3NpbmdFdmVudDpXLmVhLE9mZmxp
+bmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdlYkdMQ29udGV4dEV2ZW50OlcuZWEsRXZlbnQ6Vy5l
+YSxJbnB1dEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxGaWxlOlcuVDUsSFRNTEZvcm1FbGVtZW50
+OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZiLFhNTEh0dHBSZXF1ZXN0OlcuZkosWE1M
+SHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0YTpXLlNnLExvY2F0aW9uOlcudTgsTW91
+c2VFdmVudDpXLk9LLERyYWdFdmVudDpXLk9LLFBvaW50ZXJFdmVudDpXLk9LLFdoZWVsRXZlbnQ6Vy5P
+SyxEb2N1bWVudEZyYWdtZW50OlcudUgsU2hhZG93Um9vdDpXLnVILERvY3VtZW50VHlwZTpXLnVILE5v
+ZGU6Vy51SCxOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6Vy5CSCxIVE1MUGFyYWdyYXBoRWxlbWVu
+dDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6Vy5ldyxIVE1MU2Vs
+ZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5UYixIVE1MVGFibGVSb3dFbGVtZW50Olcu
+SXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5XUCxIVE1MVGVtcGxhdGVFbGVtZW50OlcueVksQ29t
+cG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixLZXlib2FyZEV2ZW50OlcudzYsVGV4dEV2
+ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53NixXaW5kb3c6Vy5LNSxET01XaW5kb3c6
+Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNlcnZpY2VXb3JrZXJHbG9iYWxTY29w
+ZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sV29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxB
+dHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53NCxOYW1lZE5vZGVNYXA6Vy5yaCxNb3pO
+YW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNWR1NjcmlwdEVsZW1lbnQ6UC5iQixTVkdB
+RWxlbWVudDpQLmQ1LFNWR0FuaW1hdGVFbGVtZW50OlAuZDUsU1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQ6
+UC5kNSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmQ1LFNWR0FuaW1hdGlvbkVsZW1lbnQ6UC5k
+NSxTVkdDaXJjbGVFbGVtZW50OlAuZDUsU1ZHQ2xpcFBhdGhFbGVtZW50OlAuZDUsU1ZHRGVmc0VsZW1l
+bnQ6UC5kNSxTVkdEZXNjRWxlbWVudDpQLmQ1LFNWR0Rpc2NhcmRFbGVtZW50OlAuZDUsU1ZHRWxsaXBz
+ZUVsZW1lbnQ6UC5kNSxTVkdGRUJsZW5kRWxlbWVudDpQLmQ1LFNWR0ZFQ29sb3JNYXRyaXhFbGVtZW50
+OlAuZDUsU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6UC5kNSxTVkdGRUNvbXBvc2l0ZUVsZW1l
+bnQ6UC5kNSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQLmQ1LFNWR0ZFRGlmZnVzZUxpZ2h0aW5n
+RWxlbWVudDpQLmQ1LFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudDpQLmQ1LFNWR0ZFRGlzdGFudExp
+Z2h0RWxlbWVudDpQLmQ1LFNWR0ZFRmxvb2RFbGVtZW50OlAuZDUsU1ZHRkVGdW5jQUVsZW1lbnQ6UC5k
+NSxTVkdGRUZ1bmNCRWxlbWVudDpQLmQ1LFNWR0ZFRnVuY0dFbGVtZW50OlAuZDUsU1ZHRkVGdW5jUkVs
+ZW1lbnQ6UC5kNSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6UC5kNSxTVkdGRUltYWdlRWxlbWVudDpQ
+LmQ1LFNWR0ZFTWVyZ2VFbGVtZW50OlAuZDUsU1ZHRkVNZXJnZU5vZGVFbGVtZW50OlAuZDUsU1ZHRkVN
+b3JwaG9sb2d5RWxlbWVudDpQLmQ1LFNWR0ZFT2Zmc2V0RWxlbWVudDpQLmQ1LFNWR0ZFUG9pbnRMaWdo
+dEVsZW1lbnQ6UC5kNSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdFbGVtZW50OlAuZDUsU1ZHRkVTcG90TGln
+aHRFbGVtZW50OlAuZDUsU1ZHRkVUaWxlRWxlbWVudDpQLmQ1LFNWR0ZFVHVyYnVsZW5jZUVsZW1lbnQ6
+UC5kNSxTVkdGaWx0ZXJFbGVtZW50OlAuZDUsU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQ6UC5kNSxTVkdH
+RWxlbWVudDpQLmQ1LFNWR0dlb21ldHJ5RWxlbWVudDpQLmQ1LFNWR0dyYXBoaWNzRWxlbWVudDpQLmQ1
+LFNWR0ltYWdlRWxlbWVudDpQLmQ1LFNWR0xpbmVFbGVtZW50OlAuZDUsU1ZHTGluZWFyR3JhZGllbnRF
+bGVtZW50OlAuZDUsU1ZHTWFya2VyRWxlbWVudDpQLmQ1LFNWR01hc2tFbGVtZW50OlAuZDUsU1ZHTWV0
+YWRhdGFFbGVtZW50OlAuZDUsU1ZHUGF0aEVsZW1lbnQ6UC5kNSxTVkdQYXR0ZXJuRWxlbWVudDpQLmQ1
+LFNWR1BvbHlnb25FbGVtZW50OlAuZDUsU1ZHUG9seWxpbmVFbGVtZW50OlAuZDUsU1ZHUmFkaWFsR3Jh
+ZGllbnRFbGVtZW50OlAuZDUsU1ZHUmVjdEVsZW1lbnQ6UC5kNSxTVkdTZXRFbGVtZW50OlAuZDUsU1ZH
+U3RvcEVsZW1lbnQ6UC5kNSxTVkdTdHlsZUVsZW1lbnQ6UC5kNSxTVkdTVkdFbGVtZW50OlAuZDUsU1ZH
+U3dpdGNoRWxlbWVudDpQLmQ1LFNWR1N5bWJvbEVsZW1lbnQ6UC5kNSxTVkdUU3BhbkVsZW1lbnQ6UC5k
+NSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5kNSxTVkdUZXh0RWxlbWVudDpQLmQ1LFNWR1RleHRQYXRo
+RWxlbWVudDpQLmQ1LFNWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQ6UC5kNSxTVkdUaXRsZUVsZW1lbnQ6
+UC5kNSxTVkdVc2VFbGVtZW50OlAuZDUsU1ZHVmlld0VsZW1lbnQ6UC5kNSxTVkdHcmFkaWVudEVsZW1l
+bnQ6UC5kNSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudDpQLmQ1LFNWR0ZFRHJvcFNo
+YWRvd0VsZW1lbnQ6UC5kNSxTVkdNUGF0aEVsZW1lbnQ6UC5kNSxTVkdFbGVtZW50OlAuZDV9KQpodW5r
+SGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJvcjp0cnVlLERPTUltcGxlbWVudGF0aW9u
+OnRydWUsTWVkaWFFcnJvcjp0cnVlLE5hdmlnYXRvcjp0cnVlLE5hdmlnYXRvckNvbmN1cnJlbnRIYXJk
+d2FyZTp0cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRydWUsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6
+dHJ1ZSxQb3NpdGlvbkVycm9yOnRydWUsUmFuZ2U6dHJ1ZSxTUUxFcnJvcjp0cnVlLERhdGFWaWV3OnRy
+dWUsQXJyYXlCdWZmZXJWaWV3OmZhbHNlLEZsb2F0MzJBcnJheTp0cnVlLEZsb2F0NjRBcnJheTp0cnVl
+LEludDE2QXJyYXk6dHJ1ZSxJbnQzMkFycmF5OnRydWUsSW50OEFycmF5OnRydWUsVWludDE2QXJyYXk6
+dHJ1ZSxVaW50MzJBcnJheTp0cnVlLFVpbnQ4Q2xhbXBlZEFycmF5OnRydWUsQ2FudmFzUGl4ZWxBcnJh
+eTp0cnVlLFVpbnQ4QXJyYXk6ZmFsc2UsSFRNTEF1ZGlvRWxlbWVudDp0cnVlLEhUTUxCUkVsZW1lbnQ6
+dHJ1ZSxIVE1MQnV0dG9uRWxlbWVudDp0cnVlLEhUTUxDYW52YXNFbGVtZW50OnRydWUsSFRNTENvbnRl
+bnRFbGVtZW50OnRydWUsSFRNTERMaXN0RWxlbWVudDp0cnVlLEhUTUxEYXRhRWxlbWVudDp0cnVlLEhU
+TUxEYXRhTGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGV0YWlsc0VsZW1lbnQ6dHJ1ZSxIVE1MRGlhbG9nRWxl
+bWVudDp0cnVlLEhUTUxEaXZFbGVtZW50OnRydWUsSFRNTEVtYmVkRWxlbWVudDp0cnVlLEhUTUxGaWVs
+ZFNldEVsZW1lbnQ6dHJ1ZSxIVE1MSFJFbGVtZW50OnRydWUsSFRNTEhlYWRFbGVtZW50OnRydWUsSFRN
+TEhlYWRpbmdFbGVtZW50OnRydWUsSFRNTEh0bWxFbGVtZW50OnRydWUsSFRNTElGcmFtZUVsZW1lbnQ6
+dHJ1ZSxIVE1MSW1hZ2VFbGVtZW50OnRydWUsSFRNTElucHV0RWxlbWVudDp0cnVlLEhUTUxMSUVsZW1l
+bnQ6dHJ1ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExlZ2VuZEVsZW1lbnQ6dHJ1ZSxIVE1MTGlu
+a0VsZW1lbnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhUTUxNZWRpYUVsZW1lbnQ6dHJ1ZSxIVE1M
+TWVudUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0ZXJFbGVtZW50OnRydWUs
+SFRNTE1vZEVsZW1lbnQ6dHJ1ZSxIVE1MT0xpc3RFbGVtZW50OnRydWUsSFRNTE9iamVjdEVsZW1lbnQ6
+dHJ1ZSxIVE1MT3B0R3JvdXBFbGVtZW50OnRydWUsSFRNTE9wdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MT3V0
+cHV0RWxlbWVudDp0cnVlLEhUTUxQYXJhbUVsZW1lbnQ6dHJ1ZSxIVE1MUGljdHVyZUVsZW1lbnQ6dHJ1
+ZSxIVE1MUHJlRWxlbWVudDp0cnVlLEhUTUxQcm9ncmVzc0VsZW1lbnQ6dHJ1ZSxIVE1MUXVvdGVFbGVt
+ZW50OnRydWUsSFRNTFNjcmlwdEVsZW1lbnQ6dHJ1ZSxIVE1MU2hhZG93RWxlbWVudDp0cnVlLEhUTUxT
+bG90RWxlbWVudDp0cnVlLEhUTUxTb3VyY2VFbGVtZW50OnRydWUsSFRNTFNwYW5FbGVtZW50OnRydWUs
+SFRNTFN0eWxlRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OnRydWUsSFRNTFRhYmxl
+Q2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVIZWFk
+ZXJDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNvbEVsZW1lbnQ6dHJ1ZSxIVE1MVGV4dEFyZWFFbGVt
+ZW50OnRydWUsSFRNTFRpbWVFbGVtZW50OnRydWUsSFRNTFRpdGxlRWxlbWVudDp0cnVlLEhUTUxUcmFj
+a0VsZW1lbnQ6dHJ1ZSxIVE1MVUxpc3RFbGVtZW50OnRydWUsSFRNTFVua25vd25FbGVtZW50OnRydWUs
+SFRNTFZpZGVvRWxlbWVudDp0cnVlLEhUTUxEaXJlY3RvcnlFbGVtZW50OnRydWUsSFRNTEZvbnRFbGVt
+ZW50OnRydWUsSFRNTEZyYW1lRWxlbWVudDp0cnVlLEhUTUxGcmFtZVNldEVsZW1lbnQ6dHJ1ZSxIVE1M
+TWFycXVlZUVsZW1lbnQ6dHJ1ZSxIVE1MRWxlbWVudDpmYWxzZSxIVE1MQW5jaG9yRWxlbWVudDp0cnVl
+LEhUTUxBcmVhRWxlbWVudDp0cnVlLEhUTUxCYXNlRWxlbWVudDp0cnVlLEJsb2I6ZmFsc2UsSFRNTEJv
+ZHlFbGVtZW50OnRydWUsQ0RBVEFTZWN0aW9uOnRydWUsQ2hhcmFjdGVyRGF0YTp0cnVlLENvbW1lbnQ6
+dHJ1ZSxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246dHJ1ZSxUZXh0OnRydWUsQ1NTU3R5bGVEZWNsYXJhdGlv
+bjp0cnVlLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOnRydWUsQ1NTMlByb3BlcnRpZXM6dHJ1ZSxYTUxEb2N1
+bWVudDp0cnVlLERvY3VtZW50OmZhbHNlLERPTUV4Y2VwdGlvbjp0cnVlLERPTVJlY3RSZWFkT25seTpm
+YWxzZSxET01Ub2tlbkxpc3Q6dHJ1ZSxFbGVtZW50OmZhbHNlLEFib3J0UGF5bWVudEV2ZW50OnRydWUs
+QW5pbWF0aW9uRXZlbnQ6dHJ1ZSxBbmltYXRpb25QbGF5YmFja0V2ZW50OnRydWUsQXBwbGljYXRpb25D
+YWNoZUVycm9yRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OnRydWUsQmFja2dyb3Vu
+ZEZldGNoRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0
+Y2hlZEV2ZW50OnRydWUsQmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OnRydWUsQmVmb3JlVW5sb2FkRXZl
+bnQ6dHJ1ZSxCbG9iRXZlbnQ6dHJ1ZSxDYW5NYWtlUGF5bWVudEV2ZW50OnRydWUsQ2xpcGJvYXJkRXZl
+bnQ6dHJ1ZSxDbG9zZUV2ZW50OnRydWUsQ3VzdG9tRXZlbnQ6dHJ1ZSxEZXZpY2VNb3Rpb25FdmVudDp0
+cnVlLERldmljZU9yaWVudGF0aW9uRXZlbnQ6dHJ1ZSxFcnJvckV2ZW50OnRydWUsRXh0ZW5kYWJsZUV2
+ZW50OnRydWUsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDp0cnVlLEZldGNoRXZlbnQ6dHJ1ZSxGb250RmFj
+ZVNldExvYWRFdmVudDp0cnVlLEZvcmVpZ25GZXRjaEV2ZW50OnRydWUsR2FtZXBhZEV2ZW50OnRydWUs
+SGFzaENoYW5nZUV2ZW50OnRydWUsSW5zdGFsbEV2ZW50OnRydWUsTWVkaWFFbmNyeXB0ZWRFdmVudDp0
+cnVlLE1lZGlhS2V5TWVzc2FnZUV2ZW50OnRydWUsTWVkaWFRdWVyeUxpc3RFdmVudDp0cnVlLE1lZGlh
+U3RyZWFtRXZlbnQ6dHJ1ZSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6dHJ1ZSxNZXNzYWdlRXZlbnQ6dHJ1
+ZSxNSURJQ29ubmVjdGlvbkV2ZW50OnRydWUsTUlESU1lc3NhZ2VFdmVudDp0cnVlLE11dGF0aW9uRXZl
+bnQ6dHJ1ZSxOb3RpZmljYXRpb25FdmVudDp0cnVlLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxQYXlt
+ZW50UmVxdWVzdEV2ZW50OnRydWUsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDp0cnVlLFBvcFN0YXRl
+RXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6dHJ1ZSxQcmVzZW50
+YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDp0cnVlLFByb21pc2VSZWplY3Rpb25FdmVudDp0cnVlLFB1
+c2hFdmVudDp0cnVlLFJUQ0RhdGFDaGFubmVsRXZlbnQ6dHJ1ZSxSVENEVE1GVG9uZUNoYW5nZUV2ZW50
+OnRydWUsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDp0cnVlLFJUQ1RyYWNrRXZlbnQ6dHJ1ZSxTZWN1
+cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OnRydWUsU2Vuc29yRXJyb3JFdmVudDp0cnVlLFNwZWVjaFJl
+Y29nbml0aW9uRXJyb3I6dHJ1ZSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OnRydWUsU3BlZWNoU3ludGhl
+c2lzRXZlbnQ6dHJ1ZSxTdG9yYWdlRXZlbnQ6dHJ1ZSxTeW5jRXZlbnQ6dHJ1ZSxUcmFja0V2ZW50OnRy
+dWUsVHJhbnNpdGlvbkV2ZW50OnRydWUsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OnRydWUsVlJEZXZpY2VF
+dmVudDp0cnVlLFZSRGlzcGxheUV2ZW50OnRydWUsVlJTZXNzaW9uRXZlbnQ6dHJ1ZSxNb2pvSW50ZXJm
+YWNlUmVxdWVzdEV2ZW50OnRydWUsVVNCQ29ubmVjdGlvbkV2ZW50OnRydWUsSURCVmVyc2lvbkNoYW5n
+ZUV2ZW50OnRydWUsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6dHJ1ZSxPZmZsaW5lQXVkaW9Db21wbGV0aW9u
+RXZlbnQ6dHJ1ZSxXZWJHTENvbnRleHRFdmVudDp0cnVlLEV2ZW50OmZhbHNlLElucHV0RXZlbnQ6ZmFs
+c2UsRXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxGb3JtRWxlbWVudDp0cnVlLEhpc3Rvcnk6
+dHJ1ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVzdDp0cnVlLFhNTEh0dHBSZXF1ZXN0RXZl
+bnRUYXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRpb246dHJ1ZSxNb3VzZUV2ZW50OnRydWUs
+RHJhZ0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hlZWxFdmVudDp0cnVlLERvY3VtZW50RnJh
+Z21lbnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRUeXBlOnRydWUsTm9kZTpmYWxzZSxOb2Rl
+TGlzdDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFyYWdyYXBoRWxlbWVudDp0cnVlLFByb2dy
+ZXNzRXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6dHJ1ZSxIVE1MU2VsZWN0RWxlbWVudDp0
+cnVlLEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVSb3dFbGVtZW50OnRydWUsSFRNTFRhYmxl
+U2VjdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVtZW50OnRydWUsQ29tcG9zaXRpb25FdmVu
+dDp0cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50OnRydWUsVGV4dEV2ZW50OnRydWUsVG91
+Y2hFdmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRydWUsRE9NV2luZG93OnRydWUsRGVkaWNh
+dGVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTaGFy
+ZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2JhbFNjb3BlOnRydWUsQXR0cjp0cnVlLENs
+aWVudFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2RlTWFwOnRydWUsTW96TmFtZWRBdHRyTWFw
+OnRydWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVtZW50OnRydWUsU1ZHQUVsZW1lbnQ6dHJ1
+ZSxTVkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50OnRydWUsU1ZHQW5p
+bWF0ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRpb25FbGVtZW50OnRydWUsU1ZHQ2lyY2xl
+RWxlbWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVlLFNWR0RlZnNFbGVtZW50OnRydWUsU1ZH
+RGVzY0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0cnVlLFNWR0VsbGlwc2VFbGVtZW50OnRy
+dWUsU1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9yTWF0cml4RWxlbWVudDp0cnVlLFNWR0ZF
+Q29tcG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVDb21wb3NpdGVFbGVtZW50OnRydWUsU1ZH
+RkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1lbnQ6dHJ1
+ZSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxTVkdGRURpc3RhbnRMaWdodEVsZW1lbnQ6
+dHJ1ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0FFbGVtZW50OnRydWUsU1ZHRkVGdW5j
+QkVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVlLFNWR0ZFRnVuY1JFbGVtZW50OnRydWUs
+U1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJbWFnZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1l
+cmdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDp0cnVlLFNWR0ZFTW9ycGhvbG9neUVs
+ZW1lbnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxTVkdGRVBvaW50TGlnaHRFbGVtZW50OnRy
+dWUsU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFU3BvdExpZ2h0RWxlbWVudDp0
+cnVlLFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50OnRydWUsU1ZHRmls
+dGVyRWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OnRydWUsU1ZHR0VsZW1lbnQ6dHJ1
+ZSxTVkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGljc0VsZW1lbnQ6dHJ1ZSxTVkdJbWFnZUVs
+ZW1lbnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xpbmVhckdyYWRpZW50RWxlbWVudDp0cnVl
+LFNWR01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVudDp0cnVlLFNWR01ldGFkYXRhRWxlbWVu
+dDp0cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVybkVsZW1lbnQ6dHJ1ZSxTVkdQb2x5Z29u
+RWxlbWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVlLFNWR1JhZGlhbEdyYWRpZW50RWxlbWVu
+dDp0cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxlbWVudDp0cnVlLFNWR1N0b3BFbGVtZW50
+OnRydWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxlbWVudDp0cnVlLFNWR1N3aXRjaEVsZW1l
+bnQ6dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNwYW5FbGVtZW50OnRydWUsU1ZHVGV4dENv
+bnRlbnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UGF0aEVsZW1lbnQ6dHJ1
+ZSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZHVGl0bGVFbGVtZW50OnRydWUsU1ZHVXNl
+RWxlbWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZHR3JhZGllbnRFbGVtZW50OnRydWUsU1ZH
+Q29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdGRURyb3BTaGFkb3dFbGVtZW50
+OnRydWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVudDpmYWxzZX0pCkguYjAuJG5hdGl2ZVN1
+cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJy
+YXlCdWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkgu
+RGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5XQi4kbmF0aXZlU3VwZXJj
+bGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1
+ZmZlclZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyJ9KSgpCmNv
+bnZlcnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFzdE9iamVjdCgkKTsoZnVuY3Rpb24oYSl7
+aWYodHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2EobnVsbCkKcmV0dXJufWlmKHR5cGVvZiBk
+b2N1bWVudC5jdXJyZW50U2NyaXB0IT0ndW5kZWZpbmVkJyl7YShkb2N1bWVudC5jdXJyZW50U2NyaXB0
+KQpyZXR1cm59dmFyIHQ9ZG9jdW1lbnQuc2NyaXB0cwpmdW5jdGlvbiBvbkxvYWQoYil7Zm9yKHZhciBy
+PTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQsZmFs
+c2UpCmEoYi50YXJnZXQpfWZvcih2YXIgcz0wO3M8dC5sZW5ndGg7KytzKXRbc10uYWRkRXZlbnRMaXN0
+ZW5lcigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9uKGEpe3YuY3VycmVudFNjcmlwdD1hCmlm
+KHR5cGVvZiBkYXJ0TWFpblJ1bm5lcj09PSJmdW5jdGlvbiIpZGFydE1haW5SdW5uZXIoTC5JcSxbXSkK
+ZWxzZSBMLklxKFtdKX0pfSkoKQovLyMgc291cmNlTWFwcGluZ1VSTD1taWdyYXRpb24uanMubWFwCg==
+''';
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_link.dart b/pkg/nnbd_migration/lib/src/front_end/unit_link.dart
similarity index 100%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/unit_link.dart
rename to pkg/nnbd_migration/lib/src/front_end/unit_link.dart
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart b/pkg/nnbd_migration/lib/src/front_end/unit_renderer.dart
similarity index 96%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart
rename to pkg/nnbd_migration/lib/src/front_end/unit_renderer.dart
index 080d2c1..8e96fca 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/unit_renderer.dart
@@ -4,11 +4,11 @@
 
 import 'dart:convert' show HtmlEscape, HtmlEscapeMode, LineSplitter;
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/web/file_details.dart';
 import 'package:meta/meta.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
+import 'package:nnbd_migration/src/front_end/web/file_details.dart';
 import 'package:path/path.dart' as path;
 
 /// Instrumentation display output for a library that was migrated to use
@@ -35,6 +35,7 @@
     NullabilityFixKind.addType,
     NullabilityFixKind.replaceVar,
     NullabilityFixKind.removeAs,
+    NullabilityFixKind.addLate,
     NullabilityFixKind.addLateDueToHint,
     NullabilityFixKind.checkExpressionDueToHint,
     NullabilityFixKind.makeTypeNullableDueToHint,
@@ -245,6 +246,8 @@
     var s = count == 1 ? '' : 's';
     var es = count == 1 ? '' : 'es';
     switch (kind) {
+      case NullabilityFixKind.addLate:
+        return '$count late keyword$s added';
       case NullabilityFixKind.addLateDueToHint:
         return '$count late hint$s converted to late keyword$s';
       case NullabilityFixKind.addRequired:
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/edit_details.dart b/pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart
similarity index 89%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/web/edit_details.dart
rename to pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart
index f74657f..1bbfecf 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/edit_details.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart
@@ -34,9 +34,9 @@
 
   EditDetails.fromJson(dynamic json)
       : edits = _decodeEdits(json['edits']),
-        explanation = json['explanation'],
-        line = json['line'],
-        path = json['path'],
+        explanation = json['explanation'] as String,
+        line = json['line'] as int,
+        path = json['path'] as String,
         traces = _decodeTraces(json['traces']);
 
   Map<String, Object> toJson() => {
@@ -69,8 +69,8 @@
   EditLink({@required this.description, @required this.href});
 
   EditLink.fromJson(dynamic json)
-      : description = json['description'],
-        href = json['href'];
+      : description = json['description'] as String,
+        href = json['href'] as String;
 
   Map<String, Object> toJson() => {
         'description': description,
@@ -95,9 +95,9 @@
   TargetLink({@required this.href, @required this.line, @required this.path});
 
   TargetLink.fromJson(dynamic json)
-      : href = json['href'],
-        line = json['line'],
-        path = json['path'];
+      : href = json['href'] as String,
+        line = json['line'] as int,
+        path = json['path'] as String;
 
   Map<String, Object> toJson() => {
         'href': href,
@@ -117,7 +117,7 @@
   Trace({@required this.description, @required this.entries});
 
   Trace.fromJson(dynamic json)
-      : description = json['description'],
+      : description = json['description'] as String,
         entries = [
           for (var entry in json['entries']) TraceEntry.fromJson(entry)
         ];
@@ -146,8 +146,8 @@
   TraceEntry({@required this.description, this.function, this.link});
 
   TraceEntry.fromJson(dynamic json)
-      : description = json['description'],
-        function = json['function'],
+      : description = json['description'] as String,
+        function = json['function'] as String,
         link = _decodeLink(json['link']);
 
   Map<String, Object> toJson() => {
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/file_details.dart b/pkg/nnbd_migration/lib/src/front_end/web/file_details.dart
similarity index 87%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/web/file_details.dart
rename to pkg/nnbd_migration/lib/src/front_end/web/file_details.dart
index cee2167..7b140cf 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/file_details.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/file_details.dart
@@ -19,9 +19,9 @@
       {@required this.line, @required this.explanation, @required this.offset});
 
   EditListItem.fromJson(dynamic json)
-      : line = json['line'],
-        explanation = json['explanation'],
-        offset = json['offset'];
+      : line = json['line'] as int,
+        explanation = json['explanation'] as String,
+        offset = json['offset'] as int;
 
   Map<String, Object> toJson() =>
       {'line': line, 'explanation': explanation, 'offset': offset};
@@ -65,11 +65,11 @@
         edits = const {};
 
   FileDetails.fromJson(dynamic json)
-      : regions = json['regions'],
-        navigationContent = json['navigationContent'],
-        sourceCode = json['sourceCode'],
+      : regions = json['regions'] as String,
+        navigationContent = json['navigationContent'] as String,
+        sourceCode = json['sourceCode'] as String,
         edits = {
-          for (var entry in json['edits'].entries)
+          for (var entry in (json['edits'] as Map<String, Object>).entries)
             entry.key: [
               for (var edit in entry.value) EditListItem.fromJson(edit)
             ]
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/highlight_js.dart b/pkg/nnbd_migration/lib/src/front_end/web/highlight_js.dart
similarity index 88%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/web/highlight_js.dart
rename to pkg/nnbd_migration/lib/src/front_end/web/highlight_js.dart
index 7e9901e..82e7daf 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/highlight_js.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/highlight_js.dart
@@ -9,7 +9,7 @@
 
 /// A small wrapper around the JavaScript highlight.js APIs.
 class HighlightJs {
-  static JsObject get _hljs => context['hljs'];
+  static JsObject get _hljs => context['hljs'] as JsObject;
 
   HighlightJs._();
 
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
similarity index 80%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
rename to pkg/nnbd_migration/lib/src/front_end/web/migration.dart
index 4423317..3447983 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
@@ -6,9 +6,9 @@
 import 'dart:convert';
 import 'dart:html';
 
-import 'package:analysis_server/src/edit/nnbd_migration/web/edit_details.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/web/file_details.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/web/navigation_tree.dart';
+import 'package:nnbd_migration/src/front_end/web/edit_details.dart';
+import 'package:nnbd_migration/src/front_end/web/file_details.dart';
+import 'package:nnbd_migration/src/front_end/web/navigation_tree.dart';
 import 'package:path/path.dart' as _p;
 
 import 'highlight_js.dart';
@@ -41,9 +41,7 @@
             ..remove('proposed')
             ..add('applied');
         }).catchError((e, st) {
-          logError('apply migration error: $e', st);
-
-          window.alert('Could not apply migration ($e).');
+          handleError('Could not apply migration', e, st);
         });
       }
     });
@@ -55,13 +53,20 @@
         await doPost('/rerun-migration');
         window.location.reload();
       } catch (e, st) {
-        logError('rerun migration: $e', st);
-
-        window.alert('Failed to rerun migration: $e.');
+        handleError('Failed to rerun migration', e, st);
       } finally {
         document.body.classes.remove('rerunning');
       }
     });
+
+    final reportProblemButton = document.querySelector('.report-problem');
+    reportProblemButton.onClick.listen((_) {
+      window.open('https://goo.gle/dart-null-safety-migration-tool-issue',
+          'report-problem');
+    });
+
+    document.querySelector('.popup-pane .close').onClick.listen(
+        (_) => document.querySelector('.popup-pane').style.display = 'none');
   });
 
   window.addEventListener('popstate', (event) {
@@ -145,9 +150,9 @@
     });
   }
 
-  List<Element> postLinks = parentElement.querySelectorAll('.post-link');
-  postLinks.forEach((link) {
-    link.onClick.listen(handlePostLinkClick);
+  List<Element> addHintLinks = parentElement.querySelectorAll('.add-hint-link');
+  addHintLinks.forEach((link) {
+    link.onClick.listen(handleAddHintLinkClick);
   });
 }
 
@@ -156,17 +161,58 @@
     HttpRequest.request(pathWithQueryParameters(path, queryParameters),
         requestHeaders: {'Content-Type': 'application/json; charset=UTF-8'});
 
-Future<HttpRequest> doPost(String path) => HttpRequest.request(
-      pathWithQueryParameters(path, {}),
-      method: 'POST',
-      requestHeaders: {'Content-Type': 'application/json; charset=UTF-8'},
-    ).then((HttpRequest xhr) {
-      if (xhr.status == 200) {
-        // Request OK.
-        return xhr;
-      } else {
-        throw 'Request failed; status of ${xhr.status}';
-      }
+Future<Map<String, Object>> doPost(String path) async {
+  var completer = new Completer<HttpRequest>();
+
+  var xhr = HttpRequest()
+    ..open('POST', pathWithQueryParameters(path, {}), async: true)
+    ..setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
+
+  xhr.onLoad.listen((e) {
+    completer.complete(xhr);
+  });
+
+  xhr.onError.listen(completer.completeError);
+
+  xhr.send();
+
+  await completer.future;
+
+  final json = jsonDecode(xhr.responseText);
+  if (xhr.status == 200) {
+    // Request OK.
+    return json as Map<String, Object>;
+  } else {
+    throw json;
+  }
+}
+
+Uri getGithubUri(String description, Object exception, Object stackTrace) =>
+    Uri.https('github.com', 'dart-lang/sdk/issues/new', {
+      'title': 'Issue with NNBD migration tool: $description',
+      'labels': 'area-analyzer,analyzer-nnbd-migration,type-bug',
+      'body': '''
+$description
+
+Error: $exception
+
+Please fill in the following:
+
+**Name of package being migrated (if public)**:
+**What I was doing when this issue occurred**:
+**Is it possible to work around this issue**:
+**Has this issue happened before, and if so, how often**:
+**Dart SDK version**: (visible in lower left of migration preview)
+**Additional details**:
+
+Thanks for filing!
+
+Stacktrace: _auto populated by migration preview tool._
+
+```
+$stackTrace
+```
+''',
     });
 
 int getLine(String location) {
@@ -179,12 +225,50 @@
   return str == null ? null : int.tryParse(str);
 }
 
+void handleAddHintLinkClick(MouseEvent event) async {
+  var path = (event.currentTarget as Element).getAttribute('href');
+
+  // Don't navigate on link click.
+  event.preventDefault();
+
+  try {
+    // Directing the server to produce an edit; request it, then do work with the
+    // response.
+    await doPost(path);
+    // TODO(mfairhurst): Only refresh the regions/dart code, not the window.
+    (document.window.location as Location).reload();
+  } catch (e, st) {
+    handleError('Could not add/remove hint', e, st);
+  }
+}
+
+void handleError(String header, Object exception, Object stackTrace) {
+  String subheader;
+  if (exception is Map<String, Object> &&
+      exception['success'] == false &&
+      exception.containsKey('exception') &&
+      exception.containsKey('stackTrace')) {
+    subheader = exception['exception'] as String;
+    stackTrace = exception['stackTrace'];
+  } else {
+    subheader = exception.toString();
+  }
+  final popupPane = document.querySelector('.popup-pane');
+  popupPane.querySelector('h2').innerText = header;
+  popupPane.querySelector('p').innerText = subheader;
+  popupPane.querySelector('pre').innerText = stackTrace.toString();
+  (popupPane.querySelector('a.bottom') as AnchorElement).href =
+      getGithubUri(header, subheader, stackTrace).toString();
+  popupPane..style.display = 'initial';
+  logError('handlePostLinkClick: $exception', stackTrace);
+}
+
 void handleNavLinkClick(
   MouseEvent event,
   bool clearEditDetails, {
   String relativeTo,
 }) {
-  Element target = event.currentTarget;
+  Element target = event.currentTarget as Element;
   event.preventDefault();
 
   var location = target.getAttribute('href');
@@ -211,25 +295,6 @@
   }
 }
 
-void handlePostLinkClick(MouseEvent event) async {
-  var path = (event.currentTarget as Element).getAttribute('href');
-
-  // Don't navigate on link click.
-  event.preventDefault();
-
-  try {
-    // Directing the server to produce an edit; request it, then do work with the
-    // response.
-    await doPost(path);
-    // TODO(mfairhurst): Only refresh the regions/dart code, not the window.
-    (document.window.location as Location).reload();
-  } catch (e, st) {
-    logError('handlePostLinkClick: $e', st);
-
-    window.alert('Could not load $path ($e).');
-  }
-}
-
 void highlightAllCode() {
   document.querySelectorAll('.code').forEach((Element block) {
     hljs.highlightBlock(block);
@@ -279,7 +344,8 @@
   // Navigating to another file; request it, then do work with the response.
   doGet(path, queryParameters: {'inline': 'true'}).then((HttpRequest xhr) {
     if (xhr.status == 200) {
-      Map<String, dynamic> response = jsonDecode(xhr.responseText);
+      Map<String, dynamic> response =
+          jsonDecode(xhr.responseText) as Map<String, dynamic>;
       writeCodeAndRegions(
           path, FileDetails.fromJson(response), clearEditDetails);
       maybeScrollToAndHighlight(offset, line);
@@ -424,9 +490,10 @@
   // Clear out any current edit details.
   editPanel.innerHtml = '';
   if (response == null) {
-    Element p = editPanel.append(ParagraphElement()
+    Element p = ParagraphElement()
       ..text = 'See details about a proposed edit.'
-      ..classes = ['placeholder']);
+      ..classes = ['placeholder'];
+    editPanel.append(p);
     p.scrollIntoView();
     return;
   }
@@ -438,7 +505,8 @@
   var explanationMessage = response.explanation;
   var relPath = _p.relative(filePath, from: rootPath);
   var line = response.line;
-  Element explanation = editPanel.append(document.createElement('p'));
+  Element explanation = document.createElement('p');
+  editPanel.append(explanation);
   explanation.append(Text('$explanationMessage at $relPath:$line.'));
   explanation.scrollIntoView();
   _populateEditTraces(response, editPanel, parentDirectory);
@@ -452,18 +520,23 @@
 
   var editCount = edits.length;
   if (editCount == 0) {
-    Element p = editListElement.append(document.createElement('p'));
+    Element p = document.createElement('p');
+    editListElement.append(p);
     p.append(Text('No proposed edits'));
   } else {
     for (var entry in edits.entries) {
-      Element p = editListElement.append(document.createElement('p'));
+      Element p = document.createElement('p');
+      editListElement.append(p);
       p.append(Text('${entry.key}:'));
 
-      Element list = editListElement.append(document.createElement('ul'));
+      Element list = document.createElement('ul');
+      editListElement.append(list);
       for (var edit in entry.value) {
-        Element item = list.append(document.createElement('li'));
+        Element item = document.createElement('li');
+        list.append(item);
         item.classes.add('edit');
-        AnchorElement anchor = item.append(document.createElement('a'));
+        AnchorElement anchor = AnchorElement();
+        item.append(anchor);
         anchor.classes.add('edit-link');
         var offset = edit.offset;
         anchor.dataset['offset'] = '$offset';
@@ -560,22 +633,27 @@
 
 void writeNavigationSubtree(
     Element parentElement, List<NavigationTreeNode> tree) {
-  Element ul = parentElement.append(document.createElement('ul'));
+  Element ul = document.createElement('ul');
+  parentElement.append(ul);
   for (var entity in tree) {
-    Element li = ul.append(document.createElement('li'));
+    Element li = document.createElement('li');
+    ul.append(li);
     if (entity.type == NavigationTreeNodeType.directory) {
       li.classes.add('dir');
-      Element arrow = li.append(document.createElement('span'));
+      Element arrow = document.createElement('span');
+      li.append(arrow);
       arrow.classes.add('arrow');
       arrow.innerHtml = '&#x25BC;';
-      Element icon = li.append(document.createElement('span'));
+      Element icon = document.createElement('span');
+      li.append(icon);
       icon.innerHtml = '&#x1F4C1;';
       li.append(Text(entity.name));
       writeNavigationSubtree(li, entity.subtree);
       addArrowClickHandler(arrow);
     } else {
       li.innerHtml = '&#x1F4C4;';
-      Element a = li.append(document.createElement('a'));
+      Element a = document.createElement('a');
+      li.append(a);
       a.classes.add('nav-link');
       a.dataset['name'] = entity.path;
       a.setAttribute('href', entity.href);
@@ -583,7 +661,8 @@
       a.onClick.listen((MouseEvent event) => handleNavLinkClick(event, true));
       var editCount = entity.editCount;
       if (editCount > 0) {
-        Element editsBadge = li.append(document.createElement('span'));
+        Element editsBadge = document.createElement('span');
+        li.append(editsBadge);
         editsBadge.classes.add('edit-count');
         editsBadge.setAttribute(
             'title', '$editCount ${pluralize(editCount, 'edit')}');
@@ -595,7 +674,7 @@
 
 AnchorElement _aElementForLink(TargetLink link, String parentDirectory) {
   var targetLine = link.line;
-  AnchorElement a = document.createElement('a');
+  AnchorElement a = AnchorElement();
   a.append(Text('${link.path}:$targetLine'));
 
   var relLink = link.href;
@@ -608,12 +687,14 @@
 
 void _populateEditLinks(EditDetails response, Element editPanel) {
   if (response.edits != null) {
-    Element editParagraph = editPanel.append(document.createElement('p'));
+    Element editParagraph = document.createElement('p');
+    editPanel.append(editParagraph);
     for (var edit in response.edits) {
-      Element a = editParagraph.append(document.createElement('a'));
+      Element a = document.createElement('a');
+      editParagraph.append(a);
       a.append(Text(edit.description));
       a.setAttribute('href', edit.href);
-      a.classes = ['post-link', 'before-apply'];
+      a.classes = ['add-hint-link', 'before-apply', 'button'];
     }
   }
 }
@@ -630,8 +711,8 @@
     var ul = traceParagraph
         .append(document.createElement('ul')..classes = ['trace']);
     for (var entry in trace.entries) {
-      Element li =
-          ul.append(document.createElement('li')..innerHtml = '&#x274F; ');
+      Element li = document.createElement('li')..innerHtml = '&#x274F; ';
+      ul.append(li);
       li.append(document.createElement('span')
         ..classes = ['function']
         ..appendTextWithBreaks(entry.function ?? 'unknown'));
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/navigation_tree.dart b/pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart
similarity index 93%
rename from pkg/analysis_server/lib/src/edit/nnbd_migration/web/navigation_tree.dart
rename to pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart
index 096574d..de29189 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/navigation_tree.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart
@@ -44,12 +44,12 @@
         subtree = null;
 
   NavigationTreeNode.fromJson(dynamic json)
-      : type = _decodeType(json['type']),
-        name = json['name'],
+      : type = _decodeType(json['type'] as String),
+        name = json['name'] as String,
         subtree = listFromJsonOrNull(json['subtree']),
-        path = json['path'],
-        href = json['href'],
-        editCount = json['editCount'];
+        path = json['path'] as String,
+        href = json['href'] as String,
+        editCount = json['editCount'] as int;
 
   Map<String, Object> toJson() => {
         'type': _encodeType(type),
diff --git a/pkg/nnbd_migration/lib/src/nullability_node.dart b/pkg/nnbd_migration/lib/src/nullability_node.dart
index 44175cb..75e9e9b 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node.dart
@@ -86,6 +86,9 @@
 
   final String description;
 
+  /// Whether this edge is the result of an uninitialized variable declaration.
+  final bool isUninit;
+
   NullabilityEdge.fromJson(
       dynamic json, NullabilityGraphDeserializer deserializer)
       : destinationNode = deserializer.nodeForId(json['dest'] as int),
@@ -93,7 +96,8 @@
         _kind = _deserializeKind(json['kind']),
         codeReference =
             json['code'] == null ? null : CodeReference.fromJson(json['code']),
-        description = json['description'] as String {
+        description = json['description'] as String,
+        isUninit = json['isUninit'] as bool {
     deserializer.defer(() {
       for (var id in json['us'] as List<dynamic>) {
         upstreamNodes.add(deserializer.nodeForId(id as int));
@@ -103,7 +107,7 @@
 
   NullabilityEdge._(
       this.destinationNode, this.upstreamNodes, this._kind, this.description,
-      {this.codeReference});
+      {this.codeReference, this.isUninit});
 
   @override
   Iterable<NullabilityNode> get guards => upstreamNodes.skip(1);
@@ -440,9 +444,12 @@
       NullabilityNode destinationNode,
       _NullabilityEdgeKind kind,
       EdgeOrigin origin) {
+    var isUninit = origin?.kind == EdgeOriginKind.fieldNotInitialized ||
+        origin?.kind == EdgeOriginKind.implicitNullInitializer ||
+        origin?.kind == EdgeOriginKind.uninitializedRead;
     var edge = NullabilityEdge._(
         destinationNode, upstreamNodes, kind, origin?.description,
-        codeReference: origin?.codeReference);
+        codeReference: origin?.codeReference, isUninit: isUninit);
     instrumentation?.graphEdge(edge, origin);
     for (var upstreamNode in upstreamNodes) {
       _connectDownstream(upstreamNode, edge);
@@ -666,6 +673,8 @@
 /// variables.  Over time this will be replaced by a first class representation
 /// of the nullability inference graph.
 abstract class NullabilityNode implements NullabilityNodeInfo {
+  bool _isLate = false;
+
   bool _isPossiblyOptional = false;
 
   /// List of [NullabilityEdge] objects describing this node's relationship to
@@ -767,6 +776,10 @@
   @visibleForTesting
   bool get isExactNullable;
 
+  /// Indicates whether this node is associated with a variable declaration
+  /// which should be annotated with "late".
+  bool get isLate => _isLate;
+
   /// After nullability propagation, this getter can be used to query whether
   /// the type associated with this node should be considered nullable.
   @override
@@ -1401,11 +1414,32 @@
             continue;
           }
         }
+        if (edge.isUninit) {
+          // This is an edge from always to an uninitialized variable
+          // declaration.
+
+          // Whether all downstream edges go to nodes with non-null intent.
+          var allDownstreamHaveNonNullIntent = false;
+          if (node.downstreamEdges.isNotEmpty) {
+            allDownstreamHaveNonNullIntent = node.downstreamEdges.every((e) {
+              var destination = e.destinationNode;
+              return destination is NullabilityNode &&
+                  destination.nonNullIntent.isPresent;
+            });
+          }
+          if (allDownstreamHaveNonNullIntent) {
+            if (!node.isNullable) {
+              node._isLate = true;
+            }
+            continue;
+          }
+        }
         if (node is NullabilityNodeMutable && !node.isNullable) {
           assert(step.targetNode == null);
           step.targetNode = node;
           step.newState = Nullability.ordinaryNullable;
           _setNullable(step);
+          node._isLate = false;
         }
       }
       if (_pendingSubstitutions.isEmpty) break;
diff --git a/pkg/analysis_server/lib/src/edit/preview/dart_file_page.dart b/pkg/nnbd_migration/lib/src/preview/dart_file_page.dart
similarity index 80%
rename from pkg/analysis_server/lib/src/edit/preview/dart_file_page.dart
rename to pkg/nnbd_migration/lib/src/preview/dart_file_page.dart
index 7f7da1f..12aff05 100644
--- a/pkg/analysis_server/lib/src/edit/preview/dart_file_page.dart
+++ b/pkg/nnbd_migration/lib/src/preview/dart_file_page.dart
@@ -4,10 +4,10 @@
 
 import 'dart:convert';
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/unit_renderer.dart';
-import 'package:analysis_server/src/edit/preview/preview_page.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/unit_renderer.dart';
+import 'package:nnbd_migration/src/preview/preview_page.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 
 /// The page that is displayed when a preview of a valid Dart file is requested.
 class DartFilePage extends PreviewPage {
diff --git a/pkg/analysis_server/lib/src/edit/preview/exception_page.dart b/pkg/nnbd_migration/lib/src/preview/exception_page.dart
similarity index 90%
rename from pkg/analysis_server/lib/src/edit/preview/exception_page.dart
rename to pkg/nnbd_migration/lib/src/preview/exception_page.dart
index bb18409..2d8abcc 100644
--- a/pkg/analysis_server/lib/src/edit/preview/exception_page.dart
+++ b/pkg/nnbd_migration/lib/src/preview/exception_page.dart
@@ -4,8 +4,8 @@
 
 import 'dart:convert';
 
-import 'package:analysis_server/src/edit/preview/preview_page.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/preview/preview_page.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 
 /// The page that is displayed when an exception is encountered in the process
 /// of composing the content of a different page.
diff --git a/pkg/analysis_server/lib/src/edit/preview/highlight_css_page.dart b/pkg/nnbd_migration/lib/src/preview/highlight_css_page.dart
similarity index 78%
rename from pkg/analysis_server/lib/src/edit/preview/highlight_css_page.dart
rename to pkg/nnbd_migration/lib/src/preview/highlight_css_page.dart
index 0104a69..7553358 100644
--- a/pkg/analysis_server/lib/src/edit/preview/highlight_css_page.dart
+++ b/pkg/nnbd_migration/lib/src/preview/highlight_css_page.dart
@@ -4,10 +4,10 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/edit/nnbd_migration/resources/resources.g.dart'
+import 'package:nnbd_migration/src/front_end/resources/resources.g.dart'
     as resources;
-import 'package:analysis_server/src/edit/preview/preview_page.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/preview/preview_page.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 
 /// The page that contains the CSS used to style the semantic highlighting
 /// within a Dart file.
diff --git a/pkg/analysis_server/lib/src/edit/preview/highlight_js_page.dart b/pkg/nnbd_migration/lib/src/preview/highlight_js_page.dart
similarity index 78%
rename from pkg/analysis_server/lib/src/edit/preview/highlight_js_page.dart
rename to pkg/nnbd_migration/lib/src/preview/highlight_js_page.dart
index 6fb15b0..177266c 100644
--- a/pkg/analysis_server/lib/src/edit/preview/highlight_js_page.dart
+++ b/pkg/nnbd_migration/lib/src/preview/highlight_js_page.dart
@@ -4,10 +4,10 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/edit/nnbd_migration/resources/resources.g.dart'
+import 'package:nnbd_migration/src/front_end/resources/resources.g.dart'
     as resources;
-import 'package:analysis_server/src/edit/preview/preview_page.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/preview/preview_page.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 
 /// The page that contains the JavaScript used to apply semantic highlighting
 /// styles to a Dart file.
diff --git a/pkg/analysis_server/lib/src/edit/preview/http_preview_server.dart b/pkg/nnbd_migration/lib/src/preview/http_preview_server.dart
similarity index 96%
rename from pkg/analysis_server/lib/src/edit/preview/http_preview_server.dart
rename to pkg/nnbd_migration/lib/src/preview/http_preview_server.dart
index ccdcde1..5c95f02 100644
--- a/pkg/analysis_server/lib/src/edit/preview/http_preview_server.dart
+++ b/pkg/nnbd_migration/lib/src/preview/http_preview_server.dart
@@ -5,8 +5,8 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_state.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/front_end/migration_state.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 
 /// Instances of the class [AbstractGetHandler] handle GET requests.
 abstract class AbstractGetHandler {
diff --git a/pkg/analysis_server/lib/src/edit/preview/index_file_page.dart b/pkg/nnbd_migration/lib/src/preview/index_file_page.dart
similarity index 80%
rename from pkg/analysis_server/lib/src/edit/preview/index_file_page.dart
rename to pkg/nnbd_migration/lib/src/preview/index_file_page.dart
index 7931445..b67d12c 100644
--- a/pkg/analysis_server/lib/src/edit/preview/index_file_page.dart
+++ b/pkg/nnbd_migration/lib/src/preview/index_file_page.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_renderer.dart';
-import 'package:analysis_server/src/edit/preview/preview_page.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/front_end/instrumentation_renderer.dart';
+import 'package:nnbd_migration/src/preview/preview_page.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 
 /// The page that is displayed when the root of the included path is requested.
 class IndexFilePage extends PreviewPage {
diff --git a/pkg/analysis_server/lib/src/edit/preview/navigation_tree_page.dart b/pkg/nnbd_migration/lib/src/preview/navigation_tree_page.dart
similarity index 76%
rename from pkg/analysis_server/lib/src/edit/preview/navigation_tree_page.dart
rename to pkg/nnbd_migration/lib/src/preview/navigation_tree_page.dart
index 415d6f6..5ee145f 100644
--- a/pkg/analysis_server/lib/src/edit/preview/navigation_tree_page.dart
+++ b/pkg/nnbd_migration/lib/src/preview/navigation_tree_page.dart
@@ -4,10 +4,10 @@
 
 import 'dart:convert';
 
-import 'package:analysis_server/src/edit/nnbd_migration/navigation_tree_renderer.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/web/navigation_tree.dart';
-import 'package:analysis_server/src/edit/preview/preview_page.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/front_end/navigation_tree_renderer.dart';
+import 'package:nnbd_migration/src/front_end/web/navigation_tree.dart';
+import 'package:nnbd_migration/src/preview/preview_page.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 
 /// The JSON that is displayed for the navigation tree.
 class NavigationTreePage extends PreviewPage {
diff --git a/pkg/analysis_server/lib/src/edit/preview/not_found_page.dart b/pkg/nnbd_migration/lib/src/preview/not_found_page.dart
similarity index 84%
rename from pkg/analysis_server/lib/src/edit/preview/not_found_page.dart
rename to pkg/nnbd_migration/lib/src/preview/not_found_page.dart
index 5865b5f..7eca477 100644
--- a/pkg/analysis_server/lib/src/edit/preview/not_found_page.dart
+++ b/pkg/nnbd_migration/lib/src/preview/not_found_page.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/preview/preview_page.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/preview/preview_page.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 
 /// The page that is displayed when an invalid URL is requested.
 class NotFoundPage extends PreviewPage {
diff --git a/pkg/analysis_server/lib/src/edit/preview/preview_page.dart b/pkg/nnbd_migration/lib/src/preview/preview_page.dart
similarity index 95%
rename from pkg/analysis_server/lib/src/edit/preview/preview_page.dart
rename to pkg/nnbd_migration/lib/src/preview/preview_page.dart
index b82a4ef..7cebe8c 100644
--- a/pkg/analysis_server/lib/src/edit/preview/preview_page.dart
+++ b/pkg/nnbd_migration/lib/src/preview/preview_page.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 import 'package:analysis_server/src/status/pages.dart';
 
 /// A page displayed on the preview site.
diff --git a/pkg/analysis_server/lib/src/edit/preview/preview_site.dart b/pkg/nnbd_migration/lib/src/preview/preview_site.dart
similarity index 86%
rename from pkg/analysis_server/lib/src/edit/preview/preview_site.dart
rename to pkg/nnbd_migration/lib/src/preview/preview_site.dart
index 96941ce..8d0b4f9 100644
--- a/pkg/analysis_server/lib/src/edit/preview/preview_site.dart
+++ b/pkg/nnbd_migration/lib/src/preview/preview_site.dart
@@ -8,22 +8,22 @@
 import 'dart:math';
 import 'dart:typed_data';
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/migration_state.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
-import 'package:analysis_server/src/edit/preview/dart_file_page.dart';
-import 'package:analysis_server/src/edit/preview/exception_page.dart';
-import 'package:analysis_server/src/edit/preview/highlight_css_page.dart';
-import 'package:analysis_server/src/edit/preview/highlight_js_page.dart';
-import 'package:analysis_server/src/edit/preview/http_preview_server.dart';
-import 'package:analysis_server/src/edit/preview/index_file_page.dart';
-import 'package:analysis_server/src/edit/preview/navigation_tree_page.dart';
-import 'package:analysis_server/src/edit/preview/not_found_page.dart';
-import 'package:analysis_server/src/edit/preview/preview_page.dart';
-import 'package:analysis_server/src/edit/preview/region_page.dart';
-import 'package:analysis_server/src/edit/preview/unauthorized_page.dart';
-import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analysis_server/src/status/pages.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/migration_state.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
+import 'package:nnbd_migration/src/preview/dart_file_page.dart';
+import 'package:nnbd_migration/src/preview/exception_page.dart';
+import 'package:nnbd_migration/src/preview/highlight_css_page.dart';
+import 'package:nnbd_migration/src/preview/highlight_js_page.dart';
+import 'package:nnbd_migration/src/preview/http_preview_server.dart';
+import 'package:nnbd_migration/src/preview/index_file_page.dart';
+import 'package:nnbd_migration/src/preview/navigation_tree_page.dart';
+import 'package:nnbd_migration/src/preview/not_found_page.dart';
+import 'package:nnbd_migration/src/preview/preview_page.dart';
+import 'package:nnbd_migration/src/preview/region_page.dart';
+import 'package:nnbd_migration/src/preview/unauthorized_page.dart';
 
 // The randomly generated auth token used to access the preview site.
 String _makeAuthToken() {
@@ -94,6 +94,15 @@
     return ExceptionPage(this, path, message, stackTrace);
   }
 
+  /// Return a page used to display an exception that occurred while attempting
+  /// to render another page. The [path] is the path to the page that was being
+  /// rendered when the exception was thrown. The [message] and [stackTrace] are
+  /// those from the exception.
+  Page createJsonExceptionResponse(
+      String path, String message, StackTrace stackTrace) {
+    return ExceptionPage(this, path, message, stackTrace);
+  }
+
   Page createUnauthorizedPage(String unauthorizedPath) {
     return UnauthorizedPage(this, unauthorizedPath.substring(1));
   }
@@ -310,6 +319,16 @@
   Future<void> _respondInternalError(HttpRequest request, String path,
       dynamic exception, StackTrace stackTrace) async {
     try {
+      if (request.headers.contentType.subType == 'json') {
+        return await respondJson(
+            request,
+            {
+              'success': false,
+              'exception': exception.toString(),
+              'stackTrace': stackTrace.toString(),
+            },
+            HttpStatus.internalServerError);
+      }
       await respond(
           request,
           createExceptionPageWithPath(path, '$exception', stackTrace),
diff --git a/pkg/analysis_server/lib/src/edit/preview/region_page.dart b/pkg/nnbd_migration/lib/src/preview/region_page.dart
similarity index 79%
rename from pkg/analysis_server/lib/src/edit/preview/region_page.dart
rename to pkg/nnbd_migration/lib/src/preview/region_page.dart
index 89b67f0..cb8dd99 100644
--- a/pkg/analysis_server/lib/src/edit/preview/region_page.dart
+++ b/pkg/nnbd_migration/lib/src/preview/region_page.dart
@@ -4,10 +4,10 @@
 
 import 'dart:convert' show jsonEncode;
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/region_renderer.dart';
-import 'package:analysis_server/src/edit/preview/preview_page.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/region_renderer.dart';
+import 'package:nnbd_migration/src/preview/preview_page.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 
 /// The HTML that is displayed for a region of code.
 class RegionPage extends PreviewPage {
diff --git a/pkg/analysis_server/lib/src/edit/preview/unauthorized_page.dart b/pkg/nnbd_migration/lib/src/preview/unauthorized_page.dart
similarity index 84%
rename from pkg/analysis_server/lib/src/edit/preview/unauthorized_page.dart
rename to pkg/nnbd_migration/lib/src/preview/unauthorized_page.dart
index e93f426..8fff1c5 100644
--- a/pkg/analysis_server/lib/src/edit/preview/unauthorized_page.dart
+++ b/pkg/nnbd_migration/lib/src/preview/unauthorized_page.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/preview/preview_page.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:nnbd_migration/src/preview/preview_page.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 
 /// The page that is displayed when a request could not be authenticated.
 class UnauthorizedPage extends PreviewPage {
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 615a4bb..0a186f4 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -1898,6 +1898,30 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_field_final_uninitalized_used() async {
+    var content = '''
+class C {
+  final String s;
+
+  f() {
+    g(s);
+  }
+}
+g(String /*!*/ s) {}
+''';
+    var expected = '''
+class C {
+  late final String s;
+
+  f() {
+    g(s);
+  }
+}
+g(String s) {}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_field_formal_param_typed() async {
     var content = '''
 class C {
@@ -2260,6 +2284,54 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_field_uninitalized_used() async {
+    var content = '''
+class C {
+  String s;
+
+  f() {
+    g(s);
+  }
+}
+g(String /*!*/ s) {}
+''';
+    var expected = '''
+class C {
+  late String s;
+
+  f() {
+    g(s);
+  }
+}
+g(String s) {}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_field_uninitalized_used_hint() async {
+    var content = '''
+class C {
+  String /*?*/ s;
+
+  f() {
+    g(s);
+  }
+}
+g(String /*!*/ s) {}
+''';
+    var expected = '''
+class C {
+  String? s;
+
+  f() {
+    g(s!);
+  }
+}
+g(String s) {}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_flow_analysis_complex() async {
     var content = '''
 int f(int x) {
@@ -3387,14 +3459,14 @@
 ''';
     var expected = '''
 int f() {
-  int? i;
+  late int i;
   g(int j) {
     i = 1;
   };
   ((int j) {
     i = 1;
   });
-  return i! + 1;
+  return i + 1;
 }
 ''';
     await _checkSingleFileChanges(content, expected);
@@ -3420,6 +3492,113 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_localVariable_uninitalized_assigned_non_nullable() async {
+    var content = '''
+f() {
+  String s;
+  if (1 == 2) s = g();
+  h(s);
+}
+String /*!*/ g() => "Hello";
+h(String /*!*/ s) {}
+''';
+    var expected = '''
+f() {
+  late String s;
+  if (1 == 2) s = g();
+  h(s);
+}
+String g() => "Hello";
+h(String s) {}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_localVariable_uninitalized_used() async {
+    var content = '''
+f() {
+  String s;
+  if (1 == 2) s = "Hello";
+  g(s);
+}
+g(String /*!*/ s) {}
+''';
+    var expected = '''
+f() {
+  late String s;
+  if (1 == 2) s = "Hello";
+  g(s);
+}
+g(String s) {}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_localVariable_uninitalized_usedInComparison() async {
+    var content = '''
+f() {
+  String s;
+  if (s == null) {}
+}
+''';
+    var expected = '''
+f() {
+  String? s;
+  if (s == null) {}
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void>
+      test_localVariable_uninitalized_usedInExpressionStatement() async {
+    var content = '''
+f() {
+  String s;
+  s;
+}
+''';
+    var expected = '''
+f() {
+  String? s;
+  s;
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_localVariable_uninitalized_usedInForUpdaters() async {
+    var content = '''
+f() {
+  String s;
+  for (s;;) {}
+}
+''';
+    var expected = '''
+f() {
+  String? s;
+  for (s;;) {}
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_localVariable_uninitalized_usedInForVariable() async {
+    var content = '''
+f() {
+  String s;
+  for (;; s) {}
+}
+''';
+    var expected = '''
+f() {
+  String? s;
+  for (;; s) {}
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_make_downcast_explicit() async {
     var content = 'int f(num n) => n;';
     var expected = 'int f(num n) => n as int;';
@@ -4845,6 +5024,24 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_topLevelVariable_uninitalized_used() async {
+    var content = '''
+String s;
+f() {
+  g(s);
+}
+g(String /*!*/ s) {}
+''';
+    var expected = '''
+late String s;
+f() {
+  g(s);
+}
+g(String s) {}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_two_files() async {
     var root = '/home/test/lib';
     var path1 = convertPath('$root/file1.dart');
diff --git a/pkg/nnbd_migration/test/front_end/analysis_abstract.dart b/pkg/nnbd_migration/test/front_end/analysis_abstract.dart
new file mode 100644
index 0000000..f4833cc
--- /dev/null
+++ b/pkg/nnbd_migration/test/front_end/analysis_abstract.dart
@@ -0,0 +1,217 @@
+// 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 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_constants.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart'
+    hide AnalysisOptions;
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
+import 'package:analysis_server/src/utilities/mocks.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:test/test.dart';
+
+import 'mocks.dart';
+
+/// An abstract base for all 'analysis' domain tests.
+class AbstractAnalysisTest with ResourceProviderMixin {
+  bool generateSummaryFiles = false;
+  MockServerChannel serverChannel;
+  TestPluginManager pluginManager;
+  AnalysisServer server;
+  RequestHandler handler;
+
+  final List<GeneralAnalysisService> generalServices =
+      <GeneralAnalysisService>[];
+  final Map<AnalysisService, List<String>> analysisSubscriptions = {};
+
+  String projectPath;
+  String testFolder;
+  String testFile;
+  String testCode;
+
+  AbstractAnalysisTest();
+
+  AnalysisDomainHandler get analysisHandler =>
+      server.handlers.singleWhere((handler) => handler is AnalysisDomainHandler)
+          as AnalysisDomainHandler;
+
+  AnalysisOptions get analysisOptions => testDiver.analysisOptions;
+
+  AnalysisDriver get testDiver => server.getAnalysisDriver(testFile);
+
+  void addAnalysisOptionsFile(String content) {
+    newFile(
+        resourceProvider.pathContext.join(projectPath, 'analysis_options.yaml'),
+        content: content);
+  }
+
+  void addAnalysisSubscription(AnalysisService service, String file) {
+    // add file to subscription
+    var files = analysisSubscriptions[service];
+    if (files == null) {
+      files = <String>[];
+      analysisSubscriptions[service] = files;
+    }
+    files.add(file);
+    // set subscriptions
+    var request =
+        AnalysisSetSubscriptionsParams(analysisSubscriptions).toRequest('0');
+    handleSuccessfulRequest(request);
+  }
+
+  void addGeneralAnalysisSubscription(GeneralAnalysisService service) {
+    generalServices.add(service);
+    var request =
+        AnalysisSetGeneralSubscriptionsParams(generalServices).toRequest('0');
+    handleSuccessfulRequest(request);
+  }
+
+  String addTestFile(String content) {
+    newFile(testFile, content: content);
+    testCode = content;
+    return testFile;
+  }
+
+  /// Create an analysis options file based on the given arguments.
+  void createAnalysisOptionsFile({List<String> experiments}) {
+    var buffer = StringBuffer();
+    if (experiments != null) {
+      buffer.writeln('analyzer:');
+      buffer.writeln('  enable-experiment:');
+      for (var experiment in experiments) {
+        buffer.writeln('    - $experiment');
+      }
+    }
+    addAnalysisOptionsFile(buffer.toString());
+  }
+
+  AnalysisServer createAnalysisServer() {
+    //
+    // Create an SDK in the mock file system.
+    //
+    MockSdk(
+        generateSummaryFiles: generateSummaryFiles,
+        resourceProvider: resourceProvider);
+    //
+    // Create server
+    //
+    var options = AnalysisServerOptions();
+    return AnalysisServer(
+        serverChannel,
+        resourceProvider,
+        options,
+        DartSdkManager(resourceProvider.convertPath('/sdk'), true),
+        CrashReportingAttachmentsBuilder.empty,
+        InstrumentationService.NULL_SERVICE);
+  }
+
+  /// Creates a project [projectPath].
+  void createProject({Map<String, String> packageRoots}) {
+    newFolder(projectPath);
+    var request = AnalysisSetAnalysisRootsParams([projectPath], [],
+            packageRoots: packageRoots)
+        .toRequest('0');
+    handleSuccessfulRequest(request, handler: analysisHandler);
+  }
+
+  void doAllDeclarationsTrackerWork() {
+    while (server.declarationsTracker.hasWork) {
+      server.declarationsTracker.doWork();
+    }
+  }
+
+  /// Returns the offset of [search] in the file at the given [path].
+  /// Fails if not found.
+  int findFileOffset(String path, String search) {
+    var file = getFile(path);
+    var code = file.createSource().contents.data;
+    var offset = code.indexOf(search);
+    expect(offset, isNot(-1), reason: '"$search" in\n$code');
+    return offset;
+  }
+
+  /// Returns the offset of [search] in [testCode].
+  /// Fails if not found.
+  int findOffset(String search) {
+    var offset = testCode.indexOf(search);
+    expect(offset, isNot(-1));
+    return offset;
+  }
+
+  /// Validates that the given [request] is handled successfully.
+  Response handleSuccessfulRequest(Request request, {RequestHandler handler}) {
+    handler ??= this.handler;
+    var response = handler.handleRequest(request);
+    expect(response, isResponseSuccess(request.id));
+    return response;
+  }
+
+  String modifyTestFile(String content) {
+    modifyFile(testFile, content);
+    testCode = content;
+    return testFile;
+  }
+
+  void processNotification(Notification notification) {
+    if (notification.event == SERVER_NOTIFICATION_ERROR) {
+      fail('${notification.toJson()}');
+    }
+  }
+
+  void removeGeneralAnalysisSubscription(GeneralAnalysisService service) {
+    generalServices.remove(service);
+    var request =
+        AnalysisSetGeneralSubscriptionsParams(generalServices).toRequest('0');
+    handleSuccessfulRequest(request);
+  }
+
+  void setPriorityFiles(List<String> files) {
+    var request = AnalysisSetPriorityFilesParams(files).toRequest('0');
+    handleSuccessfulRequest(request);
+  }
+
+  void setUp() {
+    serverChannel = MockServerChannel();
+    projectPath = convertPath('/project');
+    testFolder = convertPath('/project/bin');
+    testFile = convertPath('/project/bin/test.dart');
+    pluginManager = TestPluginManager();
+    server = createAnalysisServer();
+    server.pluginManager = pluginManager;
+    handler = analysisHandler;
+    // listen for notifications
+    var notificationStream = serverChannel.notificationController.stream;
+    notificationStream.listen((Notification notification) {
+      processNotification(notification);
+    });
+  }
+
+  void tearDown() {
+    server.done();
+    handler = null;
+    server = null;
+    serverChannel = null;
+  }
+
+  /// Returns a [Future] that completes when the server's analysis is complete.
+  Future waitForTasksFinished() {
+    return server.onAnalysisComplete;
+  }
+
+  /// Completes with a successful [Response] for the given [request].
+  /// Otherwise fails.
+  Future<Response> waitResponse(Request request,
+      {bool throwOnError = true}) async {
+    return serverChannel.sendRequest(request, throwOnError: throwOnError);
+  }
+}
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart b/pkg/nnbd_migration/test/front_end/info_builder_test.dart
similarity index 93%
rename from pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
rename to pkg/nnbd_migration/test/front_end/info_builder_test.dart
index 0dc0d54..cba5d32 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
+++ b/pkg/nnbd_migration/test/front_end/info_builder_test.dart
@@ -2,16 +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.
 
-import 'package:analysis_server/src/edit/nnbd_migration/info_builder.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:meta/meta.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
+import 'package:nnbd_migration/src/front_end/info_builder.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../analysis_abstract.dart';
+import 'analysis_abstract.dart';
 import 'nnbd_migration_test_base.dart';
 
 void main() {
@@ -39,7 +39,8 @@
 }
 ''');
     var result = await resolveTestFile();
-    ClassDeclaration class_ = result.unit.declarations.single;
+    ClassDeclaration class_ =
+        result.unit.declarations.single as ClassDeclaration;
     var constructor = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(constructor),
         equals("the constructor 'C.aaa'"));
@@ -52,7 +53,8 @@
 }
 ''');
     var result = await resolveTestFile();
-    ClassDeclaration class_ = result.unit.declarations.single;
+    ClassDeclaration class_ =
+        result.unit.declarations.single as ClassDeclaration;
     var constructor = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(constructor),
         equals("the default constructor of 'C'"));
@@ -65,8 +67,10 @@
 }
 ''');
     var result = await resolveTestFile();
-    ClassDeclaration class_ = result.unit.declarations.single;
-    FieldDeclaration fieldDeclaration = class_.members.single;
+    ClassDeclaration class_ =
+        result.unit.declarations.single as ClassDeclaration;
+    FieldDeclaration fieldDeclaration =
+        class_.members.single as FieldDeclaration;
     var field = fieldDeclaration.fields.variables[0];
     expect(InfoBuilder.buildEnclosingMemberDescription(field),
         equals("the field 'C.i'"));
@@ -79,8 +83,10 @@
 }
 ''');
     var result = await resolveTestFile();
-    ClassDeclaration class_ = result.unit.declarations.single;
-    FieldDeclaration fieldDeclaration = class_.members.single;
+    ClassDeclaration class_ =
+        result.unit.declarations.single as ClassDeclaration;
+    FieldDeclaration fieldDeclaration =
+        class_.members.single as FieldDeclaration;
     var type = fieldDeclaration.fields.type;
     expect(InfoBuilder.buildEnclosingMemberDescription(type),
         equals("the field 'C.i'"));
@@ -93,7 +99,8 @@
 }
 ''');
     var result = await resolveTestFile();
-    ClassDeclaration class_ = result.unit.declarations.single;
+    ClassDeclaration class_ =
+        result.unit.declarations.single as ClassDeclaration;
     var getter = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(getter),
         equals("the getter 'C.aaa'"));
@@ -106,7 +113,8 @@
 }
 ''');
     var result = await resolveTestFile();
-    ClassDeclaration class_ = result.unit.declarations.single;
+    ClassDeclaration class_ =
+        result.unit.declarations.single as ClassDeclaration;
     var method = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(method),
         equals("the method 'C.aaa'"));
@@ -119,7 +127,8 @@
 }
 ''');
     var result = await resolveTestFile();
-    ClassDeclaration class_ = result.unit.declarations.single;
+    ClassDeclaration class_ =
+        result.unit.declarations.single as ClassDeclaration;
     var operator = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(operator),
         equals("the operator 'C.=='"));
@@ -132,7 +141,8 @@
 }
 ''');
     var result = await resolveTestFile();
-    ClassDeclaration class_ = result.unit.declarations.single;
+    ClassDeclaration class_ =
+        result.unit.declarations.single as ClassDeclaration;
     var setter = class_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(setter),
         equals("the setter 'C.aaa='"));
@@ -145,7 +155,8 @@
 }
 ''');
     var result = await resolveTestFile();
-    ExtensionDeclaration extension_ = result.unit.declarations.single;
+    ExtensionDeclaration extension_ =
+        result.unit.declarations.single as ExtensionDeclaration;
     var method = extension_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(method),
         equals("the method 'E.aaa'"));
@@ -158,7 +169,8 @@
 }
 ''');
     var result = await resolveTestFile();
-    ExtensionDeclaration extension_ = result.unit.declarations.single;
+    ExtensionDeclaration extension_ =
+        result.unit.declarations.single as ExtensionDeclaration;
     var method = extension_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(method),
         equals("the method 'aaa' in unnamed extension on List<dynamic>"));
@@ -171,7 +183,8 @@
 }
 ''');
     var result = await resolveTestFile();
-    MixinDeclaration mixin_ = result.unit.declarations.single;
+    MixinDeclaration mixin_ =
+        result.unit.declarations.single as MixinDeclaration;
     var method = mixin_.members.single;
     expect(InfoBuilder.buildEnclosingMemberDescription(method),
         equals("the method 'C.aaa'"));
@@ -213,7 +226,7 @@
 ''');
     var result = await resolveTestFile();
     TopLevelVariableDeclaration topLevelVariableDeclaration =
-        result.unit.declarations.single;
+        result.unit.declarations.single as TopLevelVariableDeclaration;
     var variable = topLevelVariableDeclaration.variables.variables[0];
     expect(InfoBuilder.buildEnclosingMemberDescription(variable),
         equals("the variable 'i'"));
@@ -225,7 +238,7 @@
 ''');
     var result = await resolveTestFile();
     TopLevelVariableDeclaration topLevelVariableDeclaration =
-        result.unit.declarations.single;
+        result.unit.declarations.single as TopLevelVariableDeclaration;
     var type = topLevelVariableDeclaration.variables.type;
     expect(InfoBuilder.buildEnclosingMemberDescription(type),
         equals("the variable 'i'"));
@@ -258,6 +271,36 @@
         .toList();
   }
 
+  Future<void> test_addLate() async {
+    var content = '''
+f() {
+  String s;
+  if (1 == 2) s = "Hello";
+  g(s);
+}
+g(String /*!*/ s) {}
+''';
+    var migratedContent = '''
+f() {
+  late String  s;
+  if (1 == 2) s = "Hello";
+  g(s);
+}
+g(String /*!*/ s) {}
+''';
+    var unit = await buildInfoForSingleTestFile(content,
+        migratedContent: migratedContent);
+    var regions = unit.fixRegions;
+    expect(regions, hasLength(2));
+    var region = regions[0];
+    assertRegion(
+        region: region,
+        offset: 8,
+        length: 4,
+        explanation: 'Added a late keyword',
+        kind: NullabilityFixKind.addLate);
+  }
+
   Future<void> test_addLate_dueToHint() async {
     var content = '/*late*/ int x = 0;';
     var migratedContent = '/*late*/ int  x = 0;';
@@ -273,7 +316,7 @@
         length2: 2,
         explanation: 'Added a late keyword, due to a hint',
         kind: NullabilityFixKind.addLateDueToHint,
-        edits: (edits) => assertEdit(
+        edits: (List<EditDetail> edits) => assertEdit(
             edit: edits.single,
             offset: content.indexOf(textToRemove),
             length: textToRemove.length,
@@ -687,7 +730,7 @@
         explanation: 'Accepted a null check hint',
         kind: NullabilityFixKind.checkExpressionDueToHint,
         traces: isNotEmpty,
-        edits: ((edits) => assertEdit(
+        edits: ((List<EditDetail> edits) => assertEdit(
             edit: edits.single,
             offset: content.indexOf(hintText),
             length: hintText.length,
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/instrumentation_renderer_test.dart b/pkg/nnbd_migration/test/front_end/instrumentation_renderer_test.dart
similarity index 90%
rename from pkg/analysis_server/test/src/edit/nnbd_migration/instrumentation_renderer_test.dart
rename to pkg/nnbd_migration/test/front_end/instrumentation_renderer_test.dart
index 12190ab..5c456f8 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/instrumentation_renderer_test.dart
+++ b/pkg/nnbd_migration/test/front_end/instrumentation_renderer_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_renderer.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
+import 'package:nnbd_migration/src/front_end/instrumentation_renderer.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/migration_info_test.dart b/pkg/nnbd_migration/test/front_end/migration_info_test.dart
similarity index 95%
rename from pkg/analysis_server/test/src/edit/nnbd_migration/migration_info_test.dart
rename to pkg/nnbd_migration/test/front_end/migration_info_test.dart
index 1e17f2d..dcc1abb 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/migration_info_test.dart
+++ b/pkg/nnbd_migration/test/front_end/migration_info_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/nnbd_migration/test/front_end/mocks.dart b/pkg/nnbd_migration/test/front_end/mocks.dart
new file mode 100644
index 0000000..839623c
--- /dev/null
+++ b/pkg/nnbd_migration/test/front_end/mocks.dart
@@ -0,0 +1,46 @@
+// 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 'package:analysis_server/protocol/protocol.dart';
+import 'package:test/test.dart';
+
+/// A [Matcher] that check that the given [Response] has an expected identifier
+/// and no error.
+Matcher isResponseSuccess(String id) => _IsResponseSuccess(id);
+
+/// A [Matcher] that check that there are no `error` in a given [Response].
+class _IsResponseSuccess extends Matcher {
+  final String _id;
+
+  _IsResponseSuccess(this._id);
+
+  @override
+  Description describe(Description description) {
+    return description
+        .addDescriptionOf('response with identifier "$_id" and without error');
+  }
+
+  @override
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    Response response = item as Response;
+    if (response == null) {
+      mismatchDescription.add('is null response');
+    } else {
+      var id = response.id;
+      var error = response.error;
+      mismatchDescription.add('has identifier "$id"');
+      if (error != null) {
+        mismatchDescription.add(' and has error $error');
+      }
+    }
+    return mismatchDescription;
+  }
+
+  @override
+  bool matches(item, Map matchState) {
+    Response response = item as Response;
+    return response != null && response.id == _id && response.error == null;
+  }
+}
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/navigation_tree_renderer_test.dart b/pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart
similarity index 95%
rename from pkg/analysis_server/test/src/edit/nnbd_migration/navigation_tree_renderer_test.dart
rename to pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart
index 6a8451f..b8b6231 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/navigation_tree_renderer_test.dart
+++ b/pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/navigation_tree_renderer.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/web/navigation_tree.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/navigation_tree_renderer.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
+import 'package:nnbd_migration/src/front_end/web/navigation_tree.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart b/pkg/nnbd_migration/test/front_end/nnbd_migration_test_base.dart
similarity index 93%
rename from pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart
rename to pkg/nnbd_migration/test/front_end/nnbd_migration_test_base.dart
index 6591ced..559cf15 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart
+++ b/pkg/nnbd_migration/test/front_end/nnbd_migration_test_base.dart
@@ -4,18 +4,18 @@
 
 import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
 import 'package:analysis_server/src/edit/fix/non_nullable_fix.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/info_builder.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_listener.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/offset_mapper.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:meta/meta.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
+import 'package:nnbd_migration/src/front_end/info_builder.dart';
+import 'package:nnbd_migration/src/front_end/instrumentation_listener.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/offset_mapper.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../analysis_abstract.dart';
+import 'analysis_abstract.dart';
 
 @reflectiveTest
 class NnbdMigrationTestBase extends AbstractAnalysisTest {
@@ -193,8 +193,8 @@
     migration.finish();
     // Build the migration info.
     var info = instrumentationListener.data;
-    var builder = InfoBuilder(
-        resourceProvider, includedRoot, info, listener, adapter, migration);
+    var builder =
+        InfoBuilder(resourceProvider, includedRoot, info, listener, migration);
     infos = await builder.explainMigration();
   }
 }
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/offset_mapper_test.dart b/pkg/nnbd_migration/test/front_end/offset_mapper_test.dart
similarity index 96%
rename from pkg/analysis_server/test/src/edit/nnbd_migration/offset_mapper_test.dart
rename to pkg/nnbd_migration/test/front_end/offset_mapper_test.dart
index b873c31..7bacfd2 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/offset_mapper_test.dart
+++ b/pkg/nnbd_migration/test/front_end/offset_mapper_test.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/nnbd_migration/offset_mapper.dart';
 import 'package:analysis_server/src/protocol_server.dart';
+import 'package:nnbd_migration/src/front_end/offset_mapper.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../analysis_abstract.dart';
+import 'analysis_abstract.dart';
 
 void main() {
   defineReflectiveSuite(() {
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart b/pkg/nnbd_migration/test/front_end/region_renderer_test.dart
similarity index 87%
rename from pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart
rename to pkg/nnbd_migration/test/front_end/region_renderer_test.dart
index 7f88d2b..db9bcfe 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart
+++ b/pkg/nnbd_migration/test/front_end/region_renderer_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/region_renderer.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/web/edit_details.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
+import 'package:nnbd_migration/src/front_end/region_renderer.dart';
+import 'package:nnbd_migration/src/front_end/web/edit_details.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/test_all.dart b/pkg/nnbd_migration/test/front_end/test_all.dart
similarity index 88%
rename from pkg/analysis_server/test/src/edit/nnbd_migration/test_all.dart
rename to pkg/nnbd_migration/test/front_end/test_all.dart
index 6ac9f59..9a81148 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/test_all.dart
+++ b/pkg/nnbd_migration/test/front_end/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -12,7 +12,7 @@
 import 'region_renderer_test.dart' as region_renderer;
 import 'unit_renderer_test.dart' as unit_renderer;
 
-void main() {
+main() {
   defineReflectiveSuite(() {
     info_builder.main();
     instrumentation_renderer.main();
@@ -21,5 +21,5 @@
     offset_mapper.main();
     region_renderer.main();
     unit_renderer.main();
-  }, name: 'nnbd_migration');
+  }, name: 'front_end');
 }
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart b/pkg/nnbd_migration/test/front_end/unit_renderer_test.dart
similarity index 97%
rename from pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart
rename to pkg/nnbd_migration/test/front_end/unit_renderer_test.dart
index 0e7bd9a..3a932af 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart
+++ b/pkg/nnbd_migration/test/front_end/unit_renderer_test.dart
@@ -2,11 +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:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/unit_renderer.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/web/file_details.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
+import 'package:nnbd_migration/src/front_end/unit_renderer.dart';
+import 'package:nnbd_migration/src/front_end/web/file_details.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/src/edit/preview/preview_site_test.dart b/pkg/nnbd_migration/test/preview/preview_site_test.dart
similarity index 93%
rename from pkg/analysis_server/test/src/edit/preview/preview_site_test.dart
rename to pkg/nnbd_migration/test/preview/preview_site_test.dart
index fd1d4b0..cfce5a6 100644
--- a/pkg/analysis_server/test/src/edit/preview/preview_site_test.dart
+++ b/pkg/nnbd_migration/test/preview/preview_site_test.dart
@@ -3,19 +3,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/migration_state.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/offset_mapper.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
-import 'package:analysis_server/src/edit/preview/preview_site.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide NavigationTarget;
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
+import 'package:nnbd_migration/src/front_end/migration_state.dart';
+import 'package:nnbd_migration/src/front_end/offset_mapper.dart';
+import 'package:nnbd_migration/src/front_end/path_mapper.dart';
+import 'package:nnbd_migration/src/preview/preview_site.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../nnbd_migration/nnbd_migration_test_base.dart';
+import '../front_end/nnbd_migration_test_base.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -39,7 +39,7 @@
     dartfixListener = DartFixListener(null);
     resourceProvider = MemoryResourceProvider();
     final migrationInfo = MigrationInfo({}, {}, null, null);
-    state = MigrationState(null, null, dartfixListener, null, null);
+    state = MigrationState(null, null, dartfixListener, null);
     state.pathMapper = PathMapper(resourceProvider);
     state.migrationInfo = migrationInfo;
     site = PreviewSite(state, ([paths]) async {
@@ -200,7 +200,7 @@
     reranPaths = null;
     dartfixListener = DartFixListener(null);
     final migrationInfo = MigrationInfo({}, {}, null, null);
-    state = MigrationState(null, null, dartfixListener, null, null);
+    state = MigrationState(null, null, dartfixListener, null);
     state.pathMapper = PathMapper(resourceProvider);
     state.migrationInfo = migrationInfo;
     site = PreviewSite(state, ([paths]) async {
diff --git a/pkg/analysis_server/test/src/edit/preview/test_all.dart b/pkg/nnbd_migration/test/preview/test_all.dart
similarity index 100%
rename from pkg/analysis_server/test/src/edit/preview/test_all.dart
rename to pkg/nnbd_migration/test/preview/test_all.dart
diff --git a/pkg/nnbd_migration/test/test_all.dart b/pkg/nnbd_migration/test/test_all.dart
index b7902da..291ba60 100644
--- a/pkg/nnbd_migration/test/test_all.dart
+++ b/pkg/nnbd_migration/test/test_all.dart
@@ -19,10 +19,12 @@
 import 'fix_aggregator_test.dart' as fix_aggregator_test;
 import 'fix_builder_test.dart' as fix_builder_test;
 import 'fix_reason_target_test.dart' as fix_reason_target_test;
+import 'front_end/test_all.dart' as front_end;
 import 'instrumentation_test.dart' as instrumentation_test;
 import 'isolate_server_test.dart' as isolate_server_test;
 import 'node_builder_test.dart' as node_builder_test;
 import 'nullability_node_test.dart' as nullability_node_test;
+import 'preview/test_all.dart' as preview;
 import 'utilities/test_all.dart' as utilities;
 import 'variables_test.dart' as variables;
 
@@ -40,10 +42,12 @@
     fix_aggregator_test.main();
     fix_builder_test.main();
     fix_reason_target_test.main();
+    front_end.main();
     instrumentation_test.main();
     isolate_server_test.main();
     node_builder_test.main();
     nullability_node_test.main();
+    preview.main();
     utilities.main();
     variables.main();
   });
diff --git a/pkg/analysis_server/tool/nnbd_migration/check_generated_test.dart b/pkg/nnbd_migration/tool/codegen/check_generated_test.dart
similarity index 86%
rename from pkg/analysis_server/tool/nnbd_migration/check_generated_test.dart
rename to pkg/nnbd_migration/tool/codegen/check_generated_test.dart
index 8c0f118..9a251ab 100644
--- a/pkg/analysis_server/tool/nnbd_migration/check_generated_test.dart
+++ b/pkg/nnbd_migration/tool/codegen/check_generated_test.dart
@@ -7,7 +7,7 @@
 import 'generate_resources.dart' as generate_resources;
 
 /// Validate that the
-/// pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
+/// pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
 /// file was regenerated after changing upstream dependencies.
 void main() async {
   test('description', () {
diff --git a/pkg/analysis_server/tool/nnbd_migration/generate_resources.dart b/pkg/nnbd_migration/tool/codegen/generate_resources.dart
similarity index 85%
rename from pkg/analysis_server/tool/nnbd_migration/generate_resources.dart
rename to pkg/nnbd_migration/tool/codegen/generate_resources.dart
index cdc22c5..21ed8fb 100644
--- a/pkg/analysis_server/tool/nnbd_migration/generate_resources.dart
+++ b/pkg/nnbd_migration/tool/codegen/generate_resources.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This script generates the
-// lib/src/edit/nnbd_migration/resources/resources.g.dart file from the contents
-// of the lib/src/edit/nnbd_migration/resources directory.
+// lib/src/front_end/resources/resources.g.dart file from the contents
+// of the lib/src/front_end/resources directory.
 
 import 'dart:convert';
 import 'dart:io';
@@ -22,7 +22,7 @@
   var argResults = argParser.parse(args);
   if (argResults['help'] == true) {
     fail('''
-usage: dart pkg/analysis_server/tool/nnbd_migration/generate_resources.dart [--verify]
+usage: dart pkg/nnbd_migration/tool/codegen/generate_resources.dart [--verify]
 
 Run with no args to generate web resources for the NNBD migration preview tool.
 Run with '--verify' to validate that the web resource have been regenerated.
@@ -30,16 +30,16 @@
   }
 
   if (FileSystemEntity.isFileSync(
-      path.join('tool', 'nnbd_migration', 'generate_resources.dart'))) {
+      path.join('tool', 'codegen', 'generate_resources.dart'))) {
     // We're running from the project root - cd up two directories.
     Directory.current = Directory.current.parent.parent;
   } else if (!FileSystemEntity.isDirectorySync(
-      path.join('pkg', 'analysis_server'))) {
+      path.join('pkg', 'nnbd_migration'))) {
     fail('Please run this tool from the root of the sdk repo.');
   }
 
-  bool verify = argResults['verify'];
-  bool dev = argResults['dev'];
+  bool verify = argResults['verify'] as bool;
+  bool dev = argResults['dev'] as bool;
 
   if (verify) {
     verifyResourcesGDartGenerated();
@@ -52,17 +52,17 @@
   }
 }
 
-final File dartSources = File(path.join('pkg', 'analysis_server', 'lib', 'src',
-    'edit', 'nnbd_migration', 'web', 'migration.dart'));
+final File dartSources = File(path.join('pkg', 'nnbd_migration', 'lib', 'src',
+    'front_end', 'web', 'migration.dart'));
 
-final javascriptOutput = File(path.join('pkg', 'analysis_server', 'lib', 'src',
-    'edit', 'nnbd_migration', 'resources', 'migration.js'));
+final javascriptOutput = File(path.join('pkg', 'nnbd_migration', 'lib', 'src',
+    'front_end', 'resources', 'migration.js'));
 
-final Directory resourceDir = Directory(path.join('pkg', 'analysis_server',
-    'lib', 'src', 'edit', 'nnbd_migration', 'resources'));
+final Directory resourceDir = Directory(
+    path.join('pkg', 'nnbd_migration', 'lib', 'src', 'front_end', 'resources'));
 
-final File resourcesFile = File(path.join('pkg', 'analysis_server', 'lib',
-    'src', 'edit', 'nnbd_migration', 'resources', 'resources.g.dart'));
+final File resourcesFile = File(path.join('pkg', 'nnbd_migration', 'lib', 'src',
+    'front_end', 'resources', 'resources.g.dart'));
 
 final List<String> resourceTypes = [
   '.css',
@@ -129,9 +129,9 @@
   stderr.writeln('$message.');
   stderr.writeln();
   stderr.writeln('''
-To re-generate lib/src/edit/nnbd_migration/resources/resources.g.dart, run:
+To re-generate lib/src/front_end/resources/resources.g.dart, run:
 
-  dart pkg/analysis_server/tool/nnbd_migration/generate_resources.dart
+  dart pkg/nnbd_migration/tool/codegen/generate_resources.dart
 ''');
   exit(1);
 }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 99a1b6a..b49a9be 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -83,6 +83,7 @@
 modular_test/test/validate_pipeline_test: Slow, Pass
 modular_test/test/validate_suite_test: Slow, Pass
 nnbd_migration/test/*: SkipByDesign # Uses mirrors
+nnbd_migration/tool/*: SkipByDesign # Only meant to run on vm
 smith/test/*: SkipByDesign # Only meant to run on vm
 status_file/test/normalize_test: SkipByDesign # Uses dart:io
 status_file/test/parse_and_normalize_test: SkipByDesign # Uses dart:io
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index f57b8ed..fe588a6 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -1092,6 +1092,8 @@
 
     var dillFile = tempKernelFile(tempDir);
 
+    var isProductMode = _configuration.configuration.mode == Mode.product;
+
     var causalAsyncStacks = !arguments.any(noCausalAsyncStacksRegExp.hasMatch);
 
     var args = [
@@ -1104,6 +1106,7 @@
           name.startsWith('-D') ||
           name.startsWith('--packages=') ||
           name.startsWith('--enable-experiment=')),
+      '-Ddart.vm.product=$isProductMode',
       '-Ddart.developer.causal_async_stacks=$causalAsyncStacks',
       if (_enableAsserts ||
           arguments.contains('--enable-asserts') ||
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 050407d..99638ad 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -691,6 +691,7 @@
           prepend = ", ";
           if (sb.length > 256) break;
         }
+        sb.write("]");
         partToString = sb.toString();
       } else {
         partToString = part.toString();
diff --git a/pkg/vm/lib/bytecode/declarations.dart b/pkg/vm/lib/bytecode/declarations.dart
index 273e443..c30f096 100644
--- a/pkg/vm/lib/bytecode/declarations.dart
+++ b/pkg/vm/lib/bytecode/declarations.dart
@@ -781,6 +781,7 @@
   static const isCovariantFlag = 1 << 0;
   static const isGenericCovariantImplFlag = 1 << 1;
   static const isFinalFlag = 1 << 2;
+  static const isRequiredFlag = 1 << 3;
 
   final ObjectHandle name;
   final ObjectHandle type;
@@ -971,6 +972,7 @@
   static const isSyncStarFlag = 1 << 6;
   static const isDebuggableFlag = 1 << 7;
   static const hasAttributesFlag = 1 << 8;
+  static const hasParameterFlagsFlag = 1 << 9;
 
   int flags;
   final ObjectHandle parent;
@@ -981,6 +983,7 @@
   final int numRequiredParams;
   final int numNamedParams;
   final List<NameAndType> parameters;
+  final List<int> parameterFlags;
   final ObjectHandle returnType;
   ObjectHandle attributes;
   ClosureCode code;
@@ -995,6 +998,7 @@
       this.numRequiredParams,
       this.numNamedParams,
       this.parameters,
+      this.parameterFlags,
       this.returnType,
       [this.attributes]);
 
@@ -1027,6 +1031,12 @@
       writer.writePackedObject(param.name);
       writer.writePackedObject(param.type);
     }
+    if ((flags & hasParameterFlagsFlag) != 0) {
+      writer.writePackedUInt30(parameterFlags.length);
+      for (var pf in parameterFlags) {
+        writer.writePackedUInt30(pf);
+      }
+    }
     writer.writePackedObject(returnType);
     if ((flags & hasAttributesFlag) != 0) {
       writer.writePackedObject(attributes);
@@ -1069,6 +1079,14 @@
         numParams,
         (_) => new NameAndType(
             reader.readPackedObject(), reader.readPackedObject()));
+    List<int> parameterFlags;
+    if ((flags & hasParameterFlagsFlag) != 0) {
+      final int numParameterFlags = reader.readPackedUInt30();
+      new List<int>.generate(
+          numParameterFlags, (_) => reader.readPackedUInt30());
+    } else {
+      parameterFlags = const <int>[];
+    }
     final returnType = reader.readPackedObject();
     final attributes =
         ((flags & hasAttributesFlag) != 0) ? reader.readPackedObject() : null;
@@ -1082,6 +1100,7 @@
         numRequiredParams,
         numNamedParams,
         parameters,
+        parameterFlags,
         returnType,
         attributes);
   }
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 60fd7d8..6a2d435 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -869,6 +869,9 @@
       if (variable.isFinal) {
         flags |= ParameterDeclaration.isFinalFlag;
       }
+      if (variable.isRequired) {
+        flags |= ParameterDeclaration.isRequiredFlag;
+      }
       return flags;
     }
 
@@ -2661,6 +2664,11 @@
       flags |= ClosureDeclaration.hasTypeParamsFlag;
     }
 
+    final List<int> parameterFlags = getParameterFlags(function);
+    if (parameterFlags != null) {
+      flags |= ClosureDeclaration.hasParameterFlagsFlag;
+    }
+
     return new ClosureDeclaration(
         flags,
         objectTable.getHandle(parent),
@@ -2671,6 +2679,7 @@
         function.requiredParameterCount,
         function.namedParameters.length,
         parameters,
+        parameterFlags,
         objectTable.getHandle(function.returnType));
   }
 
diff --git a/pkg/vm/lib/target/flutter.dart b/pkg/vm/lib/target/flutter.dart
index d95c679..cc259c5 100644
--- a/pkg/vm/lib/target/flutter.dart
+++ b/pkg/vm/lib/target/flutter.dart
@@ -61,10 +61,10 @@
       ChangedStructureNotifier changedStructureNotifier}) {
     super.performPreConstantEvaluationTransformations(
         component, coreTypes, libraries, diagnosticReporter,
-        logger: logger);
+        logger: logger, changedStructureNotifier: changedStructureNotifier);
     if (flags.trackWidgetCreation) {
       if (_widgetTracker == null) {
-        _widgetTracker = WidgetCreatorTracker();
+        _widgetTracker = WidgetCreatorTracker(changedStructureNotifier);
       }
       _widgetTracker.transform(component, libraries);
     }
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index c7cdbc3..033258f 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -119,7 +119,7 @@
       ChangedStructureNotifier changedStructureNotifier}) {
     super.performPreConstantEvaluationTransformations(
         component, coreTypes, libraries, diagnosticReporter,
-        logger: logger);
+        logger: logger, changedStructureNotifier: changedStructureNotifier);
     _patchVmConstants(coreTypes);
   }
 
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 696b5f6..cecc5a0 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -134,7 +134,7 @@
     if (fieldsValid) {
       final structSize = _replaceFields(node, indexedClass);
       _replaceSizeOfMethod(node, structSize, indexedClass);
-      changedStructureNotifier?.forClass(node);
+      changedStructureNotifier?.registerClassMemberChange(node);
     }
 
     return node;
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index 292e393..71cb31c 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,8 +1,9 @@
 # Changelog
 
-## Unreleased
+## 4.0.2
 - Fixed issue where RPC format did not conform to the JSON-RPC 2.0
   specification.
+- Added `getClassList` RPC.
 
 ## 4.0.1
 - Improved documentation.
diff --git a/pkg/vm_service/java/.gitignore b/pkg/vm_service/java/.gitignore
index ae0cc5a..ebfb5c7 100644
--- a/pkg/vm_service/java/.gitignore
+++ b/pkg/vm_service/java/.gitignore
@@ -10,6 +10,7 @@
 src/org/dartlang/vm/service/consumer/EvaluateInFrameConsumer.java
 src/org/dartlang/vm/service/consumer/FlagListConsumer.java
 src/org/dartlang/vm/service/consumer/GetAllocationProfileConsumer.java
+src/org/dartlang/vm/service/consumer/GetClassListConsumer.java
 src/org/dartlang/vm/service/consumer/GetCpuSamplesConsumer.java
 src/org/dartlang/vm/service/consumer/GetInboundReferencesConsumer.java
 src/org/dartlang/vm/service/consumer/GetInstancesConsumer.java
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index 4394db5..af022cb 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.30
+version=3.32
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index a766007..d6569a9 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -28,7 +28,7 @@
         HeapSnapshotObjectNoData,
         HeapSnapshotObjectNullData;
 
-const String vmServiceVersion = '3.30.0';
+const String vmServiceVersion = '3.32.0';
 
 /// @optional
 const String optional = 'optional';
@@ -194,6 +194,7 @@
   'evaluate': const ['InstanceRef', 'ErrorRef'],
   'evaluateInFrame': const ['InstanceRef', 'ErrorRef'],
   'getAllocationProfile': const ['AllocationProfile'],
+  'getClassList': const ['ClassList'],
   'getClientName': const ['ClientName'],
   'getCpuSamples': const ['CpuSamples'],
   'getFlagList': const ['FlagList'],
@@ -497,6 +498,18 @@
   Future<AllocationProfile> getAllocationProfile(String isolateId,
       {bool reset, bool gc});
 
+  /// The `getClassList` RPC is used to retrieve a `ClassList` containing all
+  /// classes for an isolate based on the isolate's `isolateId`.
+  ///
+  /// If `isolateId` refers to an isolate which has exited, then the `Collected`
+  /// [Sentinel] is returned.
+  ///
+  /// See [ClassList].
+  ///
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<ClassList> getClassList(String isolateId);
+
   /// The `getClientName` RPC is used to retrieve the name associated with the
   /// currently connected VM service client. If no name was previously set
   /// through the [setClientName] RPC, a default name will be returned.
@@ -1257,6 +1270,11 @@
             gc: params['gc'],
           );
           break;
+        case 'getClassList':
+          response = await _serviceImplementation.getClassList(
+            params['isolateId'],
+          );
+          break;
         case 'getClientName':
           response = await _serviceImplementation.getClientName();
           break;
@@ -1703,6 +1721,10 @@
       });
 
   @override
+  Future<ClassList> getClassList(String isolateId) =>
+      _call('getClassList', {'isolateId': isolateId});
+
+  @override
   Future<ClientName> getClientName() => _call('getClientName');
 
   @override
@@ -6356,7 +6378,9 @@
   static Timeline parse(Map<String, dynamic> json) =>
       json == null ? null : Timeline._fromJson(json);
 
-  /// A list of timeline events.
+  /// A list of timeline events. No order is guarenteed for these events; in
+  /// particular, these events may be unordered with respect to their
+  /// timestamps.
   List<TimelineEvent> traceEvents;
 
   /// The start of the period of time in which traceEvents were collected.
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index a454d5b..45a7871 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -2,7 +2,7 @@
 description: >-
   A library to communicate with a service implementing the Dart VM
   service protocol.
-version: 4.0.1
+version: 4.0.2
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/runtime/bin/dartdev_utils.cc b/runtime/bin/dartdev_utils.cc
index 0314d6e..3f14bc4 100644
--- a/runtime/bin/dartdev_utils.cc
+++ b/runtime/bin/dartdev_utils.cc
@@ -40,8 +40,7 @@
 
   // If we're not in dart-sdk/bin, we might be in one of the $SDK/out/*
   // directories. Try to use a snapshot from a previously built SDK.
-  snapshot_path = Utils::SCreate(
-      "%sdart-sdk/bin/snapshots/dartdev.dart.snapshot", dir_prefix.get());
+  snapshot_path = Utils::SCreate("%sdartdev.dart.snapshot", dir_prefix.get());
   if (File::Exists(nullptr, snapshot_path)) {
     *script_name = snapshot_path;
     return true;
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index 6370714..471e41b 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -67,7 +67,7 @@
   return Double::New(left / right);
 }
 
-static RawInteger* DoubleToInteger(double val, const char* error_msg) {
+static IntegerPtr DoubleToInteger(double val, const char* error_msg) {
   if (isinf(val) || isnan(val)) {
     const Array& args = Array::Handle(Array::New(1));
     args.SetAt(0, String::Handle(String::New(error_msg)));
diff --git a/runtime/lib/errors.cc b/runtime/lib/errors.cc
index 2bf8799..8d9fb8d 100644
--- a/runtime/lib/errors.cc
+++ b/runtime/lib/errors.cc
@@ -13,7 +13,7 @@
 
 // Scan the stack until we hit the first function in the _AssertionError
 // class. We then return the next frame's script taking inlining into account.
-static RawScript* FindScript(DartFrameIterator* iterator) {
+static ScriptPtr FindScript(DartFrameIterator* iterator) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   // The precompiled runtime faces two issues in recovering the correct
   // assertion text. First, the precompiled runtime does not include
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index bc51eb1..d4c6c43 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -103,10 +103,10 @@
   return Integer::New(pointer.NativeAddress());
 }
 
-static RawObject* LoadValueNumeric(Zone* zone,
-                                   const Pointer& target,
-                                   classid_t type_cid,
-                                   const Integer& offset) {
+static ObjectPtr LoadValueNumeric(Zone* zone,
+                                  const Pointer& target,
+                                  classid_t type_cid,
+                                  const Integer& offset) {
   // TODO(36370): Make representation consistent with kUnboxedFfiIntPtr.
   const size_t address =
       target.NativeAddress() + static_cast<intptr_t>(offset.AsInt64Value());
@@ -164,9 +164,9 @@
   return Pointer::New(type_arg, *reinterpret_cast<uword*>(address));
 }
 
-static RawObject* LoadValueStruct(Zone* zone,
-                                  const Pointer& target,
-                                  const AbstractType& instance_type_arg) {
+static ObjectPtr LoadValueStruct(Zone* zone,
+                                 const Pointer& target,
+                                 const AbstractType& instance_type_arg) {
   // Result is a struct class -- find <class name>.#fromPointer
   // constructor and call it.
   const Class& cls = Class::Handle(zone, instance_type_arg.type_class());
diff --git a/runtime/lib/function.cc b/runtime/lib/function.cc
index 502fe47..ed2c547 100644
--- a/runtime/lib/function.cc
+++ b/runtime/lib/function.cc
@@ -51,8 +51,8 @@
         const Context& context_a = Context::Handle(zone, receiver.context());
         const Context& context_b =
             Context::Handle(zone, other_closure.context());
-        RawObject* receiver_a = context_a.At(0);
-        RawObject* receiver_b = context_b.At(0);
+        ObjectPtr receiver_a = context_a.At(0);
+        ObjectPtr receiver_b = context_b.At(0);
         if ((receiver_a == receiver_b) &&
             ((func_a.raw() == func_b.raw()) ||
              ((func_a.name() == func_b.name()) &&
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index c66299f..bdf51ec 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -158,7 +158,7 @@
   return Bool::Get(left.CompareWith(right) == 0).raw();
 }
 
-static RawInteger* ParseInteger(const String& value) {
+static IntegerPtr ParseInteger(const String& value) {
   // Used by both Integer_parse and Integer_fromEnvironment.
   if (value.IsOneByteString()) {
     // Quick conversion for unpadded integers in strings.
@@ -202,9 +202,9 @@
   return default_value.raw();
 }
 
-static RawInteger* ShiftOperationHelper(Token::Kind kind,
-                                        const Integer& value,
-                                        const Integer& amount) {
+static IntegerPtr ShiftOperationHelper(Token::Kind kind,
+                                       const Integer& value,
+                                       const Integer& amount) {
   if (amount.AsInt64Value() < 0) {
     Exceptions::ThrowArgumentError(amount);
   }
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 1855954..4ef798d 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -15,6 +15,7 @@
 #include "vm/dart_api_message.h"
 #include "vm/dart_entry.h"
 #include "vm/exceptions.h"
+#include "vm/hash_table.h"
 #include "vm/lockers.h"
 #include "vm/longjump.h"
 #include "vm/message_handler.h"
@@ -108,6 +109,151 @@
   return Object::null();
 }
 
+class ObjectPtrSetTraitsLayout {
+ public:
+  static bool ReportStats() { return false; }
+  static const char* Name() { return "RawObjectPtrSetTraits"; }
+
+  static bool IsMatch(const ObjectPtr a, const ObjectPtr b) { return a == b; }
+
+  static uword Hash(const ObjectPtr obj) { return static_cast<uword>(obj); }
+};
+
+static ObjectPtr ValidateMessageObject(Zone* zone,
+                                       Isolate* isolate,
+                                       const Object& obj) {
+  TIMELINE_DURATION(Thread::Current(), Isolate, "ValidateMessageObject");
+
+  class SendMessageValidator : public ObjectPointerVisitor {
+   public:
+    SendMessageValidator(IsolateGroup* isolate_group,
+                         WeakTable* visited,
+                         MallocGrowableArray<ObjectPtr>* const working_set)
+        : ObjectPointerVisitor(isolate_group),
+          visited_(visited),
+          working_set_(working_set) {}
+
+   private:
+    void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
+      for (ObjectPtr* raw = from; raw <= to; raw++) {
+        if (!(*raw)->IsHeapObject() || (*raw)->ptr()->IsCanonical()) {
+          continue;
+        }
+        if (visited_->GetValueExclusive(*raw) == 1) {
+          continue;
+        }
+        visited_->SetValueExclusive(*raw, 1);
+        working_set_->Add(*raw);
+      }
+    }
+
+    WeakTable* visited_;
+    MallocGrowableArray<ObjectPtr>* const working_set_;
+  };
+  if (!obj.raw()->IsHeapObject() || obj.raw()->ptr()->IsCanonical()) {
+    return obj.raw();
+  }
+  ClassTable* class_table = isolate->class_table();
+
+  Class& klass = Class::Handle(zone);
+  Closure& closure = Closure::Handle(zone);
+
+  MallocGrowableArray<ObjectPtr> working_set;
+  std::unique_ptr<WeakTable> visited(new WeakTable());
+
+  NoSafepointScope no_safepoint;
+  SendMessageValidator visitor(isolate->group(), visited.get(), &working_set);
+
+  visited->SetValueExclusive(obj.raw(), 1);
+  working_set.Add(obj.raw());
+
+  while (!working_set.is_empty()) {
+    ObjectPtr raw = working_set.RemoveLast();
+
+    if (visited->GetValueExclusive(raw) > 0) {
+      continue;
+    }
+    visited->SetValueExclusive(raw, 1);
+
+    const intptr_t cid = raw->GetClassId();
+    switch (cid) {
+      // List below matches the one in raw_object_snapshot.cc
+#define MESSAGE_SNAPSHOT_ILLEGAL(type)                                         \
+  return Exceptions::CreateUnhandledException(                                 \
+      zone, Exceptions::kArgumentValue,                                        \
+      "Illegal argument in isolate message : (object is a " #type ")");        \
+  break;
+
+      MESSAGE_SNAPSHOT_ILLEGAL(DynamicLibrary);
+      MESSAGE_SNAPSHOT_ILLEGAL(MirrorReference);
+      MESSAGE_SNAPSHOT_ILLEGAL(Pointer);
+      MESSAGE_SNAPSHOT_ILLEGAL(ReceivePort);
+      MESSAGE_SNAPSHOT_ILLEGAL(RegExp);
+      MESSAGE_SNAPSHOT_ILLEGAL(StackTrace);
+      MESSAGE_SNAPSHOT_ILLEGAL(UserTag);
+
+      case kClosureCid: {
+        closure = Closure::RawCast(raw);
+        FunctionPtr func = closure.function();
+        // We only allow closure of top level methods or static functions in a
+        // class to be sent in isolate messages.
+        if (!Function::IsImplicitStaticClosureFunction(func)) {
+          return Exceptions::CreateUnhandledException(
+              zone, Exceptions::kArgumentValue, "Closures are not allowed");
+        }
+        break;
+      }
+      default:
+        if (cid >= kNumPredefinedCids) {
+          klass = class_table->At(cid);
+          if (klass.num_native_fields() != 0) {
+            return Exceptions::CreateUnhandledException(
+                zone, Exceptions::kArgumentValue,
+                "Objects that extend NativeWrapper are not allowed");
+          }
+        }
+    }
+    raw->ptr()->VisitPointers(&visitor);
+  }
+  isolate->set_forward_table_new(nullptr);
+  return obj.raw();
+}
+
+DEFINE_NATIVE_ENTRY(SendPortImpl_sendAndExitInternal_, 0, 2) {
+  GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
+  if (!PortMap::IsReceiverInThisIsolateGroup(port.Id(), isolate->group())) {
+    const auto& error =
+        String::Handle(String::New("sendAndExit is only supported across "
+                                   "isolates spawned via spawnFunction."));
+    Exceptions::ThrowArgumentError(error);
+    UNREACHABLE();
+  }
+
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1));
+
+  Object& validated_result = Object::Handle(zone);
+  Object& msg_obj = Object::Handle(zone, obj.raw());
+  validated_result = ValidateMessageObject(zone, isolate, msg_obj);
+  if (validated_result.IsUnhandledException()) {
+    Exceptions::PropagateError(Error::Cast(validated_result));
+    UNREACHABLE();
+  }
+  PersistentHandle* handle =
+      isolate->group()->api_state()->AllocatePersistentHandle();
+  handle->set_raw(msg_obj);
+  isolate->bequeath(std::unique_ptr<Bequest>(new Bequest(handle, port.Id())));
+  // TODO(aam): Ensure there are no dart api calls after this point as we want
+  // to ensure that validated message won't get tampered with.
+  Isolate::KillIfExists(isolate, Isolate::LibMsgId::kKillMsg);
+  // Drain interrupts before running so any IMMEDIATE operations on the current
+  // isolate happen synchronously.
+  const Error& error = Error::Handle(thread->HandleInterrupts());
+  RELEASE_ASSERT(error.IsUnwindError());
+  Exceptions::PropagateError(error);
+  // We will never execute dart code again in this isolate.
+  return Object::null();
+}
+
 static void ThrowIsolateSpawnException(const String& message) {
   const Array& args = Array::Handle(Array::New(1));
   args.SetAt(0, message);
diff --git a/runtime/lib/math.cc b/runtime/lib/math.cc
index b4a5bfd..b1e7513 100644
--- a/runtime/lib/math.cc
+++ b/runtime/lib/math.cc
@@ -74,7 +74,7 @@
 }
 
 // Returns the typed-data array store in '_Random._state' field.
-static RawTypedData* GetRandomStateArray(const Instance& receiver) {
+static TypedDataPtr GetRandomStateArray(const Instance& receiver) {
   const Class& random_class = Class::Handle(receiver.clazz());
   const Field& state_field =
       Field::Handle(random_class.LookupFieldAllowPrivate(Symbols::_state()));
@@ -107,7 +107,7 @@
   return Object::null();
 }
 
-RawTypedData* CreateRandomState(Zone* zone, uint64_t seed) {
+TypedDataPtr CreateRandomState(Zone* zone, uint64_t seed) {
   const TypedData& result =
       TypedData::Handle(zone, TypedData::New(kTypedDataUint32ArrayCid, 2));
   result.SetUint32(0, static_cast<uint32_t>(seed));
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 0f114ee..b8a123e 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -21,14 +21,14 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
 #define RETURN_OR_PROPAGATE(expr)                                              \
-  RawObject* result = expr;                                                    \
+  ObjectPtr result = expr;                                                     \
   if (IsErrorClassId(result->GetClassIdMayBeSmi())) {                          \
     Exceptions::PropagateError(Error::Handle(Error::RawCast(result)));         \
   }                                                                            \
   return result;
 
-static RawInstance* CreateMirror(const String& mirror_class_name,
-                                 const Array& constructor_arguments) {
+static InstancePtr CreateMirror(const String& mirror_class_name,
+                                const Array& constructor_arguments) {
   const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary());
   const String& constructor_name = Symbols::DotUnder();
 
@@ -90,8 +90,8 @@
   func.EnsureHasCode();
 }
 
-static RawInstance* CreateParameterMirrorList(const Function& func,
-                                              const Instance& owner_mirror) {
+static InstancePtr CreateParameterMirrorList(const Function& func,
+                                             const Instance& owner_mirror) {
   HANDLESCOPE(Thread::Current());
   const intptr_t implicit_param_count = func.NumImplicitParameters();
   const intptr_t non_implicit_param_count =
@@ -184,8 +184,8 @@
   return results.raw();
 }
 
-static RawInstance* CreateTypeVariableMirror(const TypeParameter& param,
-                                             const Instance& owner_mirror) {
+static InstancePtr CreateTypeVariableMirror(const TypeParameter& param,
+                                            const Instance& owner_mirror) {
   const Array& args = Array::Handle(Array::New(3));
   args.SetAt(0, param);
   args.SetAt(1, String::Handle(param.name()));
@@ -195,7 +195,7 @@
 
 // We create a list in native code and let Dart code create the type mirror
 // object and the ordered map.
-static RawInstance* CreateTypeVariableList(const Class& cls) {
+static InstancePtr CreateTypeVariableList(const Class& cls) {
   const TypeArguments& args = TypeArguments::Handle(cls.type_parameters());
   if (args.IsNull()) {
     return Object::empty_array().raw();
@@ -214,10 +214,10 @@
   return result.raw();
 }
 
-static RawInstance* CreateTypedefMirror(const Class& cls,
-                                        const AbstractType& type,
-                                        const Bool& is_declaration,
-                                        const Instance& owner_mirror) {
+static InstancePtr CreateTypedefMirror(const Class& cls,
+                                       const AbstractType& type,
+                                       const Bool& is_declaration,
+                                       const Instance& owner_mirror) {
   const Array& args = Array::Handle(Array::New(6));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
   args.SetAt(1, type);
@@ -228,7 +228,7 @@
   return CreateMirror(Symbols::_TypedefMirror(), args);
 }
 
-static RawInstance* CreateFunctionTypeMirror(const AbstractType& type) {
+static InstancePtr CreateFunctionTypeMirror(const AbstractType& type) {
   ASSERT(type.IsFunctionType());
   const Class& cls = Class::Handle(Type::Cast(type).type_class());
   const Function& func = Function::Handle(Type::Cast(type).signature());
@@ -239,9 +239,9 @@
   return CreateMirror(Symbols::_FunctionTypeMirror(), args);
 }
 
-static RawInstance* CreateMethodMirror(const Function& func,
-                                       const Instance& owner_mirror,
-                                       const AbstractType& instantiator) {
+static InstancePtr CreateMethodMirror(const Function& func,
+                                      const Instance& owner_mirror,
+                                      const AbstractType& instantiator) {
   const Array& args = Array::Handle(Array::New(6));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func)));
 
@@ -259,7 +259,7 @@
       (static_cast<intptr_t>(func.IsGetterFunction()) << Mirrors::kGetter);
   kind_flags |=
       (static_cast<intptr_t>(func.IsSetterFunction()) << Mirrors::kSetter);
-  bool is_ctor = (func.kind() == RawFunction::kConstructor);
+  bool is_ctor = (func.kind() == FunctionLayout::kConstructor);
   kind_flags |= (static_cast<intptr_t>(is_ctor) << Mirrors::kConstructor);
   kind_flags |= (static_cast<intptr_t>(is_ctor && func.is_const())
                  << Mirrors::kConstCtor);
@@ -281,8 +281,8 @@
   return CreateMirror(Symbols::_MethodMirror(), args);
 }
 
-static RawInstance* CreateVariableMirror(const Field& field,
-                                         const Instance& owner_mirror) {
+static InstancePtr CreateVariableMirror(const Field& field,
+                                        const Instance& owner_mirror) {
   const MirrorReference& field_ref =
       MirrorReference::Handle(MirrorReference::New(field));
 
@@ -301,10 +301,10 @@
   return CreateMirror(Symbols::_VariableMirror(), args);
 }
 
-static RawInstance* CreateClassMirror(const Class& cls,
-                                      const AbstractType& type,
-                                      const Bool& is_declaration,
-                                      const Instance& owner_mirror) {
+static InstancePtr CreateClassMirror(const Class& cls,
+                                     const AbstractType& type,
+                                     const Bool& is_declaration,
+                                     const Instance& owner_mirror) {
   if (type.IsTypeRef()) {
     AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type());
     ASSERT(!ref_type.IsTypeRef());
@@ -351,7 +351,7 @@
   return false;
 }
 
-static RawInstance* CreateLibraryMirror(Thread* thread, const Library& lib) {
+static InstancePtr CreateLibraryMirror(Thread* thread, const Library& lib) {
   Zone* zone = thread->zone();
   ASSERT(!lib.IsNull());
   const Array& args = Array::Handle(zone, Array::New(3));
@@ -368,24 +368,24 @@
   return CreateMirror(Symbols::_LibraryMirror(), args);
 }
 
-static RawInstance* CreateCombinatorMirror(const Object& identifiers,
-                                           bool is_show) {
+static InstancePtr CreateCombinatorMirror(const Object& identifiers,
+                                          bool is_show) {
   const Array& args = Array::Handle(Array::New(2));
   args.SetAt(0, identifiers);
   args.SetAt(1, Bool::Get(is_show));
   return CreateMirror(Symbols::_CombinatorMirror(), args);
 }
 
-static RawInstance* CreateLibraryDependencyMirror(Thread* thread,
-                                                  const Instance& importer,
-                                                  const Library& importee,
-                                                  const Array& show_names,
-                                                  const Array& hide_names,
-                                                  const Object& metadata,
-                                                  const LibraryPrefix& prefix,
-                                                  const String& prefix_name,
-                                                  const bool is_import,
-                                                  const bool is_deferred) {
+static InstancePtr CreateLibraryDependencyMirror(Thread* thread,
+                                                 const Instance& importer,
+                                                 const Library& importee,
+                                                 const Array& show_names,
+                                                 const Array& hide_names,
+                                                 const Object& metadata,
+                                                 const LibraryPrefix& prefix,
+                                                 const String& prefix_name,
+                                                 const bool is_import,
+                                                 const bool is_deferred) {
   const Instance& importee_mirror =
       Instance::Handle(CreateLibraryMirror(thread, importee));
   if (importee_mirror.IsNull()) {
@@ -427,12 +427,12 @@
   return CreateMirror(Symbols::_LibraryDependencyMirror(), args);
 }
 
-static RawInstance* CreateLibraryDependencyMirror(Thread* thread,
-                                                  const Instance& importer,
-                                                  const Namespace& ns,
-                                                  const LibraryPrefix& prefix,
-                                                  const bool is_import,
-                                                  const bool is_deferred) {
+static InstancePtr CreateLibraryDependencyMirror(Thread* thread,
+                                                 const Instance& importer,
+                                                 const Namespace& ns,
+                                                 const LibraryPrefix& prefix,
+                                                 const bool is_import,
+                                                 const bool is_deferred) {
   const Library& importee = Library::Handle(ns.library());
   const Array& show_names = Array::Handle(ns.show_names());
   const Array& hide_names = Array::Handle(ns.hide_names());
@@ -453,7 +453,7 @@
                                        prefix_name, is_import, is_deferred);
 }
 
-static RawGrowableObjectArray* CreateBytecodeLibraryDependencies(
+static GrowableObjectArrayPtr CreateBytecodeLibraryDependencies(
     Thread* thread,
     const Library& lib,
     const Instance& lib_mirror) {
@@ -597,7 +597,7 @@
   return deps.raw();
 }
 
-static RawInstance* CreateTypeMirror(const AbstractType& type) {
+static InstancePtr CreateTypeMirror(const AbstractType& type) {
   if (type.IsTypeRef()) {
     AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type());
     ASSERT(!ref_type.IsTypeRef());
@@ -652,7 +652,7 @@
   return Instance::null();
 }
 
-static RawInstance* CreateIsolateMirror() {
+static InstancePtr CreateIsolateMirror() {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   const String& debug_name = String::Handle(String::New(isolate->name()));
@@ -697,8 +697,8 @@
 #endif
 }
 
-static RawAbstractType* InstantiateType(const AbstractType& type,
-                                        const AbstractType& instantiator) {
+static AbstractTypePtr InstantiateType(const AbstractType& type,
+                                       const AbstractType& instantiator) {
   // Generic function type parameters are not reified, but mapped to dynamic,
   // i.e. all function type parameters are free with a null vector.
   ASSERT(type.IsFinalized());
@@ -1112,9 +1112,9 @@
   for (intptr_t i = 0; i < num_functions; i++) {
     func ^= functions.At(i);
     if (func.is_reflectable() &&
-        (func.kind() == RawFunction::kRegularFunction ||
-         func.kind() == RawFunction::kGetterFunction ||
-         func.kind() == RawFunction::kSetterFunction)) {
+        (func.kind() == FunctionLayout::kRegularFunction ||
+         func.kind() == FunctionLayout::kGetterFunction ||
+         func.kind() == FunctionLayout::kSetterFunction)) {
       member_mirror =
           CreateMethodMirror(func, owner_mirror, owner_instantiator);
       member_mirrors.Add(member_mirror);
@@ -1147,7 +1147,7 @@
   Function& func = Function::Handle();
   for (intptr_t i = 0; i < num_functions; i++) {
     func ^= functions.At(i);
-    if (func.is_reflectable() && func.kind() == RawFunction::kConstructor) {
+    if (func.is_reflectable() && func.kind() == FunctionLayout::kConstructor) {
       constructor_mirror =
           CreateMethodMirror(func, owner_mirror, owner_instantiator);
       constructor_mirrors.Add(constructor_mirror);
@@ -1200,9 +1200,9 @@
     } else if (entry.IsFunction()) {
       const Function& func = Function::Cast(entry);
       if (func.is_reflectable() &&
-          (func.kind() == RawFunction::kRegularFunction ||
-           func.kind() == RawFunction::kGetterFunction ||
-           func.kind() == RawFunction::kSetterFunction)) {
+          (func.kind() == FunctionLayout::kRegularFunction ||
+           func.kind() == FunctionLayout::kGetterFunction ||
+           func.kind() == FunctionLayout::kSetterFunction)) {
         member_mirror =
             CreateMethodMirror(func, owner_mirror, AbstractType::Handle());
         member_mirrors.Add(member_mirror);
@@ -1443,7 +1443,7 @@
       Function::Handle(klass.LookupFunction(internal_constructor_name));
 
   if (lookup_constructor.IsNull() ||
-      (lookup_constructor.kind() != RawFunction::kConstructor) ||
+      (lookup_constructor.kind() != FunctionLayout::kConstructor) ||
       !lookup_constructor.is_reflectable()) {
     ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                       external_constructor_name, explicit_args, arg_names,
@@ -1640,9 +1640,9 @@
   return func.GetSource();
 }
 
-static RawInstance* CreateSourceLocation(const String& uri,
-                                         intptr_t line,
-                                         intptr_t column) {
+static InstancePtr CreateSourceLocation(const String& uri,
+                                        intptr_t line,
+                                        intptr_t column) {
   const Array& args = Array::Handle(Array::New(3));
   args.SetAt(0, uri);
   args.SetAt(1, Smi::Handle(Smi::New(line)));
diff --git a/runtime/lib/regexp.cc b/runtime/lib/regexp.cc
index 6deab66..57aa72a 100644
--- a/runtime/lib/regexp.cc
+++ b/runtime/lib/regexp.cc
@@ -113,9 +113,9 @@
   return Object::null();
 }
 
-static RawObject* ExecuteMatch(Zone* zone,
-                               NativeArguments* arguments,
-                               bool sticky) {
+static ObjectPtr ExecuteMatch(Zone* zone,
+                              NativeArguments* arguments,
+                              bool sticky) {
   const RegExp& regexp = RegExp::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(!regexp.IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(String, subject, arguments->NativeArgAt(1));
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index dfe1f585..c2d8657 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -18,8 +18,8 @@
 
 static const intptr_t kDefaultStackAllocation = 8;
 
-static RawStackTrace* CurrentSyncStackTraceLazy(Thread* thread,
-                                                intptr_t skip_frames = 1) {
+static StackTracePtr CurrentSyncStackTraceLazy(Thread* thread,
+                                               intptr_t skip_frames = 1) {
   Zone* zone = thread->zone();
 
   const auto& code_array = GrowableObjectArray::ZoneHandle(
@@ -39,8 +39,8 @@
   return StackTrace::New(code_array_fixed, pc_offset_array_fixed);
 }
 
-static RawStackTrace* CurrentSyncStackTrace(Thread* thread,
-                                            intptr_t skip_frames = 1) {
+static StackTracePtr CurrentSyncStackTrace(Thread* thread,
+                                           intptr_t skip_frames = 1) {
   Zone* zone = thread->zone();
   const Function& null_function = Function::ZoneHandle(zone);
 
@@ -63,7 +63,7 @@
   return StackTrace::New(code_array, pc_offset_array);
 }
 
-static RawStackTrace* CurrentStackTrace(
+static StackTracePtr CurrentStackTrace(
     Thread* thread,
     bool for_async_function,
     intptr_t skip_frames = 1,
@@ -128,7 +128,7 @@
   return result.raw();
 }
 
-RawStackTrace* GetStackTraceForException() {
+StackTracePtr GetStackTraceForException() {
   Thread* thread = Thread::Current();
   return CurrentStackTrace(thread, false, 0);
 }
diff --git a/runtime/lib/stacktrace.h b/runtime/lib/stacktrace.h
index c482070..9c8abae 100644
--- a/runtime/lib/stacktrace.h
+++ b/runtime/lib/stacktrace.h
@@ -5,10 +5,11 @@
 #ifndef RUNTIME_LIB_STACKTRACE_H_
 #define RUNTIME_LIB_STACKTRACE_H_
 
+#include "vm/tagged_pointer.h"
+
 namespace dart {
 
 class StackTrace;
-class RawStackTrace;
 
 // Creates a StackTrace object from the current stack.  Skips the
 // first skip_frames Dart frames.
@@ -18,7 +19,7 @@
 const StackTrace& GetCurrentStackTrace(int skip_frames);
 
 // Creates a StackTrace object to be attached to an exception.
-RawStackTrace* GetStackTraceForException();
+StackTracePtr GetStackTraceForException();
 
 }  // namespace dart
 
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 4b262c6..71ae8a6 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -362,8 +362,7 @@
     }
     String& string = String::Handle(OneByteString::New(length, space));
     for (int i = 0; i < length; i++) {
-      intptr_t value =
-          Smi::Value(reinterpret_cast<RawSmi*>(array.At(start + i)));
+      intptr_t value = Smi::Value(static_cast<SmiPtr>(array.At(start + i)));
       OneByteString::SetCharAt(string, i, value);
     }
     return string.raw();
@@ -376,8 +375,7 @@
     }
     String& string = String::Handle(OneByteString::New(length, space));
     for (int i = 0; i < length; i++) {
-      intptr_t value =
-          Smi::Value(reinterpret_cast<RawSmi*>(array.At(start + i)));
+      intptr_t value = Smi::Value(static_cast<SmiPtr>(array.At(start + i)));
       OneByteString::SetCharAt(string, i, value);
     }
     return string.raw();
@@ -458,8 +456,7 @@
     const String& string =
         String::Handle(zone, TwoByteString::New(length, space));
     for (int i = 0; i < length; i++) {
-      intptr_t value =
-          Smi::Value(reinterpret_cast<RawSmi*>(array.At(start + i)));
+      intptr_t value = Smi::Value(static_cast<SmiPtr>(array.At(start + i)));
       TwoByteString::SetCharAt(string, i, value);
     }
     return string.raw();
@@ -471,8 +468,7 @@
     const String& string =
         String::Handle(zone, TwoByteString::New(length, space));
     for (int i = 0; i < length; i++) {
-      intptr_t value =
-          Smi::Value(reinterpret_cast<RawSmi*>(array.At(start + i)));
+      intptr_t value = Smi::Value(static_cast<SmiPtr>(array.At(start + i)));
       TwoByteString::SetCharAt(string, i, value);
     }
     return string.raw();
diff --git a/runtime/lib/typed_data.cc b/runtime/lib/typed_data.cc
index 4980516..2e3cf1c 100644
--- a/runtime/lib/typed_data.cc
+++ b/runtime/lib/typed_data.cc
@@ -85,12 +85,12 @@
 }
 
 template <typename DstType, typename SrcType>
-static RawBool* CopyData(const Instance& dst,
-                         const Instance& src,
-                         const Smi& dst_start,
-                         const Smi& src_start,
-                         const Smi& length,
-                         bool clamped) {
+static BoolPtr CopyData(const Instance& dst,
+                        const Instance& src,
+                        const Smi& dst_start,
+                        const Smi& src_start,
+                        const Smi& length,
+                        bool clamped) {
   const DstType& dst_array = DstType::Cast(dst);
   const SrcType& src_array = SrcType::Cast(src);
   const intptr_t dst_offset_in_bytes = dst_start.Value();
diff --git a/runtime/lib/wasm.cc b/runtime/lib/wasm.cc
index eca0ff7..639c72a 100644
--- a/runtime/lib/wasm.cc
+++ b/runtime/lib/wasm.cc
@@ -133,7 +133,7 @@
   }
 }
 
-static RawObject* ToDartObject(wasmer_value_t ret) {
+static ObjectPtr ToDartObject(wasmer_value_t ret) {
   switch (ret.tag) {
     case wasmer_value_tag::WASM_I32:
       return Integer::New(ret.value.I32);
@@ -165,7 +165,7 @@
   }
 }
 
-RawExternalTypedData* WasmMemoryToExternalTypedData(wasmer_memory_t* memory) {
+ExternalTypedDataPtr WasmMemoryToExternalTypedData(wasmer_memory_t* memory) {
   uint8_t* data = wasmer_memory_data(memory);
   uint32_t size = wasmer_memory_data_length(memory);
   return ExternalTypedData::New(kExternalTypedDataUint8ArrayCid, data, size);
@@ -191,7 +191,7 @@
   }
 }
 
-RawString* DescribeModule(const wasmer_module_t* module) {
+StringPtr DescribeModule(const wasmer_module_t* module) {
   std::stringstream desc;
 
   desc << "Imports:\n";
diff --git a/runtime/observatory/lib/service_common.dart b/runtime/observatory/lib/service_common.dart
index 48181ff..f074891 100644
--- a/runtime/observatory/lib/service_common.dart
+++ b/runtime/observatory/lib/service_common.dart
@@ -131,7 +131,7 @@
     _notifyDisconnect(reason);
   }
 
-  Future<Map> invokeRpcRaw(String method, Map params) {
+  Future<Map> invokeRpcRaw(String method, Map params) async {
     if (!_hasInitiatedConnect) {
       _hasInitiatedConnect = true;
       try {
@@ -145,7 +145,7 @@
     }
     if (_disconnected.isCompleted) {
       // This connection was closed already.
-      var exception = new NetworkRpcException('WebSocket closed');
+      var exception = new NetworkRpcException(await onDisconnect);
       return new Future.error(exception);
     }
     String serial = (_requestSerial++).toString();
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 1e4bf9f..738766a 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -2206,6 +2206,8 @@
   static const kExtension = 'Extension';
   static const kServiceRegistered = 'ServiceRegistered';
   static const kServiceUnregistered = 'ServiceUnregistered';
+  static const kDartDevelopmentServiceConnected =
+      'DartDevelopmentServiceConnected';
 
   ServiceEvent._empty(ServiceObjectOwner owner) : super._empty(owner);
 
@@ -2242,6 +2244,8 @@
   String method;
   String service;
   String alias;
+  String message;
+  Uri uri;
 
   bool lastChunk;
 
@@ -2345,6 +2349,12 @@
     if (map['newValue'] != null) {
       newValue = map['newValue'];
     }
+    if (map['message'] != null) {
+      message = map['message'];
+    }
+    if (map['uri'] != null) {
+      uri = Uri.parse(map['uri']);
+    }
   }
 
   String toString() {
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 58d44de..91f015d 100644
--- a/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
@@ -135,7 +135,8 @@
               'id': request['id'],
               'error': {
                 'code': errorCode + iteration,
-                'data': {errorKey + end: errorValue + end}
+                'data': {errorKey + end: errorValue + end},
+                'message': 'error message',
               }
             });
       }).toList();
@@ -165,7 +166,6 @@
 ];
 
 main(args) => runIsolateTests(
-      args, tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
+      args,
+      tests,
     );
diff --git a/runtime/observatory/tests/service/external_service_disappear_test.dart b/runtime/observatory/tests/service/external_service_disappear_test.dart
index a015686..fec1d31 100644
--- a/runtime/observatory/tests/service/external_service_disappear_test.dart
+++ b/runtime/observatory/tests/service/external_service_disappear_test.dart
@@ -90,7 +90,6 @@
 ];
 
 main(args) => runIsolateTests(
-      args, tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
+      args,
+      tests,
     );
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 a5bfd64..2a659a1 100644
--- a/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
@@ -86,6 +86,4 @@
 main(args) => runIsolateTests(
       args,
       tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
     );
diff --git a/runtime/observatory/tests/service/external_service_registration_test.dart b/runtime/observatory/tests/service/external_service_registration_test.dart
index ce0aea9..469facb 100644
--- a/runtime/observatory/tests/service/external_service_registration_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_test.dart
@@ -126,6 +126,4 @@
 main(args) => runIsolateTests(
       args,
       tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
     );
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 80729ce..008c221 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
@@ -104,7 +104,6 @@
 ];
 
 main(args) => runIsolateTests(
-      args, tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
+      args,
+      tests,
     );
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 45c58d8..a7cee78 100644
--- a/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
@@ -110,7 +110,8 @@
         'id': request['id'],
         'error': {
           'code': errorCode + iteration,
-          'data': {errorKey + end: errorValue + end}
+          'data': {errorKey + end: errorValue + end},
+          'message': 'error message',
         }
       });
 
@@ -127,7 +128,6 @@
 ];
 
 main(args) => runIsolateTests(
-      args, tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
+      args,
+      tests,
     );
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index caaa488..785d7f9 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(30));
+    expect(result['minor'], equals(32));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index 85df4f6..673f589 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 import 'dart:io' show Platform;
+import 'package:dds/dds.dart';
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_common.dart';
 import 'package:observatory/service_io.dart';
@@ -13,6 +14,7 @@
 
 typedef Future IsolateTest(Isolate isolate);
 typedef Future VMTest(VM vm);
+typedef Future DDSTest(VM vm, DartDevelopmentService dds);
 typedef void ServiceEventHandler(ServiceEvent event);
 
 Map<String, StreamSubscription> streamSubscriptions = {};
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 1a5c8fd..1e2753e 100644
--- a/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart
@@ -54,30 +54,6 @@
     }
     expect(caughtException, isTrue);
   },
-
-  // illegal (dart:_*) library.
-  (Isolate isolate) async {
-    await isolate.load();
-    Library dartInternal = isolate.libraries
-        .firstWhere((Library library) => library.uri == 'dart:_internal');
-    var params = {
-      'libraryId': dartInternal.id,
-      'isDebuggable': false,
-    };
-    bool caughtException;
-    try {
-      await isolate.invokeRpcNoUpgrade('setLibraryDebuggable', params);
-      expect(false, isTrue, reason: 'Unreachable');
-    } on ServerRpcException catch (e) {
-      caughtException = true;
-      expect(e.code, equals(ServerRpcException.kInvalidParams));
-      expect(
-          e.message,
-          "setLibraryDebuggable: "
-          "illegal 'libraryId' parameter: ${dartInternal.id}");
-    }
-    expect(caughtException, isTrue);
-  },
 ];
 
 main(args) async => runIsolateTests(args, tests);
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index b22294d..a63bc14 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -11,7 +11,7 @@
 import 'package:observatory/service_io.dart';
 import 'package:test/test.dart';
 import 'service_test_common.dart';
-export 'service_test_common.dart' show IsolateTest, VMTest;
+export 'service_test_common.dart' show DDSTest, IsolateTest, VMTest;
 
 /// Whether to use causal async stacks (if not we use lazy async stacks).
 const bool useCausalAsyncStacks =
@@ -337,8 +337,9 @@
     List<String> mainArgs,
     List<String> extraArgs,
     List<String> executableArgs,
-    List<VMTest> vmTests,
+    List<DDSTest> ddsTests,
     List<IsolateTest> isolateTests,
+    List<VMTest> vmTests,
     bool pause_on_start: false,
     bool pause_on_exit: false,
     bool verbose_vm: false,
@@ -460,11 +461,11 @@
       );
     }
 
-    if (useDds && !enableDds) {
+    if ((useDds && !enableDds) || (!useDds && ddsTests != null)) {
       print('Skipping DDS run for $name');
-    } else {
-      runTest(name);
+      return;
     }
+    runTest(name);
   }
 
   Future<Isolate> getFirstIsolate(WebSocketVM vm) async {
@@ -581,7 +582,7 @@
   }
 }
 
-/// Runs [tests] in sequence, each of which should take an [Isolate] and
+/// Runs [tests] in sequence, each of which should take a [VM] and
 /// return a [Future]. Code for setting up state can run before and/or
 /// concurrently with the tests. Uses [mainArgs] to determine whether
 /// to run tests or testee in this invocation of the script.
@@ -619,3 +620,42 @@
     );
   }
 }
+
+/// Runs [tests] in sequence, each of which should take a [VM] and
+/// [DartDevelopmentService] and return a [Future]. Code for setting up state
+/// can run before and/or concurrently with the tests. Uses [mainArgs] to
+/// determine whether to run tests or testee in this invocation of the
+/// script.
+Future runDDSTests(List<String> mainArgs, List<DDSTest> tests,
+    {testeeBefore(),
+    testeeConcurrent(),
+    bool pause_on_start: false,
+    bool pause_on_exit: false,
+    bool verbose_vm: false,
+    bool pause_on_unhandled_exceptions: false,
+    bool enable_service_port_fallback: false,
+    int port = 0,
+    List<String> extraArgs,
+    List<String> executableArgs}) async {
+  if (_isTestee()) {
+    new _ServiceTesteeRunner().run(
+        testeeBefore: testeeBefore,
+        testeeConcurrent: testeeConcurrent,
+        pause_on_start: pause_on_start,
+        pause_on_exit: pause_on_exit);
+  } else {
+    new _ServiceTesterRunner().run(
+      mainArgs: mainArgs,
+      extraArgs: extraArgs,
+      executableArgs: executableArgs,
+      ddsTests: tests,
+      pause_on_start: pause_on_start,
+      pause_on_exit: pause_on_exit,
+      verbose_vm: verbose_vm,
+      pause_on_unhandled_exceptions: pause_on_unhandled_exceptions,
+      enable_service_port_fallback: enable_service_port_fallback,
+      enableDds: true,
+      port: port,
+    );
+  }
+}
diff --git a/runtime/observatory/tests/service/vm_service_dds_test.dart b/runtime/observatory/tests/service/vm_service_dds_test.dart
new file mode 100644
index 0000000..457245d
--- /dev/null
+++ b/runtime/observatory/tests/service/vm_service_dds_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:dds/dds.dart';
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+
+import 'test_helper.dart';
+
+final tests = <DDSTest>[
+  (VM vm, DartDevelopmentService dds) async {
+    final client = WebSocketVM(
+      WebSocketVMTarget(
+        dds.remoteVmServiceWsUri.toString(),
+      ),
+    );
+    expect(client.wasOrIsConnected, false);
+    try {
+      await client.load();
+      fail(
+          'When DDS is connected, direct connections to the VM service should fail.');
+    } on NetworkRpcException catch (e) {
+      expect(e.message, 'WebSocket closed due to error');
+    }
+    expect(client.wasOrIsConnected, false);
+  }
+];
+
+main(args) async => runDDSTests(args, tests);
diff --git a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
new file mode 100644
index 0000000..11c1a33
--- /dev/null
+++ b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks --no-causal-async-stacks
+
+import 'dart:async';
+import 'dart:io';
+
+import 'utils.dart';
+
+Future<void> main(List<String> args) async {
+  // We won't have access to the debugging info file on Android.
+  if (Platform.isAndroid) return;
+
+  await doTestsLazy('async_lazy_debug.so');
+}
diff --git a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_no_causal_non_symbolic_test.dart b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_no_causal_non_symbolic_test.dart
new file mode 100644
index 0000000..f65de84
--- /dev/null
+++ b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_no_causal_non_symbolic_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--dwarf-stack-traces --save-debugging-info=async_no_causal_debug.so --no-causal-async-stacks --no-lazy-async-stacks
+
+import 'dart:async';
+import 'dart:io';
+
+import 'utils.dart';
+
+Future<void> main(List<String> args) async {
+  // We won't have access to the debugging info file on Android.
+  if (Platform.isAndroid) return;
+
+  await doTestsNoCausalNoLazy('async_no_causal_debug.so');
+}
diff --git a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_non_symbolic_test.dart b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_non_symbolic_test.dart
new file mode 100644
index 0000000..cdb783a
--- /dev/null
+++ b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_non_symbolic_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--dwarf-stack-traces --save-debugging-info=async_causal_debug.so --causal-async-stacks --no-lazy-async-stacks
+
+import 'dart:async';
+import 'dart:io';
+
+import 'utils.dart';
+
+Future<void> main(List<String> args) async {
+  // We won't have access to the debugging info file on Android.
+  if (Platform.isAndroid) return;
+
+  await doTestsCausal('async_causal_debug.so');
+}
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index 118ce14..a7df656 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -3,12 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
-import 'dart:math';
-import 'dart:typed_data';
 
 import 'package:path/path.dart' as path;
 import 'package:expect/expect.dart';
+import 'package:native_stack_traces/native_stack_traces.dart';
 
 // Test functions:
 
@@ -151,38 +151,85 @@
 
 // Helpers:
 
-void assertStack(List<String> expects, StackTrace stackTrace) {
-  final List<String> frames = stackTrace.toString().split('\n');
-  if (frames.length < expects.length) {
-    print('Actual stack:');
-    print(stackTrace.toString());
-    Expect.fail('Expected ${expects.length} frames, found ${frames.length}!');
+// We want lines that either start with a frame index or an async gap marker.
+final _lineRE = RegExp(r'^(?:#(?<number>\d+)|<asynchronous suspension>)');
+
+void assertStack(List<String> expects, StackTrace stackTrace,
+    [String debugInfoFilename]) async {
+  final original = await Stream.value(stackTrace.toString())
+      .transform(const LineSplitter())
+      .toList();
+  var frames = original;
+
+  // Use the DWARF stack decoder if we're running in --dwarf-stack-traces mode
+  // and in precompiled mode (otherwise --dwarf-stack-traces has no effect).
+  final decodeTrace = frames.first.startsWith('Warning:');
+  if (decodeTrace) {
+    Expect.isNotNull(debugInfoFilename);
+    final dwarf = Dwarf.fromFile(debugInfoFilename);
+    frames = await Stream.fromIterable(original)
+        .transform(DwarfStackTraceDecoder(dwarf))
+        .where(_lineRE.hasMatch)
+        .toList();
   }
+
+  void printFrameInformation() {
+    print('RegExps for expected stack:');
+    expects.forEach((s) => print('"${s}"'));
+    print('');
+    if (decodeTrace) {
+      print('Non-symbolic actual stack:');
+      original.forEach(print);
+      print('');
+    }
+    print('Actual stack:');
+    frames.forEach(print);
+    print('');
+  }
+
   for (int i = 0; i < expects.length; i++) {
     try {
-      Expect.isTrue(RegExp(expects[i]).hasMatch(frames[i]));
-    } on ExpectException catch (e) {
+      Expect.isTrue(i < frames.length,
+          'Expected at least ${expects.length} frames, found ${frames.length}');
+    } on ExpectException {
       // On failed expect, print full stack for reference.
-      print('Actual stack:');
-      print(stackTrace.toString());
+      printFrameInformation();
+      print('Expected line ${i + 1} to be ${expects[i]} but was missing');
+      rethrow;
+    }
+    try {
+      Expect.isTrue(RegExp(expects[i]).hasMatch(frames[i]));
+    } on ExpectException {
+      // On failed expect, print full stack for reference.
+      printFrameInformation();
       print('Expected line ${i + 1} to be `${expects[i]}` '
           'but was `${frames[i]}`');
       rethrow;
     }
   }
+
+  try {
+    Expect.equals(expects.length, frames.length);
+  } on ExpectException {
+    // On failed expect, print full stack for reference.
+    printFrameInformation();
+    rethrow;
+  }
 }
 
-Future<void> doTestAwait(Future f(), List<String> expectedStack) async {
+Future<void> doTestAwait(Future f(), List<String> expectedStack,
+    [String debugInfoFilename]) async {
   // Caller catches exception.
   try {
     await f();
     Expect.fail('No exception thrown!');
   } on String catch (e, s) {
-    assertStack(expectedStack, s);
+    assertStack(expectedStack, s, debugInfoFilename);
   }
 }
 
-Future<void> doTestAwaitThen(Future f(), List<String> expectedStack) async {
+Future<void> doTestAwaitThen(Future f(), List<String> expectedStack,
+    [String debugInfoFilename]) async {
   // Caller catches but a then is set.
   try {
     await f().then((e) {
@@ -190,18 +237,18 @@
     });
     Expect.fail('No exception thrown!');
   } on String catch (e, s) {
-    assertStack(expectedStack, s);
+    assertStack(expectedStack, s, debugInfoFilename);
   }
 }
 
-Future<void> doTestAwaitCatchError(
-    Future f(), List<String> expectedStack) async {
+Future<void> doTestAwaitCatchError(Future f(), List<String> expectedStack,
+    [String debugInfoFilename]) async {
   // Caller doesn't catch, but we have a catchError set.
   StackTrace stackTrace;
   await f().catchError((e, s) {
     stackTrace = s;
   });
-  assertStack(expectedStack, stackTrace);
+  assertStack(expectedStack, stackTrace, debugInfoFilename);
 }
 
 // ----
@@ -209,7 +256,7 @@
 // ----
 
 // For: --causal-async-stacks
-Future<void> doTestsCausal() async {
+Future<void> doTestsCausal([String debugInfoFilename]) async {
   final allYieldExpected = const <String>[
     r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
     r'^#1      allYield3 \(.*/utils.dart:39(:3)?\)$',
@@ -228,8 +275,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       allYield,
       allYieldExpected +
@@ -240,8 +287,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
       allYield,
       allYieldExpected +
@@ -252,8 +299,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
 
   final noYieldsExpected = const <String>[
     r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
@@ -271,8 +318,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       noYields,
       noYieldsExpected +
@@ -283,8 +330,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
       noYields,
       noYieldsExpected +
@@ -295,8 +342,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
 
   final mixedYieldsExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -316,8 +363,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       mixedYields,
       mixedYieldsExpected +
@@ -328,8 +375,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
       mixedYields,
       mixedYieldsExpected +
@@ -340,8 +387,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
 
   final syncSuffixExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -361,8 +408,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       syncSuffix,
       syncSuffixExpected +
@@ -373,8 +420,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
       syncSuffix,
       syncSuffixExpected +
@@ -385,8 +432,8 @@
             r'^#6      main ',
             r'^#7      _startIsolate.<anonymous closure> ',
             r'^#8      _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
 
   final nonAsyncNoStackExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -397,16 +444,18 @@
     r'^#4      Future._propagateToListeners.handleValueCallback ',
     r'^#5      Future._propagateToListeners ',
     r'^#6      Future._completeWithValue ',
-    r'^#7      Future._asyncComplete.<anonymous closure> ',
+    r'^#7      Future._asyncCompleteWithValue.<anonymous closure> ',
     r'^#8      _microtaskLoop ',
     r'^#9      _startMicrotaskLoop ',
     r'^#10     _runPendingImmediateCallback ',
     r'^#11     _RawReceivePortImpl._handleMessage ',
-    r'^$',
   ];
-  await doTestAwait(nonAsyncNoStack, nonAsyncNoStackExpected);
-  await doTestAwaitThen(nonAsyncNoStack, nonAsyncNoStackExpected);
-  await doTestAwaitCatchError(nonAsyncNoStack, nonAsyncNoStackExpected);
+  await doTestAwait(
+      nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
+  await doTestAwaitThen(
+      nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
+  await doTestAwaitCatchError(
+      nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
 
   final asyncStarThrowSyncExpected = const <String>[
     r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
@@ -424,8 +473,8 @@
             r'^#5      main \(.+\)$',
             r'^#6      _startIsolate.<anonymous closure> \(.+\)$',
             r'^#7      _RawReceivePortImpl._handleMessage \(.+\)$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       awaitEveryAsyncStarThrowSync,
       asyncStarThrowSyncExpected +
@@ -436,8 +485,8 @@
             r'^#5      main \(.+\)$',
             r'^#6      _startIsolate.<anonymous closure> \(.+\)$',
             r'^#7      _RawReceivePortImpl._handleMessage \(.+\)$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
       awaitEveryAsyncStarThrowSync,
       asyncStarThrowSyncExpected +
@@ -448,8 +497,8 @@
             r'^#5      main \(.+\)$',
             r'^#6      _startIsolate.<anonymous closure> \(.+\)$',
             r'^#7      _RawReceivePortImpl._handleMessage \(.+\)$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
 
   final asyncStarThrowAsyncExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -468,8 +517,8 @@
             r'^#5      main \(.+\)$',
             r'^#6      _startIsolate.<anonymous closure> \(.+\)$',
             r'^#7      _RawReceivePortImpl._handleMessage \(.+\)$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       awaitEveryAsyncStarThrowAsync,
       asyncStarThrowAsyncExpected +
@@ -480,8 +529,8 @@
             r'^#5      main \(.+\)$',
             r'^#6      _startIsolate.<anonymous closure> \(.+\)$',
             r'^#7      _RawReceivePortImpl._handleMessage \(.+\)$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
       awaitEveryAsyncStarThrowAsync,
       asyncStarThrowAsyncExpected +
@@ -492,8 +541,8 @@
             r'^#5      main \(.+\)$',
             r'^#6      _startIsolate.<anonymous closure> \(.+\)$',
             r'^#7      _RawReceivePortImpl._handleMessage \(.+\)$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
 
   final listenAsyncStartExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -512,8 +561,8 @@
             r'^#5      main \(.+\)$',
             r'^#6      _startIsolate.<anonymous closure> \(.+\)$',
             r'^#7      _RawReceivePortImpl._handleMessage \(.+\)$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       listenAsyncStarThrowAsync,
       listenAsyncStartExpected +
@@ -524,8 +573,8 @@
             r'^#5      main \(.+\)$',
             r'^#6      _startIsolate.<anonymous closure> \(.+\)$',
             r'^#7      _RawReceivePortImpl._handleMessage \(.+\)$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
       listenAsyncStarThrowAsync,
       listenAsyncStartExpected +
@@ -536,8 +585,8 @@
             r'^#5      main \(.+\)$',
             r'^#6      _startIsolate.<anonymous closure> \(.+\)$',
             r'^#7      _RawReceivePortImpl._handleMessage \(.+\)$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   final customErrorZoneExpected = const <String>[
     r'#0      throwSync \(.*/utils.dart:16(:3)?\)$',
     r'#1      allYield3 \(.*/utils.dart:39(:3)?\)$',
@@ -563,8 +612,8 @@
             r'#12     main \(.+\)$',
             r'#13     _startIsolate.<anonymous closure> ',
             r'#14     _RawReceivePortImpl._handleMessage ',
-            r'$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       customErrorZone,
       customErrorZoneExpected +
@@ -575,8 +624,8 @@
             r'#12     main \(.+\)$',
             r'#13     _startIsolate.<anonymous closure> ',
             r'#14     _RawReceivePortImpl._handleMessage ',
-            r'$'
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
       customErrorZone,
       customErrorZoneExpected +
@@ -587,12 +636,12 @@
             r'#12     main \(.+\)$',
             r'#13     _startIsolate.<anonymous closure> ',
             r'#14     _RawReceivePortImpl._handleMessage ',
-            r'$'
-          ]);
+          ],
+      debugInfoFilename);
 }
 
 // For: --no-causal-async-stacks --no-lazy-async-stacks
-Future<void> doTestsNoCausalNoLazy() async {
+Future<void> doTestsNoCausalNoLazy([String debugInfoFilename]) async {
   final allYieldExpected = const <String>[
     r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
     r'^#1      allYield3 \(.*/utils.dart:39(:3)?\)$',
@@ -606,11 +655,10 @@
     r'^#8      _startMicrotaskLoop ',
     r'^#9      _runPendingImmediateCallback ',
     r'^#10     _RawReceivePortImpl._handleMessage ',
-    r'^$',
   ];
-  await doTestAwait(allYield, allYieldExpected);
-  await doTestAwaitThen(allYield, allYieldExpected);
-  await doTestAwaitCatchError(allYield, allYieldExpected);
+  await doTestAwait(allYield, allYieldExpected, debugInfoFilename);
+  await doTestAwaitThen(allYield, allYieldExpected, debugInfoFilename);
+  await doTestAwaitCatchError(allYield, allYieldExpected, debugInfoFilename);
 
   final noYieldsExpected = const <String>[
     r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
@@ -673,8 +721,8 @@
             r'^#51     _startMicrotaskLoop ',
             r'^#52     _runPendingImmediateCallback ',
             r'^#53     _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       noYields,
       noYieldsExpected +
@@ -719,8 +767,8 @@
             r'^#46     _startMicrotaskLoop ',
             r'^#47     _runPendingImmediateCallback ',
             r'^#48     _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
       noYields,
       noYieldsExpected +
@@ -765,8 +813,8 @@
             r'^#46     _startMicrotaskLoop ',
             r'^#47     _runPendingImmediateCallback ',
             r'^#48     _RawReceivePortImpl._handleMessage ',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
 
   final mixedYieldsExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -780,11 +828,11 @@
     r'^#7      _startMicrotaskLoop ',
     r'^#8      _runPendingImmediateCallback ',
     r'^#9      _RawReceivePortImpl._handleMessage ',
-    r'^$',
   ];
-  await doTestAwait(mixedYields, mixedYieldsExpected);
-  await doTestAwaitThen(mixedYields, mixedYieldsExpected);
-  await doTestAwaitCatchError(mixedYields, mixedYieldsExpected);
+  await doTestAwait(mixedYields, mixedYieldsExpected, debugInfoFilename);
+  await doTestAwaitThen(mixedYields, mixedYieldsExpected, debugInfoFilename);
+  await doTestAwaitCatchError(
+      mixedYields, mixedYieldsExpected, debugInfoFilename);
 
   final syncSuffixExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -798,11 +846,11 @@
     r'^#7      _startMicrotaskLoop ',
     r'^#8      _runPendingImmediateCallback ',
     r'^#9      _RawReceivePortImpl._handleMessage ',
-    r'^$',
   ];
-  await doTestAwait(syncSuffix, syncSuffixExpected);
-  await doTestAwaitThen(syncSuffix, syncSuffixExpected);
-  await doTestAwaitCatchError(syncSuffix, syncSuffixExpected);
+  await doTestAwait(syncSuffix, syncSuffixExpected, debugInfoFilename);
+  await doTestAwaitThen(syncSuffix, syncSuffixExpected, debugInfoFilename);
+  await doTestAwaitCatchError(
+      syncSuffix, syncSuffixExpected, debugInfoFilename);
 
   final nonAsyncNoStackExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -816,11 +864,13 @@
     r'^#7      _startMicrotaskLoop ',
     r'^#8      _runPendingImmediateCallback ',
     r'^#9      _RawReceivePortImpl._handleMessage ',
-    r'^$',
   ];
-  await doTestAwait(nonAsyncNoStack, nonAsyncNoStackExpected);
-  await doTestAwaitThen(nonAsyncNoStack, nonAsyncNoStackExpected);
-  await doTestAwaitCatchError(nonAsyncNoStack, nonAsyncNoStackExpected);
+  await doTestAwait(
+      nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
+  await doTestAwaitThen(
+      nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
+  await doTestAwaitCatchError(
+      nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
 
   final asyncStarThrowSyncExpected = const <String>[
     r'^#0      throwSync \(.+/utils.dart:16(:3)?\)$',
@@ -835,13 +885,13 @@
     r'^#8      _startMicrotaskLoop \(.+\)$',
     r'^#9      _runPendingImmediateCallback \(.+\)$',
     r'^#10     _RawReceivePortImpl._handleMessage \(.+\)$',
-    r'^$',
   ];
-  await doTestAwait(awaitEveryAsyncStarThrowSync, asyncStarThrowSyncExpected);
-  await doTestAwaitThen(
-      awaitEveryAsyncStarThrowSync, asyncStarThrowSyncExpected);
-  await doTestAwaitCatchError(
-      awaitEveryAsyncStarThrowSync, asyncStarThrowSyncExpected);
+  await doTestAwait(awaitEveryAsyncStarThrowSync, asyncStarThrowSyncExpected,
+      debugInfoFilename);
+  await doTestAwaitThen(awaitEveryAsyncStarThrowSync,
+      asyncStarThrowSyncExpected, debugInfoFilename);
+  await doTestAwaitCatchError(awaitEveryAsyncStarThrowSync,
+      asyncStarThrowSyncExpected, debugInfoFilename);
 
   final asyncStarThrowAsyncExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -855,13 +905,13 @@
     r'^#7      _startMicrotaskLoop ',
     r'^#8      _runPendingImmediateCallback ',
     r'^#9      _RawReceivePortImpl._handleMessage ',
-    r'^$',
   ];
-  await doTestAwait(awaitEveryAsyncStarThrowAsync, asyncStarThrowAsyncExpected);
-  await doTestAwaitThen(
-      awaitEveryAsyncStarThrowAsync, asyncStarThrowAsyncExpected);
-  await doTestAwaitCatchError(
-      awaitEveryAsyncStarThrowAsync, asyncStarThrowAsyncExpected);
+  await doTestAwait(awaitEveryAsyncStarThrowAsync, asyncStarThrowAsyncExpected,
+      debugInfoFilename);
+  await doTestAwaitThen(awaitEveryAsyncStarThrowAsync,
+      asyncStarThrowAsyncExpected, debugInfoFilename);
+  await doTestAwaitCatchError(awaitEveryAsyncStarThrowAsync,
+      asyncStarThrowAsyncExpected, debugInfoFilename);
 
   final listenAsyncStartExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -875,12 +925,13 @@
     r'^#7      _startMicrotaskLoop ',
     r'^#8      _runPendingImmediateCallback ',
     r'^#9      _RawReceivePortImpl._handleMessage ',
-    r'^$',
   ];
-  await doTestAwait(listenAsyncStarThrowAsync, listenAsyncStartExpected);
-  await doTestAwaitThen(listenAsyncStarThrowAsync, listenAsyncStartExpected);
+  await doTestAwait(
+      listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
+  await doTestAwaitThen(
+      listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
   await doTestAwaitCatchError(
-      listenAsyncStarThrowAsync, listenAsyncStartExpected);
+      listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
 
   final customErrorZoneExpected = const <String>[
     r'#0      throwSync \(.*/utils.dart:16(:3)?\)$',
@@ -899,15 +950,17 @@
     r'#13     _startMicrotaskLoop ',
     r'#14     _runPendingImmediateCallback ',
     r'#15     _RawReceivePortImpl._handleMessage ',
-    r'$',
   ];
-  await doTestAwait(customErrorZone, customErrorZoneExpected);
-  await doTestAwaitThen(customErrorZone, customErrorZoneExpected);
-  await doTestAwaitCatchError(customErrorZone, customErrorZoneExpected);
+  await doTestAwait(
+      customErrorZone, customErrorZoneExpected, debugInfoFilename);
+  await doTestAwaitThen(
+      customErrorZone, customErrorZoneExpected, debugInfoFilename);
+  await doTestAwaitCatchError(
+      customErrorZone, customErrorZoneExpected, debugInfoFilename);
 }
 
 // For: --lazy-async-stacks
-Future<void> doTestsLazy() async {
+Future<void> doTestsLazy([String debugInfoFilename]) async {
   final allYieldExpected = const <String>[
     r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
     r'^#1      allYield3 \(.*/utils.dart:39(:3)?\)$',
@@ -927,22 +980,17 @@
             r'^<asynchronous suspension>$',
             r'^#6      main ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       allYield,
       allYieldExpected +
           const <String>[
             r'^#4      doTestAwaitThen.<anonymous closure> ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
-  await doTestAwaitCatchError(
-      allYield,
-      allYieldExpected +
-          const <String>[
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
+  await doTestAwaitCatchError(allYield, allYieldExpected, debugInfoFilename);
 
   final noYieldsExpected = const <String>[
     r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
@@ -959,8 +1007,8 @@
             r'^<asynchronous suspension>$',
             r'^#6      main ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       noYields,
       noYieldsExpected +
@@ -970,8 +1018,8 @@
             r'^<asynchronous suspension>$',
             r'^#6      main ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
       noYields,
       noYieldsExpected +
@@ -981,8 +1029,8 @@
             r'^<asynchronous suspension>$',
             r'^#6      main ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
 
   final mixedYieldsExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -1002,22 +1050,18 @@
             r'^<asynchronous suspension>$',
             r'^#5      main ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       mixedYields,
       mixedYieldsExpected +
           const <String>[
             r'^#3      doTestAwaitThen.<anonymous closure> ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
-      mixedYields,
-      mixedYieldsExpected +
-          const <String>[
-            r'^$',
-          ]);
+      mixedYields, mixedYieldsExpected, debugInfoFilename);
 
   final syncSuffixExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -1037,22 +1081,18 @@
             r'^<asynchronous suspension>$',
             r'^#5      main ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       syncSuffix,
       syncSuffixExpected +
           const <String>[
             r'^#3      doTestAwaitThen.<anonymous closure> ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
-      syncSuffix,
-      syncSuffixExpected +
-          const <String>[
-            r'^$',
-          ]);
+      syncSuffix, syncSuffixExpected, debugInfoFilename);
 
   final nonAsyncNoStackExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -1072,22 +1112,18 @@
             r'^<asynchronous suspension>$',
             r'^#5      main ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       nonAsyncNoStack,
       nonAsyncNoStackExpected +
           const <String>[
             r'^#3      doTestAwaitThen.<anonymous closure> ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitCatchError(
-      nonAsyncNoStack,
-      nonAsyncNoStackExpected +
-          const <String>[
-            r'^$',
-          ]);
+      nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
 
   final asyncStarThrowSyncExpected = const <String>[
     r'^#0      throwSync \(.+/utils.dart:16(:3)?\)$',
@@ -1106,22 +1142,18 @@
             r'^<asynchronous suspension>$',
             r'^#5      main ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       awaitEveryAsyncStarThrowSync,
       asyncStarThrowSyncExpected +
           const <String>[
             r'^#3      doTestAwaitThen.<anonymous closure> ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
-  await doTestAwaitCatchError(
-      awaitEveryAsyncStarThrowSync,
-      asyncStarThrowSyncExpected +
-          const <String>[
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
+  await doTestAwaitCatchError(awaitEveryAsyncStarThrowSync,
+      asyncStarThrowSyncExpected, debugInfoFilename);
 
   final asyncStarThrowAsyncExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -1141,22 +1173,18 @@
             r'^<asynchronous suspension>$',
             r'^#5      main ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
   await doTestAwaitThen(
       awaitEveryAsyncStarThrowAsync,
       asyncStarThrowAsyncExpected +
           const <String>[
             r'^#3      doTestAwaitThen.<anonymous closure> ',
             r'^<asynchronous suspension>$',
-            r'^$',
-          ]);
-  await doTestAwaitCatchError(
-      awaitEveryAsyncStarThrowAsync,
-      asyncStarThrowAsyncExpected +
-          const <String>[
-            r'^$',
-          ]);
+          ],
+      debugInfoFilename);
+  await doTestAwaitCatchError(awaitEveryAsyncStarThrowAsync,
+      asyncStarThrowAsyncExpected, debugInfoFilename);
 
   final listenAsyncStartExpected = const <String>[
     r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -1165,12 +1193,13 @@
     r'^<asynchronous suspension>$',
     r'^#2      listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
     r'^<asynchronous suspension>$',
-    r'^$',
   ];
-  await doTestAwait(listenAsyncStarThrowAsync, listenAsyncStartExpected);
-  await doTestAwaitThen(listenAsyncStarThrowAsync, listenAsyncStartExpected);
+  await doTestAwait(
+      listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
+  await doTestAwaitThen(
+      listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
   await doTestAwaitCatchError(
-      listenAsyncStarThrowAsync, listenAsyncStartExpected);
+      listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
 
   final customErrorZoneExpected = const <String>[
     r'#0      throwSync \(.*/utils.dart:16(:3)?\)$',
@@ -1182,9 +1211,11 @@
     r'<asynchronous suspension>$',
     r'#4      customErrorZone.<anonymous closure> \(.*/utils.dart:144(:5)?\)$',
     r'<asynchronous suspension>$',
-    r'^$',
   ];
-  await doTestAwait(customErrorZone, customErrorZoneExpected);
-  await doTestAwaitThen(customErrorZone, customErrorZoneExpected);
-  await doTestAwaitCatchError(customErrorZone, customErrorZoneExpected);
+  await doTestAwait(
+      customErrorZone, customErrorZoneExpected, debugInfoFilename);
+  await doTestAwaitThen(
+      customErrorZone, customErrorZoneExpected, debugInfoFilename);
+  await doTestAwaitCatchError(
+      customErrorZone, customErrorZoneExpected, debugInfoFilename);
 }
diff --git a/runtime/tests/vm/dart/sendandexit_test.dart b/runtime/tests/vm/dart/sendandexit_test.dart
new file mode 100644
index 0000000..cbc617e
--- /dev/null
+++ b/runtime/tests/vm/dart/sendandexit_test.dart
@@ -0,0 +1,85 @@
+// 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
+//
+// Validates functionality of sendAndExit.
+
+import 'dart:_internal' show sendAndExit;
+import 'dart:async';
+import 'dart:isolate';
+import 'dart:nativewrappers';
+
+import "package:expect/expect.dart";
+
+doNothingWorker(data) {}
+
+spawnWorker(worker, data) async {
+  Completer completer = Completer();
+  runZoned(() async {
+    final isolate = await Isolate.spawn(worker, [data]);
+    completer.complete(isolate);
+  }, onError: (e, st) => completer.complete(e));
+  return await completer.future;
+}
+
+verifyCantSendAnonymousClosure() async {
+  final result = await spawnWorker(doNothingWorker, () {});
+  Expect.equals(
+      "Invalid argument(s): Illegal argument in isolate message :"
+      " (object is a closure - Function '<anonymous closure>': static.)",
+      result.toString());
+}
+
+class NativeWrapperClass extends NativeFieldWrapperClass1 {}
+
+verifyCantSendNative() async {
+  final result = await spawnWorker(doNothingWorker, NativeWrapperClass());
+  Expect.isTrue(result.toString().startsWith("Invalid argument(s): "
+      "Illegal argument in isolate message : "
+      "(object extends NativeWrapper"));
+}
+
+verifyCantSendRegexp() async {
+  var receivePort = ReceivePort();
+  final result = await spawnWorker(doNothingWorker, receivePort);
+  Expect.equals(
+      "Invalid argument(s): Illegal argument in isolate message : "
+      "(object is a ReceivePort)",
+      result.toString());
+  receivePort.close();
+}
+
+class Message {
+  SendPort sendPort;
+  Function closure;
+
+  Message(this.sendPort, this.closure);
+}
+
+add(a, b) => a + b;
+
+worker(Message message) async {
+  final port = new ReceivePort();
+  final inbox = new StreamIterator<dynamic>(port);
+  message.sendPort.send(message.closure(2, 3));
+  port.close();
+}
+
+verifyCanSendStaticMethod() async {
+  final port = ReceivePort();
+  final inbox = StreamIterator<dynamic>(port);
+  final isolate = await Isolate.spawn(worker, Message(port.sendPort, add));
+
+  await inbox.moveNext();
+  Expect.equals(inbox.current, 5);
+  port.close();
+}
+
+main() async {
+  await verifyCantSendAnonymousClosure();
+  await verifyCantSendNative();
+  await verifyCantSendRegexp();
+  await verifyCanSendStaticMethod();
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 010b5c7..7011e5b 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -28,7 +28,10 @@
 dart/bytecode_with_ast_in_aot_test: SkipByDesign # The test doesn't know location of cross-platform gen_snapshot
 
 [ $builder_tag == obfuscated ]
-dart/causal_stacks/*: SkipByDesign # Asserts exact stacktrace output.
+dart/causal_stacks/async_throws_stack_lazy_test: SkipByDesign # Asserts exact stacktrace output.
+dart/causal_stacks/async_throws_stack_no_causal_test: SkipByDesign # Asserts exact stacktrace output.
+dart/causal_stacks/async_throws_stack_test: SkipByDesign # Asserts exact stacktrace output.
+dart/causal_stacks/sync_async_start_pkg_test_test: SkipByDesign # Asserts exact stacktrace output.
 
 [ $builder_tag == optimization_counter_threshold ]
 cc/*: Skip # Many tests want see unoptimized code running
diff --git a/runtime/vm/bitmap_test.cc b/runtime/vm/bitmap_test.cc
index e8f6418..2c7f3d9 100644
--- a/runtime/vm/bitmap_test.cc
+++ b/runtime/vm/bitmap_test.cc
@@ -16,7 +16,7 @@
 static const uint32_t kTestPcOffset = 0x4;
 static const intptr_t kTestSpillSlotBitCount = 0;
 
-static RawCompressedStackMaps* MapsFromBuilder(BitmapBuilder* bmap) {
+static CompressedStackMapsPtr MapsFromBuilder(BitmapBuilder* bmap) {
   CompressedStackMapsBuilder builder;
   builder.AddEntry(kTestPcOffset, bmap, kTestSpillSlotBitCount);
   return builder.Finalize();
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 67ff960..1065295 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -90,9 +90,9 @@
   ClassFinalizer::LoadClassMembers(cls);
 }
 
-static RawError* BootstrapFromKernel(Thread* thread,
-                                     const uint8_t* kernel_buffer,
-                                     intptr_t kernel_buffer_size) {
+static ErrorPtr BootstrapFromKernel(Thread* thread,
+                                    const uint8_t* kernel_buffer,
+                                    intptr_t kernel_buffer_size) {
   Zone* zone = thread->zone();
   const char* error = nullptr;
   std::unique_ptr<kernel::Program> program = kernel::Program::ReadFromBuffer(
@@ -140,8 +140,8 @@
   return Error::null();
 }
 
-RawError* Bootstrap::DoBootstrapping(const uint8_t* kernel_buffer,
-                                     intptr_t kernel_buffer_size) {
+ErrorPtr Bootstrap::DoBootstrapping(const uint8_t* kernel_buffer,
+                                    intptr_t kernel_buffer_size) {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   Zone* zone = thread->zone();
@@ -167,8 +167,8 @@
   return BootstrapFromKernel(thread, kernel_buffer, kernel_buffer_size);
 }
 #else
-RawError* Bootstrap::DoBootstrapping(const uint8_t* kernel_buffer,
-                                     intptr_t kernel_buffer_size) {
+ErrorPtr Bootstrap::DoBootstrapping(const uint8_t* kernel_buffer,
+                                    intptr_t kernel_buffer_size) {
   UNREACHABLE();
   return Error::null();
 }
diff --git a/runtime/vm/bootstrap.h b/runtime/vm/bootstrap.h
index 895f9d1..e9c3bd9 100644
--- a/runtime/vm/bootstrap.h
+++ b/runtime/vm/bootstrap.h
@@ -7,11 +7,11 @@
 
 #include "include/dart_api.h"
 #include "vm/allocation.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
 // Forward declarations.
-class RawError;
 namespace kernel {
 class Program;
 }
@@ -24,8 +24,8 @@
   // bootstrapping.
   // The caller of this function is responsible for managing the kernel
   // program's memory.
-  static RawError* DoBootstrapping(const uint8_t* kernel_buffer,
-                                   intptr_t kernel_buffer_size);
+  static ErrorPtr DoBootstrapping(const uint8_t* kernel_buffer,
+                                  intptr_t kernel_buffer_size);
 
   static void SetupNativeResolver();
   static bool IsBootstrapResolver(Dart_NativeEntryResolver resolver);
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 8f3b762..65e0dae 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -58,6 +58,7 @@
   V(SendPortImpl_get_id, 1)                                                    \
   V(SendPortImpl_get_hashcode, 1)                                              \
   V(SendPortImpl_sendInternal_, 2)                                             \
+  V(SendPortImpl_sendAndExitInternal_, 2)                                      \
   V(Smi_bitAndFromSmi, 2)                                                      \
   V(Smi_bitNegate, 1)                                                          \
   V(Smi_bitLength, 1)                                                          \
@@ -487,8 +488,8 @@
   static const uint8_t* Symbol(Dart_NativeFunction* nf);
 
 #define DECLARE_BOOTSTRAP_NATIVE(name, ignored)                                \
-  static RawObject* DN_##name(Thread* thread, Zone* zone,                      \
-                              NativeArguments* arguments);
+  static ObjectPtr DN_##name(Thread* thread, Zone* zone,                       \
+                             NativeArguments* arguments);
 
   BOOTSTRAP_NATIVE_LIST(DECLARE_BOOTSTRAP_NATIVE)
 #if !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index a53cf86..cfe2a4d 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -668,10 +668,10 @@
   }
 }
 
-RawAbstractType* ClassFinalizer::FinalizeType(const Class& cls,
-                                              const AbstractType& type,
-                                              FinalizationKind finalization,
-                                              PendingTypes* pending_types) {
+AbstractTypePtr ClassFinalizer::FinalizeType(const Class& cls,
+                                             const AbstractType& type,
+                                             FinalizationKind finalization,
+                                             PendingTypes* pending_types) {
   // Only the 'root' type of the graph can be canonicalized, after all depending
   // types have been bound checked.
   ASSERT((pending_types == NULL) || (finalization < kCanonicalize));
@@ -1186,7 +1186,7 @@
   }
 }
 
-RawError* ClassFinalizer::LoadClassMembers(const Class& cls) {
+ErrorPtr ClassFinalizer::LoadClassMembers(const Class& cls) {
   ASSERT(Thread::Current()->IsMutatorThread());
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
@@ -1474,21 +1474,21 @@
     return old_to_new_cids_[cid];
   }
 
-  void VisitObject(RawObject* obj) {
+  void VisitObject(ObjectPtr obj) {
     if (obj->IsClass()) {
-      RawClass* cls = Class::RawCast(obj);
+      ClassPtr cls = Class::RawCast(obj);
       cls->ptr()->id_ = Map(cls->ptr()->id_);
     } else if (obj->IsField()) {
-      RawField* field = Field::RawCast(obj);
+      FieldPtr field = Field::RawCast(obj);
       field->ptr()->guarded_cid_ = Map(field->ptr()->guarded_cid_);
       field->ptr()->is_nullable_ = Map(field->ptr()->is_nullable_);
     } else if (obj->IsTypeParameter()) {
-      RawTypeParameter* param = TypeParameter::RawCast(obj);
+      TypeParameterPtr param = TypeParameter::RawCast(obj);
       param->ptr()->parameterized_class_id_ =
           Map(param->ptr()->parameterized_class_id_);
     } else if (obj->IsType()) {
-      RawType* type = Type::RawCast(obj);
-      RawObject* id = type->ptr()->type_class_id_;
+      TypePtr type = Type::RawCast(obj);
+      ObjectPtr id = type->ptr()->type_class_id_;
       if (!id->IsHeapObject()) {
         type->ptr()->type_class_id_ =
             Smi::New(Map(Smi::Value(Smi::RawCast(id))));
@@ -1499,7 +1499,7 @@
       if (old_cid != new_cid) {
         // Don't touch objects that are unchanged. In particular, Instructions,
         // which are write-protected.
-        obj->SetClassId(new_cid);
+        obj->ptr()->SetClassId(new_cid);
       }
     }
   }
@@ -1558,30 +1558,30 @@
 // In the Dart VM heap the following instances directly use cids for the
 // computation of canonical hash codes:
 //
-//    * RawType (due to RawType::type_class_id_)
-//    * RawTypeParameter (due to RawTypeParameter::parameterized_class_id_)
+//    * RawType (due to TypeLayout::type_class_id_)
+//    * RawTypeParameter (due to TypeParameterLayout::parameterized_class_id_)
 //
 // The following instances use cids for the computation of canonical hash codes
 // indirectly:
 //
-//    * RawTypeRef (due to RawTypeRef::type_->type_class_id)
-//    * RawType (due to RawType::signature_'s result/parameter types)
+//    * RawTypeRef (due to TypeRefLayout::type_->type_class_id)
+//    * RawType (due to TypeLayout::signature_'s result/parameter types)
 //    * RawTypeArguments (due to type references)
 //    * RawInstance (due to instance fields)
 //    * RawArray (due to type arguments & array entries)
 //
 // Caching of the canonical hash codes happens for:
 //
-//    * RawType::hash_
-//    * RawTypeParameter::hash_
-//    * RawTypeArguments::hash_
+//    * TypeLayout::hash_
+//    * TypeParameterLayout::hash_
+//    * TypeArgumentsLayout::hash_
 //    * RawInstance (weak table)
 //    * RawArray (weak table)
 //
 // No caching of canonical hash codes (i.e. it gets re-computed every time)
 // happens for:
 //
-//    * RawTypeRef (computed via RawTypeRef::type_->type_class_id)
+//    * RawTypeRef (computed via TypeRefLayout::type_->type_class_id)
 //
 // Usages of canonical hash codes are:
 //
@@ -1596,7 +1596,7 @@
         type_(Type::Handle(zone)),
         type_args_(TypeArguments::Handle(zone)) {}
 
-  void VisitObject(RawObject* obj) {
+  void VisitObject(ObjectPtr obj) {
     if (obj->IsTypeParameter()) {
       type_param_ ^= obj;
       type_param_.SetHash(0);
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index f580aaf..b970fa1 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -27,7 +27,7 @@
 
   // Finalize given type while parsing class cls.
   // Also canonicalize and bound check type if applicable.
-  static RawAbstractType* FinalizeType(
+  static AbstractTypePtr FinalizeType(
       const Class& cls,
       const AbstractType& type,
       FinalizationKind finalization = kCanonicalize,
@@ -69,7 +69,7 @@
   // and fields of the class.
   //
   // Returns Error::null() if there is no loading error.
-  static RawError* LoadClassMembers(const Class& cls);
+  static ErrorPtr LoadClassMembers(const Class& cls);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // Verify that the classes have been properly prefinalized. This is
diff --git a/runtime/vm/class_finalizer_test.cc b/runtime/vm/class_finalizer_test.cc
index 7768c44..29a708a 100644
--- a/runtime/vm/class_finalizer_test.cc
+++ b/runtime/vm/class_finalizer_test.cc
@@ -9,7 +9,7 @@
 
 namespace dart {
 
-static RawClass* CreateTestClass(const char* name) {
+static ClassPtr CreateTestClass(const char* name) {
   const String& class_name =
       String::Handle(Symbols::New(Thread::Current(), name));
   const Script& script = Script::Handle();
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 74a8677..c458acb 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -47,7 +47,6 @@
     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)
@@ -72,7 +71,7 @@
   NOT_IN_PRODUCT(free(trace_allocation_table_.load()));
 }
 
-void ClassTable::set_table(RawClass** table) {
+void ClassTable::set_table(ClassPtr* table) {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != nullptr);
   table_.store(table);
@@ -83,7 +82,7 @@
     : top_(kNumPredefinedCids),
       capacity_(0),
       table_(NULL),
-      old_class_tables_(new MallocGrowableArray<RawClass**>()),
+      old_class_tables_(new MallocGrowableArray<ClassPtr*>()),
       shared_class_table_(shared_class_table) {
   if (Dart::vm_isolate() == NULL) {
     ASSERT(kInitialCapacity >= kNumPredefinedCids);
@@ -92,14 +91,14 @@
     // Don't use set_table because caller is supposed to set up isolates
     // cached copy when constructing ClassTable. Isolate::Current might not
     // be available at this point yet.
-    table_.store(static_cast<RawClass**>(calloc(capacity_, sizeof(RawClass*))));
+    table_.store(static_cast<ClassPtr*>(calloc(capacity_, sizeof(ClassPtr))));
   } 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.
-    RawClass** table =
-        static_cast<RawClass**>(calloc(capacity_, sizeof(RawClass*)));
+    ClassPtr* table =
+        static_cast<ClassPtr*>(calloc(capacity_, sizeof(ClassPtr)));
     // 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++) {
@@ -110,7 +109,6 @@
     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);
     // Don't use set_table because caller is supposed to set up isolates
     // cached copy when constructing ClassTable. Isolate::Current might not
     // be available at this point yet.
@@ -126,7 +124,7 @@
   free(table_.load());
 }
 
-void ClassTable::AddOldTable(RawClass** old_class_table) {
+void ClassTable::AddOldTable(ClassPtr* old_class_table) {
   ASSERT(Thread::Current()->IsMutatorThread());
   old_class_tables_->Add(old_class_table);
 }
@@ -226,8 +224,8 @@
   ASSERT(new_capacity > capacity_);
 
   auto old_table = table_.load();
-  auto new_table = static_cast<RawClass**>(
-      malloc(new_capacity * sizeof(RawClass*)));  // NOLINT
+  auto new_table = static_cast<ClassPtr*>(
+      malloc(new_capacity * sizeof(ClassPtr)));  // NOLINT
   intptr_t i;
   for (i = 0; i < capacity_; i++) {
     // Don't use memmove, which changes this from a relaxed atomic operation
@@ -337,9 +335,9 @@
 void ClassTable::Remap(intptr_t* old_to_new_cid) {
   ASSERT(Thread::Current()->IsAtSafepoint());
   const intptr_t num_cids = NumCids();
-  std::unique_ptr<RawClass*[]> cls_by_old_cid(new RawClass*[num_cids]);
+  std::unique_ptr<ClassPtr[]> cls_by_old_cid(new ClassPtr[num_cids]);
   auto* table = table_.load();
-  memmove(cls_by_old_cid.get(), table, sizeof(RawClass*) * num_cids);
+  memmove(cls_by_old_cid.get(), table, sizeof(ClassPtr) * num_cids);
   for (intptr_t i = 0; i < num_cids; i++) {
     table[old_to_new_cid[i]] = cls_by_old_cid[i];
   }
@@ -374,8 +372,8 @@
   visitor->set_gc_root_type("class table");
   if (top_ != 0) {
     auto* table = table_.load();
-    RawObject** from = reinterpret_cast<RawObject**>(&table[0]);
-    RawObject** to = reinterpret_cast<RawObject**>(&table[top_ - 1]);
+    ObjectPtr* from = reinterpret_cast<ObjectPtr*>(&table[0]);
+    ObjectPtr* to = reinterpret_cast<ObjectPtr*>(&table[top_ - 1]);
     visitor->VisitPointers(from, to);
   }
   visitor->clear_gc_root_type();
@@ -415,14 +413,14 @@
       continue;
     }
     cls = At(i);
-    if (cls.raw() != reinterpret_cast<RawClass*>(0)) {
+    if (cls.raw() != nullptr) {
       name = cls.Name();
       OS::PrintErr("%" Pd ": %s\n", i, name.ToCString());
     }
   }
 }
 
-void ClassTable::SetAt(intptr_t index, RawClass* raw_cls) {
+void ClassTable::SetAt(intptr_t index, ClassPtr raw_cls) {
   // This is called by snapshot reader and class finalizer.
   ASSERT(index < capacity_);
   const intptr_t size =
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index 510927a..6bb42d2 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -15,6 +15,7 @@
 #include "vm/class_id.h"
 #include "vm/flags.h"
 #include "vm/globals.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
@@ -30,7 +31,6 @@
 template <typename T>
 class MallocGrowableArray;
 class ObjectPointerVisitor;
-class RawClass;
 
 // Wraps a 64-bit integer to represent the bitmap of unboxed fields
 // stored in the shared class table.
@@ -258,12 +258,12 @@
 
   SharedClassTable* shared_class_table() const { return shared_class_table_; }
 
-  void CopyBeforeHotReload(RawClass*** copy, intptr_t* copy_num_cids) {
+  void CopyBeforeHotReload(ClassPtr** copy, intptr_t* copy_num_cids) {
     // The [IsolateReloadContext] will need to maintain a copy of the old class
     // table until instances have been morphed.
     const intptr_t num_cids = NumCids();
-    const intptr_t bytes = sizeof(RawClass*) * num_cids;
-    auto class_table = static_cast<RawClass**>(malloc(bytes));
+    const intptr_t bytes = sizeof(ClassPtr) * num_cids;
+    auto class_table = static_cast<ClassPtr*>(malloc(bytes));
     auto table = table_.load();
     for (intptr_t i = 0; i < num_cids; i++) {
       // Don't use memmove, which changes this from a relaxed atomic operation
@@ -282,7 +282,7 @@
     // here).
   }
 
-  void ResetAfterHotReload(RawClass** old_table,
+  void ResetAfterHotReload(ClassPtr* old_table,
                            intptr_t num_old_cids,
                            bool is_rollback) {
     // The [IsolateReloadContext] is no longer source-of-truth for GC after we
@@ -307,7 +307,7 @@
   }
 
   // Thread-safe.
-  RawClass* At(intptr_t index) const {
+  ClassPtr At(intptr_t index) const {
     ASSERT(IsValidIndex(index));
     return table_.load()[index];
   }
@@ -316,7 +316,7 @@
     return shared_class_table_->SizeAt(index);
   }
 
-  void SetAt(intptr_t index, RawClass* raw_cls);
+  void SetAt(intptr_t index, ClassPtr raw_cls);
 
   bool IsValidIndex(intptr_t index) const {
     return shared_class_table_->IsValidIndex(index);
@@ -357,7 +357,7 @@
 
 #ifndef PRODUCT
   // Describes layout of heap stats for code generation. See offset_extractor.cc
-  struct ArrayLayout {
+  struct ArrayTraits {
     static intptr_t elements_start_offset() { return 0; }
 
     static constexpr intptr_t kElementSize = sizeof(uint8_t);
@@ -387,20 +387,20 @@
   static const int kInitialCapacity = SharedClassTable::kInitialCapacity;
   static const int kCapacityIncrement = SharedClassTable::kCapacityIncrement;
 
-  void AddOldTable(RawClass** old_table);
+  void AddOldTable(ClassPtr* old_table);
 
   void Grow(intptr_t index);
 
-  RawClass** table() { return table_.load(); }
-  void set_table(RawClass** table);
+  ClassPtr* table() { return table_.load(); }
+  void set_table(ClassPtr* table);
 
   intptr_t top_;
   intptr_t capacity_;
 
   // Copy-on-write is used for table_, with old copies stored in
   // old_class_tables_.
-  AcqRelAtomic<RawClass**> table_;
-  MallocGrowableArray<RawClass**>* old_class_tables_;
+  AcqRelAtomic<ClassPtr*> table_;
+  MallocGrowableArray<ClassPtr*>* old_class_tables_;
   SharedClassTable* shared_class_table_;
 
   DISALLOW_COPY_AND_ASSIGN(ClassTable);
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 8eca9ce..98558ee 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -54,7 +54,7 @@
 
 static void RelocateCodeObjects(
     bool is_vm,
-    GrowableArray<RawCode*>* code_objects,
+    GrowableArray<CodePtr>* code_objects,
     GrowableArray<ImageWriterCommand>* image_writer_commands) {
   auto thread = Thread::Current();
   auto isolate = is_vm ? Dart::vm_isolate() : thread->isolate();
@@ -63,48 +63,48 @@
   CodeRelocator::Relocate(thread, code_objects, image_writer_commands, is_vm);
 }
 
-class RawCodeKeyValueTrait {
+class CodePtrKeyValueTrait {
  public:
   // Typedefs needed for the DirectChainedHashMap template.
-  typedef const RawCode* Key;
-  typedef const RawCode* Value;
-  typedef const RawCode* Pair;
+  typedef const CodePtr Key;
+  typedef const CodePtr Value;
+  typedef CodePtr Pair;
 
   static Key KeyOf(Pair kv) { return kv; }
   static Value ValueOf(Pair kv) { return kv; }
   static inline intptr_t Hashcode(Key key) {
-    return reinterpret_cast<intptr_t>(key);
+    return static_cast<intptr_t>(key);
   }
 
   static inline bool IsKeyEqual(Pair pair, Key key) { return pair == key; }
 };
 
-typedef DirectChainedHashMap<RawCodeKeyValueTrait> RawCodeSet;
+typedef DirectChainedHashMap<CodePtrKeyValueTrait> RawCodeSet;
 
 #endif  // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
 
-static RawObject* AllocateUninitialized(PageSpace* old_space, intptr_t size) {
+static ObjectPtr AllocateUninitialized(PageSpace* old_space, intptr_t size) {
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   uword address = old_space->TryAllocateDataBumpLocked(size);
   if (address == 0) {
     OUT_OF_MEMORY();
   }
-  return RawObject::FromAddr(address);
+  return ObjectLayout::FromAddr(address);
 }
 
-void Deserializer::InitializeHeader(RawObject* raw,
+void Deserializer::InitializeHeader(ObjectPtr raw,
                                     intptr_t class_id,
                                     intptr_t size,
                                     bool is_canonical) {
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   uint32_t tags = 0;
-  tags = RawObject::ClassIdTag::update(class_id, tags);
-  tags = RawObject::SizeTag::update(size, tags);
-  tags = RawObject::CanonicalBit::update(is_canonical, tags);
-  tags = RawObject::OldBit::update(true, tags);
-  tags = RawObject::OldAndNotMarkedBit::update(true, tags);
-  tags = RawObject::OldAndNotRememberedBit::update(true, tags);
-  tags = RawObject::NewBit::update(false, tags);
+  tags = ObjectLayout::ClassIdTag::update(class_id, tags);
+  tags = ObjectLayout::SizeTag::update(size, tags);
+  tags = ObjectLayout::CanonicalBit::update(is_canonical, tags);
+  tags = ObjectLayout::OldBit::update(true, tags);
+  tags = ObjectLayout::OldAndNotMarkedBit::update(true, tags);
+  tags = ObjectLayout::OldAndNotRememberedBit::update(true, tags);
+  tags = ObjectLayout::NewBit::update(false, tags);
   raw->ptr()->tags_ = tags;
 #if defined(HASH_IN_OBJECT_HEADER)
   raw->ptr()->hash_ = 0;
@@ -152,8 +152,8 @@
         objects_(num_cids) {}
   ~ClassSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawClass* cls = Class::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ClassPtr cls = Class::RawCast(object);
     intptr_t class_id = cls->ptr()->id_;
 
     // Classes expected to be dropped by the precompiler should not be traced.
@@ -175,7 +175,7 @@
     intptr_t count = predefined_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawClass* cls = predefined_[i];
+      ClassPtr cls = predefined_[i];
       s->AssignRef(cls);
       AutoTraceObject(cls);
       intptr_t class_id = cls->ptr()->id_;
@@ -184,7 +184,7 @@
     count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawClass* cls = objects_[i];
+      ClassPtr cls = objects_[i];
       s->AssignRef(cls);
     }
   }
@@ -200,7 +200,7 @@
     }
   }
 
-  void WriteClass(Serializer* s, RawClass* cls) {
+  void WriteClass(Serializer* s, ClassPtr cls) {
     AutoTraceObjectName(cls, cls->ptr()->name_);
     WriteFromTo(cls);
     intptr_t class_id = cls->ptr()->id_;
@@ -231,8 +231,8 @@
   }
 
  private:
-  GrowableArray<RawClass*> predefined_;
-  GrowableArray<RawClass*> objects_;
+  GrowableArray<ClassPtr> predefined_;
+  GrowableArray<ClassPtr> objects_;
 
   UnboxedFieldBitmap CalculateTargetUnboxedFieldsBitmap(Serializer* s,
                                                         intptr_t class_id) {
@@ -267,7 +267,7 @@
     return unboxed_fields_bitmap;
   }
 
-  bool RequireLegacyErasureOfConstants(RawClass* cls) {
+  bool RequireLegacyErasureOfConstants(ClassPtr cls) {
     // Do not generate a core snapshot containing constants that would require
     // a legacy erasure of their types if loaded in an isolate running in weak
     // mode.
@@ -296,8 +296,8 @@
     for (intptr_t i = 0; i < count; i++) {
       intptr_t class_id = d->ReadCid();
       ASSERT(table->HasValidClassAt(class_id));
-      RawClass* cls = table->At(class_id);
-      ASSERT(cls != NULL);
+      ClassPtr cls = table->At(class_id);
+      ASSERT(cls != nullptr);
       d->AssignRef(cls);
     }
     predefined_stop_index_ = d->next_index();
@@ -315,7 +315,7 @@
 
     for (intptr_t id = predefined_start_index_; id < predefined_stop_index_;
          id++) {
-      RawClass* cls = reinterpret_cast<RawClass*>(d->Ref(id));
+      ClassPtr cls = static_cast<ClassPtr>(d->Ref(id));
       ReadFromTo(cls);
       intptr_t class_id = d->ReadCid();
       cls->ptr()->id_ = class_id;
@@ -358,7 +358,7 @@
 
     auto shared_class_table = d->isolate()->group()->shared_class_table();
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawClass* cls = reinterpret_cast<RawClass*>(d->Ref(id));
+      ClassPtr cls = static_cast<ClassPtr>(d->Ref(id));
       Deserializer::InitializeHeader(cls, kClassCid, Class::InstanceSize());
       ReadFromTo(cls);
 
@@ -410,8 +410,8 @@
   TypeArgumentsSerializationCluster() : SerializationCluster("TypeArguments") {}
   ~TypeArgumentsSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawTypeArguments* type_args = TypeArguments::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    TypeArgumentsPtr type_args = TypeArguments::RawCast(object);
     objects_.Add(type_args);
 
     s->Push(type_args->ptr()->instantiations_);
@@ -426,7 +426,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawTypeArguments* type_args = objects_[i];
+      TypeArgumentsPtr type_args = objects_[i];
       s->AssignRef(type_args);
       AutoTraceObject(type_args);
       const intptr_t length = Smi::Value(type_args->ptr()->length_);
@@ -437,11 +437,11 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawTypeArguments* type_args = objects_[i];
+      TypeArgumentsPtr type_args = objects_[i];
       AutoTraceObject(type_args);
       const intptr_t length = Smi::Value(type_args->ptr()->length_);
       s->WriteUnsigned(length);
-      s->Write<bool>(type_args->IsCanonical());
+      s->Write<bool>(type_args->ptr()->IsCanonical());
       intptr_t hash = Smi::Value(type_args->ptr()->hash_);
       s->Write<int32_t>(hash);
       const intptr_t nullability = Smi::Value(type_args->ptr()->nullability_);
@@ -454,7 +454,7 @@
   }
 
  private:
-  GrowableArray<RawTypeArguments*> objects_;
+  GrowableArray<TypeArgumentsPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -477,8 +477,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawTypeArguments* type_args =
-          reinterpret_cast<RawTypeArguments*>(d->Ref(id));
+      TypeArgumentsPtr type_args = static_cast<TypeArgumentsPtr>(d->Ref(id));
       const intptr_t length = d->ReadUnsigned();
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(type_args, kTypeArgumentsCid,
@@ -487,11 +486,10 @@
       type_args->ptr()->length_ = Smi::New(length);
       type_args->ptr()->hash_ = Smi::New(d->Read<int32_t>());
       type_args->ptr()->nullability_ = Smi::New(d->ReadUnsigned());
-      type_args->ptr()->instantiations_ =
-          reinterpret_cast<RawArray*>(d->ReadRef());
+      type_args->ptr()->instantiations_ = static_cast<ArrayPtr>(d->ReadRef());
       for (intptr_t j = 0; j < length; j++) {
         type_args->ptr()->types()[j] =
-            reinterpret_cast<RawAbstractType*>(d->ReadRef());
+            static_cast<AbstractTypePtr>(d->ReadRef());
       }
     }
   }
@@ -503,8 +501,8 @@
   PatchClassSerializationCluster() : SerializationCluster("PatchClass") {}
   ~PatchClassSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawPatchClass* cls = PatchClass::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    PatchClassPtr cls = PatchClass::RawCast(object);
     objects_.Add(cls);
     PushFromTo(cls);
   }
@@ -514,7 +512,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawPatchClass* cls = objects_[i];
+      PatchClassPtr cls = objects_[i];
       s->AssignRef(cls);
     }
   }
@@ -522,7 +520,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawPatchClass* cls = objects_[i];
+      PatchClassPtr cls = objects_[i];
       AutoTraceObject(cls);
       WriteFromTo(cls);
       if (s->kind() != Snapshot::kFullAOT) {
@@ -532,7 +530,7 @@
   }
 
  private:
-  GrowableArray<RawPatchClass*> objects_;
+  GrowableArray<PatchClassPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -554,7 +552,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawPatchClass* cls = reinterpret_cast<RawPatchClass*>(d->Ref(id));
+      PatchClassPtr cls = static_cast<PatchClassPtr>(d->Ref(id));
       Deserializer::InitializeHeader(cls, kPatchClassCid,
                                      PatchClass::InstanceSize());
       ReadFromTo(cls);
@@ -573,9 +571,9 @@
   FunctionSerializationCluster() : SerializationCluster("Function") {}
   ~FunctionSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
+  void Trace(Serializer* s, ObjectPtr object) {
     Snapshot::Kind kind = s->kind();
-    RawFunction* func = Function::RawCast(object);
+    FunctionPtr func = Function::RawCast(object);
     objects_.Add(func);
 
     PushFromTo(func);
@@ -596,7 +594,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawFunction* func = objects_[i];
+      FunctionPtr func = objects_[i];
       s->AssignRef(func);
     }
   }
@@ -605,7 +603,7 @@
     Snapshot::Kind kind = s->kind();
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawFunction* func = objects_[i];
+      FunctionPtr func = objects_[i];
       AutoTraceObjectName(func, func->ptr()->name_);
       WriteFromTo(func);
       if (kind == Snapshot::kFull) {
@@ -631,7 +629,7 @@
   }
 
  private:
-  GrowableArray<RawFunction*> objects_;
+  GrowableArray<FunctionPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -654,23 +652,23 @@
     Snapshot::Kind kind = d->kind();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawFunction* func = reinterpret_cast<RawFunction*>(d->Ref(id));
+      FunctionPtr func = static_cast<FunctionPtr>(d->Ref(id));
       Deserializer::InitializeHeader(func, kFunctionCid,
                                      Function::InstanceSize());
       ReadFromTo(func);
 
       if (kind == Snapshot::kFull) {
         NOT_IN_PRECOMPILED(func->ptr()->bytecode_ =
-                               reinterpret_cast<RawBytecode*>(d->ReadRef()));
+                               static_cast<BytecodePtr>(d->ReadRef()));
       } else if (kind == Snapshot::kFullAOT) {
-        func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef());
+        func->ptr()->code_ = static_cast<CodePtr>(d->ReadRef());
       } else if (kind == Snapshot::kFullJIT) {
         NOT_IN_PRECOMPILED(func->ptr()->unoptimized_code_ =
-                               reinterpret_cast<RawCode*>(d->ReadRef()));
+                               static_cast<CodePtr>(d->ReadRef()));
         NOT_IN_PRECOMPILED(func->ptr()->bytecode_ =
-                               reinterpret_cast<RawBytecode*>(d->ReadRef()));
-        func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef());
-        func->ptr()->ic_data_array_ = reinterpret_cast<RawArray*>(d->ReadRef());
+                               static_cast<BytecodePtr>(d->ReadRef()));
+        func->ptr()->code_ = static_cast<CodePtr>(d->ReadRef());
+        func->ptr()->ic_data_array_ = static_cast<ArrayPtr>(d->ReadRef());
       }
 
 #if defined(DEBUG)
@@ -746,8 +744,8 @@
   ClosureDataSerializationCluster() : SerializationCluster("ClosureData") {}
   ~ClosureDataSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawClosureData* data = ClosureData::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ClosureDataPtr data = ClosureData::RawCast(object);
     objects_.Add(data);
 
     if (s->kind() != Snapshot::kFullAOT) {
@@ -763,7 +761,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawClosureData* data = objects_[i];
+      ClosureDataPtr data = objects_[i];
       s->AssignRef(data);
     }
   }
@@ -771,7 +769,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawClosureData* data = objects_[i];
+      ClosureDataPtr data = objects_[i];
       AutoTraceObject(data);
       if (s->kind() != Snapshot::kFullAOT) {
         WriteField(data, context_scope_);
@@ -783,7 +781,7 @@
   }
 
  private:
-  GrowableArray<RawClosureData*> objects_;
+  GrowableArray<ClosureDataPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -805,18 +803,18 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawClosureData* data = reinterpret_cast<RawClosureData*>(d->Ref(id));
+      ClosureDataPtr data = static_cast<ClosureDataPtr>(d->Ref(id));
       Deserializer::InitializeHeader(data, kClosureDataCid,
                                      ClosureData::InstanceSize());
       if (d->kind() == Snapshot::kFullAOT) {
         data->ptr()->context_scope_ = ContextScope::null();
       } else {
         data->ptr()->context_scope_ =
-            static_cast<RawContextScope*>(d->ReadRef());
+            static_cast<ContextScopePtr>(d->ReadRef());
       }
-      data->ptr()->parent_function_ = static_cast<RawFunction*>(d->ReadRef());
-      data->ptr()->signature_type_ = static_cast<RawType*>(d->ReadRef());
-      data->ptr()->closure_ = static_cast<RawInstance*>(d->ReadRef());
+      data->ptr()->parent_function_ = static_cast<FunctionPtr>(d->ReadRef());
+      data->ptr()->signature_type_ = static_cast<TypePtr>(d->ReadRef());
+      data->ptr()->closure_ = static_cast<InstancePtr>(d->ReadRef());
     }
   }
 };
@@ -827,8 +825,8 @@
   SignatureDataSerializationCluster() : SerializationCluster("SignatureData") {}
   ~SignatureDataSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawSignatureData* data = SignatureData::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    SignatureDataPtr data = SignatureData::RawCast(object);
     objects_.Add(data);
     PushFromTo(data);
   }
@@ -838,7 +836,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawSignatureData* data = objects_[i];
+      SignatureDataPtr data = objects_[i];
       s->AssignRef(data);
     }
   }
@@ -846,14 +844,14 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawSignatureData* data = objects_[i];
+      SignatureDataPtr data = objects_[i];
       AutoTraceObject(data);
       WriteFromTo(data);
     }
   }
 
  private:
-  GrowableArray<RawSignatureData*> objects_;
+  GrowableArray<SignatureDataPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -875,7 +873,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawSignatureData* data = reinterpret_cast<RawSignatureData*>(d->Ref(id));
+      SignatureDataPtr data = static_cast<SignatureDataPtr>(d->Ref(id));
       Deserializer::InitializeHeader(data, kSignatureDataCid,
                                      SignatureData::InstanceSize());
       ReadFromTo(data);
@@ -890,8 +888,8 @@
       : SerializationCluster("FfiTrampolineData") {}
   ~FfiTrampolineDataSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawFfiTrampolineData* data = FfiTrampolineData::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    FfiTrampolineDataPtr data = FfiTrampolineData::RawCast(object);
     objects_.Add(data);
     PushFromTo(data);
   }
@@ -908,7 +906,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawFfiTrampolineData* const data = objects_[i];
+      FfiTrampolineDataPtr const data = objects_[i];
       AutoTraceObject(data);
       WriteFromTo(data);
 
@@ -922,7 +920,7 @@
   }
 
  private:
-  GrowableArray<RawFfiTrampolineData*> objects_;
+  GrowableArray<FfiTrampolineDataPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -944,8 +942,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawFfiTrampolineData* data =
-          reinterpret_cast<RawFfiTrampolineData*>(d->Ref(id));
+      FfiTrampolineDataPtr data = static_cast<FfiTrampolineDataPtr>(d->Ref(id));
       Deserializer::InitializeHeader(data, kFfiTrampolineDataCid,
                                      FfiTrampolineData::InstanceSize());
       ReadFromTo(data);
@@ -962,8 +959,8 @@
       : SerializationCluster("RedirectionData") {}
   ~RedirectionDataSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawRedirectionData* data = RedirectionData::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    RedirectionDataPtr data = RedirectionData::RawCast(object);
     objects_.Add(data);
     PushFromTo(data);
   }
@@ -973,7 +970,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawRedirectionData* data = objects_[i];
+      RedirectionDataPtr data = objects_[i];
       s->AssignRef(data);
     }
   }
@@ -981,14 +978,14 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawRedirectionData* data = objects_[i];
+      RedirectionDataPtr data = objects_[i];
       AutoTraceObject(data);
       WriteFromTo(data);
     }
   }
 
  private:
-  GrowableArray<RawRedirectionData*> objects_;
+  GrowableArray<RedirectionDataPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -1010,8 +1007,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawRedirectionData* data =
-          reinterpret_cast<RawRedirectionData*>(d->Ref(id));
+      RedirectionDataPtr data = static_cast<RedirectionDataPtr>(d->Ref(id));
       Deserializer::InitializeHeader(data, kRedirectionDataCid,
                                      RedirectionData::InstanceSize());
       ReadFromTo(data);
@@ -1025,8 +1021,8 @@
   FieldSerializationCluster() : SerializationCluster("Field") {}
   ~FieldSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawField* field = Field::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    FieldPtr field = Field::RawCast(object);
     objects_.Add(field);
 
     Snapshot::Kind kind = s->kind();
@@ -1071,7 +1067,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawField* field = objects_[i];
+      FieldPtr field = objects_[i];
       s->AssignRef(field);
     }
   }
@@ -1080,7 +1076,7 @@
     Snapshot::Kind kind = s->kind();
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawField* field = objects_[i];
+      FieldPtr field = objects_[i];
       AutoTraceObjectName(field, field->ptr()->name_);
 
       WriteField(field, name_);
@@ -1135,7 +1131,7 @@
   }
 
  private:
-  GrowableArray<RawField*> objects_;
+  GrowableArray<FieldPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -1158,7 +1154,7 @@
     Snapshot::Kind kind = d->kind();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawField* field = reinterpret_cast<RawField*>(d->Ref(id));
+      FieldPtr field = static_cast<FieldPtr>(d->Ref(id));
       Deserializer::InitializeHeader(field, kFieldCid, Field::InstanceSize());
       ReadFromTo(field);
       if (kind != Snapshot::kFullAOT) {
@@ -1173,11 +1169,11 @@
       }
       field->ptr()->kind_bits_ = d->Read<uint16_t>();
 
-      RawObject* value_or_offset = d->ReadRef();
+      ObjectPtr value_or_offset = d->ReadRef();
       if (Field::StaticBit::decode(field->ptr()->kind_bits_)) {
         intptr_t field_id = d->ReadUnsigned();
-        d->field_table()->SetAt(
-            field_id, reinterpret_cast<RawInstance*>(value_or_offset));
+        d->field_table()->SetAt(field_id,
+                                static_cast<InstancePtr>(value_or_offset));
         field->ptr()->host_offset_or_field_id_ = field_id;
       } else {
         field->ptr()->host_offset_or_field_id_ =
@@ -1221,8 +1217,8 @@
   ScriptSerializationCluster() : SerializationCluster("Script") {}
   ~ScriptSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawScript* script = Script::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ScriptPtr script = Script::RawCast(object);
     objects_.Add(script);
     PushFromTo(script);
   }
@@ -1232,7 +1228,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawScript* script = objects_[i];
+      ScriptPtr script = objects_[i];
       s->AssignRef(script);
     }
   }
@@ -1240,7 +1236,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawScript* script = objects_[i];
+      ScriptPtr script = objects_[i];
       AutoTraceObjectName(script, script->ptr()->url_);
       WriteFromTo(script);
       s->Write<int32_t>(script->ptr()->line_offset_);
@@ -1251,7 +1247,7 @@
   }
 
  private:
-  GrowableArray<RawScript*> objects_;
+  GrowableArray<ScriptPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -1272,7 +1268,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawScript* script = reinterpret_cast<RawScript*>(d->Ref(id));
+      ScriptPtr script = static_cast<ScriptPtr>(d->Ref(id));
       Deserializer::InitializeHeader(script, kScriptCid,
                                      Script::InstanceSize());
       ReadFromTo(script);
@@ -1291,8 +1287,8 @@
   LibrarySerializationCluster() : SerializationCluster("Library") {}
   ~LibrarySerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawLibrary* lib = Library::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    LibraryPtr lib = Library::RawCast(object);
     objects_.Add(lib);
     PushFromTo(lib);
   }
@@ -1302,7 +1298,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawLibrary* lib = objects_[i];
+      LibraryPtr lib = objects_[i];
       s->AssignRef(lib);
     }
   }
@@ -1310,7 +1306,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawLibrary* lib = objects_[i];
+      LibraryPtr lib = objects_[i];
       AutoTraceObjectName(lib, lib->ptr()->url_);
       WriteFromTo(lib);
       s->Write<int32_t>(lib->ptr()->index_);
@@ -1324,7 +1320,7 @@
   }
 
  private:
-  GrowableArray<RawLibrary*> objects_;
+  GrowableArray<LibraryPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -1345,7 +1341,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawLibrary* lib = reinterpret_cast<RawLibrary*>(d->Ref(id));
+      LibraryPtr lib = static_cast<LibraryPtr>(d->Ref(id));
       Deserializer::InitializeHeader(lib, kLibraryCid, Library::InstanceSize());
       ReadFromTo(lib);
       lib->ptr()->native_entry_resolver_ = NULL;
@@ -1354,7 +1350,7 @@
       lib->ptr()->num_imports_ = d->Read<uint16_t>();
       lib->ptr()->load_state_ = d->Read<int8_t>();
       lib->ptr()->flags_ =
-          RawLibrary::InFullSnapshotBit::update(true, d->Read<uint8_t>());
+          LibraryLayout::InFullSnapshotBit::update(true, d->Read<uint8_t>());
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() != Snapshot::kFullAOT) {
         lib->ptr()->binary_declaration_ = d->Read<uint32_t>();
@@ -1370,8 +1366,8 @@
   NamespaceSerializationCluster() : SerializationCluster("Namespace") {}
   ~NamespaceSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawNamespace* ns = Namespace::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    NamespacePtr ns = Namespace::RawCast(object);
     objects_.Add(ns);
     PushFromTo(ns);
   }
@@ -1381,7 +1377,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawNamespace* ns = objects_[i];
+      NamespacePtr ns = objects_[i];
       s->AssignRef(ns);
     }
   }
@@ -1389,14 +1385,14 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawNamespace* ns = objects_[i];
+      NamespacePtr ns = objects_[i];
       AutoTraceObject(ns);
       WriteFromTo(ns);
     }
   }
 
  private:
-  GrowableArray<RawNamespace*> objects_;
+  GrowableArray<NamespacePtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -1417,7 +1413,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawNamespace* ns = reinterpret_cast<RawNamespace*>(d->Ref(id));
+      NamespacePtr ns = static_cast<NamespacePtr>(d->Ref(id));
       Deserializer::InitializeHeader(ns, kNamespaceCid,
                                      Namespace::InstanceSize());
       ReadFromTo(ns);
@@ -1433,8 +1429,8 @@
       : SerializationCluster("KernelProgramInfo") {}
   ~KernelProgramInfoSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawKernelProgramInfo* info = KernelProgramInfo::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    KernelProgramInfoPtr info = KernelProgramInfo::RawCast(object);
     objects_.Add(info);
     PushFromTo(info);
   }
@@ -1444,7 +1440,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawKernelProgramInfo* info = objects_[i];
+      KernelProgramInfoPtr info = objects_[i];
       s->AssignRef(info);
     }
   }
@@ -1452,7 +1448,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawKernelProgramInfo* info = objects_[i];
+      KernelProgramInfoPtr info = objects_[i];
       AutoTraceObject(info);
       WriteFromTo(info);
       s->Write<uint32_t>(info->ptr()->kernel_binary_version_);
@@ -1460,7 +1456,7 @@
   }
 
  private:
-  GrowableArray<RawKernelProgramInfo*> objects_;
+  GrowableArray<KernelProgramInfoPtr> objects_;
 };
 
 // Since KernelProgramInfo objects are not written into full AOT snapshots,
@@ -1483,8 +1479,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawKernelProgramInfo* info =
-          reinterpret_cast<RawKernelProgramInfo*>(d->Ref(id));
+      KernelProgramInfoPtr info = static_cast<KernelProgramInfoPtr>(d->Ref(id));
       Deserializer::InitializeHeader(info, kKernelProgramInfoCid,
                                      KernelProgramInfo::InstanceSize());
       ReadFromTo(info);
@@ -1510,8 +1505,8 @@
   CodeSerializationCluster() : SerializationCluster("Code") {}
   ~CodeSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawCode* code = Code::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    CodePtr code = Code::RawCast(object);
     objects_.Add(code);
 
     if (!(s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
@@ -1560,7 +1555,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawCode* code = objects_[i];
+      CodePtr code = objects_[i];
       s->AssignRef(code);
     }
   }
@@ -1569,7 +1564,7 @@
     Snapshot::Kind kind = s->kind();
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawCode* code = objects_[i];
+      CodePtr code = objects_[i];
       AutoTraceObject(code);
 
       intptr_t pointer_offsets_length =
@@ -1603,7 +1598,7 @@
                  code->ptr()->object_pool_ != ObjectPool::null()) {
         // If we are writing V8 snapshot profile then attribute references
         // going through the object pool to the code object itself.
-        RawObjectPool* pool = code->ptr()->object_pool_;
+        ObjectPoolPtr pool = code->ptr()->object_pool_;
 
         for (intptr_t i = 0; i < pool->ptr()->length_; i++) {
           uint8_t bits = pool->ptr()->entry_bits()[i];
@@ -1640,10 +1635,10 @@
     }
   }
 
-  GrowableArray<RawCode*>* discovered_objects() { return &objects_; }
+  GrowableArray<CodePtr>* discovered_objects() { return &objects_; }
 
  private:
-  GrowableArray<RawCode*> objects_;
+  GrowableArray<CodePtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -1661,10 +1656,10 @@
     // [Code]'s instructions will be located in memory.
     const bool build_code_order =
         FLAG_precompiled_mode && FLAG_use_bare_instructions;
-    RawArray* code_order = nullptr;
+    ArrayPtr code_order = nullptr;
     const intptr_t code_order_length = d->code_order_length();
     if (build_code_order) {
-      code_order = static_cast<RawArray*>(AllocateUninitialized(
+      code_order = static_cast<ArrayPtr>(AllocateUninitialized(
           old_space, Array::InstanceSize(code_order_length)));
       Deserializer::InitializeHeader(code_order, kArrayCid,
                                      Array::InstanceSize(code_order_length),
@@ -1691,7 +1686,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      auto const code = reinterpret_cast<RawCode*>(d->Ref(id));
+      auto const code = static_cast<CodePtr>(d->Ref(id));
       Deserializer::InitializeHeader(code, kCodeCid, Code::InstanceSize(0));
 
       d->ReadInstructions(code, id, start_index_);
@@ -1699,30 +1694,28 @@
       // There would be a single global pool if this is a full AOT snapshot
       // with bare instructions.
       if (!(d->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
-        code->ptr()->object_pool_ =
-            reinterpret_cast<RawObjectPool*>(d->ReadRef());
+        code->ptr()->object_pool_ = static_cast<ObjectPoolPtr>(d->ReadRef());
       } else {
         code->ptr()->object_pool_ = ObjectPool::null();
       }
       code->ptr()->owner_ = d->ReadRef();
       code->ptr()->exception_handlers_ =
-          reinterpret_cast<RawExceptionHandlers*>(d->ReadRef());
+          static_cast<ExceptionHandlersPtr>(d->ReadRef());
       code->ptr()->pc_descriptors_ =
-          reinterpret_cast<RawPcDescriptors*>(d->ReadRef());
+          static_cast<PcDescriptorsPtr>(d->ReadRef());
       code->ptr()->catch_entry_ = d->ReadRef();
       code->ptr()->compressed_stackmaps_ =
-          reinterpret_cast<RawCompressedStackMaps*>(d->ReadRef());
+          static_cast<CompressedStackMapsPtr>(d->ReadRef());
       code->ptr()->inlined_id_to_function_ =
-          reinterpret_cast<RawArray*>(d->ReadRef());
+          static_cast<ArrayPtr>(d->ReadRef());
       code->ptr()->code_source_map_ =
-          reinterpret_cast<RawCodeSourceMap*>(d->ReadRef());
+          static_cast<CodeSourceMapPtr>(d->ReadRef());
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() == Snapshot::kFullJIT) {
-        code->ptr()->deopt_info_array_ =
-            reinterpret_cast<RawArray*>(d->ReadRef());
+        code->ptr()->deopt_info_array_ = static_cast<ArrayPtr>(d->ReadRef());
         code->ptr()->static_calls_target_table_ =
-            reinterpret_cast<RawArray*>(d->ReadRef());
+            static_cast<ArrayPtr>(d->ReadRef());
       }
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -1730,7 +1723,7 @@
       code->ptr()->return_address_metadata_ = d->ReadRef();
       code->ptr()->var_descriptors_ = LocalVarDescriptors::null();
       code->ptr()->comments_ = FLAG_code_comments
-                                   ? reinterpret_cast<RawArray*>(d->ReadRef())
+                                   ? static_cast<ArrayPtr>(d->ReadRef())
                                    : Array::null();
       code->ptr()->compile_timestamp_ = 0;
 #endif
@@ -1775,8 +1768,8 @@
   BytecodeSerializationCluster() : SerializationCluster("Bytecode") {}
   virtual ~BytecodeSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawBytecode* bytecode = Bytecode::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    BytecodePtr bytecode = Bytecode::RawCast(object);
     objects_.Add(bytecode);
     PushFromTo(bytecode);
   }
@@ -1786,7 +1779,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawBytecode* bytecode = objects_[i];
+      BytecodePtr bytecode = objects_[i];
       s->AssignRef(bytecode);
     }
   }
@@ -1795,7 +1788,7 @@
     ASSERT(s->kind() != Snapshot::kFullAOT);
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawBytecode* bytecode = objects_[i];
+      BytecodePtr bytecode = objects_[i];
       s->Write<int32_t>(bytecode->ptr()->instructions_size_);
       WriteFromTo(bytecode);
       s->Write<int32_t>(bytecode->ptr()->instructions_binary_offset_);
@@ -1805,7 +1798,7 @@
   }
 
  private:
-  GrowableArray<RawBytecode*> objects_;
+  GrowableArray<BytecodePtr> objects_;
 };
 
 class BytecodeDeserializationCluster : public DeserializationCluster {
@@ -1827,7 +1820,7 @@
     ASSERT(d->kind() != Snapshot::kFullAOT);
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawBytecode* bytecode = reinterpret_cast<RawBytecode*>(d->Ref(id));
+      BytecodePtr bytecode = static_cast<BytecodePtr>(d->Ref(id));
       Deserializer::InitializeHeader(bytecode, kBytecodeCid,
                                      Bytecode::InstanceSize());
       bytecode->ptr()->instructions_ = 0;
@@ -1857,8 +1850,8 @@
   ObjectPoolSerializationCluster() : SerializationCluster("ObjectPool") {}
   ~ObjectPoolSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawObjectPool* pool = ObjectPool::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ObjectPoolPtr pool = ObjectPool::RawCast(object);
     objects_.Add(pool);
 
     const intptr_t length = pool->ptr()->length_;
@@ -1877,7 +1870,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawObjectPool* pool = objects_[i];
+      ObjectPoolPtr pool = objects_[i];
       s->AssignRef(pool);
       AutoTraceObject(pool);
       const intptr_t length = pool->ptr()->length_;
@@ -1888,14 +1881,14 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawObjectPool* pool = objects_[i];
+      ObjectPoolPtr pool = objects_[i];
       AutoTraceObject(pool);
       const intptr_t length = pool->ptr()->length_;
       s->WriteUnsigned(length);
       uint8_t* entry_bits = pool->ptr()->entry_bits();
       for (intptr_t j = 0; j < length; j++) {
         s->Write<uint8_t>(entry_bits[j]);
-        RawObjectPool::Entry& entry = pool->ptr()->data()[j];
+        ObjectPoolLayout::Entry& entry = pool->ptr()->data()[j];
         switch (ObjectPool::TypeBits::decode(entry_bits[j])) {
           case ObjectPool::EntryType::kTaggedObject: {
             if ((entry.raw_obj_ == StubCode::CallNoScopeNative().raw()) ||
@@ -1914,8 +1907,8 @@
             break;
           }
           case ObjectPool::EntryType::kNativeEntryData: {
-            RawObject* raw = entry.raw_obj_;
-            RawTypedData* raw_data = reinterpret_cast<RawTypedData*>(raw);
+            ObjectPtr raw = entry.raw_obj_;
+            TypedDataPtr raw_data = static_cast<TypedDataPtr>(raw);
             // kNativeEntryData object pool entries are for linking natives for
             // the interpreter. Before writing these entries into the snapshot,
             // we need to unlink them by nulling out the 'trampoline' and
@@ -1942,7 +1935,7 @@
   }
 
  private:
-  GrowableArray<RawObjectPool*> objects_;
+  GrowableArray<ObjectPoolPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -1966,14 +1959,14 @@
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id += 1) {
       const intptr_t length = d->ReadUnsigned();
-      RawObjectPool* pool = reinterpret_cast<RawObjectPool*>(d->Ref(id + 0));
+      ObjectPoolPtr pool = static_cast<ObjectPoolPtr>(d->Ref(id + 0));
       Deserializer::InitializeHeader(pool, kObjectPoolCid,
                                      ObjectPool::InstanceSize(length));
       pool->ptr()->length_ = length;
       for (intptr_t j = 0; j < length; j++) {
         const uint8_t entry_bits = d->Read<uint8_t>();
         pool->ptr()->entry_bits()[j] = entry_bits;
-        RawObjectPool::Entry& entry = pool->ptr()->data()[j];
+        ObjectPoolLayout::Entry& entry = pool->ptr()->data()[j];
         switch (ObjectPool::TypeBits::decode(entry_bits)) {
           case ObjectPool::EntryType::kNativeEntryData:
           case ObjectPool::EntryType::kTaggedObject:
@@ -2008,7 +2001,7 @@
         canonical_wsr_map_(zone) {}
   ~WeakSerializationReferenceSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
+  void Trace(Serializer* s, ObjectPtr object) {
     ASSERT(s->kind() == Snapshot::kFullAOT);
     // Make sure we don't trace again after choosing canonical WSRs.
     ASSERT(!have_canonicalized_wsrs_);
@@ -2095,14 +2088,14 @@
   // Returns whether a WSR should be dropped due to its target being reachable
   // via strong references. WSRs only wrap heap objects, so we can just retrieve
   // the object ID from the heap directly.
-  bool ShouldDrop(RawWeakSerializationReference* ref) const {
+  bool ShouldDrop(WeakSerializationReferencePtr ref) const {
     auto const target = WeakSerializationReference::TargetOf(ref);
     return Serializer::IsReachableReference(heap_->GetObjectId(target));
   }
 
   Heap* const heap_;
-  GrowableArray<RawWeakSerializationReference*> objects_;
-  GrowableArray<RawWeakSerializationReference*> canonical_wsrs_;
+  GrowableArray<WeakSerializationReferencePtr> objects_;
+  GrowableArray<WeakSerializationReferencePtr> canonical_wsrs_;
   IntMap<intptr_t> canonical_wsr_map_;
   bool have_canonicalized_wsrs_ = false;
 };
@@ -2131,8 +2124,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      auto const ref =
-          reinterpret_cast<RawWeakSerializationReference*>(d->Ref(id));
+      auto const ref = static_cast<WeakSerializationReferencePtr>(d->Ref(id));
       Deserializer::InitializeHeader(
           ref, kWeakSerializationReferenceCid,
           WeakSerializationReference::InstanceSize());
@@ -2148,8 +2140,8 @@
   PcDescriptorsSerializationCluster() : SerializationCluster("PcDescriptors") {}
   ~PcDescriptorsSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawPcDescriptors* desc = PcDescriptors::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    PcDescriptorsPtr desc = PcDescriptors::RawCast(object);
     objects_.Add(desc);
   }
 
@@ -2158,7 +2150,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawPcDescriptors* desc = objects_[i];
+      PcDescriptorsPtr desc = objects_[i];
       s->AssignRef(desc);
       AutoTraceObject(desc);
       const intptr_t length = desc->ptr()->length_;
@@ -2169,7 +2161,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawPcDescriptors* desc = objects_[i];
+      PcDescriptorsPtr desc = objects_[i];
       AutoTraceObject(desc);
       const intptr_t length = desc->ptr()->length_;
       s->WriteUnsigned(length);
@@ -2179,7 +2171,7 @@
   }
 
  private:
-  GrowableArray<RawPcDescriptors*> objects_;
+  GrowableArray<PcDescriptorsPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -2203,7 +2195,7 @@
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id += 1) {
       const intptr_t length = d->ReadUnsigned();
-      RawPcDescriptors* desc = reinterpret_cast<RawPcDescriptors*>(d->Ref(id));
+      PcDescriptorsPtr desc = static_cast<PcDescriptorsPtr>(d->Ref(id));
       Deserializer::InitializeHeader(desc, kPcDescriptorsCid,
                                      PcDescriptors::InstanceSize(length));
       desc->ptr()->length_ = length;
@@ -2224,12 +2216,12 @@
         type_(type) {}
   ~RODataSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
+  void Trace(Serializer* s, ObjectPtr object) {
     // A string's hash must already be computed when we write it because it
     // will be loaded into read-only memory. Extra bytes due to allocation
     // rounding need to be deterministically set for reliable deduplication in
     // shared images.
-    if (object->InVMIsolateHeap() ||
+    if (object->ptr()->InVMIsolateHeap() ||
         s->isolate()->heap()->old_space()->IsObjectFromImagePages(object)) {
       // This object is already read-only.
     } else {
@@ -2246,7 +2238,7 @@
     s->WriteUnsigned(count);
     uint32_t running_offset = 0;
     for (intptr_t i = 0; i < count; i++) {
-      RawObject* object = objects_[i];
+      ObjectPtr object = objects_[i];
       s->AssignRef(object);
       if (cid_ == kOneByteStringCid || cid_ == kTwoByteStringCid) {
         s->TraceStartWritingObject(type_, object, String::RawCast(object));
@@ -2271,7 +2263,7 @@
 
  private:
   const intptr_t cid_;
-  GrowableArray<RawObject*> objects_;
+  GrowableArray<ObjectPtr> objects_;
   const char* const type_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
@@ -2302,8 +2294,8 @@
       : SerializationCluster("ExceptionHandlers") {}
   ~ExceptionHandlersSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawExceptionHandlers* handlers = ExceptionHandlers::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ExceptionHandlersPtr handlers = ExceptionHandlers::RawCast(object);
     objects_.Add(handlers);
 
     s->Push(handlers->ptr()->handled_types_data_);
@@ -2314,7 +2306,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawExceptionHandlers* handlers = objects_[i];
+      ExceptionHandlersPtr handlers = objects_[i];
       s->AssignRef(handlers);
       AutoTraceObject(handlers);
       const intptr_t length = handlers->ptr()->num_entries_;
@@ -2325,7 +2317,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawExceptionHandlers* handlers = objects_[i];
+      ExceptionHandlersPtr handlers = objects_[i];
       AutoTraceObject(handlers);
       const intptr_t length = handlers->ptr()->num_entries_;
       s->WriteUnsigned(length);
@@ -2342,7 +2334,7 @@
   }
 
  private:
-  GrowableArray<RawExceptionHandlers*> objects_;
+  GrowableArray<ExceptionHandlersPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -2365,14 +2357,14 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawExceptionHandlers* handlers =
-          reinterpret_cast<RawExceptionHandlers*>(d->Ref(id));
+      ExceptionHandlersPtr handlers =
+          static_cast<ExceptionHandlersPtr>(d->Ref(id));
       const intptr_t length = d->ReadUnsigned();
       Deserializer::InitializeHeader(handlers, kExceptionHandlersCid,
                                      ExceptionHandlers::InstanceSize(length));
       handlers->ptr()->num_entries_ = length;
       handlers->ptr()->handled_types_data_ =
-          reinterpret_cast<RawArray*>(d->ReadRef());
+          static_cast<ArrayPtr>(d->ReadRef());
       for (intptr_t j = 0; j < length; j++) {
         ExceptionHandlerInfo& info = handlers->ptr()->data()[j];
         info.handler_pc_offset = d->Read<uint32_t>();
@@ -2391,8 +2383,8 @@
   ContextSerializationCluster() : SerializationCluster("Context") {}
   ~ContextSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawContext* context = Context::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ContextPtr context = Context::RawCast(object);
     objects_.Add(context);
 
     s->Push(context->ptr()->parent_);
@@ -2407,7 +2399,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawContext* context = objects_[i];
+      ContextPtr context = objects_[i];
       s->AssignRef(context);
       AutoTraceObject(context);
       const intptr_t length = context->ptr()->num_variables_;
@@ -2418,7 +2410,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawContext* context = objects_[i];
+      ContextPtr context = objects_[i];
       AutoTraceObject(context);
       const intptr_t length = context->ptr()->num_variables_;
       s->WriteUnsigned(length);
@@ -2430,7 +2422,7 @@
   }
 
  private:
-  GrowableArray<RawContext*> objects_;
+  GrowableArray<ContextPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -2453,12 +2445,12 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawContext* context = reinterpret_cast<RawContext*>(d->Ref(id));
+      ContextPtr context = static_cast<ContextPtr>(d->Ref(id));
       const intptr_t length = d->ReadUnsigned();
       Deserializer::InitializeHeader(context, kContextCid,
                                      Context::InstanceSize(length));
       context->ptr()->num_variables_ = length;
-      context->ptr()->parent_ = reinterpret_cast<RawContext*>(d->ReadRef());
+      context->ptr()->parent_ = static_cast<ContextPtr>(d->ReadRef());
       for (intptr_t j = 0; j < length; j++) {
         context->ptr()->data()[j] = d->ReadRef();
       }
@@ -2472,8 +2464,8 @@
   ContextScopeSerializationCluster() : SerializationCluster("ContextScope") {}
   ~ContextScopeSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawContextScope* scope = ContextScope::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ContextScopePtr scope = ContextScope::RawCast(object);
     objects_.Add(scope);
 
     const intptr_t length = scope->ptr()->num_variables_;
@@ -2485,7 +2477,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawContextScope* scope = objects_[i];
+      ContextScopePtr scope = objects_[i];
       s->AssignRef(scope);
       AutoTraceObject(scope);
       const intptr_t length = scope->ptr()->num_variables_;
@@ -2496,7 +2488,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawContextScope* scope = objects_[i];
+      ContextScopePtr scope = objects_[i];
       AutoTraceObject(scope);
       const intptr_t length = scope->ptr()->num_variables_;
       s->WriteUnsigned(length);
@@ -2506,7 +2498,7 @@
   }
 
  private:
-  GrowableArray<RawContextScope*> objects_;
+  GrowableArray<ContextScopePtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -2529,7 +2521,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawContextScope* scope = reinterpret_cast<RawContextScope*>(d->Ref(id));
+      ContextScopePtr scope = static_cast<ContextScopePtr>(d->Ref(id));
       const intptr_t length = d->ReadUnsigned();
       Deserializer::InitializeHeader(scope, kContextScopeCid,
                                      ContextScope::InstanceSize(length));
@@ -2547,8 +2539,8 @@
       : SerializationCluster("ParameterTypeCheck") {}
   ~ParameterTypeCheckSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawParameterTypeCheck* unlinked = ParameterTypeCheck::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ParameterTypeCheckPtr unlinked = ParameterTypeCheck::RawCast(object);
     objects_.Add(unlinked);
     PushFromTo(unlinked);
   }
@@ -2558,7 +2550,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawParameterTypeCheck* check = objects_[i];
+      ParameterTypeCheckPtr check = objects_[i];
       s->AssignRef(check);
     }
   }
@@ -2566,14 +2558,14 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawParameterTypeCheck* check = objects_[i];
+      ParameterTypeCheckPtr check = objects_[i];
       s->Write<intptr_t>(check->ptr()->index_);
       WriteFromTo(check);
     }
   }
 
  private:
-  GrowableArray<RawParameterTypeCheck*> objects_;
+  GrowableArray<ParameterTypeCheckPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -2595,8 +2587,8 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawParameterTypeCheck* check =
-          reinterpret_cast<RawParameterTypeCheck*>(d->Ref(id));
+      ParameterTypeCheckPtr check =
+          static_cast<ParameterTypeCheckPtr>(d->Ref(id));
       Deserializer::InitializeHeader(check, kParameterTypeCheckCid,
                                      ParameterTypeCheck::InstanceSize());
       check->ptr()->index_ = d->Read<intptr_t>();
@@ -2611,8 +2603,8 @@
   UnlinkedCallSerializationCluster() : SerializationCluster("UnlinkedCall") {}
   ~UnlinkedCallSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawUnlinkedCall* unlinked = UnlinkedCall::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    UnlinkedCallPtr unlinked = UnlinkedCall::RawCast(object);
     objects_.Add(unlinked);
     PushFromTo(unlinked);
   }
@@ -2622,7 +2614,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawUnlinkedCall* unlinked = objects_[i];
+      UnlinkedCallPtr unlinked = objects_[i];
       s->AssignRef(unlinked);
     }
   }
@@ -2630,7 +2622,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawUnlinkedCall* unlinked = objects_[i];
+      UnlinkedCallPtr unlinked = objects_[i];
       AutoTraceObjectName(unlinked, unlinked->ptr()->target_name_);
       WriteFromTo(unlinked);
       s->Write<bool>(unlinked->ptr()->can_patch_to_monomorphic_);
@@ -2638,7 +2630,7 @@
   }
 
  private:
-  GrowableArray<RawUnlinkedCall*> objects_;
+  GrowableArray<UnlinkedCallPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -2660,8 +2652,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawUnlinkedCall* unlinked =
-          reinterpret_cast<RawUnlinkedCall*>(d->Ref(id));
+      UnlinkedCallPtr unlinked = static_cast<UnlinkedCallPtr>(d->Ref(id));
       Deserializer::InitializeHeader(unlinked, kUnlinkedCallCid,
                                      UnlinkedCall::InstanceSize());
       ReadFromTo(unlinked);
@@ -2676,8 +2667,8 @@
   ICDataSerializationCluster() : SerializationCluster("ICData") {}
   ~ICDataSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawICData* ic = ICData::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ICDataPtr ic = ICData::RawCast(object);
     objects_.Add(ic);
     PushFromTo(ic);
   }
@@ -2687,7 +2678,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawICData* ic = objects_[i];
+      ICDataPtr ic = objects_[i];
       s->AssignRef(ic);
     }
   }
@@ -2696,7 +2687,7 @@
     Snapshot::Kind kind = s->kind();
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawICData* ic = objects_[i];
+      ICDataPtr ic = objects_[i];
       AutoTraceObjectName(ic, ic->ptr()->target_name_);
       WriteFromTo(ic);
       if (kind != Snapshot::kFullAOT) {
@@ -2707,7 +2698,7 @@
   }
 
  private:
-  GrowableArray<RawICData*> objects_;
+  GrowableArray<ICDataPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -2728,7 +2719,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawICData* ic = reinterpret_cast<RawICData*>(d->Ref(id));
+      ICDataPtr ic = static_cast<ICDataPtr>(d->Ref(id));
       Deserializer::InitializeHeader(ic, kICDataCid, ICData::InstanceSize());
       ReadFromTo(ic);
       NOT_IN_PRECOMPILED(ic->ptr()->deopt_id_ = d->Read<int32_t>());
@@ -2744,8 +2735,8 @@
       : SerializationCluster("MegamorphicCache") {}
   ~MegamorphicCacheSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawMegamorphicCache* cache = MegamorphicCache::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    MegamorphicCachePtr cache = MegamorphicCache::RawCast(object);
     objects_.Add(cache);
     PushFromTo(cache);
   }
@@ -2755,7 +2746,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawMegamorphicCache* cache = objects_[i];
+      MegamorphicCachePtr cache = objects_[i];
       s->AssignRef(cache);
     }
   }
@@ -2763,7 +2754,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawMegamorphicCache* cache = objects_[i];
+      MegamorphicCachePtr cache = objects_[i];
       AutoTraceObjectName(cache, cache->ptr()->target_name_);
       WriteFromTo(cache);
       s->Write<int32_t>(cache->ptr()->filled_entry_count_);
@@ -2771,7 +2762,7 @@
   }
 
  private:
-  GrowableArray<RawMegamorphicCache*> objects_;
+  GrowableArray<MegamorphicCachePtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -2793,8 +2784,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawMegamorphicCache* cache =
-          reinterpret_cast<RawMegamorphicCache*>(d->Ref(id));
+      MegamorphicCachePtr cache = static_cast<MegamorphicCachePtr>(d->Ref(id));
       Deserializer::InitializeHeader(cache, kMegamorphicCacheCid,
                                      MegamorphicCache::InstanceSize());
       ReadFromTo(cache);
@@ -2836,8 +2826,8 @@
       : SerializationCluster("SubtypeTestCache") {}
   ~SubtypeTestCacheSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawSubtypeTestCache* cache = SubtypeTestCache::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    SubtypeTestCachePtr cache = SubtypeTestCache::RawCast(object);
     objects_.Add(cache);
     s->Push(cache->ptr()->cache_);
   }
@@ -2847,7 +2837,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawSubtypeTestCache* cache = objects_[i];
+      SubtypeTestCachePtr cache = objects_[i];
       s->AssignRef(cache);
     }
   }
@@ -2855,14 +2845,14 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawSubtypeTestCache* cache = objects_[i];
+      SubtypeTestCachePtr cache = objects_[i];
       AutoTraceObject(cache);
       WriteField(cache, cache_);
     }
   }
 
  private:
-  GrowableArray<RawSubtypeTestCache*> objects_;
+  GrowableArray<SubtypeTestCachePtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -2884,11 +2874,10 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawSubtypeTestCache* cache =
-          reinterpret_cast<RawSubtypeTestCache*>(d->Ref(id));
+      SubtypeTestCachePtr cache = static_cast<SubtypeTestCachePtr>(d->Ref(id));
       Deserializer::InitializeHeader(cache, kSubtypeTestCacheCid,
                                      SubtypeTestCache::InstanceSize());
-      cache->ptr()->cache_ = reinterpret_cast<RawArray*>(d->ReadRef());
+      cache->ptr()->cache_ = static_cast<ArrayPtr>(d->ReadRef());
     }
   }
 };
@@ -2899,8 +2888,8 @@
   LanguageErrorSerializationCluster() : SerializationCluster("LanguageError") {}
   ~LanguageErrorSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawLanguageError* error = LanguageError::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    LanguageErrorPtr error = LanguageError::RawCast(object);
     objects_.Add(error);
     PushFromTo(error);
   }
@@ -2910,7 +2899,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawLanguageError* error = objects_[i];
+      LanguageErrorPtr error = objects_[i];
       s->AssignRef(error);
     }
   }
@@ -2918,7 +2907,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawLanguageError* error = objects_[i];
+      LanguageErrorPtr error = objects_[i];
       AutoTraceObject(error);
       WriteFromTo(error);
       s->WriteTokenPosition(error->ptr()->token_pos_);
@@ -2928,7 +2917,7 @@
   }
 
  private:
-  GrowableArray<RawLanguageError*> objects_;
+  GrowableArray<LanguageErrorPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -2950,7 +2939,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawLanguageError* error = reinterpret_cast<RawLanguageError*>(d->Ref(id));
+      LanguageErrorPtr error = static_cast<LanguageErrorPtr>(d->Ref(id));
       Deserializer::InitializeHeader(error, kLanguageErrorCid,
                                      LanguageError::InstanceSize());
       ReadFromTo(error);
@@ -2968,8 +2957,8 @@
       : SerializationCluster("UnhandledException") {}
   ~UnhandledExceptionSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawUnhandledException* exception = UnhandledException::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    UnhandledExceptionPtr exception = UnhandledException::RawCast(object);
     objects_.Add(exception);
     PushFromTo(exception);
   }
@@ -2979,7 +2968,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawUnhandledException* exception = objects_[i];
+      UnhandledExceptionPtr exception = objects_[i];
       s->AssignRef(exception);
     }
   }
@@ -2987,14 +2976,14 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawUnhandledException* exception = objects_[i];
+      UnhandledExceptionPtr exception = objects_[i];
       AutoTraceObject(exception);
       WriteFromTo(exception);
     }
   }
 
  private:
-  GrowableArray<RawUnhandledException*> objects_;
+  GrowableArray<UnhandledExceptionPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3016,8 +3005,8 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawUnhandledException* exception =
-          reinterpret_cast<RawUnhandledException*>(d->Ref(id));
+      UnhandledExceptionPtr exception =
+          static_cast<UnhandledExceptionPtr>(d->Ref(id));
       Deserializer::InitializeHeader(exception, kUnhandledExceptionCid,
                                      UnhandledException::InstanceSize());
       ReadFromTo(exception);
@@ -3030,7 +3019,7 @@
  public:
   explicit InstanceSerializationCluster(intptr_t cid)
       : SerializationCluster("Instance"), cid_(cid) {
-    RawClass* cls = Isolate::Current()->class_table()->At(cid);
+    ClassPtr cls = Isolate::Current()->class_table()->At(cid);
     host_next_field_offset_in_words_ =
         cls->ptr()->host_next_field_offset_in_words_;
     ASSERT(host_next_field_offset_in_words_ > 0);
@@ -3044,8 +3033,8 @@
   }
   ~InstanceSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawInstance* instance = Instance::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    InstancePtr instance = Instance::RawCast(object);
     objects_.Add(instance);
     const intptr_t next_field_offset = host_next_field_offset_in_words_
                                        << kWordSizeLog2;
@@ -3056,7 +3045,7 @@
     while (offset < next_field_offset) {
       // Skips unboxed fields
       if (!unboxed_fields_bitmap.Get(offset / kWordSize)) {
-        RawObject* raw_obj = *reinterpret_cast<RawObject**>(
+        ObjectPtr raw_obj = *reinterpret_cast<ObjectPtr*>(
             reinterpret_cast<uword>(instance->ptr()) + offset);
         s->Push(raw_obj);
       }
@@ -3077,7 +3066,7 @@
 #endif  //  !defined(DART_PRECOMPILED_RUNTIME)
 
     for (intptr_t i = 0; i < count; i++) {
-      RawInstance* instance = objects_[i];
+      InstancePtr instance = objects_[i];
       s->AssignRef(instance);
     }
   }
@@ -3090,9 +3079,9 @@
         s->isolate()->group()->shared_class_table()->GetUnboxedFieldsMapAt(
             cid_);
     for (intptr_t i = 0; i < count; i++) {
-      RawInstance* instance = objects_[i];
+      InstancePtr instance = objects_[i];
       AutoTraceObject(instance);
-      s->Write<bool>(instance->IsCanonical());
+      s->Write<bool>(instance->ptr()->IsCanonical());
       intptr_t offset = Instance::NextFieldOffset();
       while (offset < next_field_offset) {
         if (unboxed_fields_bitmap.Get(offset / kWordSize)) {
@@ -3101,7 +3090,7 @@
               reinterpret_cast<uword>(instance->ptr()) + offset);
           s->WriteWordWith32BitWrites(value);
         } else {
-          RawObject* raw_obj = *reinterpret_cast<RawObject**>(
+          ObjectPtr raw_obj = *reinterpret_cast<ObjectPtr*>(
               reinterpret_cast<uword>(instance->ptr()) + offset);
           s->WriteElementRef(raw_obj, offset);
         }
@@ -3117,7 +3106,7 @@
   intptr_t target_next_field_offset_in_words_;
   intptr_t target_instance_size_in_words_;
 #endif  //  !defined(DART_PRECOMPILED_RUNTIME)
-  GrowableArray<RawInstance*> objects_;
+  GrowableArray<InstancePtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3149,7 +3138,7 @@
         d->isolate()->group()->shared_class_table()->GetUnboxedFieldsMapAt(
             cid_);
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawInstance* instance = reinterpret_cast<RawInstance*>(d->Ref(id));
+      InstancePtr instance = static_cast<InstancePtr>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(instance, cid_, instance_size,
                                      is_canonical);
@@ -3161,14 +3150,14 @@
           // Reads 32 bits of the unboxed value at a time
           *p = d->ReadWordWith32BitReads();
         } else {
-          RawObject** p = reinterpret_cast<RawObject**>(
+          ObjectPtr* p = reinterpret_cast<ObjectPtr*>(
               reinterpret_cast<uword>(instance->ptr()) + offset);
           *p = d->ReadRef();
         }
         offset += kWordSize;
       }
       if (offset < instance_size) {
-        RawObject** p = reinterpret_cast<RawObject**>(
+        ObjectPtr* p = reinterpret_cast<ObjectPtr*>(
             reinterpret_cast<uword>(instance->ptr()) + offset);
         *p = Object::null();
         offset += kWordSize;
@@ -3189,8 +3178,8 @@
   LibraryPrefixSerializationCluster() : SerializationCluster("LibraryPrefix") {}
   ~LibraryPrefixSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawLibraryPrefix* prefix = LibraryPrefix::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    LibraryPrefixPtr prefix = LibraryPrefix::RawCast(object);
     objects_.Add(prefix);
     PushFromTo(prefix);
   }
@@ -3200,7 +3189,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawLibraryPrefix* prefix = objects_[i];
+      LibraryPrefixPtr prefix = objects_[i];
       s->AssignRef(prefix);
     }
   }
@@ -3208,7 +3197,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawLibraryPrefix* prefix = objects_[i];
+      LibraryPrefixPtr prefix = objects_[i];
       AutoTraceObject(prefix);
       WriteFromTo(prefix);
       s->Write<uint16_t>(prefix->ptr()->num_imports_);
@@ -3217,7 +3206,7 @@
   }
 
  private:
-  GrowableArray<RawLibraryPrefix*> objects_;
+  GrowableArray<LibraryPrefixPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3239,8 +3228,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawLibraryPrefix* prefix =
-          reinterpret_cast<RawLibraryPrefix*>(d->Ref(id));
+      LibraryPrefixPtr prefix = static_cast<LibraryPrefixPtr>(d->Ref(id));
       Deserializer::InitializeHeader(prefix, kLibraryPrefixCid,
                                      LibraryPrefix::InstanceSize());
       ReadFromTo(prefix);
@@ -3256,9 +3244,9 @@
   TypeSerializationCluster() : SerializationCluster("Type") {}
   ~TypeSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawType* type = Type::RawCast(object);
-    if (type->IsCanonical()) {
+  void Trace(Serializer* s, ObjectPtr object) {
+    TypePtr type = Type::RawCast(object);
+    if (type->ptr()->IsCanonical()) {
       canonical_objects_.Add(type);
     } else {
       objects_.Add(type);
@@ -3271,8 +3259,8 @@
       UNREACHABLE();
     }
 
-    RawSmi* raw_type_class_id = Smi::RawCast(type->ptr()->type_class_id_);
-    RawClass* type_class =
+    SmiPtr raw_type_class_id = Smi::RawCast(type->ptr()->type_class_id_);
+    ClassPtr type_class =
         s->isolate()->class_table()->At(Smi::Value(raw_type_class_id));
     s->Push(type_class);
   }
@@ -3282,13 +3270,13 @@
     intptr_t count = canonical_objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawType* type = canonical_objects_[i];
+      TypePtr type = canonical_objects_[i];
       s->AssignRef(type);
     }
     count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawType* type = objects_[i];
+      TypePtr type = objects_[i];
       s->AssignRef(type);
     }
   }
@@ -3296,7 +3284,7 @@
   void WriteFill(Serializer* s) {
     intptr_t count = canonical_objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawType* type = canonical_objects_[i];
+      TypePtr type = canonical_objects_[i];
       AutoTraceObject(type);
       WriteFromTo(type);
       s->WriteTokenPosition(type->ptr()->token_pos_);
@@ -3308,7 +3296,7 @@
     }
     count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawType* type = objects_[i];
+      TypePtr type = objects_[i];
       AutoTraceObject(type);
       WriteFromTo(type);
       s->WriteTokenPosition(type->ptr()->token_pos_);
@@ -3321,8 +3309,8 @@
   }
 
  private:
-  GrowableArray<RawType*> canonical_objects_;
-  GrowableArray<RawType*> objects_;
+  GrowableArray<TypePtr> canonical_objects_;
+  GrowableArray<TypePtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3351,7 +3339,7 @@
   void ReadFill(Deserializer* d) {
     for (intptr_t id = canonical_start_index_; id < canonical_stop_index_;
          id++) {
-      RawType* type = reinterpret_cast<RawType*>(d->Ref(id));
+      TypePtr type = static_cast<TypePtr>(d->Ref(id));
       bool is_canonical = true;
       Deserializer::InitializeHeader(type, kTypeCid, Type::InstanceSize(),
                                      is_canonical);
@@ -3363,7 +3351,7 @@
     }
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawType* type = reinterpret_cast<RawType*>(d->Ref(id));
+      TypePtr type = static_cast<TypePtr>(d->Ref(id));
       bool is_canonical = false;
       Deserializer::InitializeHeader(type, kTypeCid, Type::InstanceSize(),
                                      is_canonical);
@@ -3417,8 +3405,8 @@
   TypeRefSerializationCluster() : SerializationCluster("TypeRef") {}
   ~TypeRefSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawTypeRef* type = TypeRef::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    TypeRefPtr type = TypeRef::RawCast(object);
     objects_.Add(type);
     PushFromTo(type);
   }
@@ -3428,7 +3416,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawTypeRef* type = objects_[i];
+      TypeRefPtr type = objects_[i];
       s->AssignRef(type);
     }
   }
@@ -3436,14 +3424,14 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawTypeRef* type = objects_[i];
+      TypeRefPtr type = objects_[i];
       AutoTraceObject(type);
       WriteFromTo(type);
     }
   }
 
  private:
-  GrowableArray<RawTypeRef*> objects_;
+  GrowableArray<TypeRefPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3464,7 +3452,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawTypeRef* type = reinterpret_cast<RawTypeRef*>(d->Ref(id));
+      TypeRefPtr type = static_cast<TypeRefPtr>(d->Ref(id));
       Deserializer::InitializeHeader(type, kTypeRefCid,
                                      TypeRef::InstanceSize());
       ReadFromTo(type);
@@ -3499,10 +3487,10 @@
 
   ~TypeParameterSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawTypeParameter* type = TypeParameter::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    TypeParameterPtr type = TypeParameter::RawCast(object);
     objects_.Add(type);
-    ASSERT(!type->IsCanonical());
+    ASSERT(!type->ptr()->IsCanonical());
     PushFromTo(type);
   }
 
@@ -3511,7 +3499,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawTypeParameter* type = objects_[i];
+      TypeParameterPtr type = objects_[i];
       s->AssignRef(type);
     }
   }
@@ -3519,7 +3507,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawTypeParameter* type = objects_[i];
+      TypeParameterPtr type = objects_[i];
       AutoTraceObject(type);
       WriteFromTo(type);
       s->Write<int32_t>(type->ptr()->parameterized_class_id_);
@@ -3534,7 +3522,7 @@
   }
 
  private:
-  GrowableArray<RawTypeParameter*> objects_;
+  GrowableArray<TypeParameterPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3556,7 +3544,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawTypeParameter* type = reinterpret_cast<RawTypeParameter*>(d->Ref(id));
+      TypeParameterPtr type = static_cast<TypeParameterPtr>(d->Ref(id));
       Deserializer::InitializeHeader(type, kTypeParameterCid,
                                      TypeParameter::InstanceSize());
       ReadFromTo(type);
@@ -3596,8 +3584,8 @@
   ClosureSerializationCluster() : SerializationCluster("Closure") {}
   ~ClosureSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawClosure* closure = Closure::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ClosurePtr closure = Closure::RawCast(object);
     objects_.Add(closure);
     PushFromTo(closure);
   }
@@ -3607,7 +3595,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawClosure* closure = objects_[i];
+      ClosurePtr closure = objects_[i];
       s->AssignRef(closure);
     }
   }
@@ -3615,15 +3603,15 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawClosure* closure = objects_[i];
+      ClosurePtr closure = objects_[i];
       AutoTraceObject(closure);
-      s->Write<bool>(closure->IsCanonical());
+      s->Write<bool>(closure->ptr()->IsCanonical());
       WriteFromTo(closure);
     }
   }
 
  private:
-  GrowableArray<RawClosure*> objects_;
+  GrowableArray<ClosurePtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3644,7 +3632,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawClosure* closure = reinterpret_cast<RawClosure*>(d->Ref(id));
+      ClosurePtr closure = static_cast<ClosurePtr>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(closure, kClosureCid,
                                      Closure::InstanceSize(), is_canonical);
@@ -3659,12 +3647,12 @@
   MintSerializationCluster() : SerializationCluster("int") {}
   ~MintSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
+  void Trace(Serializer* s, ObjectPtr object) {
     if (!object->IsHeapObject()) {
-      RawSmi* smi = Smi::RawCast(object);
+      SmiPtr smi = Smi::RawCast(object);
       smis_.Add(smi);
     } else {
-      RawMint* mint = Mint::RawCast(object);
+      MintPtr mint = Mint::RawCast(object);
       mints_.Add(mint);
     }
   }
@@ -3674,17 +3662,17 @@
 
     s->WriteUnsigned(smis_.length() + mints_.length());
     for (intptr_t i = 0; i < smis_.length(); i++) {
-      RawSmi* smi = smis_[i];
+      SmiPtr smi = smis_[i];
       s->AssignRef(smi);
       AutoTraceObject(smi);
       s->Write<bool>(true);
       s->Write<int64_t>(Smi::Value(smi));
     }
     for (intptr_t i = 0; i < mints_.length(); i++) {
-      RawMint* mint = mints_[i];
+      MintPtr mint = mints_[i];
       s->AssignRef(mint);
       AutoTraceObject(mint);
-      s->Write<bool>(mint->IsCanonical());
+      s->Write<bool>(mint->ptr()->IsCanonical());
       s->Write<int64_t>(mint->ptr()->value_);
     }
   }
@@ -3692,8 +3680,8 @@
   void WriteFill(Serializer* s) {}
 
  private:
-  GrowableArray<RawSmi*> smis_;
-  GrowableArray<RawMint*> mints_;
+  GrowableArray<SmiPtr> smis_;
+  GrowableArray<MintPtr> mints_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3713,7 +3701,7 @@
       if (Smi::IsValid(value)) {
         d->AssignRef(Smi::New(value));
       } else {
-        RawMint* mint = static_cast<RawMint*>(
+        MintPtr mint = static_cast<MintPtr>(
             AllocateUninitialized(old_space, Mint::InstanceSize()));
         Deserializer::InitializeHeader(mint, kMintCid, Mint::InstanceSize(),
                                        is_canonical);
@@ -3746,8 +3734,8 @@
   DoubleSerializationCluster() : SerializationCluster("double") {}
   ~DoubleSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawDouble* dbl = Double::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    DoublePtr dbl = Double::RawCast(object);
     objects_.Add(dbl);
   }
 
@@ -3756,7 +3744,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawDouble* dbl = objects_[i];
+      DoublePtr dbl = objects_[i];
       s->AssignRef(dbl);
     }
   }
@@ -3764,15 +3752,15 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawDouble* dbl = objects_[i];
+      DoublePtr dbl = objects_[i];
       AutoTraceObject(dbl);
-      s->Write<bool>(dbl->IsCanonical());
+      s->Write<bool>(dbl->ptr()->IsCanonical());
       s->Write<double>(dbl->ptr()->value_);
     }
   }
 
  private:
-  GrowableArray<RawDouble*> objects_;
+  GrowableArray<DoublePtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3793,7 +3781,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawDouble* dbl = reinterpret_cast<RawDouble*>(d->Ref(id));
+      DoublePtr dbl = static_cast<DoublePtr>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(dbl, kDoubleCid, Double::InstanceSize(),
                                      is_canonical);
@@ -3809,8 +3797,8 @@
       : SerializationCluster("GrowableObjectArray") {}
   ~GrowableObjectArraySerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawGrowableObjectArray* array = GrowableObjectArray::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    GrowableObjectArrayPtr array = GrowableObjectArray::RawCast(object);
     objects_.Add(array);
     PushFromTo(array);
   }
@@ -3820,7 +3808,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawGrowableObjectArray* array = objects_[i];
+      GrowableObjectArrayPtr array = objects_[i];
       s->AssignRef(array);
     }
   }
@@ -3828,15 +3816,15 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawGrowableObjectArray* array = objects_[i];
+      GrowableObjectArrayPtr array = objects_[i];
       AutoTraceObject(array);
-      s->Write<bool>(array->IsCanonical());
+      s->Write<bool>(array->ptr()->IsCanonical());
       WriteFromTo(array);
     }
   }
 
  private:
-  GrowableArray<RawGrowableObjectArray*> objects_;
+  GrowableArray<GrowableObjectArrayPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3859,8 +3847,8 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawGrowableObjectArray* list =
-          reinterpret_cast<RawGrowableObjectArray*>(d->Ref(id));
+      GrowableObjectArrayPtr list =
+          static_cast<GrowableObjectArrayPtr>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(list, kGrowableObjectArrayCid,
                                      GrowableObjectArray::InstanceSize(),
@@ -3877,8 +3865,8 @@
       : SerializationCluster("TypedData"), cid_(cid) {}
   ~TypedDataSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawTypedData* data = TypedData::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    TypedDataPtr data = TypedData::RawCast(object);
     objects_.Add(data);
   }
 
@@ -3887,7 +3875,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawTypedData* data = objects_[i];
+      TypedDataPtr data = objects_[i];
       s->AssignRef(data);
       AutoTraceObject(data);
       const intptr_t length = Smi::Value(data->ptr()->length_);
@@ -3899,11 +3887,11 @@
     const intptr_t count = objects_.length();
     intptr_t element_size = TypedData::ElementSizeInBytes(cid_);
     for (intptr_t i = 0; i < count; i++) {
-      RawTypedData* data = objects_[i];
+      TypedDataPtr data = objects_[i];
       AutoTraceObject(data);
       const intptr_t length = Smi::Value(data->ptr()->length_);
       s->WriteUnsigned(length);
-      s->Write<bool>(data->IsCanonical());
+      s->Write<bool>(data->ptr()->IsCanonical());
       uint8_t* cdata = reinterpret_cast<uint8_t*>(data->ptr()->data());
       s->WriteBytes(cdata, length * element_size);
     }
@@ -3911,7 +3899,7 @@
 
  private:
   const intptr_t cid_;
-  GrowableArray<RawTypedData*> objects_;
+  GrowableArray<TypedDataPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -3937,14 +3925,14 @@
     intptr_t element_size = TypedData::ElementSizeInBytes(cid_);
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawTypedData* data = reinterpret_cast<RawTypedData*>(d->Ref(id));
+      TypedDataPtr data = static_cast<TypedDataPtr>(d->Ref(id));
       const intptr_t length = d->ReadUnsigned();
       bool is_canonical = d->Read<bool>();
       const intptr_t length_in_bytes = length * element_size;
       Deserializer::InitializeHeader(
           data, cid_, TypedData::InstanceSize(length_in_bytes), is_canonical);
       data->ptr()->length_ = Smi::New(length);
-      data->RecomputeDataField();
+      data->ptr()->RecomputeDataField();
       uint8_t* cdata = reinterpret_cast<uint8_t*>(data->ptr()->data());
       d->ReadBytes(cdata, length_in_bytes);
     }
@@ -3961,8 +3949,8 @@
       : SerializationCluster("TypedDataView"), cid_(cid) {}
   ~TypedDataViewSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawTypedDataView* view = TypedDataView::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    TypedDataViewPtr view = TypedDataView::RawCast(object);
     objects_.Add(view);
 
     PushFromTo(view);
@@ -3973,7 +3961,7 @@
     s->WriteCid(cid_);
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawTypedDataView* view = objects_[i];
+      TypedDataViewPtr view = objects_[i];
       s->AssignRef(view);
     }
   }
@@ -3981,16 +3969,16 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawTypedDataView* view = objects_[i];
+      TypedDataViewPtr view = objects_[i];
       AutoTraceObject(view);
-      s->Write<bool>(view->IsCanonical());
+      s->Write<bool>(view->ptr()->IsCanonical());
       WriteFromTo(view);
     }
   }
 
  private:
   const intptr_t cid_;
-  GrowableArray<RawTypedDataView*> objects_;
+  GrowableArray<TypedDataViewPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -4012,7 +4000,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawTypedDataView* view = reinterpret_cast<RawTypedDataView*>(d->Ref(id));
+      TypedDataViewPtr view = static_cast<TypedDataViewPtr>(d->Ref(id));
       const bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(view, cid_, TypedDataView::InstanceSize(),
                                      is_canonical);
@@ -4039,10 +4027,10 @@
       : SerializationCluster("ExternalTypedData"), cid_(cid) {}
   ~ExternalTypedDataSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawExternalTypedData* data = ExternalTypedData::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ExternalTypedDataPtr data = ExternalTypedData::RawCast(object);
     objects_.Add(data);
-    ASSERT(!data->IsCanonical());
+    ASSERT(!data->ptr()->IsCanonical());
   }
 
   void WriteAlloc(Serializer* s) {
@@ -4050,7 +4038,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawExternalTypedData* data = objects_[i];
+      ExternalTypedDataPtr data = objects_[i];
       s->AssignRef(data);
     }
   }
@@ -4059,7 +4047,7 @@
     const intptr_t count = objects_.length();
     intptr_t element_size = ExternalTypedData::ElementSizeInBytes(cid_);
     for (intptr_t i = 0; i < count; i++) {
-      RawExternalTypedData* data = objects_[i];
+      ExternalTypedDataPtr data = objects_[i];
       AutoTraceObject(data);
       const intptr_t length = Smi::Value(data->ptr()->length_);
       s->WriteUnsigned(length);
@@ -4071,7 +4059,7 @@
 
  private:
   const intptr_t cid_;
-  GrowableArray<RawExternalTypedData*> objects_;
+  GrowableArray<ExternalTypedDataPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -4095,8 +4083,7 @@
     intptr_t element_size = ExternalTypedData::ElementSizeInBytes(cid_);
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawExternalTypedData* data =
-          reinterpret_cast<RawExternalTypedData*>(d->Ref(id));
+      ExternalTypedDataPtr data = static_cast<ExternalTypedDataPtr>(d->Ref(id));
       const intptr_t length = d->ReadUnsigned();
       Deserializer::InitializeHeader(data, cid_,
                                      ExternalTypedData::InstanceSize());
@@ -4118,8 +4105,8 @@
   StackTraceSerializationCluster() : SerializationCluster("StackTrace") {}
   ~StackTraceSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawStackTrace* trace = StackTrace::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    StackTracePtr trace = StackTrace::RawCast(object);
     objects_.Add(trace);
     PushFromTo(trace);
   }
@@ -4129,7 +4116,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawStackTrace* trace = objects_[i];
+      StackTracePtr trace = objects_[i];
       s->AssignRef(trace);
     }
   }
@@ -4137,14 +4124,14 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawStackTrace* trace = objects_[i];
+      StackTracePtr trace = objects_[i];
       AutoTraceObject(trace);
       WriteFromTo(trace);
     }
   }
 
  private:
-  GrowableArray<RawStackTrace*> objects_;
+  GrowableArray<StackTracePtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -4166,7 +4153,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawStackTrace* trace = reinterpret_cast<RawStackTrace*>(d->Ref(id));
+      StackTracePtr trace = static_cast<StackTracePtr>(d->Ref(id));
       Deserializer::InitializeHeader(trace, kStackTraceCid,
                                      StackTrace::InstanceSize());
       ReadFromTo(trace);
@@ -4180,8 +4167,8 @@
   RegExpSerializationCluster() : SerializationCluster("RegExp") {}
   ~RegExpSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawRegExp* regexp = RegExp::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    RegExpPtr regexp = RegExp::RawCast(object);
     objects_.Add(regexp);
     PushFromTo(regexp);
   }
@@ -4191,7 +4178,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawRegExp* regexp = objects_[i];
+      RegExpPtr regexp = objects_[i];
       s->AssignRef(regexp);
     }
   }
@@ -4199,7 +4186,7 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawRegExp* regexp = objects_[i];
+      RegExpPtr regexp = objects_[i];
       AutoTraceObject(regexp);
       WriteFromTo(regexp);
       s->Write<int32_t>(regexp->ptr()->num_one_byte_registers_);
@@ -4209,7 +4196,7 @@
   }
 
  private:
-  GrowableArray<RawRegExp*> objects_;
+  GrowableArray<RegExpPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -4230,7 +4217,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawRegExp* regexp = reinterpret_cast<RawRegExp*>(d->Ref(id));
+      RegExpPtr regexp = static_cast<RegExpPtr>(d->Ref(id));
       Deserializer::InitializeHeader(regexp, kRegExpCid,
                                      RegExp::InstanceSize());
       ReadFromTo(regexp);
@@ -4247,8 +4234,8 @@
   WeakPropertySerializationCluster() : SerializationCluster("WeakProperty") {}
   ~WeakPropertySerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawWeakProperty* property = WeakProperty::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    WeakPropertyPtr property = WeakProperty::RawCast(object);
     objects_.Add(property);
     PushFromTo(property);
   }
@@ -4258,7 +4245,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawWeakProperty* property = objects_[i];
+      WeakPropertyPtr property = objects_[i];
       s->AssignRef(property);
     }
   }
@@ -4266,14 +4253,14 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawWeakProperty* property = objects_[i];
+      WeakPropertyPtr property = objects_[i];
       AutoTraceObject(property);
       WriteFromTo(property);
     }
   }
 
  private:
-  GrowableArray<RawWeakProperty*> objects_;
+  GrowableArray<WeakPropertyPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -4295,8 +4282,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawWeakProperty* property =
-          reinterpret_cast<RawWeakProperty*>(d->Ref(id));
+      WeakPropertyPtr property = static_cast<WeakPropertyPtr>(d->Ref(id));
       Deserializer::InitializeHeader(property, kWeakPropertyCid,
                                      WeakProperty::InstanceSize());
       ReadFromTo(property);
@@ -4310,19 +4296,19 @@
   LinkedHashMapSerializationCluster() : SerializationCluster("LinkedHashMap") {}
   ~LinkedHashMapSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawLinkedHashMap* map = LinkedHashMap::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    LinkedHashMapPtr map = LinkedHashMap::RawCast(object);
     objects_.Add(map);
 
     s->Push(map->ptr()->type_arguments_);
 
     intptr_t used_data = Smi::Value(map->ptr()->used_data_);
-    RawArray* data_array = map->ptr()->data_;
-    RawObject** data_elements = data_array->ptr()->data();
+    ArrayPtr data_array = map->ptr()->data_;
+    ObjectPtr* data_elements = data_array->ptr()->data();
     for (intptr_t i = 0; i < used_data; i += 2) {
-      RawObject* key = data_elements[i];
+      ObjectPtr key = data_elements[i];
       if (key != data_array) {
-        RawObject* value = data_elements[i + 1];
+        ObjectPtr value = data_elements[i + 1];
         s->Push(key);
         s->Push(value);
       }
@@ -4334,7 +4320,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawLinkedHashMap* map = objects_[i];
+      LinkedHashMapPtr map = objects_[i];
       s->AssignRef(map);
     }
   }
@@ -4342,9 +4328,9 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawLinkedHashMap* map = objects_[i];
+      LinkedHashMapPtr map = objects_[i];
       AutoTraceObject(map);
-      s->Write<bool>(map->IsCanonical());
+      s->Write<bool>(map->ptr()->IsCanonical());
 
       WriteField(map, type_arguments_);
 
@@ -4355,12 +4341,12 @@
       // Write out the number of (not deleted) key/value pairs that will follow.
       s->Write<int32_t>((used_data >> 1) - deleted_keys);
 
-      RawArray* data_array = map->ptr()->data_;
-      RawObject** data_elements = data_array->ptr()->data();
+      ArrayPtr data_array = map->ptr()->data_;
+      ObjectPtr* data_elements = data_array->ptr()->data();
       for (intptr_t i = 0; i < used_data; i += 2) {
-        RawObject* key = data_elements[i];
+        ObjectPtr key = data_elements[i];
         if (key != data_array) {
-          RawObject* value = data_elements[i + 1];
+          ObjectPtr value = data_elements[i + 1];
           s->WriteElementRef(key, i);
           s->WriteElementRef(value, i + 1);
         }
@@ -4369,7 +4355,7 @@
   }
 
  private:
-  GrowableArray<RawLinkedHashMap*> objects_;
+  GrowableArray<LinkedHashMapPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -4393,13 +4379,12 @@
     PageSpace* old_space = d->heap()->old_space();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawLinkedHashMap* map = reinterpret_cast<RawLinkedHashMap*>(d->Ref(id));
+      LinkedHashMapPtr map = static_cast<LinkedHashMapPtr>(d->Ref(id));
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(
           map, kLinkedHashMapCid, LinkedHashMap::InstanceSize(), is_canonical);
 
-      map->ptr()->type_arguments_ =
-          reinterpret_cast<RawTypeArguments*>(d->ReadRef());
+      map->ptr()->type_arguments_ = static_cast<TypeArgumentsPtr>(d->ReadRef());
 
       // TODO(rmacnak): Reserve ref ids and co-allocate in ReadAlloc.
       intptr_t pairs = d->Read<int32_t>();
@@ -4408,7 +4393,7 @@
           Utils::RoundUpToPowerOfTwo(used_data),
           static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize));
 
-      RawArray* data = reinterpret_cast<RawArray*>(
+      ArrayPtr data = static_cast<ArrayPtr>(
           AllocateUninitialized(old_space, Array::InstanceSize(data_size)));
       data->ptr()->type_arguments_ = TypeArguments::null();
       data->ptr()->length_ = Smi::New(data_size);
@@ -4436,8 +4421,8 @@
       : SerializationCluster("Array"), cid_(cid) {}
   ~ArraySerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawArray* array = Array::RawCast(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    ArrayPtr array = Array::RawCast(object);
     objects_.Add(array);
 
     s->Push(array->ptr()->type_arguments_);
@@ -4452,7 +4437,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawArray* array = objects_[i];
+      ArrayPtr array = objects_[i];
       s->AssignRef(array);
       AutoTraceObject(array);
       const intptr_t length = Smi::Value(array->ptr()->length_);
@@ -4463,11 +4448,11 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawArray* array = objects_[i];
+      ArrayPtr array = objects_[i];
       AutoTraceObject(array);
       const intptr_t length = Smi::Value(array->ptr()->length_);
       s->WriteUnsigned(length);
-      s->Write<bool>(array->IsCanonical());
+      s->Write<bool>(array->ptr()->IsCanonical());
       WriteField(array, type_arguments_);
       for (intptr_t j = 0; j < length; j++) {
         s->WriteElementRef(array->ptr()->data()[j], j);
@@ -4477,7 +4462,7 @@
 
  private:
   intptr_t cid_;
-  GrowableArray<RawArray*> objects_;
+  GrowableArray<ArrayPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -4500,13 +4485,13 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawArray* array = reinterpret_cast<RawArray*>(d->Ref(id));
+      ArrayPtr array = static_cast<ArrayPtr>(d->Ref(id));
       const intptr_t length = d->ReadUnsigned();
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(array, cid_, Array::InstanceSize(length),
                                      is_canonical);
       array->ptr()->type_arguments_ =
-          reinterpret_cast<RawTypeArguments*>(d->ReadRef());
+          static_cast<TypeArgumentsPtr>(d->ReadRef());
       array->ptr()->length_ = Smi::New(length);
       for (intptr_t j = 0; j < length; j++) {
         array->ptr()->data()[j] = d->ReadRef();
@@ -4524,8 +4509,8 @@
   OneByteStringSerializationCluster() : SerializationCluster("OneByteString") {}
   ~OneByteStringSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawOneByteString* str = reinterpret_cast<RawOneByteString*>(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    OneByteStringPtr str = static_cast<OneByteStringPtr>(object);
     objects_.Add(str);
   }
 
@@ -4534,7 +4519,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawOneByteString* str = objects_[i];
+      OneByteStringPtr str = objects_[i];
       s->AssignRef(str);
       AutoTraceObject(str);
       const intptr_t length = Smi::Value(str->ptr()->length_);
@@ -4545,11 +4530,11 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawOneByteString* str = objects_[i];
+      OneByteStringPtr str = objects_[i];
       AutoTraceObject(str);
       const intptr_t length = Smi::Value(str->ptr()->length_);
       s->WriteUnsigned(length);
-      s->Write<bool>(str->IsCanonical());
+      s->Write<bool>(str->ptr()->IsCanonical());
       intptr_t hash = String::GetCachedHash(str);
       s->Write<int32_t>(hash);
       s->WriteBytes(str->ptr()->data(), length);
@@ -4557,7 +4542,7 @@
   }
 
  private:
-  GrowableArray<RawOneByteString*> objects_;
+  GrowableArray<OneByteStringPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -4580,7 +4565,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawOneByteString* str = reinterpret_cast<RawOneByteString*>(d->Ref(id));
+      OneByteStringPtr str = static_cast<OneByteStringPtr>(d->Ref(id));
       const intptr_t length = d->ReadUnsigned();
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(str, kOneByteStringCid,
@@ -4601,8 +4586,8 @@
   TwoByteStringSerializationCluster() : SerializationCluster("TwoByteString") {}
   ~TwoByteStringSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) {
-    RawTwoByteString* str = reinterpret_cast<RawTwoByteString*>(object);
+  void Trace(Serializer* s, ObjectPtr object) {
+    TwoByteStringPtr str = static_cast<TwoByteStringPtr>(object);
     objects_.Add(str);
   }
 
@@ -4611,7 +4596,7 @@
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
-      RawTwoByteString* str = objects_[i];
+      TwoByteStringPtr str = objects_[i];
       s->AssignRef(str);
       AutoTraceObject(str);
       const intptr_t length = Smi::Value(str->ptr()->length_);
@@ -4622,11 +4607,11 @@
   void WriteFill(Serializer* s) {
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
-      RawTwoByteString* str = objects_[i];
+      TwoByteStringPtr str = objects_[i];
       AutoTraceObject(str);
       const intptr_t length = Smi::Value(str->ptr()->length_);
       s->WriteUnsigned(length);
-      s->Write<bool>(str->IsCanonical());
+      s->Write<bool>(str->ptr()->IsCanonical());
       intptr_t hash = String::GetCachedHash(str);
       s->Write<int32_t>(hash);
       s->WriteBytes(reinterpret_cast<uint8_t*>(str->ptr()->data()), length * 2);
@@ -4634,7 +4619,7 @@
   }
 
  private:
-  GrowableArray<RawTwoByteString*> objects_;
+  GrowableArray<TwoByteStringPtr> objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -4657,7 +4642,7 @@
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawTwoByteString* str = reinterpret_cast<RawTwoByteString*>(d->Ref(id));
+      TwoByteStringPtr str = static_cast<TwoByteStringPtr>(d->Ref(id));
       const intptr_t length = d->ReadUnsigned();
       bool is_canonical = d->Read<bool>();
       Deserializer::InitializeHeader(str, kTwoByteStringCid,
@@ -4683,7 +4668,7 @@
   }
   ~FakeSerializationCluster() {}
 
-  void Trace(Serializer* s, RawObject* object) { UNREACHABLE(); }
+  void Trace(Serializer* s, ObjectPtr object) { UNREACHABLE(); }
   void WriteAlloc(Serializer* s) { UNREACHABLE(); }
   void WriteFill(Serializer* s) { UNREACHABLE(); }
 };
@@ -4741,8 +4726,8 @@
 }
 
 void Serializer::TraceStartWritingObject(const char* type,
-                                         RawObject* obj,
-                                         RawString* name) {
+                                         ObjectPtr obj,
+                                         StringPtr name) {
   if (profile_writer_ == nullptr) return;
 
   intptr_t cid = -1;
@@ -4928,9 +4913,9 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-void Serializer::WriteInstructions(RawInstructions* instr,
+void Serializer::WriteInstructions(InstructionsPtr instr,
                                    uint32_t unchecked_offset,
-                                   RawCode* code,
+                                   CodePtr code,
                                    intptr_t index) {
   ASSERT(code != Code::null());
 
@@ -5010,7 +4995,7 @@
   }
 }
 
-uint32_t Serializer::GetDataOffset(RawObject* object) const {
+uint32_t Serializer::GetDataOffset(ObjectPtr object) const {
   return image_writer_->GetDataOffsetFor(object);
 }
 
@@ -5021,9 +5006,9 @@
   return image_writer_->data_size();
 }
 
-void Serializer::Push(RawObject* object) {
+void Serializer::Push(ObjectPtr object) {
   if (!object->IsHeapObject()) {
-    RawSmi* smi = Smi::RawCast(object);
+    SmiPtr smi = Smi::RawCast(object);
     if (smi_ids_.Lookup(smi) == NULL) {
       SmiObjectIdPair pair;
       pair.smi_ = smi;
@@ -5066,7 +5051,7 @@
   }
 }
 
-void Serializer::Trace(RawObject* object) {
+void Serializer::Trace(ObjectPtr object) {
   intptr_t cid;
   if (!object->IsHeapObject()) {
     // Smis are merged into the Mint cluster because Smis for the writer might
@@ -5097,27 +5082,27 @@
 #endif
 }
 
-void Serializer::UnexpectedObject(RawObject* raw_object, const char* message) {
+void Serializer::UnexpectedObject(ObjectPtr raw_object, const char* message) {
   // Exit the no safepoint scope so we can allocate while printing.
   while (thread()->no_safepoint_scope_depth() > 0) {
     thread()->DecrementNoSafepointScopeDepth();
   }
   Object& object = Object::Handle(raw_object);
   OS::PrintErr("Unexpected object (%s, %s): 0x%" Px " %s\n", message,
-               Snapshot::KindToCString(kind_),
-               reinterpret_cast<uword>(object.raw()), object.ToCString());
+               Snapshot::KindToCString(kind_), static_cast<uword>(object.raw()),
+               object.ToCString());
 #if defined(SNAPSHOT_BACKTRACE)
   while (!object.IsNull()) {
     object = ParentOf(object);
     OS::PrintErr("referenced by 0x%" Px " %s\n",
-                 reinterpret_cast<uword>(object.raw()), object.ToCString());
+                 static_cast<uword>(object.raw()), object.ToCString());
   }
 #endif
   OS::Abort();
 }
 
 #if defined(SNAPSHOT_BACKTRACE)
-RawObject* Serializer::ParentOf(const Object& object) {
+ObjectPtr Serializer::ParentOf(const Object& object) {
   for (intptr_t i = 0; i < parent_pairs_.length(); i += 2) {
     if (parent_pairs_[i]->raw() == object.raw()) {
       return parent_pairs_[i + 1]->raw();
@@ -5172,18 +5157,18 @@
     // We permute the code objects in the [CodeSerializationCluster] so they
     // will arrive in the order in which the [Code]'s instructions will be in
     // memory at AOT runtime.
-    GrowableArray<RawCode*> code_order;
+    GrowableArray<CodePtr> code_order;
     RawCodeSet code_set;
     for (auto& command : writer_commands) {
       if (command.op == ImageWriterCommand::InsertInstructionOfCode) {
-        RawCode* code = command.insert_instruction_of_code.code;
+        CodePtr code = command.insert_instruction_of_code.code;
         ASSERT(!code_set.HasKey(code));
         code_set.Insert(code);
         code_order.Add(code);
         code_order_length++;
       }
     }
-    for (RawCode* code : *code_objects) {
+    for (CodePtr code : *code_objects) {
       if (!code_set.HasKey(code)) {
         code_set.Insert(code);
         code_order.Add(code);
@@ -5320,8 +5305,8 @@
   ASSERT(first_code_id <= compiler::target::kWordMax);
   WriteUnsigned(first_code_id);
 
-  RawCode* previous_code = nullptr;
-  RawCode* recent[kDispatchTableRecentCount] = {nullptr};
+  CodePtr previous_code = nullptr;
+  CodePtr recent[kDispatchTableRecentCount] = {nullptr};
   intptr_t recent_index = 0;
   intptr_t repeat_count = 0;
   for (intptr_t i = 0; i < table_length; i++) {
@@ -5444,7 +5429,6 @@
   AddBaseObject(Object::zero_array().raw(), "Array", "<zero_array>");
   AddBaseObject(Object::dynamic_type().raw(), "Type", "<dynamic type>");
   AddBaseObject(Object::void_type().raw(), "Type", "<void type>");
-  AddBaseObject(Object::never_type().raw(), "Type", "<never type>");
   AddBaseObject(Object::empty_type_arguments().raw(), "TypeArguments", "[]");
   AddBaseObject(Bool::True().raw(), "bool", "true");
   AddBaseObject(Bool::False().raw(), "bool", "false");
@@ -5498,7 +5482,6 @@
   }
   AddBaseObject(table->At(kDynamicCid), "Class");
   AddBaseObject(table->At(kVoidCid), "Class");
-  AddBaseObject(table->At(kNeverCid), "Class");
 
   if (!Snapshot::IncludesCode(kind_)) {
     for (intptr_t i = 0; i < StubCode::NumEntries(); i++) {
@@ -5569,9 +5552,9 @@
   }
 
   // Push roots.
-  RawObject** from = object_store->from();
-  RawObject** to = object_store->to_snapshot(kind_);
-  for (RawObject** p = from; p <= to; p++) {
+  ObjectPtr* from = object_store->from();
+  ObjectPtr* to = object_store->to_snapshot(kind_);
+  for (ObjectPtr* p = from; p <= to; p++) {
     Push(*p);
   }
 
@@ -5595,7 +5578,7 @@
   Serialize();
 
   // Write roots.
-  for (RawObject** p = from; p <= to; p++) {
+  for (ObjectPtr* p = from; p <= to; p++) {
     WriteRootRef(*p, kObjectStoreFieldNames[p - from]);
   }
 
@@ -5652,7 +5635,7 @@
       kind_(kind),
       stream_(buffer, size),
       image_reader_(NULL),
-      refs_(NULL),
+      refs_(nullptr),
       next_ref_index_(1),
       clusters_(NULL),
       field_table_(thread->isolate()->field_table()) {
@@ -5848,7 +5831,7 @@
 #endif
 }
 
-RawApiError* Deserializer::VerifyImageAlignment() {
+ApiErrorPtr Deserializer::VerifyImageAlignment() {
   if (image_reader_ != nullptr) {
     return image_reader_->VerifyAlignment();
   }
@@ -5953,7 +5936,7 @@
   return strdup(message);
 }
 
-RawApiError* FullSnapshotReader::ConvertToApiError(char* message) {
+ApiErrorPtr FullSnapshotReader::ConvertToApiError(char* message) {
   // This can also fail while bringing up the VM isolate, so make sure to
   // allocate the error message in old space.
   const String& msg = String::Handle(String::New(message, Heap::kOld));
@@ -5964,7 +5947,7 @@
   return ApiError::New(msg, Heap::kOld);
 }
 
-void Deserializer::ReadInstructions(RawCode* code,
+void Deserializer::ReadInstructions(CodePtr code,
                                     intptr_t index,
                                     intptr_t start_index) {
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -5979,7 +5962,7 @@
       // object. Thus, retrieve the instructions-related information from there.
       ASSERT((index - start_index) >= code_order_length());
       const uint32_t source_id = (bare_offset >> 1) + start_index;
-      auto const source = reinterpret_cast<RawCode*>(Ref(source_id));
+      auto const source = static_cast<CodePtr>(Ref(source_id));
       code->ptr()->entry_point_ = source->ptr()->entry_point_;
       code->ptr()->unchecked_entry_point_ =
           source->ptr()->unchecked_entry_point_;
@@ -6021,7 +6004,7 @@
     ASSERT((index - start_index) < code_order_length());
     const uword curr_payload_start = Code::PayloadStartOf(code);
     if (index > start_index) {
-      auto const prev = reinterpret_cast<RawCode*>(Ref(index - 1));
+      auto const prev = static_cast<CodePtr>(Ref(index - 1));
       const uword prev_payload_start = Code::PayloadStartOf(prev);
       prev->ptr()->instructions_length_ =
           curr_payload_start - prev_payload_start;
@@ -6038,7 +6021,7 @@
 #endif
 
   const uint32_t offset = Read<uint32_t>();
-  RawInstructions* instr = image_reader_->GetInstructionsAt(offset);
+  InstructionsPtr instr = image_reader_->GetInstructionsAt(offset);
   uint32_t unchecked_offset = ReadUnsigned();
 
   code->ptr()->instructions_ = instr;
@@ -6056,7 +6039,7 @@
   Code::InitializeCachedEntryPointsFrom(code, instr, unchecked_offset);
 }
 
-RawObject* Deserializer::GetObjectAt(uint32_t offset) const {
+ObjectPtr Deserializer::GetObjectAt(uint32_t offset) const {
   return image_reader_->GetObjectAt(offset);
 }
 
@@ -6129,7 +6112,6 @@
   AddBaseObject(Object::zero_array().raw());
   AddBaseObject(Object::dynamic_type().raw());
   AddBaseObject(Object::void_type().raw());
-  AddBaseObject(Object::never_type().raw());
   AddBaseObject(Object::empty_type_arguments().raw());
   AddBaseObject(Bool::True().raw());
   AddBaseObject(Bool::False().raw());
@@ -6168,7 +6150,6 @@
   }
   AddBaseObject(table->At(kDynamicCid));
   AddBaseObject(table->At(kVoidCid));
-  AddBaseObject(table->At(kNeverCid));
 
   if (!Snapshot::IncludesCode(kind_)) {
     for (intptr_t i = 0; i < StubCode::NumEntries(); i++) {
@@ -6244,9 +6225,9 @@
     Deserialize();
 
     // Read roots.
-    RawObject** from = object_store->from();
-    RawObject** to = object_store->to_snapshot(kind_);
-    for (RawObject** p = from; p <= to; p++) {
+    ObjectPtr* from = object_store->from();
+    ObjectPtr* to = object_store->to_snapshot(kind_);
+    for (ObjectPtr* p = from; p <= to; p++) {
       *p = ReadRef();
     }
 
@@ -6364,11 +6345,11 @@
   ASSERT(object_store != NULL);
 
   // These type arguments must always be retained.
-  ASSERT(object_store->type_argument_int()->IsCanonical());
-  ASSERT(object_store->type_argument_double()->IsCanonical());
-  ASSERT(object_store->type_argument_string()->IsCanonical());
-  ASSERT(object_store->type_argument_string_dynamic()->IsCanonical());
-  ASSERT(object_store->type_argument_string_string()->IsCanonical());
+  ASSERT(object_store->type_argument_int()->ptr()->IsCanonical());
+  ASSERT(object_store->type_argument_double()->ptr()->IsCanonical());
+  ASSERT(object_store->type_argument_string()->ptr()->IsCanonical());
+  ASSERT(object_store->type_argument_string_dynamic()->ptr()->IsCanonical());
+  ASSERT(object_store->type_argument_string_string()->ptr()->IsCanonical());
 
   serializer.ReserveHeader();
   serializer.WriteVersionAndFeatures(false);
@@ -6537,7 +6518,7 @@
   return nullptr;
 }
 
-RawApiError* FullSnapshotReader::ReadVMSnapshot() {
+ApiErrorPtr FullSnapshotReader::ReadVMSnapshot() {
   SnapshotHeaderReader header_reader(kind_, buffer_, size_);
 
   intptr_t offset = 0;
@@ -6549,7 +6530,7 @@
 
   Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
                             instructions_image_, offset);
-  RawApiError* api_error = deserializer.VerifyImageAlignment();
+  ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
   if (api_error != ApiError::null()) {
     return api_error;
   }
@@ -6568,7 +6549,7 @@
   return ApiError::null();
 }
 
-RawApiError* FullSnapshotReader::ReadProgramSnapshot() {
+ApiErrorPtr FullSnapshotReader::ReadProgramSnapshot() {
   SnapshotHeaderReader header_reader(kind_, buffer_, size_);
   intptr_t offset = 0;
   char* error =
@@ -6579,7 +6560,7 @@
 
   Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
                             instructions_image_, offset);
-  RawApiError* api_error = deserializer.VerifyImageAlignment();
+  ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
   if (api_error != ApiError::null()) {
     return api_error;
   }
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index b7da466..d9d4123 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -57,7 +57,7 @@
   virtual ~SerializationCluster() {}
 
   // Add [object] to the cluster and push its outgoing references.
-  virtual void Trace(Serializer* serializer, RawObject* object) = 0;
+  virtual void Trace(Serializer* serializer, ObjectPtr object) = 0;
 
   // Write the cluster type and information needed to allocate the cluster's
   // objects. For fixed sized objects, this is just the object count. For
@@ -104,8 +104,8 @@
 
 class SmiObjectIdPair {
  public:
-  SmiObjectIdPair() : smi_(NULL), id_(0) {}
-  RawSmi* smi_;
+  SmiObjectIdPair() : smi_(nullptr), id_(0) {}
+  SmiPtr smi_;
   intptr_t id_;
 
   bool operator==(const SmiObjectIdPair& other) const {
@@ -115,7 +115,7 @@
 
 class SmiObjectIdPairTrait {
  public:
-  typedef RawSmi* Key;
+  typedef SmiPtr Key;
   typedef intptr_t Value;
   typedef SmiObjectIdPair Pair;
 
@@ -162,7 +162,7 @@
 
   void AddVMIsolateBaseObjects();
 
-  void AddBaseObject(RawObject* base_object,
+  void AddBaseObject(ObjectPtr base_object,
                      const char* type = nullptr,
                      const char* name = nullptr) {
     intptr_t ref = AssignRef(base_object);
@@ -181,7 +181,7 @@
     }
   }
 
-  intptr_t AssignRef(RawObject* object) {
+  intptr_t AssignRef(ObjectPtr object) {
     ASSERT(IsAllocatedReference(next_ref_index_));
     if (object->IsHeapObject()) {
       // The object id weak table holds image offsets for Instructions instead
@@ -190,7 +190,7 @@
       heap_->SetObjectId(object, next_ref_index_);
       ASSERT(heap_->GetObjectId(object) == next_ref_index_);
     } else {
-      RawSmi* smi = Smi::RawCast(object);
+      SmiPtr smi = Smi::RawCast(object);
       SmiObjectIdPair* existing_pair = smi_ids_.Lookup(smi);
       if (existing_pair != NULL) {
         ASSERT(existing_pair->id_ == kUnallocatedReference);
@@ -205,15 +205,15 @@
     return next_ref_index_++;
   }
 
-  void Push(RawObject* object);
+  void Push(ObjectPtr object);
 
   void AddUntracedRef() { num_written_objects_++; }
 
-  void Trace(RawObject* object);
+  void Trace(ObjectPtr object);
 
-  void UnexpectedObject(RawObject* object, const char* message);
+  void UnexpectedObject(ObjectPtr object, const char* message);
 #if defined(SNAPSHOT_BACKTRACE)
-  RawObject* ParentOf(const Object& object);
+  ObjectPtr ParentOf(const Object& object);
 #endif
 
   SerializationCluster* NewClusterForClass(intptr_t cid);
@@ -240,9 +240,7 @@
   WriteStream* stream() { return &stream_; }
   intptr_t bytes_written() { return stream_.bytes_written(); }
 
-  void TraceStartWritingObject(const char* type,
-                               RawObject* obj,
-                               RawString* name);
+  void TraceStartWritingObject(const char* type, ObjectPtr obj, StringPtr name);
   void TraceEndWritingObject();
 
   // Writes raw data to the stream (basic type).
@@ -263,7 +261,7 @@
   }
   void Align(intptr_t alignment) { stream_.Align(alignment); }
 
-  void WriteRootRef(RawObject* object, const char* name = nullptr) {
+  void WriteRootRef(ObjectPtr object, const char* name = nullptr) {
     intptr_t id = WriteRefId(object);
     WriteUnsigned(id);
     if (profile_writer_ != nullptr) {
@@ -271,7 +269,7 @@
     }
   }
 
-  void WriteElementRef(RawObject* object, intptr_t index) {
+  void WriteElementRef(ObjectPtr object, intptr_t index) {
     intptr_t id = WriteRefId(object);
     WriteUnsigned(id);
     if (profile_writer_ != nullptr) {
@@ -289,7 +287,7 @@
   // explicitly connected in the heap, for example an object referenced
   // by the global object pool is in reality referenced by the code which
   // caused this reference to be added to the global object pool.
-  void AttributeElementRef(RawObject* object, intptr_t index) {
+  void AttributeElementRef(ObjectPtr object, intptr_t index) {
     intptr_t id = WriteRefId(object);
     if (profile_writer_ != nullptr) {
       profile_writer_->AttributeReferenceTo(
@@ -300,7 +298,7 @@
     }
   }
 
-  void WritePropertyRef(RawObject* object, const char* property) {
+  void WritePropertyRef(ObjectPtr object, const char* property) {
     intptr_t id = WriteRefId(object);
     WriteUnsigned(id);
     if (profile_writer_ != nullptr) {
@@ -312,7 +310,7 @@
     }
   }
 
-  void WriteOffsetRef(RawObject* object, intptr_t offset) {
+  void WriteOffsetRef(ObjectPtr object, intptr_t offset) {
     intptr_t id = WriteRefId(object);
     WriteUnsigned(id);
     if (profile_writer_ != nullptr) {
@@ -335,20 +333,20 @@
   }
 
   template <typename T, typename... P>
-  void WriteFromTo(T* obj, P&&... args) {
-    RawObject** from = obj->from();
-    RawObject** to = obj->to_snapshot(kind(), args...);
-    for (RawObject** p = from; p <= to; p++) {
-      WriteOffsetRef(*p, (p - reinterpret_cast<RawObject**>(obj->ptr())) *
-                             sizeof(RawObject*));
+  void WriteFromTo(T obj, P&&... args) {
+    ObjectPtr* from = obj->ptr()->from();
+    ObjectPtr* to = obj->ptr()->to_snapshot(kind(), args...);
+    for (ObjectPtr* p = from; p <= to; p++) {
+      WriteOffsetRef(*p, (p - reinterpret_cast<ObjectPtr*>(obj->ptr())) *
+                             sizeof(ObjectPtr));
     }
   }
 
   template <typename T, typename... P>
-  void PushFromTo(T* obj, P&&... args) {
-    RawObject** from = obj->from();
-    RawObject** to = obj->to_snapshot(kind(), args...);
-    for (RawObject** p = from; p <= to; p++) {
+  void PushFromTo(T obj, P&&... args) {
+    ObjectPtr* from = obj->ptr()->from();
+    ObjectPtr* to = obj->ptr()->to_snapshot(kind(), args...);
+    for (ObjectPtr* p = from; p <= to; p++) {
       Push(*p);
     }
   }
@@ -358,15 +356,15 @@
   }
 
   void WriteCid(intptr_t cid) {
-    COMPILE_ASSERT(RawObject::kClassIdTagSize <= 32);
+    COMPILE_ASSERT(ObjectLayout::kClassIdTagSize <= 32);
     Write<int32_t>(cid);
   }
 
-  void WriteInstructions(RawInstructions* instr,
+  void WriteInstructions(InstructionsPtr instr,
                          uint32_t unchecked_offset,
-                         RawCode* code,
+                         CodePtr code,
                          intptr_t index);
-  uint32_t GetDataOffset(RawObject* object) const;
+  uint32_t GetDataOffset(ObjectPtr object) const;
   void TraceDataOffset(uint32_t offset);
   intptr_t GetDataSize() const;
 
@@ -383,9 +381,9 @@
   // Returns the reference ID for the object. Fails for objects that have not
   // been allocated a reference ID yet, so should be used only after all
   // WriteAlloc calls.
-  intptr_t WriteRefId(RawObject* object) {
+  intptr_t WriteRefId(ObjectPtr object) {
     if (!object->IsHeapObject()) {
-      RawSmi* smi = Smi::RawCast(object);
+      SmiPtr smi = Smi::RawCast(object);
       auto const id = smi_ids_.Lookup(smi)->id_;
       if (IsAllocatedReference(id)) return id;
       FATAL("Missing ref");
@@ -423,7 +421,7 @@
   WriteStream stream_;
   ImageWriter* image_writer_;
   SerializationCluster** clusters_by_cid_;
-  GrowableArray<RawObject*> stack_;
+  GrowableArray<ObjectPtr> stack_;
   intptr_t num_cids_;
   intptr_t num_base_objects_;
   intptr_t num_written_objects_;
@@ -438,7 +436,7 @@
 
   V8SnapshotProfileWriter* profile_writer_ = nullptr;
   struct ProfilingObject {
-    RawObject* object_ = nullptr;
+    ObjectPtr object_ = nullptr;
     intptr_t id_ = 0;
     intptr_t stream_start_ = 0;
     intptr_t cid_ = -1;
@@ -446,7 +444,7 @@
   OffsetsTable* offsets_table_ = nullptr;
 
 #if defined(SNAPSHOT_BACKTRACE)
-  RawObject* current_parent_;
+  ObjectPtr current_parent_;
   GrowableArray<Object*> parent_pairs_;
 #endif
 
@@ -474,8 +472,8 @@
 struct SerializerWritingObjectScope {
   SerializerWritingObjectScope(Serializer* serializer,
                                const char* type,
-                               RawObject* object,
-                               RawString* name)
+                               ObjectPtr object,
+                               StringPtr name)
       : serializer_(serializer) {
     serializer_->TraceStartWritingObject(type, object, name);
   }
@@ -537,14 +535,14 @@
   //
   // Returns ApiError::null() on success and an ApiError with an an appropriate
   // message otherwise.
-  RawApiError* VerifyImageAlignment();
+  ApiErrorPtr VerifyImageAlignment();
 
   void ReadProgramSnapshot(ObjectStore* object_store);
   void ReadVMSnapshot();
 
   void AddVMIsolateBaseObjects();
 
-  static void InitializeHeader(RawObject* raw,
+  static void InitializeHeader(ObjectPtr raw,
                                intptr_t cid,
                                intptr_t size,
                                bool is_canonical = false);
@@ -568,35 +566,35 @@
   void Advance(intptr_t value) { stream_.Advance(value); }
   void Align(intptr_t alignment) { stream_.Align(alignment); }
 
-  void AddBaseObject(RawObject* base_object) { AssignRef(base_object); }
+  void AddBaseObject(ObjectPtr base_object) { AssignRef(base_object); }
 
-  void AssignRef(RawObject* object) {
+  void AssignRef(ObjectPtr object) {
     ASSERT(next_ref_index_ <= num_objects_);
     refs_->ptr()->data()[next_ref_index_] = object;
     next_ref_index_++;
   }
 
-  RawObject* Ref(intptr_t index) const {
+  ObjectPtr Ref(intptr_t index) const {
     ASSERT(index > 0);
     ASSERT(index <= num_objects_);
     return refs_->ptr()->data()[index];
   }
 
-  RawObject* ReadRef() { return Ref(ReadUnsigned()); }
+  ObjectPtr ReadRef() { return Ref(ReadUnsigned()); }
 
   template <typename T, typename... P>
-  void ReadFromTo(T* obj, P&&... params) {
-    RawObject** from = obj->from();
-    RawObject** to_snapshot = obj->to_snapshot(kind(), params...);
-    RawObject** to = obj->to(params...);
-    for (RawObject** p = from; p <= to_snapshot; p++) {
+  void ReadFromTo(T obj, P&&... params) {
+    ObjectPtr* from = obj->ptr()->from();
+    ObjectPtr* to_snapshot = obj->ptr()->to_snapshot(kind(), params...);
+    ObjectPtr* to = obj->ptr()->to(params...);
+    for (ObjectPtr* p = from; p <= to_snapshot; p++) {
       *p = ReadRef();
     }
     // This is necessary because, unlike Object::Allocate, the clustered
     // deserializer allocates object without null-initializing them. Instead,
     // each deserialization cluster is responsible for initializing every field,
     // ensuring that every field is written to exactly once.
-    for (RawObject** p = to_snapshot + 1; p <= to; p++) {
+    for (ObjectPtr* p = to_snapshot + 1; p <= to; p++) {
       *p = Object::null();
     }
   }
@@ -606,12 +604,12 @@
   }
 
   intptr_t ReadCid() {
-    COMPILE_ASSERT(RawObject::kClassIdTagSize <= 32);
+    COMPILE_ASSERT(ObjectLayout::kClassIdTagSize <= 32);
     return Read<int32_t>();
   }
 
-  void ReadInstructions(RawCode* code, intptr_t index, intptr_t start_index);
-  RawObject* GetObjectAt(uint32_t offset) const;
+  void ReadInstructions(CodePtr code, intptr_t index, intptr_t start_index);
+  ObjectPtr GetObjectAt(uint32_t offset) const;
 
   void SkipHeader() { stream_.SetPosition(Snapshot::kHeaderSize); }
 
@@ -652,7 +650,7 @@
   intptr_t num_objects_;
   intptr_t num_clusters_;
   intptr_t code_order_length_ = 0;
-  RawArray* refs_;
+  ArrayPtr refs_;
   intptr_t next_ref_index_;
   DeserializationCluster** clusters_;
   FieldTable* field_table_;
@@ -723,11 +721,11 @@
                      Thread* thread);
   ~FullSnapshotReader() {}
 
-  RawApiError* ReadVMSnapshot();
-  RawApiError* ReadProgramSnapshot();
+  ApiErrorPtr ReadVMSnapshot();
+  ApiErrorPtr ReadProgramSnapshot();
 
  private:
-  RawApiError* ConvertToApiError(char* message);
+  ApiErrorPtr ConvertToApiError(char* message);
 
   Snapshot::Kind kind_;
   Thread* thread_;
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index d773325..1a5a5f2 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -11,7 +11,7 @@
 
 namespace dart {
 
-void DescriptorList::AddDescriptor(RawPcDescriptors::Kind kind,
+void DescriptorList::AddDescriptor(PcDescriptorsLayout::Kind kind,
                                    intptr_t pc_offset,
                                    intptr_t deopt_id,
                                    TokenPosition token_pos,
@@ -20,19 +20,20 @@
   // yield index 0 is reserved for normal entry.
   RELEASE_ASSERT(yield_index != 0);
 
-  ASSERT((kind == RawPcDescriptors::kRuntimeCall) ||
-         (kind == RawPcDescriptors::kBSSRelocation) ||
-         (kind == RawPcDescriptors::kOther) ||
-         (yield_index != RawPcDescriptors::kInvalidYieldIndex) ||
+  ASSERT((kind == PcDescriptorsLayout::kRuntimeCall) ||
+         (kind == PcDescriptorsLayout::kBSSRelocation) ||
+         (kind == PcDescriptorsLayout::kOther) ||
+         (yield_index != PcDescriptorsLayout::kInvalidYieldIndex) ||
          (deopt_id != DeoptId::kNone));
 
   // When precompiling, we only use pc descriptors for exceptions,
   // relocations and yield indices.
   if (!FLAG_precompiled_mode || try_index != -1 ||
-      yield_index != RawPcDescriptors::kInvalidYieldIndex ||
-      kind == RawPcDescriptors::kBSSRelocation) {
+      yield_index != PcDescriptorsLayout::kInvalidYieldIndex ||
+      kind == PcDescriptorsLayout::kBSSRelocation) {
     const int32_t kind_and_metadata =
-        RawPcDescriptors::KindAndMetadata::Encode(kind, try_index, yield_index);
+        PcDescriptorsLayout::KindAndMetadata::Encode(kind, try_index,
+                                                     yield_index);
 
     PcDescriptors::EncodeInteger(&encoded_data_, kind_and_metadata);
     PcDescriptors::EncodeInteger(&encoded_data_, pc_offset - prev_pc_offset);
@@ -48,7 +49,7 @@
   }
 }
 
-RawPcDescriptors* DescriptorList::FinalizePcDescriptors(uword entry_point) {
+PcDescriptorsPtr DescriptorList::FinalizePcDescriptors(uword entry_point) {
   if (encoded_data_.length() == 0) {
     return Object::empty_descriptors().raw();
   }
@@ -82,7 +83,7 @@
   last_pc_offset_ = pc_offset;
 }
 
-RawCompressedStackMaps* CompressedStackMapsBuilder::Finalize() const {
+CompressedStackMapsPtr CompressedStackMapsBuilder::Finalize() const {
   if (encoded_bytes_.length() == 0) return CompressedStackMaps::null();
   return CompressedStackMaps::NewInlined(encoded_bytes_);
 }
@@ -248,7 +249,7 @@
   return ToCString(Thread::Current()->zone());
 }
 
-RawExceptionHandlers* ExceptionHandlerList::FinalizeExceptionHandlers(
+ExceptionHandlersPtr ExceptionHandlerList::FinalizeExceptionHandlers(
     uword entry_point) const {
   intptr_t num_handlers = Length();
   if (num_handlers == 0) {
@@ -360,7 +361,7 @@
   }
 }
 
-RawTypedData* CatchEntryMovesMapBuilder::FinalizeCatchEntryMovesMap() {
+TypedDataPtr CatchEntryMovesMapBuilder::FinalizeCatchEntryMovesMap() {
   TypedData& td = TypedData::Handle(TypedData::New(
       kTypedDataInt8ArrayCid, stream_.bytes_written(), Heap::kOld));
   NoSafepointScope no_safepoint;
@@ -518,12 +519,12 @@
   BufferAdvancePC(pc_offset - buffered_pc_offset_);
 }
 
-void CodeSourceMapBuilder::NoteDescriptor(RawPcDescriptors::Kind kind,
+void CodeSourceMapBuilder::NoteDescriptor(PcDescriptorsLayout::Kind kind,
                                           int32_t pc_offset,
                                           TokenPosition pos) {
   const uint8_t kCanThrow =
-      RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall |
-      RawPcDescriptors::kRuntimeCall | RawPcDescriptors::kOther;
+      PcDescriptorsLayout::kIcCall | PcDescriptorsLayout::kUnoptStaticCall |
+      PcDescriptorsLayout::kRuntimeCall | PcDescriptorsLayout::kOther;
   if ((kind & kCanThrow) != 0) {
     BufferChangePosition(pos);
     BufferAdvancePC(pc_offset - buffered_pc_offset_);
@@ -552,14 +553,14 @@
   return inlined_functions_.Length() - 1;
 }
 
-RawArray* CodeSourceMapBuilder::InliningIdToFunction() {
+ArrayPtr CodeSourceMapBuilder::InliningIdToFunction() {
   if (inlined_functions_.Length() == 0) {
     return Object::empty_array().raw();
   }
   return Array::MakeFixedLength(inlined_functions_);
 }
 
-RawCodeSourceMap* CodeSourceMapBuilder::Finalize() {
+CodeSourceMapPtr CodeSourceMapBuilder::Finalize() {
   if (!stack_traces_only_) {
     FlushBuffer();
   }
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index be33407..4ad6723 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -26,14 +26,14 @@
 
   ~DescriptorList() {}
 
-  void AddDescriptor(RawPcDescriptors::Kind kind,
+  void AddDescriptor(PcDescriptorsLayout::Kind kind,
                      intptr_t pc_offset,
                      intptr_t deopt_id,
                      TokenPosition token_pos,
                      intptr_t try_index,
                      intptr_t yield_index);
 
-  RawPcDescriptors* FinalizePcDescriptors(uword entry_point);
+  PcDescriptorsPtr FinalizePcDescriptors(uword entry_point);
 
  private:
   GrowableArray<uint8_t> encoded_data_;
@@ -55,7 +55,7 @@
                 BitmapBuilder* bitmap,
                 intptr_t spill_slot_bit_count);
 
-  RawCompressedStackMaps* Finalize() const;
+  CompressedStackMapsPtr Finalize() const;
 
  private:
   intptr_t last_pc_offset_ = 0;
@@ -199,7 +199,7 @@
     return false;
   }
 
-  RawExceptionHandlers* FinalizeExceptionHandlers(uword entry_point) const;
+  ExceptionHandlersPtr FinalizeExceptionHandlers(uword entry_point) const;
 
  private:
   GrowableArray<struct HandlerDesc> list_;
@@ -215,7 +215,7 @@
   void NewMapping(intptr_t pc_offset);
   void Append(const CatchEntryMove& move);
   void EndMapping();
-  RawTypedData* FinalizeCatchEntryMovesMap();
+  TypedDataPtr FinalizeCatchEntryMovesMap();
 
  private:
   class TrieNode;
@@ -263,13 +263,13 @@
   void StartInliningInterval(int32_t pc_offset, intptr_t inline_id);
   void BeginCodeSourceRange(int32_t pc_offset);
   void EndCodeSourceRange(int32_t pc_offset, TokenPosition pos);
-  void NoteDescriptor(RawPcDescriptors::Kind kind,
+  void NoteDescriptor(PcDescriptorsLayout::Kind kind,
                       int32_t pc_offset,
                       TokenPosition pos);
   void NoteNullCheck(int32_t pc_offset, TokenPosition pos, intptr_t name_index);
 
-  RawArray* InliningIdToFunction();
-  RawCodeSourceMap* Finalize();
+  ArrayPtr InliningIdToFunction();
+  CodeSourceMapPtr Finalize();
 
  private:
   intptr_t GetFunctionId(intptr_t inline_id);
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index 8d5a376..512537e 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -96,7 +96,8 @@
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   int call_count = 0;
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kUnoptStaticCall);
+  PcDescriptors::Iterator iter(descriptors,
+                               PcDescriptorsLayout::kUnoptStaticCall);
   CompressedStackMapsBuilder compressed_maps_builder;
   while (iter.MoveNext()) {
     compressed_maps_builder.AddEntry(iter.PcOffset(), stack_bitmap, 0);
@@ -142,7 +143,7 @@
       sizeof(token_positions) / sizeof(token_positions[0]);
 
   for (intptr_t i = 0; i < num_token_positions; i++) {
-    descriptors->AddDescriptor(RawPcDescriptors::kRuntimeCall, 0, 0,
+    descriptors->AddDescriptor(PcDescriptorsLayout::kRuntimeCall, 0, 0,
                                TokenPosition(token_positions[i]), 0, 1);
   }
 
@@ -151,7 +152,7 @@
 
   ASSERT(!finalized_descriptors.IsNull());
   PcDescriptors::Iterator it(finalized_descriptors,
-                             RawPcDescriptors::kRuntimeCall);
+                             PcDescriptorsLayout::kRuntimeCall);
 
   intptr_t i = 0;
   while (it.MoveNext()) {
diff --git a/runtime/vm/code_patcher.h b/runtime/vm/code_patcher.h
index b9cc1c9..ba7ff04 100644
--- a/runtime/vm/code_patcher.h
+++ b/runtime/vm/code_patcher.h
@@ -14,10 +14,6 @@
 // Forward declaration.
 class Code;
 class ICData;
-class RawArray;
-class RawCode;
-class RawFunction;
-class RawObject;
 
 #if defined(TARGET_ARCH_IA32)
 // Stack-allocated class to create a scope where the specified region
@@ -47,13 +43,13 @@
 
   // Return the target address of the static call before return_address
   // in given code.
-  static RawCode* GetStaticCallTargetAt(uword return_address, const Code& code);
+  static CodePtr GetStaticCallTargetAt(uword return_address, const Code& code);
 
   // Get instance call information. Returns the call target and sets the output
   // parameter data if non-NULL.
-  static RawCode* GetInstanceCallAt(uword return_address,
-                                    const Code& caller_code,
-                                    Object* data);
+  static CodePtr GetInstanceCallAt(uword return_address,
+                                   const Code& caller_code,
+                                   Object* data);
 
   // Change the state of an instance call by patching the corresponding object
   // pool entries (non-IA32) or instructions (IA32).
@@ -69,9 +65,9 @@
 
   // Return target of an unoptimized static call and its ICData object
   // (calls target via a stub).
-  static RawFunction* GetUnoptimizedStaticCallAt(uword return_address,
-                                                 const Code& code,
-                                                 ICData* ic_data);
+  static FunctionPtr GetUnoptimizedStaticCallAt(uword return_address,
+                                                const Code& code,
+                                                ICData* ic_data);
 
   static void InsertDeoptimizationCallAt(uword start);
 
@@ -88,14 +84,14 @@
                                                        const Code& caller_code,
                                                        const Object& data,
                                                        const Code& target);
-  static RawObject* GetSwitchableCallDataAt(uword return_address,
-                                            const Code& caller_code);
-  static RawCode* GetSwitchableCallTargetAt(uword return_address,
-                                            const Code& caller_code);
+  static ObjectPtr GetSwitchableCallDataAt(uword return_address,
+                                           const Code& caller_code);
+  static CodePtr GetSwitchableCallTargetAt(uword return_address,
+                                           const Code& caller_code);
 
-  static RawCode* GetNativeCallAt(uword return_address,
-                                  const Code& caller_code,
-                                  NativeFunction* target);
+  static CodePtr GetNativeCallAt(uword return_address,
+                                 const Code& caller_code,
+                                 NativeFunction* target);
 
   static void PatchNativeCallAt(uword return_address,
                                 const Code& caller_code,
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index 52bdb2c..38729b1 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -12,8 +12,8 @@
 
 namespace dart {
 
-RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
-                                            const Code& code) {
+CodePtr CodePatcher::GetStaticCallTargetAt(uword return_address,
+                                           const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern call(return_address, code);
   return call.TargetCode();
@@ -31,9 +31,9 @@
   UNREACHABLE();
 }
 
-RawCode* CodePatcher::GetInstanceCallAt(uword return_address,
-                                        const Code& caller_code,
-                                        Object* data) {
+CodePtr CodePatcher::GetInstanceCallAt(uword return_address,
+                                       const Code& caller_code,
+                                       Object* data) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   ICCallPattern call(return_address, caller_code);
   if (data != NULL) {
@@ -65,9 +65,9 @@
   call.SetTargetCode(target);
 }
 
-RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
-                                                     const Code& caller_code,
-                                                     ICData* ic_data_result) {
+FunctionPtr CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
+                                                    const Code& caller_code,
+                                                    ICData* ic_data_result) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   ICCallPattern static_call(return_address, caller_code);
   ICData& ic_data = ICData::Handle();
@@ -108,8 +108,8 @@
   }
 }
 
-RawCode* CodePatcher::GetSwitchableCallTargetAt(uword return_address,
-                                                const Code& caller_code) {
+CodePtr CodePatcher::GetSwitchableCallTargetAt(uword return_address,
+                                               const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     BareSwitchableCallPattern call(return_address, caller_code);
@@ -120,8 +120,8 @@
   }
 }
 
-RawObject* CodePatcher::GetSwitchableCallDataAt(uword return_address,
-                                                const Code& caller_code) {
+ObjectPtr CodePatcher::GetSwitchableCallDataAt(uword return_address,
+                                               const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     BareSwitchableCallPattern call(return_address, caller_code);
@@ -144,9 +144,9 @@
   });
 }
 
-RawCode* CodePatcher::GetNativeCallAt(uword return_address,
-                                      const Code& code,
-                                      NativeFunction* target) {
+CodePtr CodePatcher::GetNativeCallAt(uword return_address,
+                                     const Code& code,
+                                     NativeFunction* target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCallPattern call(return_address, code);
   *target = call.native_function();
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
index abffa1b..824274a 100644
--- a/runtime/vm/code_patcher_arm64.cc
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -24,8 +24,8 @@
 
   intptr_t pp_index() const { return index_; }
 
-  RawCode* Target() const {
-    return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(pp_index()));
+  CodePtr Target() const {
+    return static_cast<CodePtr>(object_pool_.ObjectAt(pp_index()));
   }
 
   void SetTarget(const Code& target) const {
@@ -42,8 +42,8 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(PoolPointerCall);
 };
 
-RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
-                                            const Code& code) {
+CodePtr CodePatcher::GetStaticCallTargetAt(uword return_address,
+                                           const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
   PoolPointerCall call(return_address, code);
   return call.Target();
@@ -67,9 +67,9 @@
   UNREACHABLE();
 }
 
-RawCode* CodePatcher::GetInstanceCallAt(uword return_address,
-                                        const Code& caller_code,
-                                        Object* data) {
+CodePtr CodePatcher::GetInstanceCallAt(uword return_address,
+                                       const Code& caller_code,
+                                       Object* data) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   ICCallPattern call(return_address, caller_code);
   if (data != NULL) {
@@ -101,9 +101,9 @@
   call.SetTargetCode(target);
 }
 
-RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
-                                                     const Code& code,
-                                                     ICData* ic_data_result) {
+FunctionPtr CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
+                                                    const Code& code,
+                                                    ICData* ic_data_result) {
   ASSERT(code.ContainsInstructionAt(return_address));
   ICCallPattern static_call(return_address, code);
   ICData& ic_data = ICData::Handle();
@@ -144,8 +144,8 @@
   }
 }
 
-RawCode* CodePatcher::GetSwitchableCallTargetAt(uword return_address,
-                                                const Code& caller_code) {
+CodePtr CodePatcher::GetSwitchableCallTargetAt(uword return_address,
+                                               const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     BareSwitchableCallPattern call(return_address, caller_code);
@@ -156,8 +156,8 @@
   }
 }
 
-RawObject* CodePatcher::GetSwitchableCallDataAt(uword return_address,
-                                                const Code& caller_code) {
+ObjectPtr CodePatcher::GetSwitchableCallDataAt(uword return_address,
+                                               const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     BareSwitchableCallPattern call(return_address, caller_code);
@@ -180,9 +180,9 @@
   });
 }
 
-RawCode* CodePatcher::GetNativeCallAt(uword return_address,
-                                      const Code& caller_code,
-                                      NativeFunction* target) {
+CodePtr CodePatcher::GetNativeCallAt(uword return_address,
+                                     const Code& caller_code,
+                                     NativeFunction* target) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   NativeCallPattern call(return_address, caller_code);
   *target = call.native_function();
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index de240e2..135452e 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -29,8 +29,8 @@
   const String& function_name =
       String::Handle(Symbols::New(thread, "callerFunction"));
   const Function& function = Function::Handle(Function::New(
-      function_name, RawFunction::kRegularFunction, true, false, false, false,
-      false, owner_class, TokenPosition::kNoSource));
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kNoSource));
 
   const String& target_name = String::Handle(String::New("targetFunction"));
   const intptr_t kTypeArgsLen = 0;
diff --git a/runtime/vm/code_patcher_arm_test.cc b/runtime/vm/code_patcher_arm_test.cc
index 2e31dc8..96c34e6 100644
--- a/runtime/vm/code_patcher_arm_test.cc
+++ b/runtime/vm/code_patcher_arm_test.cc
@@ -29,8 +29,8 @@
   const String& function_name =
       String::Handle(Symbols::New(thread, "callerFunction"));
   const Function& function = Function::Handle(Function::New(
-      function_name, RawFunction::kRegularFunction, true, false, false, false,
-      false, owner_class, TokenPosition::kNoSource));
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kNoSource));
 
   const String& target_name = String::Handle(String::New("targetFunction"));
   const intptr_t kTypeArgsLen = 0;
diff --git a/runtime/vm/code_patcher_ia32.cc b/runtime/vm/code_patcher_ia32.cc
index a82d378..3c886ba 100644
--- a/runtime/vm/code_patcher_ia32.cc
+++ b/runtime/vm/code_patcher_ia32.cc
@@ -26,8 +26,8 @@
     ASSERT(IsValid());
   }
 
-  RawObject* ic_data() const {
-    return *reinterpret_cast<RawObject**>(start_ + 1);
+  ObjectPtr ic_data() const {
+    return *reinterpret_cast<ObjectPtr*>(start_ + 1);
   }
 
   static const int kMovInstructionSize = 5;
@@ -89,20 +89,20 @@
 #endif  // DEBUG
   }
 
-  RawObject* data() const { return *reinterpret_cast<RawObject**>(start_ + 1); }
+  ObjectPtr data() const { return *reinterpret_cast<ObjectPtr*>(start_ + 1); }
   void set_data(const Object& data) const {
     uword* cache_addr = reinterpret_cast<uword*>(start_ + 1);
-    uword imm = reinterpret_cast<uword>(data.raw());
+    uword imm = static_cast<uword>(data.raw());
     *cache_addr = imm;
   }
 
-  RawCode* target() const {
+  CodePtr target() const {
     const uword imm = *reinterpret_cast<uword*>(start_ + 6);
-    return reinterpret_cast<RawCode*>(imm);
+    return static_cast<CodePtr>(imm);
   }
   void set_target(const Code& target) const {
     uword* target_addr = reinterpret_cast<uword*>(start_ + 6);
-    uword imm = reinterpret_cast<uword>(target.raw());
+    uword imm = static_cast<uword>(target.raw());
     *target_addr = imm;
   }
 
@@ -142,14 +142,14 @@
     return (code_bytes[0] == 0xBF) && (code_bytes[5] == 0xFF);
   }
 
-  RawCode* target() const {
+  CodePtr target() const {
     const uword imm = *reinterpret_cast<uword*>(start_ + 1);
-    return reinterpret_cast<RawCode*>(imm);
+    return static_cast<CodePtr>(imm);
   }
 
   void set_target(const Code& target) const {
     uword* target_addr = reinterpret_cast<uword*>(start_ + 1);
-    uword imm = reinterpret_cast<uword>(target.raw());
+    uword imm = static_cast<uword>(target.raw());
     *target_addr = imm;
     CPU::FlushICache(start_ + 1, sizeof(imm));
   }
@@ -169,8 +169,8 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(StaticCall);
 };
 
-RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
-                                            const Code& code) {
+CodePtr CodePatcher::GetStaticCallTargetAt(uword return_address,
+                                           const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
   StaticCall call(return_address);
   return call.target();
@@ -194,9 +194,9 @@
   UNREACHABLE();
 }
 
-RawCode* CodePatcher::GetInstanceCallAt(uword return_address,
-                                        const Code& caller_code,
-                                        Object* data) {
+CodePtr CodePatcher::GetInstanceCallAt(uword return_address,
+                                       const Code& caller_code,
+                                       Object* data) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   InstanceCall call(return_address);
   if (data != NULL) {
@@ -232,9 +232,9 @@
   call.set_target(target);
 }
 
-RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
-                                                     const Code& caller_code,
-                                                     ICData* ic_data_result) {
+FunctionPtr CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
+                                                    const Code& caller_code,
+                                                    ICData* ic_data_result) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   UnoptimizedStaticCall static_call(return_address);
   ICData& ic_data = ICData::Handle();
@@ -263,15 +263,15 @@
   UNREACHABLE();
 }
 
-RawCode* CodePatcher::GetSwitchableCallTargetAt(uword return_address,
-                                                const Code& caller_code) {
+CodePtr CodePatcher::GetSwitchableCallTargetAt(uword return_address,
+                                               const Code& caller_code) {
   // Switchable instance calls only generated for precompilation.
   UNREACHABLE();
   return Code::null();
 }
 
-RawObject* CodePatcher::GetSwitchableCallDataAt(uword return_address,
-                                                const Code& caller_code) {
+ObjectPtr CodePatcher::GetSwitchableCallDataAt(uword return_address,
+                                               const Code& caller_code) {
   // Switchable instance calls only generated for precompilation.
   UNREACHABLE();
   return Object::null();
@@ -284,9 +284,9 @@
   UNREACHABLE();
 }
 
-RawCode* CodePatcher::GetNativeCallAt(uword return_address,
-                                      const Code& caller_code,
-                                      NativeFunction* target) {
+CodePtr CodePatcher::GetNativeCallAt(uword return_address,
+                                     const Code& caller_code,
+                                     NativeFunction* target) {
   UNREACHABLE();
   return NULL;
 }
diff --git a/runtime/vm/code_patcher_ia32_test.cc b/runtime/vm/code_patcher_ia32_test.cc
index 8aa1cd6..812f485 100644
--- a/runtime/vm/code_patcher_ia32_test.cc
+++ b/runtime/vm/code_patcher_ia32_test.cc
@@ -29,8 +29,8 @@
   const String& function_name =
       String::Handle(Symbols::New(thread, "callerFunction"));
   const Function& function = Function::Handle(Function::New(
-      function_name, RawFunction::kRegularFunction, true, false, false, false,
-      false, owner_class, TokenPosition::kNoSource));
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kNoSource));
 
   const String& target_name = String::Handle(String::New("targetFunction"));
   const intptr_t kTypeArgsLen = 0;
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index b4c241c..d9062a4 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -75,7 +75,7 @@
 
   intptr_t argument_index() const { return argument_index_; }
 
-  RawCode* target() const {
+  CodePtr target() const {
     Code& code = Code::Handle();
     code ^= object_pool_.ObjectAt(code_index_);
     return code.raw();
@@ -128,7 +128,7 @@
 #endif  // DEBUG
   }
 
-  RawObject* data() const { return object_pool_.ObjectAt(argument_index()); }
+  ObjectPtr data() const { return object_pool_.ObjectAt(argument_index()); }
   void set_data(const Object& data) const {
     ASSERT(data.IsArray() || data.IsICData() || data.IsMegamorphicCache());
     object_pool_.SetObjectAt(argument_index(), data);
@@ -149,7 +149,7 @@
 #endif  // DEBUG
   }
 
-  RawObject* ic_data() const { return object_pool_.ObjectAt(argument_index()); }
+  ObjectPtr ic_data() const { return object_pool_.ObjectAt(argument_index()); }
 
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(UnoptimizedStaticCall);
@@ -194,7 +194,7 @@
     ASSERT(Object::Handle(object_pool_.ObjectAt(code_index_)).IsCode());
   }
 
-  RawCode* Target() const {
+  CodePtr Target() const {
     Code& code = Code::Handle();
     code ^= object_pool_.ObjectAt(code_index_);
     return code.raw();
@@ -228,7 +228,7 @@
   intptr_t data_index() const { return data_index_; }
   intptr_t target_index() const { return target_index_; }
 
-  RawObject* data() const { return object_pool_.ObjectAt(data_index()); }
+  ObjectPtr data() const { return object_pool_.ObjectAt(data_index()); }
 
   void SetData(const Object& data) const {
     ASSERT(!Object::Handle(object_pool_.ObjectAt(data_index())).IsCode());
@@ -321,8 +321,8 @@
     // No need to flush the instruction cache, since the code is not modified.
   }
 
-  RawCode* target() const {
-    return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_index()));
+  CodePtr target() const {
+    return static_cast<CodePtr>(object_pool_.ObjectAt(target_index()));
   }
 };
 
@@ -395,13 +395,13 @@
     object_pool_.SetRawValueAt(target_index(), target.MonomorphicEntryPoint());
   }
 
-  RawCode* target() const {
+  CodePtr target() const {
     const uword pc = object_pool_.RawValueAt(target_index());
-    auto rct = Isolate::Current()->reverse_pc_lookup_cache();
+    auto rct = IsolateGroup::Current()->reverse_pc_lookup_cache();
     if (rct->Contains(pc)) {
       return rct->Lookup(pc);
     }
-    rct = Dart::vm_isolate()->reverse_pc_lookup_cache();
+    rct = Dart::vm_isolate()->group()->reverse_pc_lookup_cache();
     if (rct->Contains(pc)) {
       return rct->Lookup(pc);
     }
@@ -409,8 +409,8 @@
   }
 };
 
-RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
-                                            const Code& code) {
+CodePtr CodePatcher::GetStaticCallTargetAt(uword return_address,
+                                           const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
   PoolPointerCall call(return_address, code);
   return call.Target();
@@ -430,9 +430,9 @@
   call.SetTarget(new_target);
 }
 
-RawCode* CodePatcher::GetInstanceCallAt(uword return_address,
-                                        const Code& caller_code,
-                                        Object* data) {
+CodePtr CodePatcher::GetInstanceCallAt(uword return_address,
+                                       const Code& caller_code,
+                                       Object* data) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   InstanceCall call(return_address, caller_code);
   if (data != NULL) {
@@ -468,9 +468,9 @@
   UNREACHABLE();
 }
 
-RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
-                                                     const Code& caller_code,
-                                                     ICData* ic_data_result) {
+FunctionPtr CodePatcher::GetUnoptimizedStaticCallAt(uword return_address,
+                                                    const Code& caller_code,
+                                                    ICData* ic_data_result) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   UnoptimizedStaticCall static_call(return_address, caller_code);
   ICData& ic_data = ICData::Handle();
@@ -511,8 +511,8 @@
   }
 }
 
-RawCode* CodePatcher::GetSwitchableCallTargetAt(uword return_address,
-                                                const Code& caller_code) {
+CodePtr CodePatcher::GetSwitchableCallTargetAt(uword return_address,
+                                               const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     BareSwitchableCall call(return_address, caller_code);
@@ -523,8 +523,8 @@
   }
 }
 
-RawObject* CodePatcher::GetSwitchableCallDataAt(uword return_address,
-                                                const Code& caller_code) {
+ObjectPtr CodePatcher::GetSwitchableCallDataAt(uword return_address,
+                                               const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     BareSwitchableCall call(return_address, caller_code);
@@ -547,9 +547,9 @@
   });
 }
 
-RawCode* CodePatcher::GetNativeCallAt(uword return_address,
-                                      const Code& caller_code,
-                                      NativeFunction* target) {
+CodePtr CodePatcher::GetNativeCallAt(uword return_address,
+                                     const Code& caller_code,
+                                     NativeFunction* target) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
   NativeCall call(return_address, caller_code);
   *target = call.native_function();
diff --git a/runtime/vm/code_patcher_x64_test.cc b/runtime/vm/code_patcher_x64_test.cc
index e838880..d00b53c 100644
--- a/runtime/vm/code_patcher_x64_test.cc
+++ b/runtime/vm/code_patcher_x64_test.cc
@@ -29,8 +29,8 @@
   const String& function_name =
       String::Handle(Symbols::New(thread, "callerFunction"));
   const Function& function = Function::Handle(Function::New(
-      function_name, RawFunction::kRegularFunction, true, false, false, false,
-      false, owner_class, TokenPosition::kNoSource));
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kNoSource));
 
   const String& target_name = String::Handle(String::New("targetFunction"));
   const intptr_t kTypeArgsLen = 0;
diff --git a/runtime/vm/compilation_trace.cc b/runtime/vm/compilation_trace.cc
index 1846638..174c252 100644
--- a/runtime/vm/compilation_trace.cc
+++ b/runtime/vm/compilation_trace.cc
@@ -79,8 +79,7 @@
   return NULL;
 }
 
-RawObject* CompilationTraceLoader::CompileTrace(uint8_t* buffer,
-                                                intptr_t size) {
+ObjectPtr CompilationTraceLoader::CompileTrace(uint8_t* buffer, intptr_t size) {
   // First compile functions named in the trace.
   char* cursor = reinterpret_cast<char*>(buffer);
   char* limit = cursor + size;
@@ -125,7 +124,7 @@
     arguments_descriptor = ArgumentsDescriptor::NewBoxed(kTypeArgsLen, argc);
     dispatcher = closure_class.GetInvocationDispatcher(
         Symbols::Call(), arguments_descriptor,
-        RawFunction::kInvokeFieldDispatcher, true /* create_if_absent */);
+        FunctionLayout::kInvokeFieldDispatcher, true /* create_if_absent */);
     error_ = CompileFunction(dispatcher);
     if (error_.IsError()) {
       return error_.raw();
@@ -160,9 +159,9 @@
 //    compile the getter, create its method extractor and compile that.
 //  - If looking for a getter and we only have a const field, evaluate the const
 //    field.
-RawObject* CompilationTraceLoader::CompileTriple(const char* uri_cstr,
-                                                 const char* cls_cstr,
-                                                 const char* func_cstr) {
+ObjectPtr CompilationTraceLoader::CompileTriple(const char* uri_cstr,
+                                                const char* cls_cstr,
+                                                const char* func_cstr) {
   uri_ = Symbols::New(thread_, uri_cstr);
   class_name_ = Symbols::New(thread_, cls_cstr);
   function_name_ = Symbols::New(thread_, func_cstr);
@@ -363,7 +362,7 @@
   return Object::null();
 }
 
-RawObject* CompilationTraceLoader::CompileFunction(const Function& function) {
+ObjectPtr CompilationTraceLoader::CompileFunction(const Function& function) {
   if (function.is_abstract() || function.HasCode()) {
     return Object::null();
   }
@@ -612,7 +611,7 @@
   delete[] cid_map_;
 }
 
-RawObject* TypeFeedbackLoader::LoadFeedback(ReadStream* stream) {
+ObjectPtr TypeFeedbackLoader::LoadFeedback(ReadStream* stream) {
   stream_ = stream;
 
   error_ = CheckHeader();
@@ -656,7 +655,7 @@
   return Error::null();
 }
 
-RawObject* TypeFeedbackLoader::CheckHeader() {
+ObjectPtr TypeFeedbackLoader::CheckHeader() {
   const char* expected_version = Version::SnapshotString();
   ASSERT(expected_version != NULL);
   const intptr_t version_len = strlen(expected_version);
@@ -710,7 +709,7 @@
   return Error::null();
 }
 
-RawObject* TypeFeedbackLoader::LoadClasses() {
+ObjectPtr TypeFeedbackLoader::LoadClasses() {
   num_cids_ = ReadInt();
 
   cid_map_ = new intptr_t[num_cids_];
@@ -731,7 +730,7 @@
   return Error::null();
 }
 
-RawObject* TypeFeedbackLoader::LoadFields() {
+ObjectPtr TypeFeedbackLoader::LoadFields() {
   for (intptr_t cid = kNumPredefinedCids; cid < num_cids_; cid++) {
     cls_ = ReadClassByName();
     bool skip = cls_.IsNull();
@@ -799,7 +798,7 @@
   return Error::null();
 }
 
-RawObject* TypeFeedbackLoader::LoadFunction() {
+ObjectPtr TypeFeedbackLoader::LoadFunction() {
   bool skip = false;
 
   cls_ = ReadClassByName();
@@ -813,7 +812,7 @@
   }
 
   func_name_ = ReadString();  // Without private mangling.
-  RawFunction::Kind kind = static_cast<RawFunction::Kind>(ReadInt());
+  FunctionLayout::Kind kind = static_cast<FunctionLayout::Kind>(ReadInt());
   intptr_t token_pos = ReadInt();
   intptr_t usage = ReadInt();
   intptr_t inlining_depth = ReadInt();
@@ -923,8 +922,8 @@
   return Error::null();
 }
 
-RawFunction* TypeFeedbackLoader::FindFunction(RawFunction::Kind kind,
-                                              intptr_t token_pos) {
+FunctionPtr TypeFeedbackLoader::FindFunction(FunctionLayout::Kind kind,
+                                             intptr_t token_pos) {
   if (cls_name_.Equals(Symbols::TopLevel())) {
     func_ = lib_.LookupFunctionAllowPrivate(func_name_);
   } else {
@@ -933,7 +932,7 @@
 
   if (!func_.IsNull()) {
     // Found regular method.
-  } else if (kind == RawFunction::kMethodExtractor) {
+  } else if (kind == FunctionLayout::kMethodExtractor) {
     ASSERT(Field::IsGetterName(func_name_));
     // Without private mangling:
     String& name = String::Handle(zone_, Field::NameFromGetter(func_name_));
@@ -945,7 +944,7 @@
     } else {
       func_ = Function::null();
     }
-  } else if (kind == RawFunction::kDynamicInvocationForwarder) {
+  } else if (kind == FunctionLayout::kDynamicInvocationForwarder) {
     // Without private mangling:
     String& name = String::Handle(
         zone_, Function::DemangleDynamicInvocationForwarderName(func_name_));
@@ -957,7 +956,7 @@
     } else {
       func_ = Function::null();
     }
-  } else if (kind == RawFunction::kClosureFunction) {
+  } else if (kind == FunctionLayout::kClosureFunction) {
     // Note this lookup relies on parent functions appearing before child
     // functions in the serialized feedback, so the parent will have already
     // been unoptimized compilated and the child function created and added to
@@ -984,7 +983,7 @@
   }
 
   if (!func_.IsNull()) {
-    if (kind == RawFunction::kImplicitClosureFunction) {
+    if (kind == FunctionLayout::kImplicitClosureFunction) {
       func_ = func_.ImplicitClosureFunction();
     }
     if (func_.is_abstract() || (func_.kind() != kind)) {
@@ -995,7 +994,7 @@
   return func_.raw();
 }
 
-RawClass* TypeFeedbackLoader::ReadClassByName() {
+ClassPtr TypeFeedbackLoader::ReadClassByName() {
   uri_ = ReadString();
   cls_name_ = ReadString();
 
@@ -1021,7 +1020,7 @@
   return cls_.raw();
 }
 
-RawString* TypeFeedbackLoader::ReadString() {
+StringPtr TypeFeedbackLoader::ReadString() {
   intptr_t len = stream_->ReadUnsigned();
   const char* cstr =
       reinterpret_cast<const char*>(stream_->AddressOfCurrentPosition());
diff --git a/runtime/vm/compilation_trace.h b/runtime/vm/compilation_trace.h
index d7fed08..cf26611 100644
--- a/runtime/vm/compilation_trace.h
+++ b/runtime/vm/compilation_trace.h
@@ -35,13 +35,13 @@
  public:
   explicit CompilationTraceLoader(Thread* thread);
 
-  RawObject* CompileTrace(uint8_t* buffer, intptr_t buffer_length);
+  ObjectPtr CompileTrace(uint8_t* buffer, intptr_t buffer_length);
 
  private:
-  RawObject* CompileTriple(const char* uri_cstr,
-                           const char* cls_cstr,
-                           const char* func_cstr);
-  RawObject* CompileFunction(const Function& function);
+  ObjectPtr CompileTriple(const char* uri_cstr,
+                          const char* cls_cstr,
+                          const char* func_cstr);
+  ObjectPtr CompileFunction(const Function& function);
   void SpeculateInstanceCallTargets(const Function& function);
 
   Thread* thread_;
@@ -95,17 +95,17 @@
   explicit TypeFeedbackLoader(Thread* thread);
   ~TypeFeedbackLoader();
 
-  RawObject* LoadFeedback(ReadStream* stream);
+  ObjectPtr LoadFeedback(ReadStream* stream);
 
  private:
-  RawObject* CheckHeader();
-  RawObject* LoadClasses();
-  RawObject* LoadFields();
-  RawObject* LoadFunction();
-  RawFunction* FindFunction(RawFunction::Kind kind, intptr_t token_pos);
+  ObjectPtr CheckHeader();
+  ObjectPtr LoadClasses();
+  ObjectPtr LoadFields();
+  ObjectPtr LoadFunction();
+  FunctionPtr FindFunction(FunctionLayout::Kind kind, intptr_t token_pos);
 
-  RawClass* ReadClassByName();
-  RawString* ReadString();
+  ClassPtr ReadClassByName();
+  StringPtr ReadString();
   intptr_t ReadInt() { return stream_->Read<int32_t>(); }
 
   Thread* thread_;
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index e881bcd..4da0354 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -851,7 +851,7 @@
 
   if (has_one_target) {
     const Function& target = targets.FirstTarget();
-    RawFunction::Kind function_kind = target.kind();
+    FunctionLayout::Kind function_kind = target.kind();
     if (flow_graph()->CheckForInstanceCall(instr, function_kind) ==
         FlowGraph::ToCheck::kNoCheck) {
       StaticCallInstr* call = StaticCallInstr::FromCall(
diff --git a/runtime/vm/compiler/aot/dispatch_table_generator.cc b/runtime/vm/compiler/aot/dispatch_table_generator.cc
index 1b24c52..af7a1e1 100644
--- a/runtime/vm/compiler/aot/dispatch_table_generator.cc
+++ b/runtime/vm/compiler/aot/dispatch_table_generator.cc
@@ -657,7 +657,7 @@
   table_size_ = fitter.TableSize();
 }
 
-RawArray* DispatchTableGenerator::BuildCodeArray() {
+ArrayPtr DispatchTableGenerator::BuildCodeArray() {
   auto& entries = Array::Handle(zone_, Array::New(table_size_, Heap::kOld));
   for (intptr_t i = 0; i < table_rows_.length(); i++) {
     table_rows_[i]->FillTable(classes_, entries);
diff --git a/runtime/vm/compiler/aot/dispatch_table_generator.h b/runtime/vm/compiler/aot/dispatch_table_generator.h
index 336e532..20b6ca3 100644
--- a/runtime/vm/compiler/aot/dispatch_table_generator.h
+++ b/runtime/vm/compiler/aot/dispatch_table_generator.h
@@ -93,7 +93,7 @@
 
   // Build up an array of Code objects, used to serialize the information
   // deserialized as a DispatchTable at runtime.
-  RawArray* BuildCodeArray();
+  ArrayPtr BuildCodeArray();
 
  private:
   void ReadTableSelectorInfo();
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 1137f5c..f63bf47 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -134,7 +134,7 @@
   Thread::Current()->long_jump_base()->Jump(1, error);
 }
 
-RawError* Precompiler::CompileAll() {
+ErrorPtr Precompiler::CompileAll() {
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     Precompiler precompiler(Thread::Current());
@@ -608,7 +608,7 @@
             if (subcls.is_allocated()) {
               // Add dispatcher to cls.
               dispatcher = subcls.GetInvocationDispatcher(
-                  field_name, args_desc, RawFunction::kInvokeFieldDispatcher,
+                  field_name, args_desc, FunctionLayout::kInvokeFieldDispatcher,
                   /* create_if_absent = */ true);
               if (FLAG_trace_precompiler) {
                 THR_Print("Added invoke-field-dispatcher for %s to %s\n",
@@ -806,7 +806,7 @@
   }
   Code& code = Code::Handle(Z, function.CurrentCode());
   if (code.IsNull()) {
-    ASSERT(function.kind() == RawFunction::kSignatureFunction);
+    ASSERT(function.kind() == FunctionLayout::kSignatureFunction);
   } else {
     const ExceptionHandlers& handlers =
         ExceptionHandlers::Handle(Z, code.exception_handlers());
@@ -940,8 +940,8 @@
           precompiler_(precompiler),
           subinstance_(Object::Handle()) {}
 
-    virtual void VisitPointers(RawObject** first, RawObject** last) {
-      for (RawObject** current = first; current <= last; current++) {
+    virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+      for (ObjectPtr* current = first; current <= last; current++) {
         subinstance_ = *current;
         if (subinstance_.IsInstance()) {
           precompiler_->AddConstObject(Instance::Cast(subinstance_));
@@ -956,16 +956,17 @@
   };
 
   ConstObjectVisitor visitor(this, I);
-  instance.raw()->VisitPointers(&visitor);
+  instance.raw()->ptr()->VisitPointers(&visitor);
 }
 
 void Precompiler::AddClosureCall(const Array& arguments_descriptor) {
   const Class& cache_class =
       Class::Handle(Z, I->object_store()->closure_class());
-  const Function& dispatcher = Function::Handle(
-      Z, cache_class.GetInvocationDispatcher(
-             Symbols::Call(), arguments_descriptor,
-             RawFunction::kInvokeFieldDispatcher, true /* create_if_absent */));
+  const Function& dispatcher =
+      Function::Handle(Z, cache_class.GetInvocationDispatcher(
+                              Symbols::Call(), arguments_descriptor,
+                              FunctionLayout::kInvokeFieldDispatcher,
+                              true /* create_if_absent */));
   AddFunction(dispatcher);
 }
 
@@ -1181,7 +1182,7 @@
 
           if ((type == EntryPointPragma::kAlways ||
                type == EntryPointPragma::kGetterOnly) &&
-              function.kind() != RawFunction::kConstructor &&
+              function.kind() != FunctionLayout::kConstructor &&
               !function.IsSetterFunction()) {
             function2 = function.ImplicitClosureFunction();
             AddFunction(function2);
@@ -1191,7 +1192,7 @@
             AddInstantiatedClass(cls);
           }
         }
-        if (function.kind() == RawFunction::kImplicitGetter &&
+        if (function.kind() == FunctionLayout::kImplicitGetter &&
             !implicit_getters.IsNull()) {
           for (intptr_t i = 0; i < implicit_getters.Length(); ++i) {
             field ^= implicit_getters.At(i);
@@ -1200,7 +1201,7 @@
             }
           }
         }
-        if (function.kind() == RawFunction::kImplicitSetter &&
+        if (function.kind() == FunctionLayout::kImplicitSetter &&
             !implicit_setters.IsNull()) {
           for (intptr_t i = 0; i < implicit_setters.Length(); ++i) {
             field ^= implicit_setters.At(i);
@@ -1209,7 +1210,7 @@
             }
           }
         }
-        if (function.kind() == RawFunction::kImplicitStaticGetter &&
+        if (function.kind() == FunctionLayout::kImplicitStaticGetter &&
             !implicit_static_getters.IsNull()) {
           for (intptr_t i = 0; i < implicit_static_getters.Length(); ++i) {
             field ^= implicit_static_getters.At(i);
@@ -1281,7 +1282,7 @@
           if (IsSent(selector3)) {
             AddFunction(function);
           }
-        } else if (function.kind() == RawFunction::kRegularFunction) {
+        } else if (function.kind() == FunctionLayout::kRegularFunction) {
           selector2 = Field::LookupGetterSymbol(selector);
           if (IsSent(selector2)) {
             metadata = kernel::ProcedureAttributesOf(function, Z);
@@ -1300,12 +1301,12 @@
           }
         }
 
-        if (function.kind() == RawFunction::kImplicitSetter ||
-            function.kind() == RawFunction::kSetterFunction ||
-            function.kind() == RawFunction::kRegularFunction) {
+        if (function.kind() == FunctionLayout::kImplicitSetter ||
+            function.kind() == FunctionLayout::kSetterFunction ||
+            function.kind() == FunctionLayout::kRegularFunction) {
           selector2 = Function::CreateDynamicInvocationForwarderName(selector);
           if (IsSent(selector2)) {
-            if (function.kind() == RawFunction::kImplicitSetter) {
+            if (function.kind() == FunctionLayout::kImplicitSetter) {
               field = function.accessor_field();
               metadata = kernel::ProcedureAttributesOf(field, Z);
             } else if (!found_metadata) {
@@ -1333,7 +1334,7 @@
            String::Cast(a).Equals(String::Cast(b));
   }
   static uword Hash(const Object& obj) { return String::Cast(obj).Hash(); }
-  static RawObject* NewKey(const String& str) { return str.raw(); }
+  static ObjectPtr NewKey(const String& str) { return str.raw(); }
 };
 
 typedef UnorderedHashMap<NameFunctionsTraits> Table;
@@ -1710,7 +1711,7 @@
                               GrowableHandlePtrArray<const AbstractType>* types)
           : type_(AbstractType::Handle(zone)), types_(types) {}
 
-      void VisitObject(RawObject* obj) {
+      void VisitObject(ObjectPtr obj) {
         if (obj->GetClassId() == kTypeCid || obj->GetClassId() == kTypeRefCid) {
           type_ ^= obj;
           types_->Add(type_);
@@ -2157,7 +2158,7 @@
 typedef UnorderedHashSet<CodeKeyTraits> CodeSet;
 
 #if defined(DEBUG)
-RawFunction* Precompiler::FindUnvisitedRetainedFunction() {
+FunctionPtr Precompiler::FindUnvisitedRetainedFunction() {
   class CodeChecker : public CodeVisitor {
    public:
     CodeChecker()
@@ -2200,7 +2201,7 @@
                               GrowableHandlePtrArray<const Script>* scripts)
         : script_(Script::Handle(zone)), scripts_(scripts) {}
 
-    void VisitObject(RawObject* obj) {
+    void VisitObject(ObjectPtr obj) {
       if (obj->GetClassId() == kScriptCid) {
         script_ ^= obj;
         scripts_->Add(Script::Cast(script_));
@@ -2563,10 +2564,10 @@
   return is_compiled;
 }
 
-static RawError* PrecompileFunctionHelper(Precompiler* precompiler,
-                                          CompilationPipeline* pipeline,
-                                          const Function& function,
-                                          bool optimized) {
+static ErrorPtr PrecompileFunctionHelper(Precompiler* precompiler,
+                                         CompilationPipeline* pipeline,
+                                         const Function& function,
+                                         bool optimized) {
   // Check that we optimize, except if the function is not optimizable.
   ASSERT(CompilerState::Current().is_aot());
   ASSERT(!function.IsOptimizable() || optimized);
@@ -2638,10 +2639,10 @@
   return Error::null();
 }
 
-RawError* Precompiler::CompileFunction(Precompiler* precompiler,
-                                       Thread* thread,
-                                       Zone* zone,
-                                       const Function& function) {
+ErrorPtr Precompiler::CompileFunction(Precompiler* precompiler,
+                                      Thread* thread,
+                                      Zone* zone,
+                                      const Function& function) {
   VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, "CompileFunction", function);
 
@@ -2780,8 +2781,8 @@
   PreventRenaming("_NamespaceImpl");
 }
 
-RawString* Obfuscator::ObfuscationState::RenameImpl(const String& name,
-                                                    bool atomic) {
+StringPtr Obfuscator::ObfuscationState::RenameImpl(const String& name,
+                                                   bool atomic) {
   ASSERT(name.IsSymbol());
 
   renamed_ ^= renames_.GetOrNull(name);
@@ -2857,7 +2858,7 @@
   }
 }
 
-RawString* Obfuscator::ObfuscationState::NewAtomicRename(
+StringPtr Obfuscator::ObfuscationState::NewAtomicRename(
     bool should_be_private) {
   do {
     NextName();
@@ -2869,8 +2870,8 @@
   return renamed_.raw();
 }
 
-RawString* Obfuscator::ObfuscationState::BuildRename(const String& name,
-                                                     bool atomic) {
+StringPtr Obfuscator::ObfuscationState::BuildRename(const String& name,
+                                                    bool atomic) {
   if (atomic) {
     return NewAtomicRename(name.CharAt(0) == '_');
   }
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index 66c091c..c4135c4 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -25,7 +25,6 @@
 class Field;
 class Function;
 class GrowableObjectArray;
-class RawError;
 class SequenceNode;
 class String;
 class ParsedJSONObject;
@@ -192,12 +191,12 @@
 
 class Precompiler : public ValueObject {
  public:
-  static RawError* CompileAll();
+  static ErrorPtr CompileAll();
 
-  static RawError* CompileFunction(Precompiler* precompiler,
-                                   Thread* thread,
-                                   Zone* zone,
-                                   const Function& function);
+  static ErrorPtr CompileFunction(Precompiler* precompiler,
+                                  Thread* thread,
+                                  Zone* zone,
+                                  const Function& function);
 
   // Returns true if get:runtimeType is not overloaded by any class.
   bool get_runtime_type_is_unique() const {
@@ -269,7 +268,7 @@
   void DropClasses();
   void DropLibraries();
 
-  DEBUG_ONLY(RawFunction* FindUnvisitedRetainedFunction());
+  DEBUG_ONLY(FunctionPtr FindUnvisitedRetainedFunction());
 
   void Obfuscate();
 
@@ -348,7 +347,7 @@
       return String::Cast(obj).Hash();
     }
   }
-  static RawObject* NewKey(const Function& function) { return function.raw(); }
+  static ObjectPtr NewKey(const Function& function) { return function.raw(); }
 };
 
 typedef UnorderedHashSet<FunctionsTraits> UniqueFunctionsSet;
@@ -406,7 +405,7 @@
   //
   // This method is guaranteed to return the same value for the same
   // input and it always preserves leading '_' even for atomic renames.
-  RawString* Rename(const String& name, bool atomic = false) {
+  StringPtr Rename(const String& name, bool atomic = false) {
     if (state_ == NULL) {
       return name.raw();
     }
@@ -444,13 +443,13 @@
   static const intptr_t kSavedStateRenamesIndex = 1;
   static const intptr_t kSavedStateSize = 2;
 
-  static RawArray* GetRenamesFromSavedState(const Array& saved_state) {
+  static ArrayPtr GetRenamesFromSavedState(const Array& saved_state) {
     Array& renames = Array::Handle();
     renames ^= saved_state.At(kSavedStateRenamesIndex);
     return renames.raw();
   }
 
-  static RawString* GetNameFromSavedState(const Array& saved_state) {
+  static StringPtr GetNameFromSavedState(const Array& saved_state) {
     String& name = String::Handle();
     name ^= saved_state.At(kSavedStateNameIndex);
     return name.raw();
@@ -494,7 +493,7 @@
     //
     // This method is guaranteed to return the same value for the same
     // input.
-    RawString* RenameImpl(const String& name, bool atomic);
+    StringPtr RenameImpl(const String& name, bool atomic);
 
     // Register an identity (name -> name) mapping in the renaming map.
     //
@@ -511,11 +510,11 @@
     // For non-atomic renames BuildRename ensures that private mangled
     // identifiers (_ident@key) are renamed consistently with non-mangled
     // counterparts (_ident).
-    RawString* BuildRename(const String& name, bool atomic);
+    StringPtr BuildRename(const String& name, bool atomic);
 
     // Generate a new rename. If |should_be_private| is set to true
     // then we prefix returned identifier with '_'.
-    RawString* NewAtomicRename(bool should_be_private);
+    StringPtr NewAtomicRename(bool should_be_private);
 
     // Update next_ to generate the next free rename.
     void NextName();
@@ -549,7 +548,7 @@
   Obfuscator(Thread* thread, const String& private_key) {}
   ~Obfuscator() {}
 
-  RawString* Rename(const String& name, bool atomic = false) {
+  StringPtr Rename(const String& name, bool atomic = false) {
     return name.raw();
   }
 
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm.cc b/runtime/vm/compiler/asm_intrinsifier_arm.cc
index aff1c83..531400e 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm.cc
@@ -127,10 +127,10 @@
   /* R1: new object end address. */                                            \
   /* R2: allocation size. */                                                   \
   {                                                                            \
-    __ CompareImmediate(R2, target::RawObject::kSizeTagMaxSizeTag);            \
+    __ CompareImmediate(R2, target::ObjectLayout::kSizeTagMaxSizeTag);         \
     __ mov(R3,                                                                 \
            Operand(R2, LSL,                                                    \
-                   target::RawObject::kTagBitsSizeTagPos -                     \
+                   target::ObjectLayout::kTagBitsSizeTagPos -                  \
                        target::ObjectAlignment::kObjectAlignmentLog2),         \
            LS);                                                                \
     __ mov(R3, Operand(0), HI);                                                \
@@ -2060,10 +2060,10 @@
   // R1: new object end address.
   // R2: allocation size.
   {
-    const intptr_t shift = target::RawObject::kTagBitsSizeTagPos -
+    const intptr_t shift = target::ObjectLayout::kTagBitsSizeTagPos -
                            target::ObjectAlignment::kObjectAlignmentLog2;
 
-    __ CompareImmediate(R2, target::RawObject::kSizeTagMaxSizeTag);
+    __ CompareImmediate(R2, target::ObjectLayout::kSizeTagMaxSizeTag);
     __ mov(R3, Operand(R2, LSL, shift), LS);
     __ mov(R3, Operand(0), HI);
 
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm64.cc b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
index a8a5491..82c487d 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
@@ -149,9 +149,9 @@
   /* R1: new object end address. */                                            \
   /* R2: allocation size. */                                                   \
   {                                                                            \
-    __ CompareImmediate(R2, target::RawObject::kSizeTagMaxSizeTag);            \
+    __ CompareImmediate(R2, target::ObjectLayout::kSizeTagMaxSizeTag);         \
     __ LslImmediate(R2, R2,                                                    \
-                    target::RawObject::kTagBitsSizeTagPos -                    \
+                    target::ObjectLayout::kTagBitsSizeTagPos -                 \
                         target::ObjectAlignment::kObjectAlignmentLog2);        \
     __ csel(R2, ZR, R2, HI);                                                   \
                                                                                \
@@ -2131,10 +2131,10 @@
   // R1: new object end address.
   // R2: allocation size.
   {
-    const intptr_t shift = target::RawObject::kTagBitsSizeTagPos -
+    const intptr_t shift = target::ObjectLayout::kTagBitsSizeTagPos -
                            target::ObjectAlignment::kObjectAlignmentLog2;
 
-    __ CompareImmediate(R2, target::RawObject::kSizeTagMaxSizeTag);
+    __ CompareImmediate(R2, target::ObjectLayout::kSizeTagMaxSizeTag);
     __ LslImmediate(R2, R2, shift);
     __ csel(R2, R2, ZR, LS);
 
diff --git a/runtime/vm/compiler/asm_intrinsifier_ia32.cc b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
index 0f0f759..45627cb 100644
--- a/runtime/vm/compiler/asm_intrinsifier_ia32.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
@@ -135,9 +135,9 @@
   /* EDI: allocation size. */                                                  \
   {                                                                            \
     Label size_tag_overflow, done;                                             \
-    __ cmpl(EDI, Immediate(target::RawObject::kSizeTagMaxSizeTag));            \
+    __ cmpl(EDI, Immediate(target::ObjectLayout::kSizeTagMaxSizeTag));         \
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);                     \
-    __ shll(EDI, Immediate(target::RawObject::kTagBitsSizeTagPos -             \
+    __ shll(EDI, Immediate(target::ObjectLayout::kTagBitsSizeTagPos -          \
                            target::ObjectAlignment::kObjectAlignmentLog2));    \
     __ jmp(&done, Assembler::kNearJump);                                       \
                                                                                \
@@ -2075,9 +2075,9 @@
   // EDI: allocation size.
   {
     Label size_tag_overflow, done;
-    __ cmpl(EDI, Immediate(target::RawObject::kSizeTagMaxSizeTag));
+    __ cmpl(EDI, Immediate(target::ObjectLayout::kSizeTagMaxSizeTag));
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shll(EDI, Immediate(target::RawObject::kTagBitsSizeTagPos -
+    __ shll(EDI, Immediate(target::ObjectLayout::kTagBitsSizeTagPos -
                            target::ObjectAlignment::kObjectAlignmentLog2));
     __ jmp(&done, Assembler::kNearJump);
 
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index 6ce01a9..1305a35 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -137,9 +137,9 @@
   /* R13: scratch register. */                                                 \
   {                                                                            \
     Label size_tag_overflow, done;                                             \
-    __ cmpq(RDI, Immediate(target::RawObject::kSizeTagMaxSizeTag));            \
+    __ cmpq(RDI, Immediate(target::ObjectLayout::kSizeTagMaxSizeTag));         \
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);                     \
-    __ shlq(RDI, Immediate(target::RawObject::kTagBitsSizeTagPos -             \
+    __ shlq(RDI, Immediate(target::ObjectLayout::kTagBitsSizeTagPos -          \
                            target::ObjectAlignment::kObjectAlignmentLog2));    \
     __ jmp(&done, Assembler::kNearJump);                                       \
                                                                                \
@@ -2105,9 +2105,9 @@
   // RDI: allocation size.
   {
     Label size_tag_overflow, done;
-    __ cmpq(RDI, Immediate(target::RawObject::kSizeTagMaxSizeTag));
+    __ cmpq(RDI, Immediate(target::ObjectLayout::kSizeTagMaxSizeTag));
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shlq(RDI, Immediate(target::RawObject::kTagBitsSizeTagPos -
+    __ shlq(RDI, Immediate(target::ObjectLayout::kTagBitsSizeTagPos -
                            target::ObjectAlignment::kObjectAlignmentLog2));
     __ jmp(&done, Assembler::kNearJump);
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index cac81b9..957457f 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -1741,7 +1741,7 @@
   //    in progress
   // If so, call the WriteBarrier stub, which will either add object to the
   // store buffer (case 1) or add value to the marking stack (case 2).
-  // Compare RawObject::StorePointer.
+  // Compare ObjectLayout::StorePointer.
   Label done;
   if (can_be_smi == kValueCanBeSmi) {
     BranchIfSmi(value, &done);
@@ -1749,7 +1749,7 @@
   if (!lr_reserved) Push(LR);
   ldrb(TMP, FieldAddress(object, target::Object::tags_offset()));
   ldrb(LR, FieldAddress(value, target::Object::tags_offset()));
-  and_(TMP, LR, Operand(TMP, LSR, target::RawObject::kBarrierOverlapShift));
+  and_(TMP, LR, Operand(TMP, LSR, target::ObjectLayout::kBarrierOverlapShift));
   ldr(LR, Address(THR, target::Thread::write_barrier_mask_offset()));
   tst(TMP, Operand(LR));
   if (value != kWriteBarrierValueReg) {
@@ -1805,7 +1805,7 @@
   //    in progress
   // If so, call the WriteBarrier stub, which will either add object to the
   // store buffer (case 1) or add value to the marking stack (case 2).
-  // Compare RawObject::StorePointer.
+  // Compare ObjectLayout::StorePointer.
   Label done;
   if (can_be_smi == kValueCanBeSmi) {
     BranchIfSmi(value, &done);
@@ -1813,7 +1813,7 @@
   if (!lr_reserved) Push(LR);
   ldrb(TMP, FieldAddress(object, target::Object::tags_offset()));
   ldrb(LR, FieldAddress(value, target::Object::tags_offset()));
-  and_(TMP, LR, Operand(TMP, LSR, target::RawObject::kBarrierOverlapShift));
+  and_(TMP, LR, Operand(TMP, LSR, target::ObjectLayout::kBarrierOverlapShift));
   ldr(LR, Address(THR, target::Thread::write_barrier_mask_offset()));
   tst(TMP, Operand(LR));
 
@@ -1853,7 +1853,7 @@
   StoreIntoObjectFilter(object, value, &done, kValueCanBeSmi, kJumpToNoUpdate);
 
   ldrb(TMP, FieldAddress(object, target::Object::tags_offset()));
-  tst(TMP, Operand(1 << target::RawObject::kOldAndNotRememberedBit));
+  tst(TMP, Operand(1 << target::ObjectLayout::kOldAndNotRememberedBit));
   b(&done, ZERO);
 
   Stop("Store buffer update is required");
@@ -1974,30 +1974,30 @@
 }
 
 void Assembler::ExtractClassIdFromTags(Register result, Register tags) {
-  ASSERT(target::RawObject::kClassIdTagPos == 16);
-  ASSERT(target::RawObject::kClassIdTagSize == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagPos == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagSize == 16);
   ASSERT(sizeof(classid_t) == sizeof(uint16_t));
-  Lsr(result, tags, Operand(target::RawObject::kClassIdTagPos), AL);
+  Lsr(result, tags, Operand(target::ObjectLayout::kClassIdTagPos), AL);
 }
 
 void Assembler::ExtractInstanceSizeFromTags(Register result, Register tags) {
-  ASSERT(target::RawObject::kSizeTagPos == 8);
-  ASSERT(target::RawObject::kSizeTagSize == 8);
+  ASSERT(target::ObjectLayout::kSizeTagPos == 8);
+  ASSERT(target::ObjectLayout::kSizeTagSize == 8);
   Lsr(result, tags,
-      Operand(target::RawObject::kSizeTagPos -
+      Operand(target::ObjectLayout::kSizeTagPos -
               target::ObjectAlignment::kObjectAlignmentLog2),
       AL);
   AndImmediate(result, result,
-               (Utils::NBitMask(target::RawObject::kSizeTagSize)
+               (Utils::NBitMask(target::ObjectLayout::kSizeTagSize)
                 << target::ObjectAlignment::kObjectAlignmentLog2));
 }
 
 void Assembler::LoadClassId(Register result, Register object, Condition cond) {
-  ASSERT(target::RawObject::kClassIdTagPos == 16);
-  ASSERT(target::RawObject::kClassIdTagSize == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagPos == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagSize == 16);
   const intptr_t class_id_offset =
       target::Object::tags_offset() +
-      target::RawObject::kClassIdTagPos / kBitsPerByte;
+      target::ObjectLayout::kClassIdTagPos / kBitsPerByte;
   ldrh(result, FieldAddress(object, class_id_offset), cond);
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 5f2165a..c45ce98 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -1198,8 +1198,8 @@
   // before the code can be used.
   //
   // The neccessary information for the "linker" (i.e. the relocation
-  // information) is stored in [RawCode::static_calls_target_table_]: an entry
-  // of the form
+  // information) is stored in [CodeLayout::static_calls_target_table_]: an
+  // entry of the form
   //
   //   (Code::kPcRelativeCall & pc_offset, <target-code>, <target-function>)
   //
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index e418a0c..52b18c2 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -982,14 +982,15 @@
   //    in progress
   // If so, call the WriteBarrier stub, which will either add object to the
   // store buffer (case 1) or add value to the marking stack (case 2).
-  // Compare RawObject::StorePointer.
+  // Compare ObjectLayout::StorePointer.
   Label done;
   if (can_be_smi == kValueCanBeSmi) {
     BranchIfSmi(value, &done);
   }
   ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
   ldr(TMP2, FieldAddress(value, target::Object::tags_offset()), kUnsignedByte);
-  and_(TMP, TMP2, Operand(TMP, LSR, target::RawObject::kBarrierOverlapShift));
+  and_(TMP, TMP2,
+       Operand(TMP, LSR, target::ObjectLayout::kBarrierOverlapShift));
   tst(TMP, Operand(BARRIER_MASK));
   b(&done, ZERO);
 
@@ -1043,14 +1044,15 @@
   //    in progress
   // If so, call the WriteBarrier stub, which will either add object to the
   // store buffer (case 1) or add value to the marking stack (case 2).
-  // Compare RawObject::StorePointer.
+  // Compare ObjectLayout::StorePointer.
   Label done;
   if (can_be_smi == kValueCanBeSmi) {
     BranchIfSmi(value, &done);
   }
   ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
   ldr(TMP2, FieldAddress(value, target::Object::tags_offset()), kUnsignedByte);
-  and_(TMP, TMP2, Operand(TMP, LSR, target::RawObject::kBarrierOverlapShift));
+  and_(TMP, TMP2,
+       Operand(TMP, LSR, target::ObjectLayout::kBarrierOverlapShift));
   tst(TMP, Operand(BARRIER_MASK));
   b(&done, ZERO);
   if (!lr_reserved) Push(LR);
@@ -1076,7 +1078,7 @@
   StoreIntoObjectFilter(object, value, &done, kValueCanBeSmi, kJumpToNoUpdate);
 
   ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
-  tsti(TMP, Immediate(1 << target::RawObject::kOldAndNotRememberedBit));
+  tsti(TMP, Immediate(1 << target::ObjectLayout::kOldAndNotRememberedBit));
   b(&done, ZERO);
 
   Stop("Store buffer update is required");
@@ -1128,26 +1130,26 @@
 }
 
 void Assembler::ExtractClassIdFromTags(Register result, Register tags) {
-  ASSERT(target::RawObject::kClassIdTagPos == 16);
-  ASSERT(target::RawObject::kClassIdTagSize == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagPos == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagSize == 16);
   ASSERT(sizeof(classid_t) == sizeof(uint16_t));
-  LsrImmediate(result, tags, target::RawObject::kClassIdTagPos, kWord);
+  LsrImmediate(result, tags, target::ObjectLayout::kClassIdTagPos, kWord);
 }
 
 void Assembler::ExtractInstanceSizeFromTags(Register result, Register tags) {
-  ASSERT(target::RawObject::kSizeTagPos == 8);
-  ASSERT(target::RawObject::kSizeTagSize == 8);
-  ubfx(result, tags, target::RawObject::kSizeTagPos,
-       target::RawObject::kSizeTagSize);
+  ASSERT(target::ObjectLayout::kSizeTagPos == 8);
+  ASSERT(target::ObjectLayout::kSizeTagSize == 8);
+  ubfx(result, tags, target::ObjectLayout::kSizeTagPos,
+       target::ObjectLayout::kSizeTagSize);
   LslImmediate(result, result, target::ObjectAlignment::kObjectAlignmentLog2);
 }
 
 void Assembler::LoadClassId(Register result, Register object) {
-  ASSERT(target::RawObject::kClassIdTagPos == 16);
-  ASSERT(target::RawObject::kClassIdTagSize == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagPos == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagSize == 16);
   const intptr_t class_id_offset =
       target::Object::tags_offset() +
-      target::RawObject::kClassIdTagPos / kBitsPerByte;
+      target::ObjectLayout::kClassIdTagPos / kBitsPerByte;
   LoadFromOffset(result, object, class_id_offset - kHeapObjectTag,
                  kUnsignedHalfword);
 }
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index d2b5e28..4f8f3bd 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -1655,8 +1655,8 @@
   // the code can be used.
   //
   // The neccessary information for the "linker" (i.e. the relocation
-  // information) is stored in [RawCode::static_calls_target_table_]: an entry
-  // of the form
+  // information) is stored in [CodeLayout::static_calls_target_table_]: an
+  // entry of the form
   //
   //   (Code::kPcRelativeCall & pc_offset, <target-code>, <target-function>)
   //
diff --git a/runtime/vm/compiler/assembler/assembler_arm64_test.cc b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
index 11c255f..e8c5698 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
@@ -2551,7 +2551,7 @@
 }
 
 ASSEMBLER_TEST_RUN(LoadObjectNull, test) {
-  EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<RawObject*>());
+  EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<ObjectPtr>());
 }
 
 // PushObject null.
@@ -2566,7 +2566,7 @@
 }
 
 ASSEMBLER_TEST_RUN(PushObjectNull, test) {
-  EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<RawObject*>());
+  EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<ObjectPtr>());
 }
 
 // CompareObject null.
@@ -2584,7 +2584,7 @@
 }
 
 ASSEMBLER_TEST_RUN(CompareObjectNull, test) {
-  EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<RawObject*>());
+  EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<ObjectPtr>());
 }
 
 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) {
@@ -2597,7 +2597,7 @@
 }
 
 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) {
-  EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<RawObject*>());
+  EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<ObjectPtr>());
 }
 
 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) {
@@ -2610,7 +2610,7 @@
 }
 
 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) {
-  EXPECT_EQ(Bool::False().raw(), test->InvokeWithCodeAndThread<RawObject*>());
+  EXPECT_EQ(Bool::False().raw(), test->InvokeWithCodeAndThread<ObjectPtr>());
 }
 
 ASSEMBLER_TEST_GENERATE(CSelTrue, assembler) {
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index df6fe5f..cd735a8 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -1934,7 +1934,7 @@
   StoreIntoObjectFilter(object, value, &done, kValueCanBeSmi, kJumpToNoUpdate);
 
   testb(FieldAddress(object, target::Object::tags_offset()),
-        Immediate(1 << target::RawObject::kOldAndNotRememberedBit));
+        Immediate(1 << target::ObjectLayout::kOldAndNotRememberedBit));
   j(ZERO, &done, Assembler::kNearJump);
 
   Stop("Store buffer update is required");
@@ -2622,11 +2622,11 @@
 }
 
 void Assembler::LoadClassId(Register result, Register object) {
-  ASSERT(target::RawObject::kClassIdTagPos == 16);
-  ASSERT(target::RawObject::kClassIdTagSize == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagPos == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagSize == 16);
   const intptr_t class_id_offset =
       target::Object::tags_offset() +
-      target::RawObject::kClassIdTagPos / kBitsPerByte;
+      target::ObjectLayout::kClassIdTagPos / kBitsPerByte;
   movzxw(result, FieldAddress(object, class_id_offset));
 }
 
@@ -2652,11 +2652,11 @@
                                      Register scratch,
                                      Label* is_smi) {
   ASSERT(kSmiTagShift == 1);
-  ASSERT(target::RawObject::kClassIdTagPos == 16);
-  ASSERT(target::RawObject::kClassIdTagSize == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagPos == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagSize == 16);
   const intptr_t class_id_offset =
       target::Object::tags_offset() +
-      target::RawObject::kClassIdTagPos / kBitsPerByte;
+      target::ObjectLayout::kClassIdTagPos / kBitsPerByte;
 
   // Untag optimistically. Tag bit is shifted into the CARRY.
   SmiUntag(object);
@@ -2682,8 +2682,8 @@
     Bind(&join);
   } else {
     ASSERT(result != object);
-    static const intptr_t kSmiCidSource = kSmiCid
-                                          << target::RawObject::kClassIdTagPos;
+    static const intptr_t kSmiCidSource =
+        kSmiCid << target::ObjectLayout::kClassIdTagPos;
 
     // Make a dummy "Object" whose cid is kSmiCid.
     movl(result, Immediate(reinterpret_cast<int32_t>(&kSmiCidSource) + 1));
diff --git a/runtime/vm/compiler/assembler/assembler_test.cc b/runtime/vm/compiler/assembler/assembler_test.cc
index 7a7b54a..02f6b59 100644
--- a/runtime/vm/compiler/assembler/assembler_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_test.cc
@@ -17,8 +17,8 @@
 
 ASSEMBLER_TEST_RUN(StoreIntoObject, test) {
 #define TEST_CODE(value, growable_array, thread)                               \
-  test->Invoke<void, RawObject*, RawObject*, Thread*>(value, growable_array,   \
-                                                      thread)
+  test->Invoke<void, ObjectPtr, ObjectPtr, Thread*>(value, growable_array,     \
+                                                    thread)
 
   const Array& old_array = Array::Handle(Array::New(3, Heap::kOld));
   const Array& new_array = Array::Handle(Array::New(3, Heap::kNew));
@@ -38,7 +38,7 @@
   for (int i = -128; i < 128; i++) {
     smi = Smi::New(i);
     TEST_CODE(smi.raw(), grow_old_array.raw(), thread);
-    EXPECT(reinterpret_cast<RawArray*>(smi.raw()) == grow_old_array.data());
+    EXPECT(static_cast<ArrayPtr>(smi.raw()) == grow_old_array.data());
     EXPECT(!thread->StoreBufferContains(grow_old_array.raw()));
   }
 
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 624b28e..ef5a397 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -1374,14 +1374,14 @@
   //    in progress
   // If so, call the WriteBarrier stub, which will either add object to the
   // store buffer (case 1) or add value to the marking stack (case 2).
-  // Compare RawObject::StorePointer.
+  // Compare ObjectLayout::StorePointer.
   Label done;
   if (can_be_smi == kValueCanBeSmi) {
     testq(value, Immediate(kSmiTagMask));
     j(ZERO, &done, kNearJump);
   }
   movb(TMP, FieldAddress(object, target::Object::tags_offset()));
-  shrl(TMP, Immediate(target::RawObject::kBarrierOverlapShift));
+  shrl(TMP, Immediate(target::ObjectLayout::kBarrierOverlapShift));
   andl(TMP, Address(THR, target::Thread::write_barrier_mask_offset()));
   testb(FieldAddress(value, target::Object::tags_offset()), TMP);
   j(ZERO, &done, kNearJump);
@@ -1426,14 +1426,14 @@
   //    in progress
   // If so, call the WriteBarrier stub, which will either add object to the
   // store buffer (case 1) or add value to the marking stack (case 2).
-  // Compare RawObject::StorePointer.
+  // Compare ObjectLayout::StorePointer.
   Label done;
   if (can_be_smi == kValueCanBeSmi) {
     testq(value, Immediate(kSmiTagMask));
     j(ZERO, &done, kNearJump);
   }
   movb(TMP, FieldAddress(object, target::Object::tags_offset()));
-  shrl(TMP, Immediate(target::RawObject::kBarrierOverlapShift));
+  shrl(TMP, Immediate(target::ObjectLayout::kBarrierOverlapShift));
   andl(TMP, Address(THR, target::Thread::write_barrier_mask_offset()));
   testb(FieldAddress(value, target::Object::tags_offset()), TMP);
   j(ZERO, &done, kNearJump);
@@ -1461,7 +1461,7 @@
   StoreIntoObjectFilter(object, value, &done, kValueCanBeSmi, kJumpToNoUpdate);
 
   testb(FieldAddress(object, target::Object::tags_offset()),
-        Immediate(1 << target::RawObject::kOldAndNotRememberedBit));
+        Immediate(1 << target::ObjectLayout::kOldAndNotRememberedBit));
   j(ZERO, &done, Assembler::kNearJump);
 
   Stop("Store buffer update is required");
@@ -2104,31 +2104,31 @@
 }
 
 void Assembler::ExtractClassIdFromTags(Register result, Register tags) {
-  ASSERT(target::RawObject::kClassIdTagPos == 16);
-  ASSERT(target::RawObject::kClassIdTagSize == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagPos == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagSize == 16);
   ASSERT(sizeof(classid_t) == sizeof(uint16_t));
   movl(result, tags);
-  shrl(result, Immediate(target::RawObject::kClassIdTagPos));
+  shrl(result, Immediate(target::ObjectLayout::kClassIdTagPos));
 }
 
 void Assembler::ExtractInstanceSizeFromTags(Register result, Register tags) {
-  ASSERT(target::RawObject::kSizeTagPos == 8);
-  ASSERT(target::RawObject::kSizeTagSize == 8);
+  ASSERT(target::ObjectLayout::kSizeTagPos == 8);
+  ASSERT(target::ObjectLayout::kSizeTagSize == 8);
   movzxw(result, tags);
-  shrl(result, Immediate(target::RawObject::kSizeTagPos -
+  shrl(result, Immediate(target::ObjectLayout::kSizeTagPos -
                          target::ObjectAlignment::kObjectAlignmentLog2));
   AndImmediate(result,
-               Immediate(Utils::NBitMask(target::RawObject::kSizeTagSize)
+               Immediate(Utils::NBitMask(target::ObjectLayout::kSizeTagSize)
                          << target::ObjectAlignment::kObjectAlignmentLog2));
 }
 
 void Assembler::LoadClassId(Register result, Register object) {
-  ASSERT(target::RawObject::kClassIdTagPos == 16);
-  ASSERT(target::RawObject::kClassIdTagSize == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagPos == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagSize == 16);
   ASSERT(sizeof(classid_t) == sizeof(uint16_t));
   const intptr_t class_id_offset =
       target::Object::tags_offset() +
-      target::RawObject::kClassIdTagPos / kBitsPerByte;
+      target::ObjectLayout::kClassIdTagPos / kBitsPerByte;
   movzxw(result, FieldAddress(object, class_id_offset));
 }
 
@@ -2154,12 +2154,12 @@
                                      intptr_t class_id,
                                      Label* is_smi) {
   ASSERT(kSmiTagShift == 1);
-  ASSERT(target::RawObject::kClassIdTagPos == 16);
-  ASSERT(target::RawObject::kClassIdTagSize == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagPos == 16);
+  ASSERT(target::ObjectLayout::kClassIdTagSize == 16);
   ASSERT(sizeof(classid_t) == sizeof(uint16_t));
   const intptr_t class_id_offset =
       target::Object::tags_offset() +
-      target::RawObject::kClassIdTagPos / kBitsPerByte;
+      target::ObjectLayout::kClassIdTagPos / kBitsPerByte;
 
   // Untag optimistically. Tag bit is shifted into the CARRY.
   SmiUntag(object);
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index e39a7f2..8a0d80d 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -945,8 +945,8 @@
   // before the code can be used.
   //
   // The neccessary information for the "linker" (i.e. the relocation
-  // information) is stored in [RawCode::static_calls_target_table_]: an entry
-  // of the form
+  // information) is stored in [CodeLayout::static_calls_target_table_]: an
+  // entry of the form
   //
   //   (Code::kPcRelativeCall & pc_offset, <target-code>, <target-function>)
   //
diff --git a/runtime/vm/compiler/assembler/disassembler.cc b/runtime/vm/compiler/assembler/disassembler.cc
index 8dd66a3..68b7847 100644
--- a/runtime/vm/compiler/assembler/disassembler.cc
+++ b/runtime/vm/compiler/assembler/disassembler.cc
@@ -232,7 +232,7 @@
   Object& obj = Object::Handle(zone);
   for (intptr_t i = code.pointer_offsets_length() - 1; i >= 0; i--) {
     const uword addr = code.GetPointerOffsetAt(i) + code.PayloadStart();
-    obj = *reinterpret_cast<RawObject**>(addr);
+    obj = *reinterpret_cast<ObjectPtr*>(addr);
     THR_Print(" %d : %#" Px " '%s'\n", code.GetPointerOffsetAt(i), addr,
               obj.ToCString());
   }
@@ -301,20 +301,20 @@
     String& var_name = String::Handle(zone);
     for (intptr_t i = 0; i < var_desc_length; i++) {
       var_name = var_descriptors.GetName(i);
-      RawLocalVarDescriptors::VarInfo var_info;
+      LocalVarDescriptorsLayout::VarInfo var_info;
       var_descriptors.GetInfo(i, &var_info);
       const int8_t kind = var_info.kind();
-      if (kind == RawLocalVarDescriptors::kSavedCurrentContext) {
+      if (kind == LocalVarDescriptorsLayout::kSavedCurrentContext) {
         THR_Print("  saved current CTX reg offset %d\n", var_info.index());
       } else {
-        if (kind == RawLocalVarDescriptors::kContextLevel) {
+        if (kind == LocalVarDescriptorsLayout::kContextLevel) {
           THR_Print("  context level %d scope %d", var_info.index(),
                     var_info.scope_id);
-        } else if (kind == RawLocalVarDescriptors::kStackVar) {
+        } else if (kind == LocalVarDescriptorsLayout::kStackVar) {
           THR_Print("  stack var '%s' offset %d", var_name.ToCString(),
                     var_info.index());
         } else {
-          ASSERT(kind == RawLocalVarDescriptors::kContextVar);
+          ASSERT(kind == LocalVarDescriptorsLayout::kContextVar);
           THR_Print("  context var '%s' level %d offset %d",
                     var_name.ToCString(), var_info.scope_id, var_info.index());
         }
diff --git a/runtime/vm/compiler/assembler/disassembler_x86.cc b/runtime/vm/compiler/assembler/disassembler_x86.cc
index 0d162a5..93f3129 100644
--- a/runtime/vm/compiler/assembler/disassembler_x86.cc
+++ b/runtime/vm/compiler/assembler/disassembler_x86.cc
@@ -1995,7 +1995,7 @@
     for (intptr_t i = 0; i < offsets_length; i++) {
       uword addr = code.GetPointerOffsetAt(i) + code.PayloadStart();
       if ((pc <= addr) && (addr < (pc + instruction_length))) {
-        *object = &Object::Handle(*reinterpret_cast<RawObject**>(addr));
+        *object = &Object::Handle(*reinterpret_cast<ObjectPtr*>(addr));
         break;
       }
     }
diff --git a/runtime/vm/compiler/backend/block_builder.h b/runtime/vm/compiler/backend/block_builder.h
index 7cf8b86..311b0ab 100644
--- a/runtime/vm/compiler/backend/block_builder.h
+++ b/runtime/vm/compiler/backend/block_builder.h
@@ -61,7 +61,7 @@
 
     ReturnInstr* instr = new ReturnInstr(
         TokenPos(), value, CompilerState::Current().GetNextDeoptId(),
-        RawPcDescriptors::kInvalidYieldIndex, representation);
+        PcDescriptorsLayout::kInvalidYieldIndex, representation);
     AddInstruction(instr);
     entry_->set_last_instruction(instr);
   }
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 66855f9..7c5a67d 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -744,7 +744,7 @@
     const intptr_t ch_code = Smi::Cast(o).Value();
     ASSERT(ch_code >= 0);
     if (ch_code < Symbols::kMaxOneCharCodeSymbol) {
-      RawString** table = Symbols::PredefinedAddress();
+      StringPtr* table = Symbols::PredefinedAddress();
       SetValue(instr, String::ZoneHandle(Z, table[ch_code]));
     } else {
       SetValue(instr, non_constant_);
diff --git a/runtime/vm/compiler/backend/constant_propagator.h b/runtime/vm/compiler/backend/constant_propagator.h
index 6150081..d0dca7d 100644
--- a/runtime/vm/compiler/backend/constant_propagator.h
+++ b/runtime/vm/compiler/backend/constant_propagator.h
@@ -36,7 +36,7 @@
   static void OptimizeBranches(FlowGraph* graph);
 
   // Used to initialize the abstract value of definitions.
-  static RawObject* Unknown() { return Object::unknown_constant().raw(); }
+  static ObjectPtr Unknown() { return Object::unknown_constant().raw(); }
 
  private:
   void Analyze();
diff --git a/runtime/vm/compiler/backend/evaluator.cc b/runtime/vm/compiler/backend/evaluator.cc
index e61c9d7..8bb0c3d 100644
--- a/runtime/vm/compiler/backend/evaluator.cc
+++ b/runtime/vm/compiler/backend/evaluator.cc
@@ -31,9 +31,9 @@
   }
 }
 
-static RawInteger* BinaryIntegerEvaluateRaw(const Integer& left,
-                                            const Integer& right,
-                                            Token::Kind token_kind) {
+static IntegerPtr BinaryIntegerEvaluateRaw(const Integer& left,
+                                           const Integer& right,
+                                           Token::Kind token_kind) {
   switch (token_kind) {
     case Token::kTRUNCDIV:
       FALL_THROUGH;
@@ -71,9 +71,9 @@
   return Integer::null();
 }
 
-static RawInteger* UnaryIntegerEvaluateRaw(const Integer& value,
-                                           Token::Kind token_kind,
-                                           Zone* zone) {
+static IntegerPtr UnaryIntegerEvaluateRaw(const Integer& value,
+                                          Token::Kind token_kind,
+                                          Zone* zone) {
   switch (token_kind) {
     case Token::kNEGATE:
       return value.ArithmeticOp(Token::kMUL, Smi::Handle(zone, Smi::New(-1)),
@@ -110,12 +110,12 @@
   }
 }
 
-RawInteger* Evaluator::BinaryIntegerEvaluate(const Object& left,
-                                             const Object& right,
-                                             Token::Kind token_kind,
-                                             bool is_truncating,
-                                             Representation representation,
-                                             Thread* thread) {
+IntegerPtr Evaluator::BinaryIntegerEvaluate(const Object& left,
+                                            const Object& right,
+                                            Token::Kind token_kind,
+                                            bool is_truncating,
+                                            Representation representation,
+                                            Thread* thread) {
   if (!left.IsInteger() || !right.IsInteger()) {
     return Integer::null();
   }
@@ -148,10 +148,10 @@
   return result.raw();
 }
 
-RawInteger* Evaluator::UnaryIntegerEvaluate(const Object& value,
-                                            Token::Kind token_kind,
-                                            Representation representation,
-                                            Thread* thread) {
+IntegerPtr Evaluator::UnaryIntegerEvaluate(const Object& value,
+                                           Token::Kind token_kind,
+                                           Representation representation,
+                                           Thread* thread) {
   if (!value.IsInteger()) {
     return Integer::null();
   }
diff --git a/runtime/vm/compiler/backend/evaluator.h b/runtime/vm/compiler/backend/evaluator.h
index 13590f9..e1ab8ea 100644
--- a/runtime/vm/compiler/backend/evaluator.h
+++ b/runtime/vm/compiler/backend/evaluator.h
@@ -24,19 +24,19 @@
 
   // Evaluates a binary integer operation and returns a pointer to a
   // canonicalized RawInteger.
-  static RawInteger* BinaryIntegerEvaluate(const Object& left,
-                                           const Object& right,
-                                           Token::Kind token_kind,
-                                           bool is_truncating,
-                                           Representation representation,
-                                           Thread* thread);
+  static IntegerPtr BinaryIntegerEvaluate(const Object& left,
+                                          const Object& right,
+                                          Token::Kind token_kind,
+                                          bool is_truncating,
+                                          Representation representation,
+                                          Thread* thread);
 
   // Evaluates a unary integer operation and returns a pointer to a
   // canonicalized RawInteger.
-  static RawInteger* UnaryIntegerEvaluate(const Object& value,
-                                          Token::Kind token_kind,
-                                          Representation representation,
-                                          Thread* thread);
+  static IntegerPtr UnaryIntegerEvaluate(const Object& value,
+                                         Token::Kind token_kind,
+                                         Representation representation,
+                                         Thread* thread);
 
   // Evaluates a binary double operation and returns the result.
   static double EvaluateDoubleOp(const double left,
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index e249c5e..c930e71 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -410,7 +410,7 @@
 
 FlowGraph::ToCheck FlowGraph::CheckForInstanceCall(
     InstanceCallInstr* call,
-    RawFunction::Kind kind) const {
+    FunctionLayout::Kind kind) const {
   if (!FLAG_use_cha_deopt && !isolate()->all_classes_finalized()) {
     // Even if class or function are private, lazy class finalization
     // may later add overriding methods.
@@ -472,7 +472,7 @@
   }
 
   const String& method_name =
-      (kind == RawFunction::kMethodExtractor)
+      (kind == FunctionLayout::kMethodExtractor)
           ? String::Handle(zone(), Field::NameFromGetter(call->function_name()))
           : call->function_name();
 
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index 67c1fed..0a9d929 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -236,7 +236,7 @@
   // Return value indicates that the call needs no check at all,
   // just a null check, or a full class check.
   ToCheck CheckForInstanceCall(InstanceCallInstr* call,
-                               RawFunction::Kind kind) const;
+                               FunctionLayout::Kind kind) const;
 
   Thread* thread() const { return thread_; }
   Zone* zone() const { return thread()->zone(); }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 04e1142..0532aa3f 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -252,7 +252,7 @@
 
 void FlowGraphCompiler::InsertBSSRelocation(BSS::Relocation reloc) {
   const intptr_t offset = assembler()->InsertAlignedRelocation(reloc);
-  AddDescriptor(RawPcDescriptors::kBSSRelocation, /*pc_offset=*/offset,
+  AddDescriptor(PcDescriptorsLayout::kBSSRelocation, /*pc_offset=*/offset,
                 /*deopt_id=*/DeoptId::kNone, TokenPosition::kNoSource,
                 /*try_index=*/-1);
 }
@@ -456,7 +456,7 @@
 
 void FlowGraphCompiler::EmitCallsiteMetadata(TokenPosition token_pos,
                                              intptr_t deopt_id,
-                                             RawPcDescriptors::Kind kind,
+                                             PcDescriptorsLayout::Kind kind,
                                              LocationSummary* locs,
                                              Environment* env) {
   AddCurrentDescriptor(kind, deopt_id, token_pos);
@@ -471,14 +471,15 @@
     } else {
       // Add deoptimization continuation point after the call and before the
       // arguments are removed.
-      AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
+      AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, deopt_id_after,
+                           token_pos);
     }
   }
 }
 
 void FlowGraphCompiler::EmitYieldPositionMetadata(TokenPosition token_pos,
                                                   intptr_t yield_index) {
-  AddDescriptor(RawPcDescriptors::kOther, assembler()->CodeSize(),
+  AddDescriptor(PcDescriptorsLayout::kOther, assembler()->CodeSize(),
                 DeoptId::kNone, token_pos, CurrentTryIndex(), yield_index);
 }
 
@@ -488,7 +489,7 @@
       // Instructions that can be deoptimization targets need to record kDeopt
       // PcDescriptor corresponding to their deopt id. GotoInstr records its
       // own so that it can control the placement.
-      AddCurrentDescriptor(RawPcDescriptors::kDeopt, instr->deopt_id(),
+      AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, instr->deopt_id(),
                            instr->token_pos());
     }
     AllocateRegistersLocally(instr);
@@ -732,7 +733,7 @@
   exception_handlers_list_->SetNeedsStackTrace(try_index);
 }
 
-void FlowGraphCompiler::AddDescriptor(RawPcDescriptors::Kind kind,
+void FlowGraphCompiler::AddDescriptor(PcDescriptorsLayout::Kind kind,
                                       intptr_t pc_offset,
                                       intptr_t deopt_id,
                                       TokenPosition token_pos,
@@ -740,13 +741,13 @@
                                       intptr_t yield_index) {
   code_source_map_builder_->NoteDescriptor(kind, pc_offset, token_pos);
   // Don't emit deopt-descriptors in AOT mode.
-  if (FLAG_precompiled_mode && (kind == RawPcDescriptors::kDeopt)) return;
+  if (FLAG_precompiled_mode && (kind == PcDescriptorsLayout::kDeopt)) return;
   pc_descriptors_list_->AddDescriptor(kind, pc_offset, deopt_id, token_pos,
                                       try_index, yield_index);
 }
 
 // Uses current pc position and try-index.
-void FlowGraphCompiler::AddCurrentDescriptor(RawPcDescriptors::Kind kind,
+void FlowGraphCompiler::AddCurrentDescriptor(PcDescriptorsLayout::Kind kind,
                                              intptr_t deopt_id,
                                              TokenPosition token_pos) {
   AddDescriptor(kind, assembler()->CodeSize(), deopt_id, token_pos,
@@ -1123,7 +1124,7 @@
   code.set_pc_descriptors(descriptors);
 }
 
-RawArray* FlowGraphCompiler::CreateDeoptInfo(compiler::Assembler* assembler) {
+ArrayPtr FlowGraphCompiler::CreateDeoptInfo(compiler::Assembler* assembler) {
   // No deopt information if we precompile (no deoptimization allowed).
   if (FLAG_precompiled_mode) {
     return Array::empty_array().raw();
@@ -1185,8 +1186,8 @@
     // descriptor for IrregexpFunction.
     ASSERT(parsed_function().scope() == nullptr);
     var_descs = LocalVarDescriptors::New(1);
-    RawLocalVarDescriptors::VarInfo info;
-    info.set_kind(RawLocalVarDescriptors::kSavedCurrentContext);
+    LocalVarDescriptorsLayout::VarInfo info;
+    info.set_kind(LocalVarDescriptorsLayout::kSavedCurrentContext);
     info.scope_id = 0;
     info.begin_pos = TokenPosition::kMinSource;
     info.end_pos = TokenPosition::kMinSource;
@@ -1285,7 +1286,7 @@
     // there are no checks necessary in any case and we can therefore intrinsify
     // them even in checked mode and strong mode.
     switch (parsed_function().function().kind()) {
-      case RawFunction::kImplicitGetter: {
+      case FunctionLayout::kImplicitGetter: {
         Field& field = Field::Handle(function().accessor_field());
         ASSERT(!field.IsNull());
 #if defined(DEBUG)
@@ -1308,7 +1309,7 @@
         }
         return false;
       }
-      case RawFunction::kImplicitSetter: {
+      case FunctionLayout::kImplicitSetter: {
         if (!isolate()->argument_type_checks()) {
           Field& field = Field::Handle(function().accessor_field());
           ASSERT(!field.IsNull());
@@ -1329,7 +1330,7 @@
         break;
       }
 #if !defined(TARGET_ARCH_IA32)
-      case RawFunction::kMethodExtractor: {
+      case FunctionLayout::kMethodExtractor: {
         auto& extracted_method = Function::ZoneHandle(
             parsed_function().function().extracted_method_closure());
         auto& klass = Class::Handle(extracted_method.Owner());
@@ -1371,7 +1372,7 @@
 
 void FlowGraphCompiler::GenerateStubCall(TokenPosition token_pos,
                                          const Code& stub,
-                                         RawPcDescriptors::Kind kind,
+                                         PcDescriptorsLayout::Kind kind,
                                          LocationSummary* locs,
                                          intptr_t deopt_id,
                                          Environment* env) {
@@ -1474,7 +1475,7 @@
               ->raw();
       call_ic_data = call_ic_data.Original();
     }
-    AddCurrentDescriptor(RawPcDescriptors::kRewind, deopt_id, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kRewind, deopt_id, token_pos);
     EmitUnoptimizedStaticCall(args_info.size_with_type_args, deopt_id,
                               token_pos, locs, call_ic_data, entry_kind);
   }
@@ -2086,8 +2087,8 @@
   if (class_id < 0) return false;
   if (class_id >= isolate->class_table()->NumCids()) return false;
 
-  RawClass* raw_class = isolate->class_table()->At(class_id);
-  if (raw_class == NULL) return false;
+  ClassPtr raw_class = isolate->class_table()->At(class_id);
+  if (raw_class == nullptr) return false;
   Class& cls = Class::Handle(zone, raw_class);
   if (cls.IsNull()) return false;
   if (!cls.is_finalized()) return false;
@@ -2203,7 +2204,7 @@
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
     const Function& function = *targets.TargetAt(smi_case)->target;
-    GenerateStaticDartCall(deopt_id, token_index, RawPcDescriptors::kOther,
+    GenerateStaticDartCall(deopt_id, token_index, PcDescriptorsLayout::kOther,
                            locs, function, entry_kind);
     __ Drop(args_info.size_with_type_args);
     if (match_found != NULL) {
@@ -2253,7 +2254,7 @@
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
     const Function& function = *targets.TargetAt(i)->target;
-    GenerateStaticDartCall(deopt_id, token_index, RawPcDescriptors::kOther,
+    GenerateStaticDartCall(deopt_id, token_index, PcDescriptorsLayout::kOther,
                            locs, function, entry_kind);
     __ Drop(args_info.size_with_type_args);
     if (!is_last_check || add_megamorphic_call) {
@@ -2557,7 +2558,7 @@
     __ CallRuntime(runtime_entry_, num_args_);
   }
   const intptr_t deopt_id = instruction()->deopt_id();
-  compiler->AddDescriptor(RawPcDescriptors::kOther,
+  compiler->AddDescriptor(PcDescriptorsLayout::kOther,
                           compiler->assembler()->CodeSize(), deopt_id,
                           instruction()->token_pos(), try_index_);
   AddMetadataForRuntimeCall(compiler);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 91ad3ab..3c2ee5c 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -181,9 +181,9 @@
   }
   virtual ~CompilerDeoptInfo() {}
 
-  RawTypedData* CreateDeoptInfo(FlowGraphCompiler* compiler,
-                                DeoptInfoBuilder* builder,
-                                const Array& deopt_table);
+  TypedDataPtr CreateDeoptInfo(FlowGraphCompiler* compiler,
+                               DeoptInfoBuilder* builder,
+                               const Array& deopt_table);
 
   // No code needs to be generated.
   virtual void GenerateCode(FlowGraphCompiler* compiler, intptr_t stub_ix) {}
@@ -602,27 +602,27 @@
 
   void GenerateStubCall(TokenPosition token_pos,
                         const Code& stub,
-                        RawPcDescriptors::Kind kind,
+                        PcDescriptorsLayout::Kind kind,
                         LocationSummary* locs,
                         intptr_t deopt_id = DeoptId::kNone,
                         Environment* env = nullptr);
 
   void GeneratePatchableCall(TokenPosition token_pos,
                              const Code& stub,
-                             RawPcDescriptors::Kind kind,
+                             PcDescriptorsLayout::Kind kind,
                              LocationSummary* locs);
 
   void GenerateDartCall(intptr_t deopt_id,
                         TokenPosition token_pos,
                         const Code& stub,
-                        RawPcDescriptors::Kind kind,
+                        PcDescriptorsLayout::Kind kind,
                         LocationSummary* locs,
                         Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   void GenerateStaticDartCall(
       intptr_t deopt_id,
       TokenPosition token_pos,
-      RawPcDescriptors::Kind kind,
+      PcDescriptorsLayout::Kind kind,
       LocationSummary* locs,
       const Function& target,
       Code::EntryKind entry_kind = Code::EntryKind::kNormal);
@@ -785,7 +785,7 @@
   // `pending_deoptimization_env`.
   void EmitCallsiteMetadata(TokenPosition token_pos,
                             intptr_t deopt_id,
-                            RawPcDescriptors::Kind kind,
+                            PcDescriptorsLayout::Kind kind,
                             LocationSummary* locs,
                             Environment* env = nullptr);
 
@@ -823,16 +823,16 @@
                            const Array& handler_types,
                            bool needs_stacktrace);
   void SetNeedsStackTrace(intptr_t try_index);
-  void AddCurrentDescriptor(RawPcDescriptors::Kind kind,
+  void AddCurrentDescriptor(PcDescriptorsLayout::Kind kind,
                             intptr_t deopt_id,
                             TokenPosition token_pos);
   void AddDescriptor(
-      RawPcDescriptors::Kind kind,
+      PcDescriptorsLayout::Kind kind,
       intptr_t pc_offset,
       intptr_t deopt_id,
       TokenPosition token_pos,
       intptr_t try_index,
-      intptr_t yield_index = RawPcDescriptors::kInvalidYieldIndex);
+      intptr_t yield_index = PcDescriptorsLayout::kInvalidYieldIndex);
 
   // Add NullCheck information for the current PC.
   void AddNullCheck(TokenPosition token_pos, const String& name);
@@ -851,7 +851,7 @@
 
   void FinalizeExceptionHandlers(const Code& code);
   void FinalizePcDescriptors(const Code& code);
-  RawArray* CreateDeoptInfo(compiler::Assembler* assembler);
+  ArrayPtr CreateDeoptInfo(compiler::Assembler* assembler);
   void FinalizeStackMaps(const Code& code);
   void FinalizeVarDescriptors(const Code& code);
   void FinalizeCatchEntryMovesMap(const Code& code);
@@ -929,9 +929,9 @@
   void AddStubCallTarget(const Code& code);
   void AddDispatchTableCallTarget(const compiler::TableSelector* selector);
 
-  RawArray* edge_counters_array() const { return edge_counters_array_.raw(); }
+  ArrayPtr edge_counters_array() const { return edge_counters_array_.raw(); }
 
-  RawArray* InliningIdToFunction() const;
+  ArrayPtr InliningIdToFunction() const;
 
   void BeginCodeSourceRange();
   void EndCodeSourceRange(TokenPosition token_pos);
@@ -1029,13 +1029,13 @@
                      compiler::Label* is_instance_lbl,
                      compiler::Label* is_not_instance_lbl);
 
-  RawSubtypeTestCache* GenerateInlineInstanceof(
+  SubtypeTestCachePtr GenerateInlineInstanceof(
       TokenPosition token_pos,
       const AbstractType& type,
       compiler::Label* is_instance_lbl,
       compiler::Label* is_not_instance_lbl);
 
-  RawSubtypeTestCache* GenerateInstantiatedTypeWithArgumentsTest(
+  SubtypeTestCachePtr GenerateInstantiatedTypeWithArgumentsTest(
       TokenPosition token_pos,
       const AbstractType& dst_type,
       compiler::Label* is_instance_lbl,
@@ -1047,19 +1047,19 @@
       compiler::Label* is_instance_lbl,
       compiler::Label* is_not_instance_lbl);
 
-  RawSubtypeTestCache* GenerateUninstantiatedTypeTest(
+  SubtypeTestCachePtr GenerateUninstantiatedTypeTest(
       TokenPosition token_pos,
       const AbstractType& dst_type,
       compiler::Label* is_instance_lbl,
       compiler::Label* is_not_instance_label);
 
-  RawSubtypeTestCache* GenerateFunctionTypeTest(
+  SubtypeTestCachePtr GenerateFunctionTypeTest(
       TokenPosition token_pos,
       const AbstractType& dst_type,
       compiler::Label* is_instance_lbl,
       compiler::Label* is_not_instance_label);
 
-  RawSubtypeTestCache* GenerateSubtype1TestCacheLookup(
+  SubtypeTestCachePtr GenerateSubtype1TestCacheLookup(
       TokenPosition token_pos,
       const Class& type_class,
       compiler::Label* is_instance_lbl,
@@ -1076,7 +1076,7 @@
   TypeTestStubKind GetTypeTestStubKindForTypeParameter(
       const TypeParameter& type_param);
 
-  RawSubtypeTestCache* GenerateCallSubtypeTestStub(
+  SubtypeTestCachePtr GenerateCallSubtypeTestStub(
       TypeTestStubKind test_kind,
       Register instance_reg,
       Register instantiator_type_arguments_reg,
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index f2e8e44..792d5007 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -99,9 +99,9 @@
   intrinsic_mode_ = false;
 }
 
-RawTypedData* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
-                                                 DeoptInfoBuilder* builder,
-                                                 const Array& deopt_table) {
+TypedDataPtr CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
+                                                DeoptInfoBuilder* builder,
+                                                const Array& deopt_table) {
   if (deopt_env_ == NULL) {
     ++builder->current_info_number_;
     return TypedData::null();
@@ -228,7 +228,7 @@
 // R2: instantiator type arguments (if used).
 // R1: function type arguments (if used).
 // R3: type test cache.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateCallSubtypeTestStub(
     TypeTestStubKind test_kind,
     Register instance_reg,
     Register instantiator_type_arguments_reg,
@@ -274,7 +274,7 @@
 // be completed.
 // R0: instance being type checked (preserved).
 // Clobbers R1, R2.
-RawSubtypeTestCache*
+SubtypeTestCachePtr
 FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
@@ -417,7 +417,7 @@
 // TODO(srdjan): Implement a quicker subtype check, as type test
 // arrays can grow too high, but they may be useful when optimizing
 // code (type-feedback).
-RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
     TokenPosition token_pos,
     const Class& type_class,
     compiler::Label* is_instance_lbl,
@@ -455,7 +455,7 @@
 
 // Generates inlined check if 'type' is a type parameter or type itself
 // R0: instance (preserved).
-RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateUninstantiatedTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -540,7 +540,7 @@
 // Generates function type check.
 //
 // See [GenerateUninstantiatedTypeTest] for calling convention.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateFunctionTypeTest(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateFunctionTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -573,7 +573,7 @@
 // Note that this inlined code must be followed by the runtime_call code, as it
 // may fall through to it. Otherwise, this inline code will jump to the label
 // is_instance or to the label is_not_instance.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateInlineInstanceof(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -668,7 +668,7 @@
     __ LoadUniqueObject(TypeTestABI::kDstTypeReg, type);
     __ LoadUniqueObject(TypeTestABI::kSubtypeTestCacheReg, test_cache);
     GenerateStubCall(token_pos, StubCode::InstanceOf(),
-                     /*kind=*/RawPcDescriptors::kOther, locs, deopt_id);
+                     /*kind=*/PcDescriptorsLayout::kOther, locs, deopt_id);
     __ b(&done);
   }
   __ Bind(&is_not_instance);
@@ -809,7 +809,7 @@
                               sub_type_cache_offset, PP);
     __ blx(R9);
   }
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
   __ Bind(&done);
 }
 
@@ -1016,7 +1016,7 @@
 
 void FlowGraphCompiler::GeneratePatchableCall(TokenPosition token_pos,
                                               const Code& stub,
-                                              RawPcDescriptors::Kind kind,
+                                              PcDescriptorsLayout::Kind kind,
                                               LocationSummary* locs) {
   __ BranchLinkPatchable(stub);
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
@@ -1025,7 +1025,7 @@
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          TokenPosition token_pos,
                                          const Code& stub,
-                                         RawPcDescriptors::Kind kind,
+                                         PcDescriptorsLayout::Kind kind,
                                          LocationSummary* locs,
                                          Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
@@ -1035,7 +1035,7 @@
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
                                                TokenPosition token_pos,
-                                               RawPcDescriptors::Kind kind,
+                                               PcDescriptorsLayout::Kind kind,
                                                LocationSummary* locs,
                                                const Function& target,
                                                Code::EntryKind entry_kind) {
@@ -1063,7 +1063,7 @@
                                             intptr_t argument_count,
                                             LocationSummary* locs) {
   __ CallRuntime(entry, argument_count);
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
 }
 
 void FlowGraphCompiler::EmitEdgeCounter(intptr_t edge_id) {
@@ -1109,8 +1109,8 @@
   __ LoadFromOffset(kWord, R0, SP,
                     (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize);
   __ LoadUniqueObject(R9, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
-                   entry_kind);
+  GenerateDartCall(deopt_id, token_pos, stub, PcDescriptorsLayout::kIcCall,
+                   locs, entry_kind);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
@@ -1134,7 +1134,7 @@
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
   __ ldr(LR, compiler::FieldAddress(CODE_REG, entry_point_offset));
   __ blx(LR);
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kIcCall, locs);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
@@ -1189,16 +1189,19 @@
     if (try_index == kInvalidTryIndex) {
       try_index = CurrentTryIndex();
     }
-    AddDescriptor(RawPcDescriptors::kOther, assembler()->CodeSize(),
+    AddDescriptor(PcDescriptorsLayout::kOther, assembler()->CodeSize(),
                   DeoptId::kNone, token_pos, try_index);
   } else if (is_optimizing()) {
-    AddCurrentDescriptor(RawPcDescriptors::kOther, DeoptId::kNone, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kOther, DeoptId::kNone,
+                         token_pos);
     AddDeoptIndexAtCall(deopt_id_after);
   } else {
-    AddCurrentDescriptor(RawPcDescriptors::kOther, DeoptId::kNone, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kOther, DeoptId::kNone,
+                         token_pos);
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, deopt_id_after,
+                         token_pos);
   }
   RecordCatchEntryMoves(pending_deoptimization_env_, try_index);
   __ Drop(args_desc.SizeWithTypeArgs());
@@ -1244,7 +1247,7 @@
   __ LoadUniqueObject(R9, data);
   __ blx(LR);
 
-  EmitCallsiteMetadata(token_pos, DeoptId::kNone, RawPcDescriptors::kOther,
+  EmitCallsiteMetadata(token_pos, DeoptId::kNone, PcDescriptorsLayout::kOther,
                        locs);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
@@ -1260,7 +1263,7 @@
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(R9, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub,
-                   RawPcDescriptors::kUnoptStaticCall, locs, entry_kind);
+                   PcDescriptorsLayout::kUnoptStaticCall, locs, entry_kind);
   __ Drop(size_with_type_args);
 }
 
@@ -1283,7 +1286,7 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateStaticDartCall(deopt_id, token_pos, RawPcDescriptors::kOther, locs,
+  GenerateStaticDartCall(deopt_id, token_pos, PcDescriptorsLayout::kOther, locs,
                          function, entry_kind);
   __ Drop(size_with_type_args);
 }
@@ -1330,7 +1333,8 @@
     } else {
       __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
-    AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kRuntimeCall, deopt_id,
+                         token_pos);
     // Stub returns result in flags (result of a cmp, we need Z computed).
     __ Drop(1);   // Discard constant.
     __ Pop(reg);  // Restore 'reg'.
@@ -1353,7 +1357,8 @@
     } else {
       __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
-    AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kRuntimeCall, deopt_id,
+                         token_pos);
     // Stub returns result in flags (result of a cmp, we need Z computed).
     __ Pop(right);
     __ Pop(left);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 3f42db3..c1f274d 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -93,9 +93,9 @@
   intrinsic_mode_ = false;
 }
 
-RawTypedData* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
-                                                 DeoptInfoBuilder* builder,
-                                                 const Array& deopt_table) {
+TypedDataPtr CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
+                                                DeoptInfoBuilder* builder,
+                                                const Array& deopt_table) {
   if (deopt_env_ == NULL) {
     ++builder->current_info_number_;
     return TypedData::null();
@@ -217,7 +217,7 @@
 // R0: instance (must be preserved).
 // R2: instantiator type arguments (if used).
 // R1: function type arguments (if used).
-RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateCallSubtypeTestStub(
     TypeTestStubKind test_kind,
     Register instance_reg,
     Register instantiator_type_arguments_reg,
@@ -263,7 +263,7 @@
 // be completed.
 // R0: instance being type checked (preserved).
 // Clobbers R1, R2.
-RawSubtypeTestCache*
+SubtypeTestCachePtr
 FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
@@ -401,7 +401,7 @@
 // TODO(srdjan): Implement a quicker subtype check, as type test
 // arrays can grow too high, but they may be useful when optimizing
 // code (type-feedback).
-RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
     TokenPosition token_pos,
     const Class& type_class,
     compiler::Label* is_instance_lbl,
@@ -437,7 +437,7 @@
 
 // Generates inlined check if 'type' is a type parameter or type itself
 // R0: instance (preserved).
-RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateUninstantiatedTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -515,7 +515,7 @@
 // Generates function type check.
 //
 // See [GenerateUninstantiatedTypeTest] for calling convention.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateFunctionTypeTest(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateFunctionTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -545,7 +545,7 @@
 // Note that this inlined code must be followed by the runtime_call code, as it
 // may fall through to it. Otherwise, this inline code will jump to the label
 // is_instance or to the label is_not_instance.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateInlineInstanceof(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -634,7 +634,7 @@
     __ LoadUniqueObject(TypeTestABI::kDstTypeReg, type);
     __ LoadUniqueObject(TypeTestABI::kSubtypeTestCacheReg, test_cache);
     GenerateStubCall(token_pos, StubCode::InstanceOf(),
-                     /*kind=*/RawPcDescriptors::kOther, locs, deopt_id);
+                     /*kind=*/PcDescriptorsLayout::kOther, locs, deopt_id);
     __ b(&done);
   }
   __ Bind(&is_not_instance);
@@ -770,7 +770,7 @@
                               sub_type_cache_offset);
     __ blr(R9);
   }
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
   __ Bind(&done);
 }
 
@@ -977,7 +977,7 @@
 
 void FlowGraphCompiler::GeneratePatchableCall(TokenPosition token_pos,
                                               const Code& stub,
-                                              RawPcDescriptors::Kind kind,
+                                              PcDescriptorsLayout::Kind kind,
                                               LocationSummary* locs) {
   __ BranchLinkPatchable(stub);
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
@@ -986,7 +986,7 @@
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          TokenPosition token_pos,
                                          const Code& stub,
-                                         RawPcDescriptors::Kind kind,
+                                         PcDescriptorsLayout::Kind kind,
                                          LocationSummary* locs,
                                          Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
@@ -996,7 +996,7 @@
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
                                                TokenPosition token_pos,
-                                               RawPcDescriptors::Kind kind,
+                                               PcDescriptorsLayout::Kind kind,
                                                LocationSummary* locs,
                                                const Function& target,
                                                Code::EntryKind entry_kind) {
@@ -1024,7 +1024,7 @@
                                             intptr_t argument_count,
                                             LocationSummary* locs) {
   __ CallRuntime(entry, argument_count);
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
 }
 
 void FlowGraphCompiler::EmitEdgeCounter(intptr_t edge_id) {
@@ -1060,8 +1060,8 @@
   __ LoadObject(R6, parsed_function().function());
   __ LoadFromOffset(R0, SP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize);
   __ LoadUniqueObject(R5, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
-                   entry_kind);
+  GenerateDartCall(deopt_id, token_pos, stub, PcDescriptorsLayout::kIcCall,
+                   locs, entry_kind);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
@@ -1091,7 +1091,7 @@
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
   __ ldr(LR, compiler::FieldAddress(CODE_REG, entry_point_offset));
   __ blr(LR);
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kIcCall, locs);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
@@ -1143,16 +1143,19 @@
     if (try_index == kInvalidTryIndex) {
       try_index = CurrentTryIndex();
     }
-    AddDescriptor(RawPcDescriptors::kOther, assembler()->CodeSize(),
+    AddDescriptor(PcDescriptorsLayout::kOther, assembler()->CodeSize(),
                   DeoptId::kNone, token_pos, try_index);
   } else if (is_optimizing()) {
-    AddCurrentDescriptor(RawPcDescriptors::kOther, DeoptId::kNone, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kOther, DeoptId::kNone,
+                         token_pos);
     AddDeoptIndexAtCall(deopt_id_after);
   } else {
-    AddCurrentDescriptor(RawPcDescriptors::kOther, DeoptId::kNone, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kOther, DeoptId::kNone,
+                         token_pos);
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, deopt_id_after,
+                         token_pos);
   }
   RecordCatchEntryMoves(pending_deoptimization_env_, try_index);
   __ Drop(args_desc.SizeWithTypeArgs());
@@ -1207,7 +1210,7 @@
   }
   __ blr(LR);
 
-  EmitCallsiteMetadata(token_pos, DeoptId::kNone, RawPcDescriptors::kOther,
+  EmitCallsiteMetadata(token_pos, DeoptId::kNone, PcDescriptorsLayout::kOther,
                        locs);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
@@ -1223,7 +1226,7 @@
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(R5, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub,
-                   RawPcDescriptors::kUnoptStaticCall, locs, entry_kind);
+                   PcDescriptorsLayout::kUnoptStaticCall, locs, entry_kind);
   __ Drop(size_with_type_args);
 }
 
@@ -1246,7 +1249,7 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateStaticDartCall(deopt_id, token_pos, RawPcDescriptors::kOther, locs,
+  GenerateStaticDartCall(deopt_id, token_pos, PcDescriptorsLayout::kOther, locs,
                          function, entry_kind);
   __ Drop(size_with_type_args);
 }
@@ -1282,7 +1285,8 @@
     } else {
       __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
-    AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kRuntimeCall, deopt_id,
+                         token_pos);
     // Stub returns result in flags (result of a cmp, we need Z computed).
     // Discard constant.
     // Restore 'reg'.
@@ -1305,7 +1309,8 @@
     } else {
       __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
-    AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kRuntimeCall, deopt_id,
+                         token_pos);
     // Stub returns result in flags (result of a cmp, we need Z computed).
     __ PopPair(right, left);
   } else {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index 2c7eac4..20fcd8c 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -71,9 +71,9 @@
   intrinsic_mode_ = false;
 }
 
-RawTypedData* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
-                                                 DeoptInfoBuilder* builder,
-                                                 const Array& deopt_table) {
+TypedDataPtr CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
+                                                DeoptInfoBuilder* builder,
+                                                const Array& deopt_table) {
   if (deopt_env_ == NULL) {
     ++builder->current_info_number_;
     return TypedData::null();
@@ -182,7 +182,7 @@
                                            compiler::Label* is_true,
                                            compiler::Label* is_false) {
   const compiler::Immediate& raw_null =
-      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      compiler::Immediate(static_cast<intptr_t>(Object::null()));
   compiler::Label fall_through;
   __ cmpl(bool_register, raw_null);
   __ j(EQUAL, &fall_through, compiler::Assembler::kNearJump);
@@ -196,7 +196,7 @@
 }
 
 // Clobbers ECX.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateCallSubtypeTestStub(
     TypeTestStubKind test_kind,
     Register instance_reg,
     Register instantiator_type_arguments_reg,
@@ -207,7 +207,7 @@
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(zone(), SubtypeTestCache::New());
   const compiler::Immediate& raw_null =
-      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      compiler::Immediate(static_cast<intptr_t>(Object::null()));
   __ LoadObject(temp_reg, type_test_cache);
   __ pushl(temp_reg);      // Subtype test cache.
   __ pushl(instance_reg);  // Instance.
@@ -249,7 +249,7 @@
 // be completed.
 // EAX: instance (must survive).
 // Clobbers ECX, EDI.
-RawSubtypeTestCache*
+SubtypeTestCachePtr
 FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
@@ -390,7 +390,7 @@
 // TODO(srdjan): Implement a quicker subtype check, as type test
 // arrays can grow too high, but they may be useful when optimizing
 // code (type-feedback).
-RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
     TokenPosition token_pos,
     const Class& type_class,
     compiler::Label* is_instance_lbl,
@@ -427,7 +427,7 @@
 // Generates inlined check if 'type' is a type parameter or type itself
 // EAX: instance (preserved).
 // Clobbers EDX, EDI, ECX.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateUninstantiatedTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -438,7 +438,7 @@
   ASSERT(!type.IsFunctionType());
   // Skip check if destination is a dynamic type.
   const compiler::Immediate& raw_null =
-      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      compiler::Immediate(static_cast<intptr_t>(Object::null()));
   if (type.IsTypeParameter()) {
     const TypeParameter& type_param = TypeParameter::Cast(type);
 
@@ -514,7 +514,7 @@
 // Generates function type check.
 //
 // See [GenerateUninstantiatedTypeTest] for calling convention.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateFunctionTypeTest(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateFunctionTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -544,7 +544,7 @@
 // Note that this inlined code must be followed by the runtime_call code, as it
 // may fall through to it. Otherwise, this inline code will jump to the label
 // is_instance or to the label is_not_instance.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateInlineInstanceof(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -603,7 +603,7 @@
   __ pushl(ECX);  // Store function type arguments.
 
   const compiler::Immediate& raw_null =
-      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      compiler::Immediate(static_cast<intptr_t>(Object::null()));
   compiler::Label is_instance, is_not_instance;
   // 'null' is an instance of Null, Object*, Never*, void, and dynamic.
   // In addition, 'null' is an instance of any nullable type.
@@ -688,7 +688,7 @@
   compiler::Label is_assignable, runtime_call;
   if (Instance::NullIsAssignableTo(dst_type)) {
     const compiler::Immediate& raw_null =
-        compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+        compiler::Immediate(static_cast<intptr_t>(Object::null()));
     __ cmpl(EAX, raw_null);
     __ j(EQUAL, &is_assignable);
   }
@@ -762,7 +762,7 @@
   __ movl(EBX, compiler::Address(ESP, 1 * kWordSize));  // Value.
   __ StoreIntoObject(EAX, compiler::FieldAddress(EAX, offset), EBX);
   const compiler::Immediate& raw_null =
-      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      compiler::Immediate(static_cast<intptr_t>(Object::null()));
   __ movl(EAX, raw_null);
   __ ret();
 }
@@ -819,7 +819,7 @@
     __ Comment("Initialize spill slots");
     if (num_locals > 1 || (num_locals == 1 && args_desc_slot == -1)) {
       const compiler::Immediate& raw_null =
-          compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+          compiler::Immediate(static_cast<intptr_t>(Object::null()));
       __ movl(EAX, raw_null);
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
@@ -859,7 +859,7 @@
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          TokenPosition token_pos,
                                          const Code& stub,
-                                         RawPcDescriptors::Kind kind,
+                                         PcDescriptorsLayout::Kind kind,
                                          LocationSummary* locs,
                                          Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
@@ -869,7 +869,7 @@
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
                                                TokenPosition token_pos,
-                                               RawPcDescriptors::Kind kind,
+                                               PcDescriptorsLayout::Kind kind,
                                                LocationSummary* locs,
                                                const Function& target,
                                                Code::EntryKind entry_kind) {
@@ -886,7 +886,7 @@
                                             intptr_t argument_count,
                                             LocationSummary* locs) {
   __ CallRuntime(entry, argument_count);
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
 }
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t size_with_type_args,
@@ -900,7 +900,7 @@
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(ECX, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub,
-                   RawPcDescriptors::kUnoptStaticCall, locs, entry_kind);
+                   PcDescriptorsLayout::kUnoptStaticCall, locs, entry_kind);
   __ Drop(size_with_type_args);
 }
 
@@ -936,8 +936,8 @@
   __ movl(EBX, compiler::Address(
                    ESP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize));
   __ LoadObject(ECX, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
-                   entry_kind);
+  GenerateDartCall(deopt_id, token_pos, stub, PcDescriptorsLayout::kIcCall,
+                   locs, entry_kind);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
@@ -961,7 +961,7 @@
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
   __ call(compiler::FieldAddress(CODE_REG, entry_point_offset));
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kIcCall, locs);
   __ Drop(ic_data.SizeWithTypeArgs());
 }
 
@@ -988,7 +988,7 @@
   __ call(compiler::FieldAddress(
       CODE_REG, Code::entry_point_offset(Code::EntryKind::kMonomorphic)));
 
-  AddCurrentDescriptor(RawPcDescriptors::kOther, DeoptId::kNone, token_pos);
+  AddCurrentDescriptor(PcDescriptorsLayout::kOther, DeoptId::kNone, token_pos);
   RecordSafepoint(locs, slow_path_argument_count);
   const intptr_t deopt_id_after = DeoptId::ToDeoptAfter(deopt_id);
   // Precompilation not implemented on ia32 platform.
@@ -998,7 +998,8 @@
   } else {
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, deopt_id_after,
+                         token_pos);
   }
   RecordCatchEntryMoves(pending_deoptimization_env_, try_index);
   __ Drop(args_desc.SizeWithTypeArgs());
@@ -1030,7 +1031,7 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateStaticDartCall(deopt_id, token_pos, RawPcDescriptors::kOther, locs,
+  GenerateStaticDartCall(deopt_id, token_pos, PcDescriptorsLayout::kOther, locs,
                          function, entry_kind);
   __ Drop(size_with_type_args);
 }
@@ -1065,7 +1066,8 @@
     } else {
       __ Call(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
-    AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kRuntimeCall, deopt_id,
+                         token_pos);
     // Stub returns result in flags (result of a cmpl, we need ZF computed).
     __ popl(reg);  // Discard constant.
     __ popl(reg);  // Restore 'reg'.
@@ -1088,7 +1090,8 @@
     } else {
       __ Call(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
-    AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kRuntimeCall, deopt_id,
+                         token_pos);
     // Stub returns result in flags (result of a cmpl, we need ZF computed).
     __ popl(right);
     __ popl(left);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index e75ab34..cefc349 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -94,9 +94,9 @@
   intrinsic_mode_ = false;
 }
 
-RawTypedData* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
-                                                 DeoptInfoBuilder* builder,
-                                                 const Array& deopt_table) {
+TypedDataPtr CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
+                                                DeoptInfoBuilder* builder,
+                                                const Array& deopt_table) {
   if (deopt_env_ == NULL) {
     ++builder->current_info_number_;
     return TypedData::null();
@@ -226,7 +226,7 @@
 //   - RCX : function type arguments (if necessary).
 //
 // Preserves RAX/RCX/RDX.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateCallSubtypeTestStub(
     TypeTestStubKind test_kind,
     Register instance_reg,
     Register instantiator_type_arguments_reg,
@@ -271,7 +271,7 @@
 // be completed.
 // RAX: instance (must survive).
 // Clobbers R10.
-RawSubtypeTestCache*
+SubtypeTestCachePtr
 FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
@@ -422,7 +422,7 @@
 // TODO(srdjan): Implement a quicker subtype check, as type test
 // arrays can grow too high, but they may be useful when optimizing
 // code (type-feedback).
-RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
     TokenPosition token_pos,
     const Class& type_class,
     compiler::Label* is_instance_lbl,
@@ -465,7 +465,7 @@
 //   - RCX : function type arguments (if necessary).
 //
 // Preserves RAX/RCX/RDX.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateUninstantiatedTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -540,7 +540,7 @@
 // Generates function type check.
 //
 // See [GenerateUninstantiatedTypeTest] for calling convention.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateFunctionTypeTest(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateFunctionTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -567,7 +567,7 @@
 // Note that this inlined code must be followed by the runtime_call code, as it
 // may fall through to it. Otherwise, this inline code will jump to the label
 // is_instance or to the label is_not_instance.
-RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
+SubtypeTestCachePtr FlowGraphCompiler::GenerateInlineInstanceof(
     TokenPosition token_pos,
     const AbstractType& type,
     compiler::Label* is_instance_lbl,
@@ -651,7 +651,7 @@
     __ LoadUniqueObject(TypeTestABI::kDstTypeReg, type);
     __ LoadUniqueObject(TypeTestABI::kSubtypeTestCacheReg, test_cache);
     GenerateStubCall(token_pos, StubCode::InstanceOf(),
-                     /*kind=*/RawPcDescriptors::kOther, locs, deopt_id);
+                     /*kind=*/PcDescriptorsLayout::kOther, locs, deopt_id);
     __ jmp(&done, compiler::Assembler::kNearJump);
   }
   __ Bind(&is_not_instance);
@@ -769,7 +769,7 @@
     __ call(compiler::FieldAddress(
         kRegToCall, AbstractType::type_test_stub_entry_point_offset()));
   }
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
   __ Bind(&done);
 }
 
@@ -978,7 +978,7 @@
 
 void FlowGraphCompiler::GeneratePatchableCall(TokenPosition token_pos,
                                               const Code& stub,
-                                              RawPcDescriptors::Kind kind,
+                                              PcDescriptorsLayout::Kind kind,
                                               LocationSummary* locs) {
   __ CallPatchable(stub);
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
@@ -987,7 +987,7 @@
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          TokenPosition token_pos,
                                          const Code& stub,
-                                         RawPcDescriptors::Kind kind,
+                                         PcDescriptorsLayout::Kind kind,
                                          LocationSummary* locs,
                                          Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
@@ -997,7 +997,7 @@
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
                                                TokenPosition token_pos,
-                                               RawPcDescriptors::Kind kind,
+                                               PcDescriptorsLayout::Kind kind,
                                                LocationSummary* locs,
                                                const Function& target,
                                                Code::EntryKind entry_kind) {
@@ -1025,7 +1025,7 @@
                                             intptr_t argument_count,
                                             LocationSummary* locs) {
   __ CallRuntime(entry, argument_count);
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
 }
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t size_with_type_args,
@@ -1039,7 +1039,7 @@
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(RBX, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub,
-                   RawPcDescriptors::kUnoptStaticCall, locs, entry_kind);
+                   PcDescriptorsLayout::kUnoptStaticCall, locs, entry_kind);
   __ Drop(size_with_type_args, RCX);
 }
 
@@ -1076,8 +1076,8 @@
   __ movq(RDX, compiler::Address(
                    RSP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize));
   __ LoadUniqueObject(RBX, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
-                   entry_kind);
+  GenerateDartCall(deopt_id, token_pos, stub, PcDescriptorsLayout::kIcCall,
+                   locs, entry_kind);
   __ Drop(ic_data.SizeWithTypeArgs(), RCX);
 }
 
@@ -1101,7 +1101,7 @@
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
   __ call(compiler::FieldAddress(CODE_REG, entry_point_offset));
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kIcCall, locs);
   __ Drop(ic_data.SizeWithTypeArgs(), RCX);
 }
 
@@ -1152,16 +1152,19 @@
     if (try_index == kInvalidTryIndex) {
       try_index = CurrentTryIndex();
     }
-    AddDescriptor(RawPcDescriptors::kOther, assembler()->CodeSize(),
+    AddDescriptor(PcDescriptorsLayout::kOther, assembler()->CodeSize(),
                   DeoptId::kNone, token_pos, try_index);
   } else if (is_optimizing()) {
-    AddCurrentDescriptor(RawPcDescriptors::kOther, DeoptId::kNone, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kOther, DeoptId::kNone,
+                         token_pos);
     AddDeoptIndexAtCall(deopt_id_after);
   } else {
-    AddCurrentDescriptor(RawPcDescriptors::kOther, DeoptId::kNone, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kOther, DeoptId::kNone,
+                         token_pos);
     // Add deoptimization continuation point after the call and before the
     // arguments are removed.
-    AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, deopt_id_after,
+                         token_pos);
   }
   RecordCatchEntryMoves(pending_deoptimization_env_, try_index);
   __ Drop(args_desc.SizeWithTypeArgs(), RCX);
@@ -1204,7 +1207,7 @@
   __ LoadUniqueObject(RBX, data);
   __ call(RCX);
 
-  EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
   __ Drop(ic_data.SizeWithTypeArgs(), RCX);
 }
 
@@ -1227,7 +1230,7 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateStaticDartCall(deopt_id, token_pos, RawPcDescriptors::kOther, locs,
+  GenerateStaticDartCall(deopt_id, token_pos, PcDescriptorsLayout::kOther, locs,
                          function, entry_kind);
   __ Drop(size_with_type_args, RCX);
 }
@@ -1271,7 +1274,8 @@
     } else {
       __ CallPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
-    AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kRuntimeCall, deopt_id,
+                         token_pos);
     // Stub returns result in flags (result of a cmpq, we need ZF computed).
     __ popq(reg);  // Discard constant.
     __ popq(reg);  // Restore 'reg'.
@@ -1294,7 +1298,8 @@
     } else {
       __ CallPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
-    AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
+    AddCurrentDescriptor(PcDescriptorsLayout::kRuntimeCall, deopt_id,
+                         token_pos);
     // Stub returns result in flags (result of a cmpq, we need ZF computed).
     __ popq(right);
     __ popq(left);
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 92ef4dc..3231fb8 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -3872,7 +3872,7 @@
 void JoinEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
+    compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -3899,7 +3899,7 @@
     // The deoptimization descriptor points after the edge counter code for
     // uniformity with ARM, where we can reuse pattern matching code that
     // matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
+    compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -3973,7 +3973,7 @@
     // The deoptimization descriptor points after the edge counter code for
     // uniformity with ARM, where we can reuse pattern matching code that
     // matches backwards from the end of the pattern.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
+    compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -4082,7 +4082,7 @@
   __ LoadObject(InitStaticFieldABI::kFieldReg,
                 Field::ZoneHandle(field().Original()));
   compiler->GenerateStubCall(token_pos(), init_static_field_stub,
-                             /*kind=*/RawPcDescriptors::kOther, locs(),
+                             /*kind=*/PcDescriptorsLayout::kOther, locs(),
                              deopt_id());
   __ Bind(&no_call);
 }
@@ -4116,7 +4116,7 @@
   // so deoptimization environment has to be adjusted.
   // This adjustment is done in FlowGraph::AttachEnvironment.
   compiler->GenerateStubCall(token_pos(), stub,
-                             /*kind=*/RawPcDescriptors::kOther, locs(),
+                             /*kind=*/PcDescriptorsLayout::kOther, locs(),
                              deopt_id());
   __ Bind(&no_call);
 }
@@ -4136,7 +4136,7 @@
       Code::ZoneHandle(compiler->zone(), object_store->throw_stub());
 
   compiler->GenerateStubCall(token_pos(), throw_stub,
-                             /*kind=*/RawPcDescriptors::kOther, locs(),
+                             /*kind=*/PcDescriptorsLayout::kOther, locs(),
                              deopt_id());
   // Issue(dartbug.com/41353): Right now we have to emit an extra breakpoint
   // instruction: The ThrowInstr will terminate the current block. The very
@@ -4164,7 +4164,7 @@
 
   compiler->SetNeedsStackTrace(catch_try_index());
   compiler->GenerateStubCall(token_pos(), re_throw_stub,
-                             /*kind=*/RawPcDescriptors::kOther, locs(),
+                             /*kind=*/PcDescriptorsLayout::kOther, locs(),
                              deopt_id());
   // Issue(dartbug.com/41353): Right now we have to emit an extra breakpoint
   // instruction: The ThrowInstr will terminate the current block. The very
@@ -4198,7 +4198,7 @@
   __ CompareObject(AssertBooleanABI::kObjectReg, Object::null_instance());
   __ BranchIf(NOT_EQUAL, &done);
   compiler->GenerateStubCall(token_pos(), assert_boolean_stub,
-                             /*kind=*/RawPcDescriptors::kOther, locs(),
+                             /*kind=*/PcDescriptorsLayout::kOther, locs(),
                              deopt_id());
   __ Bind(&done);
 }
@@ -4489,7 +4489,7 @@
   return MakeCallSummary(zone, this);
 }
 
-static RawCode* TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) {
+static CodePtr TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) {
   if (!FLAG_two_args_smi_icd) {
     return Code::null();
   }
@@ -4596,7 +4596,7 @@
     }
   } else {
     // Unoptimized code.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kRewind, deopt_id(),
+    compiler->AddCurrentDescriptor(PcDescriptorsLayout::kRewind, deopt_id(),
                                    token_pos());
     bool is_smi_two_args_op = false;
     const Code& stub =
@@ -4622,7 +4622,7 @@
   return Library::IsPrivateCoreLibName(function_name(), name);
 }
 
-RawFunction* InstanceCallBaseInstr::ResolveForReceiverClass(
+FunctionPtr InstanceCallBaseInstr::ResolveForReceiverClass(
     const Class& cls,
     bool allow_add /* = true */) {
   const Array& args_desc_array = Array::Handle(GetArgumentsDescriptor());
@@ -4719,7 +4719,7 @@
   compiler->EmitDispatchTableCall(cid_reg, selector()->offset,
                                   arguments_descriptor);
   compiler->EmitCallsiteMetadata(token_pos(), DeoptId::kNone,
-                                 RawPcDescriptors::kOther, locs());
+                                 PcDescriptorsLayout::kOther, locs());
   if (selector()->called_on_null && !selector()->on_null_interface) {
     Value* receiver = ArgumentValueAt(FirstArgIndex());
     if (receiver->Type()->is_nullable()) {
@@ -4850,7 +4850,7 @@
       total_call_count(), !receiver_is_not_smi());
 }
 
-RawType* PolymorphicInstanceCallInstr::ComputeRuntimeType(
+TypePtr PolymorphicInstanceCallInstr::ComputeRuntimeType(
     const CallTargets& targets) {
   bool is_string = true;
   bool is_integer = true;
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index de48463..7bdedf6 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -2797,7 +2797,7 @@
   ReturnInstr(TokenPosition token_pos,
               Value* value,
               intptr_t deopt_id,
-              intptr_t yield_index = RawPcDescriptors::kInvalidYieldIndex,
+              intptr_t yield_index = PcDescriptorsLayout::kInvalidYieldIndex,
               Representation representation = kTagged)
       : TemplateInstruction(deopt_id),
         token_pos_(token_pos),
@@ -3693,7 +3693,7 @@
                                (type_args_len > 0 ? 1 : 0)),
         argument_names(argument_names) {}
 
-  RawArray* ToArgumentsDescriptor() const {
+  ArrayPtr ToArgumentsDescriptor() const {
     return ArgumentsDescriptor::New(type_args_len, count_without_type_args,
                                     size_without_type_args, argument_names);
   }
@@ -3726,7 +3726,7 @@
     }
   }
 
-  RawString* Selector() {
+  StringPtr Selector() {
     if (auto static_call = this->AsStaticCall()) {
       return static_call->function().name();
     } else if (auto instance_call = this->AsInstanceCall()) {
@@ -3783,7 +3783,7 @@
   intptr_t type_args_len() const { return type_args_len_; }
   const Array& argument_names() const { return argument_names_; }
   virtual TokenPosition token_pos() const { return token_pos_; }
-  RawArray* GetArgumentsDescriptor() const {
+  ArrayPtr GetArgumentsDescriptor() const {
     return ArgumentsDescriptor::New(
         type_args_len(), ArgumentCountWithoutTypeArgs(),
         ArgumentsSizeWithoutTypeArgs(), argument_names());
@@ -3927,7 +3927,7 @@
     return result_type_->ToCid();
   }
 
-  RawFunction* ResolveForReceiverClass(const Class& cls, bool allow_add = true);
+  FunctionPtr ResolveForReceiverClass(const Class& cls, bool allow_add = true);
 
   Code::EntryKind entry_kind() const { return entry_kind_; }
   void set_entry_kind(Code::EntryKind value) { entry_kind_ = value; }
@@ -4124,7 +4124,7 @@
 
   virtual Definition* Canonicalize(FlowGraph* graph);
 
-  static RawType* ComputeRuntimeType(const CallTargets& targets);
+  static TypePtr ComputeRuntimeType(const CallTargets& targets);
 
   PRINT_OPERANDS_TO_SUPPORT
   ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
@@ -5024,7 +5024,7 @@
 class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> {
  public:
   DebugStepCheckInstr(TokenPosition token_pos,
-                      RawPcDescriptors::Kind stub_kind,
+                      PcDescriptorsLayout::Kind stub_kind,
                       intptr_t deopt_id)
       : TemplateInstruction<0, NoThrow>(deopt_id),
         token_pos_(token_pos),
@@ -5041,7 +5041,7 @@
 
  private:
   const TokenPosition token_pos_;
-  const RawPcDescriptors::Kind stub_kind_;
+  const PcDescriptorsLayout::Kind stub_kind_;
 
   DISALLOW_COPY_AND_ASSIGN(DebugStepCheckInstr);
 };
@@ -5254,7 +5254,7 @@
 
 // For a field of static type G<T0, ..., Tn> and a stored value of runtime
 // type T checks that type arguments of T at G exactly match <T0, ..., Tn>
-// and updates guarded state (RawField::static_type_exactness_state_)
+// and updates guarded state (FieldLayout::static_type_exactness_state_)
 // accordingly.
 //
 // See StaticTypeExactnessState for more information.
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 71bb295..ceb2152 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -383,7 +383,7 @@
   __ Bind(&stack_ok);
 #endif
   ASSERT(__ constant_pool_allowed());
-  if (yield_index() != RawPcDescriptors::kInvalidYieldIndex) {
+  if (yield_index() != PcDescriptorsLayout::kInvalidYieldIndex) {
     compiler->EmitYieldPositionMetadata(token_pos(), yield_index());
   }
   __ LeaveDartFrameAndReturn();  // Disallows constant pool use.
@@ -504,7 +504,7 @@
   }
   __ blx(R2);
   compiler->EmitCallsiteMetadata(token_pos(), deopt_id(),
-                                 RawPcDescriptors::kOther, locs());
+                                 PcDescriptorsLayout::kOther, locs());
   __ Drop(argument_count);
 }
 
@@ -1154,9 +1154,9 @@
                          : compiler::ObjectPoolBuilderEntry::kNotPatchable);
   if (link_lazily()) {
     compiler->GeneratePatchableCall(token_pos(), *stub,
-                                    RawPcDescriptors::kOther, locs());
+                                    PcDescriptorsLayout::kOther, locs());
   } else {
-    compiler->GenerateStubCall(token_pos(), *stub, RawPcDescriptors::kOther,
+    compiler->GenerateStubCall(token_pos(), *stub, PcDescriptorsLayout::kOther,
                                locs());
   }
   __ Pop(result);
@@ -1196,7 +1196,7 @@
   // instruction. Therefore we emit the metadata here, 8 bytes (2 instructions)
   // after the original mov.
   compiler->EmitCallsiteMetadata(TokenPosition::kNoSource, DeoptId::kNone,
-                                 RawPcDescriptors::Kind::kOther, locs());
+                                 PcDescriptorsLayout::Kind::kOther, locs());
 
   // Update information in the thread object and enter a safepoint.
   if (CanExecuteGeneratedCodeInSafepoint()) {
@@ -2450,7 +2450,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateStubCall(TokenPosition::kNoSource,  // No token position.
-                               stub, RawPcDescriptors::kOther, locs);
+                               stub, PcDescriptorsLayout::kOther, locs);
     __ MoveRegister(result_, R0);
     compiler->RestoreLiveRegisters(locs);
     __ b(exit_label());
@@ -2993,7 +2993,7 @@
   // data area to be initialized.
   // R8: null
   if (num_elements > 0) {
-    const intptr_t array_size = instance_size - sizeof(RawArray);
+    const intptr_t array_size = instance_size - sizeof(ArrayLayout);
     __ LoadObject(R8, Object::null_object());
     if (num_elements >= 2) {
       __ mov(R9, compiler::Operand(R8));
@@ -3003,7 +3003,7 @@
       __ LoadImmediate(R9, 0x1);
 #endif  // DEBUG
     }
-    __ AddImmediate(R6, R0, sizeof(RawArray) - kHeapObjectTag);
+    __ AddImmediate(R6, R0, sizeof(ArrayLayout) - kHeapObjectTag);
     if (array_size < (kInlineArraySize * compiler::target::kWordSize)) {
       __ InitializeFieldsNoBarrierUnrolled(
           R0, R6, 0, num_elements * compiler::target::kWordSize, R8, R9);
@@ -3055,7 +3055,7 @@
   const auto& allocate_array_stub =
       Code::ZoneHandle(compiler->zone(), object_store->allocate_array_stub());
   compiler->GenerateStubCall(token_pos(), allocate_array_stub,
-                             RawPcDescriptors::kOther, locs(), deopt_id());
+                             PcDescriptorsLayout::kOther, locs(), deopt_id());
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
 
@@ -3318,8 +3318,8 @@
   // Lookup cache in stub before calling runtime.
   __ LoadObject(InstantiationABI::kUninstantiatedTypeArgumentsReg,
                 type_arguments());
-  compiler->GenerateStubCall(token_pos(), GetStub(), RawPcDescriptors::kOther,
-                             locs());
+  compiler->GenerateStubCall(token_pos(), GetStub(),
+                             PcDescriptorsLayout::kOther, locs());
   __ Bind(&type_arguments_instantiated);
 }
 
@@ -3359,8 +3359,8 @@
         compiler->zone(), object_store->allocate_context_stub());
     __ LoadImmediate(R1, instruction()->num_context_variables());
     compiler->GenerateStubCall(instruction()->token_pos(),
-                               allocate_context_stub, RawPcDescriptors::kOther,
-                               locs);
+                               allocate_context_stub,
+                               PcDescriptorsLayout::kOther, locs);
     ASSERT(instruction()->locs()->out(0).reg() == R0);
     compiler->RestoreLiveRegisters(instruction()->locs());
     __ b(exit_label());
@@ -3410,7 +3410,7 @@
       Code::ZoneHandle(compiler->zone(), object_store->allocate_context_stub());
   __ LoadImmediate(R1, num_context_variables());
   compiler->GenerateStubCall(token_pos(), allocate_context_stub,
-                             RawPcDescriptors::kOther, locs());
+                             PcDescriptorsLayout::kOther, locs());
 }
 
 LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone,
@@ -3432,7 +3432,7 @@
   const auto& clone_context_stub =
       Code::ZoneHandle(compiler->zone(), object_store->clone_context_stub());
   compiler->GenerateStubCall(token_pos(), clone_context_stub,
-                             /*kind=*/RawPcDescriptors::kOther, locs());
+                             /*kind=*/PcDescriptorsLayout::kOther, locs());
 }
 
 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone,
@@ -3453,7 +3453,7 @@
     if (compiler->is_optimizing()) {
       compiler->AddDeoptIndexAtCall(deopt_id);
     } else {
-      compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id,
+      compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, deopt_id,
                                      TokenPosition::kNoSource);
     }
   }
@@ -3540,7 +3540,7 @@
       compiler->RecordSafepoint(instruction()->locs(), kNumSlowPathArgs);
       compiler->RecordCatchEntryMoves();
       compiler->AddDescriptor(
-          RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
+          PcDescriptorsLayout::kOther, compiler->assembler()->CodeSize(),
           instruction()->deopt_id(), instruction()->token_pos(),
           compiler->CurrentTryIndex());
     } else {
@@ -3552,7 +3552,7 @@
     if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
         instruction()->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
-      compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
+      compiler->AddCurrentDescriptor(PcDescriptorsLayout::kOsrEntry,
                                      instruction()->deopt_id(),
                                      TokenPosition::kNoSource);
     }
@@ -3595,7 +3595,7 @@
     // the stub above).
     auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
     compiler->EmitCallsiteMetadata(token_pos(), deopt_id(),
-                                   RawPcDescriptors::kOther, locs(),
+                                   PcDescriptorsLayout::kOther, locs(),
                                    extended_env);
     return;
   }
@@ -4780,6 +4780,7 @@
               !Isolate::Current()
                    ->object_store()
                    ->allocate_mint_with_fpu_regs_stub()
+                   ->ptr()
                    ->InVMIsolateHeap())
                  ? LocationSummary::kCallOnSharedSlowPath
                  : LocationSummary::kCallOnSlowPath));
@@ -4826,7 +4827,7 @@
 
       ASSERT(!locs()->live_registers()->ContainsRegister(R0));
       auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
-      compiler->GenerateStubCall(token_pos(), stub, RawPcDescriptors::kOther,
+      compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
                                  locs(), DeoptId::kNone, extended_env);
   } else {
     BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
@@ -6392,7 +6393,7 @@
     // the stub above).
     auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
     compiler->EmitCallsiteMetadata(token_pos(), deopt_id(),
-                                   RawPcDescriptors::kOther, locs(),
+                                   PcDescriptorsLayout::kOther, locs(),
                                    extended_env);
     CheckNullInstr::AddMetadataForRuntimeCall(this, compiler);
     return;
@@ -7300,7 +7301,7 @@
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
+    compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -7474,7 +7475,7 @@
   }
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
-  compiler->GenerateStubCall(token_pos(), stub, RawPcDescriptors::kOther,
+  compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
                              locs());
 }
 
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 10bac83..0e5989c 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -283,7 +283,7 @@
   __ Bind(&stack_ok);
 #endif
   ASSERT(__ constant_pool_allowed());
-  if (yield_index() != RawPcDescriptors::kInvalidYieldIndex) {
+  if (yield_index() != PcDescriptorsLayout::kInvalidYieldIndex) {
     compiler->EmitYieldPositionMetadata(token_pos(), yield_index());
   }
   __ LeaveDartFrame();  // Disallows constant pool use.
@@ -400,7 +400,7 @@
   }
   __ blr(R2);
   compiler->EmitCallsiteMetadata(token_pos(), deopt_id(),
-                                 RawPcDescriptors::kOther, locs());
+                                 PcDescriptorsLayout::kOther, locs());
   __ Drop(argument_count);
 }
 
@@ -837,7 +837,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int64_t imm = reinterpret_cast<int64_t>(right.constant().raw());
+    const int64_t imm = static_cast<int64_t>(right.constant().raw());
     __ TestImmediate(left, imm);
   } else {
     __ tst(left, compiler::Operand(right.reg()));
@@ -980,9 +980,9 @@
                                    : ObjectPool::Patchability::kNotPatchable);
   if (link_lazily()) {
     compiler->GeneratePatchableCall(token_pos(), *stub,
-                                    RawPcDescriptors::kOther, locs());
+                                    PcDescriptorsLayout::kOther, locs());
   } else {
-    compiler->GenerateStubCall(token_pos(), *stub, RawPcDescriptors::kOther,
+    compiler->GenerateStubCall(token_pos(), *stub, PcDescriptorsLayout::kOther,
                                locs());
   }
   __ Pop(result);
@@ -1017,7 +1017,7 @@
   // instruction.
   __ adr(temp, compiler::Immediate(Instr::kInstrSize));
   compiler->EmitCallsiteMetadata(token_pos(), DeoptId::kNone,
-                                 RawPcDescriptors::Kind::kOther, locs());
+                                 PcDescriptorsLayout::Kind::kOther, locs());
 
   __ StoreToOffset(temp, FPREG, kSavedCallerPcSlotFromFp * kWordSize);
 
@@ -2108,7 +2108,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateStubCall(TokenPosition::kNoSource,  // No token position.
-                               stub, RawPcDescriptors::kOther, locs);
+                               stub, PcDescriptorsLayout::kOther, locs);
     __ MoveRegister(result_, R0);
     compiler->RestoreLiveRegisters(locs);
     __ b(exit_label());
@@ -2505,9 +2505,9 @@
   // data area to be initialized.
   // R6: null
   if (num_elements > 0) {
-    const intptr_t array_size = instance_size - sizeof(RawArray);
+    const intptr_t array_size = instance_size - sizeof(ArrayLayout);
     __ LoadObject(R6, Object::null_object());
-    __ AddImmediate(R8, R0, sizeof(RawArray) - kHeapObjectTag);
+    __ AddImmediate(R8, R0, sizeof(ArrayLayout) - kHeapObjectTag);
     if (array_size < (kInlineArraySize * kWordSize)) {
       intptr_t current_offset = 0;
       while (current_offset < array_size) {
@@ -2566,7 +2566,7 @@
   const auto& allocate_array_stub =
       Code::ZoneHandle(compiler->zone(), object_store->allocate_array_stub());
   compiler->GenerateStubCall(token_pos(), allocate_array_stub,
-                             RawPcDescriptors::kOther, locs(), deopt_id());
+                             PcDescriptorsLayout::kOther, locs(), deopt_id());
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
 
@@ -2807,8 +2807,8 @@
   // Lookup cache in stub before calling runtime.
   __ LoadObject(InstantiationABI::kUninstantiatedTypeArgumentsReg,
                 type_arguments());
-  compiler->GenerateStubCall(token_pos(), GetStub(), RawPcDescriptors::kOther,
-                             locs());
+  compiler->GenerateStubCall(token_pos(), GetStub(),
+                             PcDescriptorsLayout::kOther, locs());
   __ Bind(&type_arguments_instantiated);
 }
 
@@ -2849,8 +2849,8 @@
 
     __ LoadImmediate(R1, instruction()->num_context_variables());
     compiler->GenerateStubCall(instruction()->token_pos(),
-                               allocate_context_stub, RawPcDescriptors::kOther,
-                               locs);
+                               allocate_context_stub,
+                               PcDescriptorsLayout::kOther, locs);
     ASSERT(instruction()->locs()->out(0).reg() == R0);
     compiler->RestoreLiveRegisters(instruction()->locs());
     __ b(exit_label());
@@ -2900,7 +2900,7 @@
       Code::ZoneHandle(compiler->zone(), object_store->allocate_context_stub());
   __ LoadImmediate(R1, num_context_variables());
   compiler->GenerateStubCall(token_pos(), allocate_context_stub,
-                             RawPcDescriptors::kOther, locs());
+                             PcDescriptorsLayout::kOther, locs());
 }
 
 LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone,
@@ -2922,7 +2922,7 @@
   const auto& clone_context_stub =
       Code::ZoneHandle(compiler->zone(), object_store->clone_context_stub());
   compiler->GenerateStubCall(token_pos(), clone_context_stub,
-                             /*kind=*/RawPcDescriptors::kOther, locs());
+                             /*kind=*/PcDescriptorsLayout::kOther, locs());
 }
 
 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone,
@@ -2943,7 +2943,7 @@
     if (compiler->is_optimizing()) {
       compiler->AddDeoptIndexAtCall(deopt_id);
     } else {
-      compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id,
+      compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, deopt_id,
                                      TokenPosition::kNoSource);
     }
   }
@@ -3042,7 +3042,7 @@
       compiler->RecordSafepoint(locs, kNumSlowPathArgs);
       compiler->RecordCatchEntryMoves();
       compiler->AddDescriptor(
-          RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
+          PcDescriptorsLayout::kOther, compiler->assembler()->CodeSize(),
           instruction()->deopt_id(), instruction()->token_pos(),
           compiler->CurrentTryIndex());
     } else {
@@ -3054,7 +3054,7 @@
     if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
         instruction()->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
-      compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
+      compiler->AddCurrentDescriptor(PcDescriptorsLayout::kOsrEntry,
                                      instruction()->deopt_id(),
                                      TokenPosition::kNoSource);
     }
@@ -3151,8 +3151,7 @@
       const bool right_needs_check =
           !RangeUtils::IsWithin(right_range, 0, max_right - 1);
       if (right_needs_check) {
-        __ CompareImmediate(right,
-                            reinterpret_cast<int64_t>(Smi::New(max_right)));
+        __ CompareImmediate(right, static_cast<int64_t>(Smi::New(max_right)));
         __ b(deopt, CS);
       }
       __ SmiUntag(TMP, right);
@@ -3171,8 +3170,7 @@
         __ b(deopt, MI);
       }
 
-      __ CompareImmediate(right,
-                          reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
+      __ CompareImmediate(right, static_cast<int64_t>(Smi::New(Smi::kBits)));
       __ csel(result, ZR, result, CS);
       __ SmiUntag(TMP, right);
       __ lslv(TMP, left, TMP);
@@ -3184,8 +3182,7 @@
   } else {
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
-      __ CompareImmediate(right,
-                          reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
+      __ CompareImmediate(right, static_cast<int64_t>(Smi::New(Smi::kBits)));
       __ b(deopt, CS);
     }
     // Left is not a constant.
@@ -3309,8 +3306,7 @@
     case Token::kSHL:
       ASSERT(result != left);
       ASSERT(result != right);
-      __ CompareImmediate(right,
-                          reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
+      __ CompareImmediate(right, static_cast<int64_t>(Smi::New(Smi::kBits)));
       __ b(slow_path->entry_label(), CS);
 
       __ SmiUntag(TMP, right);
@@ -3322,8 +3318,7 @@
     case Token::kSHR:
       ASSERT(result != left);
       ASSERT(result != right);
-      __ CompareImmediate(right,
-                          reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
+      __ CompareImmediate(right, static_cast<int64_t>(Smi::New(Smi::kBits)));
       __ b(slow_path->entry_label(), CS);
 
       __ SmiUntag(result, right);
@@ -3542,7 +3537,7 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    const int64_t imm = reinterpret_cast<int64_t>(constant.raw());
+    const int64_t imm = static_cast<int64_t>(constant.raw());
     switch (op_kind()) {
       case Token::kADD: {
         if (deopt == NULL) {
@@ -3972,10 +3967,12 @@
   const bool stubs_in_vm_isolate = (Isolate::Current()
                                         ->object_store()
                                         ->allocate_mint_with_fpu_regs_stub()
+                                        ->ptr()
                                         ->InVMIsolateHeap() ||
                                     Isolate::Current()
                                         ->object_store()
                                         ->allocate_mint_without_fpu_regs_stub()
+                                        ->ptr()
                                         ->InVMIsolateHeap());
   const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
                                      FLAG_use_bare_instructions &&
@@ -4030,7 +4027,7 @@
 
       ASSERT(!locs()->live_registers()->ContainsRegister(R0));
       auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
-      compiler->GenerateStubCall(token_pos(), stub, RawPcDescriptors::kOther,
+      compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
                                  locs(), DeoptId::kNone, extended_env);
     } else {
       BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
@@ -5409,7 +5406,7 @@
   if (index_loc.IsConstant()) {
     const Register length = length_loc.reg();
     const Smi& index = Smi::Cast(index_loc.constant());
-    __ CompareImmediate(length, reinterpret_cast<int64_t>(index.raw()));
+    __ CompareImmediate(length, static_cast<int64_t>(index.raw()));
     __ b(deopt, LS);
   } else if (length_loc.IsConstant()) {
     const Smi& length = Smi::Cast(length_loc.constant());
@@ -5421,7 +5418,7 @@
       __ tst(index, compiler::Operand(index));
       __ b(deopt, MI);
     } else {
-      __ CompareImmediate(index, reinterpret_cast<int64_t>(length.raw()));
+      __ CompareImmediate(index, static_cast<int64_t>(length.raw()));
       __ b(deopt, CS);
     }
   } else {
@@ -6250,7 +6247,7 @@
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
+    compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -6417,7 +6414,7 @@
   }
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
-  compiler->GenerateStubCall(token_pos(), stub, RawPcDescriptors::kOther,
+  compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
                              locs());
 }
 
diff --git a/runtime/vm/compiler/backend/il_deserializer.cc b/runtime/vm/compiler/backend/il_deserializer.cc
index dc524d3..98c044d 100644
--- a/runtime/vm/compiler/backend/il_deserializer.cc
+++ b/runtime/vm/compiler/backend/il_deserializer.cc
@@ -1013,10 +1013,10 @@
 DebugStepCheckInstr* FlowGraphDeserializer::DeserializeDebugStepCheck(
     SExpList* sexp,
     const InstrInfo& info) {
-  auto kind = RawPcDescriptors::kAnyKind;
+  auto kind = PcDescriptorsLayout::kAnyKind;
   if (auto const kind_sexp = CheckSymbol(Retrieve(sexp, "stub_kind"))) {
-    if (!RawPcDescriptors::ParseKind(kind_sexp->value(), &kind)) {
-      StoreError(kind_sexp, "not a valid RawPcDescriptors::Kind name");
+    if (!PcDescriptorsLayout::ParseKind(kind_sexp->value(), &kind)) {
+      StoreError(kind_sexp, "not a valid PcDescriptorsLayout::Kind name");
       return nullptr;
     }
   }
@@ -1641,13 +1641,13 @@
   auto& function = Function::Cast(*out);
   // Check the kind expected by the S-expression if one was specified.
   if (auto const kind_sexp = CheckSymbol(list->ExtraLookupValue("kind"))) {
-    RawFunction::Kind kind;
-    if (!RawFunction::ParseKind(kind_sexp->value(), &kind)) {
+    FunctionLayout::Kind kind;
+    if (!FunctionLayout::ParseKind(kind_sexp->value(), &kind)) {
       StoreError(kind_sexp, "unexpected function kind");
       return false;
     }
     if (function.kind() != kind) {
-      auto const kind_str = RawFunction::KindToCString(function.kind());
+      auto const kind_str = FunctionLayout::KindToCString(function.kind());
       StoreError(list, "retrieved function has kind %s", kind_str);
       return false;
     }
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 57c00db..addc43e 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -140,7 +140,7 @@
   __ int3();
   __ Bind(&done);
 #endif
-  if (yield_index() != RawPcDescriptors::kInvalidYieldIndex) {
+  if (yield_index() != PcDescriptorsLayout::kInvalidYieldIndex) {
     compiler->EmitYieldPositionMetadata(token_pos(), yield_index());
   }
   __ LeaveFrame();
@@ -324,7 +324,7 @@
     } else {
       if (compiler::Assembler::IsSafeSmi(value_) || value_.IsNull()) {
         __ movl(LocationToStackSlotAddress(destination),
-                compiler::Immediate(reinterpret_cast<int32_t>(value_.raw())));
+                compiler::Immediate(static_cast<int32_t>(value_.raw())));
       } else {
         __ pushl(EAX);
         __ LoadObjectSafely(EAX, value_);
@@ -713,7 +713,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int32_t imm = reinterpret_cast<int32_t>(right.constant().raw());
+    const int32_t imm = static_cast<int32_t>(right.constant().raw());
     __ testl(left, compiler::Immediate(imm));
   } else {
     __ testl(left, right.reg());
@@ -856,7 +856,7 @@
   const compiler::ExternalLabel label(
       reinterpret_cast<uword>(native_c_function()));
   __ movl(ECX, compiler::Immediate(label.address()));
-  compiler->GenerateStubCall(token_pos(), *stub, RawPcDescriptors::kOther,
+  compiler->GenerateStubCall(token_pos(), *stub, PcDescriptorsLayout::kOther,
                              locs());
 
   __ popl(result);
@@ -893,7 +893,7 @@
   compiler::Label get_pc;
   __ call(&get_pc);
   compiler->EmitCallsiteMetadata(TokenPosition::kNoSource, DeoptId::kNone,
-                                 RawPcDescriptors::Kind::kOther, locs());
+                                 PcDescriptorsLayout::Kind::kOther, locs());
   __ Bind(&get_pc);
   __ popl(temp);
   __ movl(compiler::Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), temp);
@@ -1729,7 +1729,7 @@
           __ cmpl(value_cid_reg, compiler::Immediate(kNullCid));
         } else {
           const compiler::Immediate& raw_null =
-              compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+              compiler::Immediate(static_cast<intptr_t>(Object::null()));
           __ cmpl(value_reg, raw_null);
         }
       }
@@ -1853,7 +1853,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateStubCall(TokenPosition::kNoSource, stub,
-                               RawPcDescriptors::kOther, locs);
+                               PcDescriptorsLayout::kOther, locs);
     __ MoveRegister(result_, EAX);
     compiler->RestoreLiveRegisters(locs);
     __ jmp(exit_label());
@@ -1924,7 +1924,7 @@
                              Register temp) {
   compiler::Label done;
   const compiler::Immediate& raw_null =
-      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      compiler::Immediate(static_cast<intptr_t>(Object::null()));
   __ movl(box_reg, compiler::FieldAddress(instance_reg, offset));
   __ cmpl(box_reg, raw_null);
   __ j(NOT_EQUAL, &done);
@@ -2227,10 +2227,10 @@
   // EDI: iterator which initially points to the start of the variable
   // data area to be initialized.
   if (num_elements > 0) {
-    const intptr_t array_size = instance_size - sizeof(RawArray);
+    const intptr_t array_size = instance_size - sizeof(ArrayLayout);
     const compiler::Immediate& raw_null =
-        compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
-    __ leal(EDI, compiler::FieldAddress(EAX, sizeof(RawArray)));
+        compiler::Immediate(static_cast<intptr_t>(Object::null()));
+    __ leal(EDI, compiler::FieldAddress(EAX, sizeof(ArrayLayout)));
     if (array_size < (kInlineArraySize * kWordSize)) {
       intptr_t current_offset = 0;
       __ movl(EBX, raw_null);
@@ -2282,7 +2282,7 @@
 
   __ Bind(&slow_path);
   compiler->GenerateStubCall(token_pos(), StubCode::AllocateArray(),
-                             RawPcDescriptors::kOther, locs(), deopt_id());
+                             PcDescriptorsLayout::kOther, locs(), deopt_id());
   __ Bind(&done);
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
@@ -2493,8 +2493,8 @@
   // Lookup cache in stub before calling runtime.
   __ LoadObject(InstantiationABI::kUninstantiatedTypeArgumentsReg,
                 type_arguments());
-  compiler->GenerateStubCall(token_pos(), GetStub(), RawPcDescriptors::kOther,
-                             locs());
+  compiler->GenerateStubCall(token_pos(), GetStub(),
+                             PcDescriptorsLayout::kOther, locs());
   __ Bind(&type_arguments_instantiated);
 }
 
@@ -2531,7 +2531,7 @@
     __ movl(EDX, compiler::Immediate(instruction()->num_context_variables()));
     compiler->GenerateStubCall(instruction()->token_pos(),
                                StubCode::AllocateContext(),
-                               RawPcDescriptors::kOther, locs);
+                               PcDescriptorsLayout::kOther, locs);
     ASSERT(instruction()->locs()->out(0).reg() == EAX);
     compiler->RestoreLiveRegisters(instruction()->locs());
     __ jmp(exit_label());
@@ -2579,7 +2579,7 @@
 
   __ movl(EDX, compiler::Immediate(num_context_variables()));
   compiler->GenerateStubCall(token_pos(), StubCode::AllocateContext(),
-                             RawPcDescriptors::kOther, locs());
+                             PcDescriptorsLayout::kOther, locs());
 }
 
 LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone,
@@ -2598,7 +2598,7 @@
   ASSERT(locs()->out(0).reg() == EAX);
 
   compiler->GenerateStubCall(token_pos(), StubCode::CloneContext(),
-                             /*kind=*/RawPcDescriptors::kOther, locs());
+                             /*kind=*/PcDescriptorsLayout::kOther, locs());
 }
 
 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone,
@@ -2619,7 +2619,7 @@
     if (compiler->is_optimizing()) {
       compiler->AddDeoptIndexAtCall(deopt_id);
     } else {
-      compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id,
+      compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, deopt_id,
                                      TokenPosition::kNoSource);
     }
   }
@@ -2693,7 +2693,7 @@
     if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
         instruction()->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
-      compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
+      compiler->AddCurrentDescriptor(PcDescriptorsLayout::kOsrEntry,
                                      instruction()->deopt_id(),
                                      TokenPosition::kNoSource);
     }
@@ -2793,8 +2793,8 @@
       const bool right_needs_check =
           !RangeUtils::IsWithin(right_range, 0, max_right - 1);
       if (right_needs_check) {
-        __ cmpl(right, compiler::Immediate(
-                           reinterpret_cast<int32_t>(Smi::New(max_right))));
+        __ cmpl(right,
+                compiler::Immediate(static_cast<int32_t>(Smi::New(max_right))));
         __ j(ABOVE_EQUAL, deopt);
       }
       __ SmiUntag(right);
@@ -2814,8 +2814,8 @@
         __ j(NEGATIVE, deopt);
       }
       compiler::Label done, is_not_zero;
-      __ cmpl(right, compiler::Immediate(
-                         reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
+      __ cmpl(right,
+              compiler::Immediate(static_cast<int32_t>(Smi::New(Smi::kBits))));
       __ j(BELOW, &is_not_zero, compiler::Assembler::kNearJump);
       __ xorl(left, left);
       __ jmp(&done, compiler::Assembler::kNearJump);
@@ -2830,8 +2830,8 @@
   } else {
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
-      __ cmpl(right, compiler::Immediate(
-                         reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
+      __ cmpl(right,
+              compiler::Immediate(static_cast<int32_t>(Smi::New(Smi::kBits))));
       __ j(ABOVE_EQUAL, deopt);
     }
     // Left is not a constant.
@@ -5160,7 +5160,7 @@
 void CheckClassInstr::EmitNullCheck(FlowGraphCompiler* compiler,
                                     compiler::Label* deopt) {
   const compiler::Immediate& raw_null =
-      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      compiler::Immediate(static_cast<intptr_t>(Object::null()));
   __ cmpl(locs()->in(0).reg(), raw_null);
   ASSERT(IsDeoptIfNull() || IsDeoptIfNotNull());
   Condition cond = IsDeoptIfNull() ? EQUAL : NOT_EQUAL;
@@ -5325,20 +5325,17 @@
       __ testl(index, index);
       __ j(NEGATIVE, deopt);
     } else {
-      __ cmpl(index,
-              compiler::Immediate(reinterpret_cast<int32_t>(length.raw())));
+      __ cmpl(index, compiler::Immediate(static_cast<int32_t>(length.raw())));
       __ j(ABOVE_EQUAL, deopt);
     }
   } else if (index_loc.IsConstant()) {
     const Smi& index = Smi::Cast(index_loc.constant());
     if (length_loc.IsStackSlot()) {
       const compiler::Address& length = LocationToStackSlotAddress(length_loc);
-      __ cmpl(length,
-              compiler::Immediate(reinterpret_cast<int32_t>(index.raw())));
+      __ cmpl(length, compiler::Immediate(static_cast<int32_t>(index.raw())));
     } else {
       Register length = length_loc.reg();
-      __ cmpl(length,
-              compiler::Immediate(reinterpret_cast<int32_t>(index.raw())));
+      __ cmpl(length, compiler::Immediate(static_cast<int32_t>(index.raw())));
     }
     __ j(BELOW_EQUAL, deopt);
   } else if (length_loc.IsStackSlot()) {
@@ -6084,7 +6081,7 @@
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
+    compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -6272,7 +6269,7 @@
   __ xorl(ECX, ECX);
   __ call(EBX);
   compiler->EmitCallsiteMetadata(token_pos(), deopt_id(),
-                                 RawPcDescriptors::kOther, locs());
+                                 PcDescriptorsLayout::kOther, locs());
   __ Drop(argument_count);
 }
 
@@ -6321,7 +6318,7 @@
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
-  compiler->GenerateStubCall(token_pos(), stub, RawPcDescriptors::kOther,
+  compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
                              locs());
 }
 
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index e036600..83dda2b 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -1025,7 +1025,7 @@
 
 void ReturnInstr::PrintOperandsTo(BufferFormatter* f) const {
   Instruction::PrintOperandsTo(f);
-  if (yield_index() != RawPcDescriptors::kInvalidYieldIndex) {
+  if (yield_index() != PcDescriptorsLayout::kInvalidYieldIndex) {
     f->Print(", yield_index = %" Pd "", yield_index());
   }
 }
diff --git a/runtime/vm/compiler/backend/il_serializer.cc b/runtime/vm/compiler/backend/il_serializer.cc
index 4a4cb57..3708c8f 100644
--- a/runtime/vm/compiler/backend/il_serializer.cc
+++ b/runtime/vm/compiler/backend/il_serializer.cc
@@ -588,9 +588,9 @@
       AddExtraSymbol(sexp, "native_name", tmp_string_.ToCString());
     }
   }
-  if (func.kind() != RawFunction::Kind::kRegularFunction ||
+  if (func.kind() != FunctionLayout::Kind::kRegularFunction ||
       FLAG_verbose_flow_graph_serialization) {
-    AddExtraSymbol(sexp, "kind", RawFunction::KindToCString(func.kind()));
+    AddExtraSymbol(sexp, "kind", FunctionLayout::KindToCString(func.kind()));
   }
   function_type_args_ = func.type_parameters();
   if (auto const ta_sexp = NonEmptyTypeArgumentsToSExp(function_type_args_)) {
@@ -1061,9 +1061,9 @@
     SExpList* sexp,
     FlowGraphSerializer* s) const {
   Instruction::AddExtraInfoToSExpression(sexp, s);
-  if (stub_kind_ != RawPcDescriptors::kAnyKind ||
+  if (stub_kind_ != PcDescriptorsLayout::kAnyKind ||
       FLAG_verbose_flow_graph_serialization) {
-    auto const stub_kind_name = RawPcDescriptors::KindToCString(stub_kind_);
+    auto const stub_kind_name = PcDescriptorsLayout::KindToCString(stub_kind_);
     ASSERT(stub_kind_name != nullptr);
     s->AddExtraSymbol(sexp, "stub_kind", stub_kind_name);
   }
diff --git a/runtime/vm/compiler/backend/il_serializer.h b/runtime/vm/compiler/backend/il_serializer.h
index eb7795e..8a65fad3 100644
--- a/runtime/vm/compiler/backend/il_serializer.h
+++ b/runtime/vm/compiler/backend/il_serializer.h
@@ -148,7 +148,7 @@
       return a.raw() == b.raw();
     }
     static uword Hash(const Object& obj) {
-      if (obj.IsSmi()) return reinterpret_cast<uword>(obj.raw());
+      if (obj.IsSmi()) return static_cast<uword>(obj.raw());
       if (obj.IsInstance()) return Instance::Cast(obj).CanonicalizeHash();
       return obj.GetClassId();
     }
diff --git a/runtime/vm/compiler/backend/il_test_helper.cc b/runtime/vm/compiler/backend/il_test_helper.cc
index 5bec543..3148b0d 100644
--- a/runtime/vm/compiler/backend/il_test_helper.cc
+++ b/runtime/vm/compiler/backend/il_test_helper.cc
@@ -23,9 +23,9 @@
 
 Definition* const FlowGraphBuilderHelper::kPhiSelfReference = nullptr;
 
-RawLibrary* LoadTestScript(const char* script,
-                           Dart_NativeEntryResolver resolver,
-                           const char* lib_uri) {
+LibraryPtr LoadTestScript(const char* script,
+                          Dart_NativeEntryResolver resolver,
+                          const char* lib_uri) {
   Dart_Handle api_lib;
   {
     TransitionVMToNative transition(Thread::Current());
@@ -38,7 +38,7 @@
   return lib.raw();
 }
 
-RawFunction* GetFunction(const Library& lib, const char* name) {
+FunctionPtr GetFunction(const Library& lib, const char* name) {
   Thread* thread = Thread::Current();
   const auto& func = Function::Handle(lib.LookupFunctionAllowPrivate(
       String::Handle(Symbols::New(thread, name))));
@@ -46,7 +46,7 @@
   return func.raw();
 }
 
-RawClass* GetClass(const Library& lib, const char* name) {
+ClassPtr GetClass(const Library& lib, const char* name) {
   Thread* thread = Thread::Current();
   const auto& cls = Class::Handle(
       lib.LookupClassAllowPrivate(String::Handle(Symbols::New(thread, name))));
@@ -54,15 +54,15 @@
   return cls.raw();
 }
 
-RawTypeParameter* GetClassTypeParameter(const Class& klass, const char* name) {
+TypeParameterPtr GetClassTypeParameter(const Class& klass, const char* name) {
   const auto& param = TypeParameter::Handle(
       klass.LookupTypeParameter(String::Handle(String::New(name))));
   EXPECT(!param.IsNull());
   return param.raw();
 }
 
-RawTypeParameter* GetFunctionTypeParameter(const Function& fun,
-                                           const char* name) {
+TypeParameterPtr GetFunctionTypeParameter(const Function& fun,
+                                          const char* name) {
   intptr_t fun_level = 0;
   const auto& param = TypeParameter::Handle(
       fun.LookupTypeParameter(String::Handle(String::New(name)), &fun_level));
@@ -70,7 +70,7 @@
   return param.raw();
 }
 
-RawObject* Invoke(const Library& lib, const char* name) {
+ObjectPtr Invoke(const Library& lib, const char* name) {
   // These tests rely on running unoptimized code to collect type feedback. The
   // interpreter does not collect type feedback for interface calls, so set
   // compilation threshold to 0 in order to compile invoked function
diff --git a/runtime/vm/compiler/backend/il_test_helper.h b/runtime/vm/compiler/backend/il_test_helper.h
index 779c4df..1d8a121 100644
--- a/runtime/vm/compiler/backend/il_test_helper.h
+++ b/runtime/vm/compiler/backend/il_test_helper.h
@@ -50,20 +50,18 @@
 class FlowGraph;
 class Function;
 class Library;
-class RawFunction;
-class RawLibrary;
 
-RawLibrary* LoadTestScript(const char* script,
-                           Dart_NativeEntryResolver resolver = nullptr,
-                           const char* lib_uri = RESOLVED_USER_TEST_URI);
+LibraryPtr LoadTestScript(const char* script,
+                          Dart_NativeEntryResolver resolver = nullptr,
+                          const char* lib_uri = RESOLVED_USER_TEST_URI);
 
-RawFunction* GetFunction(const Library& lib, const char* name);
-RawClass* GetClass(const Library& lib, const char* name);
-RawTypeParameter* GetClassTypeParameter(const Class& klass, const char* name);
-RawTypeParameter* GetFunctionTypeParameter(const Function& fun,
-                                           const char* name);
+FunctionPtr GetFunction(const Library& lib, const char* name);
+ClassPtr GetClass(const Library& lib, const char* name);
+TypeParameterPtr GetClassTypeParameter(const Class& klass, const char* name);
+TypeParameterPtr GetFunctionTypeParameter(const Function& fun,
+                                          const char* name);
 
-RawObject* Invoke(const Library& lib, const char* name);
+ObjectPtr Invoke(const Library& lib, const char* name);
 
 class TestPipeline : public ValueObject {
  public:
@@ -291,7 +289,7 @@
   static FlowGraph& MakeDummyGraph(Thread* thread) {
     const Function& func = Function::ZoneHandle(Function::New(
         String::Handle(Symbols::New(thread, "dummy")),
-        RawFunction::kRegularFunction,
+        FunctionLayout::kRegularFunction,
         /*is_static=*/true,
         /*is_const=*/false,
         /*is_abstract=*/false,
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 1109aff..d9324dc 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -219,7 +219,7 @@
   __ Bind(&done);
 #endif
   ASSERT(__ constant_pool_allowed());
-  if (yield_index() != RawPcDescriptors::kInvalidYieldIndex) {
+  if (yield_index() != PcDescriptorsLayout::kInvalidYieldIndex) {
     compiler->EmitYieldPositionMetadata(token_pos(), yield_index());
   }
   __ LeaveDartFrame();  // Disallows constant pool use.
@@ -795,7 +795,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int64_t imm = reinterpret_cast<int64_t>(right.constant().raw());
+    const int64_t imm = static_cast<int64_t>(right.constant().raw());
     __ TestImmediate(left_reg, compiler::Immediate(imm));
   } else {
     __ testq(left_reg, right.reg());
@@ -920,7 +920,7 @@
     __ LoadNativeEntry(RBX, &label,
                        compiler::ObjectPoolBuilderEntry::kPatchable);
     compiler->GeneratePatchableCall(token_pos(), *stub,
-                                    RawPcDescriptors::kOther, locs());
+                                    PcDescriptorsLayout::kOther, locs());
   } else {
     if (is_bootstrap_native()) {
       stub = &StubCode::CallBootstrapNative();
@@ -933,7 +933,7 @@
         reinterpret_cast<uword>(native_c_function()));
     __ LoadNativeEntry(RBX, &label,
                        compiler::ObjectPoolBuilderEntry::kNotPatchable);
-    compiler->GenerateStubCall(token_pos(), *stub, RawPcDescriptors::kOther,
+    compiler->GenerateStubCall(token_pos(), *stub, PcDescriptorsLayout::kOther,
                                locs());
   }
   __ popq(result);
@@ -971,7 +971,7 @@
   // 'movq'.
   __ leaq(TMP, compiler::Address::AddressRIPRelative(0));
   compiler->EmitCallsiteMetadata(TokenPosition::kNoSource, DeoptId::kNone,
-                                 RawPcDescriptors::Kind::kOther, locs());
+                                 PcDescriptorsLayout::Kind::kOther, locs());
   __ movq(compiler::Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), TMP);
 
   if (CanExecuteGeneratedCodeInSafepoint()) {
@@ -1301,7 +1301,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateStubCall(TokenPosition::kNoSource,  // No token position.
-                               stub, RawPcDescriptors::kOther, locs);
+                               stub, PcDescriptorsLayout::kOther, locs);
     __ MoveRegister(result_, RAX);
     compiler->RestoreLiveRegisters(locs);
     __ jmp(exit_label());
@@ -2485,9 +2485,9 @@
   // RDI: iterator which initially points to the start of the variable
   // data area to be initialized.
   if (num_elements > 0) {
-    const intptr_t array_size = instance_size - sizeof(RawArray);
+    const intptr_t array_size = instance_size - sizeof(ArrayLayout);
     __ LoadObject(R12, Object::null_object());
-    __ leaq(RDI, compiler::FieldAddress(RAX, sizeof(RawArray)));
+    __ leaq(RDI, compiler::FieldAddress(RAX, sizeof(ArrayLayout)));
     if (array_size < (kInlineArraySize * kWordSize)) {
       intptr_t current_offset = 0;
       while (current_offset < array_size) {
@@ -2549,7 +2549,7 @@
   const auto& allocate_array_stub =
       Code::ZoneHandle(compiler->zone(), object_store->allocate_array_stub());
   compiler->GenerateStubCall(token_pos(), allocate_array_stub,
-                             RawPcDescriptors::kOther, locs(), deopt_id());
+                             PcDescriptorsLayout::kOther, locs(), deopt_id());
   __ Bind(&done);
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
@@ -2800,8 +2800,8 @@
   }
   __ LoadObject(InstantiationABI::kUninstantiatedTypeArgumentsReg,
                 type_arguments());
-  compiler->GenerateStubCall(token_pos(), GetStub(), RawPcDescriptors::kOther,
-                             locs());
+  compiler->GenerateStubCall(token_pos(), GetStub(),
+                             PcDescriptorsLayout::kOther, locs());
   __ Bind(&type_arguments_instantiated);
 }
 
@@ -2842,8 +2842,8 @@
     __ LoadImmediate(
         R10, compiler::Immediate(instruction()->num_context_variables()));
     compiler->GenerateStubCall(instruction()->token_pos(),
-                               allocate_context_stub, RawPcDescriptors::kOther,
-                               locs);
+                               allocate_context_stub,
+                               PcDescriptorsLayout::kOther, locs);
     ASSERT(instruction()->locs()->out(0).reg() == RAX);
     compiler->RestoreLiveRegisters(instruction()->locs());
     __ jmp(exit_label());
@@ -2894,7 +2894,7 @@
 
   __ LoadImmediate(R10, compiler::Immediate(num_context_variables()));
   compiler->GenerateStubCall(token_pos(), allocate_context_stub,
-                             RawPcDescriptors::kOther, locs());
+                             PcDescriptorsLayout::kOther, locs());
 }
 
 LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone,
@@ -2916,7 +2916,7 @@
   const auto& clone_context_stub =
       Code::ZoneHandle(compiler->zone(), object_store->clone_context_stub());
   compiler->GenerateStubCall(token_pos(), clone_context_stub,
-                             /*kind=*/RawPcDescriptors::kOther, locs());
+                             /*kind=*/PcDescriptorsLayout::kOther, locs());
 }
 
 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone,
@@ -2937,7 +2937,7 @@
     if (compiler->is_optimizing()) {
       compiler->AddDeoptIndexAtCall(deopt_id);
     } else {
-      compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id,
+      compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, deopt_id,
                                      TokenPosition::kNoSource);
     }
   }
@@ -3020,7 +3020,7 @@
       compiler->RecordSafepoint(instruction()->locs(), kNumSlowPathArgs);
       compiler->RecordCatchEntryMoves();
       compiler->AddDescriptor(
-          RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
+          PcDescriptorsLayout::kOther, compiler->assembler()->CodeSize(),
           instruction()->deopt_id(), instruction()->token_pos(),
           compiler->CurrentTryIndex());
     } else {
@@ -3032,7 +3032,7 @@
     if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
         instruction()->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
-      compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
+      compiler->AddCurrentDescriptor(PcDescriptorsLayout::kOsrEntry,
                                      instruction()->deopt_id(),
                                      TokenPosition::kNoSource);
     }
@@ -3135,8 +3135,8 @@
           !RangeUtils::IsWithin(right_range, 0, max_right - 1);
       if (right_needs_check) {
         __ CompareImmediate(
-            right, compiler::Immediate(
-                       reinterpret_cast<int64_t>(Smi::New(max_right))));
+            right,
+            compiler::Immediate(static_cast<int64_t>(Smi::New(max_right))));
         __ j(ABOVE_EQUAL, deopt);
       }
       __ SmiUntag(right);
@@ -3160,7 +3160,7 @@
       compiler::Label done, is_not_zero;
       __ CompareImmediate(
           right,
-          compiler::Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
+          compiler::Immediate(static_cast<int64_t>(Smi::New(Smi::kBits))));
       __ j(BELOW, &is_not_zero, compiler::Assembler::kNearJump);
       __ xorq(left, left);
       __ jmp(&done, compiler::Assembler::kNearJump);
@@ -3177,7 +3177,7 @@
       ASSERT(shift_left->CanDeoptimize());
       __ CompareImmediate(
           right,
-          compiler::Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
+          compiler::Immediate(static_cast<int64_t>(Smi::New(Smi::kBits))));
       __ j(ABOVE_EQUAL, deopt);
     }
     // Left is not a constant.
@@ -3509,8 +3509,7 @@
 
 static bool CanBeImmediate(const Object& constant) {
   return constant.IsSmi() &&
-         compiler::Immediate(reinterpret_cast<int64_t>(constant.raw()))
-             .is_int32();
+         compiler::Immediate(static_cast<int64_t>(constant.raw())).is_int32();
 }
 
 static bool IsSmiValue(const Object& constant, intptr_t value) {
@@ -3619,7 +3618,7 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    const int64_t imm = reinterpret_cast<int64_t>(constant.raw());
+    const int64_t imm = static_cast<int64_t>(constant.raw());
     switch (op_kind()) {
       case Token::kADD: {
         __ AddImmediate(left, compiler::Immediate(imm));
@@ -5616,8 +5615,8 @@
   if (index_loc.IsConstant()) {
     Register length = length_loc.reg();
     const Smi& index = Smi::Cast(index_loc.constant());
-    __ CompareImmediate(
-        length, compiler::Immediate(reinterpret_cast<int64_t>(index.raw())));
+    __ CompareImmediate(length,
+                        compiler::Immediate(static_cast<int64_t>(index.raw())));
     __ j(BELOW_EQUAL, deopt);
   } else if (length_loc.IsConstant()) {
     const Smi& length = Smi::Cast(length_loc.constant());
@@ -5630,7 +5629,7 @@
       __ j(NEGATIVE, deopt);
     } else {
       __ CompareImmediate(
-          index, compiler::Immediate(reinterpret_cast<int64_t>(length.raw())));
+          index, compiler::Immediate(static_cast<int64_t>(length.raw())));
       __ j(ABOVE_EQUAL, deopt);
     }
   } else {
@@ -6514,7 +6513,7 @@
     }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.
-    compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, GetDeoptId(),
+    compiler->AddCurrentDescriptor(PcDescriptorsLayout::kDeopt, GetDeoptId(),
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
@@ -6645,7 +6644,7 @@
   }
   __ call(RCX);
   compiler->EmitCallsiteMetadata(token_pos(), deopt_id(),
-                                 RawPcDescriptors::kOther, locs());
+                                 PcDescriptorsLayout::kOther, locs());
   __ Drop(argument_count);
 }
 
@@ -6701,7 +6700,7 @@
   }
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
-  compiler->GenerateStubCall(token_pos(), stub, RawPcDescriptors::kOther,
+  compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
                              locs());
 }
 
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index b4365f0..169d57d 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -2285,7 +2285,7 @@
   // replace them with inline FG before inlining introduces any superfluous
   // AssertAssignable instructions.
   if (function.IsDispatcherOrImplicitAccessor() &&
-      !(function.kind() == RawFunction::kDynamicInvocationForwarder &&
+      !(function.kind() == FunctionLayout::kDynamicInvocationForwarder &&
         function.IsRecognized())) {
     // Smaller or same size as the call.
     return true;
@@ -2298,7 +2298,7 @@
 
   if (function.IsGetterFunction() || function.IsSetterFunction() ||
       IsInlineableOperator(function) ||
-      (function.kind() == RawFunction::kConstructor)) {
+      (function.kind() == FunctionLayout::kConstructor)) {
     const intptr_t count = function.optimized_instruction_count();
     if ((count != 0) && (count < FLAG_inline_getters_setters_smaller_than)) {
       return true;
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index 8115c6a..2da369a 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -53,31 +53,31 @@
 //
 // Note: native slots are expected to be non-nullable.
 #define NATIVE_SLOTS_LIST(V)                                                   \
-  V(Array, RawArray, length, Smi, FINAL)                                       \
-  V(Context, RawContext, parent, Context, FINAL)                               \
-  V(Closure, RawClosure, instantiator_type_arguments, TypeArguments, FINAL)    \
-  V(Closure, RawClosure, delayed_type_arguments, TypeArguments, FINAL)         \
-  V(Closure, RawClosure, function_type_arguments, TypeArguments, FINAL)        \
-  V(Closure, RawClosure, function, Function, FINAL)                            \
-  V(Closure, RawClosure, context, Context, FINAL)                              \
-  V(Closure, RawClosure, hash, Context, VAR)                                   \
-  V(GrowableObjectArray, RawGrowableObjectArray, length, Smi, VAR)             \
-  V(GrowableObjectArray, RawGrowableObjectArray, data, Array, VAR)             \
-  V(TypedDataBase, RawTypedDataBase, length, Smi, FINAL)                       \
-  V(TypedDataView, RawTypedDataView, offset_in_bytes, Smi, FINAL)              \
-  V(TypedDataView, RawTypedDataView, data, Dynamic, FINAL)                     \
-  V(String, RawString, length, Smi, FINAL)                                     \
-  V(LinkedHashMap, RawLinkedHashMap, index, TypedDataUint32Array, VAR)         \
-  V(LinkedHashMap, RawLinkedHashMap, data, Array, VAR)                         \
-  V(LinkedHashMap, RawLinkedHashMap, hash_mask, Smi, VAR)                      \
-  V(LinkedHashMap, RawLinkedHashMap, used_data, Smi, VAR)                      \
-  V(LinkedHashMap, RawLinkedHashMap, deleted_keys, Smi, VAR)                   \
-  V(ArgumentsDescriptor, RawArray, type_args_len, Smi, FINAL)                  \
-  V(ArgumentsDescriptor, RawArray, positional_count, Smi, FINAL)               \
-  V(ArgumentsDescriptor, RawArray, count, Smi, FINAL)                          \
-  V(ArgumentsDescriptor, RawArray, size, Smi, FINAL)                           \
-  V(PointerBase, RawPointerBase, data_field, Dynamic, FINAL)                   \
-  V(Type, RawType, arguments, TypeArguments, FINAL)
+  V(Array, ArrayLayout, length, Smi, FINAL)                                    \
+  V(Context, ContextLayout, parent, Context, FINAL)                            \
+  V(Closure, ClosureLayout, instantiator_type_arguments, TypeArguments, FINAL) \
+  V(Closure, ClosureLayout, delayed_type_arguments, TypeArguments, FINAL)      \
+  V(Closure, ClosureLayout, function_type_arguments, TypeArguments, FINAL)     \
+  V(Closure, ClosureLayout, function, Function, FINAL)                         \
+  V(Closure, ClosureLayout, context, Context, FINAL)                           \
+  V(Closure, ClosureLayout, hash, Context, VAR)                                \
+  V(GrowableObjectArray, GrowableObjectArrayLayout, length, Smi, VAR)          \
+  V(GrowableObjectArray, GrowableObjectArrayLayout, data, Array, VAR)          \
+  V(TypedDataBase, TypedDataBaseLayout, length, Smi, FINAL)                    \
+  V(TypedDataView, TypedDataViewLayout, offset_in_bytes, Smi, FINAL)           \
+  V(TypedDataView, TypedDataViewLayout, data, Dynamic, FINAL)                  \
+  V(String, StringLayout, length, Smi, FINAL)                                  \
+  V(LinkedHashMap, LinkedHashMapLayout, index, TypedDataUint32Array, VAR)      \
+  V(LinkedHashMap, LinkedHashMapLayout, data, Array, VAR)                      \
+  V(LinkedHashMap, LinkedHashMapLayout, hash_mask, Smi, VAR)                   \
+  V(LinkedHashMap, LinkedHashMapLayout, used_data, Smi, VAR)                   \
+  V(LinkedHashMap, LinkedHashMapLayout, deleted_keys, Smi, VAR)                \
+  V(ArgumentsDescriptor, ArrayLayout, type_args_len, Smi, FINAL)               \
+  V(ArgumentsDescriptor, ArrayLayout, positional_count, Smi, FINAL)            \
+  V(ArgumentsDescriptor, ArrayLayout, count, Smi, FINAL)                       \
+  V(ArgumentsDescriptor, ArrayLayout, size, Smi, FINAL)                        \
+  V(PointerBase, PointerBaseLayout, data_field, Dynamic, FINAL)                \
+  V(Type, TypeLayout, arguments, TypeArguments, FINAL)
 
 // Slot is an abstraction that describes an readable (and possibly writeable)
 // location within an object.
diff --git a/runtime/vm/compiler/backend/slot_test.cc b/runtime/vm/compiler/backend/slot_test.cc
index 7dea9b7..a506698 100644
--- a/runtime/vm/compiler/backend/slot_test.cc
+++ b/runtime/vm/compiler/backend/slot_test.cc
@@ -48,8 +48,8 @@
 
   const Function& dummy_function = Function::ZoneHandle(
       Function::New(String::Handle(Symbols::New(thread, "foo")),
-                    RawFunction::kRegularFunction, false, false, false, false,
-                    false, dummy_class, TokenPosition::kMinSource));
+                    FunctionLayout::kRegularFunction, false, false, false,
+                    false, false, dummy_class, TokenPosition::kMinSource));
 
   const Field& field = Field::Handle(
       Field::New(String::Handle(Symbols::New(thread, "field")),
diff --git a/runtime/vm/compiler/backend/type_propagator_test.cc b/runtime/vm/compiler/backend/type_propagator_test.cc
index b68ee83..aacaf44 100644
--- a/runtime/vm/compiler/backend/type_propagator_test.cc
+++ b/runtime/vm/compiler/backend/type_propagator_test.cc
@@ -171,7 +171,7 @@
 
   const Function& target_func = Function::ZoneHandle(Function::New(
       String::Handle(Symbols::New(thread, "dummy2")),
-      RawFunction::kRegularFunction,
+      FunctionLayout::kRegularFunction,
       /*is_static=*/true,
       /*is_const=*/false,
       /*is_abstract=*/false,
diff --git a/runtime/vm/compiler/backend/yield_position_test.cc b/runtime/vm/compiler/backend/yield_position_test.cc
index 7707468..a32bb74 100644
--- a/runtime/vm/compiler/backend/yield_position_test.cc
+++ b/runtime/vm/compiler/backend/yield_position_test.cc
@@ -26,7 +26,7 @@
     while (!it.Done()) {
       if (auto return_instr = it.Current()->AsReturn()) {
         if (return_instr->yield_index() !=
-            RawPcDescriptors::kInvalidYieldIndex) {
+            PcDescriptorsLayout::kInvalidYieldIndex) {
           ASSERT(return_instr->yield_index() > 0);
           array->Add(
               Pair(return_instr->yield_index(), return_instr->token_pos()));
@@ -42,9 +42,9 @@
 static YieldPoints* GetYieldPointsFromCode(const Code& code) {
   auto array = new YieldPoints();
   const auto& pc_descriptor = PcDescriptors::Handle(code.pc_descriptors());
-  PcDescriptors::Iterator it(pc_descriptor, RawPcDescriptors::kOther);
+  PcDescriptors::Iterator it(pc_descriptor, PcDescriptorsLayout::kOther);
   while (it.MoveNext()) {
-    if (it.YieldIndex() != RawPcDescriptors::kInvalidYieldIndex) {
+    if (it.YieldIndex() != PcDescriptorsLayout::kInvalidYieldIndex) {
       array->Add(Pair(it.YieldIndex(), it.TokenPos()));
     }
   }
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index b739030..cabdb7c 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -749,8 +749,8 @@
     field = field.CloneFromOriginal();
   }
 
-  switch (
-      flow_graph()->CheckForInstanceCall(call, RawFunction::kImplicitGetter)) {
+  switch (flow_graph()->CheckForInstanceCall(call,
+                                             FunctionLayout::kImplicitGetter)) {
     case FlowGraph::ToCheck::kCheckNull:
       AddCheckNull(call->Receiver(), call->function_name(), call->deopt_id(),
                    call->env(), call);
@@ -795,7 +795,7 @@
     return false;
   }
   const Function& target = targets.FirstTarget();
-  if (target.kind() != RawFunction::kImplicitSetter) {
+  if (target.kind() != FunctionLayout::kImplicitSetter) {
     // Non-implicit setter are inlined like normal method calls.
     return false;
   }
@@ -805,8 +805,8 @@
     field = field.CloneFromOriginal();
   }
 
-  switch (
-      flow_graph()->CheckForInstanceCall(instr, RawFunction::kImplicitSetter)) {
+  switch (flow_graph()->CheckForInstanceCall(instr,
+                                             FunctionLayout::kImplicitSetter)) {
     case FlowGraph::ToCheck::kCheckNull:
       AddCheckNull(instr->Receiver(), instr->function_name(), instr->deopt_id(),
                    instr->env(), instr);
@@ -956,7 +956,7 @@
     return false;
   }
   const Function& target = targets.FirstTarget();
-  if (target.kind() != RawFunction::kImplicitGetter) {
+  if (target.kind() != FunctionLayout::kImplicitGetter) {
     // Non-implicit getters are inlined like normal methods by conventional
     // inlining in FlowGraphInliner.
     return false;
@@ -1063,7 +1063,7 @@
 // (ic_data.NumberOfChecks() * 2) entries
 // An instance-of test returning all same results can be converted to a class
 // check.
-RawBool* CallSpecializer::InstanceOfAsBool(
+BoolPtr CallSpecializer::InstanceOfAsBool(
     const ICData& ic_data,
     const AbstractType& type,
     ZoneGrowableArray<intptr_t>* results) const {
diff --git a/runtime/vm/compiler/call_specializer.h b/runtime/vm/compiler/call_specializer.h
index c1be9a2..5bb2cb7 100644
--- a/runtime/vm/compiler/call_specializer.h
+++ b/runtime/vm/compiler/call_specializer.h
@@ -159,9 +159,9 @@
 
   bool TryInlineImplicitInstanceGetter(InstanceCallInstr* call);
 
-  RawBool* InstanceOfAsBool(const ICData& ic_data,
-                            const AbstractType& type,
-                            ZoneGrowableArray<intptr_t>* results) const;
+  BoolPtr InstanceOfAsBool(const ICData& ic_data,
+                           const AbstractType& type,
+                           ZoneGrowableArray<intptr_t>* results) const;
 
   bool TryOptimizeInstanceOfUsingStaticTypes(InstanceCallInstr* call,
                                              const AbstractType& type);
diff --git a/runtime/vm/compiler/ffi/call.cc b/runtime/vm/compiler/ffi/call.cc
index 40a4e6e..5cb1598 100644
--- a/runtime/vm/compiler/ffi/call.cc
+++ b/runtime/vm/compiler/ffi/call.cc
@@ -13,15 +13,15 @@
 namespace ffi {
 
 // TODO(dartbug.com/36607): Cache the trampolines.
-RawFunction* TrampolineFunction(const Function& dart_signature,
-                                const Function& c_signature) {
+FunctionPtr TrampolineFunction(const Function& dart_signature,
+                               const Function& c_signature) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   String& name = String::Handle(zone, Symbols::New(thread, "FfiTrampoline"));
   const Library& lib = Library::Handle(zone, Library::FfiLibrary());
   const Class& owner_class = Class::Handle(zone, lib.toplevel_class());
   Function& function =
-      Function::Handle(zone, Function::New(name, RawFunction::kFfiTrampoline,
+      Function::Handle(zone, Function::New(name, FunctionLayout::kFfiTrampoline,
                                            /*is_static=*/true,
                                            /*is_const=*/false,
                                            /*is_abstract=*/false,
diff --git a/runtime/vm/compiler/ffi/call.h b/runtime/vm/compiler/ffi/call.h
index 86a986b..050b1d8 100644
--- a/runtime/vm/compiler/ffi/call.h
+++ b/runtime/vm/compiler/ffi/call.h
@@ -19,8 +19,8 @@
 
 namespace ffi {
 
-RawFunction* TrampolineFunction(const Function& dart_signature,
-                                const Function& c_signature);
+FunctionPtr TrampolineFunction(const Function& dart_signature,
+                               const Function& c_signature);
 
 }  // namespace ffi
 
diff --git a/runtime/vm/compiler/ffi/callback.cc b/runtime/vm/compiler/ffi/callback.cc
index 6bd722a..8d1fe95 100644
--- a/runtime/vm/compiler/ffi/callback.cc
+++ b/runtime/vm/compiler/ffi/callback.cc
@@ -12,9 +12,9 @@
 
 namespace ffi {
 
-RawFunction* NativeCallbackFunction(const Function& c_signature,
-                                    const Function& dart_target,
-                                    const Instance& exceptional_return) {
+FunctionPtr NativeCallbackFunction(const Function& c_signature,
+                                   const Function& dart_target,
+                                   const Instance& exceptional_return) {
   Thread* const thread = Thread::Current();
   const int32_t callback_id = thread->AllocateFfiCallbackId();
 
@@ -28,7 +28,7 @@
   const Library& lib = Library::Handle(zone, Library::FfiLibrary());
   const Class& owner_class = Class::Handle(zone, lib.toplevel_class());
   const Function& function =
-      Function::Handle(zone, Function::New(name, RawFunction::kFfiTrampoline,
+      Function::Handle(zone, Function::New(name, FunctionLayout::kFfiTrampoline,
                                            /*is_static=*/true,
                                            /*is_const=*/false,
                                            /*is_abstract=*/false,
diff --git a/runtime/vm/compiler/ffi/callback.h b/runtime/vm/compiler/ffi/callback.h
index 4113ffa..265143e 100644
--- a/runtime/vm/compiler/ffi/callback.h
+++ b/runtime/vm/compiler/ffi/callback.h
@@ -19,9 +19,9 @@
 
 namespace ffi {
 
-RawFunction* NativeCallbackFunction(const Function& c_signature,
-                                    const Function& dart_target,
-                                    const Instance& exceptional_return);
+FunctionPtr NativeCallbackFunction(const Function& c_signature,
+                                   const Function& dart_target,
+                                   const Instance& exceptional_return);
 
 }  // namespace ffi
 
diff --git a/runtime/vm/compiler/ffi/marshaller.h b/runtime/vm/compiler/ffi/marshaller.h
index 01704c7..d8d4647 100644
--- a/runtime/vm/compiler/ffi/marshaller.h
+++ b/runtime/vm/compiler/ffi/marshaller.h
@@ -74,7 +74,7 @@
            kFfiVoidCid;
   }
 
-  RawString* function_name() const { return dart_signature_.name(); }
+  StringPtr function_name() const { return dart_signature_.name(); }
 
  protected:
   BaseMarshaller(Zone* zone, const Function& dart_signature)
diff --git a/runtime/vm/compiler/ffi/native_calling_convention.cc b/runtime/vm/compiler/ffi/native_calling_convention.cc
index 032f583..fa6f4eb 100644
--- a/runtime/vm/compiler/ffi/native_calling_convention.cc
+++ b/runtime/vm/compiler/ffi/native_calling_convention.cc
@@ -279,7 +279,7 @@
   return c_signature_.num_fixed_parameters() - kNativeParamsStartAt;
 }
 
-RawAbstractType* NativeCallingConvention::CType(intptr_t arg_index) const {
+AbstractTypePtr NativeCallingConvention::CType(intptr_t arg_index) const {
   if (arg_index == kResultIndex) {
     return c_signature_.result_type();
   }
diff --git a/runtime/vm/compiler/ffi/native_calling_convention.h b/runtime/vm/compiler/ffi/native_calling_convention.h
index 1524b6f..5eae152 100644
--- a/runtime/vm/compiler/ffi/native_calling_convention.h
+++ b/runtime/vm/compiler/ffi/native_calling_convention.h
@@ -42,7 +42,7 @@
   // The C Type (expressed in a Dart Type) of the argument at `arg_index`.
   //
   // Excluding the #0 argument which is the function pointer.
-  RawAbstractType* CType(intptr_t arg_index) const;
+  AbstractTypePtr CType(intptr_t arg_index) const;
 
   // The location of the argument at `arg_index`.
   const NativeLocation& Location(intptr_t arg_index) const {
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index a60eb07..67faab3 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -971,7 +971,7 @@
   return Fragment();
 #else
   return Fragment(new (Z) DebugStepCheckInstr(
-      position, RawPcDescriptors::kRuntimeCall, GetNextDeoptId()));
+      position, PcDescriptorsLayout::kRuntimeCall, GetNextDeoptId()));
 #endif
 }
 
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index 67448f0..e4ebf61 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -277,8 +277,9 @@
                          bool negate = false);
   Fragment BranchIfStrictEqual(TargetEntryInstr** then_entry,
                                TargetEntryInstr** otherwise_entry);
-  Fragment Return(TokenPosition position,
-                  intptr_t yield_index = RawPcDescriptors::kInvalidYieldIndex);
+  Fragment Return(
+      TokenPosition position,
+      intptr_t yield_index = PcDescriptorsLayout::kInvalidYieldIndex);
   Fragment CheckStackOverflow(TokenPosition position,
                               intptr_t stack_depth,
                               intptr_t loop_depth);
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
index 5bcc3d8..23dcf66 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
@@ -1637,7 +1637,7 @@
   BuildDebugStepCheck();
   LoadStackSlots(1);
   ASSERT(code_.is_open());
-  intptr_t yield_index = RawPcDescriptors::kInvalidYieldIndex;
+  intptr_t yield_index = PcDescriptorsLayout::kInvalidYieldIndex;
   if (function().IsAsyncClosure() || function().IsAsyncGenClosure()) {
     if (pc_ == last_yield_point_pc_) {
       // The return might actually be a yield point, if so we need to attach the
@@ -1958,7 +1958,7 @@
                                                intptr_t pc) {
   const uword pc_offset =
       KernelBytecode::BytecodePcToOffset(pc, /* is_return_address = */ true);
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
   intptr_t try_index = kInvalidTryIndex;
   while (iter.MoveNext()) {
     const intptr_t current_try_index = iter.TryIndex();
@@ -2050,7 +2050,7 @@
     pc += (KernelBytecode::Next(instr) - instr);
   }
 
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
   while (iter.MoveNext()) {
     const intptr_t start_pc = KernelBytecode::OffsetToBytecodePc(
         iter.PcOffset(), /* is_return_address = */ true);
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index d205058..4b10135 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -123,7 +123,7 @@
   return true;
 }
 
-RawLibrary* BytecodeMetadataHelper::GetMainLibrary() {
+LibraryPtr BytecodeMetadataHelper::GetMainLibrary() {
   const intptr_t md_offset = GetComponentMetadataPayloadOffset();
   if (md_offset < 0) {
     return Library::null();
@@ -141,8 +141,8 @@
   return bytecode_reader.ReadMain();
 }
 
-RawArray* BytecodeMetadataHelper::GetBytecodeComponent() {
-  RawArray* array = translation_helper_.GetBytecodeComponent();
+ArrayPtr BytecodeMetadataHelper::GetBytecodeComponent() {
+  ArrayPtr array = translation_helper_.GetBytecodeComponent();
   if (array == Array::null()) {
     array = ReadBytecodeComponent();
     ASSERT(array != Array::null());
@@ -150,7 +150,7 @@
   return array;
 }
 
-RawArray* BytecodeMetadataHelper::ReadBytecodeComponent() {
+ArrayPtr BytecodeMetadataHelper::ReadBytecodeComponent() {
   const intptr_t md_offset = GetComponentMetadataPayloadOffset();
   if (md_offset < 0) {
     return Array::null();
@@ -209,10 +209,15 @@
     intptr_t num_params = reader_.ReadUInt();
     ASSERT(num_params ==
            function.NumParameters() - function.NumImplicitParameters());
-    for (intptr_t i = 0; i < num_params; ++i) {
-      reader_.ReadUInt();
+    for (intptr_t i = function.NumImplicitParameters();
+         i < function.NumParameters(); ++i) {
+      const intptr_t flags = reader_.ReadUInt();
+      if ((flags & Parameter::kIsRequiredFlag) != 0) {
+        function.SetIsRequiredAt(i);
+      }
     }
   }
+  function.TruncateUnusedParameterFlags();
   if (has_forwarding_stub_target) {
     reader_.ReadUInt();
   }
@@ -338,9 +343,8 @@
   return -1;
 }
 
-RawArray* BytecodeReaderHelper::CreateForwarderChecks(
-    const Function& function) {
-  ASSERT(function.kind() != RawFunction::kDynamicInvocationForwarder);
+ArrayPtr BytecodeReaderHelper::CreateForwarderChecks(const Function& function) {
+  ASSERT(function.kind() != FunctionLayout::kDynamicInvocationForwarder);
   ASSERT(function.is_declared_in_bytecode());
 
   TypeArguments& default_args = TypeArguments::Handle(Z);
@@ -457,13 +461,14 @@
   const int kIsSyncStarFlag = 1 << 6;
   const int kIsDebuggableFlag = 1 << 7;
   const int kHasAttributesFlag = 1 << 8;
+  const int kHasParameterFlagsFlag = 1 << 9;
 
   const intptr_t flags = reader_.ReadUInt();
 
   Object& parent = Object::Handle(Z, ReadObject());
   if (!parent.IsFunction()) {
     ASSERT(parent.IsField());
-    ASSERT(function.kind() == RawFunction::kFieldInitializer);
+    ASSERT(function.kind() == FunctionLayout::kFieldInitializer);
     // Closure in a static field initializer, so use current function as parent.
     parent = function.raw();
   }
@@ -485,13 +490,13 @@
   closure.set_end_token_pos(end_position);
 
   if ((flags & kIsSyncStarFlag) != 0) {
-    closure.set_modifier(RawFunction::kSyncGen);
+    closure.set_modifier(FunctionLayout::kSyncGen);
   } else if ((flags & kIsAsyncFlag) != 0) {
-    closure.set_modifier(RawFunction::kAsync);
+    closure.set_modifier(FunctionLayout::kAsync);
     closure.set_is_inlinable(!FLAG_causal_async_stacks &&
                              !FLAG_lazy_async_stacks);
   } else if ((flags & kIsAsyncStarFlag) != 0) {
-    closure.set_modifier(RawFunction::kAsyncGen);
+    closure.set_modifier(FunctionLayout::kAsyncGen);
     closure.set_is_inlinable(!FLAG_causal_async_stacks &&
                              !FLAG_lazy_async_stacks);
   }
@@ -503,12 +508,12 @@
   closures_->SetAt(closureIndex, closure);
 
   Type& signature_type = Type::Handle(
-      Z, ReadFunctionSignature(closure,
-                               (flags & kHasOptionalPositionalParamsFlag) != 0,
-                               (flags & kHasOptionalNamedParamsFlag) != 0,
-                               (flags & kHasTypeParamsFlag) != 0,
-                               /* has_positional_param_names = */ true,
-                               Nullability::kNonNullable));
+      Z, ReadFunctionSignature(
+             closure, (flags & kHasOptionalPositionalParamsFlag) != 0,
+             (flags & kHasOptionalNamedParamsFlag) != 0,
+             (flags & kHasTypeParamsFlag) != 0,
+             /* has_positional_param_names = */ true,
+             (flags & kHasParameterFlagsFlag) != 0, Nullability::kNonNullable));
 
   closure.SetSignatureType(signature_type);
 
@@ -548,12 +553,13 @@
   return false;
 }
 
-RawType* BytecodeReaderHelper::ReadFunctionSignature(
+TypePtr BytecodeReaderHelper::ReadFunctionSignature(
     const Function& func,
     bool has_optional_positional_params,
     bool has_optional_named_params,
     bool has_type_params,
     bool has_positional_param_names,
+    bool has_parameter_flags,
     Nullability nullability) {
   FunctionTypeScope function_type_scope(this);
 
@@ -575,8 +581,9 @@
   const Array& parameter_types =
       Array::Handle(Z, Array::New(num_params, Heap::kOld));
   func.set_parameter_types(parameter_types);
-  const Array& parameter_names =
-      Array::Handle(Z, Array::New(num_params, Heap::kOld));
+  const Array& parameter_names = Array::Handle(
+      Z, Array::New(Function::NameArrayLengthIncludingFlags(num_params),
+                    Heap::kOld));
   func.set_parameter_names(parameter_names);
 
   intptr_t i = 0;
@@ -597,6 +604,16 @@
     type ^= ReadObject();
     parameter_types.SetAt(i, type);
   }
+  if (has_parameter_flags) {
+    intptr_t num_flags = reader_.ReadUInt();
+    for (intptr_t i = 0; i < num_flags; ++i) {
+      intptr_t flag = reader_.ReadUInt();
+      if ((flag & Parameter::kIsRequiredFlag) != 0) {
+        func.SetIsRequiredAt(kImplicitClosureParam + i);
+      }
+    }
+  }
+  func.TruncateUnusedParameterFlags();
 
   type ^= ReadObject();
   func.set_result_type(type);
@@ -937,7 +954,7 @@
   return obj_count - 1;
 }
 
-RawBytecode* BytecodeReaderHelper::ReadBytecode(const ObjectPool& pool) {
+BytecodePtr BytecodeReaderHelper::ReadBytecode(const ObjectPool& pool) {
 #if defined(SUPPORT_TIMELINE)
   TIMELINE_DURATION(Thread::Current(), CompilerVerbose,
                     "BytecodeReaderHelper::ReadBytecode");
@@ -998,14 +1015,14 @@
         handler_type ^= pool.ObjectAt(type_index);
         handler_types.SetAt(i, handler_type);
       }
-      pc_descriptors_list->AddDescriptor(RawPcDescriptors::kOther, start_pc,
-                                         DeoptId::kNone,
-                                         TokenPosition::kNoSource, try_index,
-                                         RawPcDescriptors::kInvalidYieldIndex);
-      pc_descriptors_list->AddDescriptor(RawPcDescriptors::kOther, end_pc,
-                                         DeoptId::kNone,
-                                         TokenPosition::kNoSource, try_index,
-                                         RawPcDescriptors::kInvalidYieldIndex);
+      pc_descriptors_list->AddDescriptor(
+          PcDescriptorsLayout::kOther, start_pc, DeoptId::kNone,
+          TokenPosition::kNoSource, try_index,
+          PcDescriptorsLayout::kInvalidYieldIndex);
+      pc_descriptors_list->AddDescriptor(
+          PcDescriptorsLayout::kOther, end_pc, DeoptId::kNone,
+          TokenPosition::kNoSource, try_index,
+          PcDescriptorsLayout::kInvalidYieldIndex);
 
       // The exception handler keeps a zone handle of the types array, rather
       // than a raw pointer. Do not share the handle across iterations to avoid
@@ -1049,8 +1066,8 @@
       bytecode_component_->GetLocalVariablesOffset() + offset);
 }
 
-RawTypedData* BytecodeReaderHelper::NativeEntry(const Function& function,
-                                                const String& external_name) {
+TypedDataPtr BytecodeReaderHelper::NativeEntry(const Function& function,
+                                               const String& external_name) {
   MethodRecognizer::Kind kind = function.recognized_kind();
   // This list of recognized methods must be kept in sync with the list of
   // methods handled specially by the NativeCall bytecode in the interpreter.
@@ -1128,7 +1145,7 @@
   return NativeEntryData::New(kind, trampoline, native_function, argc_tag);
 }
 
-RawArray* BytecodeReaderHelper::ReadBytecodeComponent(intptr_t md_offset) {
+ArrayPtr BytecodeReaderHelper::ReadBytecodeComponent(intptr_t md_offset) {
   ASSERT(Thread::Current()->IsMutatorThread());
 
   AlternativeReadingScope alt(&reader_, md_offset);
@@ -1261,14 +1278,14 @@
   }
 }
 
-RawObject* BytecodeReaderHelper::ReadObject() {
+ObjectPtr BytecodeReaderHelper::ReadObject() {
   uint32_t header = reader_.ReadUInt();
   if ((header & kReferenceBit) != 0) {
     intptr_t index = header >> kIndexShift;
     if (index == 0) {
       return Object::null();
     }
-    RawObject* obj = bytecode_component_->GetObject(index);
+    ObjectPtr obj = bytecode_component_->GetObject(index);
     if (obj->IsHeapObject()) {
       return obj;
     }
@@ -1292,8 +1309,8 @@
   return ReadObjectContents(header);
 }
 
-RawString* BytecodeReaderHelper::ConstructorName(const Class& cls,
-                                                 const String& name) {
+StringPtr BytecodeReaderHelper::ConstructorName(const Class& cls,
+                                                const String& name) {
   GrowableHandlePtrArray<const String> pieces(Z, 3);
   pieces.Add(String::Handle(Z, cls.Name()));
   pieces.Add(Symbols::Dot());
@@ -1301,7 +1318,7 @@
   return Symbols::FromConcatAll(thread_, pieces);
 }
 
-RawObject* BytecodeReaderHelper::ReadObjectContents(uint32_t header) {
+ObjectPtr BytecodeReaderHelper::ReadObjectContents(uint32_t header) {
   ASSERT(((header & kReferenceBit) == 0));
 
   // Must be in sync with enum ObjectKind in
@@ -1352,7 +1369,7 @@
       break;
     case kLibrary: {
       String& uri = String::CheckedHandle(Z, ReadObject());
-      RawLibrary* library = Library::LookupLibrary(thread_, uri);
+      LibraryPtr library = Library::LookupLibrary(thread_, uri);
       if (library == Library::null()) {
         // We do not register expression evaluation libraries with the VM:
         // The expression evaluation functions should be GC-able as soon as
@@ -1378,13 +1395,13 @@
       const String& class_name = String::CheckedHandle(Z, ReadObject());
       if (class_name.raw() == Symbols::Empty().raw()) {
         NoSafepointScope no_safepoint_scope(thread_);
-        RawClass* cls = library.toplevel_class();
+        ClassPtr cls = library.toplevel_class();
         if (cls == Class::null()) {
           FATAL1("Unable to find toplevel class %s", library.ToCString());
         }
         return cls;
       }
-      RawClass* cls = library.LookupLocalClass(class_name);
+      ClassPtr cls = library.LookupLocalClass(class_name);
       if (cls == Class::null()) {
         if (IsExpressionEvaluationLibrary(library)) {
           return H.GetExpressionEvaluationRealClass();
@@ -1407,7 +1424,7 @@
       const Class& cls = Class::CheckedHandle(Z, ReadObject());
       String& name = String::CheckedHandle(Z, ReadObject());
       if ((flags & kFlagIsField) != 0) {
-        RawField* field = cls.LookupField(name);
+        FieldPtr field = cls.LookupField(name);
         if (field == Field::null()) {
 #if !defined(PRODUCT)
           ASSERT(Isolate::Current()->HasAttemptedReload());
@@ -1430,7 +1447,7 @@
             cls.raw() == scoped_function_class_.raw()) {
           return scoped_function_.raw();
         }
-        RawFunction* function = cls.LookupFunction(name);
+        FunctionPtr function = cls.LookupFunction(name);
         if (function == Function::null()) {
           // When requesting a getter, also return method extractors.
           if (Field::IsGetterName(name)) {
@@ -1538,7 +1555,7 @@
   return Object::null();
 }
 
-RawObject* BytecodeReaderHelper::ReadConstObject(intptr_t tag) {
+ObjectPtr BytecodeReaderHelper::ReadConstObject(intptr_t tag) {
   // Must be in sync with enum ConstTag in
   // pkg/vm/lib/bytecode/object_table.dart.
   enum ConstTag {
@@ -1651,8 +1668,8 @@
   return Object::null();
 }
 
-RawObject* BytecodeReaderHelper::ReadType(intptr_t tag,
-                                          Nullability nullability) {
+ObjectPtr BytecodeReaderHelper::ReadType(intptr_t tag,
+                                         Nullability nullability) {
   // Must be in sync with enum TypeTag in
   // pkg/vm/lib/bytecode/object_table.dart.
   enum TypeTag {
@@ -1683,7 +1700,8 @@
     case kVoid:
       return AbstractType::void_type().raw();
     case kNever:
-      return AbstractType::never_type().ToNullability(nullability, Heap::kOld);
+      return Type::Handle(Z, Type::NeverType())
+          .ToNullability(nullability, Heap::kOld);
     case kSimpleType: {
       const Class& cls = Class::CheckedHandle(Z, ReadObject());
       if (!cls.is_declaration_loaded()) {
@@ -1800,7 +1818,8 @@
           signature_function, (flags & kFlagHasOptionalPositionalParams) != 0,
           (flags & kFlagHasOptionalNamedParams) != 0,
           (flags & kFlagHasTypeParams) != 0,
-          /* has_positional_param_names = */ false, nullability);
+          /* has_positional_param_names = */ false,
+          /* has_parameter_flags */ false, nullability);
     }
     default:
       UNREACHABLE();
@@ -1808,7 +1827,7 @@
   return Object::null();
 }
 
-RawString* BytecodeReaderHelper::ReadString(bool is_canonical) {
+StringPtr BytecodeReaderHelper::ReadString(bool is_canonical) {
   const int kFlagTwoByteString = 1;
   const int kHeaderFields = 2;
   const int kUInt32Size = 4;
@@ -1858,8 +1877,8 @@
   }
 }
 
-RawScript* BytecodeReaderHelper::ReadSourceFile(const String& uri,
-                                                intptr_t offset) {
+ScriptPtr BytecodeReaderHelper::ReadSourceFile(const String& uri,
+                                               intptr_t offset) {
   // SourceFile flags, must be in sync with SourceFile constants in
   // pkg/vm/lib/bytecode/declarations.dart.
   const int kHasLineStartsFlag = 1 << 0;
@@ -1901,7 +1920,7 @@
   return script.raw();
 }
 
-RawTypeArguments* BytecodeReaderHelper::ReadTypeArguments() {
+TypeArgumentsPtr BytecodeReaderHelper::ReadTypeArguments() {
   const bool is_recursive = reading_type_arguments_of_recursive_type_;
   reading_type_arguments_of_recursive_type_ = false;
   const intptr_t length = reader_.ReadUInt();
@@ -2088,8 +2107,8 @@
     if ((flags & kHasGetterFlag) != 0) {
       name ^= ReadObject();
       function = Function::New(name,
-                               is_static ? RawFunction::kImplicitStaticGetter
-                                         : RawFunction::kImplicitGetter,
+                               is_static ? FunctionLayout::kImplicitStaticGetter
+                                         : FunctionLayout::kImplicitGetter,
                                is_static, is_const,
                                false,  // is_abstract
                                false,  // is_external
@@ -2112,7 +2131,7 @@
       ASSERT(is_late || ((!is_static) && (!is_final)));
       ASSERT(!is_const);
       name ^= ReadObject();
-      function = Function::New(name, RawFunction::kImplicitSetter, is_static,
+      function = Function::New(name, FunctionLayout::kImplicitSetter, is_static,
                                false,  // is_const
                                false,  // is_abstract
                                false,  // is_external
@@ -2181,8 +2200,8 @@
   }
 }
 
-RawPatchClass* BytecodeReaderHelper::GetPatchClass(const Class& cls,
-                                                   const Script& script) {
+PatchClassPtr BytecodeReaderHelper::GetPatchClass(const Class& cls,
+                                                  const Script& script) {
   if (patch_class_ != nullptr && patch_class_->patched_class() == cls.raw() &&
       patch_class_->script() == script.raw()) {
     return patch_class_->raw();
@@ -2266,13 +2285,13 @@
       end_position = reader_.ReadPosition();
     }
 
-    RawFunction::Kind kind = RawFunction::kRegularFunction;
+    FunctionLayout::Kind kind = FunctionLayout::kRegularFunction;
     if ((flags & kIsGetterFlag) != 0) {
-      kind = RawFunction::kGetterFunction;
+      kind = FunctionLayout::kGetterFunction;
     } else if ((flags & kIsSetterFlag) != 0) {
-      kind = RawFunction::kSetterFunction;
+      kind = FunctionLayout::kSetterFunction;
     } else if ((flags & (kIsConstructorFlag | kIsFactoryFlag)) != 0) {
-      kind = RawFunction::kConstructor;
+      kind = FunctionLayout::kConstructor;
       name = ConstructorName(cls, name);
     }
 
@@ -2307,17 +2326,17 @@
     }
 
     if ((flags & kIsSyncStarFlag) != 0) {
-      function.set_modifier(RawFunction::kSyncGen);
+      function.set_modifier(FunctionLayout::kSyncGen);
       function.set_is_visible(!FLAG_causal_async_stacks &&
                               !FLAG_lazy_async_stacks);
     } else if ((flags & kIsAsyncFlag) != 0) {
-      function.set_modifier(RawFunction::kAsync);
+      function.set_modifier(FunctionLayout::kAsync);
       function.set_is_inlinable(!FLAG_causal_async_stacks &&
                                 !FLAG_lazy_async_stacks);
       function.set_is_visible(!FLAG_causal_async_stacks &&
                               !FLAG_lazy_async_stacks);
     } else if ((flags & kIsAsyncStarFlag) != 0) {
-      function.set_modifier(RawFunction::kAsyncGen);
+      function.set_modifier(FunctionLayout::kAsyncGen);
       function.set_is_inlinable(!FLAG_causal_async_stacks &&
                                 !FLAG_lazy_async_stacks);
       function.set_is_visible(!FLAG_causal_async_stacks &&
@@ -2345,7 +2364,8 @@
     parameter_types = Array::New(num_params, Heap::kOld);
     function.set_parameter_types(parameter_types);
 
-    parameter_names = Array::New(num_params, Heap::kOld);
+    parameter_names = Array::New(
+        Function::NameArrayLengthIncludingFlags(num_params), Heap::kOld);
     function.set_parameter_names(parameter_names);
 
     intptr_t param_index = 0;
@@ -2822,7 +2842,7 @@
   }
 }
 
-RawObject* BytecodeReaderHelper::BuildParameterDescriptor(
+ObjectPtr BytecodeReaderHelper::BuildParameterDescriptor(
     const Function& function) {
   ASSERT(function.is_declared_in_bytecode());
 
@@ -2947,20 +2967,20 @@
     const Function& function) {
   // Handle function kinds which don't have a user-defined body first.
   switch (function.kind()) {
-    case RawFunction::kImplicitClosureFunction:
+    case FunctionLayout::kImplicitClosureFunction:
       ParseForwarderFunction(parsed_function, function,
                              Function::Handle(Z, function.parent_function()));
       return;
-    case RawFunction::kDynamicInvocationForwarder:
+    case FunctionLayout::kDynamicInvocationForwarder:
       ParseForwarderFunction(parsed_function, function,
                              Function::Handle(Z, function.ForwardingTarget()));
       return;
-    case RawFunction::kImplicitGetter:
-    case RawFunction::kImplicitSetter:
-    case RawFunction::kMethodExtractor:
+    case FunctionLayout::kImplicitGetter:
+    case FunctionLayout::kImplicitSetter:
+    case FunctionLayout::kMethodExtractor:
       BytecodeScopeBuilder(parsed_function).BuildScopes();
       return;
-    case RawFunction::kImplicitStaticGetter: {
+    case FunctionLayout::kImplicitStaticGetter: {
       if (IsStaticFieldGetterGeneratedAsInitializer(function, Z)) {
         break;
       } else {
@@ -2968,18 +2988,18 @@
         return;
       }
     }
-    case RawFunction::kRegularFunction:
-    case RawFunction::kGetterFunction:
-    case RawFunction::kSetterFunction:
-    case RawFunction::kClosureFunction:
-    case RawFunction::kConstructor:
-    case RawFunction::kFieldInitializer:
+    case FunctionLayout::kRegularFunction:
+    case FunctionLayout::kGetterFunction:
+    case FunctionLayout::kSetterFunction:
+    case FunctionLayout::kClosureFunction:
+    case FunctionLayout::kConstructor:
+    case FunctionLayout::kFieldInitializer:
       break;
-    case RawFunction::kNoSuchMethodDispatcher:
-    case RawFunction::kInvokeFieldDispatcher:
-    case RawFunction::kSignatureFunction:
-    case RawFunction::kIrregexpFunction:
-    case RawFunction::kFfiTrampoline:
+    case FunctionLayout::kNoSuchMethodDispatcher:
+    case FunctionLayout::kInvokeFieldDispatcher:
+    case FunctionLayout::kSignatureFunction:
+    case FunctionLayout::kIrregexpFunction:
+    case FunctionLayout::kFfiTrampoline:
       UNREACHABLE();
       break;
   }
@@ -3055,6 +3075,11 @@
       bool is_covariant = (flags & Parameter::kIsCovariantFlag) != 0;
       bool is_generic_covariant_impl =
           (flags & Parameter::kIsGenericCovariantImplFlag) != 0;
+      bool is_required = (flags & Parameter::kIsRequiredFlag) != 0;
+
+      if (is_required) {
+        function.SetIsRequiredAt(num_implicit_params + i);
+      }
 
       LocalVariable* variable =
           parsed_function->ParameterVariable(num_implicit_params + i);
@@ -3146,7 +3171,7 @@
   }
 }
 
-RawLibrary* BytecodeReaderHelper::ReadMain() {
+LibraryPtr BytecodeReaderHelper::ReadMain() {
   return Library::RawCast(ReadObject());
 }
 
@@ -3234,32 +3259,32 @@
   data_.SetAt(kNumFields + index, obj);
 }
 
-RawObject* BytecodeComponentData::GetObject(intptr_t index) const {
+ObjectPtr BytecodeComponentData::GetObject(intptr_t index) const {
   return data_.At(kNumFields + index);
 }
 
-RawArray* BytecodeComponentData::New(Zone* zone,
-                                     intptr_t version,
-                                     intptr_t num_objects,
-                                     intptr_t strings_header_offset,
-                                     intptr_t strings_contents_offset,
-                                     intptr_t object_offsets_offset,
-                                     intptr_t objects_contents_offset,
-                                     intptr_t main_offset,
-                                     intptr_t num_libraries,
-                                     intptr_t library_index_offset,
-                                     intptr_t libraries_offset,
-                                     intptr_t num_classes,
-                                     intptr_t classes_offset,
-                                     intptr_t members_offset,
-                                     intptr_t num_codes,
-                                     intptr_t codes_offset,
-                                     intptr_t source_positions_offset,
-                                     intptr_t source_files_offset,
-                                     intptr_t line_starts_offset,
-                                     intptr_t local_variables_offset,
-                                     intptr_t annotations_offset,
-                                     Heap::Space space) {
+ArrayPtr BytecodeComponentData::New(Zone* zone,
+                                    intptr_t version,
+                                    intptr_t num_objects,
+                                    intptr_t strings_header_offset,
+                                    intptr_t strings_contents_offset,
+                                    intptr_t object_offsets_offset,
+                                    intptr_t objects_contents_offset,
+                                    intptr_t main_offset,
+                                    intptr_t num_libraries,
+                                    intptr_t library_index_offset,
+                                    intptr_t libraries_offset,
+                                    intptr_t num_classes,
+                                    intptr_t classes_offset,
+                                    intptr_t members_offset,
+                                    intptr_t num_codes,
+                                    intptr_t codes_offset,
+                                    intptr_t source_positions_offset,
+                                    intptr_t source_files_offset,
+                                    intptr_t line_starts_offset,
+                                    intptr_t local_variables_offset,
+                                    intptr_t annotations_offset,
+                                    Heap::Space space) {
   const Array& data =
       Array::Handle(zone, Array::New(kNumFields + num_objects, space));
   Smi& smi_handle = Smi::Handle(zone);
@@ -3327,8 +3352,8 @@
   return data.raw();
 }
 
-RawError* BytecodeReader::ReadFunctionBytecode(Thread* thread,
-                                               const Function& function) {
+ErrorPtr BytecodeReader::ReadFunctionBytecode(Thread* thread,
+                                              const Function& function) {
   ASSERT(!FLAG_precompiled_mode);
   ASSERT(!function.HasBytecode());
   ASSERT(thread->sticky_error() == Error::null());
@@ -3356,31 +3381,31 @@
     auto& bytecode = Bytecode::Handle(zone);
 
     switch (function.kind()) {
-      case RawFunction::kImplicitGetter:
+      case FunctionLayout::kImplicitGetter:
         bytecode = Object::implicit_getter_bytecode().raw();
         break;
-      case RawFunction::kImplicitSetter:
+      case FunctionLayout::kImplicitSetter:
         bytecode = Object::implicit_setter_bytecode().raw();
         break;
-      case RawFunction::kImplicitStaticGetter:
+      case FunctionLayout::kImplicitStaticGetter:
         if (!IsStaticFieldGetterGeneratedAsInitializer(function, zone)) {
           bytecode = Object::implicit_static_getter_bytecode().raw();
         }
         break;
-      case RawFunction::kMethodExtractor:
+      case FunctionLayout::kMethodExtractor:
         bytecode = Object::method_extractor_bytecode().raw();
         break;
-      case RawFunction::kInvokeFieldDispatcher:
+      case FunctionLayout::kInvokeFieldDispatcher:
         if (Class::Handle(zone, function.Owner()).id() == kClosureCid) {
           bytecode = Object::invoke_closure_bytecode().raw();
         } else {
           bytecode = Object::invoke_field_bytecode().raw();
         }
         break;
-      case RawFunction::kNoSuchMethodDispatcher:
+      case FunctionLayout::kNoSuchMethodDispatcher:
         bytecode = Object::nsm_dispatcher_bytecode().raw();
         break;
-      case RawFunction::kDynamicInvocationForwarder: {
+      case FunctionLayout::kDynamicInvocationForwarder: {
         const Function& target =
             Function::Handle(zone, function.ForwardingTarget());
         if (!target.HasBytecode()) {
@@ -3451,7 +3476,7 @@
   }
 }
 
-RawObject* BytecodeReader::ReadAnnotation(const Field& annotation_field) {
+ObjectPtr BytecodeReader::ReadAnnotation(const Field& annotation_field) {
   ASSERT(annotation_field.is_declared_in_bytecode());
 
   Thread* thread = Thread::Current();
@@ -3476,8 +3501,8 @@
   return bytecode_reader.ReadObject();
 }
 
-RawArray* BytecodeReader::ReadExtendedAnnotations(const Field& annotation_field,
-                                                  intptr_t count) {
+ArrayPtr BytecodeReader::ReadExtendedAnnotations(const Field& annotation_field,
+                                                 intptr_t count) {
   ASSERT(annotation_field.is_declared_in_bytecode());
 
   Thread* thread = Thread::Current();
@@ -3582,8 +3607,8 @@
   bytecode_reader.ReadMembers(cls, discard_fields);
 }
 
-RawObject* BytecodeReader::GetBytecodeAttribute(const Object& key,
-                                                const String& name) {
+ObjectPtr BytecodeReader::GetBytecodeAttribute(const Object& key,
+                                               const String& name) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const auto* object_store = thread->isolate()->object_store();
@@ -3622,7 +3647,7 @@
 }
 
 #if !defined(PRODUCT)
-RawLocalVarDescriptors* BytecodeReader::ComputeLocalVarDescriptors(
+LocalVarDescriptorsPtr BytecodeReader::ComputeLocalVarDescriptors(
     Zone* zone,
     const Function& function,
     const Bytecode& bytecode) {
@@ -3640,14 +3665,14 @@
     const auto& parent_vars = LocalVarDescriptors::Handle(
         zone, parent_bytecode.GetLocalVarDescriptors());
     for (intptr_t i = 0; i < parent_vars.Length(); ++i) {
-      RawLocalVarDescriptors::VarInfo var_info;
+      LocalVarDescriptorsLayout::VarInfo var_info;
       parent_vars.GetInfo(i, &var_info);
       // Include parent's context variable if variable's scope
       // intersects with the local function range.
       // It is not enough to check if local function is declared within the
       // scope of variable, because in case of async functions closure has
       // the same range as original function.
-      if (var_info.kind() == RawLocalVarDescriptors::kContextVar &&
+      if (var_info.kind() == LocalVarDescriptorsLayout::kContextVar &&
           ((var_info.begin_pos <= function.token_pos() &&
             function.token_pos() <= var_info.end_pos) ||
            (function.token_pos() <= var_info.begin_pos &&
@@ -3672,11 +3697,11 @@
           LocalVarDescriptorsBuilder::VarDesc desc;
           desc.name = &String::Handle(zone, local_vars.Name());
           if (local_vars.IsCaptured()) {
-            desc.info.set_kind(RawLocalVarDescriptors::kContextVar);
+            desc.info.set_kind(LocalVarDescriptorsLayout::kContextVar);
             desc.info.scope_id = context_level;
             desc.info.set_index(local_vars.Index());
           } else {
-            desc.info.set_kind(RawLocalVarDescriptors::kStackVar);
+            desc.info.set_kind(LocalVarDescriptorsLayout::kStackVar);
             desc.info.scope_id = scope_id;
             if (local_vars.Index() < 0) {
               // Parameter
@@ -3696,7 +3721,7 @@
           const intptr_t context_variable_index = -local_vars.Index();
           LocalVarDescriptorsBuilder::VarDesc desc;
           desc.name = &Symbols::CurrentContextVar();
-          desc.info.set_kind(RawLocalVarDescriptors::kSavedCurrentContext);
+          desc.info.set_kind(LocalVarDescriptorsLayout::kSavedCurrentContext);
           desc.info.scope_id = 0;
           desc.info.declaration_pos = TokenPosition::kMinSource;
           desc.info.begin_pos = TokenPosition::kMinSource;
@@ -3714,7 +3739,7 @@
 
 bool IsStaticFieldGetterGeneratedAsInitializer(const Function& function,
                                                Zone* zone) {
-  ASSERT(function.kind() == RawFunction::kImplicitStaticGetter);
+  ASSERT(function.kind() == FunctionLayout::kImplicitStaticGetter);
 
   const auto& field = Field::Handle(zone, function.accessor_field());
   return field.is_declared_in_bytecode() && field.is_const() &&
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.h b/runtime/vm/compiler/frontend/bytecode_reader.h
index 81abc86..ee8444f 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.h
+++ b/runtime/vm/compiler/frontend/bytecode_reader.h
@@ -42,10 +42,10 @@
                                          intptr_t* p_num_classes,
                                          intptr_t* p_num_procedures);
 
-  RawLibrary* GetMainLibrary();
+  LibraryPtr GetMainLibrary();
 
-  RawArray* GetBytecodeComponent();
-  RawArray* ReadBytecodeComponent();
+  ArrayPtr GetBytecodeComponent();
+  ArrayPtr ReadBytecodeComponent();
 
  private:
   ActiveClass* const active_class_;
@@ -64,7 +64,7 @@
 
   void ReadCode(const Function& function, intptr_t code_offset);
 
-  RawArray* CreateForwarderChecks(const Function& function);
+  ArrayPtr CreateForwarderChecks(const Function& function);
 
   void ReadMembers(const Class& cls, bool discard_fields);
 
@@ -81,9 +81,9 @@
   void ParseBytecodeFunction(ParsedFunction* parsed_function,
                              const Function& function);
 
-  RawLibrary* ReadMain();
+  LibraryPtr ReadMain();
 
-  RawArray* ReadBytecodeComponent(intptr_t md_offset);
+  ArrayPtr ReadBytecodeComponent(intptr_t md_offset);
   void ResetObjects();
 
   // Fills in [is_covariant] and [is_generic_covariant_impl] vectors
@@ -98,10 +98,10 @@
 
   // Returns an flattened array of tuples {isFinal, defaultValue, metadata},
   // or an Error.
-  RawObject* BuildParameterDescriptor(const Function& function);
+  ObjectPtr BuildParameterDescriptor(const Function& function);
 
   // Read bytecode PackedObject.
-  RawObject* ReadObject();
+  ObjectPtr ReadObject();
 
  private:
   // These constants should match corresponding constants in class ObjectHandle
@@ -147,6 +147,7 @@
     static const int kIsCovariantFlag = 1 << 0;
     static const int kIsGenericCovariantImplFlag = 1 << 1;
     static const int kIsFinalFlag = 1 << 2;
+    static const int kIsRequiredFlag = 1 << 3;
   };
 
   class FunctionTypeScope : public ValueObject {
@@ -192,12 +193,13 @@
   };
 
   void ReadClosureDeclaration(const Function& function, intptr_t closureIndex);
-  RawType* ReadFunctionSignature(const Function& func,
-                                 bool has_optional_positional_params,
-                                 bool has_optional_named_params,
-                                 bool has_type_params,
-                                 bool has_positional_param_names,
-                                 Nullability nullability);
+  TypePtr ReadFunctionSignature(const Function& func,
+                                bool has_optional_positional_params,
+                                bool has_optional_named_params,
+                                bool has_type_params,
+                                bool has_positional_param_names,
+                                bool has_parameter_flags,
+                                Nullability nullability);
   void ReadTypeParametersDeclaration(const Class& parameterized_class,
                                      const Function& parameterized_function);
 
@@ -208,22 +210,22 @@
                             const ObjectPool& pool,
                             intptr_t start_index);
 
-  RawBytecode* ReadBytecode(const ObjectPool& pool);
+  BytecodePtr ReadBytecode(const ObjectPool& pool);
   void ReadExceptionsTable(const Bytecode& bytecode, bool has_exceptions_table);
   void ReadSourcePositions(const Bytecode& bytecode, bool has_source_positions);
   void ReadLocalVariables(const Bytecode& bytecode, bool has_local_variables);
-  RawTypedData* NativeEntry(const Function& function,
-                            const String& external_name);
-  RawString* ConstructorName(const Class& cls, const String& name);
+  TypedDataPtr NativeEntry(const Function& function,
+                           const String& external_name);
+  StringPtr ConstructorName(const Class& cls, const String& name);
 
-  RawObject* ReadObjectContents(uint32_t header);
-  RawObject* ReadConstObject(intptr_t tag);
-  RawObject* ReadType(intptr_t tag, Nullability nullability);
-  RawString* ReadString(bool is_canonical = true);
-  RawScript* ReadSourceFile(const String& uri, intptr_t offset);
-  RawTypeArguments* ReadTypeArguments();
+  ObjectPtr ReadObjectContents(uint32_t header);
+  ObjectPtr ReadConstObject(intptr_t tag);
+  ObjectPtr ReadType(intptr_t tag, Nullability nullability);
+  StringPtr ReadString(bool is_canonical = true);
+  ScriptPtr ReadSourceFile(const String& uri, intptr_t offset);
+  TypeArgumentsPtr ReadTypeArguments();
   void ReadAttributes(const Object& key);
-  RawPatchClass* GetPatchClass(const Class& cls, const Script& script);
+  PatchClassPtr GetPatchClass(const Class& cls, const Script& script);
   void ParseForwarderFunction(ParsedFunction* parsed_function,
                               const Function& function,
                               const Function& target);
@@ -310,32 +312,32 @@
   intptr_t GetLocalVariablesOffset() const;
   intptr_t GetAnnotationsOffset() const;
   void SetObject(intptr_t index, const Object& obj) const;
-  RawObject* GetObject(intptr_t index) const;
+  ObjectPtr GetObject(intptr_t index) const;
 
   bool IsNull() const { return data_.IsNull(); }
 
-  static RawArray* New(Zone* zone,
-                       intptr_t version,
-                       intptr_t num_objects,
-                       intptr_t strings_header_offset,
-                       intptr_t strings_contents_offset,
-                       intptr_t object_offsets_offset,
-                       intptr_t objects_contents_offset,
-                       intptr_t main_offset,
-                       intptr_t num_libraries,
-                       intptr_t library_index_offset,
-                       intptr_t libraries_offset,
-                       intptr_t num_classes,
-                       intptr_t classes_offset,
-                       intptr_t members_offset,
-                       intptr_t num_codes,
-                       intptr_t codes_offset,
-                       intptr_t source_positions_offset,
-                       intptr_t source_files_offset,
-                       intptr_t line_starts_offset,
-                       intptr_t local_variables_offset,
-                       intptr_t annotations_offset,
-                       Heap::Space space);
+  static ArrayPtr New(Zone* zone,
+                      intptr_t version,
+                      intptr_t num_objects,
+                      intptr_t strings_header_offset,
+                      intptr_t strings_contents_offset,
+                      intptr_t object_offsets_offset,
+                      intptr_t objects_contents_offset,
+                      intptr_t main_offset,
+                      intptr_t num_libraries,
+                      intptr_t library_index_offset,
+                      intptr_t libraries_offset,
+                      intptr_t num_classes,
+                      intptr_t classes_offset,
+                      intptr_t members_offset,
+                      intptr_t num_codes,
+                      intptr_t codes_offset,
+                      intptr_t source_positions_offset,
+                      intptr_t source_files_offset,
+                      intptr_t line_starts_offset,
+                      intptr_t local_variables_offset,
+                      intptr_t annotations_offset,
+                      Heap::Space space);
 
  private:
   Array& data_;
@@ -345,14 +347,14 @@
  public:
   // Reads bytecode for the given function and sets its bytecode field.
   // Returns error (if any), or null.
-  static RawError* ReadFunctionBytecode(Thread* thread,
-                                        const Function& function);
+  static ErrorPtr ReadFunctionBytecode(Thread* thread,
+                                       const Function& function);
 
   // Read annotations for the given annotation field.
-  static RawObject* ReadAnnotation(const Field& annotation_field);
+  static ObjectPtr ReadAnnotation(const Field& annotation_field);
   // Read the |count| annotations following given annotation field.
-  static RawArray* ReadExtendedAnnotations(const Field& annotation_field,
-                                           intptr_t count);
+  static ArrayPtr ReadExtendedAnnotations(const Field& annotation_field,
+                                          intptr_t count);
 
   static void ResetObjectTable(const KernelProgramInfo& info);
 
@@ -366,11 +368,11 @@
   static void FinishClassLoading(const Class& cls);
 
   // Value of attribute [name] of Function/Field [key].
-  static RawObject* GetBytecodeAttribute(const Object& key, const String& name);
+  static ObjectPtr GetBytecodeAttribute(const Object& key, const String& name);
 
 #if !defined(PRODUCT)
   // Compute local variable descriptors for [function] with [bytecode].
-  static RawLocalVarDescriptors* ComputeLocalVarDescriptors(
+  static LocalVarDescriptorsPtr ComputeLocalVarDescriptors(
       Zone* zone,
       const Function& function,
       const Bytecode& bytecode);
@@ -530,11 +532,11 @@
     ASSERT(IsVariableDeclaration() || IsContextVariable());
     return cur_index_;
   }
-  RawString* Name() const {
+  StringPtr Name() const {
     ASSERT(IsVariableDeclaration());
     return String::RawCast(object_pool_.ObjectAt(cur_name_));
   }
-  RawAbstractType* Type() const {
+  AbstractTypePtr Type() const {
     ASSERT(IsVariableDeclaration());
     return AbstractType::RawCast(object_pool_.ObjectAt(cur_type_));
   }
diff --git a/runtime/vm/compiler/frontend/bytecode_scope_builder.cc b/runtime/vm/compiler/frontend/bytecode_scope_builder.cc
index 91acf20..bc1a30b 100644
--- a/runtime/vm/compiler/frontend/bytecode_scope_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_scope_builder.cc
@@ -61,7 +61,7 @@
   parsed_function_->set_scope(scope_);
 
   switch (function.kind()) {
-    case RawFunction::kImplicitClosureFunction: {
+    case FunctionLayout::kImplicitClosureFunction: {
       ASSERT(function.NumImplicitParameters() == 1);
 
       LocalVariable* closure_parameter = MakeVariable(
@@ -76,8 +76,8 @@
       break;
     }
 
-    case RawFunction::kImplicitGetter:
-    case RawFunction::kImplicitSetter: {
+    case FunctionLayout::kImplicitGetter:
+    case FunctionLayout::kImplicitSetter: {
       const bool is_setter = function.IsImplicitSetterFunction();
       const bool is_method = !function.IsStaticFunction();
       const Field& field = Field::Handle(Z, function.accessor_field());
@@ -108,11 +108,11 @@
       }
       break;
     }
-    case RawFunction::kImplicitStaticGetter: {
+    case FunctionLayout::kImplicitStaticGetter: {
       ASSERT(!IsStaticFieldGetterGeneratedAsInitializer(function, Z));
       break;
     }
-    case RawFunction::kDynamicInvocationForwarder: {
+    case FunctionLayout::kDynamicInvocationForwarder: {
       // Create [this] variable.
       MakeReceiverVariable(/* is_parameter = */ true);
 
@@ -122,7 +122,7 @@
       AddParameters(function, LocalVariable::kDoTypeCheck);
       break;
     }
-    case RawFunction::kMethodExtractor: {
+    case FunctionLayout::kMethodExtractor: {
       // Add a receiver parameter.  Though it is captured, we emit code to
       // explicitly copy it to a fixed offset in a freshly-allocated context
       // instead of using the generic code for regular functions.
diff --git a/runtime/vm/compiler/frontend/constant_reader.cc b/runtime/vm/compiler/frontend/constant_reader.cc
index 08fd420..cb0c693 100644
--- a/runtime/vm/compiler/frontend/constant_reader.cc
+++ b/runtime/vm/compiler/frontend/constant_reader.cc
@@ -19,7 +19,7 @@
       script_(helper->script()),
       result_(Instance::Handle(zone_)) {}
 
-RawInstance* ConstantReader::ReadConstantExpression() {
+InstancePtr ConstantReader::ReadConstantExpression() {
   Tag tag = helper_->ReadTag();  // read tag.
   switch (tag) {
     case kConstantExpression:
@@ -44,7 +44,7 @@
   return result_.raw();
 }
 
-RawObject* ConstantReader::ReadAnnotations() {
+ObjectPtr ConstantReader::ReadAnnotations() {
   intptr_t list_length = helper_->ReadListLength();  // read list length.
   const Array& metadata_values =
       Array::Handle(Z, Array::New(list_length, H.allocation_space()));
@@ -57,7 +57,7 @@
   return metadata_values.raw();
 }
 
-RawInstance* ConstantReader::ReadConstant(intptr_t constant_offset) {
+InstancePtr ConstantReader::ReadConstant(intptr_t constant_offset) {
   ASSERT(!H.constants().IsNull());
   ASSERT(!H.constants_table().IsNull());  // raw bytes
 
@@ -100,7 +100,7 @@
   return false;
 }
 
-RawInstance* ConstantReader::ReadConstantInternal(intptr_t constant_offset) {
+InstancePtr 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);
diff --git a/runtime/vm/compiler/frontend/constant_reader.h b/runtime/vm/compiler/frontend/constant_reader.h
index 8e7a519..871b7f0 100644
--- a/runtime/vm/compiler/frontend/constant_reader.h
+++ b/runtime/vm/compiler/frontend/constant_reader.h
@@ -23,8 +23,8 @@
 
   virtual ~ConstantReader() {}
 
-  RawInstance* ReadConstantExpression();
-  RawObject* ReadAnnotations();
+  InstancePtr ReadConstantExpression();
+  ObjectPtr ReadAnnotations();
 
   // Peeks to see if constant at the given offset will evaluate to
   // instance of the given clazz.
@@ -32,10 +32,10 @@
 
   // Reads a constant at the given offset (possibly by recursing
   // into sub-constants).
-  RawInstance* ReadConstant(intptr_t constant_offset);
+  InstancePtr ReadConstant(intptr_t constant_offset);
 
  private:
-  RawInstance* ReadConstantInternal(intptr_t constant_offset);
+  InstancePtr ReadConstantInternal(intptr_t constant_offset);
 
   KernelReaderHelper* helper_;
   Zone* zone_;
@@ -67,12 +67,12 @@
   static uword Hash(const intptr_t key) {
     return HashValue(Smi::Value(KeyAsSmi(key)));
   }
-  static RawObject* NewKey(const intptr_t key) { return KeyAsSmi(key); }
+  static ObjectPtr NewKey(const intptr_t key) { return KeyAsSmi(key); }
 
  private:
   static uword HashValue(intptr_t pos) { return pos % (Smi::kMaxValue - 13); }
 
-  static RawSmi* KeyAsSmi(const intptr_t key) {
+  static SmiPtr KeyAsSmi(const intptr_t key) {
     ASSERT(key >= 0);
     return Smi::New(key);
   }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index fbc70d0..4dcc794 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -54,6 +54,7 @@
     body += Constant(
         Instance::ZoneHandle(Z, constant_reader_.ReadConstantExpression()));
   } else {
+    body += SetupCapturedParameters(parsed_function()->function());
     body += BuildExpression();  // read initializer.
   }
   body += Return(TokenPosition::kNoSource);
@@ -1088,22 +1089,22 @@
     bytecode_metadata_helper_.ParseBytecodeFunction(parsed_function());
 
     switch (function.kind()) {
-      case RawFunction::kImplicitClosureFunction:
+      case FunctionLayout::kImplicitClosureFunction:
         return B->BuildGraphOfImplicitClosureFunction(function);
-      case RawFunction::kImplicitGetter:
-      case RawFunction::kImplicitSetter:
+      case FunctionLayout::kImplicitGetter:
+      case FunctionLayout::kImplicitSetter:
         return B->BuildGraphOfFieldAccessor(function);
-      case RawFunction::kImplicitStaticGetter: {
+      case FunctionLayout::kImplicitStaticGetter: {
         if (IsStaticFieldGetterGeneratedAsInitializer(function, Z)) {
           break;
         }
         return B->BuildGraphOfFieldAccessor(function);
       }
-      case RawFunction::kDynamicInvocationForwarder:
+      case FunctionLayout::kDynamicInvocationForwarder:
         return B->BuildGraphOfDynamicInvocationForwarder(function);
-      case RawFunction::kMethodExtractor:
+      case FunctionLayout::kMethodExtractor:
         return B->BuildGraphOfMethodExtractor(function);
-      case RawFunction::kNoSuchMethodDispatcher:
+      case FunctionLayout::kNoSuchMethodDispatcher:
         return B->BuildGraphOfNoSuchMethodDispatcher(function);
       default:
         break;
@@ -1126,51 +1127,51 @@
   // Certain special functions could have a VM-internal bytecode
   // attached to them.
   ASSERT((!function.HasBytecode()) ||
-         (function.kind() == RawFunction::kImplicitGetter) ||
-         (function.kind() == RawFunction::kImplicitSetter) ||
-         (function.kind() == RawFunction::kImplicitStaticGetter) ||
-         (function.kind() == RawFunction::kMethodExtractor) ||
-         (function.kind() == RawFunction::kInvokeFieldDispatcher) ||
-         (function.kind() == RawFunction::kNoSuchMethodDispatcher));
+         (function.kind() == FunctionLayout::kImplicitGetter) ||
+         (function.kind() == FunctionLayout::kImplicitSetter) ||
+         (function.kind() == FunctionLayout::kImplicitStaticGetter) ||
+         (function.kind() == FunctionLayout::kMethodExtractor) ||
+         (function.kind() == FunctionLayout::kInvokeFieldDispatcher) ||
+         (function.kind() == FunctionLayout::kNoSuchMethodDispatcher));
 
   ParseKernelASTFunction();
 
   switch (function.kind()) {
-    case RawFunction::kRegularFunction:
-    case RawFunction::kGetterFunction:
-    case RawFunction::kSetterFunction:
-    case RawFunction::kClosureFunction:
-    case RawFunction::kConstructor: {
+    case FunctionLayout::kRegularFunction:
+    case FunctionLayout::kGetterFunction:
+    case FunctionLayout::kSetterFunction:
+    case FunctionLayout::kClosureFunction:
+    case FunctionLayout::kConstructor: {
       if (B->IsRecognizedMethodForFlowGraph(function)) {
         return B->BuildGraphOfRecognizedMethod(function);
       }
       return BuildGraphOfFunction(function.IsGenerativeConstructor());
     }
-    case RawFunction::kImplicitGetter:
-    case RawFunction::kImplicitStaticGetter:
-    case RawFunction::kImplicitSetter: {
+    case FunctionLayout::kImplicitGetter:
+    case FunctionLayout::kImplicitStaticGetter:
+    case FunctionLayout::kImplicitSetter: {
       const Field& field = Field::Handle(Z, function.accessor_field());
       if (field.is_const() && field.IsUninitialized()) {
         EvaluateConstFieldValue(field);
       }
       return B->BuildGraphOfFieldAccessor(function);
     }
-    case RawFunction::kFieldInitializer:
+    case FunctionLayout::kFieldInitializer:
       return BuildGraphOfFieldInitializer();
-    case RawFunction::kDynamicInvocationForwarder:
+    case FunctionLayout::kDynamicInvocationForwarder:
       return B->BuildGraphOfDynamicInvocationForwarder(function);
-    case RawFunction::kMethodExtractor:
+    case FunctionLayout::kMethodExtractor:
       return flow_graph_builder_->BuildGraphOfMethodExtractor(function);
-    case RawFunction::kNoSuchMethodDispatcher:
+    case FunctionLayout::kNoSuchMethodDispatcher:
       return flow_graph_builder_->BuildGraphOfNoSuchMethodDispatcher(function);
-    case RawFunction::kInvokeFieldDispatcher:
+    case FunctionLayout::kInvokeFieldDispatcher:
       return flow_graph_builder_->BuildGraphOfInvokeFieldDispatcher(function);
-    case RawFunction::kImplicitClosureFunction:
+    case FunctionLayout::kImplicitClosureFunction:
       return flow_graph_builder_->BuildGraphOfImplicitClosureFunction(function);
-    case RawFunction::kFfiTrampoline:
+    case FunctionLayout::kFfiTrampoline:
       return flow_graph_builder_->BuildGraphOfFfiTrampoline(function);
-    case RawFunction::kSignatureFunction:
-    case RawFunction::kIrregexpFunction:
+    case FunctionLayout::kSignatureFunction:
+    case FunctionLayout::kIrregexpFunction:
       break;
   }
   UNREACHABLE();
@@ -1187,13 +1188,13 @@
 
   // Mark forwarding stubs.
   switch (function.kind()) {
-    case RawFunction::kRegularFunction:
-    case RawFunction::kImplicitClosureFunction:
-    case RawFunction::kGetterFunction:
-    case RawFunction::kSetterFunction:
-    case RawFunction::kClosureFunction:
-    case RawFunction::kConstructor:
-    case RawFunction::kDynamicInvocationForwarder:
+    case FunctionLayout::kRegularFunction:
+    case FunctionLayout::kImplicitClosureFunction:
+    case FunctionLayout::kGetterFunction:
+    case FunctionLayout::kSetterFunction:
+    case FunctionLayout::kClosureFunction:
+    case FunctionLayout::kConstructor:
+    case FunctionLayout::kDynamicInvocationForwarder:
       ReadForwardingStubTarget(function);
       break;
     default:
@@ -1203,34 +1204,34 @@
   set_scopes(parsed_function()->EnsureKernelScopes());
 
   switch (function.kind()) {
-    case RawFunction::kRegularFunction:
-    case RawFunction::kGetterFunction:
-    case RawFunction::kSetterFunction:
-    case RawFunction::kClosureFunction:
-    case RawFunction::kConstructor:
-    case RawFunction::kImplicitClosureFunction:
+    case FunctionLayout::kRegularFunction:
+    case FunctionLayout::kGetterFunction:
+    case FunctionLayout::kSetterFunction:
+    case FunctionLayout::kClosureFunction:
+    case FunctionLayout::kConstructor:
+    case FunctionLayout::kImplicitClosureFunction:
       ReadUntilFunctionNode();
       SetupDefaultParameterValues();
       ReadDefaultFunctionTypeArguments(function);
       break;
-    case RawFunction::kImplicitGetter:
-    case RawFunction::kImplicitStaticGetter:
-    case RawFunction::kImplicitSetter:
-    case RawFunction::kFieldInitializer:
-    case RawFunction::kMethodExtractor:
-    case RawFunction::kNoSuchMethodDispatcher:
-    case RawFunction::kInvokeFieldDispatcher:
-    case RawFunction::kFfiTrampoline:
+    case FunctionLayout::kImplicitGetter:
+    case FunctionLayout::kImplicitStaticGetter:
+    case FunctionLayout::kImplicitSetter:
+    case FunctionLayout::kFieldInitializer:
+    case FunctionLayout::kMethodExtractor:
+    case FunctionLayout::kNoSuchMethodDispatcher:
+    case FunctionLayout::kInvokeFieldDispatcher:
+    case FunctionLayout::kFfiTrampoline:
       break;
-    case RawFunction::kDynamicInvocationForwarder:
+    case FunctionLayout::kDynamicInvocationForwarder:
       if (PeekTag() != kField) {
         ReadUntilFunctionNode();
         SetupDefaultParameterValues();
         ReadDefaultFunctionTypeArguments(function);
       }
       break;
-    case RawFunction::kSignatureFunction:
-    case RawFunction::kIrregexpFunction:
+    case FunctionLayout::kSignatureFunction:
+    case FunctionLayout::kIrregexpFunction:
       UNREACHABLE();
       break;
   }
@@ -1714,16 +1715,23 @@
                                         clear_the_temp);
 }
 
-static void BadArity() {
+static void BadArity(const Script& script,
+                     TokenPosition position,
+                     const String& error_message) {
 #ifndef PRODUCT
   // TODO(https://github.com/dart-lang/sdk/issues/37517): Should emit code to
   // throw a NoSuchMethodError.
-  ASSERT(Isolate::Current()->HasAttemptedReload());
-  Report::LongJump(LanguageError::Handle(LanguageError::New(String::Handle(
-      String::New("Unimplemented handling of static target arity change")))));
-#else
-  UNREACHABLE();
+  // Correct arity is checked at compile time by CFE. However, an isolate reload
+  // after an arity change may lead here.
+  // Using strong mode with a mix of opted in and opted out libraries may
+  // also result in this error undetected by CFE.
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate->HasAttemptedReload() || isolate->null_safety());
+  Report::MessageF(Report::kError, script, position, Report::AtLocation,
+                   "Static call with invalid arguments: %s",
+                   error_message.ToCString());
 #endif
+  UNREACHABLE();
 }
 
 Fragment StreamingFlowGraphBuilder::StaticCall(TokenPosition position,
@@ -1732,7 +1740,7 @@
                                                ICData::RebindRule rebind_rule) {
   String& error_message = String::Handle();
   if (!target.AreValidArgumentCounts(0, argument_count, 0, &error_message)) {
-    BadArity();
+    BadArity(script_, position, error_message);
   }
   return flow_graph_builder_->StaticCall(position, target, argument_count,
                                          rebind_rule);
@@ -1750,7 +1758,7 @@
   String& error_message = String::Handle();
   if (!target.AreValidArguments(type_args_count, argument_count, argument_names,
                                 &error_message)) {
-    BadArity();
+    BadArity(script_, position, error_message);
   }
   return flow_graph_builder_->StaticCall(
       position, target, argument_count, argument_names, rebind_rule,
@@ -3365,7 +3373,8 @@
   instructions +=
       BuildArguments(&argument_names, NULL /* arg count */,
                      NULL /* positional arg count */);  // read arguments.
-  ASSERT(target.AreValidArguments(type_args_len, argument_count, argument_names,
+  ASSERT(!special_case ||
+         target.AreValidArguments(type_args_len, argument_count, argument_names,
                                   NULL));
 
   // Special case identical(x, y) call.
@@ -4497,9 +4506,8 @@
           Z, klass.LookupConstructorAllowPrivate(String::ZoneHandle(
                  Z, Symbols::FromConcatAll(H.thread(), pieces))));
       ASSERT(!constructor.IsNull());
-      const String& url = H.DartString(
-          parsed_function()->function().ToLibNamePrefixedQualifiedCString(),
-          Heap::kOld);
+      const String& url = H.DartSymbolPlain(
+          parsed_function()->function().ToLibNamePrefixedQualifiedCString());
 
       // Create instance of _FallThroughError
       body_fragment += AllocateObject(TokenPosition::kNoSource, klass, 0);
@@ -5096,8 +5104,8 @@
       // NOTE: This is not TokenPosition in the general sense!
       if (!closure_owner_.IsNull()) {
         function = Function::NewClosureFunctionWithKind(
-            RawFunction::kClosureFunction, *name, parsed_function()->function(),
-            position, closure_owner_);
+            FunctionLayout::kClosureFunction, *name,
+            parsed_function()->function(), position, closure_owner_);
       } else {
         function = Function::NewClosureFunction(
             *name, parsed_function()->function(), position);
@@ -5107,14 +5115,14 @@
                                  FunctionNodeHelper::kSync);
       switch (function_node_helper.dart_async_marker_) {
         case FunctionNodeHelper::kSyncStar:
-          function.set_modifier(RawFunction::kSyncGen);
+          function.set_modifier(FunctionLayout::kSyncGen);
           break;
         case FunctionNodeHelper::kAsync:
-          function.set_modifier(RawFunction::kAsync);
+          function.set_modifier(FunctionLayout::kAsync);
           function.set_is_inlinable(!FLAG_causal_async_stacks);
           break;
         case FunctionNodeHelper::kAsyncStar:
-          function.set_modifier(RawFunction::kAsyncGen);
+          function.set_modifier(FunctionLayout::kAsyncGen);
           function.set_is_inlinable(!FLAG_causal_async_stacks);
           break;
         default:
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 3b05a70..fbba4d6 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -161,8 +161,9 @@
   void InlineBailout(const char* reason);
   Fragment DebugStepCheck(TokenPosition position);
   Fragment LoadLocal(LocalVariable* variable);
-  Fragment Return(TokenPosition position,
-                  intptr_t yield_index = RawPcDescriptors::kInvalidYieldIndex);
+  Fragment Return(
+      TokenPosition position,
+      intptr_t yield_index = PcDescriptorsLayout::kInvalidYieldIndex);
   Fragment EvaluateAssertion();
   Fragment RethrowException(TokenPosition position, int catch_try_index);
   Fragment ThrowNoSuchMethodError();
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index ba7804d..63e8987 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -1722,8 +1722,7 @@
   return instruction_cursor;
 }
 
-RawArray* FlowGraphBuilder::GetOptionalParameterNames(
-    const Function& function) {
+ArrayPtr FlowGraphBuilder::GetOptionalParameterNames(const Function& function) {
   if (!function.HasOptionalNamedParameters()) {
     return Array::null();
   }
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 0d0c930..f6f08e5 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -70,7 +70,7 @@
                                  PrologueInfo* prologue_info);
 
   // Return names of optional named parameters of [function].
-  RawArray* GetOptionalParameterNames(const Function& function);
+  ArrayPtr GetOptionalParameterNames(const Function& function);
 
   // Generate fragment which pushes all explicit parameters of [function].
   Fragment PushExplicitParameters(
@@ -142,9 +142,10 @@
   Fragment InitInstanceField(const Field& field);
   Fragment InitStaticField(const Field& field);
   Fragment NativeCall(const String* name, const Function* function);
-  Fragment Return(TokenPosition position,
-                  bool omit_result_type_check = false,
-                  intptr_t yield_index = RawPcDescriptors::kInvalidYieldIndex);
+  Fragment Return(
+      TokenPosition position,
+      bool omit_result_type_check = false,
+      intptr_t yield_index = PcDescriptorsLayout::kInvalidYieldIndex);
   void SetResultTypeForStaticCall(StaticCallInstr* call,
                                   const Function& target,
                                   intptr_t argument_count,
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 7ab661a..ad64458 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -86,7 +86,7 @@
   SetKernelProgramInfo(info);
 }
 
-RawGrowableObjectArray* TranslationHelper::EnsurePotentialPragmaFunctions() {
+GrowableObjectArrayPtr TranslationHelper::EnsurePotentialPragmaFunctions() {
   auto& funcs =
       GrowableObjectArray::Handle(Z, info_.potential_pragma_functions());
   if (funcs.IsNull()) {
@@ -104,7 +104,7 @@
   potential_extension_libraries_->Add(library);
 }
 
-RawGrowableObjectArray* TranslationHelper::GetPotentialExtensionLibraries() {
+GrowableObjectArrayPtr TranslationHelper::GetPotentialExtensionLibraries() {
   if (potential_extension_libraries_ != nullptr) {
     GrowableObjectArray* result = potential_extension_libraries_;
     potential_extension_libraries_ = nullptr;
@@ -337,11 +337,11 @@
   return enclosing;
 }
 
-RawInstance* TranslationHelper::Canonicalize(const Instance& instance) {
+InstancePtr TranslationHelper::Canonicalize(const Instance& instance) {
   if (instance.IsNull()) return instance.raw();
 
   const char* error_str = NULL;
-  RawInstance* result = instance.CheckAndCanonicalize(thread(), &error_str);
+  InstancePtr result = instance.CheckAndCanonicalize(thread(), &error_str);
   if (result == Object::null()) {
     ReportError("Invalid const object %s", error_str);
   }
@@ -533,7 +533,7 @@
   }
 }
 
-RawLibrary* TranslationHelper::LookupLibraryByKernelLibrary(
+LibraryPtr TranslationHelper::LookupLibraryByKernelLibrary(
     NameIndex kernel_library) {
   // We only use the string and don't rely on having any particular parent.
   // This ASSERT is just a sanity check.
@@ -541,7 +541,7 @@
          IsAdministrative(CanonicalNameParent(kernel_library)));
   {
     name_index_handle_ = Smi::New(kernel_library);
-    RawLibrary* raw_lib = info_.LookupLibrary(thread_, name_index_handle_);
+    LibraryPtr raw_lib = info_.LookupLibrary(thread_, name_index_handle_);
     NoSafepointScope no_safepoint_scope(thread_);
     if (raw_lib != Library::null()) {
       return raw_lib;
@@ -558,11 +558,11 @@
   return info_.InsertLibrary(thread_, name_index_handle_, library);
 }
 
-RawClass* TranslationHelper::LookupClassByKernelClass(NameIndex kernel_class) {
+ClassPtr TranslationHelper::LookupClassByKernelClass(NameIndex kernel_class) {
   ASSERT(IsClass(kernel_class));
   {
     name_index_handle_ = Smi::New(kernel_class);
-    RawClass* raw_class = info_.LookupClass(thread_, name_index_handle_);
+    ClassPtr raw_class = info_.LookupClass(thread_, name_index_handle_);
     NoSafepointScope no_safepoint_scope(thread_);
     if (raw_class != Class::null()) {
       return raw_class;
@@ -585,7 +585,7 @@
   return info_.InsertClass(thread_, name_index_handle_, klass);
 }
 
-RawField* TranslationHelper::LookupFieldByKernelField(NameIndex kernel_field) {
+FieldPtr TranslationHelper::LookupFieldByKernelField(NameIndex kernel_field) {
   ASSERT(IsField(kernel_field));
   NameIndex enclosing = EnclosingName(kernel_field);
 
@@ -606,7 +606,7 @@
   return field.raw();
 }
 
-RawFunction* TranslationHelper::LookupStaticMethodByKernelProcedure(
+FunctionPtr TranslationHelper::LookupStaticMethodByKernelProcedure(
     NameIndex procedure) {
   const String& procedure_name = DartProcedureName(procedure);
 
@@ -633,7 +633,7 @@
   }
 }
 
-RawFunction* TranslationHelper::LookupConstructorByKernelConstructor(
+FunctionPtr TranslationHelper::LookupConstructorByKernelConstructor(
     NameIndex constructor) {
   ASSERT(IsConstructor(constructor));
   Class& klass =
@@ -642,7 +642,7 @@
   return LookupConstructorByKernelConstructor(klass, constructor);
 }
 
-RawFunction* TranslationHelper::LookupConstructorByKernelConstructor(
+FunctionPtr TranslationHelper::LookupConstructorByKernelConstructor(
     const Class& owner,
     NameIndex constructor) {
   ASSERT(IsConstructor(constructor));
@@ -652,7 +652,7 @@
   return function.raw();
 }
 
-RawFunction* TranslationHelper::LookupConstructorByKernelConstructor(
+FunctionPtr TranslationHelper::LookupConstructorByKernelConstructor(
     const Class& owner,
     StringIndex constructor_name) {
   GrowableHandlePtrArray<const String> pieces(Z, 3);
@@ -663,14 +663,13 @@
 
   String& new_name =
       String::ZoneHandle(Z, Symbols::FromConcatAll(thread_, pieces));
-  RawFunction* function = owner.LookupConstructorAllowPrivate(new_name);
+  FunctionPtr function = owner.LookupConstructorAllowPrivate(new_name);
   ASSERT(function != Object::null());
   return function;
 }
 
-RawFunction* TranslationHelper::LookupMethodByMember(
-    NameIndex target,
-    const String& method_name) {
+FunctionPtr TranslationHelper::LookupMethodByMember(NameIndex target,
+                                                    const String& method_name) {
   NameIndex kernel_class = EnclosingName(target);
   Class& klass = Class::Handle(Z, LookupClassByKernelClass(kernel_class));
 
@@ -687,12 +686,12 @@
   return function.raw();
 }
 
-RawFunction* TranslationHelper::LookupDynamicFunction(const Class& klass,
-                                                      const String& name) {
+FunctionPtr TranslationHelper::LookupDynamicFunction(const Class& klass,
+                                                     const String& name) {
   // Search the superclass chain for the selector.
   Class& iterate_klass = Class::Handle(Z, klass.raw());
   while (!iterate_klass.IsNull()) {
-    RawFunction* function =
+    FunctionPtr function =
         iterate_klass.LookupDynamicFunctionAllowPrivate(name);
     if (function != Object::null()) {
       return function;
@@ -2726,7 +2725,7 @@
   }
 }
 
-RawTypedData* KernelReaderHelper::GetLineStartsFor(intptr_t index) {
+TypedDataPtr KernelReaderHelper::GetLineStartsFor(intptr_t index) {
   // Line starts are delta encoded. So get the max delta first so that we
   // can store them as tighly as possible.
   AlternativeReadingScope alt(&reader_);
@@ -2885,9 +2884,11 @@
       break;
     case kNeverType: {
       const Nullability nullability = helper_->ReadNullability();
-      result_ = Object::never_type().ToNullability(nullability, Heap::kOld);
-      if (apply_legacy_erasure_ && result_.IsNeverType()) {
+      if (apply_legacy_erasure_) {
         result_ = I->object_store()->null_type();
+      } else {
+        result_ = Type::Handle(Z, I->object_store()->never_type())
+                      .ToNullability(nullability, Heap::kOld);
       }
       break;
     }
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 5aa3f74..e6f25bf 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -73,10 +73,10 @@
 
   KernelProgramInfo& info() { return info_; }
 
-  RawGrowableObjectArray* EnsurePotentialPragmaFunctions();
+  GrowableObjectArrayPtr EnsurePotentialPragmaFunctions();
 
   void AddPotentialExtensionLibrary(const Library& library);
-  RawGrowableObjectArray* GetPotentialExtensionLibraries();
+  GrowableObjectArrayPtr GetPotentialExtensionLibraries();
 
   void SetKernelProgramInfo(const KernelProgramInfo& info);
   const KernelProgramInfo& GetKernelProgramInfo() const { return info_; }
@@ -113,7 +113,7 @@
   // of the enclosing class or library.
   NameIndex EnclosingName(NameIndex name);
 
-  RawInstance* Canonicalize(const Instance& instance);
+  InstancePtr Canonicalize(const Instance& instance);
 
   const String& DartString(const char* content) {
     return DartString(content, allocation_space_);
@@ -159,20 +159,19 @@
   // A subclass overrides these when reading in the Kernel program in order to
   // support recursive type expressions (e.g. for "implements X" ...
   // annotations).
-  virtual RawLibrary* LookupLibraryByKernelLibrary(NameIndex library);
-  virtual RawClass* LookupClassByKernelClass(NameIndex klass);
+  virtual LibraryPtr LookupLibraryByKernelLibrary(NameIndex library);
+  virtual ClassPtr LookupClassByKernelClass(NameIndex klass);
 
-  RawField* LookupFieldByKernelField(NameIndex field);
-  RawFunction* LookupStaticMethodByKernelProcedure(NameIndex procedure);
-  RawFunction* LookupConstructorByKernelConstructor(NameIndex constructor);
-  RawFunction* LookupConstructorByKernelConstructor(const Class& owner,
-                                                    NameIndex constructor);
-  RawFunction* LookupConstructorByKernelConstructor(
+  FieldPtr LookupFieldByKernelField(NameIndex field);
+  FunctionPtr LookupStaticMethodByKernelProcedure(NameIndex procedure);
+  FunctionPtr LookupConstructorByKernelConstructor(NameIndex constructor);
+  FunctionPtr LookupConstructorByKernelConstructor(const Class& owner,
+                                                   NameIndex constructor);
+  FunctionPtr LookupConstructorByKernelConstructor(
       const Class& owner,
       StringIndex constructor_name);
-  RawFunction* LookupMethodByMember(NameIndex target,
-                                    const String& method_name);
-  RawFunction* LookupDynamicFunction(const Class& klass, const String& name);
+  FunctionPtr LookupMethodByMember(NameIndex target, const String& method_name);
+  FunctionPtr LookupDynamicFunction(const Class& klass, const String& name);
 
   Type& GetDeclarationType(const Class& klass);
 
@@ -193,7 +192,7 @@
                    const char* format,
                    ...) PRINTF_ATTRIBUTE(5, 6);
 
-  RawArray* GetBytecodeComponent() const { return info_.bytecode_component(); }
+  ArrayPtr GetBytecodeComponent() const { return info_.bytecode_component(); }
   void SetBytecodeComponent(const Array& bytecode_component) {
     info_.set_bytecode_component(bytecode_component);
   }
@@ -213,7 +212,7 @@
     ASSERT(!real_class.IsNull());
     expression_evaluation_real_class_ = &Class::Handle(zone_, real_class.raw());
   }
-  RawClass* GetExpressionEvaluationRealClass() {
+  ClassPtr GetExpressionEvaluationRealClass() {
     ASSERT(expression_evaluation_real_class_ != nullptr);
     return expression_evaluation_real_class_->raw();
   }
@@ -1228,7 +1227,7 @@
   intptr_t GetOffsetForSourceInfo(intptr_t index);
   String& SourceTableUriFor(intptr_t index);
   const String& GetSourceFor(intptr_t index);
-  RawTypedData* GetLineStartsFor(intptr_t index);
+  TypedDataPtr GetLineStartsFor(intptr_t index);
   String& SourceTableImportUriFor(intptr_t index, uint32_t binaryVersion);
 
   Zone* zone_;
@@ -1286,12 +1285,12 @@
 
   bool MemberIsProcedure() {
     ASSERT(member != NULL);
-    RawFunction::Kind function_kind = member->kind();
-    return function_kind == RawFunction::kRegularFunction ||
-           function_kind == RawFunction::kGetterFunction ||
-           function_kind == RawFunction::kSetterFunction ||
-           function_kind == RawFunction::kMethodExtractor ||
-           function_kind == RawFunction::kDynamicInvocationForwarder ||
+    FunctionLayout::Kind function_kind = member->kind();
+    return function_kind == FunctionLayout::kRegularFunction ||
+           function_kind == FunctionLayout::kGetterFunction ||
+           function_kind == FunctionLayout::kSetterFunction ||
+           function_kind == FunctionLayout::kMethodExtractor ||
+           function_kind == FunctionLayout::kDynamicInvocationForwarder ||
            member->IsFactory();
   }
 
diff --git a/runtime/vm/compiler/frontend/prologue_builder.h b/runtime/vm/compiler/frontend/prologue_builder.h
index 2d2d502..cef094c 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.h
+++ b/runtime/vm/compiler/frontend/prologue_builder.h
@@ -77,7 +77,7 @@
     }
 
     ASSERT(parsed_function_->function().kind() ==
-           RawFunction::kNoSuchMethodDispatcher);
+           FunctionLayout::kNoSuchMethodDispatcher);
     return Instance::null_instance();
   }
 
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 4663bd8..78903ef 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -146,12 +146,12 @@
           function.kernel_offset());
 
   switch (function.kind()) {
-    case RawFunction::kClosureFunction:
-    case RawFunction::kImplicitClosureFunction:
-    case RawFunction::kRegularFunction:
-    case RawFunction::kGetterFunction:
-    case RawFunction::kSetterFunction:
-    case RawFunction::kConstructor: {
+    case FunctionLayout::kClosureFunction:
+    case FunctionLayout::kImplicitClosureFunction:
+    case FunctionLayout::kRegularFunction:
+    case FunctionLayout::kGetterFunction:
+    case FunctionLayout::kSetterFunction:
+    case FunctionLayout::kConstructor: {
       const Tag tag = helper_.PeekTag();
       helper_.ReadUntilFunctionNode();
       function_node_helper.ReadUntilExcluding(
@@ -271,8 +271,8 @@
       }
       break;
     }
-    case RawFunction::kImplicitGetter:
-    case RawFunction::kImplicitSetter: {
+    case FunctionLayout::kImplicitGetter:
+    case FunctionLayout::kImplicitSetter: {
       ASSERT(helper_.PeekTag() == kField);
       const bool is_setter = function.IsImplicitSetterFunction();
       const bool is_method = !function.IsStaticFunction();
@@ -318,7 +318,7 @@
       }
       break;
     }
-    case RawFunction::kImplicitStaticGetter: {
+    case FunctionLayout::kImplicitStaticGetter: {
       ASSERT(helper_.PeekTag() == kField);
       ASSERT(function.IsStaticFunction());
       // In addition to static field initializers, scopes/local variables
@@ -329,7 +329,7 @@
       }
       break;
     }
-    case RawFunction::kFieldInitializer: {
+    case FunctionLayout::kFieldInitializer: {
       ASSERT(helper_.PeekTag() == kField);
       if (!function.is_static()) {
         Class& klass = Class::Handle(Z, function.Owner());
@@ -343,7 +343,7 @@
       VisitNode();
       break;
     }
-    case RawFunction::kDynamicInvocationForwarder: {
+    case FunctionLayout::kDynamicInvocationForwarder: {
       if (helper_.PeekTag() == kField) {
 #ifdef DEBUG
         String& name = String::Handle(Z, function.name());
@@ -384,7 +384,7 @@
       }
       break;
     }
-    case RawFunction::kMethodExtractor: {
+    case FunctionLayout::kMethodExtractor: {
       // Add a receiver parameter.  Though it is captured, we emit code to
       // explicitly copy it to a fixed offset in a freshly-allocated context
       // instead of using the generic code for regular functions.
@@ -398,9 +398,9 @@
       parsed_function_->set_receiver_var(variable);
       break;
     }
-    case RawFunction::kNoSuchMethodDispatcher:
-    case RawFunction::kInvokeFieldDispatcher:
-    case RawFunction::kFfiTrampoline:
+    case FunctionLayout::kNoSuchMethodDispatcher:
+    case FunctionLayout::kInvokeFieldDispatcher:
+    case FunctionLayout::kFfiTrampoline:
       for (intptr_t i = 0; i < function.NumParameters(); ++i) {
         LocalVariable* variable = MakeVariable(
             TokenPosition::kNoSource, TokenPosition::kNoSource,
@@ -423,8 +423,8 @@
         --depth_.catch_;
       }
       break;
-    case RawFunction::kSignatureFunction:
-    case RawFunction::kIrregexpFunction:
+    case FunctionLayout::kSignatureFunction:
+    case FunctionLayout::kIrregexpFunction:
       UNREACHABLE();
   }
   if (needs_expr_temp_) {
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index c8a3bf3..1364dd0 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -323,7 +323,7 @@
         osr_id_(osr_id),
         thread_(Thread::Current()) {}
 
-  RawCode* Compile(CompilationPipeline* pipeline);
+  CodePtr Compile(CompilationPipeline* pipeline);
 
  private:
   ParsedFunction* parsed_function() const { return parsed_function_; }
@@ -331,9 +331,9 @@
   intptr_t osr_id() const { return osr_id_; }
   Thread* thread() const { return thread_; }
   Isolate* isolate() const { return thread_->isolate(); }
-  RawCode* FinalizeCompilation(compiler::Assembler* assembler,
-                               FlowGraphCompiler* graph_compiler,
-                               FlowGraph* flow_graph);
+  CodePtr FinalizeCompilation(compiler::Assembler* assembler,
+                              FlowGraphCompiler* graph_compiler,
+                              FlowGraph* flow_graph);
   void CheckIfBackgroundCompilerIsBeingStopped(bool optimizing_compiler);
 
   ParsedFunction* parsed_function_;
@@ -344,7 +344,7 @@
   DISALLOW_COPY_AND_ASSIGN(CompileParsedFunctionHelper);
 };
 
-RawCode* CompileParsedFunctionHelper::FinalizeCompilation(
+CodePtr CompileParsedFunctionHelper::FinalizeCompilation(
     compiler::Assembler* assembler,
     FlowGraphCompiler* graph_compiler,
     FlowGraph* flow_graph) {
@@ -502,7 +502,7 @@
 // Return null if bailed out.
 // If optimized_result_code is not NULL then it is caller's responsibility
 // to install code.
-RawCode* CompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
+CodePtr CompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
   ASSERT(!FLAG_precompiled_mode);
   const Function& function = parsed_function()->function();
   if (optimized() && !function.IsOptimizable()) {
@@ -712,10 +712,10 @@
   return result->raw();
 }
 
-static RawObject* CompileFunctionHelper(CompilationPipeline* pipeline,
-                                        const Function& function,
-                                        volatile bool optimized,
-                                        intptr_t osr_id) {
+static ObjectPtr CompileFunctionHelper(CompilationPipeline* pipeline,
+                                       const Function& function,
+                                       volatile bool optimized,
+                                       intptr_t osr_id) {
   ASSERT(!FLAG_precompiled_mode);
   ASSERT(!optimized || function.WasCompiled() || function.ForceOptimize());
   ASSERT(function.is_background_optimizable() ||
@@ -860,7 +860,7 @@
   return Object::null();
 }
 
-RawObject* Compiler::CompileFunction(Thread* thread, const Function& function) {
+ObjectPtr Compiler::CompileFunction(Thread* thread, const Function& function) {
 #if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
   RELEASE_ASSERT(!FLAG_precompiled_mode);
 #endif
@@ -890,8 +890,8 @@
   return CompileFunctionHelper(pipeline, function, optimized, kNoOSRDeoptId);
 }
 
-RawError* Compiler::EnsureUnoptimizedCode(Thread* thread,
-                                          const Function& function) {
+ErrorPtr Compiler::EnsureUnoptimizedCode(Thread* thread,
+                                         const Function& function) {
   ASSERT(!function.ForceOptimize());
   if (function.unoptimized_code() != Object::null()) {
     return Error::null();
@@ -922,9 +922,9 @@
   return Error::null();
 }
 
-RawObject* Compiler::CompileOptimizedFunction(Thread* thread,
-                                              const Function& function,
-                                              intptr_t osr_id) {
+ObjectPtr Compiler::CompileOptimizedFunction(Thread* thread,
+                                             const Function& function,
+                                             intptr_t osr_id) {
   VMTagScope tagScope(thread, VMTag::kCompileOptimizedTagId);
 #if defined(SUPPORT_TIMELINE)
   const char* event_name;
@@ -998,7 +998,7 @@
   }
 }
 
-RawError* Compiler::CompileAllFunctions(const Class& cls) {
+ErrorPtr Compiler::CompileAllFunctions(const Class& cls) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Object& result = Object::Handle(zone);
@@ -1020,7 +1020,7 @@
   return Error::null();
 }
 
-RawError* Compiler::ReadAllBytecode(const Class& cls) {
+ErrorPtr Compiler::ReadAllBytecode(const Class& cls) {
   Thread* thread = Thread::Current();
   ASSERT(thread->IsMutatorThread());
   Zone* zone = thread->zone();
@@ -1034,7 +1034,7 @@
     ASSERT(!func.IsNull());
     if (func.IsBytecodeAllowed(zone) && !func.HasBytecode() &&
         !func.HasCode()) {
-      RawError* error =
+      ErrorPtr error =
           kernel::BytecodeReader::ReadFunctionBytecode(thread, func);
       if (error != Error::null()) {
         return error;
@@ -1075,19 +1075,17 @@
     function_ = Function::null();
   }
 
-  RawFunction* Function() const { return function_; }
+  FunctionPtr Function() const { return function_; }
 
   void set_next(QueueElement* elem) { next_ = elem; }
   QueueElement* next() const { return next_; }
 
-  RawObject* function() const { return function_; }
-  RawObject** function_ptr() {
-    return reinterpret_cast<RawObject**>(&function_);
-  }
+  ObjectPtr function() const { return function_; }
+  ObjectPtr* function_ptr() { return reinterpret_cast<ObjectPtr*>(&function_); }
 
  private:
   QueueElement* next_;
-  RawFunction* function_;
+  FunctionPtr function_;
 
   DISALLOW_COPY_AND_ASSIGN(QueueElement);
 };
@@ -1126,7 +1124,7 @@
 
   QueueElement* Peek() const { return first_; }
 
-  RawFunction* PeekFunction() const {
+  FunctionPtr PeekFunction() const {
     QueueElement* e = Peek();
     if (e == NULL) {
       return Function::null();
@@ -1366,20 +1364,20 @@
   return false;
 }
 
-RawObject* Compiler::CompileFunction(Thread* thread, const Function& function) {
+ObjectPtr Compiler::CompileFunction(Thread* thread, const Function& function) {
   FATAL1("Attempt to compile function %s", function.ToCString());
   return Error::null();
 }
 
-RawError* Compiler::EnsureUnoptimizedCode(Thread* thread,
-                                          const Function& function) {
+ErrorPtr Compiler::EnsureUnoptimizedCode(Thread* thread,
+                                         const Function& function) {
   FATAL1("Attempt to compile function %s", function.ToCString());
   return Error::null();
 }
 
-RawObject* Compiler::CompileOptimizedFunction(Thread* thread,
-                                              const Function& function,
-                                              intptr_t osr_id) {
+ObjectPtr Compiler::CompileOptimizedFunction(Thread* thread,
+                                             const Function& function,
+                                             intptr_t osr_id) {
   FATAL1("Attempt to compile function %s", function.ToCString());
   return Error::null();
 }
@@ -1388,7 +1386,7 @@
   UNREACHABLE();
 }
 
-RawError* Compiler::CompileAllFunctions(const Class& cls) {
+ErrorPtr Compiler::CompileAllFunctions(const Class& cls) {
   FATAL1("Attempt to compile class %s", cls.ToCString());
   return Error::null();
 }
diff --git a/runtime/vm/compiler/jit/compiler.h b/runtime/vm/compiler/jit/compiler.h
index b859021..29029df 100644
--- a/runtime/vm/compiler/jit/compiler.h
+++ b/runtime/vm/compiler/jit/compiler.h
@@ -24,7 +24,6 @@
 class Library;
 class ParsedFunction;
 class QueueElement;
-class RawInstance;
 class Script;
 class SequenceNode;
 
@@ -82,13 +81,13 @@
   //
   // Returns the raw code object if compilation succeeds.  Otherwise returns a
   // RawError.  Also installs the generated code on the function.
-  static RawObject* CompileFunction(Thread* thread, const Function& function);
+  static ObjectPtr CompileFunction(Thread* thread, const Function& function);
 
   // Generates unoptimized code if not present, current code is unchanged.
   // Bytecode is considered unoptimized code.
   // TODO(regis): Revisit when deoptimizing mixed bytecode and jitted code.
-  static RawError* EnsureUnoptimizedCode(Thread* thread,
-                                         const Function& function);
+  static ErrorPtr EnsureUnoptimizedCode(Thread* thread,
+                                        const Function& function);
 
   // Generates optimized code for function.
   //
@@ -96,9 +95,9 @@
   // there is a compilation error.  If optimization fails, but there is no
   // error, returns null.  Any generated code is installed unless we are in
   // OSR mode.
-  static RawObject* CompileOptimizedFunction(Thread* thread,
-                                             const Function& function,
-                                             intptr_t osr_id = kNoOSRDeoptId);
+  static ObjectPtr CompileOptimizedFunction(Thread* thread,
+                                            const Function& function,
+                                            intptr_t osr_id = kNoOSRDeoptId);
 
   // Generates local var descriptors and sets it in 'code'. Do not call if the
   // local var descriptor already exists.
@@ -107,10 +106,10 @@
   // Eagerly compiles all functions in a class.
   //
   // Returns Error::null() if there is no compilation error.
-  static RawError* CompileAllFunctions(const Class& cls);
+  static ErrorPtr CompileAllFunctions(const Class& cls);
 
   // Eagerly read all bytecode.
-  static RawError* ReadAllBytecode(const Class& cls);
+  static ErrorPtr ReadAllBytecode(const Class& cls);
 
   // Notify the compiler that background (optimized) compilation has failed
   // because the mutator thread changed the state (e.g., deoptimization,
diff --git a/runtime/vm/compiler/method_recognizer.h b/runtime/vm/compiler/method_recognizer.h
index 7a34c46..30b0443 100644
--- a/runtime/vm/compiler/method_recognizer.h
+++ b/runtime/vm/compiler/method_recognizer.h
@@ -16,8 +16,6 @@
 class Function;
 class Library;
 class Object;
-class RawFunction;
-class RawGrowableObjectArray;
 class String;
 class Zone;
 
diff --git a/runtime/vm/compiler/offsets_extractor.cc b/runtime/vm/compiler/offsets_extractor.cc
index 5e82260..fc507f0 100644
--- a/runtime/vm/compiler/offsets_extractor.cc
+++ b/runtime/vm/compiler/offsets_extractor.cc
@@ -47,10 +47,10 @@
 #define PRINT_ARRAY_LAYOUT(Class, Name)                                        \
   std::cout << "static constexpr dart::compiler::target::word AOT_" #Class     \
                "_elements_start_offset = "                                     \
-            << Class::ArrayLayout::elements_start_offset() << ";\n";           \
+            << Class::ArrayTraits::elements_start_offset() << ";\n";           \
   std::cout << "static constexpr dart::compiler::target::word AOT_" #Class     \
                "_element_size = "                                              \
-            << Class::ArrayLayout::kElementSize << ";\n";
+            << Class::ArrayTraits::kElementSize << ";\n";
 
 #define PRINT_ARRAY_STRUCTFIELD_OFFSET(Class, Name, ElementOffsetName,         \
                                        FieldOffset)
@@ -92,10 +92,10 @@
 #define PRINT_ARRAY_LAYOUT(Class, Name)                                        \
   std::cout << "static constexpr dart::compiler::target::word " #Class         \
                "_elements_start_offset = "                                     \
-            << Class::ArrayLayout::elements_start_offset() << ";\n";           \
+            << Class::ArrayTraits::elements_start_offset() << ";\n";           \
   std::cout << "static constexpr dart::compiler::target::word " #Class         \
                "_element_size = "                                              \
-            << Class::ArrayLayout::kElementSize << ";\n";
+            << Class::ArrayTraits::kElementSize << ";\n";
 
 #define PRINT_ARRAY_STRUCTFIELD_OFFSET(Class, Name, ElementOffsetName,         \
                                        FieldOffset)
diff --git a/runtime/vm/compiler/relocation.cc b/runtime/vm/compiler/relocation.cc
index e72a3b1..c32196be 100644
--- a/runtime/vm/compiler/relocation.cc
+++ b/runtime/vm/compiler/relocation.cc
@@ -28,7 +28,7 @@
     kObjectAlignment);
 
 CodeRelocator::CodeRelocator(Thread* thread,
-                             GrowableArray<RawCode*>* code_objects,
+                             GrowableArray<CodePtr>* code_objects,
                              GrowableArray<ImageWriterCommand>* commands)
     : StackResource(thread),
       thread_(thread),
@@ -175,8 +175,8 @@
   }
 }
 
-bool CodeRelocator::AddInstructionsToText(RawCode* code) {
-  RawInstructions* instructions = Code::InstructionsOf(code);
+bool CodeRelocator::AddInstructionsToText(CodePtr code) {
+  InstructionsPtr instructions = Code::InstructionsOf(code);
 
   // If two [Code] objects point to the same [Instructions] object, we'll just
   // use the first one (they are equivalent for all practical purposes).
@@ -220,7 +220,7 @@
   return nullptr;
 }
 
-void CodeRelocator::AddTrampolineToText(RawInstructions* destination,
+void CodeRelocator::AddTrampolineToText(InstructionsPtr destination,
                                         uint8_t* trampoline_bytes,
                                         intptr_t trampoline_length) {
   commands_->Add(ImageWriterCommand(next_text_offset_, trampoline_bytes,
@@ -296,7 +296,7 @@
   all_unresolved_calls_.Append(unresolved_call);
 
   // Add it to callers of destination.
-  RawInstructions* destination = Code::InstructionsOf(unresolved_call->callee);
+  InstructionsPtr destination = Code::InstructionsOf(unresolved_call->callee);
   if (!unresolved_calls_by_destination_.HasKey(destination)) {
     unresolved_calls_by_destination_.Insert(
         {destination, new SameDestinationUnresolvedCallsList()});
@@ -330,7 +330,7 @@
 }
 
 void CodeRelocator::ResolveUnresolvedCallsTargeting(
-    const RawInstructions* instructions) {
+    const InstructionsPtr instructions) {
   if (unresolved_calls_by_destination_.HasKey(instructions)) {
     SameDestinationUnresolvedCallsList* calls =
         unresolved_calls_by_destination_.LookupValue(instructions);
@@ -422,7 +422,7 @@
   }
 }
 
-RawCode* CodeRelocator::GetTarget(const StaticCallsTableEntry& call) {
+CodePtr CodeRelocator::GetTarget(const StaticCallsTableEntry& call) {
   // The precompiler should have already replaced all function entries
   // with code entries.
   ASSERT(call.Get<Code::kSCallTableFunctionTarget>() == Function::null());
@@ -472,15 +472,15 @@
   uint32_t tags = 0;
 #if defined(IS_SIMARM_X64)
   // Account for difference in kObjectAlignment between host and target.
-  tags = RawObject::SizeTag::update(trampoline_length * 2, tags);
+  tags = ObjectLayout::SizeTag::update(trampoline_length * 2, tags);
 #else
-  tags = RawObject::SizeTag::update(trampoline_length, tags);
+  tags = ObjectLayout::SizeTag::update(trampoline_length, tags);
 #endif
-  tags = RawObject::ClassIdTag::update(kFreeListElement, tags);
-  tags = RawObject::OldBit::update(true, tags);
-  tags = RawObject::OldAndNotMarkedBit::update(true, tags);
-  tags = RawObject::OldAndNotRememberedBit::update(true, tags);
-  tags = RawObject::NewBit::update(false, tags);
+  tags = ObjectLayout::ClassIdTag::update(kFreeListElement, tags);
+  tags = ObjectLayout::OldBit::update(true, tags);
+  tags = ObjectLayout::OldAndNotMarkedBit::update(true, tags);
+  tags = ObjectLayout::OldAndNotRememberedBit::update(true, tags);
+  tags = ObjectLayout::NewBit::update(false, tags);
 
   auto header_word = reinterpret_cast<uintptr_t*>(trampoline_bytes);
   *header_word = tags;
@@ -563,9 +563,8 @@
   }
 }
 
-intptr_t CodeRelocator::FindDestinationInText(
-    const RawInstructions* destination,
-    intptr_t offset_into_target) {
+intptr_t CodeRelocator::FindDestinationInText(const InstructionsPtr destination,
+                                              intptr_t offset_into_target) {
   auto const destination_offset = text_offsets_.LookupValue(destination);
   return destination_offset + AdjustPayloadOffset(offset_into_target);
 }
diff --git a/runtime/vm/compiler/relocation.h b/runtime/vm/compiler/relocation.h
index 7094c94..e9b6d44 100644
--- a/runtime/vm/compiler/relocation.h
+++ b/runtime/vm/compiler/relocation.h
@@ -25,10 +25,10 @@
 class UnresolvedCall : public IntrusiveDListEntry<UnresolvedCall>,
                        public IntrusiveDListEntry<UnresolvedCall, 2> {
  public:
-  UnresolvedCall(RawCode* caller,
+  UnresolvedCall(CodePtr caller,
                  intptr_t call_offset,
                  intptr_t text_offset,
-                 RawCode* callee,
+                 CodePtr callee,
                  intptr_t offset_into_target,
                  bool is_tail_call)
       : caller(caller),
@@ -50,13 +50,13 @@
 
   // The caller which has an unresolved call (will be null'ed out when
   // resolved).
-  RawCode* caller;
+  CodePtr caller;
   // The offset from the payload of the calling code which performs the call.
   const intptr_t call_offset;
   // The offset in the .text segment where the call happens.
   const intptr_t text_offset;
   // The target of the forward call (will be null'ed out when resolved).
-  RawCode* callee;
+  CodePtr callee;
   // The extra offset into the target.
   const intptr_t offset_into_target;
   // Whether this is a tail call.
@@ -78,7 +78,7 @@
 // instead (which will tail-call the destination).
 class UnresolvedTrampoline : public IntrusiveDListEntry<UnresolvedTrampoline> {
  public:
-  UnresolvedTrampoline(RawCode* callee,
+  UnresolvedTrampoline(CodePtr callee,
                        intptr_t offset_into_target,
                        uint8_t* trampoline_bytes,
                        intptr_t text_offset)
@@ -88,7 +88,7 @@
         text_offset(text_offset) {}
 
   // The target of the forward call.
-  RawCode* callee;
+  CodePtr callee;
   // The extra offset into the target.
   intptr_t offset_into_target;
 
@@ -104,21 +104,21 @@
 class InstructionsMapTraits {
  public:
   struct Pair {
-    RawInstructions* instructions;
+    InstructionsPtr instructions;
     ValueType value;
 
     Pair() : instructions(nullptr), value(kNoValue) {}
-    Pair(RawInstructions* i, const ValueType& value)
+    Pair(InstructionsPtr i, const ValueType& value)
         : instructions(i), value(value) {}
   };
 
-  typedef const RawInstructions* Key;
+  typedef const InstructionsPtr Key;
   typedef const ValueType Value;
 
   static Key KeyOf(Pair kv) { return kv.instructions; }
   static ValueType ValueOf(Pair kv) { return kv.value; }
   static inline intptr_t Hashcode(Key key) {
-    return reinterpret_cast<intptr_t>(key);
+    return static_cast<intptr_t>(key);
   }
   static inline bool IsKeyEqual(Pair pair, Key key) {
     return pair.instructions == key;
@@ -147,7 +147,7 @@
   // Populates the image writer command array which must be used later to write
   // the ".text" segment.
   static void Relocate(Thread* thread,
-                       GrowableArray<RawCode*>* code_objects,
+                       GrowableArray<CodePtr>* code_objects,
                        GrowableArray<ImageWriterCommand>* commands,
                        bool is_vm_isolate) {
     CodeRelocator relocator(thread, code_objects, commands);
@@ -156,20 +156,20 @@
 
  private:
   CodeRelocator(Thread* thread,
-                GrowableArray<RawCode*>* code_objects,
+                GrowableArray<CodePtr>* code_objects,
                 GrowableArray<ImageWriterCommand>* commands);
 
   void Relocate(bool is_vm_isolate);
 
   void FindInstructionAndCallLimits();
 
-  bool AddInstructionsToText(RawCode* code);
+  bool AddInstructionsToText(CodePtr code);
   void ScanCallTargets(const Code& code,
                        const Array& call_targets,
                        intptr_t code_text_offset);
 
   UnresolvedTrampoline* FindTrampolineFor(UnresolvedCall* unresolved_call);
-  void AddTrampolineToText(RawInstructions* destination,
+  void AddTrampolineToText(InstructionsPtr destination,
                            uint8_t* trampoline_bytes,
                            intptr_t trampoline_length);
 
@@ -177,7 +177,7 @@
   void EnqueueUnresolvedTrampoline(UnresolvedTrampoline* unresolved_trampoline);
 
   bool TryResolveBackwardsCall(UnresolvedCall* unresolved_call);
-  void ResolveUnresolvedCallsTargeting(const RawInstructions* instructions);
+  void ResolveUnresolvedCallsTargeting(const InstructionsPtr instructions);
   void ResolveCall(UnresolvedCall* unresolved_call);
   void ResolveCallToDestination(UnresolvedCall* unresolved_call,
                                 intptr_t destination_text);
@@ -185,7 +185,7 @@
 
   void BuildTrampolinesForAlmostOutOfRangeCalls();
 
-  intptr_t FindDestinationInText(const RawInstructions* destination,
+  intptr_t FindDestinationInText(const InstructionsPtr destination,
                                  intptr_t offset_into_target);
 
   static intptr_t AdjustPayloadOffset(intptr_t payload_offset);
@@ -193,14 +193,14 @@
   bool IsTargetInRangeFor(UnresolvedCall* unresolved_call,
                           intptr_t target_text_offset);
 
-  RawCode* GetTarget(const StaticCallsTableEntry& entry);
+  CodePtr GetTarget(const StaticCallsTableEntry& entry);
 
   // The code relocation happens during AOT snapshot writing and operates on raw
   // objects. No allocations can be done.
   NoSafepointScope no_savepoint_scope_;
   Thread* thread_;
 
-  const GrowableArray<RawCode*>* code_objects_;
+  const GrowableArray<CodePtr>* code_objects_;
   GrowableArray<ImageWriterCommand>* commands_;
 
   // The size of largest instructions object in bytes.
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 3dd8271..45f0cf8 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -267,49 +267,50 @@
 }
 
 bool SizeFitsInSizeTag(uword instance_size) {
-  return dart::RawObject::SizeTag::SizeFits(
+  return dart::ObjectLayout::SizeTag::SizeFits(
       TranslateOffsetInWordsToHost(instance_size));
 }
 
 uint32_t MakeTagWordForNewSpaceObject(classid_t cid, uword instance_size) {
-  return dart::RawObject::SizeTag::encode(
+  return dart::ObjectLayout::SizeTag::encode(
              TranslateOffsetInWordsToHost(instance_size)) |
-         dart::RawObject::ClassIdTag::encode(cid) |
-         dart::RawObject::NewBit::encode(true);
+         dart::ObjectLayout::ClassIdTag::encode(cid) |
+         dart::ObjectLayout::NewBit::encode(true);
 }
 
 word Object::tags_offset() {
   return 0;
 }
 
-const word RawObject::kCardRememberedBit = dart::RawObject::kCardRememberedBit;
+const word ObjectLayout::kCardRememberedBit =
+    dart::ObjectLayout::kCardRememberedBit;
 
-const word RawObject::kOldAndNotRememberedBit =
-    dart::RawObject::kOldAndNotRememberedBit;
+const word ObjectLayout::kOldAndNotRememberedBit =
+    dart::ObjectLayout::kOldAndNotRememberedBit;
 
-const word RawObject::kOldAndNotMarkedBit =
-    dart::RawObject::kOldAndNotMarkedBit;
+const word ObjectLayout::kOldAndNotMarkedBit =
+    dart::ObjectLayout::kOldAndNotMarkedBit;
 
-const word RawObject::kSizeTagPos = dart::RawObject::kSizeTagPos;
+const word ObjectLayout::kSizeTagPos = dart::ObjectLayout::kSizeTagPos;
 
-const word RawObject::kSizeTagSize = dart::RawObject::kSizeTagSize;
+const word ObjectLayout::kSizeTagSize = dart::ObjectLayout::kSizeTagSize;
 
-const word RawObject::kClassIdTagPos = dart::RawObject::kClassIdTagPos;
+const word ObjectLayout::kClassIdTagPos = dart::ObjectLayout::kClassIdTagPos;
 
-const word RawObject::kClassIdTagSize = dart::RawObject::kClassIdTagSize;
+const word ObjectLayout::kClassIdTagSize = dart::ObjectLayout::kClassIdTagSize;
 
-const word RawObject::kSizeTagMaxSizeTag =
-    dart::RawObject::SizeTag::kMaxSizeTagInUnitsOfAlignment *
+const word ObjectLayout::kSizeTagMaxSizeTag =
+    dart::ObjectLayout::SizeTag::kMaxSizeTagInUnitsOfAlignment *
     ObjectAlignment::kObjectAlignment;
 
-const word RawObject::kTagBitsSizeTagPos =
-    dart::RawObject::TagBits::kSizeTagPos;
+const word ObjectLayout::kTagBitsSizeTagPos =
+    dart::ObjectLayout::TagBits::kSizeTagPos;
 
-const word RawAbstractType::kTypeStateFinalizedInstantiated =
-    dart::RawAbstractType::kFinalizedInstantiated;
+const word AbstractTypeLayout::kTypeStateFinalizedInstantiated =
+    dart::AbstractTypeLayout::kFinalizedInstantiated;
 
-const word RawObject::kBarrierOverlapShift =
-    dart::RawObject::kBarrierOverlapShift;
+const word ObjectLayout::kBarrierOverlapShift =
+    dart::ObjectLayout::kBarrierOverlapShift;
 
 bool IsTypedDataClassId(intptr_t cid) {
   return dart::IsTypedDataClassId(cid);
@@ -617,7 +618,7 @@
 
 word ToRawSmi(const dart::Object& a) {
   RELEASE_ASSERT(IsSmi(a));
-  return static_cast<word>(reinterpret_cast<intptr_t>(a.raw()));
+  return static_cast<word>(static_cast<intptr_t>(a.raw()));
 }
 
 word ToRawSmi(intptr_t value) {
@@ -645,7 +646,7 @@
   static_assert(kHostWordSize == kWordSize,
                 "Can't embed raw pointers to runtime objects when host and "
                 "target word sizes are different");
-  return reinterpret_cast<word>(a.raw());
+  return static_cast<word>(a.raw());
 }
 #endif  // defined(TARGET_ARCH_IA32)
 
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index d3c21b9..5c6fcaf 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -40,7 +40,7 @@
 class Zone;
 
 #define DO(clazz)                                                              \
-  class Raw##clazz;                                                            \
+  class clazz##Layout;                                                         \
   class clazz;
 CLASS_LIST_FOR_HANDLES(DO)
 #undef DO
@@ -372,7 +372,7 @@
 // Currently we use the same names for classes, constants and getters to make
 // migration easier.
 
-class RawObject : public AllStatic {
+class ObjectLayout : public AllStatic {
  public:
   static const word kCardRememberedBit;
   static const word kOldAndNotRememberedBit;
@@ -388,7 +388,7 @@
   static bool IsTypedDataClassId(intptr_t cid);
 };
 
-class RawAbstractType : public AllStatic {
+class AbstractTypeLayout : public AllStatic {
  public:
   static const word kTypeStateFinalizedInstantiated;
 };
@@ -418,7 +418,7 @@
 
   static word super_type_offset();
 
-  // The offset of the RawObject::num_type_arguments_ field in bytes.
+  // The offset of the ObjectLayout::num_type_arguments_ field in bytes.
   static word num_type_arguments_offset();
 
   // The value used if no type arguments vector is present.
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 7288034..67b096c 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -169,10 +169,10 @@
     12;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    120;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 60;
+    128;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 68;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    148;
+    156;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
 static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
@@ -646,10 +646,10 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    240;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 120;
+    256;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 136;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    296;
+    312;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -1126,10 +1126,10 @@
     12;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    120;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 60;
+    128;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 68;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    148;
+    156;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
 static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
@@ -1600,10 +1600,10 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    240;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 120;
+    256;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 136;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    296;
+    312;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -2080,10 +2080,10 @@
     12;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    120;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 60;
+    128;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 68;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    148;
+    156;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
 static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
@@ -2551,10 +2551,10 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    240;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 120;
+    256;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 136;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    296;
+    312;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -3025,10 +3025,10 @@
     12;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    120;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 60;
+    128;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 68;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    148;
+    156;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
 static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
@@ -3493,10 +3493,10 @@
     24;
 static constexpr dart::compiler::target::word NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word ObjectStore_double_type_offset =
-    240;
-static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 120;
+    256;
+static constexpr dart::compiler::target::word ObjectStore_int_type_offset = 136;
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
-    296;
+    312;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
 static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
@@ -3979,11 +3979,11 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 120;
+    AOT_ObjectStore_double_type_offset = 128;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    60;
+    68;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 148;
+    AOT_ObjectStore_string_type_offset = 156;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
 static constexpr dart::compiler::target::word
@@ -4498,11 +4498,11 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 240;
+    AOT_ObjectStore_double_type_offset = 256;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    120;
+    136;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 296;
+    AOT_ObjectStore_string_type_offset = 312;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -5023,11 +5023,11 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 240;
+    AOT_ObjectStore_double_type_offset = 256;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    120;
+    136;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 296;
+    AOT_ObjectStore_string_type_offset = 312;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -5544,11 +5544,11 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 120;
+    AOT_ObjectStore_double_type_offset = 128;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    60;
+    68;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 148;
+    AOT_ObjectStore_string_type_offset = 156;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
 static constexpr dart::compiler::target::word
@@ -6056,11 +6056,11 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 240;
+    AOT_ObjectStore_double_type_offset = 256;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    120;
+    136;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 296;
+    AOT_ObjectStore_string_type_offset = 312;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -6574,11 +6574,11 @@
 static constexpr dart::compiler::target::word
     AOT_NativeArguments_thread_offset = 0;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_double_type_offset = 240;
+    AOT_ObjectStore_double_type_offset = 256;
 static constexpr dart::compiler::target::word AOT_ObjectStore_int_type_offset =
-    120;
+    136;
 static constexpr dart::compiler::target::word
-    AOT_ObjectStore_string_type_offset = 296;
+    AOT_ObjectStore_string_type_offset = 312;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 007a84a..5c9b5e4 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -260,89 +260,89 @@
       kNumberOfCpuRegisters - 1,                                               \
       [](Register reg) { return (kDartAvailableCpuRegs & (1 << reg)) != 0; })) \
                                                                                \
-  SIZEOF(ApiError, InstanceSize, RawApiError)                                  \
-  SIZEOF(Array, InstanceSize, RawArray)                                        \
-  SIZEOF(Array, header_size, RawArray)                                         \
-  SIZEOF(Bool, InstanceSize, RawBool)                                          \
-  SIZEOF(Bytecode, InstanceSize, RawBytecode)                                  \
-  SIZEOF(Capability, InstanceSize, RawCapability)                              \
-  SIZEOF(Class, InstanceSize, RawClass)                                        \
-  SIZEOF(Closure, InstanceSize, RawClosure)                                    \
-  SIZEOF(ClosureData, InstanceSize, RawClosureData)                            \
-  SIZEOF(Code, InstanceSize, RawCode)                                          \
-  SIZEOF(CodeSourceMap, InstanceSize, RawCodeSourceMap)                        \
-  SIZEOF(CompressedStackMaps, InstanceSize, RawCompressedStackMaps)            \
-  SIZEOF(CompressedStackMaps, HeaderSize, RawCompressedStackMaps)              \
-  SIZEOF(Context, InstanceSize, RawContext)                                    \
-  SIZEOF(Context, header_size, RawContext)                                     \
-  SIZEOF(ContextScope, InstanceSize, RawContextScope)                          \
-  SIZEOF(Double, InstanceSize, RawDouble)                                      \
-  SIZEOF(DynamicLibrary, InstanceSize, RawDynamicLibrary)                      \
-  SIZEOF(ExceptionHandlers, InstanceSize, RawExceptionHandlers)                \
-  SIZEOF(ExternalOneByteString, InstanceSize, RawExternalOneByteString)        \
-  SIZEOF(ExternalTwoByteString, InstanceSize, RawExternalTwoByteString)        \
-  SIZEOF(ExternalTypedData, InstanceSize, RawExternalTypedData)                \
-  SIZEOF(FfiTrampolineData, InstanceSize, RawFfiTrampolineData)                \
-  SIZEOF(Field, InstanceSize, RawField)                                        \
-  SIZEOF(Float32x4, InstanceSize, RawFloat32x4)                                \
-  SIZEOF(Float64x2, InstanceSize, RawFloat64x2)                                \
-  SIZEOF(Function, InstanceSize, RawFunction)                                  \
-  SIZEOF(FutureOr, InstanceSize, RawFutureOr)                                  \
-  SIZEOF(GrowableObjectArray, InstanceSize, RawGrowableObjectArray)            \
-  SIZEOF(ICData, InstanceSize, RawICData)                                      \
-  SIZEOF(Instance, InstanceSize, RawInstance)                                  \
-  SIZEOF(Instructions, InstanceSize, RawInstructions)                          \
-  SIZEOF(Instructions, UnalignedHeaderSize, RawInstructions)                   \
-  SIZEOF(InstructionsSection, InstanceSize, RawInstructionsSection)            \
-  SIZEOF(InstructionsSection, UnalignedHeaderSize, RawInstructionsSection)     \
-  SIZEOF(Int32x4, InstanceSize, RawInt32x4)                                    \
-  SIZEOF(Integer, InstanceSize, RawInteger)                                    \
-  SIZEOF(KernelProgramInfo, InstanceSize, RawKernelProgramInfo)                \
-  SIZEOF(LanguageError, InstanceSize, RawLanguageError)                        \
-  SIZEOF(Library, InstanceSize, RawLibrary)                                    \
-  SIZEOF(LibraryPrefix, InstanceSize, RawLibraryPrefix)                        \
-  SIZEOF(LinkedHashMap, InstanceSize, RawLinkedHashMap)                        \
-  SIZEOF(LocalVarDescriptors, InstanceSize, RawLocalVarDescriptors)            \
-  SIZEOF(MegamorphicCache, InstanceSize, RawMegamorphicCache)                  \
-  SIZEOF(Mint, InstanceSize, RawMint)                                          \
-  SIZEOF(MirrorReference, InstanceSize, RawMirrorReference)                    \
-  SIZEOF(MonomorphicSmiableCall, InstanceSize, RawMonomorphicSmiableCall)      \
-  SIZEOF(Namespace, InstanceSize, RawNamespace)                                \
+  SIZEOF(ApiError, InstanceSize, ApiErrorLayout)                               \
+  SIZEOF(Array, InstanceSize, ArrayLayout)                                     \
+  SIZEOF(Array, header_size, ArrayLayout)                                      \
+  SIZEOF(Bool, InstanceSize, BoolLayout)                                       \
+  SIZEOF(Bytecode, InstanceSize, BytecodeLayout)                               \
+  SIZEOF(Capability, InstanceSize, CapabilityLayout)                           \
+  SIZEOF(Class, InstanceSize, ClassLayout)                                     \
+  SIZEOF(Closure, InstanceSize, ClosureLayout)                                 \
+  SIZEOF(ClosureData, InstanceSize, ClosureDataLayout)                         \
+  SIZEOF(Code, InstanceSize, CodeLayout)                                       \
+  SIZEOF(CodeSourceMap, InstanceSize, CodeSourceMapLayout)                     \
+  SIZEOF(CompressedStackMaps, InstanceSize, CompressedStackMapsLayout)         \
+  SIZEOF(CompressedStackMaps, HeaderSize, CompressedStackMapsLayout)           \
+  SIZEOF(Context, InstanceSize, ContextLayout)                                 \
+  SIZEOF(Context, header_size, ContextLayout)                                  \
+  SIZEOF(ContextScope, InstanceSize, ContextScopeLayout)                       \
+  SIZEOF(Double, InstanceSize, DoubleLayout)                                   \
+  SIZEOF(DynamicLibrary, InstanceSize, DynamicLibraryLayout)                   \
+  SIZEOF(ExceptionHandlers, InstanceSize, ExceptionHandlersLayout)             \
+  SIZEOF(ExternalOneByteString, InstanceSize, ExternalOneByteStringLayout)     \
+  SIZEOF(ExternalTwoByteString, InstanceSize, ExternalTwoByteStringLayout)     \
+  SIZEOF(ExternalTypedData, InstanceSize, ExternalTypedDataLayout)             \
+  SIZEOF(FfiTrampolineData, InstanceSize, FfiTrampolineDataLayout)             \
+  SIZEOF(Field, InstanceSize, FieldLayout)                                     \
+  SIZEOF(Float32x4, InstanceSize, Float32x4Layout)                             \
+  SIZEOF(Float64x2, InstanceSize, Float64x2Layout)                             \
+  SIZEOF(Function, InstanceSize, FunctionLayout)                               \
+  SIZEOF(FutureOr, InstanceSize, FutureOrLayout)                               \
+  SIZEOF(GrowableObjectArray, InstanceSize, GrowableObjectArrayLayout)         \
+  SIZEOF(ICData, InstanceSize, ICDataLayout)                                   \
+  SIZEOF(Instance, InstanceSize, InstanceLayout)                               \
+  SIZEOF(Instructions, InstanceSize, InstructionsLayout)                       \
+  SIZEOF(Instructions, UnalignedHeaderSize, InstructionsLayout)                \
+  SIZEOF(InstructionsSection, InstanceSize, InstructionsSectionLayout)         \
+  SIZEOF(InstructionsSection, UnalignedHeaderSize, InstructionsSectionLayout)  \
+  SIZEOF(Int32x4, InstanceSize, Int32x4Layout)                                 \
+  SIZEOF(Integer, InstanceSize, IntegerLayout)                                 \
+  SIZEOF(KernelProgramInfo, InstanceSize, KernelProgramInfoLayout)             \
+  SIZEOF(LanguageError, InstanceSize, LanguageErrorLayout)                     \
+  SIZEOF(Library, InstanceSize, LibraryLayout)                                 \
+  SIZEOF(LibraryPrefix, InstanceSize, LibraryPrefixLayout)                     \
+  SIZEOF(LinkedHashMap, InstanceSize, LinkedHashMapLayout)                     \
+  SIZEOF(LocalVarDescriptors, InstanceSize, LocalVarDescriptorsLayout)         \
+  SIZEOF(MegamorphicCache, InstanceSize, MegamorphicCacheLayout)               \
+  SIZEOF(Mint, InstanceSize, MintLayout)                                       \
+  SIZEOF(MirrorReference, InstanceSize, MirrorReferenceLayout)                 \
+  SIZEOF(MonomorphicSmiableCall, InstanceSize, MonomorphicSmiableCallLayout)   \
+  SIZEOF(Namespace, InstanceSize, NamespaceLayout)                             \
   SIZEOF(NativeArguments, StructSize, NativeArguments)                         \
-  SIZEOF(Number, InstanceSize, RawNumber)                                      \
-  SIZEOF(Object, InstanceSize, RawObject)                                      \
-  SIZEOF(ObjectPool, InstanceSize, RawObjectPool)                              \
-  SIZEOF(OneByteString, InstanceSize, RawOneByteString)                        \
-  SIZEOF(ParameterTypeCheck, InstanceSize, RawParameterTypeCheck)              \
-  SIZEOF(PatchClass, InstanceSize, RawPatchClass)                              \
-  SIZEOF(PcDescriptors, InstanceSize, RawPcDescriptors)                        \
-  SIZEOF(Pointer, InstanceSize, RawPointer)                                    \
-  SIZEOF(ReceivePort, InstanceSize, RawReceivePort)                            \
-  SIZEOF(RedirectionData, InstanceSize, RawRedirectionData)                    \
-  SIZEOF(RegExp, InstanceSize, RawRegExp)                                      \
-  SIZEOF(Script, InstanceSize, RawScript)                                      \
-  SIZEOF(SendPort, InstanceSize, RawSendPort)                                  \
-  SIZEOF(SignatureData, InstanceSize, RawSignatureData)                        \
-  SIZEOF(SingleTargetCache, InstanceSize, RawSingleTargetCache)                \
-  SIZEOF(Smi, InstanceSize, RawSmi)                                            \
-  SIZEOF(StackTrace, InstanceSize, RawStackTrace)                              \
-  SIZEOF(String, InstanceSize, RawString)                                      \
-  SIZEOF(SubtypeTestCache, InstanceSize, RawSubtypeTestCache)                  \
-  SIZEOF(TransferableTypedData, InstanceSize, RawTransferableTypedData)        \
-  SIZEOF(TwoByteString, InstanceSize, RawTwoByteString)                        \
-  SIZEOF(Type, InstanceSize, RawType)                                          \
-  SIZEOF(TypeArguments, InstanceSize, RawTypeArguments)                        \
-  SIZEOF(TypeParameter, InstanceSize, RawTypeParameter)                        \
-  SIZEOF(TypeRef, InstanceSize, RawTypeRef)                                    \
-  SIZEOF(TypedData, InstanceSize, RawTypedData)                                \
-  SIZEOF(TypedDataBase, InstanceSize, RawTypedDataBase)                        \
-  SIZEOF(TypedDataView, InstanceSize, RawTypedDataView)                        \
-  SIZEOF(UnhandledException, InstanceSize, RawUnhandledException)              \
-  SIZEOF(UnlinkedCall, InstanceSize, RawUnlinkedCall)                          \
-  SIZEOF(UnwindError, InstanceSize, RawUnwindError)                            \
-  SIZEOF(UserTag, InstanceSize, RawUserTag)                                    \
-  SIZEOF(WeakProperty, InstanceSize, RawWeakProperty)                          \
+  SIZEOF(Number, InstanceSize, NumberLayout)                                   \
+  SIZEOF(Object, InstanceSize, ObjectLayout)                                   \
+  SIZEOF(ObjectPool, InstanceSize, ObjectPoolLayout)                           \
+  SIZEOF(OneByteString, InstanceSize, OneByteStringLayout)                     \
+  SIZEOF(ParameterTypeCheck, InstanceSize, ParameterTypeCheckLayout)           \
+  SIZEOF(PatchClass, InstanceSize, PatchClassLayout)                           \
+  SIZEOF(PcDescriptors, InstanceSize, PcDescriptorsLayout)                     \
+  SIZEOF(Pointer, InstanceSize, PointerLayout)                                 \
+  SIZEOF(ReceivePort, InstanceSize, ReceivePortLayout)                         \
+  SIZEOF(RedirectionData, InstanceSize, RedirectionDataLayout)                 \
+  SIZEOF(RegExp, InstanceSize, RegExpLayout)                                   \
+  SIZEOF(Script, InstanceSize, ScriptLayout)                                   \
+  SIZEOF(SendPort, InstanceSize, SendPortLayout)                               \
+  SIZEOF(SignatureData, InstanceSize, SignatureDataLayout)                     \
+  SIZEOF(SingleTargetCache, InstanceSize, SingleTargetCacheLayout)             \
+  SIZEOF(Smi, InstanceSize, SmiLayout)                                         \
+  SIZEOF(StackTrace, InstanceSize, StackTraceLayout)                           \
+  SIZEOF(String, InstanceSize, StringLayout)                                   \
+  SIZEOF(SubtypeTestCache, InstanceSize, SubtypeTestCacheLayout)               \
+  SIZEOF(TransferableTypedData, InstanceSize, TransferableTypedDataLayout)     \
+  SIZEOF(TwoByteString, InstanceSize, TwoByteStringLayout)                     \
+  SIZEOF(Type, InstanceSize, TypeLayout)                                       \
+  SIZEOF(TypeArguments, InstanceSize, TypeArgumentsLayout)                     \
+  SIZEOF(TypeParameter, InstanceSize, TypeParameterLayout)                     \
+  SIZEOF(TypeRef, InstanceSize, TypeRefLayout)                                 \
+  SIZEOF(TypedData, InstanceSize, TypedDataLayout)                             \
+  SIZEOF(TypedDataBase, InstanceSize, TypedDataBaseLayout)                     \
+  SIZEOF(TypedDataView, InstanceSize, TypedDataViewLayout)                     \
+  SIZEOF(UnhandledException, InstanceSize, UnhandledExceptionLayout)           \
+  SIZEOF(UnlinkedCall, InstanceSize, UnlinkedCallLayout)                       \
+  SIZEOF(UnwindError, InstanceSize, UnwindErrorLayout)                         \
+  SIZEOF(UserTag, InstanceSize, UserTagLayout)                                 \
+  SIZEOF(WeakProperty, InstanceSize, WeakPropertyLayout)                       \
   SIZEOF(WeakSerializationReference, InstanceSize,                             \
-         RawWeakSerializationReference)
+         WeakSerializationReferenceLayout)
 
 #endif  // RUNTIME_VM_COMPILER_RUNTIME_OFFSETS_LIST_H_
diff --git a/runtime/vm/compiler/stub_code_compiler.h b/runtime/vm/compiler/stub_code_compiler.h
index 9eb4098..6193417 100644
--- a/runtime/vm/compiler/stub_code_compiler.h
+++ b/runtime/vm/compiler/stub_code_compiler.h
@@ -14,6 +14,7 @@
 #include "vm/constants.h"
 #include "vm/growable_array.h"
 #include "vm/stub_code_list.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
@@ -54,7 +55,7 @@
       const Object& context_allocation_stub);
 #endif
 
-  static RawArray* BuildStaticCallsTable(
+  static ArrayPtr BuildStaticCallsTable(
       Zone* zone,
       compiler::UnresolvedPcRelativeCalls* unresolved_calls);
 
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 4967874..6ce6f66 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -1107,10 +1107,10 @@
     // R3: new object end address.
     // R9: allocation size.
     {
-      const intptr_t shift = target::RawObject::kTagBitsSizeTagPos -
+      const intptr_t shift = target::ObjectLayout::kTagBitsSizeTagPos -
                              target::ObjectAlignment::kObjectAlignmentLog2;
 
-      __ CompareImmediate(R9, target::RawObject::kSizeTagMaxSizeTag);
+      __ CompareImmediate(R9, target::ObjectLayout::kSizeTagMaxSizeTag);
       __ mov(R8, Operand(R9, LSL, shift), LS);
       __ mov(R8, Operand(0), HI);
 
@@ -1535,9 +1535,9 @@
   // R1: number of context variables.
   // R2: object size.
   // R3: next object start.
-  const intptr_t shift = target::RawObject::kTagBitsSizeTagPos -
+  const intptr_t shift = target::ObjectLayout::kTagBitsSizeTagPos -
                          target::ObjectAlignment::kObjectAlignmentLog2;
-  __ CompareImmediate(R2, target::RawObject::kSizeTagMaxSizeTag);
+  __ CompareImmediate(R2, target::ObjectLayout::kSizeTagMaxSizeTag);
   // If no size tag overflow, shift R2 left, else set R2 to zero.
   __ mov(R9, Operand(R2, LSL, shift), LS);
   __ mov(R9, Operand(0), HI);
@@ -1733,13 +1733,13 @@
 
   if (cards) {
     __ ldr(TMP, FieldAddress(R1, target::Object::tags_offset()));
-    __ tst(TMP, Operand(1 << target::RawObject::kCardRememberedBit));
+    __ tst(TMP, Operand(1 << target::ObjectLayout::kCardRememberedBit));
     __ b(&remember_card, NOT_ZERO);
   } else {
 #if defined(DEBUG)
     Label ok;
     __ ldr(TMP, FieldAddress(R1, target::Object::tags_offset()));
-    __ tst(TMP, Operand(1 << target::RawObject::kCardRememberedBit));
+    __ tst(TMP, Operand(1 << target::ObjectLayout::kCardRememberedBit));
     __ b(&ok, ZERO);
     __ Stop("Wrong barrier");
     __ Bind(&ok);
@@ -1756,7 +1756,7 @@
   Label retry;
   __ Bind(&retry);
   __ ldrex(R2, R3);
-  __ bic(R2, R2, Operand(1 << target::RawObject::kOldAndNotRememberedBit));
+  __ bic(R2, R2, Operand(1 << target::ObjectLayout::kOldAndNotRememberedBit));
   __ strex(R4, R2, R3);
   __ cmp(R4, Operand(1));
   __ b(&retry, EQ);
@@ -1804,9 +1804,9 @@
   // R3: Untagged address of header word (ldrex/strex do not support offsets).
   __ Bind(&marking_retry);
   __ ldrex(R2, R3);
-  __ tst(R2, Operand(1 << target::RawObject::kOldAndNotMarkedBit));
+  __ tst(R2, Operand(1 << target::ObjectLayout::kOldAndNotMarkedBit));
   __ b(&lost_race, ZERO);
-  __ bic(R2, R2, Operand(1 << target::RawObject::kOldAndNotMarkedBit));
+  __ bic(R2, R2, Operand(1 << target::ObjectLayout::kOldAndNotMarkedBit));
   __ strex(R4, R2, R3);
   __ cmp(R4, Operand(1));
   __ b(&marking_retry, EQ);
@@ -3177,7 +3177,7 @@
   __ ldrb(kTmp, FieldAddress(TypeTestABI::kDstTypeReg,
                              target::Type::type_state_offset()));
   __ cmp(kTmp,
-         Operand(target::RawAbstractType::kTypeStateFinalizedInstantiated));
+         Operand(target::AbstractTypeLayout::kTypeStateFinalizedInstantiated));
   __ BranchIf(NOT_EQUAL, &is_complex_case);
 
   // Check whether this [Type] is a function type.
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 49004b6..5ff469e 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -1191,9 +1191,9 @@
     // R2: array length as Smi.
     // R3: array size.
     // R7: new object end address.
-    const intptr_t shift = target::RawObject::kTagBitsSizeTagPos -
+    const intptr_t shift = target::ObjectLayout::kTagBitsSizeTagPos -
                            target::ObjectAlignment::kObjectAlignmentLog2;
-    __ CompareImmediate(R3, target::RawObject::kSizeTagMaxSizeTag);
+    __ CompareImmediate(R3, target::ObjectLayout::kSizeTagMaxSizeTag);
     // If no size tag overflow, shift R1 left, else set R1 to zero.
     __ LslImmediate(TMP, R3, shift);
     __ csel(R1, TMP, R1, LS);
@@ -1628,9 +1628,9 @@
   // R0: new object.
   // R1: number of context variables.
   // R2: object size.
-  const intptr_t shift = target::RawObject::kTagBitsSizeTagPos -
+  const intptr_t shift = target::ObjectLayout::kTagBitsSizeTagPos -
                          target::ObjectAlignment::kObjectAlignmentLog2;
-  __ CompareImmediate(R2, target::RawObject::kSizeTagMaxSizeTag);
+  __ CompareImmediate(R2, target::ObjectLayout::kSizeTagMaxSizeTag);
   // If no size tag overflow, shift R2 left, else set R2 to zero.
   __ LslImmediate(TMP, R2, shift);
   __ csel(R2, TMP, R2, LS);
@@ -1830,12 +1830,12 @@
 
   if (cards) {
     __ LoadFieldFromOffset(TMP, R1, target::Object::tags_offset(), kWord);
-    __ tbnz(&remember_card, TMP, target::RawObject::kCardRememberedBit);
+    __ tbnz(&remember_card, TMP, target::ObjectLayout::kCardRememberedBit);
   } else {
 #if defined(DEBUG)
     Label ok;
     __ LoadFieldFromOffset(TMP, R1, target::Object::tags_offset(), kWord);
-    __ tbz(&ok, TMP, target::RawObject::kCardRememberedBit);
+    __ tbz(&ok, TMP, target::ObjectLayout::kCardRememberedBit);
     __ Stop("Wrong barrier");
     __ Bind(&ok);
 #endif
@@ -1855,7 +1855,8 @@
   Label retry;
   __ Bind(&retry);
   __ ldxr(R2, R3, kWord);
-  __ AndImmediate(R2, R2, ~(1 << target::RawObject::kOldAndNotRememberedBit));
+  __ AndImmediate(R2, R2,
+                  ~(1 << target::ObjectLayout::kOldAndNotRememberedBit));
   __ stxr(R4, R2, R3, kWord);
   __ cbnz(&retry, R4);
 
@@ -1910,8 +1911,8 @@
   // R3: Untagged address of header word (ldxr/stxr do not support offsets).
   __ Bind(&marking_retry);
   __ ldxr(R2, R3, kWord);
-  __ tbz(&lost_race, R2, target::RawObject::kOldAndNotMarkedBit);
-  __ AndImmediate(R2, R2, ~(1 << target::RawObject::kOldAndNotMarkedBit));
+  __ tbz(&lost_race, R2, target::ObjectLayout::kOldAndNotMarkedBit);
+  __ AndImmediate(R2, R2, ~(1 << target::ObjectLayout::kOldAndNotMarkedBit));
   __ stxr(R4, R2, R3, kWord);
   __ cbnz(&marking_retry, R4);
 
@@ -3302,7 +3303,7 @@
       FieldAddress(TypeTestABI::kDstTypeReg, target::Type::type_state_offset()),
       kByte);
   __ cmp(kTmp,
-         Operand(target::RawAbstractType::kTypeStateFinalizedInstantiated));
+         Operand(target::AbstractTypeLayout::kTypeStateFinalizedInstantiated));
   __ BranchIf(NOT_EQUAL, &is_complex_case);
 
   // Check whether this [Type] is a function type.
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 1bfc1d5..73db068 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -831,9 +831,9 @@
     {
       Label size_tag_overflow, done;
       __ movl(EDI, EBX);
-      __ cmpl(EDI, Immediate(target::RawObject::kSizeTagMaxSizeTag));
+      __ cmpl(EDI, Immediate(target::ObjectLayout::kSizeTagMaxSizeTag));
       __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-      __ shll(EDI, Immediate(target::RawObject::kTagBitsSizeTagPos -
+      __ shll(EDI, Immediate(target::ObjectLayout::kTagBitsSizeTagPos -
                              target::ObjectAlignment::kObjectAlignmentLog2));
       __ jmp(&done, Assembler::kNearJump);
 
@@ -1209,9 +1209,9 @@
       Label size_tag_overflow, done;
       __ leal(EBX, Address(EDX, TIMES_4, fixed_size_plus_alignment_padding));
       __ andl(EBX, Immediate(-target::ObjectAlignment::kObjectAlignment));
-      __ cmpl(EBX, Immediate(target::RawObject::kSizeTagMaxSizeTag));
+      __ cmpl(EBX, Immediate(target::ObjectLayout::kSizeTagMaxSizeTag));
       __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-      __ shll(EBX, Immediate(target::RawObject::kTagBitsSizeTagPos -
+      __ shll(EBX, Immediate(target::ObjectLayout::kTagBitsSizeTagPos -
                              target::ObjectAlignment::kObjectAlignmentLog2));
       __ jmp(&done);
 
@@ -1401,7 +1401,7 @@
   // Spilled: EAX, ECX
   // EDX: Address being stored
   __ movl(EAX, FieldAddress(EDX, target::Object::tags_offset()));
-  __ testl(EAX, Immediate(1 << target::RawObject::kOldAndNotRememberedBit));
+  __ testl(EAX, Immediate(1 << target::ObjectLayout::kOldAndNotRememberedBit));
   __ j(NOT_EQUAL, &add_to_buffer, Assembler::kNearJump);
   __ popl(ECX);
   __ popl(EAX);
@@ -1414,12 +1414,12 @@
 
   if (cards) {
     // Check if this object is using remembered cards.
-    __ testl(EAX, Immediate(1 << target::RawObject::kCardRememberedBit));
+    __ testl(EAX, Immediate(1 << target::ObjectLayout::kCardRememberedBit));
     __ j(NOT_EQUAL, &remember_card, Assembler::kFarJump);  // Unlikely.
   } else {
 #if defined(DEBUG)
     Label ok;
-    __ testl(EAX, Immediate(1 << target::RawObject::kCardRememberedBit));
+    __ testl(EAX, Immediate(1 << target::ObjectLayout::kCardRememberedBit));
     __ j(ZERO, &ok, Assembler::kFarJump);  // Unlikely.
     __ Stop("Wrong barrier");
     __ Bind(&ok);
@@ -1429,7 +1429,7 @@
   // lock+andl is an atomic read-modify-write.
   __ lock();
   __ andl(FieldAddress(EDX, target::Object::tags_offset()),
-          Immediate(~(1 << target::RawObject::kOldAndNotRememberedBit)));
+          Immediate(~(1 << target::ObjectLayout::kOldAndNotRememberedBit)));
 
   // Load the StoreBuffer block out of the thread. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 2f662a4..0e7f495 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -1099,9 +1099,9 @@
     // RDI: allocation size.
     {
       Label size_tag_overflow, done;
-      __ cmpq(RDI, Immediate(target::RawObject::kSizeTagMaxSizeTag));
+      __ cmpq(RDI, Immediate(target::ObjectLayout::kSizeTagMaxSizeTag));
       __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-      __ shlq(RDI, Immediate(target::RawObject::kTagBitsSizeTagPos -
+      __ shlq(RDI, Immediate(target::ObjectLayout::kTagBitsSizeTagPos -
                              target::ObjectAlignment::kObjectAlignmentLog2));
       __ jmp(&done, Assembler::kNearJump);
 
@@ -1539,9 +1539,9 @@
     Label size_tag_overflow, done;
     __ leaq(R13, Address(R10, TIMES_8, fixed_size_plus_alignment_padding));
     __ andq(R13, Immediate(-target::ObjectAlignment::kObjectAlignment));
-    __ cmpq(R13, Immediate(target::RawObject::kSizeTagMaxSizeTag));
+    __ cmpq(R13, Immediate(target::ObjectLayout::kSizeTagMaxSizeTag));
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shlq(R13, Immediate(target::RawObject::kTagBitsSizeTagPos -
+    __ shlq(R13, Immediate(target::ObjectLayout::kTagBitsSizeTagPos -
                            target::ObjectAlignment::kObjectAlignmentLog2));
     __ jmp(&done);
 
@@ -1740,13 +1740,13 @@
 
   if (cards) {
     __ movl(TMP, FieldAddress(RDX, target::Object::tags_offset()));
-    __ testl(TMP, Immediate(1 << target::RawObject::kCardRememberedBit));
+    __ testl(TMP, Immediate(1 << target::ObjectLayout::kCardRememberedBit));
     __ j(NOT_ZERO, &remember_card, Assembler::kFarJump);
   } else {
 #if defined(DEBUG)
     Label ok;
     __ movl(TMP, FieldAddress(RDX, target::Object::tags_offset()));
-    __ testl(TMP, Immediate(1 << target::RawObject::kCardRememberedBit));
+    __ testl(TMP, Immediate(1 << target::ObjectLayout::kCardRememberedBit));
     __ j(ZERO, &ok, Assembler::kFarJump);
     __ Stop("Wrong barrier");
     __ Bind(&ok);
@@ -1761,7 +1761,7 @@
   // lock+andl is an atomic read-modify-write.
   __ lock();
   __ andl(FieldAddress(RDX, target::Object::tags_offset()),
-          Immediate(~(1 << target::RawObject::kOldAndNotRememberedBit)));
+          Immediate(~(1 << target::ObjectLayout::kOldAndNotRememberedBit)));
 
   // Save registers being destroyed.
   __ pushq(RAX);
@@ -1813,9 +1813,9 @@
   __ movl(RAX, FieldAddress(TMP, target::Object::tags_offset()));
   __ Bind(&retry);
   __ movl(RCX, RAX);
-  __ testl(RCX, Immediate(1 << target::RawObject::kOldAndNotMarkedBit));
+  __ testl(RCX, Immediate(1 << target::ObjectLayout::kOldAndNotMarkedBit));
   __ j(ZERO, &lost_race);  // Marked by another thread.
-  __ andl(RCX, Immediate(~(1 << target::RawObject::kOldAndNotMarkedBit)));
+  __ andl(RCX, Immediate(~(1 << target::ObjectLayout::kOldAndNotMarkedBit)));
   __ LockCmpxchgl(FieldAddress(TMP, target::Object::tags_offset()), RCX);
   __ j(NOT_EQUAL, &retry, Assembler::kNearJump);
 
@@ -2474,7 +2474,7 @@
     __ j(EQUAL, &call_target_function_through_unchecked_entry);
 
     // Check trivial exactness.
-    // Note: RawICData::receivers_static_type_ is guaranteed to be not null
+    // Note: ICDataLayout::receivers_static_type_ is guaranteed to be not null
     // because we only emit calls to this stub when it is not null.
     __ movq(RCX,
             FieldAddress(RBX, target::ICData::receivers_static_type_offset()));
@@ -3228,7 +3228,7 @@
   // Check whether this [Type] is instantiated/uninstantiated.
   __ cmpb(
       FieldAddress(TypeTestABI::kDstTypeReg, target::Type::type_state_offset()),
-      Immediate(target::RawAbstractType::kTypeStateFinalizedInstantiated));
+      Immediate(target::AbstractTypeLayout::kTypeStateFinalizedInstantiated));
   __ BranchIf(NOT_EQUAL, &is_complex_case);
 
   // Check whether this [Type] is a function type.
diff --git a/runtime/vm/compiler/write_barrier_elimination.cc b/runtime/vm/compiler/write_barrier_elimination.cc
index 162f8e1..8dc6b3c 100644
--- a/runtime/vm/compiler/write_barrier_elimination.cc
+++ b/runtime/vm/compiler/write_barrier_elimination.cc
@@ -331,8 +331,8 @@
 
 #define FOR_EACH_NATIVE_SLOT(class, underlying_type, field, type, modifiers)   \
   case Slot::Kind::k##class##_##field:                                         \
-    return std::is_base_of<RawInstance, underlying_type>::value ||             \
-           std::is_base_of<RawContext, underlying_type>::value;
+    return std::is_base_of<InstanceLayout, underlying_type>::value ||          \
+           std::is_base_of<ContextLayout, underlying_type>::value;
 
       NATIVE_SLOTS_LIST(FOR_EACH_NATIVE_SLOT)
 #undef FOR_EACH_NATIVE_SLOT
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index 2ea85b1..e7b6d31 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -220,7 +220,7 @@
   if (!KernelIsolate::IsRunning()) {
     UNREACHABLE();
   } else {
-    RawLibrary* raw_library = Library::RawCast(Api::UnwrapHandle(lib));
+    LibraryPtr raw_library = Library::RawCast(Api::UnwrapHandle(lib));
     Library& lib_handle = Library::ZoneHandle(raw_library);
 
     Dart_KernelCompilationResult compilation_result =
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index f295519..4ccca2d 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -109,9 +109,9 @@
 
 #define CHECK_FIELD(Class, Name) CHECK_OFFSET(Class::Name(), Class##_##Name)
 #define CHECK_ARRAY(Class, Name)                                               \
-  CHECK_OFFSET(Class::ArrayLayout::elements_start_offset(),                    \
+  CHECK_OFFSET(Class::ArrayTraits::elements_start_offset(),                    \
                Class##_elements_start_offset)                                  \
-  CHECK_OFFSET(Class::ArrayLayout::kElementSize, Class##_element_size)
+  CHECK_OFFSET(Class::ArrayTraits::kElementSize, Class##_element_size)
 #define CHECK_ARRAY_STRUCTFIELD(Class, Name, ElementOffsetName, FieldOffset)
 
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -269,6 +269,8 @@
     Object::InitNullAndBool(vm_isolate_);
     vm_isolate_->set_object_store(new ObjectStore());
     vm_isolate_->isolate_object_store()->Init();
+    vm_isolate_->isolate_group_->object_store_ =
+        vm_isolate_->object_store_shared_ptr_;
     TargetCPUFeatures::Init();
     Object::Init(vm_isolate_);
     ArgumentsDescriptor::Init();
@@ -314,7 +316,7 @@
         return strdup(error.ToErrorCString());
       }
 
-      ReversePcLookupCache::BuildAndAttachToIsolate(vm_isolate_);
+      ReversePcLookupCache::BuildAndAttachToIsolateGroup(vm_isolate_->group());
 
       Object::FinishInit(vm_isolate_);
 #if defined(SUPPORT_TIMELINE)
@@ -674,17 +676,16 @@
   I->set_saved_initial_field_table(
       donor_isolate->saved_initial_field_table_shareable());
 
-  ReversePcLookupCache::BuildAndAttachToIsolate(I);
   return true;
 }
 #endif
 
-RawError* Dart::InitIsolateFromSnapshot(Thread* T,
-                                        Isolate* I,
-                                        const uint8_t* snapshot_data,
-                                        const uint8_t* snapshot_instructions,
-                                        const uint8_t* kernel_buffer,
-                                        intptr_t kernel_buffer_size) {
+ErrorPtr Dart::InitIsolateFromSnapshot(Thread* T,
+                                       Isolate* I,
+                                       const uint8_t* snapshot_data,
+                                       const uint8_t* snapshot_instructions,
+                                       const uint8_t* kernel_buffer,
+                                       intptr_t kernel_buffer_size) {
   Error& error = Error::Handle(T->zone());
   error = Object::Init(I, kernel_buffer, kernel_buffer_size);
   if (!error.IsNull()) {
@@ -718,7 +719,7 @@
       return error.raw();
     }
 
-    ReversePcLookupCache::BuildAndAttachToIsolate(I);
+    ReversePcLookupCache::BuildAndAttachToIsolateGroup(I->group());
 
 #if defined(SUPPORT_TIMELINE)
     if (tbes.enabled()) {
@@ -789,12 +790,12 @@
 }
 #endif
 
-RawError* Dart::InitializeIsolate(const uint8_t* snapshot_data,
-                                  const uint8_t* snapshot_instructions,
-                                  const uint8_t* kernel_buffer,
-                                  intptr_t kernel_buffer_size,
-                                  IsolateGroup* source_isolate_group,
-                                  void* isolate_data) {
+ErrorPtr Dart::InitializeIsolate(const uint8_t* snapshot_data,
+                                 const uint8_t* snapshot_instructions,
+                                 const uint8_t* kernel_buffer,
+                                 intptr_t kernel_buffer_size,
+                                 IsolateGroup* source_isolate_group,
+                                 void* isolate_data) {
   // Initialize the new isolate.
   Thread* T = Thread::Current();
   Isolate* I = T->isolate();
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 537c0a7..f254047 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -15,7 +15,6 @@
 class DebugInfo;
 class Isolate;
 class LocalHandle;
-class RawError;
 class ReadOnlyHandles;
 class ThreadPool;
 namespace kernel {
@@ -55,18 +54,18 @@
   // from SDK library sources.  If the snapshot_buffer is non-NULL,
   // initialize from a snapshot or a Kernel binary depending on the value of
   // from_kernel.  Otherwise, initialize from sources.
-  static RawError* InitializeIsolate(const uint8_t* snapshot_data,
-                                     const uint8_t* snapshot_instructions,
-                                     const uint8_t* kernel_buffer,
-                                     intptr_t kernel_buffer_size,
-                                     IsolateGroup* source_isolate_group,
-                                     void* data);
-  static RawError* InitIsolateFromSnapshot(Thread* T,
-                                           Isolate* I,
-                                           const uint8_t* snapshot_data,
-                                           const uint8_t* snapshot_instructions,
-                                           const uint8_t* kernel_buffer,
-                                           intptr_t kernel_buffer_size);
+  static ErrorPtr InitializeIsolate(const uint8_t* snapshot_data,
+                                    const uint8_t* snapshot_instructions,
+                                    const uint8_t* kernel_buffer,
+                                    intptr_t kernel_buffer_size,
+                                    IsolateGroup* source_isolate_group,
+                                    void* data);
+  static ErrorPtr InitIsolateFromSnapshot(Thread* T,
+                                          Isolate* I,
+                                          const uint8_t* snapshot_data,
+                                          const uint8_t* snapshot_instructions,
+                                          const uint8_t* kernel_buffer,
+                                          intptr_t kernel_buffer_size);
   static void RunShutdownCallback();
   static void ShutdownIsolate(Isolate* isolate);
   static void ShutdownIsolate();
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 82ad6d6..4bb6f96 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -84,7 +84,7 @@
 
 #define CHECK_ERROR_HANDLE(error)                                              \
   {                                                                            \
-    RawError* err = (error);                                                   \
+    ErrorPtr err = (error);                                                    \
     if (err != Error::null()) {                                                \
       return Api::NewHandle(T, err);                                           \
     }                                                                          \
@@ -115,7 +115,7 @@
         funcHandle_(Function::Handle(thread->zone())),
         typeHandle_(AbstractType::Handle(thread->zone())) {}
 
-  void VisitObject(RawObject* obj) {
+  void VisitObject(ObjectPtr obj) {
     if (obj->IsFunction()) {
       funcHandle_ ^= obj;
       classHandle_ ^= funcHandle_.Owner();
@@ -145,7 +145,7 @@
 };
 #endif  // #if defined(DEBUG).
 
-static RawInstance* GetListInstance(Zone* zone, const Object& obj) {
+static InstancePtr GetListInstance(Zone* zone, const Object& obj) {
   if (obj.IsInstance()) {
     ObjectStore* object_store = Isolate::Current()->object_store();
     Type& list_rare_type =
@@ -169,7 +169,7 @@
   return Instance::null();
 }
 
-static RawInstance* GetMapInstance(Zone* zone, const Object& obj) {
+static InstancePtr GetMapInstance(Zone* zone, const Object& obj) {
   if (obj.IsInstance()) {
     ObjectStore* object_store = Isolate::Current()->object_store();
     Type& map_rare_type =
@@ -294,7 +294,7 @@
                        current_func, field_count, num_fields);
 }
 
-static RawObject* Send0Arg(const Instance& receiver, const String& selector) {
+static ObjectPtr Send0Arg(const Instance& receiver, const String& selector) {
   const intptr_t kTypeArgsLen = 0;
   const intptr_t kNumArgs = 1;
   ArgumentsDescriptor args_desc(
@@ -309,9 +309,9 @@
   return DartEntry::InvokeFunction(function, args);
 }
 
-static RawObject* Send1Arg(const Instance& receiver,
-                           const String& selector,
-                           const Instance& argument) {
+static ObjectPtr Send1Arg(const Instance& receiver,
+                          const String& selector,
+                          const Instance& argument) {
   const intptr_t kTypeArgsLen = 0;
   const intptr_t kNumArgs = 2;
   ArgumentsDescriptor args_desc(
@@ -346,7 +346,7 @@
   }
 }
 
-Dart_Handle Api::InitNewHandle(Thread* thread, RawObject* raw) {
+Dart_Handle Api::InitNewHandle(Thread* thread, ObjectPtr raw) {
   LocalHandles* local_handles = Api::TopScope(thread)->local_handles();
   ASSERT(local_handles != NULL);
   LocalHandle* ref = local_handles->AllocateHandle();
@@ -354,7 +354,7 @@
   return ref->apiHandle();
 }
 
-Dart_Handle Api::NewHandle(Thread* thread, RawObject* raw) {
+Dart_Handle Api::NewHandle(Thread* thread, ObjectPtr raw) {
   if (raw == Object::null()) {
     return Null();
   }
@@ -368,7 +368,7 @@
   return InitNewHandle(thread, raw);
 }
 
-RawObject* Api::UnwrapHandle(Dart_Handle object) {
+ObjectPtr Api::UnwrapHandle(Dart_Handle object) {
 #if defined(DEBUG)
   Thread* thread = Thread::Current();
   ASSERT(thread->execution_state() == Thread::kThreadInVM);
@@ -520,8 +520,8 @@
   ASSERT(api_native_key_ != kUnsetThreadLocalKey);
 }
 
-static Dart_Handle InitNewReadOnlyApiHandle(RawObject* raw) {
-  ASSERT(raw->InVMIsolateHeap());
+static Dart_Handle InitNewReadOnlyApiHandle(ObjectPtr raw) {
+  ASSERT(raw->ptr()->InVMIsolateHeap());
   LocalHandle* ref = Dart::AllocateReadOnlyApiHandle();
   ref->set_raw(raw);
   return ref->apiHandle();
@@ -558,14 +558,14 @@
                               int arg_index,
                               void** peer) {
   NoSafepointScope no_safepoint_scope;
-  RawObject* raw_obj = arguments->NativeArgAt(arg_index);
+  ObjectPtr raw_obj = arguments->NativeArgAt(arg_index);
   if (!raw_obj->IsHeapObject()) {
     return false;
   }
   intptr_t cid = raw_obj->GetClassId();
   if (cid == kExternalOneByteStringCid) {
-    RawExternalOneByteString* raw_string =
-        reinterpret_cast<RawExternalOneByteString*>(raw_obj);
+    ExternalOneByteStringPtr raw_string =
+        static_cast<ExternalOneByteStringPtr>(raw_obj);
     *peer = raw_string->ptr()->peer_;
     return true;
   }
@@ -575,8 +575,8 @@
     return (*peer != 0);
   }
   if (cid == kExternalTwoByteStringCid) {
-    RawExternalTwoByteString* raw_string =
-        reinterpret_cast<RawExternalTwoByteString*>(raw_obj);
+    ExternalTwoByteStringPtr raw_string =
+        static_cast<ExternalTwoByteStringPtr>(raw_obj);
     *peer = raw_string->ptr()->peer_;
     return true;
   }
@@ -585,13 +585,13 @@
 
 bool Api::GetNativeReceiver(NativeArguments* arguments, intptr_t* value) {
   NoSafepointScope no_safepoint_scope;
-  RawObject* raw_obj = arguments->NativeArg0();
+  ObjectPtr raw_obj = arguments->NativeArg0();
   if (raw_obj->IsHeapObject()) {
     intptr_t cid = raw_obj->GetClassId();
     if (cid >= kNumPredefinedCids) {
       ASSERT(Instance::Cast(Object::Handle(raw_obj)).IsValidNativeIndex(0));
-      RawTypedData* native_fields = *reinterpret_cast<RawTypedData**>(
-          RawObject::ToAddr(raw_obj) + sizeof(RawObject));
+      TypedDataPtr native_fields = *reinterpret_cast<TypedDataPtr*>(
+          ObjectLayout::ToAddr(raw_obj) + sizeof(ObjectLayout));
       if (native_fields == TypedData::null()) {
         *value = 0;
       } else {
@@ -607,7 +607,7 @@
                                    int arg_index,
                                    bool* value) {
   NoSafepointScope no_safepoint_scope;
-  RawObject* raw_obj = arguments->NativeArgAt(arg_index);
+  ObjectPtr raw_obj = arguments->NativeArgAt(arg_index);
   if (raw_obj->IsHeapObject()) {
     intptr_t cid = raw_obj->GetClassId();
     if (cid == kBoolCid) {
@@ -626,16 +626,16 @@
                                    int arg_index,
                                    int64_t* value) {
   NoSafepointScope no_safepoint_scope;
-  RawObject* raw_obj = arguments->NativeArgAt(arg_index);
+  ObjectPtr raw_obj = arguments->NativeArgAt(arg_index);
   if (raw_obj->IsHeapObject()) {
     intptr_t cid = raw_obj->GetClassId();
     if (cid == kMintCid) {
-      *value = reinterpret_cast<RawMint*>(raw_obj)->ptr()->value_;
+      *value = static_cast<MintPtr>(raw_obj)->ptr()->value_;
       return true;
     }
     return false;
   }
-  *value = Smi::Value(reinterpret_cast<RawSmi*>(raw_obj));
+  *value = Smi::Value(static_cast<SmiPtr>(raw_obj));
   return true;
 }
 
@@ -643,21 +643,21 @@
                                   int arg_index,
                                   double* value) {
   NoSafepointScope no_safepoint_scope;
-  RawObject* raw_obj = arguments->NativeArgAt(arg_index);
+  ObjectPtr raw_obj = arguments->NativeArgAt(arg_index);
   if (raw_obj->IsHeapObject()) {
     intptr_t cid = raw_obj->GetClassId();
     if (cid == kDoubleCid) {
-      *value = reinterpret_cast<RawDouble*>(raw_obj)->ptr()->value_;
+      *value = static_cast<DoublePtr>(raw_obj)->ptr()->value_;
       return true;
     }
     if (cid == kMintCid) {
-      *value = static_cast<double>(
-          reinterpret_cast<RawMint*>(raw_obj)->ptr()->value_);
+      *value =
+          static_cast<double>(static_cast<MintPtr>(raw_obj)->ptr()->value_);
       return true;
     }
     return false;
   }
-  *value = static_cast<double>(Smi::Value(reinterpret_cast<RawSmi*>(raw_obj)));
+  *value = static_cast<double>(Smi::Value(static_cast<SmiPtr>(raw_obj)));
   return true;
 }
 
@@ -666,12 +666,12 @@
                                     int num_fields,
                                     intptr_t* field_values) {
   NoSafepointScope no_safepoint_scope;
-  RawObject* raw_obj = arguments->NativeArgAt(arg_index);
+  ObjectPtr raw_obj = arguments->NativeArgAt(arg_index);
   if (raw_obj->IsHeapObject()) {
     intptr_t cid = raw_obj->GetClassId();
     if (cid >= kNumPredefinedCids) {
-      RawTypedData* native_fields = *reinterpret_cast<RawTypedData**>(
-          RawObject::ToAddr(raw_obj) + sizeof(RawObject));
+      TypedDataPtr native_fields = *reinterpret_cast<TypedDataPtr*>(
+          ObjectLayout::ToAddr(raw_obj) + sizeof(ObjectLayout));
       if (native_fields == TypedData::null()) {
         memset(field_values, 0, (num_fields * sizeof(field_values[0])));
       } else if (num_fields == Smi::Value(native_fields->ptr()->length_)) {
@@ -865,7 +865,7 @@
     // that GC won't touch the raw error object before creating a valid
     // handle for it in the surviving zone.
     NoSafepointScope no_safepoint;
-    RawError* raw_error = Api::UnwrapErrorHandle(thread->zone(), handle).raw();
+    ErrorPtr raw_error = Api::UnwrapErrorHandle(thread->zone(), handle).raw();
     thread->UnwindScopes(thread->top_exit_frame_info());
     // Note that thread's zone is different here than at the beginning of this
     // function.
@@ -2011,7 +2011,7 @@
     const Error* error;
     {
       NoSafepointScope no_safepoint;
-      RawError* raw_error = Error::Cast(result).raw();
+      ErrorPtr raw_error = Error::Cast(result).raw();
       T->UnwindScopes(T->top_exit_frame_info());
       error = &Error::Handle(T->zone(), raw_error);
     }
@@ -2028,7 +2028,7 @@
     const Error* error;
     {
       NoSafepointScope no_safepoint;
-      RawError* raw_error = T->StealStickyError();
+      ErrorPtr raw_error = T->StealStickyError();
       T->UnwindScopes(T->top_exit_frame_info());
       error = &Error::Handle(T->zone(), raw_error);
     }
@@ -2084,7 +2084,7 @@
   }
 
   // Smis and null can be sent without serialization.
-  RawObject* raw_obj = Api::UnwrapHandle(handle);
+  ObjectPtr raw_obj = Api::UnwrapHandle(handle);
   if (ApiObjectConverter::CanConvert(raw_obj)) {
     return PortMap::PostMessage(
         Message::New(port_id, raw_obj, Message::kNormalPriority));
@@ -2471,7 +2471,7 @@
     RETURN_TYPE_ERROR(Z, function, Function);
   }
   if (func.IsNonImplicitClosureFunction()) {
-    RawFunction* parent_function = func.parent_function();
+    FunctionPtr parent_function = func.parent_function();
     return Api::NewHandle(T, parent_function);
   }
   const Class& owner = Class::Handle(Z, func.Owner());
@@ -2515,7 +2515,7 @@
 
   ASSERT(ClassFinalizer::AllClassesFinalized());
 
-  RawFunction* rf = Closure::Cast(closure_obj).function();
+  FunctionPtr rf = Closure::Cast(closure_obj).function();
   return Api::NewHandle(T, rf);
 }
 
@@ -2607,7 +2607,7 @@
   CHECK_CALLBACK_STATE(T);
   API_TIMELINE_DURATION(T);
   const String& str_obj = String::Handle(Z, String::New(str));
-  RawInteger* integer = Integer::New(str_obj);
+  IntegerPtr integer = Integer::New(str_obj);
   if (integer == Integer::null()) {
     return Api::NewError("%s: Cannot create Dart integer from string %s",
                          CURRENT_FUNC, str);
@@ -2733,7 +2733,7 @@
     return Api::NewError("function_name must refer to a static method.");
   }
 
-  if (func.kind() != RawFunction::kRegularFunction) {
+  if (func.kind() != FunctionLayout::kRegularFunction) {
     return Api::NewError(
         "function_name must be the name of a regular function.");
   }
@@ -3021,7 +3021,7 @@
   return Dart_NewListOf(Dart_CoreType_Dynamic, length);
 }
 
-static RawTypeArguments* TypeArgumentsForElementType(
+static TypeArgumentsPtr TypeArgumentsForElementType(
     ObjectStore* store,
     Dart_CoreType_Id element_type_id) {
   switch (element_type_id) {
@@ -3321,13 +3321,13 @@
   }
 }
 
-static RawObject* ResolveConstructor(const char* current_func,
-                                     const Class& cls,
-                                     const String& class_name,
-                                     const String& dotted_name,
-                                     int num_args);
+static ObjectPtr ResolveConstructor(const char* current_func,
+                                    const Class& cls,
+                                    const String& class_name,
+                                    const String& dotted_name,
+                                    int num_args);
 
-static RawObject* ThrowArgumentError(const char* exception_message) {
+static ObjectPtr ThrowArgumentError(const char* exception_message) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   // Lookup the class ArgumentError in dart:core.
@@ -3378,7 +3378,7 @@
   const Instance* saved_exception;
   {
     NoSafepointScope no_safepoint;
-    RawInstance* raw_exception = exception.raw();
+    InstancePtr raw_exception = exception.raw();
     thread->UnwindScopes(thread->top_exit_frame_info());
     saved_exception = &Instance::Handle(raw_exception);
   }
@@ -3759,9 +3759,9 @@
   return Dart_TypedData_kInvalid;
 }
 
-static RawObject* GetByteDataConstructor(Thread* thread,
-                                         const String& constructor_name,
-                                         intptr_t num_args) {
+static ObjectPtr GetByteDataConstructor(Thread* thread,
+                                        const String& constructor_name,
+                                        intptr_t num_args) {
   const Library& lib =
       Library::Handle(thread->isolate()->object_store()->typed_data_library());
   ASSERT(!lib.IsNull());
@@ -3982,10 +3982,10 @@
   return Api::Null();
 }
 
-static RawObject* GetByteBufferConstructor(Thread* thread,
-                                           const String& class_name,
-                                           const String& constructor_name,
-                                           intptr_t num_args) {
+static ObjectPtr GetByteBufferConstructor(Thread* thread,
+                                          const String& class_name,
+                                          const String& constructor_name,
+                                          intptr_t num_args) {
   const Library& lib =
       Library::Handle(thread->isolate()->object_store()->typed_data_library());
   ASSERT(!lib.IsNull());
@@ -4184,11 +4184,11 @@
 
 // ---  Invoking Constructors, Methods, and Field accessors ---
 
-static RawObject* ResolveConstructor(const char* current_func,
-                                     const Class& cls,
-                                     const String& class_name,
-                                     const String& constr_name,
-                                     int num_args) {
+static ObjectPtr ResolveConstructor(const char* current_func,
+                                    const Class& cls,
+                                    const String& class_name,
+                                    const String& constr_name,
+                                    int num_args) {
   // The constructor must be present in the interface.
   const Function& constructor =
       Function::Handle(cls.LookupFunctionAllowPrivate(constr_name));
@@ -4223,7 +4223,7 @@
         current_func, constr_name.ToCString(), error_message.ToCString()));
     return ApiError::New(message);
   }
-  RawError* error = constructor.VerifyCallEntryPoint();
+  ErrorPtr error = constructor.VerifyCallEntryPoint();
   if (error != Error::null()) return error;
   return constructor.raw();
 }
@@ -4365,7 +4365,7 @@
   return Api::NewHandle(T, new_object.raw());
 }
 
-static RawInstance* AllocateObject(Thread* thread, const Class& cls) {
+static InstancePtr AllocateObject(Thread* thread, const Class& cls) {
   if (!cls.is_fields_marked_nullable()) {
     // Mark all fields as nullable.
     Zone* zone = thread->zone();
@@ -4841,7 +4841,7 @@
   const Instance* saved_exception;
   {
     NoSafepointScope no_safepoint;
-    RawInstance* raw_exception =
+    InstancePtr raw_exception =
         Api::UnwrapInstanceHandle(zone, exception).raw();
     thread->UnwindScopes(thread->top_exit_frame_info());
     saved_exception = &Instance::Handle(raw_exception);
@@ -4879,9 +4879,9 @@
   const StackTrace* saved_stacktrace;
   {
     NoSafepointScope no_safepoint;
-    RawInstance* raw_exception =
+    InstancePtr raw_exception =
         Api::UnwrapInstanceHandle(zone, exception).raw();
-    RawStackTrace* raw_stacktrace =
+    StackTracePtr raw_stacktrace =
         Api::UnwrapStackTraceHandle(zone, stacktrace).raw();
     thread->UnwindScopes(thread->top_exit_frame_info());
     saved_exception = &Instance::Handle(raw_exception);
@@ -5242,7 +5242,7 @@
 }
 
 // --- Environment ---
-RawString* Api::GetEnvironmentValue(Thread* thread, const String& name) {
+StringPtr Api::GetEnvironmentValue(Thread* thread, const String& name) {
   String& result = String::Handle(CallEnvironmentCallback(thread, name));
   if (result.IsNull()) {
     // Every 'dart:X' library introduces an environment variable
@@ -5304,7 +5304,7 @@
   return result.raw();
 }
 
-RawString* Api::CallEnvironmentCallback(Thread* thread, const String& name) {
+StringPtr Api::CallEnvironmentCallback(Thread* thread, const String& name) {
   Isolate* isolate = thread->isolate();
   Dart_EnvironmentCallback callback = isolate->environment_callback();
   if (callback != NULL) {
@@ -5903,7 +5903,7 @@
   }
   {
     NoSafepointScope no_safepoint;
-    RawObject* raw_obj = obj.raw();
+    ObjectPtr raw_obj = obj.raw();
     *peer = thread->isolate()->heap()->GetPeer(raw_obj);
   }
   return Api::Success();
@@ -5923,7 +5923,7 @@
   }
   {
     NoSafepointScope no_safepoint;
-    RawObject* raw_obj = obj.raw();
+    ObjectPtr raw_obj = obj.raw();
     thread->isolate()->heap()->SetPeer(raw_obj, peer);
   }
   return Api::Success();
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 621f88b..80f0462 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -156,10 +156,10 @@
   };
 
   // Creates a new local handle.
-  static Dart_Handle NewHandle(Thread* thread, RawObject* raw);
+  static Dart_Handle NewHandle(Thread* thread, ObjectPtr raw);
 
   // Unwraps the raw object from the handle.
-  static RawObject* UnwrapHandle(Dart_Handle object);
+  static ObjectPtr UnwrapHandle(Dart_Handle object);
 
 // Unwraps a raw Type from the handle.  The handle will be null if
 // the object was not of the requested Type.
@@ -198,7 +198,7 @@
   static bool IsSmi(Dart_Handle handle) {
     // Important: we do not require current thread to be in VM state because
     // we do not dereference the handle.
-    RawObject* raw = *(reinterpret_cast<RawObject**>(handle));
+    ObjectPtr raw = *(reinterpret_cast<ObjectPtr*>(handle));
     return !raw->IsHeapObject();
   }
 
@@ -206,8 +206,8 @@
   static intptr_t SmiValue(Dart_Handle handle) {
     // Important: we do not require current thread to be in VM state because
     // we do not dereference the handle.
-    RawObject* value = *(reinterpret_cast<RawObject**>(handle));
-    return Smi::Value(static_cast<RawSmi*>(value));
+    ObjectPtr value = *(reinterpret_cast<ObjectPtr*>(handle));
+    return Smi::Value(static_cast<SmiPtr>(value));
   }
 
   // Returns true if the handle holds a Dart Instance.
@@ -224,7 +224,7 @@
   }
 
   static intptr_t ClassId(Dart_Handle handle) {
-    RawObject* raw = UnwrapHandle(handle);
+    ObjectPtr raw = UnwrapHandle(handle);
     if (!raw->IsHeapObject()) {
       return kSmiCid;
     }
@@ -305,7 +305,7 @@
   static void SetWeakHandleReturnValue(NativeArguments* args,
                                        Dart_WeakPersistentHandle retval);
 
-  static RawString* GetEnvironmentValue(Thread* thread, const String& name);
+  static StringPtr GetEnvironmentValue(Thread* thread, const String& name);
 
   static bool IsFfiEnabled() {
 #if defined(TAGET_OS_FUCHSIA)
@@ -316,9 +316,9 @@
   }
 
  private:
-  static Dart_Handle InitNewHandle(Thread* thread, RawObject* raw);
+  static Dart_Handle InitNewHandle(Thread* thread, ObjectPtr raw);
 
-  static RawString* CallEnvironmentCallback(Thread* thread, const String& name);
+  static StringPtr CallEnvironmentCallback(Thread* thread, const String& name);
 
   // Thread local key used by the API. Currently holds the current
   // ApiNativeScope if any.
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index c82582f..6106c7c 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -4495,7 +4495,7 @@
   // (1 + 2) * kWordSize + size of object header.
   // We check to make sure the instance size computed by the VM matches
   // our expectations.
-  intptr_t header_size = sizeof(RawObject);
+  intptr_t header_size = sizeof(ObjectLayout);
   EXPECT_EQ(
       Utils::RoundUp(((1 + 2) * kWordSize) + header_size, kObjectAlignment),
       cls.host_instance_size());
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 30e127d..639270c 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -15,7 +15,8 @@
 static const int kNumInitialReferences = 4;
 
 ApiMessageReader::ApiMessageReader(Message* msg)
-    : BaseReader(msg->IsRaw() ? reinterpret_cast<uint8_t*>(msg->raw_obj())
+    : BaseReader(msg->IsRaw() ? reinterpret_cast<uint8_t*>(
+                                    static_cast<uword>(msg->raw_obj()))
                               : msg->snapshot(),
                  msg->snapshot_length()),
       zone_(NULL),
@@ -49,8 +50,8 @@
     // Read the object out of the message.
     return ReadObject();
   } else {
-    const RawObject* raw_obj =
-        reinterpret_cast<const RawObject*>(CurrentBufferAddress());
+    const ObjectPtr raw_obj = static_cast<const ObjectPtr>(
+        reinterpret_cast<uword>(CurrentBufferAddress()));
     ASSERT(ApiObjectConverter::CanConvert(raw_obj));
     Dart_CObject* cobj =
         reinterpret_cast<Dart_CObject*>(allocator(sizeof(Dart_CObject)));
@@ -185,11 +186,11 @@
 }
 
 Dart_CObject* ApiMessageReader::AllocateDartCObjectVmIsolateObj(intptr_t id) {
-  RawObject* raw = VmIsolateSnapshotObject(id);
+  ObjectPtr raw = VmIsolateSnapshotObject(id);
   intptr_t cid = raw->GetClassId();
   switch (cid) {
     case kOneByteStringCid: {
-      RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw);
+      OneByteStringPtr raw_str = static_cast<OneByteStringPtr>(raw);
       const char* str = reinterpret_cast<const char*>(raw_str->ptr()->data());
       ASSERT(str != NULL);
       Dart_CObject* object = NULL;
@@ -207,7 +208,7 @@
     }
 
     case kMintCid: {
-      const Mint& obj = Mint::Handle(reinterpret_cast<RawMint*>(raw));
+      const Mint& obj = Mint::Handle(static_cast<MintPtr>(raw));
       int64_t value64 = obj.value();
       if ((kMinInt32 <= value64) && (value64 <= kMaxInt32)) {
         return GetCanonicalMintObject(Dart_CObject_kInt32, value64);
@@ -323,9 +324,9 @@
   return backward_references_.length() + kMaxPredefinedObjectIds;
 }
 
-Dart_CObject* ApiMessageReader::CreateDartCObjectString(RawObject* raw) {
+Dart_CObject* ApiMessageReader::CreateDartCObjectString(ObjectPtr raw) {
   ASSERT(IsOneByteStringClassId(raw->GetClassId()));
-  RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw);
+  OneByteStringPtr raw_str = static_cast<OneByteStringPtr>(raw);
   intptr_t len = Smi::Value(raw_str->ptr()->length_);
   Dart_CObject* object = AllocateDartCObjectString(len);
   char* p = object->value.as_string;
@@ -848,7 +849,7 @@
 
 void ApiMessageWriter::WriteSmi(int64_t value) {
   ASSERT(Smi::IsValid(value));
-  Write<RawObject*>(Smi::New(static_cast<intptr_t>(value)));
+  Write<ObjectPtr>(Smi::New(static_cast<intptr_t>(value)));
 }
 
 void ApiMessageWriter::WriteNullObject() {
diff --git a/runtime/vm/dart_api_message.h b/runtime/vm/dart_api_message.h
index 92a9a85..aa80031 100644
--- a/runtime/vm/dart_api_message.h
+++ b/runtime/vm/dart_api_message.h
@@ -128,11 +128,11 @@
     return reinterpret_cast<Dart_CObject_Internal*>(object);
   }
 
-  RawObject* VmIsolateSnapshotObject(intptr_t index) const {
+  ObjectPtr VmIsolateSnapshotObject(intptr_t index) const {
     return Object::vm_isolate_snapshot_object_table().At(index);
   }
 
-  Dart_CObject* CreateDartCObjectString(RawObject* raw);
+  Dart_CObject* CreateDartCObjectString(ObjectPtr raw);
   Dart_CObject* GetCanonicalMintObject(Dart_CObject_Type type, int64_t value64);
 
   uint8_t* allocator(intptr_t size) {
@@ -203,13 +203,13 @@
 // as well.
 class ApiObjectConverter : public AllStatic {
  public:
-  static bool CanConvert(const RawObject* raw_obj) {
+  static bool CanConvert(const ObjectPtr raw_obj) {
     return !raw_obj->IsHeapObject() || (raw_obj == Object::null());
   }
 
-  static bool Convert(const RawObject* raw_obj, Dart_CObject* c_obj) {
+  static bool Convert(const ObjectPtr raw_obj, Dart_CObject* c_obj) {
     if (!raw_obj->IsHeapObject()) {
-      ConvertSmi(reinterpret_cast<const RawSmi*>(raw_obj), c_obj);
+      ConvertSmi(static_cast<const SmiPtr>(raw_obj), c_obj);
     } else if (raw_obj == Object::null()) {
       ConvertNull(c_obj);
     } else {
@@ -219,7 +219,7 @@
   }
 
  private:
-  static void ConvertSmi(const RawSmi* raw_smi, Dart_CObject* c_obj) {
+  static void ConvertSmi(const SmiPtr raw_smi, Dart_CObject* c_obj) {
     ASSERT(!raw_smi->IsHeapObject());
     intptr_t value = Smi::Value(raw_smi);
     if (Utils::IsInt(31, value)) {
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index 3e48e72..a986121 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -127,8 +127,8 @@
 class LocalHandle {
  public:
   // Accessors.
-  RawObject* raw() const { return raw_; }
-  void set_raw(RawObject* raw) { raw_ = raw; }
+  ObjectPtr raw() const { return raw_; }
+  void set_raw(ObjectPtr raw) { raw_ = raw; }
   static intptr_t raw_offset() { return OFFSET_OF(LocalHandle, raw_); }
 
   Dart_Handle apiHandle() { return reinterpret_cast<Dart_Handle>(this); }
@@ -137,7 +137,7 @@
   LocalHandle() {}
   ~LocalHandle() {}
 
-  RawObject* raw_;
+  ObjectPtr raw_;
   DISALLOW_ALLOCATION();  // Allocated through AllocateHandle methods.
   DISALLOW_COPY_AND_ASSIGN(LocalHandle);
 };
@@ -151,11 +151,11 @@
 class PersistentHandle {
  public:
   // Accessors.
-  RawObject* raw() const { return raw_; }
-  void set_raw(RawObject* ref) { raw_ = ref; }
+  ObjectPtr raw() const { return raw_; }
+  void set_raw(ObjectPtr ref) { raw_ = ref; }
   void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
   void set_raw(const Object& object) { raw_ = object.raw(); }
-  RawObject** raw_addr() { return &raw_; }
+  ObjectPtr* raw_addr() { return &raw_; }
   Dart_PersistentHandle apiHandle() {
     return reinterpret_cast<Dart_PersistentHandle>(this);
   }
@@ -172,14 +172,16 @@
 
   // Overload the raw_ field as a next pointer when adding freed
   // handles to the free list.
-  PersistentHandle* Next() { return reinterpret_cast<PersistentHandle*>(raw_); }
+  PersistentHandle* Next() {
+    return reinterpret_cast<PersistentHandle*>(static_cast<uword>(raw_));
+  }
   void SetNext(PersistentHandle* free_list) {
-    raw_ = reinterpret_cast<RawObject*>(free_list);
+    raw_ = static_cast<ObjectPtr>(reinterpret_cast<uword>(free_list));
     ASSERT(!raw_->IsHeapObject());
   }
   void FreeHandle(PersistentHandle* free_list) { SetNext(free_list); }
 
-  RawObject* raw_;
+  ObjectPtr raw_;
   DISALLOW_ALLOCATION();  // Allocated through AllocateHandle methods.
   DISALLOW_COPY_AND_ASSIGN(PersistentHandle);
 };
@@ -196,8 +198,8 @@
       intptr_t external_size);
 
   // Accessors.
-  RawObject* raw() const { return raw_; }
-  RawObject** raw_addr() { return &raw_; }
+  ObjectPtr raw() const { return raw_; }
+  ObjectPtr* raw_addr() { return &raw_; }
   static intptr_t raw_offset() {
     return OFFSET_OF(FinalizablePersistentHandle, raw_);
   }
@@ -265,7 +267,7 @@
   friend class FinalizablePersistentHandles;
 
   FinalizablePersistentHandle()
-      : raw_(NULL), peer_(NULL), external_data_(0), callback_(NULL) {}
+      : raw_(nullptr), peer_(NULL), external_data_(0), callback_(NULL) {}
   ~FinalizablePersistentHandle() {}
 
   static void Finalize(IsolateGroup* isolate_group,
@@ -274,10 +276,11 @@
   // Overload the raw_ field as a next pointer when adding freed
   // handles to the free list.
   FinalizablePersistentHandle* Next() {
-    return reinterpret_cast<FinalizablePersistentHandle*>(raw_);
+    return reinterpret_cast<FinalizablePersistentHandle*>(
+        static_cast<uword>(raw_));
   }
   void SetNext(FinalizablePersistentHandle* free_list) {
-    raw_ = reinterpret_cast<RawObject*>(free_list);
+    raw_ = static_cast<ObjectPtr>(reinterpret_cast<uword>(free_list));
     ASSERT(!raw_->IsHeapObject());
   }
   void FreeHandle(FinalizablePersistentHandle* free_list) {
@@ -292,7 +295,7 @@
     callback_ = NULL;
   }
 
-  void set_raw(RawObject* raw) { raw_ = raw; }
+  void set_raw(ObjectPtr raw) { raw_ = raw; }
   void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
   void set_raw(const Object& object) { raw_ = object.raw(); }
 
@@ -327,7 +330,7 @@
     return raw_->IsSmiOrOldObject() ? Heap::kOld : Heap::kNew;
   }
 
-  RawObject* raw_;
+  ObjectPtr raw_;
   void* peer_;
   uword external_data_;
   Dart_WeakPersistentHandleFinalizer callback_;
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 88a75f6..bb992b5 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -28,10 +28,10 @@
 DECLARE_FLAG(bool, precompiled_mode);
 
 // A cache of VM heap allocated arguments descriptors.
-RawArray* ArgumentsDescriptor::cached_args_descriptors_[kCachedDescriptorCount];
+ArrayPtr ArgumentsDescriptor::cached_args_descriptors_[kCachedDescriptorCount];
 
-RawObject* DartEntry::InvokeFunction(const Function& function,
-                                     const Array& arguments) {
+ObjectPtr DartEntry::InvokeFunction(const Function& function,
+                                    const Array& arguments) {
   ASSERT(Thread::Current()->IsMutatorThread());
   const int kTypeArgsLen = 0;  // No support to pass type args to generic func.
   const Array& arguments_descriptor = Array::Handle(
@@ -99,10 +99,10 @@
   LongJumpScope* saved_long_jump_base_;
 };
 
-RawObject* DartEntry::InvokeFunction(const Function& function,
-                                     const Array& arguments,
-                                     const Array& arguments_descriptor,
-                                     uword current_sp) {
+ObjectPtr DartEntry::InvokeFunction(const Function& function,
+                                    const Array& arguments,
+                                    const Array& arguments_descriptor,
+                                    uword current_sp) {
   // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation
   // and never start the VM service isolate. So we should never end up invoking
   // any dart code in the Dart 2.0 AOT compiler.
@@ -136,7 +136,7 @@
   if (!function.HasCode()) {
     if (FLAG_enable_interpreter && function.IsBytecodeAllowed(zone)) {
       if (!function.HasBytecode()) {
-        RawError* error =
+        ErrorPtr error =
             kernel::BytecodeReader::ReadFunctionBytecode(thread, function);
         if (error != Error::null()) {
           return error;
@@ -171,11 +171,21 @@
   return InvokeCode(code, arguments_descriptor, arguments, thread);
 }
 
+extern "C" {
+// Note: The invocation stub follows the C ABI, so we cannot pass C++ struct
+// values like ObjectPtr. In some calling conventions (IA32), ObjectPtr is
+// passed/returned different from a pointer.
+typedef uword /*ObjectPtr*/ (*invokestub)(const Code& target_code,
+                                          const Array& arguments_descriptor,
+                                          const Array& arguments,
+                                          Thread* thread);
+}
+
 NO_SANITIZE_SAFE_STACK
-RawObject* DartEntry::InvokeCode(const Code& code,
-                                 const Array& arguments_descriptor,
-                                 const Array& arguments,
-                                 Thread* thread) {
+ObjectPtr DartEntry::InvokeCode(const Code& code,
+                                const Array& arguments_descriptor,
+                                const Array& arguments,
+                                Thread* thread) {
   ASSERT(!code.IsNull());
   ASSERT(thread->no_callback_scope_depth() == 0);
 
@@ -184,17 +194,18 @@
   SuspendLongJumpScope suspend_long_jump_scope(thread);
   TransitionToGenerated transition(thread);
 #if defined(USING_SIMULATOR)
-  return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call(
+  return bit_copy<ObjectPtr, int64_t>(Simulator::Current()->Call(
       reinterpret_cast<intptr_t>(entrypoint), reinterpret_cast<intptr_t>(&code),
       reinterpret_cast<intptr_t>(&arguments_descriptor),
       reinterpret_cast<intptr_t>(&arguments),
       reinterpret_cast<intptr_t>(thread)));
 #else
-  return entrypoint(code, arguments_descriptor, arguments, thread);
+  return static_cast<ObjectPtr>(
+      entrypoint(code, arguments_descriptor, arguments, thread));
 #endif
 }
 
-RawObject* DartEntry::InvokeClosure(const Array& arguments) {
+ObjectPtr DartEntry::InvokeClosure(const Array& arguments) {
   const int kTypeArgsLen = 0;  // No support to pass type args to generic func.
 
   // Closures always have boxed parameters
@@ -203,8 +214,8 @@
   return InvokeClosure(arguments, arguments_descriptor);
 }
 
-RawObject* DartEntry::InvokeClosure(const Array& arguments,
-                                    const Array& arguments_descriptor) {
+ObjectPtr DartEntry::InvokeClosure(const Array& arguments,
+                                   const Array& arguments_descriptor) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const ArgumentsDescriptor args_desc(arguments_descriptor);
@@ -269,10 +280,10 @@
                             arguments_descriptor);
 }
 
-RawObject* DartEntry::InvokeNoSuchMethod(const Instance& receiver,
-                                         const String& target_name,
-                                         const Array& arguments,
-                                         const Array& arguments_descriptor) {
+ObjectPtr DartEntry::InvokeNoSuchMethod(const Instance& receiver,
+                                        const String& target_name,
+                                        const Array& arguments,
+                                        const Array& arguments_descriptor) {
   const ArgumentsDescriptor args_desc(arguments_descriptor);
   ASSERT(receiver.raw() == arguments.At(args_desc.FirstArgIndex()));
   // Allocate an Invocation object.
@@ -340,7 +351,7 @@
   return Smi::Value(Smi::RawCast(array_.At(kPositionalCountIndex)));
 }
 
-RawString* ArgumentsDescriptor::NameAt(intptr_t index) const {
+StringPtr ArgumentsDescriptor::NameAt(intptr_t index) const {
   const intptr_t offset =
       kFirstNamedEntryIndex + (index * kNamedEntrySize) + kNameOffset;
   String& result = String::Handle();
@@ -359,7 +370,7 @@
   return NameAt(index) == other.raw();
 }
 
-RawArray* ArgumentsDescriptor::GetArgumentNames() const {
+ArrayPtr ArgumentsDescriptor::GetArgumentNames() const {
   const intptr_t num_named_args = NamedCount();
   if (num_named_args == 0) {
     return Array::null();
@@ -379,11 +390,11 @@
   return names.raw();
 }
 
-RawArray* ArgumentsDescriptor::New(intptr_t type_args_len,
-                                   intptr_t num_arguments,
-                                   intptr_t size_arguments,
-                                   const Array& optional_arguments_names,
-                                   Heap::Space space) {
+ArrayPtr ArgumentsDescriptor::New(intptr_t type_args_len,
+                                  intptr_t num_arguments,
+                                  intptr_t size_arguments,
+                                  const Array& optional_arguments_names,
+                                  Heap::Space space) {
   const intptr_t num_named_args =
       optional_arguments_names.IsNull() ? 0 : optional_arguments_names.Length();
   if (num_named_args == 0) {
@@ -453,10 +464,10 @@
   return descriptor.raw();
 }
 
-RawArray* ArgumentsDescriptor::New(intptr_t type_args_len,
-                                   intptr_t num_arguments,
-                                   intptr_t size_arguments,
-                                   Heap::Space space) {
+ArrayPtr ArgumentsDescriptor::New(intptr_t type_args_len,
+                                  intptr_t num_arguments,
+                                  intptr_t size_arguments,
+                                  Heap::Space space) {
   ASSERT(type_args_len >= 0);
   ASSERT(num_arguments >= 0);
 
@@ -468,11 +479,11 @@
                       space);
 }
 
-RawArray* ArgumentsDescriptor::NewNonCached(intptr_t type_args_len,
-                                            intptr_t num_arguments,
-                                            intptr_t size_arguments,
-                                            bool canonicalize,
-                                            Heap::Space space) {
+ArrayPtr ArgumentsDescriptor::NewNonCached(intptr_t type_args_len,
+                                           intptr_t num_arguments,
+                                           intptr_t size_arguments,
+                                           bool canonicalize,
+                                           Heap::Space space) {
   // Build the arguments descriptor array, which consists of the length of the
   // type argument vector, total argument count; the positional argument count;
   // and a terminating null to simplify iterating in generated code.
@@ -526,10 +537,10 @@
   }
 }
 
-RawObject* DartLibraryCalls::InstanceCreate(const Library& lib,
-                                            const String& class_name,
-                                            const String& constructor_name,
-                                            const Array& arguments) {
+ObjectPtr DartLibraryCalls::InstanceCreate(const Library& lib,
+                                           const String& class_name,
+                                           const String& constructor_name,
+                                           const Array& arguments) {
   const Class& cls = Class::Handle(lib.LookupClassAllowPrivate(class_name));
   ASSERT(!cls.IsNull());
   // For now, we only support a non-parameterized or raw type.
@@ -558,7 +569,7 @@
   return exception_object.raw();
 }
 
-RawObject* DartLibraryCalls::ToString(const Instance& receiver) {
+ObjectPtr DartLibraryCalls::ToString(const Instance& receiver) {
   const int kTypeArgsLen = 0;
   const int kNumArguments = 1;  // Receiver.
   ArgumentsDescriptor args_desc(Array::Handle(
@@ -574,7 +585,7 @@
   return result.raw();
 }
 
-RawObject* DartLibraryCalls::HashCode(const Instance& receiver) {
+ObjectPtr DartLibraryCalls::HashCode(const Instance& receiver) {
   const int kTypeArgsLen = 0;
   const int kNumArguments = 1;  // Receiver.
   ArgumentsDescriptor args_desc(Array::Handle(
@@ -590,8 +601,8 @@
   return result.raw();
 }
 
-RawObject* DartLibraryCalls::Equals(const Instance& left,
-                                    const Instance& right) {
+ObjectPtr DartLibraryCalls::Equals(const Instance& left,
+                                   const Instance& right) {
   const int kTypeArgsLen = 0;
   const int kNumArguments = 2;
   ArgumentsDescriptor args_desc(Array::Handle(
@@ -610,7 +621,7 @@
 }
 
 // On success, returns a RawInstance.  On failure, a RawError.
-RawObject* DartLibraryCalls::IdentityHashCode(const Instance& object) {
+ObjectPtr DartLibraryCalls::IdentityHashCode(const Instance& object) {
   const int kNumArguments = 1;
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -627,7 +638,7 @@
   return result.raw();
 }
 
-RawObject* DartLibraryCalls::LookupHandler(Dart_Port port_id) {
+ObjectPtr DartLibraryCalls::LookupHandler(Dart_Port port_id) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Function& function = Function::Handle(
@@ -654,8 +665,8 @@
   return result.raw();
 }
 
-RawObject* DartLibraryCalls::HandleMessage(const Object& handler,
-                                           const Instance& message) {
+ObjectPtr DartLibraryCalls::HandleMessage(const Object& handler,
+                                          const Instance& message) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -693,7 +704,7 @@
   return result.raw();
 }
 
-RawObject* DartLibraryCalls::DrainMicrotaskQueue() {
+ObjectPtr DartLibraryCalls::DrainMicrotaskQueue() {
   Zone* zone = Thread::Current()->zone();
   Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary());
   ASSERT(!isolate_lib.IsNull());
@@ -706,7 +717,7 @@
   return result.raw();
 }
 
-RawObject* DartLibraryCalls::EnsureScheduleImmediate() {
+ObjectPtr DartLibraryCalls::EnsureScheduleImmediate() {
   Zone* zone = Thread::Current()->zone();
   const Library& async_lib = Library::Handle(zone, Library::AsyncLibrary());
   ASSERT(!async_lib.IsNull());
@@ -720,9 +731,9 @@
   return result.raw();
 }
 
-RawObject* DartLibraryCalls::MapSetAt(const Instance& map,
-                                      const Instance& key,
-                                      const Instance& value) {
+ObjectPtr DartLibraryCalls::MapSetAt(const Instance& map,
+                                     const Instance& key,
+                                     const Instance& value) {
   const int kTypeArgsLen = 0;
   const int kNumArguments = 3;
   ArgumentsDescriptor args_desc(Array::Handle(
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index e93c991..9ab0115 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -20,10 +20,6 @@
 class Integer;
 class Library;
 class Object;
-class RawArray;
-class RawInstance;
-class RawObject;
-class RawString;
 class String;
 
 // An arguments descriptor array consists of the type argument vector length (0
@@ -45,11 +41,11 @@
   intptr_t SizeWithTypeArgs() const { return FirstArgIndex() + Size(); }
   intptr_t PositionalCount() const;  // Excluding type arguments vector.
   intptr_t NamedCount() const { return Count() - PositionalCount(); }
-  RawString* NameAt(intptr_t i) const;
+  StringPtr NameAt(intptr_t i) const;
   intptr_t PositionAt(intptr_t i) const;
   bool MatchesNameAt(intptr_t i, const String& other) const;
   // Returns array of argument names in the arguments order.
-  RawArray* GetArgumentNames() const;
+  ArrayPtr GetArgumentNames() const;
 
   // Generated code support.
   static intptr_t type_args_len_offset() {
@@ -78,10 +74,10 @@
   // Right now this is for example the case for all closure functions.
   // Functions marked as entry-points may also be created by NewUnboxed because
   // we rely that TFA will mark the arguments as nullable for such cases.
-  static RawArray* NewBoxed(intptr_t type_args_len,
-                            intptr_t num_arguments,
-                            const Array& optional_arguments_names,
-                            Heap::Space space = Heap::kOld) {
+  static ArrayPtr NewBoxed(intptr_t type_args_len,
+                           intptr_t num_arguments,
+                           const Array& optional_arguments_names,
+                           Heap::Space space = Heap::kOld) {
     return New(type_args_len, num_arguments, num_arguments,
                optional_arguments_names, space);
   }
@@ -91,19 +87,19 @@
   // positional and the remaining ones are named optional arguments.
   // The presence of a type argument vector as first argument (not counted in
   // num_arguments) is indicated by a non-zero type_args_len.
-  static RawArray* New(intptr_t type_args_len,
-                       intptr_t num_arguments,
-                       intptr_t size_arguments,
-                       const Array& optional_arguments_names,
-                       Heap::Space space = Heap::kOld);
+  static ArrayPtr New(intptr_t type_args_len,
+                      intptr_t num_arguments,
+                      intptr_t size_arguments,
+                      const Array& optional_arguments_names,
+                      Heap::Space space = Heap::kOld);
 
   // Constructs an argument descriptor where all arguments are boxed and
   // therefore number of parameters equals parameter size.
   //
   // Right now this is for example the case for all closure functions.
-  static RawArray* NewBoxed(intptr_t type_args_len,
-                            intptr_t num_arguments,
-                            Heap::Space space = Heap::kOld) {
+  static ArrayPtr NewBoxed(intptr_t type_args_len,
+                           intptr_t num_arguments,
+                           Heap::Space space = Heap::kOld) {
     return New(type_args_len, num_arguments, num_arguments, space);
   }
 
@@ -111,10 +107,10 @@
   // arguments. All arguments are positional. The presence of a type argument
   // vector as first argument (not counted in num_arguments) is indicated
   // by a non-zero type_args_len.
-  static RawArray* New(intptr_t type_args_len,
-                       intptr_t num_arguments,
-                       intptr_t size_arguments,
-                       Heap::Space space = Heap::kOld);
+  static ArrayPtr New(intptr_t type_args_len,
+                      intptr_t num_arguments,
+                      intptr_t size_arguments,
+                      Heap::Space space = Heap::kOld);
 
   // Initialize the preallocated fixed length arguments descriptors cache.
   static void Init();
@@ -152,11 +148,11 @@
     return kFirstNamedEntryIndex + (kNamedEntrySize * num_named_arguments) + 1;
   }
 
-  static RawArray* NewNonCached(intptr_t type_args_len,
-                                intptr_t num_arguments,
-                                intptr_t size_arguments,
-                                bool canonicalize,
-                                Heap::Space space);
+  static ArrayPtr NewNonCached(intptr_t type_args_len,
+                               intptr_t num_arguments,
+                               intptr_t size_arguments,
+                               bool canonicalize,
+                               Heap::Space space);
 
   // Used by Simulator to parse argument descriptors.
   static intptr_t name_index(intptr_t index) {
@@ -170,7 +166,7 @@
   const Array& array_;
 
   // A cache of VM heap allocated arguments descriptors.
-  static RawArray* cached_args_descriptors_[kCachedDescriptorCount];
+  static ArrayPtr cached_args_descriptors_[kCachedDescriptorCount];
 
   friend class SnapshotReader;
   friend class SnapshotWriter;
@@ -187,30 +183,24 @@
 // and invoke them from C++.
 class DartEntry : public AllStatic {
  public:
-  // On success, returns a RawInstance.  On failure, a RawError.
-  typedef RawObject* (*invokestub)(const Code& target_code,
-                                   const Array& arguments_descriptor,
-                                   const Array& arguments,
-                                   Thread* thread);
-
   // Invokes the specified instance function or static function.
   // The first argument of an instance function is the receiver.
   // On success, returns a RawInstance.  On failure, a RawError.
   // This is used when there is no type argument vector and
   // no named arguments in the call.
-  static RawObject* InvokeFunction(const Function& function,
-                                   const Array& arguments);
+  static ObjectPtr InvokeFunction(const Function& function,
+                                  const Array& arguments);
 
   // Invokes the specified code as if it was a Dart function.
   // On success, returns a RawInstance.  On failure, a RawError.
-  static RawObject* InvokeCode(const Code& code,
-                               const Array& arguments_descriptor,
-                               const Array& arguments,
-                               Thread* thread);
+  static ObjectPtr InvokeCode(const Code& code,
+                              const Array& arguments_descriptor,
+                              const Array& arguments,
+                              Thread* thread);
 
   // Invokes the specified instance, static, or closure function.
   // On success, returns a RawInstance.  On failure, a RawError.
-  static RawObject* InvokeFunction(
+  static ObjectPtr InvokeFunction(
       const Function& function,
       const Array& arguments,
       const Array& arguments_descriptor,
@@ -220,19 +210,19 @@
   // On success, returns a RawInstance.  On failure, a RawError.
   // This is used when there is no type argument vector and
   // no named arguments in the call.
-  static RawObject* InvokeClosure(const Array& arguments);
+  static ObjectPtr InvokeClosure(const Array& arguments);
 
   // Invokes the closure object given as the first argument.
   // On success, returns a RawInstance.  On failure, a RawError.
-  static RawObject* InvokeClosure(const Array& arguments,
-                                  const Array& arguments_descriptor);
+  static ObjectPtr InvokeClosure(const Array& arguments,
+                                 const Array& arguments_descriptor);
 
   // Invokes the noSuchMethod instance function on the receiver.
   // On success, returns a RawInstance.  On failure, a RawError.
-  static RawObject* InvokeNoSuchMethod(const Instance& receiver,
-                                       const String& target_name,
-                                       const Array& arguments,
-                                       const Array& arguments_descriptor);
+  static ObjectPtr InvokeNoSuchMethod(const Instance& receiver,
+                                      const String& target_name,
+                                      const Array& arguments,
+                                      const Array& arguments_descriptor);
 };
 
 // Utility functions to call from VM into Dart bootstrap libraries.
@@ -240,44 +230,44 @@
 class DartLibraryCalls : public AllStatic {
  public:
   // On success, returns a RawInstance.  On failure, a RawError.
-  static RawObject* InstanceCreate(const Library& library,
-                                   const String& exception_name,
-                                   const String& constructor_name,
-                                   const Array& arguments);
+  static ObjectPtr InstanceCreate(const Library& library,
+                                  const String& exception_name,
+                                  const String& constructor_name,
+                                  const Array& arguments);
 
   // On success, returns a RawInstance.  On failure, a RawError.
-  static RawObject* ToString(const Instance& receiver);
+  static ObjectPtr ToString(const Instance& receiver);
 
   // On success, returns a RawInstance.  On failure, a RawError.
-  static RawObject* HashCode(const Instance& receiver);
+  static ObjectPtr HashCode(const Instance& receiver);
 
   // On success, returns a RawInstance.  On failure, a RawError.
-  static RawObject* Equals(const Instance& left, const Instance& right);
+  static ObjectPtr Equals(const Instance& left, const Instance& right);
 
   // On success, returns a RawInstance.  On failure, a RawError.
-  static RawObject* IdentityHashCode(const Instance& object);
+  static ObjectPtr IdentityHashCode(const Instance& object);
 
   // Returns the handler if one has been registered for this port id.
-  static RawObject* LookupHandler(Dart_Port port_id);
+  static ObjectPtr LookupHandler(Dart_Port port_id);
 
   // Returns null on success, a RawError on failure.
-  static RawObject* HandleMessage(const Object& handler,
-                                  const Instance& dart_message);
+  static ObjectPtr HandleMessage(const Object& handler,
+                                 const Instance& dart_message);
 
   // Returns null on success, a RawError on failure.
-  static RawObject* DrainMicrotaskQueue();
+  static ObjectPtr DrainMicrotaskQueue();
 
   // Ensures that the isolate's _pendingImmediateCallback is set to
   // _startMicrotaskLoop from dart:async.
   // Returns null on success, a RawError on failure.
-  static RawObject* EnsureScheduleImmediate();
+  static ObjectPtr EnsureScheduleImmediate();
 
   // map[key] = value;
   //
   // Returns null on success, a RawError on failure.
-  static RawObject* MapSetAt(const Instance& map,
-                             const Instance& key,
-                             const Instance& value);
+  static ObjectPtr MapSetAt(const Instance& map,
+                            const Instance& key,
+                            const Instance& value);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index adb3591..0050f4f 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -150,13 +150,13 @@
 }
 
 void Breakpoint::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&closure_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&closure_));
 }
 
 void BreakpointLocation::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&script_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&url_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&function_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&script_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&url_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&function_));
 
   Breakpoint* bpt = conditions_;
   while (bpt != NULL) {
@@ -183,9 +183,9 @@
 }
 
 void CodeBreakpoint::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&code_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&bytecode_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&saved_value_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&code_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&bytecode_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&saved_value_));
 }
 
 ActivationFrame::ActivationFrame(uword pc,
@@ -333,15 +333,15 @@
   Service::HandleEvent(event);
 }
 
-RawError* Debugger::PauseInterrupted() {
+ErrorPtr Debugger::PauseInterrupted() {
   return PauseRequest(ServiceEvent::kPauseInterrupted);
 }
 
-RawError* Debugger::PausePostRequest() {
+ErrorPtr Debugger::PausePostRequest() {
   return PauseRequest(ServiceEvent::kPausePostRequest);
 }
 
-RawError* Debugger::PauseRequest(ServiceEvent::EventKind kind) {
+ErrorPtr Debugger::PauseRequest(ServiceEvent::EventKind kind) {
   if (ignore_breakpoints_ || IsPaused()) {
     // We don't let the isolate get interrupted if we are already
     // paused or ignoring breakpoints.
@@ -361,7 +361,7 @@
 
   // If any error occurred while in the debug message loop, return it here.
   NoSafepointScope no_safepoint;
-  RawError* error = Thread::Current()->StealStickyError();
+  ErrorPtr error = Thread::Current()->StealStickyError();
   ASSERT((error == Error::null()) || error->IsUnwindError());
   return error;
 }
@@ -464,14 +464,14 @@
 
 static bool IsImplicitFunction(const Function& func) {
   switch (func.kind()) {
-    case RawFunction::kImplicitGetter:
-    case RawFunction::kImplicitSetter:
-    case RawFunction::kImplicitStaticGetter:
-    case RawFunction::kFieldInitializer:
-    case RawFunction::kMethodExtractor:
-    case RawFunction::kNoSuchMethodDispatcher:
-    case RawFunction::kInvokeFieldDispatcher:
-    case RawFunction::kIrregexpFunction:
+    case FunctionLayout::kImplicitGetter:
+    case FunctionLayout::kImplicitSetter:
+    case FunctionLayout::kImplicitStaticGetter:
+    case FunctionLayout::kFieldInitializer:
+    case FunctionLayout::kMethodExtractor:
+    case FunctionLayout::kNoSuchMethodDispatcher:
+    case FunctionLayout::kInvokeFieldDispatcher:
+    case FunctionLayout::kIrregexpFunction:
       return true;
     default:
       if (func.token_pos() == func.end_token_pos()) {
@@ -610,20 +610,20 @@
   return IsCalleeFrameOf(other_fp, fp()) ? kCallee : kCaller;
 }
 
-RawString* ActivationFrame::QualifiedFunctionName() {
+StringPtr ActivationFrame::QualifiedFunctionName() {
   return String::New(Debugger::QualifiedFunctionName(function()));
 }
 
-RawString* ActivationFrame::SourceUrl() {
+StringPtr ActivationFrame::SourceUrl() {
   const Script& script = Script::Handle(SourceScript());
   return script.url();
 }
 
-RawScript* ActivationFrame::SourceScript() {
+ScriptPtr ActivationFrame::SourceScript() {
   return function().script();
 }
 
-RawLibrary* ActivationFrame::Library() {
+LibraryPtr ActivationFrame::Library() {
   const Class& cls = Class::Handle(function().origin());
   return cls.library();
 }
@@ -648,7 +648,7 @@
     }
     token_pos_ = TokenPosition::kNoSource;
     GetPcDescriptors();
-    PcDescriptors::Iterator iter(pc_desc_, RawPcDescriptors::kAnyKind);
+    PcDescriptors::Iterator iter(pc_desc_, PcDescriptorsLayout::kAnyKind);
     const uword pc_offset = pc_ - code().PayloadStart();
     while (iter.MoveNext()) {
       if (iter.PcOffset() == pc_offset) {
@@ -806,10 +806,10 @@
       intptr_t var_desc_len = var_descriptors_.Length();
       bool found = false;
       for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) {
-        RawLocalVarDescriptors::VarInfo var_info;
+        LocalVarDescriptorsLayout::VarInfo var_info;
         var_descriptors_.GetInfo(cur_idx, &var_info);
         const int8_t kind = var_info.kind();
-        if ((kind == RawLocalVarDescriptors::kContextLevel) &&
+        if ((kind == LocalVarDescriptorsLayout::kContextLevel) &&
             (deopt_id >= var_info.begin_pos.value()) &&
             (deopt_id <= var_info.end_pos.value())) {
           context_level_ = var_info.index();
@@ -826,7 +826,7 @@
   return context_level_;
 }
 
-RawObject* ActivationFrame::GetAsyncContextVariable(const String& name) {
+ObjectPtr ActivationFrame::GetAsyncContextVariable(const String& name) {
   if (!function_.IsAsyncClosure() && !function_.IsAsyncGenClosure()) {
     return Object::null();
   }
@@ -835,18 +835,18 @@
   intptr_t ctxt_slot = -1;
   intptr_t var_desc_len = var_descriptors_.Length();
   for (intptr_t i = 0; i < var_desc_len; i++) {
-    RawLocalVarDescriptors::VarInfo var_info;
+    LocalVarDescriptorsLayout::VarInfo var_info;
     var_descriptors_.GetInfo(i, &var_info);
     if (var_descriptors_.GetName(i) == name.raw()) {
       const int8_t kind = var_info.kind();
       if (!live_frame_) {
-        ASSERT(kind == RawLocalVarDescriptors::kContextVar);
+        ASSERT(kind == LocalVarDescriptorsLayout::kContextVar);
       }
       const auto variable_index = VariableIndex(var_info.index());
-      if (kind == RawLocalVarDescriptors::kStackVar) {
+      if (kind == LocalVarDescriptorsLayout::kStackVar) {
         return GetStackVar(variable_index);
       } else {
-        ASSERT(kind == RawLocalVarDescriptors::kContextVar);
+        ASSERT(kind == LocalVarDescriptorsLayout::kContextVar);
         // Variable descriptors constructed from bytecode have all variables of
         // enclosing functions, even shadowed by the current function.
         // Pick the variable with the highest context level.
@@ -873,11 +873,11 @@
   return Object::null();
 }
 
-RawObject* ActivationFrame::GetAsyncCompleter() {
+ObjectPtr ActivationFrame::GetAsyncCompleter() {
   return GetAsyncContextVariable(Symbols::AsyncCompleter());
 }
 
-RawObject* ActivationFrame::GetAsyncCompleterAwaiter(const Object& completer) {
+ObjectPtr ActivationFrame::GetAsyncCompleterAwaiter(const Object& completer) {
   DEBUG_ASSERT(Thread::Current()->TopErrorHandlerIsExitFrame());
 
   Object& future = Object::Handle();
@@ -904,11 +904,11 @@
   return Instance::Cast(future).GetField(awaiter_field);
 }
 
-RawObject* ActivationFrame::GetAsyncStreamControllerStream() {
+ObjectPtr ActivationFrame::GetAsyncStreamControllerStream() {
   return GetAsyncContextVariable(Symbols::ControllerStream());
 }
 
-RawObject* ActivationFrame::GetAsyncStreamControllerStreamAwaiter(
+ObjectPtr ActivationFrame::GetAsyncStreamControllerStreamAwaiter(
     const Object& stream) {
   const Class& stream_cls = Class::Handle(stream.clazz());
   ASSERT(!stream_cls.IsNull());
@@ -919,7 +919,7 @@
   return Instance::Cast(stream).GetField(awaiter_field);
 }
 
-RawObject* ActivationFrame::GetAsyncAwaiter() {
+ObjectPtr ActivationFrame::GetAsyncAwaiter() {
   const Object& async_stream_controller_stream =
       Object::Handle(GetAsyncStreamControllerStream());
   if (!async_stream_controller_stream.IsNull()) {
@@ -933,7 +933,7 @@
   return Object::null();
 }
 
-RawObject* ActivationFrame::GetCausalStack() {
+ObjectPtr ActivationFrame::GetCausalStack() {
   return GetAsyncContextVariable(Symbols::AsyncStackTraceVar());
 }
 
@@ -992,11 +992,11 @@
   intptr_t var_desc_len = var_descriptors_.Length();
   intptr_t await_jump_var = -1;
   for (intptr_t i = 0; i < var_desc_len; i++) {
-    RawLocalVarDescriptors::VarInfo var_info;
+    LocalVarDescriptorsLayout::VarInfo var_info;
     var_descriptors_.GetInfo(i, &var_info);
     const int8_t kind = var_info.kind();
     if (var_descriptors_.GetName(i) == Symbols::AwaitJumpVar().raw()) {
-      ASSERT(kind == RawLocalVarDescriptors::kContextVar);
+      ASSERT(kind == LocalVarDescriptorsLayout::kContextVar);
       ASSERT(!ctx_.IsNull());
       // Variable descriptors constructed from bytecode have all variables of
       // enclosing functions, even shadowed by the current function.
@@ -1065,7 +1065,7 @@
   const auto& pc_descriptors =
       PcDescriptors::Handle(zone, code().pc_descriptors());
   ASSERT(!pc_descriptors.IsNull());
-  PcDescriptors::Iterator it(pc_descriptors, RawPcDescriptors::kOther);
+  PcDescriptors::Iterator it(pc_descriptors, PcDescriptorsLayout::kOther);
   while (it.MoveNext()) {
     if (it.YieldIndex() == await_jump_var) {
       try_index_ = it.TryIndex();
@@ -1101,10 +1101,10 @@
   intptr_t var_desc_len = var_descriptors_.Length();
   Object& obj = Object::Handle();
   for (intptr_t i = 0; i < var_desc_len; i++) {
-    RawLocalVarDescriptors::VarInfo var_info;
+    LocalVarDescriptorsLayout::VarInfo var_info;
     var_descriptors_.GetInfo(i, &var_info);
     const int8_t kind = var_info.kind();
-    if (kind == RawLocalVarDescriptors::kSavedCurrentContext) {
+    if (kind == LocalVarDescriptorsLayout::kSavedCurrentContext) {
       if (FLAG_trace_debugger_stacktrace) {
         OS::PrintErr("\tFound saved current ctx at index %d\n",
                      var_info.index());
@@ -1128,7 +1128,7 @@
   return ctx_;
 }
 
-RawObject* ActivationFrame::GetAsyncOperation() {
+ObjectPtr ActivationFrame::GetAsyncOperation() {
   if (function().name() == Symbols::AsyncOperation().raw()) {
     return GetParameter(0);
   }
@@ -1168,16 +1168,16 @@
   intptr_t var_desc_len = var_descriptors_.Length();
   for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) {
     ASSERT(var_names.length() == desc_indices_.length());
-    RawLocalVarDescriptors::VarInfo var_info;
+    LocalVarDescriptorsLayout::VarInfo var_info;
     var_descriptors_.GetInfo(cur_idx, &var_info);
     const int8_t kind = var_info.kind();
-    if ((kind != RawLocalVarDescriptors::kStackVar) &&
-        (kind != RawLocalVarDescriptors::kContextVar)) {
+    if ((kind != LocalVarDescriptorsLayout::kStackVar) &&
+        (kind != LocalVarDescriptorsLayout::kContextVar)) {
       continue;
     }
     if ((var_info.begin_pos <= activation_token_pos) &&
         (activation_token_pos <= var_info.end_pos)) {
-      if ((kind == RawLocalVarDescriptors::kContextVar) &&
+      if ((kind == LocalVarDescriptorsLayout::kContextVar) &&
           (ContextLevel() < var_info.scope_id)) {
         // The variable is textually in scope but the context level
         // at the activation frame's PC is lower than the context
@@ -1198,7 +1198,7 @@
           // Found two local variables with the same name. Now determine
           // which one is shadowed.
           name_match_found = true;
-          RawLocalVarDescriptors::VarInfo i_var_info;
+          LocalVarDescriptorsLayout::VarInfo i_var_info;
           var_descriptors_.GetInfo(desc_indices_[i], &i_var_info);
           if (i_var_info.begin_pos < var_info.begin_pos) {
             // The variable we found earlier is in an outer scope
@@ -1230,12 +1230,12 @@
   return desc_indices_.length();
 }
 
-DART_FORCE_INLINE static RawObject* GetVariableValue(uword addr) {
-  return *reinterpret_cast<RawObject**>(addr);
+DART_FORCE_INLINE static ObjectPtr GetVariableValue(uword addr) {
+  return *reinterpret_cast<ObjectPtr*>(addr);
 }
 
 // Caution: GetParameter only works for fixed parameters.
-RawObject* ActivationFrame::GetParameter(intptr_t index) {
+ObjectPtr ActivationFrame::GetParameter(intptr_t index) {
   intptr_t num_parameters = function().num_fixed_parameters();
   ASSERT(0 <= index && index < num_parameters);
 
@@ -1264,12 +1264,12 @@
   }
 }
 
-RawObject* ActivationFrame::GetClosure() {
+ObjectPtr ActivationFrame::GetClosure() {
   ASSERT(function().IsClosureFunction());
   return GetParameter(0);
 }
 
-RawObject* ActivationFrame::GetStackVar(VariableIndex variable_index) {
+ObjectPtr ActivationFrame::GetStackVar(VariableIndex variable_index) {
   if (IsInterpreted()) {
     intptr_t slot_index = -variable_index.value();
     if (slot_index < 0) {
@@ -1364,7 +1364,7 @@
 
   *name = var_descriptors_.GetName(desc_index);
 
-  RawLocalVarDescriptors::VarInfo var_info;
+  LocalVarDescriptorsLayout::VarInfo var_info;
   var_descriptors_.GetInfo(desc_index, &var_info);
   ASSERT(declaration_token_pos != NULL);
   *declaration_token_pos = var_info.declaration_pos;
@@ -1375,25 +1375,25 @@
   ASSERT(value != NULL);
   const int8_t kind = var_info.kind();
   const auto variable_index = VariableIndex(var_info.index());
-  if (kind == RawLocalVarDescriptors::kStackVar) {
+  if (kind == LocalVarDescriptorsLayout::kStackVar) {
     *value = GetStackVar(variable_index);
   } else {
-    ASSERT(kind == RawLocalVarDescriptors::kContextVar);
+    ASSERT(kind == LocalVarDescriptorsLayout::kContextVar);
     *value = GetContextVar(var_info.scope_id, variable_index.value());
   }
 }
 
-RawObject* ActivationFrame::GetContextVar(intptr_t var_ctx_level,
-                                          intptr_t ctx_slot) {
+ObjectPtr ActivationFrame::GetContextVar(intptr_t var_ctx_level,
+                                         intptr_t ctx_slot) {
   // The context level at the PC/token index of this activation frame.
   intptr_t frame_ctx_level = ContextLevel();
 
   return GetRelativeContextVar(var_ctx_level, ctx_slot, frame_ctx_level);
 }
 
-RawObject* ActivationFrame::GetRelativeContextVar(intptr_t var_ctx_level,
-                                                  intptr_t ctx_slot,
-                                                  intptr_t frame_ctx_level) {
+ObjectPtr ActivationFrame::GetRelativeContextVar(intptr_t var_ctx_level,
+                                                 intptr_t ctx_slot,
+                                                 intptr_t frame_ctx_level) {
   const Context& ctx = GetSavedCurrentContext();
 
   // It's possible that ctx was optimized out as no locals were captured by the
@@ -1428,7 +1428,7 @@
   }
 }
 
-RawArray* ActivationFrame::GetLocalVariables() {
+ArrayPtr ActivationFrame::GetLocalVariables() {
   GetDescIndices();
   intptr_t num_variables = desc_indices_.length();
   String& var_name = String::Handle();
@@ -1443,7 +1443,7 @@
   return list.raw();
 }
 
-RawObject* ActivationFrame::GetReceiver() {
+ObjectPtr ActivationFrame::GetReceiver() {
   GetDescIndices();
   intptr_t num_variables = desc_indices_.length();
   String& var_name = String::Handle();
@@ -1466,7 +1466,7 @@
   return (var_name.Length() >= 1) && (var_name.CharAt(0) == '_');
 }
 
-RawObject* ActivationFrame::EvaluateCompiledExpression(
+ObjectPtr ActivationFrame::EvaluateCompiledExpression(
     const ExternalTypedData& kernel_buffer,
     const Array& type_definitions,
     const Array& arguments,
@@ -1488,7 +1488,7 @@
   }
 }
 
-RawTypeArguments* ActivationFrame::BuildParameters(
+TypeArgumentsPtr ActivationFrame::BuildParameters(
     const GrowableObjectArray& param_names,
     const GrowableObjectArray& param_values,
     const GrowableObjectArray& type_params_names) {
@@ -1720,14 +1720,14 @@
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-const uint8_t kSafepointKind = RawPcDescriptors::kIcCall |
-                               RawPcDescriptors::kUnoptStaticCall |
-                               RawPcDescriptors::kRuntimeCall;
+const uint8_t kSafepointKind = PcDescriptorsLayout::kIcCall |
+                               PcDescriptorsLayout::kUnoptStaticCall |
+                               PcDescriptorsLayout::kRuntimeCall;
 
 CodeBreakpoint::CodeBreakpoint(const Code& code,
                                TokenPosition token_pos,
                                uword pc,
-                               RawPcDescriptors::Kind kind)
+                               PcDescriptorsLayout::Kind kind)
     : code_(code.raw()),
       bytecode_(Bytecode::null()),
       token_pos_(token_pos),
@@ -1755,7 +1755,7 @@
       is_enabled_(false),
       bpt_location_(NULL),
       next_(NULL),
-      breakpoint_kind_(RawPcDescriptors::kAnyKind),
+      breakpoint_kind_(PcDescriptorsLayout::kAnyKind),
       saved_value_(Code::null()) {
   ASSERT(!bytecode.IsNull());
   ASSERT(FLAG_enable_interpreter);
@@ -1773,11 +1773,11 @@
   pc_ = 0ul;
   bpt_location_ = NULL;
   next_ = NULL;
-  breakpoint_kind_ = RawPcDescriptors::kOther;
+  breakpoint_kind_ = PcDescriptorsLayout::kOther;
 #endif
 }
 
-RawFunction* CodeBreakpoint::function() const {
+FunctionPtr CodeBreakpoint::function() const {
   if (IsInterpreted()) {
     ASSERT(Bytecode::Handle(bytecode_).function() != Function::null());
     return Bytecode::Handle(bytecode_).function();
@@ -1786,12 +1786,12 @@
   }
 }
 
-RawScript* CodeBreakpoint::SourceCode() {
+ScriptPtr CodeBreakpoint::SourceCode() {
   const Function& func = Function::Handle(this->function());
   return func.script();
 }
 
-RawString* CodeBreakpoint::SourceUrl() {
+StringPtr CodeBreakpoint::SourceUrl() {
   const Script& script = Script::Handle(SourceCode());
   return script.url();
 }
@@ -2086,9 +2086,9 @@
   return activation;
 }
 
-RawArray* Debugger::DeoptimizeToArray(Thread* thread,
-                                      StackFrame* frame,
-                                      const Code& code) {
+ArrayPtr Debugger::DeoptimizeToArray(Thread* thread,
+                                     StackFrame* frame,
+                                     const Code& code) {
   ASSERT(code.is_optimized() && !code.is_force_optimized());
   Isolate* isolate = thread->isolate();
   // Create the DeoptContext for this deoptimization.
@@ -3236,7 +3236,7 @@
     ASSERT(!code.IsNull());
     PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
     uword lowest_pc_offset = kUwordMax;
-    RawPcDescriptors::Kind lowest_kind = RawPcDescriptors::kAnyKind;
+    PcDescriptorsLayout::Kind lowest_kind = PcDescriptorsLayout::kAnyKind;
     // Find the safe point with the lowest compiled code address
     // that maps to the token position of the source breakpoint.
     PcDescriptors::Iterator iter(desc, kSafepointKind);
@@ -3877,7 +3877,7 @@
     cbpt->VisitObjectPointers(visitor);
     cbpt = cbpt->next();
   }
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&top_frame_awaiter_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&top_frame_awaiter_));
 }
 
 void Debugger::Pause(ServiceEvent* event) {
@@ -4140,12 +4140,12 @@
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   PcDescriptors::Iterator iter(
-      descriptors, RawPcDescriptors::kRewind | RawPcDescriptors::kIcCall |
-                       RawPcDescriptors::kUnoptStaticCall);
+      descriptors, PcDescriptorsLayout::kRewind | PcDescriptorsLayout::kIcCall |
+                       PcDescriptorsLayout::kUnoptStaticCall);
   intptr_t rewind_deopt_id = -1;
   uword rewind_pc = 0;
   while (iter.MoveNext()) {
-    if (iter.Kind() == RawPcDescriptors::kRewind) {
+    if (iter.Kind() == PcDescriptorsLayout::kRewind) {
       // Remember the last rewind so we don't need to iterator twice.
       rewind_pc = code.PayloadStart() + iter.PcOffset();
       rewind_deopt_id = iter.DeoptId();
@@ -4435,10 +4435,10 @@
       return false;
     }
     const TokenPosition looking_for = top_frame->TokenPos();
-    PcDescriptors::Iterator it(pc_descriptors, RawPcDescriptors::kOther);
+    PcDescriptors::Iterator it(pc_descriptors, PcDescriptorsLayout::kOther);
     while (it.MoveNext()) {
       if (it.TokenPos() == looking_for &&
-          it.YieldIndex() != RawPcDescriptors::kInvalidYieldIndex) {
+          it.YieldIndex() != PcDescriptorsLayout::kInvalidYieldIndex) {
         return true;
       }
     }
@@ -4446,7 +4446,7 @@
   return false;
 }
 
-RawError* Debugger::PauseStepping() {
+ErrorPtr Debugger::PauseStepping() {
   ASSERT(isolate_->single_step());
   // Don't pause recursively.
   if (IsPaused()) {
@@ -4562,7 +4562,7 @@
   return Thread::Current()->StealStickyError();
 }
 
-RawError* Debugger::PauseBreakpoint() {
+ErrorPtr Debugger::PauseBreakpoint() {
   // We ignore this breakpoint when the VM is executing code invoked
   // by the debugger to evaluate variables values, or when we see a nested
   // breakpoint or exception event.
@@ -4717,8 +4717,8 @@
 
 // Return innermost closure contained in 'function' that contains
 // the given token position.
-RawFunction* Debugger::FindInnermostClosure(const Function& function,
-                                            TokenPosition token_pos) {
+FunctionPtr Debugger::FindInnermostClosure(const Function& function,
+                                           TokenPosition token_pos) {
   Zone* zone = Thread::Current()->zone();
   const Script& outer_origin = Script::Handle(zone, function.script());
   const GrowableObjectArray& closures = GrowableObjectArray::Handle(
@@ -5015,7 +5015,7 @@
   return NULL;
 }
 
-RawCode* Debugger::GetPatchedStubAddress(uword breakpoint_address) {
+CodePtr Debugger::GetPatchedStubAddress(uword breakpoint_address) {
   CodeBreakpoint* cbpt = GetCodeBreakpoint(breakpoint_address);
   if (cbpt != NULL) {
     return cbpt->OrigStubAddress();
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 9536669..2a5bd90 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -58,7 +58,7 @@
   bool IsRepeated() const { return kind_ == kRepeated; }
   bool IsSingleShot() const { return kind_ == kSingleShot; }
   bool IsPerClosure() const { return kind_ == kPerClosure; }
-  RawInstance* closure() const { return closure_; }
+  InstancePtr closure() const { return closure_; }
 
   void SetIsRepeated() {
     ASSERT(kind_ == kNone);
@@ -97,7 +97,7 @@
   intptr_t id_;
   ConditionKind kind_;
   Breakpoint* next_;
-  RawInstance* closure_;
+  InstancePtr closure_;
   BreakpointLocation* bpt_location_;
   bool is_synthetic_async_;
 
@@ -131,12 +131,12 @@
 
   ~BreakpointLocation();
 
-  RawFunction* function() const { return function_; }
+  FunctionPtr function() const { return function_; }
   TokenPosition token_pos() const { return token_pos_; }
   TokenPosition end_token_pos() const { return end_token_pos_; }
 
-  RawScript* script() const { return script_; }
-  RawString* url() const { return url_; }
+  ScriptPtr script() const { return script_; }
+  StringPtr url() const { return url_; }
 
   intptr_t requested_line_number() const { return requested_line_number_; }
   intptr_t requested_column_number() const { return requested_column_number_; }
@@ -174,8 +174,8 @@
   Breakpoint* breakpoints() const { return this->conditions_; }
   void set_breakpoints(Breakpoint* head) { this->conditions_ = head; }
 
-  RawScript* script_;
-  RawString* url_;
+  ScriptPtr script_;
+  StringPtr url_;
   TokenPosition token_pos_;
   TokenPosition end_token_pos_;
   BreakpointLocation* next_;
@@ -184,7 +184,7 @@
   intptr_t requested_column_number_;
 
   // Valid for resolved breakpoints:
-  RawFunction* function_;
+  FunctionPtr function_;
   TokenPosition bytecode_token_pos_;
   TokenPosition code_token_pos_;
 
@@ -200,16 +200,16 @@
   CodeBreakpoint(const Code& code,
                  TokenPosition token_pos,
                  uword pc,
-                 RawPcDescriptors::Kind kind);
+                 PcDescriptorsLayout::Kind kind);
   CodeBreakpoint(const Bytecode& bytecode, TokenPosition token_pos, uword pc);
   ~CodeBreakpoint();
 
-  RawFunction* function() const;
+  FunctionPtr function() const;
   uword pc() const { return pc_; }
   TokenPosition token_pos() const { return token_pos_; }
 
-  RawScript* SourceCode();
-  RawString* SourceUrl();
+  ScriptPtr SourceCode();
+  StringPtr SourceUrl();
   intptr_t LineNumber();
 
   void Enable();
@@ -217,7 +217,7 @@
   bool IsEnabled() const { return is_enabled_; }
   bool IsInterpreted() const { return bytecode_ != Bytecode::null(); }
 
-  RawCode* OrigStubAddress() const;
+  CodePtr OrigStubAddress() const;
 
  private:
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
@@ -233,8 +233,8 @@
   void SetBytecodeBreakpoint();
   void UnsetBytecodeBreakpoint();
 
-  RawCode* code_;
-  RawBytecode* bytecode_;
+  CodePtr code_;
+  BytecodePtr bytecode_;
   TokenPosition token_pos_;
   uword pc_;
   intptr_t line_number_;
@@ -243,8 +243,8 @@
   BreakpointLocation* bpt_location_;
   CodeBreakpoint* next_;
 
-  RawPcDescriptors::Kind breakpoint_kind_;
-  RawCode* saved_value_;
+  PcDescriptorsLayout::Kind breakpoint_kind_;
+  CodePtr saved_value_;
 
   friend class Debugger;
   DISALLOW_COPY_AND_ASSIGN(CodeBreakpoint);
@@ -309,10 +309,10 @@
 
   Relation CompareTo(uword other_fp, bool other_is_interpreted) const;
 
-  RawString* QualifiedFunctionName();
-  RawString* SourceUrl();
-  RawScript* SourceScript();
-  RawLibrary* Library();
+  StringPtr QualifiedFunctionName();
+  StringPtr SourceUrl();
+  ScriptPtr SourceScript();
+  LibraryPtr Library();
   TokenPosition TokenPos();
   intptr_t LineNumber();
   intptr_t ColumnNumber();
@@ -340,28 +340,28 @@
                   TokenPosition* visible_end_token_pos,
                   Object* value);
 
-  RawArray* GetLocalVariables();
-  RawObject* GetParameter(intptr_t index);
-  RawObject* GetClosure();
-  RawObject* GetReceiver();
+  ArrayPtr GetLocalVariables();
+  ObjectPtr GetParameter(intptr_t index);
+  ObjectPtr GetClosure();
+  ObjectPtr GetReceiver();
 
   const Context& GetSavedCurrentContext();
-  RawObject* GetAsyncOperation();
+  ObjectPtr GetAsyncOperation();
 
-  RawTypeArguments* BuildParameters(
+  TypeArgumentsPtr BuildParameters(
       const GrowableObjectArray& param_names,
       const GrowableObjectArray& param_values,
       const GrowableObjectArray& type_params_names);
 
-  RawObject* EvaluateCompiledExpression(const ExternalTypedData& kernel_data,
-                                        const Array& arguments,
-                                        const Array& type_definitions,
-                                        const TypeArguments& type_arguments);
+  ObjectPtr EvaluateCompiledExpression(const ExternalTypedData& kernel_data,
+                                       const Array& arguments,
+                                       const Array& type_definitions,
+                                       const TypeArguments& type_arguments);
 
   void PrintToJSONObject(JSONObject* jsobj);
 
-  RawObject* GetAsyncAwaiter();
-  RawObject* GetCausalStack();
+  ObjectPtr GetAsyncAwaiter();
+  ObjectPtr GetCausalStack();
 
   bool HandlesException(const Instance& exc_obj);
 
@@ -381,11 +381,11 @@
   void GetVarDescriptors();
   void GetDescIndices();
 
-  RawObject* GetAsyncContextVariable(const String& name);
-  RawObject* GetAsyncStreamControllerStreamAwaiter(const Object& stream);
-  RawObject* GetAsyncStreamControllerStream();
-  RawObject* GetAsyncCompleterAwaiter(const Object& completer);
-  RawObject* GetAsyncCompleter();
+  ObjectPtr GetAsyncContextVariable(const String& name);
+  ObjectPtr GetAsyncStreamControllerStreamAwaiter(const Object& stream);
+  ObjectPtr GetAsyncStreamControllerStream();
+  ObjectPtr GetAsyncCompleterAwaiter(const Object& completer);
+  ObjectPtr GetAsyncCompleter();
   intptr_t GetAwaitJumpVariable();
   void ExtractTokenPositionFromAsyncClosure();
 
@@ -407,11 +407,11 @@
     }
   }
 
-  RawObject* GetStackVar(VariableIndex var_index);
-  RawObject* GetRelativeContextVar(intptr_t ctxt_level,
-                                   intptr_t slot_index,
-                                   intptr_t frame_ctx_level);
-  RawObject* GetContextVar(intptr_t ctxt_level, intptr_t slot_index);
+  ObjectPtr GetStackVar(VariableIndex var_index);
+  ObjectPtr GetRelativeContextVar(intptr_t ctxt_level,
+                                  intptr_t slot_index,
+                                  intptr_t frame_ctx_level);
+  ObjectPtr GetContextVar(intptr_t ctxt_level, intptr_t slot_index);
 
   uword pc_;
   uword fp_;
@@ -602,16 +602,16 @@
   static const char* QualifiedFunctionName(const Function& func);
 
   // Pause execution for a breakpoint.  Called from generated code.
-  RawError* PauseBreakpoint();
+  ErrorPtr PauseBreakpoint();
 
   // Pause execution due to stepping.  Called from generated code.
-  RawError* PauseStepping();
+  ErrorPtr PauseStepping();
 
   // Pause execution due to isolate interrupt.
-  RawError* PauseInterrupted();
+  ErrorPtr PauseInterrupted();
 
   // Pause after a reload request.
-  RawError* PausePostRequest();
+  ErrorPtr PausePostRequest();
 
   // Pause execution due to an uncaught exception.
   void PauseException(const Instance& exc);
@@ -620,7 +620,7 @@
   // Dart.
   void PauseDeveloper(const String& msg);
 
-  RawCode* GetPatchedStubAddress(uword breakpoint_address);
+  CodePtr GetPatchedStubAddress(uword breakpoint_address);
 
   void PrintBreakpointsToJSONArray(JSONArray* jsarr) const;
   void PrintSettingsToJSONObject(JSONObject* jsobj) const;
@@ -636,7 +636,7 @@
   static DebuggerStackTrace* CollectAwaiterReturnStackTrace();
 
  private:
-  RawError* PauseRequest(ServiceEvent::EventKind kind);
+  ErrorPtr PauseRequest(ServiceEvent::EventKind kind);
 
   // Finds the breakpoint we hit at |location|.
   Breakpoint* FindHitBreakpoint(BreakpointLocation* location,
@@ -661,8 +661,8 @@
                    TokenPosition token_pos,
                    TokenPosition last_token_pos,
                    Function* best_fit);
-  RawFunction* FindInnermostClosure(const Function& function,
-                                    TokenPosition token_pos);
+  FunctionPtr FindInnermostClosure(const Function& function,
+                                   TokenPosition token_pos);
   TokenPosition ResolveBreakpointPos(bool in_bytecode,
                                      const Function& func,
                                      TokenPosition requested_token_pos,
@@ -728,9 +728,9 @@
       StackFrame* frame,
       const Bytecode& bytecode,
       ActivationFrame::Kind kind = ActivationFrame::kRegular);
-  static RawArray* DeoptimizeToArray(Thread* thread,
-                                     StackFrame* frame,
-                                     const Code& code);
+  static ArrayPtr DeoptimizeToArray(Thread* thread,
+                                    StackFrame* frame,
+                                    const Code& code);
   TokenPosition FindExactTokenPosition(const Script& script,
                                        TokenPosition start_of_line,
                                        intptr_t column_number);
@@ -828,7 +828,7 @@
   // Used to track the current async/async* function.
   uword async_stepping_fp_;
   bool interpreted_async_stepping_;
-  RawObject* top_frame_awaiter_;
+  ObjectPtr top_frame_awaiter_;
 
   // If we step while at a breakpoint, we would hit the same pc twice.
   // We use this field to let us skip the next single-step after a
diff --git a/runtime/vm/debugger_arm.cc b/runtime/vm/debugger_arm.cc
index 15d95ba..9862592 100644
--- a/runtime/vm/debugger_arm.cc
+++ b/runtime/vm/debugger_arm.cc
@@ -15,7 +15,7 @@
 
 #ifndef PRODUCT
 
-RawCode* CodeBreakpoint::OrigStubAddress() const {
+CodePtr CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
 
@@ -23,13 +23,13 @@
   ASSERT(!is_enabled_);
   Code& stub_target = Code::Handle();
   switch (breakpoint_kind_) {
-    case RawPcDescriptors::kIcCall:
+    case PcDescriptorsLayout::kIcCall:
       stub_target = StubCode::ICCallBreakpoint().raw();
       break;
-    case RawPcDescriptors::kUnoptStaticCall:
+    case PcDescriptorsLayout::kUnoptStaticCall:
       stub_target = StubCode::UnoptStaticCallBreakpoint().raw();
       break;
-    case RawPcDescriptors::kRuntimeCall:
+    case PcDescriptorsLayout::kRuntimeCall:
       stub_target = StubCode::RuntimeCallBreakpoint().raw();
       break;
     default:
@@ -45,9 +45,9 @@
   ASSERT(is_enabled_);
   const Code& code = Code::Handle(code_);
   switch (breakpoint_kind_) {
-    case RawPcDescriptors::kIcCall:
-    case RawPcDescriptors::kUnoptStaticCall:
-    case RawPcDescriptors::kRuntimeCall: {
+    case PcDescriptorsLayout::kIcCall:
+    case PcDescriptorsLayout::kUnoptStaticCall:
+    case PcDescriptorsLayout::kRuntimeCall: {
       CodePatcher::PatchStaticCallAt(pc_, code, Code::Handle(saved_value_));
       break;
     }
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
index e9748ca..dc132f8 100644
--- a/runtime/vm/debugger_arm64.cc
+++ b/runtime/vm/debugger_arm64.cc
@@ -15,7 +15,7 @@
 
 #ifndef PRODUCT
 
-RawCode* CodeBreakpoint::OrigStubAddress() const {
+CodePtr CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
 
@@ -23,20 +23,20 @@
   ASSERT(!is_enabled_);
   const Code& code = Code::Handle(code_);
   switch (breakpoint_kind_) {
-    case RawPcDescriptors::kIcCall: {
+    case PcDescriptorsLayout::kIcCall: {
       Object& data = Object::Handle();
       saved_value_ = CodePatcher::GetInstanceCallAt(pc_, code, &data);
       CodePatcher::PatchInstanceCallAt(pc_, code, data,
                                        StubCode::ICCallBreakpoint());
       break;
     }
-    case RawPcDescriptors::kUnoptStaticCall: {
+    case PcDescriptorsLayout::kUnoptStaticCall: {
       saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
       CodePatcher::PatchPoolPointerCallAt(
           pc_, code, StubCode::UnoptStaticCallBreakpoint());
       break;
     }
-    case RawPcDescriptors::kRuntimeCall: {
+    case PcDescriptorsLayout::kRuntimeCall: {
       saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
       CodePatcher::PatchPoolPointerCallAt(pc_, code,
                                           StubCode::RuntimeCallBreakpoint());
@@ -52,15 +52,15 @@
   ASSERT(is_enabled_);
   const Code& code = Code::Handle(code_);
   switch (breakpoint_kind_) {
-    case RawPcDescriptors::kIcCall: {
+    case PcDescriptorsLayout::kIcCall: {
       Object& data = Object::Handle();
       CodePatcher::GetInstanceCallAt(pc_, code, &data);
       CodePatcher::PatchInstanceCallAt(pc_, code, data,
                                        Code::Handle(saved_value_));
       break;
     }
-    case RawPcDescriptors::kUnoptStaticCall:
-    case RawPcDescriptors::kRuntimeCall: {
+    case PcDescriptorsLayout::kUnoptStaticCall:
+    case PcDescriptorsLayout::kRuntimeCall: {
       CodePatcher::PatchPoolPointerCallAt(pc_, code,
                                           Code::Handle(saved_value_));
       break;
diff --git a/runtime/vm/debugger_ia32.cc b/runtime/vm/debugger_ia32.cc
index 8b1eb8a..d580561 100644
--- a/runtime/vm/debugger_ia32.cc
+++ b/runtime/vm/debugger_ia32.cc
@@ -19,7 +19,7 @@
 
 #ifndef PRODUCT
 
-RawCode* CodeBreakpoint::OrigStubAddress() const {
+CodePtr CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
 
@@ -33,15 +33,15 @@
   thread->isolate_group()->RunWithStoppedMutators([&]() {
     WritableInstructionsScope writable(instrs.PayloadStart(), instrs.Size());
     switch (breakpoint_kind_) {
-      case RawPcDescriptors::kIcCall: {
+      case PcDescriptorsLayout::kIcCall: {
         stub_target = StubCode::ICCallBreakpoint().raw();
         break;
       }
-      case RawPcDescriptors::kUnoptStaticCall: {
+      case PcDescriptorsLayout::kUnoptStaticCall: {
         stub_target = StubCode::UnoptStaticCallBreakpoint().raw();
         break;
       }
-      case RawPcDescriptors::kRuntimeCall: {
+      case PcDescriptorsLayout::kRuntimeCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         stub_target = StubCode::RuntimeCallBreakpoint().raw();
         break;
@@ -64,9 +64,9 @@
   thread->isolate_group()->RunWithStoppedMutators([&]() {
     WritableInstructionsScope writable(instrs.PayloadStart(), instrs.Size());
     switch (breakpoint_kind_) {
-      case RawPcDescriptors::kIcCall:
-      case RawPcDescriptors::kUnoptStaticCall:
-      case RawPcDescriptors::kRuntimeCall: {
+      case PcDescriptorsLayout::kIcCall:
+      case PcDescriptorsLayout::kUnoptStaticCall:
+      case PcDescriptorsLayout::kRuntimeCall: {
         CodePatcher::PatchStaticCallAt(pc_, code, Code::Handle(saved_value_));
         break;
       }
diff --git a/runtime/vm/debugger_x64.cc b/runtime/vm/debugger_x64.cc
index 3cd1810..dfb07df 100644
--- a/runtime/vm/debugger_x64.cc
+++ b/runtime/vm/debugger_x64.cc
@@ -16,7 +16,7 @@
 
 #ifndef PRODUCT
 
-RawCode* CodeBreakpoint::OrigStubAddress() const {
+CodePtr CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
 
@@ -24,13 +24,13 @@
   ASSERT(!is_enabled_);
   Code& stub_target = Code::Handle();
   switch (breakpoint_kind_) {
-    case RawPcDescriptors::kIcCall:
+    case PcDescriptorsLayout::kIcCall:
       stub_target = StubCode::ICCallBreakpoint().raw();
       break;
-    case RawPcDescriptors::kUnoptStaticCall:
+    case PcDescriptorsLayout::kUnoptStaticCall:
       stub_target = StubCode::UnoptStaticCallBreakpoint().raw();
       break;
-    case RawPcDescriptors::kRuntimeCall:
+    case PcDescriptorsLayout::kRuntimeCall:
       stub_target = StubCode::RuntimeCallBreakpoint().raw();
       break;
     default:
@@ -46,9 +46,9 @@
   ASSERT(is_enabled_);
   const Code& code = Code::Handle(code_);
   switch (breakpoint_kind_) {
-    case RawPcDescriptors::kIcCall:
-    case RawPcDescriptors::kUnoptStaticCall:
-    case RawPcDescriptors::kRuntimeCall: {
+    case PcDescriptorsLayout::kIcCall:
+    case PcDescriptorsLayout::kUnoptStaticCall:
+    case PcDescriptorsLayout::kRuntimeCall: {
       CodePatcher::PatchPoolPointerCallAt(pc_, code,
                                           Code::Handle(saved_value_));
       break;
diff --git a/runtime/vm/deferred_objects.cc b/runtime/vm/deferred_objects.cc
index 2072c77..8e4b4c8 100644
--- a/runtime/vm/deferred_objects.cc
+++ b/runtime/vm/deferred_objects.cc
@@ -18,7 +18,7 @@
 DECLARE_FLAG(bool, trace_deoptimization_verbose);
 
 void DeferredDouble::Materialize(DeoptContext* deopt_context) {
-  RawDouble** double_slot = reinterpret_cast<RawDouble**>(slot());
+  DoublePtr* double_slot = reinterpret_cast<DoublePtr*>(slot());
   *double_slot = Double::New(value());
 
   if (FLAG_trace_deoptimization_verbose) {
@@ -28,7 +28,7 @@
 }
 
 void DeferredMint::Materialize(DeoptContext* deopt_context) {
-  RawMint** mint_slot = reinterpret_cast<RawMint**>(slot());
+  MintPtr* mint_slot = reinterpret_cast<MintPtr*>(slot());
   ASSERT(!Smi::IsValid(value()));
   Mint& mint = Mint::Handle();
   mint ^= Integer::New(value());
@@ -41,43 +41,43 @@
 }
 
 void DeferredFloat32x4::Materialize(DeoptContext* deopt_context) {
-  RawFloat32x4** float32x4_slot = reinterpret_cast<RawFloat32x4**>(slot());
-  RawFloat32x4* raw_float32x4 = Float32x4::New(value());
+  Float32x4Ptr* float32x4_slot = reinterpret_cast<Float32x4Ptr*>(slot());
+  Float32x4Ptr raw_float32x4 = Float32x4::New(value());
   *float32x4_slot = raw_float32x4;
 
   if (FLAG_trace_deoptimization_verbose) {
-    float x = raw_float32x4->x();
-    float y = raw_float32x4->y();
-    float z = raw_float32x4->z();
-    float w = raw_float32x4->w();
+    float x = raw_float32x4->ptr()->x();
+    float y = raw_float32x4->ptr()->y();
+    float z = raw_float32x4->ptr()->z();
+    float w = raw_float32x4->ptr()->w();
     OS::PrintErr("materializing Float32x4 at %" Px ": %g,%g,%g,%g\n",
                  reinterpret_cast<uword>(slot()), x, y, z, w);
   }
 }
 
 void DeferredFloat64x2::Materialize(DeoptContext* deopt_context) {
-  RawFloat64x2** float64x2_slot = reinterpret_cast<RawFloat64x2**>(slot());
-  RawFloat64x2* raw_float64x2 = Float64x2::New(value());
+  Float64x2Ptr* float64x2_slot = reinterpret_cast<Float64x2Ptr*>(slot());
+  Float64x2Ptr raw_float64x2 = Float64x2::New(value());
   *float64x2_slot = raw_float64x2;
 
   if (FLAG_trace_deoptimization_verbose) {
-    double x = raw_float64x2->x();
-    double y = raw_float64x2->y();
+    double x = raw_float64x2->ptr()->x();
+    double y = raw_float64x2->ptr()->y();
     OS::PrintErr("materializing Float64x2 at %" Px ": %g,%g\n",
                  reinterpret_cast<uword>(slot()), x, y);
   }
 }
 
 void DeferredInt32x4::Materialize(DeoptContext* deopt_context) {
-  RawInt32x4** int32x4_slot = reinterpret_cast<RawInt32x4**>(slot());
-  RawInt32x4* raw_int32x4 = Int32x4::New(value());
+  Int32x4Ptr* int32x4_slot = reinterpret_cast<Int32x4Ptr*>(slot());
+  Int32x4Ptr raw_int32x4 = Int32x4::New(value());
   *int32x4_slot = raw_int32x4;
 
   if (FLAG_trace_deoptimization_verbose) {
-    uint32_t x = raw_int32x4->x();
-    uint32_t y = raw_int32x4->y();
-    uint32_t z = raw_int32x4->z();
-    uint32_t w = raw_int32x4->w();
+    uint32_t x = raw_int32x4->ptr()->x();
+    uint32_t y = raw_int32x4->ptr()->y();
+    uint32_t z = raw_int32x4->ptr()->z();
+    uint32_t w = raw_int32x4->ptr()->w();
     OS::PrintErr("materializing Int32x4 at %" Px ": %x,%x,%x,%x\n",
                  reinterpret_cast<uword>(slot()), x, y, z, w);
   }
@@ -107,7 +107,7 @@
   const Code& code = Code::Handle(zone, function.unoptimized_code());
 
   uword continue_at_pc =
-      code.GetPcForDeoptId(deopt_id_, RawPcDescriptors::kDeopt);
+      code.GetPcForDeoptId(deopt_id_, PcDescriptorsLayout::kDeopt);
   if (continue_at_pc == 0) {
     FATAL2("Can't locate continuation PC for deoptid %" Pd " within %s\n",
            deopt_id_, function.ToFullyQualifiedCString());
@@ -120,7 +120,7 @@
                  reinterpret_cast<uword>(slot()), continue_at_pc);
   }
 
-  uword pc = code.GetPcForDeoptId(deopt_id_, RawPcDescriptors::kIcCall);
+  uword pc = code.GetPcForDeoptId(deopt_id_, PcDescriptorsLayout::kIcCall);
   if (pc != 0) {
     // If the deoptimization happened at an IC call, update the IC data
     // to avoid repeated deoptimization at the same site next time around.
@@ -160,7 +160,7 @@
   const Code& code = Code::Handle(zone, function.unoptimized_code());
   ASSERT(!code.IsNull());
   ASSERT(function.HasCode());
-  *reinterpret_cast<RawObject**>(dest_addr) = code.raw();
+  *reinterpret_cast<ObjectPtr*>(dest_addr) = code.raw();
 
   if (FLAG_trace_deoptimization_verbose) {
     THR_Print("materializing pc marker at 0x%" Px ": %s, %s\n",
@@ -205,11 +205,11 @@
   if (FLAG_trace_deoptimization_verbose) {
     OS::PrintErr("materializing pp at 0x%" Px ": 0x%" Px "\n",
                  reinterpret_cast<uword>(slot()),
-                 reinterpret_cast<uword>(code.GetObjectPool()));
+                 static_cast<uword>(code.GetObjectPool()));
   }
 }
 
-RawObject* DeferredObject::object() {
+ObjectPtr DeferredObject::object() {
   if (object_ == NULL) {
     Create();
   }
diff --git a/runtime/vm/deferred_objects.h b/runtime/vm/deferred_objects.h
index a46be13..f50c09a 100644
--- a/runtime/vm/deferred_objects.h
+++ b/runtime/vm/deferred_objects.h
@@ -6,13 +6,12 @@
 #define RUNTIME_VM_DEFERRED_OBJECTS_H_
 
 #include "platform/globals.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
 // Forward declarations.
 class Object;
-class RawObject;
-class RawObject;
 class DeoptContext;
 
 // Used by the deoptimization infrastructure to defer allocation of
@@ -21,17 +20,17 @@
 // the materialized object.
 class DeferredSlot {
  public:
-  DeferredSlot(RawObject** slot, DeferredSlot* next)
+  DeferredSlot(ObjectPtr* slot, DeferredSlot* next)
       : slot_(slot), next_(next) {}
   virtual ~DeferredSlot() {}
 
-  RawObject** slot() const { return slot_; }
+  ObjectPtr* slot() const { return slot_; }
   DeferredSlot* next() const { return next_; }
 
   virtual void Materialize(DeoptContext* deopt_context) = 0;
 
  private:
-  RawObject** const slot_;
+  ObjectPtr* const slot_;
   DeferredSlot* const next_;
 
   DISALLOW_COPY_AND_ASSIGN(DeferredSlot);
@@ -39,7 +38,7 @@
 
 class DeferredDouble : public DeferredSlot {
  public:
-  DeferredDouble(double value, RawObject** slot, DeferredSlot* next)
+  DeferredDouble(double value, ObjectPtr* slot, DeferredSlot* next)
       : DeferredSlot(slot, next), value_(value) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
@@ -54,7 +53,7 @@
 
 class DeferredMint : public DeferredSlot {
  public:
-  DeferredMint(int64_t value, RawObject** slot, DeferredSlot* next)
+  DeferredMint(int64_t value, ObjectPtr* slot, DeferredSlot* next)
       : DeferredSlot(slot, next), value_(value) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
@@ -69,7 +68,7 @@
 
 class DeferredFloat32x4 : public DeferredSlot {
  public:
-  DeferredFloat32x4(simd128_value_t value, RawObject** slot, DeferredSlot* next)
+  DeferredFloat32x4(simd128_value_t value, ObjectPtr* slot, DeferredSlot* next)
       : DeferredSlot(slot, next), value_(value) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
@@ -84,7 +83,7 @@
 
 class DeferredFloat64x2 : public DeferredSlot {
  public:
-  DeferredFloat64x2(simd128_value_t value, RawObject** slot, DeferredSlot* next)
+  DeferredFloat64x2(simd128_value_t value, ObjectPtr* slot, DeferredSlot* next)
       : DeferredSlot(slot, next), value_(value) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
@@ -99,7 +98,7 @@
 
 class DeferredInt32x4 : public DeferredSlot {
  public:
-  DeferredInt32x4(simd128_value_t value, RawObject** slot, DeferredSlot* next)
+  DeferredInt32x4(simd128_value_t value, ObjectPtr* slot, DeferredSlot* next)
       : DeferredSlot(slot, next), value_(value) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
@@ -117,7 +116,7 @@
 // Object itself is described and materialized by DeferredObject.
 class DeferredObjectRef : public DeferredSlot {
  public:
-  DeferredObjectRef(intptr_t index, RawObject** slot, DeferredSlot* next)
+  DeferredObjectRef(intptr_t index, ObjectPtr* slot, DeferredSlot* next)
       : DeferredSlot(slot, next), index_(index) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
@@ -134,7 +133,7 @@
  public:
   DeferredRetAddr(intptr_t index,
                   intptr_t deopt_id,
-                  RawObject** slot,
+                  ObjectPtr* slot,
                   DeferredSlot* next)
       : DeferredSlot(slot, next), index_(index), deopt_id_(deopt_id) {}
 
@@ -151,7 +150,7 @@
 
 class DeferredPcMarker : public DeferredSlot {
  public:
-  DeferredPcMarker(intptr_t index, RawObject** slot, DeferredSlot* next)
+  DeferredPcMarker(intptr_t index, ObjectPtr* slot, DeferredSlot* next)
       : DeferredSlot(slot, next), index_(index) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
@@ -166,7 +165,7 @@
 
 class DeferredPp : public DeferredSlot {
  public:
-  DeferredPp(intptr_t index, RawObject** slot, DeferredSlot* next)
+  DeferredPp(intptr_t index, ObjectPtr* slot, DeferredSlot* next)
       : DeferredSlot(slot, next), index_(index) {}
 
   virtual void Materialize(DeoptContext* deopt_context);
@@ -187,14 +186,14 @@
  public:
   DeferredObject(intptr_t field_count, intptr_t* args)
       : field_count_(field_count),
-        args_(reinterpret_cast<RawObject**>(args)),
+        args_(reinterpret_cast<ObjectPtr*>(args)),
         object_(NULL) {}
 
   intptr_t ArgumentCount() const {
     return kFieldsStartIndex + kFieldEntrySize * field_count_;
   }
 
-  RawObject* object();
+  ObjectPtr object();
 
   // Fill object with actual field values.
   void Fill();
@@ -218,19 +217,17 @@
   // a graph which can contain cycles.
   void Create();
 
-  RawObject* GetArg(intptr_t index) const {
-    return args_[index];
-  }
+  ObjectPtr GetArg(intptr_t index) const { return args_[index]; }
 
-  RawObject* GetClass() const { return GetArg(kClassIndex); }
+  ObjectPtr GetClass() const { return GetArg(kClassIndex); }
 
-  RawObject* GetLength() const { return GetArg(kLengthIndex); }
+  ObjectPtr GetLength() const { return GetArg(kLengthIndex); }
 
-  RawObject* GetFieldOffset(intptr_t index) const {
+  ObjectPtr GetFieldOffset(intptr_t index) const {
     return GetArg(kFieldsStartIndex + kFieldEntrySize * index + kOffsetIndex);
   }
 
-  RawObject* GetValue(intptr_t index) const {
+  ObjectPtr GetValue(intptr_t index) const {
     return GetArg(kFieldsStartIndex + kFieldEntrySize * index + kValueIndex);
   }
 
@@ -240,7 +237,7 @@
   // Pointer to the first materialization argument on the stack.
   // The first argument is Class of the instance to materialize followed by
   // Field, value pairs.
-  RawObject** args_;
+  ObjectPtr* args_;
 
   // Object materialized from this description.
   const Object* object_;
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 3057977..360929b 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -179,15 +179,15 @@
 }
 
 void DeoptContext::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&code_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&object_pool_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&deopt_info_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&code_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&object_pool_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&deopt_info_));
 
   // Visit any object pointers on the destination stack.
   if (dest_frame_is_allocated_) {
     for (intptr_t i = 0; i < dest_frame_size_; i++) {
       if (dest_frame_[i] != 0) {
-        visitor->VisitPointer(reinterpret_cast<RawObject**>(&dest_frame_[i]));
+        visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&dest_frame_[i]));
       }
     }
   }
@@ -301,7 +301,7 @@
     if (!objects_only || IsObjectInstruction(instr->kind())) {
       instr->Execute(this, to_addr);
     } else {
-      *reinterpret_cast<RawObject**>(to_addr) = Object::null();
+      *reinterpret_cast<ObjectPtr*>(to_addr) = Object::null();
     }
   }
 
@@ -397,12 +397,12 @@
   return deopt_arg_count;
 }
 
-RawArray* DeoptContext::DestFrameAsArray() {
+ArrayPtr DeoptContext::DestFrameAsArray() {
   ASSERT(dest_frame_ != NULL && dest_frame_is_allocated_);
   const Array& dest_array = Array::Handle(zone(), Array::New(dest_frame_size_));
   PassiveObject& obj = PassiveObject::Handle(zone());
   for (intptr_t i = 0; i < dest_frame_size_; i++) {
-    obj = reinterpret_cast<RawObject*>(dest_frame_[i]);
+    obj = static_cast<ObjectPtr>(dest_frame_[i]);
     dest_array.SetAt(i, obj);
   }
   return dest_array.raw();
@@ -475,7 +475,7 @@
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     const PassiveObject& obj = PassiveObject::Handle(
         deopt_context->zone(), deopt_context->ObjectAt(object_table_index_));
-    *reinterpret_cast<RawObject**>(dest_addr) = obj.raw();
+    *reinterpret_cast<ObjectPtr*>(dest_addr) = obj.raw();
   }
 
   CatchEntryMove ToCatchEntryMove(DeoptContext* deopt_context,
@@ -534,7 +534,7 @@
     } else {
       *dest_addr = Smi::RawValue(0);
       deopt_context->DeferMintMaterialization(
-          value, reinterpret_cast<RawMint**>(dest_addr));
+          value, reinterpret_cast<MintPtr*>(dest_addr));
     }
   }
 
@@ -653,7 +653,7 @@
     *dest_addr = Smi::RawValue(0);
     deopt_context->DeferMaterialization(
         source_.Value<Type>(deopt_context),
-        reinterpret_cast<RawObjectType**>(dest_addr));
+        reinterpret_cast<RawObjectType*>(dest_addr));
   }
 
   CatchEntryMove ToCatchEntryMove(DeoptContext* deopt_context,
@@ -671,24 +671,24 @@
 typedef DeoptFpuInstr<DeoptInstr::kDouble,
                       CatchEntryMove::SourceKind::kDoubleSlot,
                       double,
-                      RawDouble>
+                      DoublePtr>
     DeoptDoubleInstr;
 
 // Simd128 types.
 typedef DeoptFpuInstr<DeoptInstr::kFloat32x4,
                       CatchEntryMove::SourceKind::kFloat32x4Slot,
                       simd128_value_t,
-                      RawFloat32x4>
+                      Float32x4Ptr>
     DeoptFloat32x4Instr;
 typedef DeoptFpuInstr<DeoptInstr::kFloat64x2,
                       CatchEntryMove::SourceKind::kFloat64x2Slot,
                       simd128_value_t,
-                      RawFloat64x2>
+                      Float64x2Ptr>
     DeoptFloat64x2Instr;
 typedef DeoptFpuInstr<DeoptInstr::kInt32x4,
                       CatchEntryMove::SourceKind::kInt32x4Slot,
                       simd128_value_t,
-                      RawInt32x4>
+                      Int32x4Ptr>
     DeoptInt32x4Instr;
 
 // Deoptimization instruction creating a PC marker for the code of
@@ -712,7 +712,7 @@
     Function& function = Function::Handle(deopt_context->zone());
     function ^= deopt_context->ObjectAt(object_table_index_);
     if (function.IsNull()) {
-      *reinterpret_cast<RawObject**>(dest_addr) =
+      *reinterpret_cast<ObjectPtr*>(dest_addr) =
           deopt_context->is_lazy_deopt()
               ? StubCode::DeoptimizeLazyFromReturn().raw()
               : StubCode::Deoptimize().raw();
@@ -724,7 +724,7 @@
     // marker until we can recreate that Code object during deferred
     // materialization to maintain the invariant that Dart frames always have
     // a pc marker.
-    *reinterpret_cast<RawObject**>(dest_addr) =
+    *reinterpret_cast<ObjectPtr*>(dest_addr) =
         StubCode::FrameAwaitingMaterialization().raw();
     deopt_context->DeferPcMarkerMaterialization(object_table_index_, dest_addr);
   }
@@ -755,7 +755,7 @@
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *dest_addr = Smi::RawValue(0);
     deopt_context->DeferPpMaterialization(
-        object_table_index_, reinterpret_cast<RawObject**>(dest_addr));
+        object_table_index_, reinterpret_cast<ObjectPtr*>(dest_addr));
   }
 
  private:
@@ -831,7 +831,7 @@
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
+    *reinterpret_cast<SmiPtr*>(dest_addr) = Smi::New(0);
     deopt_context->DeferMaterializedObjectRef(index_, dest_addr);
   }
 
@@ -892,7 +892,7 @@
   *code = function.unoptimized_code();
   ASSERT(!code->IsNull());
   uword res = code->GetPcForDeoptId(ret_address_instr->deopt_id(),
-                                    RawPcDescriptors::kDeopt);
+                                    PcDescriptorsLayout::kDeopt);
   ASSERT(res != 0);
   return res;
 }
@@ -1237,7 +1237,7 @@
   return Thread::Current()->zone()->Realloc<uint8_t>(ptr, old_size, new_size);
 }
 
-RawTypedData* DeoptInfoBuilder::CreateDeoptInfo(const Array& deopt_table) {
+TypedDataPtr DeoptInfoBuilder::CreateDeoptInfo(const Array& deopt_table) {
   intptr_t length = instructions_.length();
 
   // Count the number of instructions that are a shared suffix of some deopt
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 57fff85..0c40fa9 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -70,7 +70,7 @@
   intptr_t GetCallerFp() const;
   void SetCallerFp(intptr_t callers_fp);
 
-  RawObject* ObjectAt(intptr_t index) const {
+  ObjectPtr ObjectAt(intptr_t index) const {
     const ObjectPool& object_pool = ObjectPool::Handle(object_pool_);
     return object_pool.ObjectAt(index);
   }
@@ -124,7 +124,7 @@
   intptr_t source_frame_size() const { return source_frame_size_; }
   intptr_t dest_frame_size() const { return dest_frame_size_; }
 
-  RawCode* code() const { return code_; }
+  CodePtr code() const { return code_; }
 
   bool is_lazy_deopt() const { return is_lazy_deopt_; }
 
@@ -135,7 +135,7 @@
     return (deopt_flags_ & flag) != 0;
   }
 
-  RawTypedData* deopt_info() const { return deopt_info_; }
+  TypedDataPtr deopt_info() const { return deopt_info_; }
 
   // Fills the destination frame but defers materialization of
   // objects.
@@ -150,53 +150,53 @@
   // artificial arguments used during deoptimization.
   intptr_t MaterializeDeferredObjects();
 
-  RawArray* DestFrameAsArray();
+  ArrayPtr DestFrameAsArray();
 
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
   void DeferMaterializedObjectRef(intptr_t idx, intptr_t* slot) {
     deferred_slots_ = new DeferredObjectRef(
-        idx, reinterpret_cast<RawObject**>(slot), deferred_slots_);
+        idx, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
   }
 
-  void DeferMaterialization(double value, RawDouble** slot) {
+  void DeferMaterialization(double value, DoublePtr* slot) {
     deferred_slots_ = new DeferredDouble(
-        value, reinterpret_cast<RawObject**>(slot), deferred_slots_);
+        value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
   }
 
-  void DeferMintMaterialization(int64_t value, RawMint** slot) {
+  void DeferMintMaterialization(int64_t value, MintPtr* slot) {
     deferred_slots_ = new DeferredMint(
-        value, reinterpret_cast<RawObject**>(slot), deferred_slots_);
+        value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
   }
 
-  void DeferMaterialization(simd128_value_t value, RawFloat32x4** slot) {
+  void DeferMaterialization(simd128_value_t value, Float32x4Ptr* slot) {
     deferred_slots_ = new DeferredFloat32x4(
-        value, reinterpret_cast<RawObject**>(slot), deferred_slots_);
+        value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
   }
 
-  void DeferMaterialization(simd128_value_t value, RawFloat64x2** slot) {
+  void DeferMaterialization(simd128_value_t value, Float64x2Ptr* slot) {
     deferred_slots_ = new DeferredFloat64x2(
-        value, reinterpret_cast<RawObject**>(slot), deferred_slots_);
+        value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
   }
 
-  void DeferMaterialization(simd128_value_t value, RawInt32x4** slot) {
+  void DeferMaterialization(simd128_value_t value, Int32x4Ptr* slot) {
     deferred_slots_ = new DeferredInt32x4(
-        value, reinterpret_cast<RawObject**>(slot), deferred_slots_);
+        value, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
   }
 
   void DeferRetAddrMaterialization(intptr_t index,
                                    intptr_t deopt_id,
                                    intptr_t* slot) {
     deferred_slots_ = new DeferredRetAddr(
-        index, deopt_id, reinterpret_cast<RawObject**>(slot), deferred_slots_);
+        index, deopt_id, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
   }
 
   void DeferPcMarkerMaterialization(intptr_t index, intptr_t* slot) {
     deferred_slots_ = new DeferredPcMarker(
-        index, reinterpret_cast<RawObject**>(slot), deferred_slots_);
+        index, reinterpret_cast<ObjectPtr*>(slot), deferred_slots_);
   }
 
-  void DeferPpMaterialization(intptr_t index, RawObject** slot) {
+  void DeferPpMaterialization(intptr_t index, ObjectPtr* slot) {
     deferred_slots_ = new DeferredPp(index, slot, deferred_slots_);
   }
 
@@ -229,9 +229,9 @@
 
   intptr_t DeferredObjectsCount() const { return deferred_objects_count_; }
 
-  RawCode* code_;
-  RawObjectPool* object_pool_;
-  RawTypedData* deopt_info_;
+  CodePtr code_;
+  ObjectPoolPtr object_pool_;
+  TypedDataPtr deopt_info_;
   bool dest_frame_is_allocated_;
   intptr_t* dest_frame_;
   intptr_t dest_frame_size_;
@@ -388,7 +388,8 @@
       : source_index_(source_index) {}
 
   RegisterSource(Kind kind, intptr_t index)
-      : source_index_(KindField::encode(kind) | RawIndexField::encode(index)) {}
+      : source_index_(KindField::encode(kind) |
+                      IndexFieldLayout::encode(index)) {}
 
   template <typename T>
   T Value(DeoptContext* context) const {
@@ -418,13 +419,13 @@
 
  private:
   class KindField : public BitField<intptr_t, intptr_t, 0, 1> {};
-  class RawIndexField
+  class IndexFieldLayout
       : public BitField<intptr_t, intptr_t, 1, kBitsPerWord - 1> {};
 
   bool is_register() const {
     return KindField::decode(source_index_) == kRegister;
   }
-  intptr_t raw_index() const { return RawIndexField::decode(source_index_); }
+  intptr_t raw_index() const { return IndexFieldLayout::decode(source_index_); }
 
   RegisterType reg() const { return static_cast<RegisterType>(raw_index()); }
 
@@ -480,7 +481,7 @@
   // Returns the index of the next stack slot. Used for verification.
   intptr_t EmitMaterializationArguments(intptr_t dest_index);
 
-  RawTypedData* CreateDeoptInfo(const Array& deopt_table);
+  TypedDataPtr CreateDeoptInfo(const Array& deopt_table);
 
   // Mark the actual start of the frame description after all materialization
   // instructions were emitted. Used for verification purposes.
@@ -559,8 +560,8 @@
                        TypedData* info,
                        Smi* reason_and_flags);
 
-  static RawSmi* EncodeReasonAndFlags(ICData::DeoptReasonId reason,
-                                      uint32_t flags) {
+  static SmiPtr EncodeReasonAndFlags(ICData::DeoptReasonId reason,
+                                     uint32_t flags) {
     return Smi::New(ReasonField::encode(reason) | FlagsField::encode(flags));
   }
 
diff --git a/runtime/vm/double_conversion.cc b/runtime/vm/double_conversion.cc
index b3784ab..7357658 100644
--- a/runtime/vm/double_conversion.cc
+++ b/runtime/vm/double_conversion.cc
@@ -50,7 +50,7 @@
   ASSERT(result == buffer);
 }
 
-RawString* DoubleToStringAsFixed(double d, int fraction_digits) {
+StringPtr DoubleToStringAsFixed(double d, int fraction_digits) {
   static const int kMinFractionDigits = 0;
   static const int kMaxFractionDigits = 20;
   static const int kMaxDigitsBeforePoint = 20;
@@ -91,7 +91,7 @@
   return String::New(builder.Finalize());
 }
 
-RawString* DoubleToStringAsExponential(double d, int fraction_digits) {
+StringPtr DoubleToStringAsExponential(double d, int fraction_digits) {
   static const int kMinFractionDigits = -1;  // -1 represents shortest mode.
   static const int kMaxFractionDigits = 20;
   static const int kConversionFlags =
@@ -122,7 +122,7 @@
   return String::New(builder.Finalize());
 }
 
-RawString* DoubleToStringAsPrecision(double d, int precision) {
+StringPtr DoubleToStringAsPrecision(double d, int precision) {
   static const int kMinPrecisionDigits = 1;
   static const int kMaxPrecisionDigits = 21;
   static const int kMaxLeadingPaddingZeroes = 6;
diff --git a/runtime/vm/double_conversion.h b/runtime/vm/double_conversion.h
index 8793649..27a8172 100644
--- a/runtime/vm/double_conversion.h
+++ b/runtime/vm/double_conversion.h
@@ -18,9 +18,9 @@
 };
 
 void DoubleToCString(double d, char* buffer, int buffer_size);
-RawString* DoubleToStringAsFixed(double d, int fraction_digits);
-RawString* DoubleToStringAsExponential(double d, int fraction_digits);
-RawString* DoubleToStringAsPrecision(double d, int precision);
+StringPtr DoubleToStringAsFixed(double d, int fraction_digits);
+StringPtr DoubleToStringAsExponential(double d, int fraction_digits);
+StringPtr DoubleToStringAsPrecision(double d, int precision);
 
 bool CStringToDouble(const char* str, intptr_t length, double* result);
 
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 76d0097..3bcb484 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -361,8 +361,8 @@
     return reinterpret_cast<T*>(fp + frame_slot * kWordSize);
   }
 
-  static RawObject** TaggedSlotAt(uword fp, int stack_slot) {
-    return SlotAt<RawObject*>(fp, stack_slot);
+  static ObjectPtr* TaggedSlotAt(uword fp, int stack_slot) {
+    return SlotAt<ObjectPtr>(fp, stack_slot);
   }
 
   typedef ReadStream::Raw<sizeof(intptr_t), intptr_t> Reader;
@@ -598,7 +598,7 @@
 
 #if defined(DEBUG)
           // Ensure the frame references optimized code.
-          RawObject* pc_marker = *(reinterpret_cast<RawObject**>(
+          ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
               frame_pointer + runtime_frame_layout.code_from_fp * kWordSize));
           Code& code = Code::Handle(Code::RawCast(pc_marker));
           ASSERT(code.is_optimized() && !code.is_force_optimized());
@@ -739,7 +739,7 @@
   UNREACHABLE();
 }
 
-static RawField* LookupStackTraceField(const Instance& instance) {
+static FieldPtr LookupStackTraceField(const Instance& instance) {
   if (instance.GetClassId() < kNumPredefinedCids) {
     // 'class Error' is not a predefined class.
     return Field::null();
@@ -771,7 +771,7 @@
   return Field::null();
 }
 
-RawStackTrace* Exceptions::CurrentStackTrace() {
+StackTracePtr Exceptions::CurrentStackTrace() {
   return GetStackTraceForException();
 }
 
@@ -891,7 +891,7 @@
 
 // Return the script of the Dart function that called the native entry or the
 // runtime entry. The frame iterator points to the callee.
-RawScript* Exceptions::GetCallerScript(DartFrameIterator* iterator) {
+ScriptPtr Exceptions::GetCallerScript(DartFrameIterator* iterator) {
   StackFrame* caller_frame = iterator->NextFrame();
   ASSERT(caller_frame != NULL && caller_frame->IsDartFrame());
   const Function& caller = Function::Handle(caller_frame->LookupDartFunction());
@@ -906,7 +906,7 @@
 // Allocate a new instance of the given class name.
 // TODO(hausner): Rename this NewCoreInstance to call out the fact that
 // the class name is resolved in the core library implicitly?
-RawInstance* Exceptions::NewInstance(const char* class_name) {
+InstancePtr Exceptions::NewInstance(const char* class_name) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const String& cls_name =
@@ -1128,7 +1128,7 @@
   Exceptions::ThrowByType(Exceptions::kLateInitializationError, args);
 }
 
-RawObject* Exceptions::Create(ExceptionType type, const Array& arguments) {
+ObjectPtr Exceptions::Create(ExceptionType type, const Array& arguments) {
   Library& library = Library::Handle();
   const String* class_name = NULL;
   const String* constructor_name = &Symbols::Dot();
@@ -1227,4 +1227,16 @@
                                           *constructor_name, arguments);
 }
 
+UnhandledExceptionPtr Exceptions::CreateUnhandledException(Zone* zone,
+                                                           ExceptionType type,
+                                                           const char* msg) {
+  const String& error_str = String::Handle(zone, String::New(msg));
+  const Array& args = Array::Handle(zone, Array::New(1));
+  args.SetAt(0, error_str);
+
+  Object& result = Object::Handle(zone, Exceptions::Create(type, args));
+  const StackTrace& stacktrace = StackTrace::Handle(zone);
+  return UnhandledException::New(Instance::Cast(result), stacktrace);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 1ec8e12..430d7a9 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -7,6 +7,7 @@
 
 #include "vm/allocation.h"
 #include "vm/bitfield.h"
+#include "vm/tagged_pointer.h"
 #include "vm/token_position.h"
 
 namespace dart {
@@ -19,10 +20,6 @@
 class LanguageError;
 class Instance;
 class Integer;
-class RawInstance;
-class RawObject;
-class RawScript;
-class RawStackTrace;
 class ReadStream;
 class WriteStream;
 class String;
@@ -41,9 +38,9 @@
   DART_NORETURN static void PropagateToEntry(const Error& error);
 
   // Helpers to create and throw errors.
-  static RawStackTrace* CurrentStackTrace();
-  static RawScript* GetCallerScript(DartFrameIterator* iterator);
-  static RawInstance* NewInstance(const char* class_name);
+  static StackTracePtr CurrentStackTrace();
+  static ScriptPtr GetCallerScript(DartFrameIterator* iterator);
+  static InstancePtr NewInstance(const char* class_name);
   static void CreateAndThrowTypeError(TokenPosition location,
                                       const AbstractType& src_type,
                                       const AbstractType& dst_type,
@@ -90,7 +87,13 @@
 
   // Returns a RawInstance if the exception is successfully created,
   // otherwise returns a RawError.
-  static RawObject* Create(ExceptionType type, const Array& arguments);
+  static ObjectPtr Create(ExceptionType type, const Array& arguments);
+
+  // Returns RawUnhandledException that wraps exception of type [type] with
+  // [msg] as a single argument.
+  static UnhandledExceptionPtr CreateUnhandledException(Zone* zone,
+                                                        ExceptionType type,
+                                                        const char* msg);
 
   DART_NORETURN static void JumpToFrame(Thread* thread,
                                         uword program_counter,
diff --git a/runtime/vm/field_table.cc b/runtime/vm/field_table.cc
index 96d3f5a..8ff6f03 100644
--- a/runtime/vm/field_table.cc
+++ b/runtime/vm/field_table.cc
@@ -29,7 +29,7 @@
 }
 
 intptr_t FieldTable::FieldOffsetFor(intptr_t field_id) {
-  return field_id * sizeof(RawInstance*);  // NOLINT
+  return field_id * sizeof(InstancePtr);  // NOLINT
 }
 
 void FieldTable::Register(const Field& field) {
@@ -62,7 +62,7 @@
   free_head_ = field_id;
 }
 
-void FieldTable::SetAt(intptr_t index, RawInstance* raw_instance) {
+void FieldTable::SetAt(intptr_t index, InstancePtr raw_instance) {
   ASSERT(index < capacity_);
   table_[index] = raw_instance;
 }
@@ -82,10 +82,10 @@
 void FieldTable::Grow(intptr_t new_capacity) {
   ASSERT(new_capacity > capacity_);
 
-  auto new_table = static_cast<RawInstance**>(
-      malloc(new_capacity * sizeof(RawInstance*)));  // NOLINT
-  memmove(new_table, table_, top_ * sizeof(RawInstance*));
-  memset(new_table + top_, 0, (new_capacity - top_) * sizeof(RawInstance*));
+  auto new_table = static_cast<InstancePtr*>(
+      malloc(new_capacity * sizeof(InstancePtr)));  // NOLINT
+  memmove(new_table, table_, top_ * sizeof(InstancePtr));
+  memset(new_table + top_, 0, (new_capacity - top_) * sizeof(InstancePtr));
   capacity_ = new_capacity;
   old_tables_->Add(table_);
   // Ensure that new_table_ is populated before it is published
@@ -97,9 +97,9 @@
 
 FieldTable* FieldTable::Clone() {
   FieldTable* clone = new FieldTable();
-  auto new_table = static_cast<RawInstance**>(
-      malloc(capacity_ * sizeof(RawInstance*)));  // NOLINT
-  memmove(new_table, table_, top_ * sizeof(RawInstance*));
+  auto new_table = static_cast<InstancePtr*>(
+      malloc(capacity_ * sizeof(InstancePtr)));  // NOLINT
+  memmove(new_table, table_, top_ * sizeof(InstancePtr));
   ASSERT(clone->table_ == nullptr);
   clone->table_ = new_table;
   clone->capacity_ = capacity_;
@@ -115,8 +115,8 @@
 
   ASSERT(visitor != NULL);
   visitor->set_gc_root_type("static fields table");
-  visitor->VisitPointers(reinterpret_cast<RawObject**>(&table_[0]),
-                         reinterpret_cast<RawObject**>(&table_[top_ - 1]));
+  visitor->VisitPointers(reinterpret_cast<ObjectPtr*>(&table_[0]),
+                         reinterpret_cast<ObjectPtr*>(&table_[top_ - 1]));
   visitor->clear_gc_root_type();
 }
 
diff --git a/runtime/vm/field_table.h b/runtime/vm/field_table.h
index 08e83d8..b4c8f23 100644
--- a/runtime/vm/field_table.h
+++ b/runtime/vm/field_table.h
@@ -12,11 +12,11 @@
 #include "vm/class_id.h"
 #include "vm/globals.h"
 #include "vm/growable_array.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
 class Field;
-class RawInstance;
 
 class FieldTable {
  public:
@@ -25,14 +25,14 @@
         capacity_(0),
         free_head_(-1),
         table_(nullptr),
-        old_tables_(new MallocGrowableArray<RawInstance**>()) {}
+        old_tables_(new MallocGrowableArray<InstancePtr*>()) {}
 
   ~FieldTable();
 
   intptr_t NumFieldIds() const { return top_; }
   intptr_t Capacity() const { return capacity_; }
 
-  RawInstance** table() { return table_; }
+  InstancePtr* table() { return table_; }
 
   void FreeOldTables();
 
@@ -49,11 +49,11 @@
   // to an existing static field value.
   void Free(intptr_t index);
 
-  RawInstance* At(intptr_t index) const {
+  InstancePtr At(intptr_t index) const {
     ASSERT(IsValidIndex(index));
     return table_[index];
   }
-  void SetAt(intptr_t index, RawInstance* raw_instance);
+  void SetAt(intptr_t index, InstancePtr raw_instance);
 
   FieldTable* Clone();
 
@@ -77,10 +77,10 @@
   // element, last element contains -1.
   intptr_t free_head_;
 
-  RawInstance** table_;
+  InstancePtr* table_;
   // When table_ grows and have to reallocated, keep the old one here
   // so it will get freed when its are no longer in use.
-  MallocGrowableArray<RawInstance**>* old_tables_;
+  MallocGrowableArray<InstancePtr*>* old_tables_;
 
   DISALLOW_COPY_AND_ASSIGN(FieldTable);
 };
diff --git a/runtime/vm/gdb_helpers.cc b/runtime/vm/gdb_helpers.cc
index 1260263..f75c89a 100644
--- a/runtime/vm/gdb_helpers.cc
+++ b/runtime/vm/gdb_helpers.cc
@@ -12,12 +12,12 @@
 #if !defined(PRODUCT)
 
 DART_EXPORT
-void _printRawObject(RawObject* object) {
+void _printRawObject(ObjectPtr object) {
   OS::PrintErr("%s\n", Object::Handle(object).ToCString());
 }
 
 DART_EXPORT
-Object* _handle(RawObject* object) {
+Object* _handle(ObjectPtr object) {
   return &Object::Handle(object);
 }
 
@@ -57,15 +57,15 @@
 // Must be called with the current interpreter fp, sp, and pc.
 // Note that sp[0] is not modified, but sp[1] will be trashed.
 DART_EXPORT
-void _printInterpreterStackTrace(RawObject** fp,
-                                 RawObject** sp,
+void _printInterpreterStackTrace(ObjectPtr* fp,
+                                 ObjectPtr* sp,
                                  const KBCInstr* pc) {
   Thread* thread = Thread::Current();
   sp[1] = Function::null();
   sp[2] = Bytecode::null();
-  sp[3] = reinterpret_cast<RawObject*>(reinterpret_cast<uword>(pc));
-  sp[4] = reinterpret_cast<RawObject*>(fp);
-  RawObject** exit_fp = sp + 1 + kKBCDartFrameFixedSize;
+  sp[3] = static_cast<ObjectPtr>(reinterpret_cast<uword>(pc));
+  sp[4] = static_cast<ObjectPtr>(reinterpret_cast<uword>(fp));
+  ObjectPtr* exit_fp = sp + 1 + kKBCDartFrameFixedSize;
   thread->set_top_exit_frame_info(reinterpret_cast<uword>(exit_fp));
   thread->set_execution_state(Thread::kThreadInVM);
   _printDartStackTrace();
@@ -78,8 +78,8 @@
   PrintObjectPointersVisitor()
       : ObjectPointerVisitor(IsolateGroup::Current()) {}
 
-  void VisitPointers(RawObject** first, RawObject** last) {
-    for (RawObject** p = first; p <= last; p++) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+    for (ObjectPtr* p = first; p <= last; p++) {
       Object& obj = Object::Handle(*p);
       OS::PrintErr("%p: %s\n", p, obj.ToCString());
     }
diff --git a/runtime/vm/guard_field_test.cc b/runtime/vm/guard_field_test.cc
index be010ce..3334ea1 100644
--- a/runtime/vm/guard_field_test.cc
+++ b/runtime/vm/guard_field_test.cc
@@ -10,10 +10,10 @@
 
 namespace dart {
 
-RawField* LookupField(Dart_Handle library,
-                      const char* class_name,
-                      const char* field_name) {
-  RawLibrary* raw_library = Library::RawCast(Api::UnwrapHandle(library));
+FieldPtr LookupField(Dart_Handle library,
+                     const char* class_name,
+                     const char* field_name) {
+  LibraryPtr raw_library = Library::RawCast(Api::UnwrapHandle(library));
   Library& lib = Library::ZoneHandle(raw_library);
   const String& classname =
       String::Handle(Symbols::New(Thread::Current(), class_name));
diff --git a/runtime/vm/handles_impl.h b/runtime/vm/handles_impl.h
index 3bbd19f..f4033dc 100644
--- a/runtime/vm/handles_impl.h
+++ b/runtime/vm/handles_impl.h
@@ -290,7 +290,7 @@
   ASSERT(visitor != NULL);
   for (intptr_t i = 0; i < next_handle_slot_; i += kHandleSizeInWords) {
     visitor->VisitPointer(
-        reinterpret_cast<RawObject**>(&data_[i + kOffsetOfRawPtr / kWordSize]));
+        reinterpret_cast<ObjectPtr*>(&data_[i + kOffsetOfRawPtr / kWordSize]));
   }
 }
 
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index a59fd9a..b558abe 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -85,7 +85,7 @@
         released_data_(NULL) {}
   // Uses 'zone' for handle allocation. 'Release' must be called at the end
   // to obtain the final table after potential growth/shrinkage.
-  HashTable(Zone* zone, RawArray* data)
+  HashTable(Zone* zone, ArrayPtr data)
       : key_handle_(&Object::Handle(zone)),
         smi_handle_(&Smi::Handle(zone)),
         data_(&Array::Handle(zone, data)),
@@ -252,11 +252,11 @@
     return InternalGetKey(entry) == DeletedMarker().raw();
   }
 
-  RawObject* GetKey(intptr_t entry) const {
+  ObjectPtr GetKey(intptr_t entry) const {
     ASSERT(IsOccupied(entry));
     return InternalGetKey(entry);
   }
-  RawObject* GetPayload(intptr_t entry, intptr_t component) const {
+  ObjectPtr GetPayload(intptr_t entry, intptr_t component) const {
     ASSERT(IsOccupied(entry));
     return data_->At(PayloadIndex(entry, component));
   }
@@ -307,7 +307,7 @@
   }
   void UpdateCollisions(intptr_t collisions) const {
     if (KeyTraits::ReportStats()) {
-      if (data_->raw()->InVMIsolateHeap()) {
+      if (data_->raw()->ptr()->InVMIsolateHeap()) {
         return;
       }
       AdjustSmiValueAt(kNumProbesIndex, collisions + 1);
@@ -370,7 +370,7 @@
     return KeyIndex(entry) + 1 + component;
   }
 
-  RawObject* InternalGetKey(intptr_t entry) const {
+  ObjectPtr InternalGetKey(intptr_t entry) const {
     return data_->At(KeyIndex(entry));
   }
 
@@ -408,9 +408,9 @@
  public:
   typedef HashTable<KeyTraits, kUserPayloadSize, 0> BaseTable;
   static const intptr_t kPayloadSize = kUserPayloadSize;
-  explicit UnorderedHashTable(RawArray* data)
+  explicit UnorderedHashTable(ArrayPtr data)
       : BaseTable(Thread::Current()->zone(), data) {}
-  UnorderedHashTable(Zone* zone, RawArray* data) : BaseTable(zone, data) {}
+  UnorderedHashTable(Zone* zone, ArrayPtr data) : BaseTable(zone, data) {}
   UnorderedHashTable(Object* key, Smi* value, Array* data)
       : BaseTable(key, value, data) {}
   // Note: Does not check for concurrent modification.
@@ -441,8 +441,8 @@
  public:
   // Allocates and initializes a table.
   template <typename Table>
-  static RawArray* New(intptr_t initial_capacity,
-                       Heap::Space space = Heap::kNew) {
+  static ArrayPtr New(intptr_t initial_capacity,
+                      Heap::Space space = Heap::kNew) {
     Table table(
         Thread::Current()->zone(),
         Array::New(Table::ArrayLengthForNumOccupied(initial_capacity), space));
@@ -451,7 +451,7 @@
   }
 
   template <typename Table>
-  static RawArray* New(const Array& array) {
+  static ArrayPtr New(const Array& array) {
     Table table(Thread::Current()->zone(), array.raw());
     table.Initialize();
     return table.Release().raw();
@@ -512,7 +512,7 @@
 
   // Serializes a table by concatenating its entries as an array.
   template <typename Table>
-  static RawArray* ToArray(const Table& table, bool include_payload) {
+  static ArrayPtr ToArray(const Table& table, bool include_payload) {
     const intptr_t entry_size = include_payload ? (1 + Table::kPayloadSize) : 1;
     Array& result = Array::Handle(Array::New(table.NumOccupied() * entry_size));
     typename Table::Iterator it(&table);
@@ -536,13 +536,13 @@
 template <typename BaseIterTable>
 class HashMap : public BaseIterTable {
  public:
-  explicit HashMap(RawArray* data)
+  explicit HashMap(ArrayPtr data)
       : BaseIterTable(Thread::Current()->zone(), data) {}
-  HashMap(Zone* zone, RawArray* data) : BaseIterTable(zone, data) {}
+  HashMap(Zone* zone, ArrayPtr data) : BaseIterTable(zone, data) {}
   HashMap(Object* key, Smi* value, Array* data)
       : BaseIterTable(key, value, data) {}
   template <typename Key>
-  RawObject* GetOrNull(const Key& key, bool* present = NULL) const {
+  ObjectPtr GetOrNull(const Key& key, bool* present = NULL) const {
     intptr_t entry = BaseIterTable::FindKey(key);
     if (present != NULL) {
       *present = (entry != -1);
@@ -550,7 +550,7 @@
     return (entry == -1) ? Object::null() : BaseIterTable::GetPayload(entry, 0);
   }
   template <typename Key>
-  RawObject* GetOrDie(const Key& key) const {
+  ObjectPtr GetOrDie(const Key& key) const {
     intptr_t entry = BaseIterTable::FindKey(key);
     if (entry == -1) UNREACHABLE();
     return BaseIterTable::GetPayload(entry, 0);
@@ -574,8 +574,8 @@
   }
   // If 'key' is not present, maps it to 'value_if_absent'. Returns the final
   // value in the map.
-  RawObject* InsertOrGetValue(const Object& key,
-                              const Object& value_if_absent) const {
+  ObjectPtr InsertOrGetValue(const Object& key,
+                             const Object& value_if_absent) const {
     EnsureCapacity();
     intptr_t entry = -1;
     if (!BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry)) {
@@ -588,8 +588,8 @@
   }
   // Like InsertOrGetValue, but calls NewKey to allocate a key object if needed.
   template <typename Key>
-  RawObject* InsertNewOrGetValue(const Key& key,
-                                 const Object& value_if_absent) const {
+  ObjectPtr InsertNewOrGetValue(const Key& key,
+                                const Object& value_if_absent) const {
     EnsureCapacity();
     intptr_t entry = -1;
     if (!BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry)) {
@@ -627,9 +627,9 @@
 class UnorderedHashMap : public HashMap<UnorderedHashTable<KeyTraits, 1> > {
  public:
   typedef HashMap<UnorderedHashTable<KeyTraits, 1> > BaseMap;
-  explicit UnorderedHashMap(RawArray* data)
+  explicit UnorderedHashMap(ArrayPtr data)
       : BaseMap(Thread::Current()->zone(), data) {}
-  UnorderedHashMap(Zone* zone, RawArray* data) : BaseMap(zone, data) {}
+  UnorderedHashMap(Zone* zone, ArrayPtr data) : BaseMap(zone, data) {}
   UnorderedHashMap(Object* key, Smi* value, Array* data)
       : BaseMap(key, value, data) {}
 };
@@ -637,9 +637,9 @@
 template <typename BaseIterTable>
 class HashSet : public BaseIterTable {
  public:
-  explicit HashSet(RawArray* data)
+  explicit HashSet(ArrayPtr data)
       : BaseIterTable(Thread::Current()->zone(), data) {}
-  HashSet(Zone* zone, RawArray* data) : BaseIterTable(zone, data) {}
+  HashSet(Zone* zone, ArrayPtr data) : BaseIterTable(zone, data) {}
   HashSet(Object* key, Smi* value, Array* data)
       : BaseIterTable(key, value, data) {}
   bool Insert(const Object& key) {
@@ -654,7 +654,7 @@
 
   // If 'key' is not present, insert and return it. Else, return the existing
   // key in the set (useful for canonicalization).
-  RawObject* InsertOrGet(const Object& key) const {
+  ObjectPtr InsertOrGet(const Object& key) const {
     EnsureCapacity();
     intptr_t entry = -1;
     if (!BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry)) {
@@ -667,7 +667,7 @@
 
   // Like InsertOrGet, but calls NewKey to allocate a key object if needed.
   template <typename Key>
-  RawObject* InsertNewOrGet(const Key& key) const {
+  ObjectPtr InsertNewOrGet(const Key& key) const {
     EnsureCapacity();
     intptr_t entry = -1;
     if (!BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry)) {
@@ -681,7 +681,7 @@
   }
 
   template <typename Key>
-  RawObject* GetOrNull(const Key& key, bool* present = NULL) const {
+  ObjectPtr GetOrNull(const Key& key, bool* present = NULL) const {
     intptr_t entry = BaseIterTable::FindKey(key);
     if (present != NULL) {
       *present = (entry != -1);
@@ -713,11 +713,11 @@
 class UnorderedHashSet : public HashSet<UnorderedHashTable<KeyTraits, 0> > {
  public:
   typedef HashSet<UnorderedHashTable<KeyTraits, 0> > BaseSet;
-  explicit UnorderedHashSet(RawArray* data)
+  explicit UnorderedHashSet(ArrayPtr data)
       : BaseSet(Thread::Current()->zone(), data) {
     ASSERT(data != Array::null());
   }
-  UnorderedHashSet(Zone* zone, RawArray* data) : BaseSet(zone, data) {}
+  UnorderedHashSet(Zone* zone, ArrayPtr data) : BaseSet(zone, data) {}
   UnorderedHashSet(Object* key, Smi* value, Array* data)
       : BaseSet(key, value, data) {}
 
diff --git a/runtime/vm/hash_table_test.cc b/runtime/vm/hash_table_test.cc
index aeb8d55..6549de2 100644
--- a/runtime/vm/hash_table_test.cc
+++ b/runtime/vm/hash_table_test.cc
@@ -32,7 +32,7 @@
            String::Cast(a).Equals(String::Cast(b));
   }
   static uword Hash(const Object& obj) { return String::Cast(obj).Length(); }
-  static RawObject* NewKey(const char* key) { return String::New(key); }
+  static ObjectPtr NewKey(const char* key) { return String::New(key); }
 };
 
 template <typename Table>
diff --git a/runtime/vm/heap/become.cc b/runtime/vm/heap/become.cc
index 5f5ffba..2799db6 100644
--- a/runtime/vm/heap/become.cc
+++ b/runtime/vm/heap/become.cc
@@ -24,16 +24,16 @@
   ForwardingCorpse* result = reinterpret_cast<ForwardingCorpse*>(addr);
 
   uint32_t tags = 0;
-  tags = RawObject::SizeTag::update(size, tags);
-  tags = RawObject::ClassIdTag::update(kForwardingCorpse, tags);
+  tags = ObjectLayout::SizeTag::update(size, tags);
+  tags = ObjectLayout::ClassIdTag::update(kForwardingCorpse, tags);
   bool is_old = (addr & kNewObjectAlignmentOffset) == kOldObjectAlignmentOffset;
-  tags = RawObject::OldBit::update(is_old, tags);
-  tags = RawObject::OldAndNotMarkedBit::update(is_old, tags);
-  tags = RawObject::OldAndNotRememberedBit::update(is_old, tags);
-  tags = RawObject::NewBit::update(!is_old, tags);
+  tags = ObjectLayout::OldBit::update(is_old, tags);
+  tags = ObjectLayout::OldAndNotMarkedBit::update(is_old, tags);
+  tags = ObjectLayout::OldAndNotRememberedBit::update(is_old, tags);
+  tags = ObjectLayout::NewBit::update(!is_old, tags);
 
   result->tags_ = tags;
-  if (size > RawObject::SizeTag::kMaxSizeTag) {
+  if (size > ObjectLayout::SizeTag::kMaxSizeTag) {
     *result->SizeAddress() = size;
   }
   result->set_target(Object::null());
@@ -48,21 +48,21 @@
 // Free list elements are used as a marker for forwarding objects. This is
 // safe because we cannot reach free list elements from live objects. Ideally
 // forwarding objects would have their own class id. See TODO below.
-static bool IsForwardingObject(RawObject* object) {
+static bool IsForwardingObject(ObjectPtr object) {
   return object->IsHeapObject() && object->IsForwardingCorpse();
 }
 
-static RawObject* GetForwardedObject(RawObject* object) {
+static ObjectPtr GetForwardedObject(ObjectPtr object) {
   ASSERT(IsForwardingObject(object));
-  uword addr = reinterpret_cast<uword>(object) - kHeapObjectTag;
+  uword addr = static_cast<uword>(object) - kHeapObjectTag;
   ForwardingCorpse* forwarder = reinterpret_cast<ForwardingCorpse*>(addr);
   return forwarder->target();
 }
 
-static void ForwardObjectTo(RawObject* before_obj, RawObject* after_obj) {
-  const intptr_t size_before = before_obj->HeapSize();
+static void ForwardObjectTo(ObjectPtr before_obj, ObjectPtr after_obj) {
+  const intptr_t size_before = before_obj->ptr()->HeapSize();
 
-  uword corpse_addr = reinterpret_cast<uword>(before_obj) - kHeapObjectTag;
+  uword corpse_addr = static_cast<uword>(before_obj) - kHeapObjectTag;
   ForwardingCorpse* forwarder =
       ForwardingCorpse::AsForwarder(corpse_addr, size_before);
   forwarder->set_target(after_obj);
@@ -70,7 +70,7 @@
     FATAL("become: ForwardObjectTo failure.");
   }
   // Still need to be able to iterate over the forwarding corpse.
-  const intptr_t size_after = before_obj->HeapSize();
+  const intptr_t size_after = before_obj->ptr()->HeapSize();
   if (size_before != size_after) {
     FATAL("become: Before and after sizes do not match.");
   }
@@ -81,25 +81,25 @@
   explicit ForwardPointersVisitor(Thread* thread)
       : ObjectPointerVisitor(thread->isolate_group()),
         thread_(thread),
-        visiting_object_(NULL) {}
+        visiting_object_(nullptr) {}
 
-  virtual void VisitPointers(RawObject** first, RawObject** last) {
-    for (RawObject** p = first; p <= last; p++) {
-      RawObject* old_target = *p;
+  virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+    for (ObjectPtr* p = first; p <= last; p++) {
+      ObjectPtr old_target = *p;
       if (IsForwardingObject(old_target)) {
-        RawObject* new_target = GetForwardedObject(old_target);
-        if (visiting_object_ == NULL) {
+        ObjectPtr new_target = GetForwardedObject(old_target);
+        if (visiting_object_ == nullptr) {
           *p = new_target;
         } else {
-          visiting_object_->StorePointer(p, new_target);
+          visiting_object_->ptr()->StorePointer(p, new_target);
         }
       }
     }
   }
 
-  void VisitingObject(RawObject* obj) {
+  void VisitingObject(ObjectPtr obj) {
     visiting_object_ = obj;
-    if ((obj != NULL) && obj->IsOldObject() && obj->IsRemembered()) {
+    if ((obj != nullptr) && obj->IsOldObject() && obj->ptr()->IsRemembered()) {
       ASSERT(!obj->IsForwardingCorpse());
       ASSERT(!obj->IsFreeListElement());
       thread_->StoreBufferAddObjectGC(obj);
@@ -108,7 +108,7 @@
 
  private:
   Thread* thread_;
-  RawObject* visiting_object_;
+  ObjectPtr visiting_object_;
 
   DISALLOW_COPY_AND_ASSIGN(ForwardPointersVisitor);
 };
@@ -118,9 +118,9 @@
   explicit ForwardHeapPointersVisitor(ForwardPointersVisitor* pointer_visitor)
       : pointer_visitor_(pointer_visitor) {}
 
-  virtual void VisitObject(RawObject* obj) {
+  virtual void VisitObject(ObjectPtr obj) {
     pointer_visitor_->VisitingObject(obj);
-    obj->VisitPointers(pointer_visitor_);
+    obj->ptr()->VisitPointers(pointer_visitor_);
   }
 
  private:
@@ -182,25 +182,25 @@
   ForwardObjectTo(instance.raw(), instance.raw());
 }
 
-static bool IsDummyObject(RawObject* object) {
+static bool IsDummyObject(ObjectPtr object) {
   if (!object->IsForwardingCorpse()) return false;
   return GetForwardedObject(object) == object;
 }
 
-void Become::CrashDump(RawObject* before_obj, RawObject* after_obj) {
+void Become::CrashDump(ObjectPtr before_obj, ObjectPtr after_obj) {
   OS::PrintErr("DETECTED FATAL ISSUE IN BECOME MAPPINGS\n");
 
-  OS::PrintErr("BEFORE ADDRESS: %p\n", before_obj);
+  OS::PrintErr("BEFORE ADDRESS: %#" Px "\n", static_cast<uword>(before_obj));
   OS::PrintErr("BEFORE IS HEAP OBJECT: %s\n",
                before_obj->IsHeapObject() ? "YES" : "NO");
   OS::PrintErr("BEFORE IN VMISOLATE HEAP OBJECT: %s\n",
-               before_obj->InVMIsolateHeap() ? "YES" : "NO");
+               before_obj->ptr()->InVMIsolateHeap() ? "YES" : "NO");
 
-  OS::PrintErr("AFTER ADDRESS: %p\n", after_obj);
+  OS::PrintErr("AFTER ADDRESS: %#" Px "\n", static_cast<uword>(after_obj));
   OS::PrintErr("AFTER IS HEAP OBJECT: %s\n",
                after_obj->IsHeapObject() ? "YES" : "NO");
   OS::PrintErr("AFTER IN VMISOLATE HEAP OBJECT: %s\n",
-               after_obj->InVMIsolateHeap() ? "YES" : "NO");
+               after_obj->ptr()->InVMIsolateHeap() ? "YES" : "NO");
 
   if (before_obj->IsHeapObject()) {
     OS::PrintErr("BEFORE OBJECT CLASS ID=%" Pd "\n", before_obj->GetClassId());
@@ -225,8 +225,8 @@
   // Setup forwarding pointers.
   ASSERT(before.Length() == after.Length());
   for (intptr_t i = 0; i < before.Length(); i++) {
-    RawObject* before_obj = before.At(i);
-    RawObject* after_obj = after.At(i);
+    ObjectPtr before_obj = before.At(i);
+    ObjectPtr after_obj = after.At(i);
 
     if (before_obj == after_obj) {
       FATAL("become: Cannot self-forward");
@@ -239,7 +239,7 @@
       CrashDump(before_obj, after_obj);
       FATAL("become: Cannot become immediates");
     }
-    if (before_obj->InVMIsolateHeap()) {
+    if (before_obj->ptr()->InVMIsolateHeap()) {
       CrashDump(before_obj, after_obj);
       FATAL("become: Cannot forward VM heap objects");
     }
diff --git a/runtime/vm/heap/become.h b/runtime/vm/heap/become.h
index 5e98eba..ef76a45 100644
--- a/runtime/vm/heap/become.h
+++ b/runtime/vm/heap/become.h
@@ -23,11 +23,11 @@
 // representation as a FreeListElement.
 class ForwardingCorpse {
  public:
-  RawObject* target() const { return target_; }
-  void set_target(RawObject* target) { target_ = target; }
+  ObjectPtr target() const { return target_; }
+  void set_target(ObjectPtr target) { target_ = target; }
 
   intptr_t HeapSize() {
-    intptr_t size = RawObject::SizeTag::decode(tags_);
+    intptr_t size = ObjectLayout::SizeTag::decode(tags_);
     if (size != 0) return size;
     return *SizeAddress();
   }
@@ -57,7 +57,7 @@
 #if defined(HASH_IN_OBJECT_HEADER)
   uint32_t hash_;
 #endif
-  RawObject* target_;
+  ObjectPtr target_;
 
   // Returns the address of the embedded size.
   intptr_t* SizeAddress() const {
@@ -91,7 +91,7 @@
   // forwarding objects' targets.
   static void FollowForwardingPointers(Thread* thread);
 
-  static void CrashDump(RawObject* before_obj, RawObject* after_obj);
+  static void CrashDump(ObjectPtr before_obj, ObjectPtr after_obj);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/heap/compactor.cc b/runtime/vm/heap/compactor.cc
index ce28a4b..fbea2f8 100644
--- a/runtime/vm/heap/compactor.cc
+++ b/runtime/vm/heap/compactor.cc
@@ -280,7 +280,7 @@
       // store lives in C-heap and will not move. Otherwise we have to update
       // the inner pointer.
       if (IsTypedDataClassId(cid)) {
-        raw_view->RecomputeDataFieldForInternalTypedData();
+        raw_view->ptr()->RecomputeDataFieldForInternalTypedData();
       } else {
         ASSERT(IsExternalTypedDataClassId(cid));
       }
@@ -470,9 +470,9 @@
   intptr_t block_dead_size = 0;
   uword current = first_object;
   while (current < block_end) {
-    RawObject* obj = RawObject::FromAddr(current);
-    intptr_t size = obj->HeapSize();
-    if (obj->IsMarked()) {
+    ObjectPtr obj = ObjectLayout::FromAddr(current);
+    intptr_t size = obj->ptr()->HeapSize();
+    if (obj->ptr()->IsMarked()) {
       forwarding_block->RecordLive(current, size);
       ASSERT(static_cast<intptr_t>(forwarding_block->Lookup(current)) ==
              block_live_size);
@@ -500,9 +500,9 @@
 
   uword old_addr = first_object;
   while (old_addr < block_end) {
-    RawObject* old_obj = RawObject::FromAddr(old_addr);
-    intptr_t size = old_obj->HeapSize();
-    if (old_obj->IsMarked()) {
+    ObjectPtr old_obj = ObjectLayout::FromAddr(old_addr);
+    intptr_t size = old_obj->ptr()->HeapSize();
+    if (old_obj->ptr()->IsMarked()) {
       uword new_addr = forwarding_block->Lookup(old_addr);
       if (new_addr != free_current_) {
         // The only situation where these two don't match is if we are moving
@@ -521,7 +521,7 @@
         free_end_ = free_page_->object_end();
         ASSERT(free_current_ == new_addr);
       }
-      RawObject* new_obj = RawObject::FromAddr(new_addr);
+      ObjectPtr new_obj = ObjectLayout::FromAddr(new_addr);
 
       // Fast path for no movement. There's often a large block of objects at
       // the beginning that don't move.
@@ -531,11 +531,11 @@
                 reinterpret_cast<void*>(old_addr), size);
 
         if (IsTypedDataClassId(new_obj->GetClassId())) {
-          reinterpret_cast<RawTypedData*>(new_obj)->RecomputeDataField();
+          static_cast<TypedDataPtr>(new_obj)->ptr()->RecomputeDataField();
         }
       }
-      new_obj->ClearMarkBit();
-      new_obj->VisitPointers(compactor_);
+      new_obj->ptr()->ClearMarkBit();
+      new_obj->ptr()->VisitPointers(compactor_);
 
       ASSERT(free_current_ == new_addr);
       free_current_ += size;
@@ -592,13 +592,13 @@
 }
 
 DART_FORCE_INLINE
-void GCCompactor::ForwardPointer(RawObject** ptr) {
-  RawObject* old_target = *ptr;
+void GCCompactor::ForwardPointer(ObjectPtr* ptr) {
+  ObjectPtr old_target = *ptr;
   if (old_target->IsSmiOrNewObject()) {
     return;  // Not moved.
   }
 
-  uword old_addr = RawObject::ToAddr(old_target);
+  uword old_addr = ObjectLayout::ToAddr(old_target);
   for (intptr_t i = 0; i < kMaxImagePages; i++) {
     if ((old_addr - image_page_ranges_[i].base) < image_page_ranges_[i].size) {
       return;  // Not moved (unaligned image page).
@@ -611,19 +611,19 @@
     return;  // Not moved (VM isolate, large page, code page).
   }
 
-  RawObject* new_target =
-      RawObject::FromAddr(forwarding_page->Lookup(old_addr));
+  ObjectPtr new_target =
+      ObjectLayout::FromAddr(forwarding_page->Lookup(old_addr));
   ASSERT(!new_target->IsSmiOrNewObject());
   *ptr = new_target;
 }
 
-void GCCompactor::VisitTypedDataViewPointers(RawTypedDataView* view,
-                                             RawObject** first,
-                                             RawObject** last) {
+void GCCompactor::VisitTypedDataViewPointers(TypedDataViewPtr view,
+                                             ObjectPtr* first,
+                                             ObjectPtr* last) {
   // First we forward all fields of the typed data view.
-  RawObject* old_backing = view->ptr()->typed_data_;
+  ObjectPtr old_backing = view->ptr()->typed_data_;
   VisitPointers(first, last);
-  RawObject* new_backing = view->ptr()->typed_data_;
+  ObjectPtr new_backing = view->ptr()->typed_data_;
 
   const bool backing_moved = old_backing != new_backing;
   if (backing_moved) {
@@ -644,8 +644,8 @@
     // The backing store didn't move, we therefore don't need to update the
     // inner pointer.
     if (view->ptr()->data_ == 0) {
-      ASSERT(ValueFromRawSmi(view->ptr()->offset_in_bytes_) == 0 &&
-             ValueFromRawSmi(view->ptr()->length_) == 0 &&
+      ASSERT(RawSmiValue(view->ptr()->offset_in_bytes_) == 0 &&
+             RawSmiValue(view->ptr()->length_) == 0 &&
              view->ptr()->typed_data_ == Object::null());
     }
   }
@@ -653,8 +653,8 @@
 
 // N.B.: This pointer visitor is not idempotent. We must take care to visit
 // each pointer exactly once.
-void GCCompactor::VisitPointers(RawObject** first, RawObject** last) {
-  for (RawObject** ptr = first; ptr <= last; ptr++) {
+void GCCompactor::VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  for (ObjectPtr* ptr = first; ptr <= last; ptr++) {
     ForwardPointer(ptr);
   }
 }
diff --git a/runtime/vm/heap/compactor.h b/runtime/vm/heap/compactor.h
index cd6b29c..e657f84 100644
--- a/runtime/vm/heap/compactor.h
+++ b/runtime/vm/heap/compactor.h
@@ -18,7 +18,6 @@
 class FreeList;
 class Heap;
 class HeapPage;
-class RawObject;
 
 // Implements a sliding compactor.
 class GCCompactor : public ValueObject,
@@ -38,11 +37,11 @@
 
   void SetupImagePageBoundaries();
   void ForwardStackPointers();
-  void ForwardPointer(RawObject** ptr);
-  void VisitTypedDataViewPointers(RawTypedDataView* view,
-                                  RawObject** first,
-                                  RawObject** last);
-  void VisitPointers(RawObject** first, RawObject** last);
+  void ForwardPointer(ObjectPtr* ptr);
+  void VisitTypedDataViewPointers(TypedDataViewPtr view,
+                                  ObjectPtr* first,
+                                  ObjectPtr* last);
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last);
   void VisitHandle(uword addr);
 
   Heap* heap_;
@@ -59,7 +58,7 @@
   // The typed data views whose inner pointer must be updated after sliding is
   // complete.
   Mutex typed_data_view_mutex_;
-  MallocGrowableArray<RawTypedDataView*> typed_data_views_;
+  MallocGrowableArray<TypedDataViewPtr> typed_data_views_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/heap/freelist.cc b/runtime/vm/heap/freelist.cc
index 20b02cc..3570378 100644
--- a/runtime/vm/heap/freelist.cc
+++ b/runtime/vm/heap/freelist.cc
@@ -22,20 +22,20 @@
   FreeListElement* result = reinterpret_cast<FreeListElement*>(addr);
 
   uint32_t tags = 0;
-  tags = RawObject::SizeTag::update(size, tags);
-  tags = RawObject::ClassIdTag::update(kFreeListElement, tags);
+  tags = ObjectLayout::SizeTag::update(size, tags);
+  tags = ObjectLayout::ClassIdTag::update(kFreeListElement, tags);
   ASSERT((addr & kNewObjectAlignmentOffset) == kOldObjectAlignmentOffset);
-  tags = RawObject::OldBit::update(true, tags);
-  tags = RawObject::OldAndNotMarkedBit::update(true, tags);
-  tags = RawObject::OldAndNotRememberedBit::update(true, tags);
-  tags = RawObject::NewBit::update(false, tags);
+  tags = ObjectLayout::OldBit::update(true, tags);
+  tags = ObjectLayout::OldAndNotMarkedBit::update(true, tags);
+  tags = ObjectLayout::OldAndNotRememberedBit::update(true, tags);
+  tags = ObjectLayout::NewBit::update(false, tags);
   result->tags_ = tags;
 #if defined(HASH_IN_OBJECT_HEADER)
   // Clearing this is mostly for neatness. The identityHashCode
   // of free list entries is not used.
   result->hash_ = 0;
 #endif
-  if (size > RawObject::SizeTag::kMaxSizeTag) {
+  if (size > ObjectLayout::SizeTag::kMaxSizeTag) {
     *result->SizeAddress() = size;
   }
   result->set_next(NULL);
@@ -51,7 +51,7 @@
 
 intptr_t FreeListElement::HeaderSizeFor(intptr_t size) {
   if (size == 0) return 0;
-  return ((size > RawObject::SizeTag::kMaxSizeTag) ? 3 : 2) * kWordSize;
+  return ((size > ObjectLayout::SizeTag::kMaxSizeTag) ? 3 : 2) * kWordSize;
 }
 
 FreeList::FreeList() : mutex_() {
diff --git a/runtime/vm/heap/freelist.h b/runtime/vm/heap/freelist.h
index 5b2c14a..1187ff3 100644
--- a/runtime/vm/heap/freelist.h
+++ b/runtime/vm/heap/freelist.h
@@ -29,7 +29,7 @@
   void set_next(FreeListElement* next) { next_ = next; }
 
   intptr_t HeapSize() {
-    intptr_t size = RawObject::SizeTag::decode(tags_);
+    intptr_t size = ObjectLayout::SizeTag::decode(tags_);
     if (size != 0) return size;
     return *SizeAddress();
   }
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 1ff35e1..0f3dcd0 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -323,26 +323,26 @@
   old_space_.VisitObjectPointers(visitor);
 }
 
-RawInstructions* Heap::FindObjectInCodeSpace(FindObjectVisitor* visitor) const {
+InstructionsPtr Heap::FindObjectInCodeSpace(FindObjectVisitor* visitor) const {
   // Only executable pages can have RawInstructions objects.
-  RawObject* raw_obj = old_space_.FindObject(visitor, HeapPage::kExecutable);
+  ObjectPtr raw_obj = old_space_.FindObject(visitor, HeapPage::kExecutable);
   ASSERT((raw_obj == Object::null()) ||
          (raw_obj->GetClassId() == kInstructionsCid));
-  return reinterpret_cast<RawInstructions*>(raw_obj);
+  return static_cast<InstructionsPtr>(raw_obj);
 }
 
-RawObject* Heap::FindOldObject(FindObjectVisitor* visitor) const {
+ObjectPtr Heap::FindOldObject(FindObjectVisitor* visitor) const {
   return old_space_.FindObject(visitor, HeapPage::kData);
 }
 
-RawObject* Heap::FindNewObject(FindObjectVisitor* visitor) {
+ObjectPtr Heap::FindNewObject(FindObjectVisitor* visitor) {
   return new_space_.FindObject(visitor);
 }
 
-RawObject* Heap::FindObject(FindObjectVisitor* visitor) {
+ObjectPtr Heap::FindObject(FindObjectVisitor* visitor) {
   // The visitor must not allocate from the heap.
   NoSafepointScope no_safepoint_scope;
-  RawObject* raw_obj = FindNewObject(visitor);
+  ObjectPtr raw_obj = FindNewObject(visitor);
   if (raw_obj != Object::null()) {
     return raw_obj;
   }
@@ -871,6 +871,8 @@
       return "low memory";
     case kDebugging:
       return "debugging";
+    case kSendAndExit:
+      return "send_and_exit";
     default:
       UNREACHABLE();
       return "";
@@ -891,7 +893,7 @@
   old_weak_tables_[kObjectIds]->Reset();
 }
 
-intptr_t Heap::GetWeakEntry(RawObject* raw_obj, WeakSelector sel) const {
+intptr_t Heap::GetWeakEntry(ObjectPtr raw_obj, WeakSelector sel) const {
   if (raw_obj->IsNewObject()) {
     return new_weak_tables_[sel]->GetValue(raw_obj);
   }
@@ -899,7 +901,7 @@
   return old_weak_tables_[sel]->GetValue(raw_obj);
 }
 
-void Heap::SetWeakEntry(RawObject* raw_obj, WeakSelector sel, intptr_t val) {
+void Heap::SetWeakEntry(ObjectPtr raw_obj, WeakSelector sel, intptr_t val) {
   if (raw_obj->IsNewObject()) {
     new_weak_tables_[sel]->SetValue(raw_obj, val);
   } else {
@@ -908,8 +910,7 @@
   }
 }
 
-void Heap::ForwardWeakEntries(RawObject* before_object,
-                              RawObject* after_object) {
+void Heap::ForwardWeakEntries(ObjectPtr before_object, ObjectPtr after_object) {
   const auto before_space =
       before_object->IsNewObject() ? Heap::kNew : Heap::kOld;
   const auto after_space =
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index 09f7584..49ee780 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -55,15 +55,16 @@
   };
 
   enum GCReason {
-    kNewSpace,   // New space is full.
-    kPromotion,  // Old space limit crossed after a scavenge.
-    kOldSpace,   // Old space limit crossed.
-    kFinalize,   // Concurrent marking finished.
-    kFull,       // Heap::CollectAllGarbage
-    kExternal,   // Dart_NewWeakPersistentHandle
-    kIdle,       // Dart_NotifyIdle
-    kLowMemory,  // Dart_NotifyLowMemory
-    kDebugging,  // service request, etc.
+    kNewSpace,     // New space is full.
+    kPromotion,    // Old space limit crossed after a scavenge.
+    kOldSpace,     // Old space limit crossed.
+    kFinalize,     // Concurrent marking finished.
+    kFull,         // Heap::CollectAllGarbage
+    kExternal,     // Dart_NewWeakPersistentHandle
+    kIdle,         // Dart_NotifyIdle
+    kLowMemory,    // Dart_NotifyLowMemory
+    kDebugging,    // service request, etc.
+    kSendAndExit,  // SendPort.sendAndExit
   };
 
   // Pattern for unused new space and swept old space.
@@ -114,10 +115,10 @@
   // The 'visitor' function should return false if the object is not found,
   // traversal through the heap space continues.
   // Returns null object if nothing is found.
-  RawInstructions* FindObjectInCodeSpace(FindObjectVisitor* visitor) const;
-  RawObject* FindOldObject(FindObjectVisitor* visitor) const;
-  RawObject* FindNewObject(FindObjectVisitor* visitor);
-  RawObject* FindObject(FindObjectVisitor* visitor);
+  InstructionsPtr FindObjectInCodeSpace(FindObjectVisitor* visitor) const;
+  ObjectPtr FindOldObject(FindObjectVisitor* visitor) const;
+  ObjectPtr FindNewObject(FindObjectVisitor* visitor);
+  ObjectPtr FindObject(FindObjectVisitor* visitor);
 
   void NotifyIdle(int64_t deadline);
   void NotifyLowMemory();
@@ -198,10 +199,10 @@
   static const char* GCReasonToString(GCReason reason);
 
   // Associate a peer with an object.  A non-existent peer is equal to NULL.
-  void SetPeer(RawObject* raw_obj, void* peer) {
+  void SetPeer(ObjectPtr raw_obj, void* peer) {
     SetWeakEntry(raw_obj, kPeers, reinterpret_cast<intptr_t>(peer));
   }
-  void* GetPeer(RawObject* raw_obj) const {
+  void* GetPeer(ObjectPtr raw_obj) const {
     return reinterpret_cast<void*>(GetWeakEntry(raw_obj, kPeers));
   }
   int64_t PeerCount() const;
@@ -209,37 +210,37 @@
 #if !defined(HASH_IN_OBJECT_HEADER)
   // Associate an identity hashCode with an object. An non-existent hashCode
   // is equal to 0.
-  void SetHash(RawObject* raw_obj, intptr_t hash) {
+  void SetHash(ObjectPtr raw_obj, intptr_t hash) {
     SetWeakEntry(raw_obj, kIdentityHashes, hash);
   }
-  intptr_t GetHash(RawObject* raw_obj) const {
+  intptr_t GetHash(ObjectPtr raw_obj) const {
     return GetWeakEntry(raw_obj, kIdentityHashes);
   }
 #endif
 
-  void SetCanonicalHash(RawObject* raw_obj, intptr_t hash) {
+  void SetCanonicalHash(ObjectPtr raw_obj, intptr_t hash) {
     SetWeakEntry(raw_obj, kCanonicalHashes, hash);
   }
-  intptr_t GetCanonicalHash(RawObject* raw_obj) const {
+  intptr_t GetCanonicalHash(ObjectPtr raw_obj) const {
     return GetWeakEntry(raw_obj, kCanonicalHashes);
   }
   void ResetCanonicalHashTable();
 
   // Associate an id with an object (used when serializing an object).
   // A non-existant id is equal to 0.
-  void SetObjectId(RawObject* raw_obj, intptr_t object_id) {
+  void SetObjectId(ObjectPtr raw_obj, intptr_t object_id) {
     ASSERT(Thread::Current()->IsMutatorThread());
     SetWeakEntry(raw_obj, kObjectIds, object_id);
   }
-  intptr_t GetObjectId(RawObject* raw_obj) const {
+  intptr_t GetObjectId(ObjectPtr raw_obj) const {
     ASSERT(Thread::Current()->IsMutatorThread());
     return GetWeakEntry(raw_obj, kObjectIds);
   }
   void ResetObjectIdTable();
 
   // Used by the GC algorithms to propagate weak entries.
-  intptr_t GetWeakEntry(RawObject* raw_obj, WeakSelector sel) const;
-  void SetWeakEntry(RawObject* raw_obj, WeakSelector sel, intptr_t val);
+  intptr_t GetWeakEntry(ObjectPtr raw_obj, WeakSelector sel) const;
+  void SetWeakEntry(ObjectPtr raw_obj, WeakSelector sel, intptr_t val);
 
   WeakTable* GetWeakTable(Space space, WeakSelector selector) const {
     if (space == kNew) {
@@ -257,7 +258,7 @@
     }
   }
 
-  void ForwardWeakEntries(RawObject* before_object, RawObject* after_object);
+  void ForwardWeakEntries(ObjectPtr before_object, ObjectPtr after_object);
   void ForwardWeakTables(ObjectPointerVisitor* visitor);
 
   // Stats collection.
diff --git a/runtime/vm/heap/heap_test.cc b/runtime/vm/heap/heap_test.cc
index 948d6f3..33c8500 100644
--- a/runtime/vm/heap/heap_test.cc
+++ b/runtime/vm/heap/heap_test.cc
@@ -2,14 +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.
 
+#include <map>
+#include <memory>
+#include <set>
+#include <string>
+
 #include "platform/globals.h"
 
 #include "platform/assert.h"
+#include "vm/class_finalizer.h"
 #include "vm/dart_api_impl.h"
 #include "vm/globals.h"
 #include "vm/heap/become.h"
 #include "vm/heap/heap.h"
+#include "vm/message_handler.h"
 #include "vm/object_graph.h"
+#include "vm/port.h"
 #include "vm/symbols.h"
 #include "vm/unit_test.h"
 
@@ -82,7 +90,7 @@
 }
 
 #ifndef PRODUCT
-static RawClass* GetClass(const Library& lib, const char* name) {
+static ClassPtr GetClass(const Library& lib, const char* name) {
   const Class& cls = Class::Handle(
       lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name))));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
@@ -200,24 +208,24 @@
 
 class FindOnly : public FindObjectVisitor {
  public:
-  explicit FindOnly(RawObject* target) : target_(target) {
+  explicit FindOnly(ObjectPtr target) : target_(target) {
 #if defined(DEBUG)
     EXPECT_GT(Thread::Current()->no_safepoint_scope_depth(), 0);
 #endif
   }
   virtual ~FindOnly() {}
 
-  virtual bool FindObject(RawObject* obj) const { return obj == target_; }
+  virtual bool FindObject(ObjectPtr obj) const { return obj == target_; }
 
  private:
-  RawObject* target_;
+  ObjectPtr target_;
 };
 
 class FindNothing : public FindObjectVisitor {
  public:
   FindNothing() {}
   virtual ~FindNothing() {}
-  virtual bool FindObject(RawObject* obj) const { return false; }
+  virtual bool FindObject(ObjectPtr obj) const { return false; }
 };
 
 ISOLATE_UNIT_TEST_CASE(FindObject) {
@@ -249,11 +257,11 @@
   GCTestHelper::WaitForGCTasks();
 
   Heap* heap = Thread::Current()->isolate()->heap();
-  EXPECT(heap->Contains(RawObject::ToAddr(obj.raw())));
+  EXPECT(heap->Contains(ObjectLayout::ToAddr(obj.raw())));
   heap->WriteProtect(true);
-  EXPECT(heap->Contains(RawObject::ToAddr(obj.raw())));
+  EXPECT(heap->Contains(ObjectLayout::ToAddr(obj.raw())));
   heap->WriteProtect(false);
-  EXPECT(heap->Contains(RawObject::ToAddr(obj.raw())));
+  EXPECT(heap->Contains(ObjectLayout::ToAddr(obj.raw())));
 }
 
 void TestBecomeForward(Heap::Space before_space, Heap::Space after_space) {
@@ -325,8 +333,8 @@
   const Array& after_obj = Array::Handle(Array::New(1, Heap::kOld));
   before_obj.SetAt(0, new_element);
   after_obj.SetAt(0, old_element);
-  EXPECT(before_obj.raw()->IsRemembered());
-  EXPECT(!after_obj.raw()->IsRemembered());
+  EXPECT(before_obj.raw()->ptr()->IsRemembered());
+  EXPECT(!after_obj.raw()->ptr()->IsRemembered());
 
   EXPECT(before_obj.raw() != after_obj.raw());
 
@@ -338,7 +346,7 @@
   Become::ElementsForwardIdentity(before, after);
 
   EXPECT(before_obj.raw() == after_obj.raw());
-  EXPECT(!after_obj.raw()->IsRemembered());
+  EXPECT(!after_obj.raw()->ptr()->IsRemembered());
 
   GCTestHelper::CollectAllGarbage();
 
@@ -607,6 +615,131 @@
   }
 };
 
+class MergeIsolatesHeapsHandler : public MessageHandler {
+ public:
+  explicit MergeIsolatesHeapsHandler(Isolate* owner)
+      : msg_(Utils::CreateCStringUniquePtr(nullptr)), owner_(owner) {}
+
+  const char* name() const { return "merge-isolates-heaps-handler"; }
+
+  ~MergeIsolatesHeapsHandler() { PortMap::ClosePorts(this); }
+
+  MessageStatus HandleMessage(std::unique_ptr<Message> message) {
+    // Parse the message.
+    Object& response_obj = Object::Handle();
+    if (message->IsRaw()) {
+      response_obj = message->raw_obj();
+    } else if (message->IsBequest()) {
+      Bequest* bequest = message->bequest();
+      PersistentHandle* handle = bequest->handle();
+      // Object in the receiving isolate's heap.
+      EXPECT(isolate()->heap()->Contains(ObjectLayout::ToAddr(handle->raw())));
+      response_obj = handle->raw();
+      isolate()->group()->api_state()->FreePersistentHandle(handle);
+    } else {
+      Thread* thread = Thread::Current();
+      MessageSnapshotReader reader(message.get(), thread);
+      response_obj = reader.ReadObject();
+    }
+    if (response_obj.IsString()) {
+      String& response = String::Handle();
+      response ^= response_obj.raw();
+      msg_.reset(strdup(response.ToCString()));
+    } else {
+      ASSERT(response_obj.IsArray());
+      Array& response_array = Array::Handle();
+      response_array ^= response_obj.raw();
+      ASSERT(response_array.Length() == 1);
+      ExternalTypedData& response = ExternalTypedData::Handle();
+      response ^= response_array.At(0);
+      msg_.reset(strdup(reinterpret_cast<char*>(response.DataAddr(0))));
+    }
+
+    return kOK;
+  }
+
+  const char* msg() const { return msg_.get(); }
+
+  virtual Isolate* isolate() const { return owner_; }
+
+ private:
+  Utils::CStringUniquePtr msg_;
+  Isolate* owner_;
+};
+
+VM_UNIT_TEST_CASE(CleanupBequestNeverReceived) {
+  const char* TEST_MESSAGE = "hello, world";
+  Dart_Isolate parent = TestCase::CreateTestIsolate("parent");
+  EXPECT_EQ(parent, Dart_CurrentIsolate());
+  {
+    MergeIsolatesHeapsHandler handler(Isolate::Current());
+    Dart_Port port_id = PortMap::CreatePort(&handler);
+    EXPECT_EQ(PortMap::GetIsolate(port_id), Isolate::Current());
+    Dart_ExitIsolate();
+
+    Dart_Isolate worker = TestCase::CreateTestIsolateInGroup("worker", parent);
+    EXPECT_EQ(worker, Dart_CurrentIsolate());
+    {
+      Thread* thread = Thread::Current();
+      TransitionNativeToVM transition(thread);
+      StackZone zone(thread);
+      HANDLESCOPE(thread);
+
+      String& string = String::Handle(String::New(TEST_MESSAGE));
+      PersistentHandle* handle =
+          Isolate::Current()->group()->api_state()->AllocatePersistentHandle();
+      handle->set_raw(string.raw());
+
+      reinterpret_cast<Isolate*>(worker)->bequeath(
+          std::unique_ptr<Bequest>(new Bequest(handle, port_id)));
+    }
+  }
+  Dart_ShutdownIsolate();
+  Dart_EnterIsolate(parent);
+  Dart_ShutdownIsolate();
+}
+
+VM_UNIT_TEST_CASE(ReceivesSendAndExitMessage) {
+  const char* TEST_MESSAGE = "hello, world";
+  Dart_Isolate parent = TestCase::CreateTestIsolate("parent");
+  EXPECT_EQ(parent, Dart_CurrentIsolate());
+  MergeIsolatesHeapsHandler handler(Isolate::Current());
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  EXPECT_EQ(PortMap::GetIsolate(port_id), Isolate::Current());
+  Dart_ExitIsolate();
+
+  Dart_Isolate worker = TestCase::CreateTestIsolateInGroup("worker", parent);
+  EXPECT_EQ(worker, Dart_CurrentIsolate());
+  {
+    Thread* thread = Thread::Current();
+    TransitionNativeToVM transition(thread);
+    StackZone zone(thread);
+    HANDLESCOPE(thread);
+
+    String& string = String::Handle(String::New(TEST_MESSAGE));
+
+    PersistentHandle* handle =
+        Isolate::Current()->group()->api_state()->AllocatePersistentHandle();
+    handle->set_raw(string.raw());
+
+    reinterpret_cast<Isolate*>(worker)->bequeath(
+        std::unique_ptr<Bequest>(new Bequest(handle, port_id)));
+  }
+
+  Dart_ShutdownIsolate();
+  Dart_EnterIsolate(parent);
+  {
+    Thread* thread = Thread::Current();
+    TransitionNativeToVM transition(thread);
+    StackZone zone(thread);
+    HANDLESCOPE(thread);
+
+    EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
+  }
+  EXPECT_STREQ(handler.msg(), TEST_MESSAGE);
+  Dart_ShutdownIsolate();
+}
+
 ISOLATE_UNIT_TEST_CASE(ExternalAllocationStats) {
   Isolate* isolate = thread->isolate();
   Heap* heap = thread->heap();
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index e30b529..716d281 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -34,7 +34,7 @@
         page_space_(page_space),
         work_list_(marking_stack),
         deferred_work_list_(deferred_marking_stack),
-        delayed_weak_properties_(NULL),
+        delayed_weak_properties_(nullptr),
         marked_bytes_(0),
         marked_micros_(0) {
     ASSERT(thread_->isolate_group() == isolate_group);
@@ -47,37 +47,38 @@
 
   bool ProcessPendingWeakProperties() {
     bool marked = false;
-    RawWeakProperty* cur_weak = delayed_weak_properties_;
-    delayed_weak_properties_ = NULL;
-    while (cur_weak != NULL) {
+    WeakPropertyPtr cur_weak = delayed_weak_properties_;
+    delayed_weak_properties_ = nullptr;
+    while (cur_weak != nullptr) {
       uword next_weak = cur_weak->ptr()->next_;
-      RawObject* raw_key = cur_weak->ptr()->key_;
+      ObjectPtr raw_key = cur_weak->ptr()->key_;
       // Reset the next pointer in the weak property.
       cur_weak->ptr()->next_ = 0;
-      if (raw_key->IsMarked()) {
-        RawObject* raw_val = cur_weak->ptr()->value_;
-        marked = marked || (raw_val->IsHeapObject() && !raw_val->IsMarked());
+      if (raw_key->ptr()->IsMarked()) {
+        ObjectPtr raw_val = cur_weak->ptr()->value_;
+        marked =
+            marked || (raw_val->IsHeapObject() && !raw_val->ptr()->IsMarked());
 
         // The key is marked so we make sure to properly visit all pointers
         // originating from this weak property.
-        cur_weak->VisitPointersNonvirtual(this);
+        cur_weak->ptr()->VisitPointersNonvirtual(this);
       } else {
         // Requeue this weak property to be handled later.
         EnqueueWeakProperty(cur_weak);
       }
       // Advance to next weak property in the queue.
-      cur_weak = reinterpret_cast<RawWeakProperty*>(next_weak);
+      cur_weak = static_cast<WeakPropertyPtr>(next_weak);
     }
     return marked;
   }
 
   void DrainMarkingStack() {
-    RawObject* raw_obj = work_list_.Pop();
-    if ((raw_obj == NULL) && ProcessPendingWeakProperties()) {
+    ObjectPtr raw_obj = work_list_.Pop();
+    if ((raw_obj == nullptr) && ProcessPendingWeakProperties()) {
       raw_obj = work_list_.Pop();
     }
 
-    if (raw_obj == NULL) {
+    if (raw_obj == nullptr) {
       return;
     }
 
@@ -88,15 +89,15 @@
 
         intptr_t size;
         if (class_id != kWeakPropertyCid) {
-          size = raw_obj->VisitPointersNonvirtual(this);
+          size = raw_obj->ptr()->VisitPointersNonvirtual(this);
         } else {
-          RawWeakProperty* raw_weak = static_cast<RawWeakProperty*>(raw_obj);
+          WeakPropertyPtr raw_weak = static_cast<WeakPropertyPtr>(raw_obj);
           size = ProcessWeakProperty(raw_weak, /* did_mark */ true);
         }
         marked_bytes_ += size;
 
         raw_obj = work_list_.Pop();
-      } while (raw_obj != NULL);
+      } while (raw_obj != nullptr);
 
       // Marking stack is empty.
       ProcessPendingWeakProperties();
@@ -104,7 +105,7 @@
       // Check whether any further work was pushed either by other markers or
       // by the handling of weak properties.
       raw_obj = work_list_.Pop();
-    } while (raw_obj != NULL);
+    } while (raw_obj != nullptr);
   }
 
   // Races: The concurrent marker is racing with the mutator, but this race is
@@ -119,51 +120,51 @@
   // we don't do any in-place unboxing like V8), any value we read from the slot
   // is safe.
   NO_SANITIZE_THREAD
-  RawObject* LoadPointerIgnoreRace(RawObject** ptr) { return *ptr; }
+  ObjectPtr LoadPointerIgnoreRace(ObjectPtr* ptr) { return *ptr; }
 
-  void VisitPointers(RawObject** first, RawObject** last) {
-    for (RawObject** current = first; current <= last; current++) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+    for (ObjectPtr* current = first; current <= last; current++) {
       MarkObject(LoadPointerIgnoreRace(current));
     }
   }
 
-  void EnqueueWeakProperty(RawWeakProperty* raw_weak) {
+  void EnqueueWeakProperty(WeakPropertyPtr raw_weak) {
     ASSERT(raw_weak->IsHeapObject());
     ASSERT(raw_weak->IsOldObject());
     ASSERT(raw_weak->IsWeakProperty());
-    ASSERT(raw_weak->IsMarked());
+    ASSERT(raw_weak->ptr()->IsMarked());
     ASSERT(raw_weak->ptr()->next_ == 0);
-    raw_weak->ptr()->next_ = reinterpret_cast<uword>(delayed_weak_properties_);
+    raw_weak->ptr()->next_ = static_cast<uword>(delayed_weak_properties_);
     delayed_weak_properties_ = raw_weak;
   }
 
-  intptr_t ProcessWeakProperty(RawWeakProperty* raw_weak, bool did_mark) {
+  intptr_t ProcessWeakProperty(WeakPropertyPtr raw_weak, bool did_mark) {
     // The fate of the weak property is determined by its key.
-    RawObject* raw_key = LoadPointerIgnoreRace(&raw_weak->ptr()->key_);
+    ObjectPtr raw_key = LoadPointerIgnoreRace(&raw_weak->ptr()->key_);
     if (raw_key->IsHeapObject() && raw_key->IsOldObject() &&
-        !raw_key->IsMarked()) {
+        !raw_key->ptr()->IsMarked()) {
       // Key was white. Enqueue the weak property.
       if (did_mark) {
         EnqueueWeakProperty(raw_weak);
       }
-      return raw_weak->HeapSize();
+      return raw_weak->ptr()->HeapSize();
     }
     // Key is gray or black. Make the weak property black.
-    return raw_weak->VisitPointersNonvirtual(this);
+    return raw_weak->ptr()->VisitPointersNonvirtual(this);
   }
 
   void ProcessDeferredMarking() {
-    RawObject* raw_obj;
-    while ((raw_obj = deferred_work_list_.Pop()) != NULL) {
+    ObjectPtr raw_obj;
+    while ((raw_obj = deferred_work_list_.Pop()) != nullptr) {
       ASSERT(raw_obj->IsHeapObject() && raw_obj->IsOldObject());
       // N.B. We are scanning the object even if it is already marked.
       bool did_mark = TryAcquireMarkBit(raw_obj);
       const intptr_t class_id = raw_obj->GetClassId();
       intptr_t size;
       if (class_id != kWeakPropertyCid) {
-        size = raw_obj->VisitPointersNonvirtual(this);
+        size = raw_obj->ptr()->VisitPointersNonvirtual(this);
       } else {
-        RawWeakProperty* raw_weak = static_cast<RawWeakProperty*>(raw_obj);
+        WeakPropertyPtr raw_weak = static_cast<WeakPropertyPtr>(raw_obj);
         size = ProcessWeakProperty(raw_weak, did_mark);
       }
       // Add the size only if we win the marking race to prevent
@@ -183,17 +184,17 @@
   void Finalize() {
     work_list_.Finalize();
     // Clear pending weak properties.
-    RawWeakProperty* cur_weak = delayed_weak_properties_;
-    delayed_weak_properties_ = NULL;
+    WeakPropertyPtr cur_weak = delayed_weak_properties_;
+    delayed_weak_properties_ = nullptr;
     intptr_t weak_properties_cleared = 0;
-    while (cur_weak != NULL) {
+    while (cur_weak != nullptr) {
       uword next_weak = cur_weak->ptr()->next_;
       cur_weak->ptr()->next_ = 0;
-      RELEASE_ASSERT(!cur_weak->ptr()->key_->IsMarked());
+      RELEASE_ASSERT(!cur_weak->ptr()->key_->ptr()->IsMarked());
       WeakProperty::Clear(cur_weak);
       weak_properties_cleared++;
       // Advance to next weak property in the queue.
-      cur_weak = reinterpret_cast<RawWeakProperty*>(next_weak);
+      cur_weak = static_cast<WeakPropertyPtr>(next_weak);
     }
   }
 
@@ -203,30 +204,30 @@
   }
 
  private:
-  void PushMarked(RawObject* raw_obj) {
+  void PushMarked(ObjectPtr raw_obj) {
     ASSERT(raw_obj->IsHeapObject());
     ASSERT(raw_obj->IsOldObject());
 
     // Push the marked object on the marking stack.
-    ASSERT(raw_obj->IsMarked());
+    ASSERT(raw_obj->ptr()->IsMarked());
     work_list_.Push(raw_obj);
   }
 
-  static bool TryAcquireMarkBit(RawObject* raw_obj) {
+  static bool TryAcquireMarkBit(ObjectPtr raw_obj) {
     if (FLAG_write_protect_code && raw_obj->IsInstructions()) {
       // A non-writable alias mapping may exist for instruction pages.
       raw_obj = HeapPage::ToWritable(raw_obj);
     }
     if (!sync) {
-      raw_obj->SetMarkBitUnsynchronized();
+      raw_obj->ptr()->SetMarkBitUnsynchronized();
       return true;
     } else {
-      return raw_obj->TryAcquireMarkBit();
+      return raw_obj->ptr()->TryAcquireMarkBit();
     }
   }
 
   DART_FORCE_INLINE
-  void MarkObject(RawObject* raw_obj) {
+  void MarkObject(ObjectPtr raw_obj) {
     // Fast exit if the raw object is immediate or in new space. No memory
     // access.
     if (raw_obj->IsSmiOrNewObject()) {
@@ -239,7 +240,7 @@
     // change in the value.
     // Doing this before checking for an Instructions object avoids
     // unnecessary queueing of pre-marked objects.
-    if (raw_obj->IsMarked()) {
+    if (raw_obj->ptr()->IsMarked()) {
       return;
     }
 
@@ -265,7 +266,7 @@
   PageSpace* page_space_;
   MarkerWorkList work_list_;
   MarkerWorkList deferred_work_list_;
-  RawWeakProperty* delayed_weak_properties_;
+  WeakPropertyPtr delayed_weak_properties_;
   uintptr_t marked_bytes_;
   int64_t marked_micros_;
 
@@ -275,7 +276,7 @@
 typedef MarkingVisitorBase<false> UnsyncMarkingVisitor;
 typedef MarkingVisitorBase<true> SyncMarkingVisitor;
 
-static bool IsUnreachable(const RawObject* raw_obj) {
+static bool IsUnreachable(const ObjectPtr raw_obj) {
   if (!raw_obj->IsHeapObject()) {
     return false;
   }
@@ -285,7 +286,7 @@
   if (!raw_obj->IsOldObject()) {
     return false;
   }
-  return !raw_obj->IsMarked();
+  return !raw_obj->ptr()->IsMarked();
 }
 
 class MarkingWeakVisitor : public HandleVisitor {
@@ -297,7 +298,7 @@
   void VisitHandle(uword addr) {
     FinalizablePersistentHandle* handle =
         reinterpret_cast<FinalizablePersistentHandle*>(addr);
-    RawObject* raw_obj = handle->raw();
+    ObjectPtr raw_obj = handle->raw();
     if (IsUnreachable(raw_obj)) {
       handle->UpdateUnreachable(thread()->isolate_group());
     }
@@ -423,9 +424,9 @@
     intptr_t size = table->size();
     for (intptr_t i = 0; i < size; i++) {
       if (table->IsValidEntryAtExclusive(i)) {
-        RawObject* raw_obj = table->ObjectAtExclusive(i);
+        ObjectPtr raw_obj = table->ObjectAtExclusive(i);
         ASSERT(raw_obj->IsHeapObject());
-        if (!raw_obj->IsMarked()) {
+        if (!raw_obj->ptr()->IsMarked()) {
           table->InvalidateAtExclusive(i);
         }
       }
@@ -444,10 +445,10 @@
     // Generated code appends to store buffers; tell MemorySanitizer.
     MSAN_UNPOISON(reading, sizeof(*reading));
     while (!reading->IsEmpty()) {
-      RawObject* raw_object = reading->Pop();
+      ObjectPtr raw_object = reading->Pop();
       ASSERT(!raw_object->IsForwardingCorpse());
-      ASSERT(raw_object->IsRemembered());
-      if (raw_object->IsMarked()) {
+      ASSERT(raw_object->ptr()->IsRemembered());
+      if (raw_object->ptr()->IsMarked()) {
         writing->Push(raw_object);
         if (writing->IsFull()) {
           store_buffer->PushBlock(writing, StoreBuffer::kIgnoreThreshold);
@@ -468,11 +469,11 @@
   explicit ObjectIdRingClearPointerVisitor(IsolateGroup* isolate_group)
       : ObjectPointerVisitor(isolate_group) {}
 
-  void VisitPointers(RawObject** first, RawObject** last) {
-    for (RawObject** current = first; current <= last; current++) {
-      RawObject* raw_obj = *current;
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+    for (ObjectPtr* current = first; current <= last; current++) {
+      ObjectPtr raw_obj = *current;
       ASSERT(raw_obj->IsHeapObject());
-      if (raw_obj->IsOldObject() && !raw_obj->IsMarked()) {
+      if (raw_obj->IsOldObject() && !raw_obj->ptr()->IsMarked()) {
         // Object has become garbage. Replace it will null.
         *current = Object::null();
       }
diff --git a/runtime/vm/heap/marker.h b/runtime/vm/heap/marker.h
index a4ad4c0b..7f78a58 100644
--- a/runtime/vm/heap/marker.h
+++ b/runtime/vm/heap/marker.h
@@ -17,7 +17,6 @@
 class IsolateGroup;
 class ObjectPointerVisitor;
 class PageSpace;
-class RawWeakProperty;
 template <bool sync>
 class MarkingVisitorBase;
 class Thread;
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index 16776bd..1c6444c 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -97,9 +97,9 @@
   uword obj_addr = object_start();
   uword end_addr = object_end();
   while (obj_addr < end_addr) {
-    RawObject* raw_obj = RawObject::FromAddr(obj_addr);
+    ObjectPtr raw_obj = ObjectLayout::FromAddr(obj_addr);
     visitor->VisitObject(raw_obj);
-    obj_addr += raw_obj->HeapSize();
+    obj_addr += raw_obj->ptr()->HeapSize();
   }
   ASSERT(obj_addr == end_addr);
 }
@@ -111,8 +111,8 @@
   uword obj_addr = object_start();
   uword end_addr = object_end();
   while (obj_addr < end_addr) {
-    RawObject* raw_obj = RawObject::FromAddr(obj_addr);
-    obj_addr += raw_obj->VisitPointers(visitor);
+    ObjectPtr raw_obj = ObjectLayout::FromAddr(obj_addr);
+    obj_addr += raw_obj->ptr()->VisitPointers(visitor);
   }
   ASSERT(obj_addr == end_addr);
 }
@@ -128,19 +128,19 @@
 
   bool table_is_empty = false;
 
-  RawArray* obj = static_cast<RawArray*>(RawObject::FromAddr(object_start()));
+  ArrayPtr obj = static_cast<ArrayPtr>(ObjectLayout::FromAddr(object_start()));
   ASSERT(obj->IsArray());
-  ASSERT(obj->IsCardRemembered());
-  RawObject** obj_from = obj->from();
-  RawObject** obj_to = obj->to(Smi::Value(obj->ptr()->length_));
+  ASSERT(obj->ptr()->IsCardRemembered());
+  ObjectPtr* obj_from = obj->ptr()->from();
+  ObjectPtr* obj_to = obj->ptr()->to(Smi::Value(obj->ptr()->length_));
 
   const intptr_t size = card_table_size();
   for (intptr_t i = 0; i < size; i++) {
     if (card_table_[i] != 0) {
-      RawObject** card_from =
-          reinterpret_cast<RawObject**>(this) + (i << kSlotsPerCardLog2);
-      RawObject** card_to = reinterpret_cast<RawObject**>(card_from) +
-                            (1 << kSlotsPerCardLog2) - 1;
+      ObjectPtr* card_from =
+          reinterpret_cast<ObjectPtr*>(this) + (i << kSlotsPerCardLog2);
+      ObjectPtr* card_to = reinterpret_cast<ObjectPtr*>(card_from) +
+                           (1 << kSlotsPerCardLog2) - 1;
       // Minus 1 because to is inclusive.
 
       if (card_from < obj_from) {
@@ -156,7 +156,7 @@
       visitor->VisitPointers(card_from, card_to);
 
       bool has_new_target = false;
-      for (RawObject** slot = card_from; slot <= card_to; slot++) {
+      for (ObjectPtr* slot = card_from; slot <= card_to; slot++) {
         if ((*slot)->IsNewObjectMayBeSmi()) {
           has_new_target = true;
           break;
@@ -178,15 +178,15 @@
   }
 }
 
-RawObject* HeapPage::FindObject(FindObjectVisitor* visitor) const {
+ObjectPtr HeapPage::FindObject(FindObjectVisitor* visitor) const {
   uword obj_addr = object_start();
   uword end_addr = object_end();
   if (visitor->VisitRange(obj_addr, end_addr)) {
     while (obj_addr < end_addr) {
-      RawObject* raw_obj = RawObject::FromAddr(obj_addr);
-      uword next_obj_addr = obj_addr + raw_obj->HeapSize();
+      ObjectPtr raw_obj = ObjectLayout::FromAddr(obj_addr);
+      uword next_obj_addr = obj_addr + raw_obj->ptr()->HeapSize();
       if (visitor->VisitRange(obj_addr, next_obj_addr) &&
-          raw_obj->FindObject(visitor)) {
+          raw_obj->ptr()->FindObject(visitor)) {
         return raw_obj;  // Found object, return it.
       }
       obj_addr = next_obj_addr;
@@ -837,12 +837,12 @@
   }
 }
 
-RawObject* PageSpace::FindObject(FindObjectVisitor* visitor,
-                                 HeapPage::PageType type) const {
+ObjectPtr PageSpace::FindObject(FindObjectVisitor* visitor,
+                                HeapPage::PageType type) const {
   if (type == HeapPage::kExecutable) {
     // Fast path executable pages.
     for (ExclusiveCodePageIterator it(this); !it.Done(); it.Advance()) {
-      RawObject* obj = it.page()->FindObject(visitor);
+      ObjectPtr obj = it.page()->FindObject(visitor);
       if (obj != Object::null()) {
         return obj;
       }
@@ -852,7 +852,7 @@
 
   for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
     if (it.page()->type() == type) {
-      RawObject* obj = it.page()->FindObject(visitor);
+      ObjectPtr obj = it.page()->FindObject(visitor);
       if (obj != Object::null()) {
         return obj;
       }
@@ -902,8 +902,8 @@
 class HeapMapAsJSONVisitor : public ObjectVisitor {
  public:
   explicit HeapMapAsJSONVisitor(JSONArray* array) : array_(array) {}
-  virtual void VisitObject(RawObject* obj) {
-    array_->AddValue(obj->HeapSize() / kObjectAlignment);
+  virtual void VisitObject(ObjectPtr obj) {
+    array_->AddValue(obj->ptr()->HeapSize() / kObjectAlignment);
     array_->AddValue(obj->GetClassId());
   }
 
@@ -1405,8 +1405,8 @@
   image_pages_ = page;
 }
 
-bool PageSpace::IsObjectFromImagePages(dart::RawObject* object) {
-  uword object_addr = RawObject::ToAddr(object);
+bool PageSpace::IsObjectFromImagePages(dart::ObjectPtr object) {
+  uword object_addr = ObjectLayout::ToAddr(object);
   HeapPage* image_page = image_pages_;
   while (image_page != nullptr) {
     if (image_page->Contains(object_addr)) {
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index 63aa158f..6460ae0 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -65,7 +65,7 @@
   void VisitObjects(ObjectVisitor* visitor) const;
   void VisitObjectPointers(ObjectPointerVisitor* visitor) const;
 
-  RawObject* FindObject(FindObjectVisitor* visitor) const;
+  ObjectPtr FindObject(FindObjectVisitor* visitor) const;
 
   void WriteProtect(bool read_only);
 
@@ -76,11 +76,10 @@
   // Warning: This does not work for objects on image pages because image pages
   // are not aligned. However, it works for objects on large pages, because
   // only one object is allocated per large page.
-  static HeapPage* Of(RawObject* obj) {
+  static HeapPage* Of(ObjectPtr obj) {
     ASSERT(obj->IsHeapObject());
     ASSERT(obj->IsOldObject());
-    return reinterpret_cast<HeapPage*>(reinterpret_cast<uword>(obj) &
-                                       kPageMask);
+    return reinterpret_cast<HeapPage*>(static_cast<uword>(obj) & kPageMask);
   }
 
   // Warning: This does not work for addresses on image pages or on large pages.
@@ -89,16 +88,16 @@
   }
 
   // Warning: This does not work for objects on image pages.
-  static RawObject* ToExecutable(RawObject* obj) {
+  static ObjectPtr ToExecutable(ObjectPtr obj) {
     HeapPage* page = Of(obj);
     VirtualMemory* memory = page->memory_;
     const intptr_t alias_offset = memory->AliasOffset();
     if (alias_offset == 0) {
       return obj;  // Not aliased.
     }
-    uword addr = RawObject::ToAddr(obj);
+    uword addr = ObjectLayout::ToAddr(obj);
     if (memory->Contains(addr)) {
-      return RawObject::FromAddr(addr + alias_offset);
+      return ObjectLayout::FromAddr(addr + alias_offset);
     }
     // obj is executable.
     ASSERT(memory->ContainsAlias(addr));
@@ -106,16 +105,16 @@
   }
 
   // Warning: This does not work for objects on image pages.
-  static RawObject* ToWritable(RawObject* obj) {
+  static ObjectPtr ToWritable(ObjectPtr obj) {
     HeapPage* page = Of(obj);
     VirtualMemory* memory = page->memory_;
     const intptr_t alias_offset = memory->AliasOffset();
     if (alias_offset == 0) {
       return obj;  // Not aliased.
     }
-    uword addr = RawObject::ToAddr(obj);
+    uword addr = ObjectLayout::ToAddr(obj);
     if (memory->ContainsAlias(addr)) {
-      return RawObject::FromAddr(addr - alias_offset);
+      return ObjectLayout::FromAddr(addr - alias_offset);
     }
     // obj is writable.
     ASSERT(memory->Contains(addr));
@@ -134,7 +133,7 @@
     return OFFSET_OF(HeapPage, card_table_);
   }
 
-  void RememberCard(RawObject* const* slot) {
+  void RememberCard(ObjectPtr const* slot) {
     ASSERT(Contains(reinterpret_cast<uword>(slot)));
     if (card_table_ == NULL) {
       card_table_ = reinterpret_cast<uint8_t*>(
@@ -362,8 +361,8 @@
 
   void VisitRememberedCards(ObjectPointerVisitor* visitor) const;
 
-  RawObject* FindObject(FindObjectVisitor* visitor,
-                        HeapPage::PageType type) const;
+  ObjectPtr FindObject(FindObjectVisitor* visitor,
+                       HeapPage::PageType type) const;
 
   // Collect the garbage in the page space using mark-sweep or mark-compact.
   void CollectGarbage(bool compact, bool finalize);
@@ -471,7 +470,7 @@
     enable_concurrent_mark_ = enable_concurrent_mark;
   }
 
-  bool IsObjectFromImagePages(RawObject* object);
+  bool IsObjectFromImagePages(ObjectPtr object);
 
   void MergeOtherPageSpace(PageSpace* other);
 
diff --git a/runtime/vm/heap/pointer_block.h b/runtime/vm/heap/pointer_block.h
index a5505e2..73cf03b 100644
--- a/runtime/vm/heap/pointer_block.h
+++ b/runtime/vm/heap/pointer_block.h
@@ -8,15 +8,15 @@
 #include "platform/assert.h"
 #include "vm/globals.h"
 #include "vm/os_thread.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
 // Forward declarations.
 class Isolate;
-class RawObject;
 class ObjectPointerVisitor;
 
-// A set of RawObject*. Must be emptied before destruction (using Pop/Reset).
+// A set of ObjectPtr. Must be emptied before destruction (using Pop/Reset).
 template <int Size>
 class PointerBlock {
  public:
@@ -33,18 +33,18 @@
   bool IsFull() const { return Count() == kSize; }
   bool IsEmpty() const { return Count() == 0; }
 
-  void Push(RawObject* obj) {
+  void Push(ObjectPtr obj) {
     ASSERT(!IsFull());
     pointers_[top_++] = obj;
   }
 
-  RawObject* Pop() {
+  ObjectPtr Pop() {
     ASSERT(!IsEmpty());
     return pointers_[--top_];
   }
 
 #if defined(TESTING)
-  bool Contains(RawObject* obj) const {
+  bool Contains(ObjectPtr obj) const {
     // Generated code appends to store buffers; tell MemorySanitizer.
     MSAN_UNPOISON(this, sizeof(*this));
     for (intptr_t i = 0; i < Count(); i++) {
@@ -71,7 +71,7 @@
 
   PointerBlock<Size>* next_;
   int32_t top_;
-  RawObject* pointers_[kSize];
+  ObjectPtr pointers_[kSize];
 
   template <int>
   friend class BlockStack;
@@ -159,7 +159,7 @@
   }
 
   // Returns nullptr if no more work was found.
-  RawObject* Pop() {
+  ObjectPtr Pop() {
     ASSERT(work_ != nullptr);
     if (work_->IsEmpty()) {
       // TODO(koda): Track over/underflow events and use in heuristics to
@@ -176,7 +176,7 @@
     return work_->Pop();
   }
 
-  void Push(RawObject* raw_obj) {
+  void Push(ObjectPtr raw_obj) {
     if (work_->IsFull()) {
       // TODO(koda): Track over/underflow events and use in heuristics to
       // distribute work and prevent degenerate flip-flopping.
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 5c8e620..f708317 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -36,11 +36,11 @@
             "Grow new gen when less than this percentage is garbage.");
 DEFINE_FLAG(int, new_gen_growth_factor, 2, "Grow new gen by this factor.");
 
-// Scavenger uses RawObject::kMarkBit to distinguish forwarded and non-forwarded
-// objects. The kMarkBit does not intersect with the target address because of
-// object alignment.
+// Scavenger uses ObjectLayout::kMarkBit to distinguish forwarded and
+// non-forwarded objects. The kMarkBit does not intersect with the target
+// address because of object alignment.
 enum {
-  kForwardingMask = 1 << RawObject::kOldAndNotMarkedBit,
+  kForwardingMask = 1 << ObjectLayout::kOldAndNotMarkedBit,
   kNotForwarded = 0,
   kForwarded = kForwardingMask,
 };
@@ -109,7 +109,7 @@
         page_space_(scavenger->heap_->old_space()),
         freelist_(freelist),
         bytes_promoted_(0),
-        visiting_old_object_(NULL),
+        visiting_old_object_(nullptr),
         promoted_list_(promotion_stack),
         labs_(8) {
     ASSERT(labs_.length() == 0);
@@ -117,28 +117,28 @@
     ASSERT(labs_.length() == 1);
   }
 
-  virtual void VisitTypedDataViewPointers(RawTypedDataView* view,
-                                          RawObject** first,
-                                          RawObject** last) {
+  virtual void VisitTypedDataViewPointers(TypedDataViewPtr view,
+                                          ObjectPtr* first,
+                                          ObjectPtr* last) {
     // First we forward all fields of the typed data view.
     VisitPointers(first, last);
 
     if (view->ptr()->data_ == nullptr) {
-      ASSERT(ValueFromRawSmi(view->ptr()->offset_in_bytes_) == 0 &&
-             ValueFromRawSmi(view->ptr()->length_) == 0);
+      ASSERT(RawSmiValue(view->ptr()->offset_in_bytes_) == 0 &&
+             RawSmiValue(view->ptr()->length_) == 0);
       return;
     }
 
     // Validate 'this' is a typed data view.
     const uword view_header =
-        *reinterpret_cast<uword*>(RawObject::ToAddr(view));
+        *reinterpret_cast<uword*>(ObjectLayout::ToAddr(view));
     ASSERT(!IsForwarding(view_header) || view->IsOldObject());
     ASSERT(IsTypedDataViewClassId(view->GetClassIdMayBeSmi()));
 
     // Validate that the backing store is not a forwarding word.
-    RawTypedDataBase* td = view->ptr()->typed_data_;
+    TypedDataBasePtr td = view->ptr()->typed_data_;
     ASSERT(td->IsHeapObject());
-    const uword td_header = *reinterpret_cast<uword*>(RawObject::ToAddr(td));
+    const uword td_header = *reinterpret_cast<uword*>(ObjectLayout::ToAddr(td));
     ASSERT(!IsForwarding(td_header) || td->IsOldObject());
 
     // We can always obtain the class id from the forwarded backing store.
@@ -152,23 +152,23 @@
 
     // Now we update the inner pointer.
     ASSERT(IsTypedDataClassId(cid));
-    view->RecomputeDataFieldForInternalTypedData();
+    view->ptr()->RecomputeDataFieldForInternalTypedData();
   }
 
-  virtual void VisitPointers(RawObject** first, RawObject** last) {
+  virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
     ASSERT(Utils::IsAligned(first, sizeof(*first)));
     ASSERT(Utils::IsAligned(last, sizeof(*last)));
-    for (RawObject** current = first; current <= last; current++) {
+    for (ObjectPtr* current = first; current <= last; current++) {
       ScavengePointer(current);
     }
   }
 
-  void VisitingOldObject(RawObject* obj) {
-    ASSERT((obj == NULL) || obj->IsOldObject());
+  void VisitingOldObject(ObjectPtr obj) {
+    ASSERT((obj == nullptr) || obj->IsOldObject());
     visiting_old_object_ = obj;
-    if (obj != NULL) {
+    if (obj != nullptr) {
       // Card update happens in HeapPage::VisitRememberedCards.
-      ASSERT(!obj->IsCardRemembered());
+      ASSERT(!obj->ptr()->IsCardRemembered());
     }
   }
 
@@ -248,26 +248,26 @@
   }
 
  private:
-  void UpdateStoreBuffer(RawObject** p, RawObject* obj) {
+  void UpdateStoreBuffer(ObjectPtr* p, ObjectPtr obj) {
     ASSERT(obj->IsHeapObject());
     // If the newly written object is not a new object, drop it immediately.
-    if (!obj->IsNewObject() || visiting_old_object_->IsRemembered()) {
+    if (!obj->IsNewObject() || visiting_old_object_->ptr()->IsRemembered()) {
       return;
     }
-    visiting_old_object_->SetRememberedBit();
+    visiting_old_object_->ptr()->SetRememberedBit();
     thread_->StoreBufferAddObjectGC(visiting_old_object_);
   }
 
   DART_FORCE_INLINE
-  void ScavengePointer(RawObject** p) {
+  void ScavengePointer(ObjectPtr* p) {
     // ScavengePointer cannot be called recursively.
-    RawObject* raw_obj = *p;
+    ObjectPtr raw_obj = *p;
 
     if (raw_obj->IsSmiOrOldObject()) {
       return;
     }
 
-    uword raw_addr = RawObject::ToAddr(raw_obj);
+    uword raw_addr = ObjectLayout::ToAddr(raw_obj);
     // The scavenger is only expects objects located in the from space.
     ASSERT(from_->Contains(raw_addr));
     // Read the header word of the object and determine if the object has
@@ -279,7 +279,7 @@
       // Get the new location of the object.
       new_addr = ForwardedAddr(header);
     } else {
-      intptr_t size = raw_obj->HeapSize(header);
+      intptr_t size = raw_obj->ptr()->HeapSize(header);
       // Check whether object should be promoted.
       if (raw_addr >= scavenger_->survivor_end_) {
         // Not a survivor of a previous scavenge. Just copy the object into the
@@ -293,7 +293,7 @@
         if (LIKELY(new_addr != 0)) {
           // If promotion succeeded then we need to remember it so that it can
           // be traversed later.
-          promoted_list_.Push(RawObject::FromAddr(new_addr));
+          promoted_list_.Push(ObjectLayout::FromAddr(new_addr));
           bytes_promoted_ += size;
         } else {
           // Promotion did not succeed. Copy into the to space instead.
@@ -311,28 +311,28 @@
       objcpy(reinterpret_cast<void*>(new_addr),
              reinterpret_cast<void*>(raw_addr), size);
 
-      RawObject* new_obj = RawObject::FromAddr(new_addr);
+      ObjectPtr new_obj = ObjectLayout::FromAddr(new_addr);
       if (new_obj->IsOldObject()) {
         // Promoted: update age/barrier tags.
         uint32_t tags = static_cast<uint32_t>(header);
-        tags = RawObject::OldBit::update(true, tags);
-        tags = RawObject::OldAndNotRememberedBit::update(true, tags);
-        tags = RawObject::NewBit::update(false, tags);
+        tags = ObjectLayout::OldBit::update(true, tags);
+        tags = ObjectLayout::OldAndNotRememberedBit::update(true, tags);
+        tags = ObjectLayout::NewBit::update(false, tags);
         // Setting the forwarding pointer below will make this tenured object
         // visible to the concurrent marker, but we haven't visited its slots
         // yet. We mark the object here to prevent the concurrent marker from
         // adding it to the mark stack and visiting its unprocessed slots. We
         // push it to the mark stack after forwarding its slots.
-        tags =
-            RawObject::OldAndNotMarkedBit::update(!thread_->is_marking(), tags);
+        tags = ObjectLayout::OldAndNotMarkedBit::update(!thread_->is_marking(),
+                                                        tags);
         new_obj->ptr()->tags_ = tags;
       } else {
         ASSERT(scavenger_->to_->Contains(new_addr));
       }
 
-      intptr_t cid = RawObject::ClassIdTag::decode(header);
+      intptr_t cid = ObjectLayout::ClassIdTag::decode(header);
       if (IsTypedDataClassId(cid)) {
-        reinterpret_cast<RawTypedData*>(new_obj)->RecomputeDataField();
+        static_cast<TypedDataPtr>(new_obj)->ptr()->RecomputeDataField();
       }
 
       // Try to install forwarding address.
@@ -350,27 +350,27 @@
         }
         // Use the winner's forwarding target.
         new_addr = ForwardedAddr(header);
-        if (RawObject::FromAddr(new_addr)->IsNewObject()) {
+        if (ObjectLayout::FromAddr(new_addr)->IsNewObject()) {
           ASSERT(scavenger_->to_->Contains(new_addr));
         }
       }
     }
 
     // Update the reference.
-    RawObject* new_obj = RawObject::FromAddr(new_addr);
+    ObjectPtr new_obj = ObjectLayout::FromAddr(new_addr);
     if (!new_obj->IsNewObject()) {
       // Setting the mark bit above must not be ordered after a publishing store
       // of this object. Note this could be a publishing store even if the
       // object was promoted by an early invocation of ScavengePointer. Compare
       // Object::Allocate.
-      reinterpret_cast<std::atomic<RawObject*>*>(p)->store(
+      reinterpret_cast<std::atomic<ObjectPtr>*>(p)->store(
           new_obj, std::memory_order_release);
     } else {
-      ASSERT(scavenger_->to_->Contains(RawObject::ToAddr(new_obj)));
+      ASSERT(scavenger_->to_->Contains(ObjectLayout::ToAddr(new_obj)));
       *p = new_obj;
     }
     // Update the store buffer as needed.
-    if (visiting_old_object_ != NULL) {
+    if (visiting_old_object_ != nullptr) {
       UpdateStoreBuffer(p, new_obj);
     }
   }
@@ -415,14 +415,14 @@
     if (size != 0) {
       ASSERT(Utils::IsAligned(size, kObjectAlignment));
       ForwardingCorpse::AsForwarder(top, size);
-      ASSERT(RawObject::FromAddr(top)->HeapSize() == size);
+      ASSERT(ObjectLayout::FromAddr(top)->ptr()->HeapSize() == size);
     }
   }
 
   inline void ProcessToSpace();
-  DART_FORCE_INLINE intptr_t ProcessCopied(RawObject* raw_obj);
+  DART_FORCE_INLINE intptr_t ProcessCopied(ObjectPtr raw_obj);
   inline void ProcessPromotedList();
-  inline void EnqueueWeakProperty(RawWeakProperty* raw_weak);
+  inline void EnqueueWeakProperty(WeakPropertyPtr raw_weak);
   inline void MournWeakProperties();
 
   Thread* thread_;
@@ -431,10 +431,10 @@
   PageSpace* page_space_;
   FreeList* freelist_;
   intptr_t bytes_promoted_;
-  RawObject* visiting_old_object_;
+  ObjectPtr visiting_old_object_;
 
   PromotionWorkList promoted_list_;
-  RawWeakProperty* delayed_weak_properties_ = nullptr;
+  WeakPropertyPtr delayed_weak_properties_ = nullptr;
 
   struct ScavengerLAB {
     uword top;
@@ -463,7 +463,7 @@
   void VisitHandle(uword addr) {
     FinalizablePersistentHandle* handle =
         reinterpret_cast<FinalizablePersistentHandle*>(addr);
-    RawObject** p = handle->raw_addr();
+    ObjectPtr* p = handle->raw_addr();
     if (scavenger_->IsUnreachable(p)) {
       handle->UpdateUnreachable(thread()->isolate_group());
     } else {
@@ -734,11 +734,11 @@
       : ObjectPointerVisitor(IsolateGroup::Current()),
         in_store_buffer_(in_store_buffer) {}
 
-  void VisitPointers(RawObject** from, RawObject** to) {
-    for (RawObject** ptr = from; ptr <= to; ptr++) {
-      RawObject* raw_obj = *ptr;
-      RELEASE_ASSERT(!raw_obj->IsCardRemembered());
-      RELEASE_ASSERT(raw_obj->IsRemembered());
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
+    for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
+      ObjectPtr raw_obj = *ptr;
+      RELEASE_ASSERT(!raw_obj->ptr()->IsCardRemembered());
+      RELEASE_ASSERT(raw_obj->ptr()->IsRemembered());
       RELEASE_ASSERT(raw_obj->IsOldObject());
       in_store_buffer_->Add(raw_obj);
     }
@@ -757,36 +757,37 @@
         in_store_buffer_(in_store_buffer),
         to_(to) {}
 
-  void VisitObject(RawObject* raw_obj) {
+  void VisitObject(ObjectPtr raw_obj) {
     if (raw_obj->IsPseudoObject()) return;
     RELEASE_ASSERT(raw_obj->IsOldObject());
 
-    if (raw_obj->IsCardRemembered()) {
-      RELEASE_ASSERT(!raw_obj->IsRemembered());
+    if (raw_obj->ptr()->IsCardRemembered()) {
+      RELEASE_ASSERT(!raw_obj->ptr()->IsRemembered());
       // TODO(rmacnak): Verify card tables.
       return;
     }
 
-    RELEASE_ASSERT(raw_obj->IsRemembered() ==
+    RELEASE_ASSERT(raw_obj->ptr()->IsRemembered() ==
                    in_store_buffer_->Contains(raw_obj));
 
     visiting_ = raw_obj;
-    is_remembered_ = raw_obj->IsRemembered();
-    raw_obj->VisitPointers(this);
+    is_remembered_ = raw_obj->ptr()->IsRemembered();
+    raw_obj->ptr()->VisitPointers(this);
   }
 
-  void VisitPointers(RawObject** from, RawObject** to) {
-    for (RawObject** ptr = from; ptr <= to; ptr++) {
-      RawObject* raw_obj = *ptr;
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
+    for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
+      ObjectPtr raw_obj = *ptr;
       if (raw_obj->IsHeapObject() && raw_obj->IsNewObject()) {
         if (!is_remembered_) {
           FATAL3(
-              "Old object %p references new object %p, but it is not in any"
-              " store buffer. Consider using rr to watch the slot %p and "
-              "reverse-continue to find the store with a missing barrier.\n",
-              visiting_, raw_obj, ptr);
+              "Old object %#" Px "references new object %#" Px
+              ", but it is not"
+              " in any store buffer. Consider using rr to watch the slot %p and"
+              " reverse-continue to find the store with a missing barrier.\n",
+              static_cast<uword>(visiting_), static_cast<uword>(raw_obj), ptr);
         }
-        RELEASE_ASSERT(to_->Contains(RawObject::ToAddr(raw_obj)));
+        RELEASE_ASSERT(to_->Contains(ObjectLayout::ToAddr(raw_obj)));
       }
     }
   }
@@ -794,7 +795,7 @@
  private:
   const ObjectSet* const in_store_buffer_;
   const SemiSpace* const to_;
-  RawObject* visiting_;
+  ObjectPtr visiting_;
   bool is_remembered_;
 };
 
@@ -845,9 +846,12 @@
     OUT_OF_MEMORY();
   }
   UpdateMaxHeapCapacity();
-  top_ = FirstObjectStart();
-  resolved_top_ = top_;
-  end_ = to_->end();
+  {
+    MutexLocker ml(&space_lock_);
+    top_ = FirstObjectStart();
+    resolved_top_ = top_;
+    end_ = to_->end();
+  }
 
   return from;
 }
@@ -983,14 +987,14 @@
     intptr_t count = pending->Count();
     total_count += count;
     while (!pending->IsEmpty()) {
-      RawObject* raw_object = pending->Pop();
+      ObjectPtr raw_object = pending->Pop();
       ASSERT(!raw_object->IsForwardingCorpse());
-      ASSERT(raw_object->IsRemembered());
-      raw_object->ClearRememberedBit();
+      ASSERT(raw_object->ptr()->IsRemembered());
+      raw_object->ptr()->ClearRememberedBit();
       visitor->VisitingOldObject(raw_object);
       // Note that this treats old-space WeakProperties as strong. A dead key
       // won't be reclaimed until after the key is promoted.
-      raw_object->VisitPointersNonvirtual(visitor);
+      raw_object->ptr()->VisitPointersNonvirtual(visitor);
     }
     pending->Reset();
     // Return the emptied block for recycling (no need to check threshold).
@@ -1059,22 +1063,22 @@
   }
 }
 
-bool Scavenger::IsUnreachable(RawObject** p) {
-  RawObject* raw_obj = *p;
+bool Scavenger::IsUnreachable(ObjectPtr* p) {
+  ObjectPtr raw_obj = *p;
   if (!raw_obj->IsHeapObject()) {
     return false;
   }
   if (!raw_obj->IsNewObject()) {
     return false;
   }
-  uword raw_addr = RawObject::ToAddr(raw_obj);
+  uword raw_addr = ObjectLayout::ToAddr(raw_obj);
   if (to_->Contains(raw_addr)) {
     return false;
   }
   uword header = *reinterpret_cast<uword*>(raw_addr);
   if (IsForwarding(header)) {
     uword new_addr = ForwardedAddr(header);
-    *p = RawObject::FromAddr(new_addr);
+    *p = ObjectLayout::FromAddr(new_addr);
     return false;
   }
   return true;
@@ -1093,7 +1097,7 @@
   while (i <= producer_index_) {
     uword resolved_top = labs_[i].resolved_top;
     while (resolved_top < labs_[i].top) {
-      RawObject* raw_obj = RawObject::FromAddr(resolved_top);
+      ObjectPtr raw_obj = ObjectLayout::FromAddr(resolved_top);
       resolved_top += ProcessCopied(raw_obj);
     }
     labs_[i].resolved_top = resolved_top;
@@ -1110,14 +1114,15 @@
 
 template <bool parallel>
 void ScavengerVisitorBase<parallel>::ProcessPromotedList() {
-  while (RawObject* raw_object = promoted_list_.Pop()) {
+  ObjectPtr raw_object;
+  while ((raw_object = promoted_list_.Pop()) != nullptr) {
     // Resolve or copy all objects referred to by the current object. This
     // can potentially push more objects on this stack as well as add more
     // objects to be resolved in the to space.
-    ASSERT(!raw_object->IsRemembered());
+    ASSERT(!raw_object->ptr()->IsRemembered());
     VisitingOldObject(raw_object);
-    raw_object->VisitPointersNonvirtual(this);
-    if (raw_object->IsMarked()) {
+    raw_object->ptr()->VisitPointersNonvirtual(this);
+    if (raw_object->ptr()->IsMarked()) {
       // Complete our promise from ScavengePointer. Note that marker cannot
       // visit this object until it pops a block from the mark stack, which
       // involves a memory fence from the mutex, so even on architectures
@@ -1134,31 +1139,31 @@
   // Finished this round of scavenging. Process the pending weak properties
   // for which the keys have become reachable. Potentially this adds more
   // objects to the to space.
-  RawWeakProperty* cur_weak = delayed_weak_properties_;
-  delayed_weak_properties_ = NULL;
-  while (cur_weak != NULL) {
+  WeakPropertyPtr cur_weak = delayed_weak_properties_;
+  delayed_weak_properties_ = nullptr;
+  while (cur_weak != nullptr) {
     uword next_weak = cur_weak->ptr()->next_;
     // Promoted weak properties are not enqueued. So we can guarantee that
     // we do not need to think about store barriers here.
     ASSERT(cur_weak->IsNewObject());
-    RawObject* raw_key = cur_weak->ptr()->key_;
+    ObjectPtr raw_key = cur_weak->ptr()->key_;
     ASSERT(raw_key->IsHeapObject());
     // Key still points into from space even if the object has been
     // promoted to old space by now. The key will be updated accordingly
     // below when VisitPointers is run.
     ASSERT(raw_key->IsNewObject());
-    uword raw_addr = RawObject::ToAddr(raw_key);
+    uword raw_addr = ObjectLayout::ToAddr(raw_key);
     ASSERT(from_->Contains(raw_addr));
     uword header = *reinterpret_cast<uword*>(raw_addr);
     // Reset the next pointer in the weak property.
     cur_weak->ptr()->next_ = 0;
     if (IsForwarding(header)) {
-      cur_weak->VisitPointersNonvirtual(this);
+      cur_weak->ptr()->VisitPointersNonvirtual(this);
     } else {
       EnqueueWeakProperty(cur_weak);
     }
     // Advance to next weak property in the queue.
-    cur_weak = reinterpret_cast<RawWeakProperty*>(next_weak);
+    cur_weak = static_cast<WeakPropertyPtr>(next_weak);
   }
 }
 
@@ -1193,39 +1198,39 @@
 
 template <bool parallel>
 void ScavengerVisitorBase<parallel>::EnqueueWeakProperty(
-    RawWeakProperty* raw_weak) {
+    WeakPropertyPtr raw_weak) {
   ASSERT(raw_weak->IsHeapObject());
   ASSERT(raw_weak->IsNewObject());
   ASSERT(raw_weak->IsWeakProperty());
 #if defined(DEBUG)
-  uword raw_addr = RawObject::ToAddr(raw_weak);
+  uword raw_addr = ObjectLayout::ToAddr(raw_weak);
   uword header = *reinterpret_cast<uword*>(raw_addr);
   ASSERT(!IsForwarding(header));
 #endif  // defined(DEBUG)
   ASSERT(raw_weak->ptr()->next_ == 0);
-  raw_weak->ptr()->next_ = reinterpret_cast<uword>(delayed_weak_properties_);
+  raw_weak->ptr()->next_ = static_cast<uword>(delayed_weak_properties_);
   delayed_weak_properties_ = raw_weak;
 }
 
 template <bool parallel>
-intptr_t ScavengerVisitorBase<parallel>::ProcessCopied(RawObject* raw_obj) {
+intptr_t ScavengerVisitorBase<parallel>::ProcessCopied(ObjectPtr raw_obj) {
   intptr_t class_id = raw_obj->GetClassId();
   if (UNLIKELY(class_id == kWeakPropertyCid)) {
-    RawWeakProperty* raw_weak = reinterpret_cast<RawWeakProperty*>(raw_obj);
+    WeakPropertyPtr raw_weak = static_cast<WeakPropertyPtr>(raw_obj);
     // The fate of the weak property is determined by its key.
-    RawObject* raw_key = raw_weak->ptr()->key_;
+    ObjectPtr raw_key = raw_weak->ptr()->key_;
     if (raw_key->IsHeapObject() && raw_key->IsNewObject()) {
-      uword raw_addr = RawObject::ToAddr(raw_key);
+      uword raw_addr = ObjectLayout::ToAddr(raw_key);
       uword header = *reinterpret_cast<uword*>(raw_addr);
       if (!IsForwarding(header)) {
         // Key is white.  Enqueue the weak property.
         EnqueueWeakProperty(raw_weak);
-        return raw_weak->HeapSize();
+        return raw_weak->ptr()->HeapSize();
       }
     }
     // Key is gray or black.  Make the weak property black.
   }
-  return raw_obj->VisitPointersNonvirtual(this);
+  return raw_obj->ptr()->VisitPointersNonvirtual(this);
 }
 
 void Scavenger::MournWeakTables() {
@@ -1236,14 +1241,14 @@
     intptr_t size = table->size();
     for (intptr_t i = 0; i < size; i++) {
       if (table->IsValidEntryAtExclusive(i)) {
-        RawObject* raw_obj = table->ObjectAtExclusive(i);
+        ObjectPtr raw_obj = table->ObjectAtExclusive(i);
         ASSERT(raw_obj->IsHeapObject());
-        uword raw_addr = RawObject::ToAddr(raw_obj);
+        uword raw_addr = ObjectLayout::ToAddr(raw_obj);
         uword header = *reinterpret_cast<uword*>(raw_addr);
         if (IsForwarding(header)) {
           // The object has survived.  Preserve its record.
           uword new_addr = ForwardedAddr(header);
-          raw_obj = RawObject::FromAddr(new_addr);
+          raw_obj = ObjectLayout::FromAddr(new_addr);
           auto replacement =
               raw_obj->IsNewObject() ? replacement_new : replacement_old;
           replacement->SetValueExclusive(raw_obj, table->ValueAtExclusive(i));
@@ -1286,16 +1291,16 @@
 void ScavengerVisitorBase<parallel>::MournWeakProperties() {
   // The queued weak properties at this point do not refer to reachable keys,
   // so we clear their key and value fields.
-  RawWeakProperty* cur_weak = delayed_weak_properties_;
-  delayed_weak_properties_ = NULL;
-  while (cur_weak != NULL) {
+  WeakPropertyPtr cur_weak = delayed_weak_properties_;
+  delayed_weak_properties_ = nullptr;
+  while (cur_weak != nullptr) {
     uword next_weak = cur_weak->ptr()->next_;
     // Reset the next pointer in the weak property.
     cur_weak->ptr()->next_ = 0;
 
 #if defined(DEBUG)
-    RawObject* raw_key = cur_weak->ptr()->key_;
-    uword raw_addr = RawObject::ToAddr(raw_key);
+    ObjectPtr raw_key = cur_weak->ptr()->key_;
+    uword raw_addr = ObjectLayout::ToAddr(raw_key);
     uword header = *reinterpret_cast<uword*>(raw_addr);
     ASSERT(!IsForwarding(header));
     ASSERT(raw_key->IsHeapObject());
@@ -1305,7 +1310,7 @@
     WeakProperty::Clear(cur_weak);
 
     // Advance to next weak property in the queue.
-    cur_weak = reinterpret_cast<RawWeakProperty*>(next_weak);
+    cur_weak = static_cast<WeakPropertyPtr>(next_weak);
   }
 }
 
@@ -1381,8 +1386,8 @@
   MakeNewSpaceIterable();
   uword cur = FirstObjectStart();
   while (cur < top_) {
-    RawObject* raw_obj = RawObject::FromAddr(cur);
-    cur += raw_obj->VisitPointers(visitor);
+    ObjectPtr raw_obj = ObjectLayout::FromAddr(cur);
+    cur += raw_obj->ptr()->VisitPointers(visitor);
   }
 }
 
@@ -1392,9 +1397,9 @@
   MakeNewSpaceIterable();
   uword cur = FirstObjectStart();
   while (cur < top_) {
-    RawObject* raw_obj = RawObject::FromAddr(cur);
+    ObjectPtr raw_obj = ObjectLayout::FromAddr(cur);
     visitor->VisitObject(raw_obj);
-    cur += raw_obj->HeapSize();
+    cur += raw_obj->ptr()->HeapSize();
   }
 }
 
@@ -1402,15 +1407,16 @@
   set->AddRegion(to_->start(), to_->end());
 }
 
-RawObject* Scavenger::FindObject(FindObjectVisitor* visitor) {
+ObjectPtr Scavenger::FindObject(FindObjectVisitor* visitor) {
   ASSERT(!scavenging_);
   MakeNewSpaceIterable();
   uword cur = FirstObjectStart();
   if (visitor->VisitRange(cur, top_)) {
     while (cur < top_) {
-      RawObject* raw_obj = RawObject::FromAddr(cur);
-      uword next = cur + raw_obj->HeapSize();
-      if (visitor->VisitRange(cur, next) && raw_obj->FindObject(visitor)) {
+      ObjectPtr raw_obj = ObjectLayout::FromAddr(cur);
+      uword next = cur + raw_obj->ptr()->HeapSize();
+      if (visitor->VisitRange(cur, next) &&
+          raw_obj->ptr()->FindObject(visitor)) {
         return raw_obj;  // Found object, return it.
       }
       cur = next;
@@ -1458,7 +1464,7 @@
   if (size >= kObjectAlignment) {
     // ForwardingCorpse(forwarding to default null) will work as filler.
     ForwardingCorpse::AsForwarder(tlab.top, size);
-    ASSERT(RawObject::FromAddr(tlab.top)->HeapSize() == size);
+    ASSERT(ObjectLayout::FromAddr(tlab.top)->ptr()->HeapSize() == size);
   }
 }
 
diff --git a/runtime/vm/heap/scavenger.h b/runtime/vm/heap/scavenger.h
index 0e23b5d..6358289 100644
--- a/runtime/vm/heap/scavenger.h
+++ b/runtime/vm/heap/scavenger.h
@@ -130,7 +130,7 @@
   // be part of the surviving objects.
   bool Contains(uword addr) const { return to_->Contains(addr); }
 
-  RawObject* FindObject(FindObjectVisitor* visitor);
+  ObjectPtr FindObject(FindObjectVisitor* visitor);
 
   uword TryAllocate(Thread* thread, intptr_t size) {
     uword addr = TryAllocateFromTLAB(thread, size);
@@ -288,7 +288,7 @@
   void MournWeakHandles();
   void Epilogue(SemiSpace* from);
 
-  bool IsUnreachable(RawObject** p);
+  bool IsUnreachable(ObjectPtr* p);
 
   void VerifyStoreBuffers();
 
diff --git a/runtime/vm/heap/scavenger_test.cc b/runtime/vm/heap/scavenger_test.cc
index 64b2a31..8d405eb 100644
--- a/runtime/vm/heap/scavenger_test.cc
+++ b/runtime/vm/heap/scavenger_test.cc
@@ -13,14 +13,14 @@
 class FailingObjectVisitor : public ObjectVisitor {
  public:
   FailingObjectVisitor() {}
-  virtual void VisitObject(RawObject* obj) { EXPECT(false); }
+  virtual void VisitObject(ObjectPtr obj) { EXPECT(false); }
 };
 
 // Expects to visit no objects (since the space should be empty).
 class FailingObjectPointerVisitor : public ObjectPointerVisitor {
  public:
   FailingObjectPointerVisitor() : ObjectPointerVisitor(NULL) {}
-  virtual void VisitPointers(RawObject** first, RawObject** last) {
+  virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
     EXPECT(false);
   }
 };
@@ -29,7 +29,7 @@
 class FailingFindObjectVisitor : public FindObjectVisitor {
  public:
   FailingFindObjectVisitor() {}
-  virtual bool FindObject(RawObject* obj) const {
+  virtual bool FindObject(ObjectPtr obj) const {
     EXPECT(false);
     return false;
   }
diff --git a/runtime/vm/heap/sweeper.cc b/runtime/vm/heap/sweeper.cc
index 96cf844..5581e45 100644
--- a/runtime/vm/heap/sweeper.cc
+++ b/runtime/vm/heap/sweeper.cc
@@ -28,23 +28,23 @@
 
   while (current < end) {
     intptr_t obj_size;
-    RawObject* raw_obj = RawObject::FromAddr(current);
+    ObjectPtr raw_obj = ObjectLayout::FromAddr(current);
     ASSERT(HeapPage::Of(raw_obj) == page);
-    if (raw_obj->IsMarked()) {
+    if (raw_obj->ptr()->IsMarked()) {
       // Found marked object. Clear the mark bit and update swept bytes.
-      raw_obj->ClearMarkBit();
-      obj_size = raw_obj->HeapSize();
+      raw_obj->ptr()->ClearMarkBit();
+      obj_size = raw_obj->ptr()->HeapSize();
       used_in_bytes += obj_size;
     } else {
-      uword free_end = current + raw_obj->HeapSize();
+      uword free_end = current + raw_obj->ptr()->HeapSize();
       while (free_end < end) {
-        RawObject* next_obj = RawObject::FromAddr(free_end);
-        if (next_obj->IsMarked()) {
+        ObjectPtr next_obj = ObjectLayout::FromAddr(free_end);
+        if (next_obj->ptr()->IsMarked()) {
           // Reached the end of the free block.
           break;
         }
         // Expand the free block by the size of this object.
-        free_end += next_obj->HeapSize();
+        free_end += next_obj->ptr()->HeapSize();
       }
       obj_size = free_end - current;
       if (is_executable) {
@@ -80,21 +80,21 @@
   ASSERT(!page->is_image_page());
 
   intptr_t words_to_end = 0;
-  RawObject* raw_obj = RawObject::FromAddr(page->object_start());
+  ObjectPtr raw_obj = ObjectLayout::FromAddr(page->object_start());
   ASSERT(HeapPage::Of(raw_obj) == page);
-  if (raw_obj->IsMarked()) {
-    raw_obj->ClearMarkBit();
-    words_to_end = (raw_obj->HeapSize() >> kWordSizeLog2);
+  if (raw_obj->ptr()->IsMarked()) {
+    raw_obj->ptr()->ClearMarkBit();
+    words_to_end = (raw_obj->ptr()->HeapSize() >> kWordSizeLog2);
   }
 #ifdef DEBUG
   // Array::MakeFixedLength creates trailing filler objects,
   // but they are always unreachable. Verify that they are not marked.
-  uword current = RawObject::ToAddr(raw_obj) + raw_obj->HeapSize();
+  uword current = ObjectLayout::ToAddr(raw_obj) + raw_obj->ptr()->HeapSize();
   uword end = page->object_end();
   while (current < end) {
-    RawObject* cur_obj = RawObject::FromAddr(current);
-    ASSERT(!cur_obj->IsMarked());
-    intptr_t obj_size = cur_obj->HeapSize();
+    ObjectPtr cur_obj = ObjectLayout::FromAddr(current);
+    ASSERT(!cur_obj->ptr()->IsMarked());
+    intptr_t obj_size = cur_obj->ptr()->HeapSize();
     memset(reinterpret_cast<void*>(current), Heap::kZapByte, obj_size);
     current += obj_size;
   }
diff --git a/runtime/vm/heap/verifier.cc b/runtime/vm/heap/verifier.cc
index 12762ec..777cf33 100644
--- a/runtime/vm/heap/verifier.cc
+++ b/runtime/vm/heap/verifier.cc
@@ -16,24 +16,24 @@
 
 namespace dart {
 
-void VerifyObjectVisitor::VisitObject(RawObject* raw_obj) {
+void VerifyObjectVisitor::VisitObject(ObjectPtr raw_obj) {
   if (raw_obj->IsHeapObject()) {
-    uword raw_addr = RawObject::ToAddr(raw_obj);
+    uword raw_addr = ObjectLayout::ToAddr(raw_obj);
     if (raw_obj->IsFreeListElement() || raw_obj->IsForwardingCorpse()) {
-      if (raw_obj->IsOldObject() && raw_obj->IsMarked()) {
+      if (raw_obj->IsOldObject() && raw_obj->ptr()->IsMarked()) {
         FATAL1("Marked free list element encountered %#" Px "\n", raw_addr);
       }
     } else {
       switch (mark_expectation_) {
         case kForbidMarked:
-          if (raw_obj->IsOldObject() && raw_obj->IsMarked()) {
+          if (raw_obj->IsOldObject() && raw_obj->ptr()->IsMarked()) {
             FATAL1("Marked object encountered %#" Px "\n", raw_addr);
           }
           break;
         case kAllowMarked:
           break;
         case kRequireMarked:
-          if (raw_obj->IsOldObject() && !raw_obj->IsMarked()) {
+          if (raw_obj->IsOldObject() && !raw_obj->ptr()->IsMarked()) {
             FATAL1("Unmarked object encountered %#" Px "\n", raw_addr);
           }
           break;
@@ -44,16 +44,16 @@
   raw_obj->Validate(isolate_group_);
 }
 
-void VerifyPointersVisitor::VisitPointers(RawObject** first, RawObject** last) {
-  for (RawObject** current = first; current <= last; current++) {
-    RawObject* raw_obj = *current;
+void VerifyPointersVisitor::VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  for (ObjectPtr* current = first; current <= last; current++) {
+    ObjectPtr raw_obj = *current;
     if (raw_obj->IsHeapObject()) {
       if (!allocated_set_->Contains(raw_obj)) {
         if (raw_obj->IsInstructions() &&
             allocated_set_->Contains(HeapPage::ToWritable(raw_obj))) {
           continue;
         }
-        uword raw_addr = RawObject::ToAddr(raw_obj);
+        uword raw_addr = ObjectLayout::ToAddr(raw_obj);
         FATAL1("Invalid object pointer encountered %#" Px "\n", raw_addr);
       }
     }
@@ -63,7 +63,7 @@
 void VerifyWeakPointersVisitor::VisitHandle(uword addr) {
   FinalizablePersistentHandle* handle =
       reinterpret_cast<FinalizablePersistentHandle*>(addr);
-  RawObject* raw_obj = handle->raw();
+  ObjectPtr raw_obj = handle->raw();
   visitor_->VisitPointer(&raw_obj);
 }
 
@@ -88,7 +88,7 @@
 VerifyCanonicalVisitor::VerifyCanonicalVisitor(Thread* thread)
     : thread_(thread), instanceHandle_(Instance::Handle(thread->zone())) {}
 
-void VerifyCanonicalVisitor::VisitObject(RawObject* obj) {
+void VerifyCanonicalVisitor::VisitObject(ObjectPtr obj) {
   // TODO(dartbug.com/36097): The heap walk can encounter canonical objects of
   // other isolates. We should either scan live objects from the roots of each
   // individual isolate, or wait until we are ready to share constants across
@@ -96,7 +96,7 @@
   if (!FLAG_enable_isolate_groups) {
     if ((obj->GetClassId() >= kInstanceCid) &&
         (obj->GetClassId() != kTypeArgumentsCid)) {
-      if (obj->IsCanonical()) {
+      if (obj->ptr()->IsCanonical()) {
         instanceHandle_ ^= obj;
         const bool is_canonical = instanceHandle_.CheckIsCanonical(thread_);
         if (!is_canonical) {
diff --git a/runtime/vm/heap/verifier.h b/runtime/vm/heap/verifier.h
index ae13e90..3733125 100644
--- a/runtime/vm/heap/verifier.h
+++ b/runtime/vm/heap/verifier.h
@@ -17,7 +17,6 @@
 // Forward declarations.
 class IsolateGroup;
 class ObjectSet;
-class RawObject;
 
 enum MarkExpectation { kForbidMarked, kAllowMarked, kRequireMarked };
 
@@ -30,7 +29,7 @@
         allocated_set_(allocated_set),
         mark_expectation_(mark_expectation) {}
 
-  virtual void VisitObject(RawObject* obj);
+  virtual void VisitObject(ObjectPtr obj);
 
  private:
   IsolateGroup* isolate_group_;
@@ -48,7 +47,7 @@
                                  ObjectSet* allocated_set)
       : ObjectPointerVisitor(isolate_group), allocated_set_(allocated_set) {}
 
-  virtual void VisitPointers(RawObject** first, RawObject** last);
+  virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last);
 
   static void VerifyPointers(MarkExpectation mark_expectation = kForbidMarked);
 
@@ -77,7 +76,7 @@
 class VerifyCanonicalVisitor : public ObjectVisitor {
  public:
   explicit VerifyCanonicalVisitor(Thread* thread);
-  virtual void VisitObject(RawObject* obj);
+  virtual void VisitObject(ObjectPtr obj);
 
  private:
   Thread* thread_;
diff --git a/runtime/vm/heap/weak_table.cc b/runtime/vm/heap/weak_table.cc
index 1bc9daf..159ed5a 100644
--- a/runtime/vm/heap/weak_table.cc
+++ b/runtime/vm/heap/weak_table.cc
@@ -29,18 +29,18 @@
   return result;
 }
 
-void WeakTable::SetValueExclusive(RawObject* key, intptr_t val) {
+void WeakTable::SetValueExclusive(ObjectPtr key, intptr_t val) {
   intptr_t mask = size() - 1;
   intptr_t idx = Hash(key) & mask;
   intptr_t empty_idx = -1;
-  RawObject* obj = ObjectAtExclusive(idx);
+  ObjectPtr obj = ObjectAtExclusive(idx);
 
-  while (obj != NULL) {
+  while (obj != nullptr) {
     if (obj == key) {
       SetValueAt(idx, val);
       return;
     } else if ((empty_idx < 0) &&
-               (reinterpret_cast<intptr_t>(obj) == kDeletedEntry)) {
+               (static_cast<intptr_t>(obj) == kDeletedEntry)) {
       empty_idx = idx;  // Insert at this location if not found.
     }
     idx = (idx + 1) & mask;
@@ -109,16 +109,16 @@
   for (intptr_t i = 0; i < old_size; i++) {
     if (IsValidEntryAtExclusive(i)) {
       // Find the new hash location for this entry.
-      RawObject* key = ObjectAtExclusive(i);
+      ObjectPtr key = ObjectAtExclusive(i);
       intptr_t idx = Hash(key) & mask;
-      RawObject* obj = reinterpret_cast<RawObject*>(new_data[ObjectIndex(idx)]);
-      while (obj != NULL) {
+      ObjectPtr obj = static_cast<ObjectPtr>(new_data[ObjectIndex(idx)]);
+      while (obj != nullptr) {
         ASSERT(obj != key);  // Duplicate entry is not expected.
         idx = (idx + 1) & mask;
-        obj = reinterpret_cast<RawObject*>(new_data[ObjectIndex(idx)]);
+        obj = static_cast<ObjectPtr>(new_data[ObjectIndex(idx)]);
       }
 
-      new_data[ObjectIndex(idx)] = reinterpret_cast<intptr_t>(key);
+      new_data[ObjectIndex(idx)] = static_cast<intptr_t>(key);
       new_data[ValueIndex(idx)] = ValueAtExclusive(i);
       set_used(used() + 1);
     }
diff --git a/runtime/vm/heap/weak_table.h b/runtime/vm/heap/weak_table.h
index 051051f..6fc01f3 100644
--- a/runtime/vm/heap/weak_table.h
+++ b/runtime/vm/heap/weak_table.h
@@ -49,12 +49,12 @@
 
   // The following methods can be called concurrently and are guarded by a lock.
 
-  intptr_t GetValue(RawObject* key) {
+  intptr_t GetValue(ObjectPtr key) {
     MutexLocker ml(&mutex_);
     return GetValueExclusive(key);
   }
 
-  void SetValue(RawObject* key, intptr_t val) {
+  void SetValue(ObjectPtr key, intptr_t val) {
     MutexLocker ml(&mutex_);
     return SetValueExclusive(key, val);
   }
@@ -66,9 +66,9 @@
 
   bool IsValidEntryAtExclusive(intptr_t i) const {
     ASSERT((ValueAtExclusive(i) == 0 &&
-            (ObjectAtExclusive(i) == NULL ||
+            (ObjectAtExclusive(i) == nullptr ||
              data_[ObjectIndex(i)] == kDeletedEntry)) ||
-           (ValueAtExclusive(i) != 0 && ObjectAtExclusive(i) != NULL &&
+           (ValueAtExclusive(i) != 0 && ObjectAtExclusive(i) != nullptr &&
             data_[ObjectIndex(i)] != kDeletedEntry));
     return (data_[ValueIndex(i)] != 0);
   }
@@ -78,10 +78,10 @@
     SetValueAt(i, 0);
   }
 
-  RawObject* ObjectAtExclusive(intptr_t i) const {
+  ObjectPtr ObjectAtExclusive(intptr_t i) const {
     ASSERT(i >= 0);
     ASSERT(i < size());
-    return reinterpret_cast<RawObject*>(data_[ObjectIndex(i)]);
+    return static_cast<ObjectPtr>(data_[ObjectIndex(i)]);
   }
 
   intptr_t ValueAtExclusive(intptr_t i) const {
@@ -90,13 +90,13 @@
     return data_[ValueIndex(i)];
   }
 
-  void SetValueExclusive(RawObject* key, intptr_t val);
+  void SetValueExclusive(ObjectPtr key, intptr_t val);
 
-  intptr_t GetValueExclusive(RawObject* key) const {
+  intptr_t GetValueExclusive(ObjectPtr key) const {
     intptr_t mask = size() - 1;
     intptr_t idx = Hash(key) & mask;
-    RawObject* obj = ObjectAtExclusive(idx);
-    while (obj != NULL) {
+    ObjectPtr obj = ObjectAtExclusive(idx);
+    while (obj != nullptr) {
       if (obj == key) {
         return ValueAtExclusive(idx);
       }
@@ -109,11 +109,11 @@
 
   // Removes and returns the value associated with |key|. Returns 0 if there is
   // no value associated with |key|.
-  intptr_t RemoveValueExclusive(RawObject* key) {
+  intptr_t RemoveValueExclusive(ObjectPtr key) {
     intptr_t mask = size() - 1;
     intptr_t idx = Hash(key) & mask;
-    RawObject* obj = ObjectAtExclusive(idx);
-    while (obj != NULL) {
+    ObjectPtr obj = ObjectAtExclusive(idx);
+    while (obj != nullptr) {
       if (obj == key) {
         intptr_t result = ValueAtExclusive(idx);
         InvalidateAtExclusive(idx);
@@ -166,16 +166,16 @@
 
   intptr_t ValueIndex(intptr_t i) const { return index(i) + kValueOffset; }
 
-  RawObject** ObjectPointerAt(intptr_t i) const {
+  ObjectPtr* ObjectPointerAt(intptr_t i) const {
     ASSERT(i >= 0);
     ASSERT(i < size());
-    return reinterpret_cast<RawObject**>(&data_[ObjectIndex(i)]);
+    return reinterpret_cast<ObjectPtr*>(&data_[ObjectIndex(i)]);
   }
 
-  void SetObjectAt(intptr_t i, RawObject* key) {
+  void SetObjectAt(intptr_t i, ObjectPtr key) {
     ASSERT(i >= 0);
     ASSERT(i < size());
-    data_[ObjectIndex(i)] = reinterpret_cast<intptr_t>(key);
+    data_[ObjectIndex(i)] = static_cast<intptr_t>(key);
   }
 
   void SetValueAt(intptr_t i, intptr_t val) {
@@ -191,8 +191,8 @@
 
   void Rehash();
 
-  static intptr_t Hash(RawObject* key) {
-    return reinterpret_cast<uintptr_t>(key) * 92821;
+  static intptr_t Hash(ObjectPtr key) {
+    return static_cast<uintptr_t>(key) * 92821;
   }
 
   Mutex mutex_;
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 01d5d36..ebdd6dd 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -4,6 +4,7 @@
 
 #include "vm/image_snapshot.h"
 
+#include "include/dart_api.h"
 #include "platform/assert.h"
 #include "vm/class_id.h"
 #include "vm/compiler/runtime_api.h"
@@ -40,11 +41,11 @@
 #endif
 
 intptr_t ObjectOffsetTrait::Hashcode(Key key) {
-  RawObject* obj = key;
+  ObjectPtr obj = key;
   ASSERT(!obj->IsSmi());
 
-  uword body = RawObject::ToAddr(obj) + sizeof(RawObject);
-  uword end = RawObject::ToAddr(obj) + obj->HeapSize();
+  uword body = ObjectLayout::ToAddr(obj) + sizeof(ObjectLayout);
+  uword end = ObjectLayout::ToAddr(obj) + obj->ptr()->HeapSize();
 
   uint32_t hash = obj->GetClassId();
   // Don't include the header. Objects in the image are pre-marked, but objects
@@ -57,8 +58,8 @@
 }
 
 bool ObjectOffsetTrait::IsKeyEqual(Pair pair, Key key) {
-  RawObject* a = pair.object;
-  RawObject* b = key;
+  ObjectPtr a = pair.object;
+  ObjectPtr b = key;
   ASSERT(!a->IsSmi());
   ASSERT(!b->IsSmi());
 
@@ -66,16 +67,16 @@
     return false;
   }
 
-  intptr_t heap_size = a->HeapSize();
-  if (b->HeapSize() != heap_size) {
+  intptr_t heap_size = a->ptr()->HeapSize();
+  if (b->ptr()->HeapSize() != heap_size) {
     return false;
   }
 
   // Don't include the header. Objects in the image are pre-marked, but objects
   // in the current isolate are not.
-  uword body_a = RawObject::ToAddr(a) + sizeof(RawObject);
-  uword body_b = RawObject::ToAddr(b) + sizeof(RawObject);
-  uword body_size = heap_size - sizeof(RawObject);
+  uword body_a = ObjectLayout::ToAddr(a) + sizeof(ObjectLayout);
+  uword body_b = ObjectLayout::ToAddr(b) + sizeof(ObjectLayout);
+  uword body_size = heap_size - sizeof(ObjectLayout);
   return 0 == memcmp(reinterpret_cast<const void*>(body_a),
                      reinterpret_cast<const void*>(body_b), body_size);
 }
@@ -102,8 +103,8 @@
       ASSERT((initial_offset + inst.expected_offset) == next_text_offset_);
       switch (inst.op) {
         case ImageWriterCommand::InsertInstructionOfCode: {
-          RawCode* code = inst.insert_instruction_of_code.code;
-          RawInstructions* instructions = Code::InstructionsOf(code);
+          CodePtr code = inst.insert_instruction_of_code.code;
+          InstructionsPtr instructions = Code::InstructionsOf(code);
           const intptr_t offset = next_text_offset_;
           instructions_.Add(InstructionsData(instructions, code, offset));
           next_text_offset_ += SizeInSnapshot(instructions);
@@ -127,8 +128,8 @@
   }
 }
 
-int32_t ImageWriter::GetTextOffsetFor(RawInstructions* instructions,
-                                      RawCode* code) {
+int32_t ImageWriter::GetTextOffsetFor(InstructionsPtr instructions,
+                                      CodePtr code) {
   intptr_t offset = heap_->GetObjectId(instructions);
   if (offset != 0) {
     return offset;
@@ -143,7 +144,7 @@
   return offset;
 }
 
-static intptr_t InstructionsSizeInSnapshot(RawInstructions* raw) {
+static intptr_t InstructionsSizeInSnapshot(InstructionsPtr raw) {
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     // Currently, we align bare instruction payloads on 4 byte boundaries.
     //
@@ -158,7 +159,7 @@
       compiler::target::Instructions::HeaderSize() + Instructions::Size(raw),
       compiler::target::ObjectAlignment::kObjectAlignment);
 #else
-  return raw->HeapSize();
+  return raw->ptr()->HeapSize();
 #endif
 }
 
@@ -196,32 +197,32 @@
                         compiler::target::ObjectAlignment::kObjectAlignment);
 }
 
-intptr_t ImageWriter::SizeInSnapshot(RawObject* raw_object) {
+intptr_t ImageWriter::SizeInSnapshot(ObjectPtr raw_object) {
   const classid_t cid = raw_object->GetClassId();
 
   switch (cid) {
     case kCompressedStackMapsCid: {
-      RawCompressedStackMaps* raw_maps =
-          static_cast<RawCompressedStackMaps*>(raw_object);
+      CompressedStackMapsPtr raw_maps =
+          static_cast<CompressedStackMapsPtr>(raw_object);
       auto const payload_size = CompressedStackMaps::PayloadSizeOf(raw_maps);
       return CompressedStackMapsSizeInSnapshot(payload_size);
     }
     case kOneByteStringCid:
     case kTwoByteStringCid: {
-      RawString* raw_str = static_cast<RawString*>(raw_object);
+      StringPtr raw_str = static_cast<StringPtr>(raw_object);
       return StringSizeInSnapshot(Smi::Value(raw_str->ptr()->length_),
                                   cid == kOneByteStringCid);
     }
     case kCodeSourceMapCid: {
-      RawCodeSourceMap* raw_map = static_cast<RawCodeSourceMap*>(raw_object);
+      CodeSourceMapPtr raw_map = static_cast<CodeSourceMapPtr>(raw_object);
       return CodeSourceMapSizeInSnapshot(raw_map->ptr()->length_);
     }
     case kPcDescriptorsCid: {
-      RawPcDescriptors* raw_desc = static_cast<RawPcDescriptors*>(raw_object);
+      PcDescriptorsPtr raw_desc = static_cast<PcDescriptorsPtr>(raw_object);
       return PcDescriptorsSizeInSnapshot(raw_desc->ptr()->length_);
     }
     case kInstructionsCid: {
-      RawInstructions* raw_insns = static_cast<RawInstructions*>(raw_object);
+      InstructionsPtr raw_insns = static_cast<InstructionsPtr>(raw_object);
       return InstructionsSizeInSnapshot(raw_insns);
     }
     default: {
@@ -232,17 +233,17 @@
   }
 }
 #else   // defined(IS_SIMARM_X64)
-intptr_t ImageWriter::SizeInSnapshot(RawObject* raw) {
+intptr_t ImageWriter::SizeInSnapshot(ObjectPtr raw) {
   switch (raw->GetClassId()) {
     case kInstructionsCid:
-      return InstructionsSizeInSnapshot(static_cast<RawInstructions*>(raw));
+      return InstructionsSizeInSnapshot(static_cast<InstructionsPtr>(raw));
     default:
-      return raw->HeapSize();
+      return raw->ptr()->HeapSize();
   }
 }
 #endif  // defined(IS_SIMARM_X64)
 
-uint32_t ImageWriter::GetDataOffsetFor(RawObject* raw_object) {
+uint32_t ImageWriter::GetDataOffsetFor(ObjectPtr raw_object) {
   intptr_t snap_size = SizeInSnapshot(raw_object);
   intptr_t offset = next_data_offset_;
   next_data_offset_ += snap_size;
@@ -377,7 +378,7 @@
     if (is_trampoline) continue;
 
     data.insns_ = &Instructions::Handle(zone, data.raw_insns_);
-    ASSERT(data.raw_code_ != NULL);
+    ASSERT(data.raw_code_ != nullptr);
     data.code_ = &Code::Handle(zone, data.raw_code_);
 
     // Reset object id as an isolate snapshot after a VM snapshot will not use
@@ -419,14 +420,15 @@
     AutoTraceImage(obj, section_start, stream);
 
     NoSafepointScope no_safepoint;
-    uword start = reinterpret_cast<uword>(obj.raw()) - kHeapObjectTag;
+    uword start = static_cast<uword>(obj.raw()) - kHeapObjectTag;
 
     // Write object header with the mark and read-only bits set.
     uword marked_tags = obj.raw()->ptr()->tags_;
-    marked_tags = RawObject::OldBit::update(true, marked_tags);
-    marked_tags = RawObject::OldAndNotMarkedBit::update(false, marked_tags);
-    marked_tags = RawObject::OldAndNotRememberedBit::update(true, marked_tags);
-    marked_tags = RawObject::NewBit::update(false, marked_tags);
+    marked_tags = ObjectLayout::OldBit::update(true, marked_tags);
+    marked_tags = ObjectLayout::OldAndNotMarkedBit::update(false, marked_tags);
+    marked_tags =
+        ObjectLayout::OldAndNotRememberedBit::update(true, marked_tags);
+    marked_tags = ObjectLayout::NewBit::update(false, marked_tags);
 #if defined(HASH_IN_OBJECT_HEADER)
     marked_tags |= static_cast<uword>(obj.raw()->ptr()->hash_) << 32;
 #endif
@@ -456,9 +458,8 @@
       marked_tags = UpdateObjectSizeForTarget(size_in_bytes, marked_tags);
 
       stream->WriteTargetWord(marked_tags);
-      stream->WriteTargetWord(
-          reinterpret_cast<uword>(str.raw()->ptr()->length_));
-      stream->WriteTargetWord(reinterpret_cast<uword>(str.raw()->ptr()->hash_));
+      stream->WriteTargetWord(static_cast<uword>(str.raw()->ptr()->length_));
+      stream->WriteTargetWord(static_cast<uword>(str.raw()->ptr()->hash_));
       stream->WriteBytes(
           reinterpret_cast<const void*>(start + String::kSizeofRawString),
           StringPayloadSize(str.Length(), str.IsOneByteString()));
@@ -487,7 +488,7 @@
       FATAL1("Unsupported class %s in rodata section.\n", clazz.ToCString());
     }
 #else   // defined(IS_SIMARM_X64)
-    const uword end = start + obj.raw()->HeapSize();
+    const uword end = start + obj.raw()->ptr()->HeapSize();
 
     stream->WriteWord(marked_tags);
     start += sizeof(uword);
@@ -624,8 +625,8 @@
   }
 #endif
 
-  const char* instructions_symbol =
-      vm ? "_kDartVmSnapshotInstructions" : "_kDartIsolateSnapshotInstructions";
+  const char* instructions_symbol = vm ? kVmSnapshotInstructionsAsmSymbol
+                                       : kIsolateSnapshotInstructionsAsmSymbol;
   assembly_stream_.Print(".text\n");
   assembly_stream_.Print(".globl %s\n", instructions_symbol);
 
@@ -660,12 +661,12 @@
     const intptr_t section_size = image_size - Image::kHeaderSize;
     // Add the RawInstructionsSection header.
     const compiler::target::uword marked_tags =
-        RawObject::OldBit::encode(true) |
-        RawObject::OldAndNotMarkedBit::encode(false) |
-        RawObject::OldAndNotRememberedBit::encode(true) |
-        RawObject::NewBit::encode(false) |
-        RawObject::SizeTag::encode(AdjustObjectSizeForTarget(section_size)) |
-        RawObject::ClassIdTag::encode(kInstructionsSectionCid);
+        ObjectLayout::OldBit::encode(true) |
+        ObjectLayout::OldAndNotMarkedBit::encode(false) |
+        ObjectLayout::OldAndNotRememberedBit::encode(true) |
+        ObjectLayout::NewBit::encode(false) |
+        ObjectLayout::SizeTag::encode(AdjustObjectSizeForTarget(section_size)) |
+        ObjectLayout::ClassIdTag::encode(kInstructionsSectionCid);
     WriteWordLiteralText(marked_tags);
     // Calculated using next_text_offset_, which doesn't include post-payload
     // padding to object alignment.
@@ -757,11 +758,12 @@
 
       // Write Instructions with the mark and read-only bits set.
       uword marked_tags = insns.raw_ptr()->tags_;
-      marked_tags = RawObject::OldBit::update(true, marked_tags);
-      marked_tags = RawObject::OldAndNotMarkedBit::update(false, marked_tags);
+      marked_tags = ObjectLayout::OldBit::update(true, marked_tags);
       marked_tags =
-          RawObject::OldAndNotRememberedBit::update(true, marked_tags);
-      marked_tags = RawObject::NewBit::update(false, marked_tags);
+          ObjectLayout::OldAndNotMarkedBit::update(false, marked_tags);
+      marked_tags =
+          ObjectLayout::OldAndNotRememberedBit::update(true, marked_tags);
+      marked_tags = ObjectLayout::NewBit::update(false, marked_tags);
 #if defined(HASH_IN_OBJECT_HEADER)
       // Can't use GetObjectTagsAndHash because the update methods discard the
       // high bits.
@@ -813,7 +815,7 @@
 
 #if defined(DART_PRECOMPILER)
       PcDescriptors::Iterator iterator(descriptors,
-                                       RawPcDescriptors::kBSSRelocation);
+                                       PcDescriptorsLayout::kBSSRelocation);
       uword next_reloc_offset = iterator.MoveNext() ? iterator.PcOffset() : -1;
 
       // We only generate BSS relocations that are word-sized and at
@@ -858,7 +860,7 @@
         }
 
         ASSERT(kWordSize != compiler::target::kWordSize ||
-               (text_offset - instr_start) == insns.raw()->HeapSize());
+               (text_offset - instr_start) == insns.raw()->ptr()->HeapSize());
       }
     }
 
@@ -1067,8 +1069,8 @@
 void BlobImageWriter::WriteText(WriteStream* clustered_stream, bool vm) {
   const bool bare_instruction_payloads =
       FLAG_precompiled_mode && FLAG_use_bare_instructions;
-  const char* instructions_symbol =
-      vm ? "_kDartVmSnapshotInstructions" : "_kDartIsolateSnapshotInstructions";
+  const char* instructions_symbol = vm ? kVmSnapshotInstructionsAsmSymbol
+                                       : kIsolateSnapshotInstructionsAsmSymbol;
   auto const zone = Thread::Current()->zone();
 
 #if defined(DART_PRECOMPILER)
@@ -1107,12 +1109,12 @@
     const intptr_t section_size = image_size - Image::kHeaderSize;
     // Add the RawInstructionsSection header.
     const compiler::target::uword marked_tags =
-        RawObject::OldBit::encode(true) |
-        RawObject::OldAndNotMarkedBit::encode(false) |
-        RawObject::OldAndNotRememberedBit::encode(true) |
-        RawObject::NewBit::encode(false) |
-        RawObject::SizeTag::encode(AdjustObjectSizeForTarget(section_size)) |
-        RawObject::ClassIdTag::encode(kInstructionsSectionCid);
+        ObjectLayout::OldBit::encode(true) |
+        ObjectLayout::OldAndNotMarkedBit::encode(false) |
+        ObjectLayout::OldAndNotRememberedBit::encode(true) |
+        ObjectLayout::NewBit::encode(false) |
+        ObjectLayout::SizeTag::encode(AdjustObjectSizeForTarget(section_size)) |
+        ObjectLayout::ClassIdTag::encode(kInstructionsSectionCid);
     instructions_blob_stream_.WriteTargetWord(marked_tags);
     // Uses next_text_offset_ to avoid any post-payload padding.
     const intptr_t instructions_length =
@@ -1183,10 +1185,11 @@
 
     // Write Instructions with the mark and read-only bits set.
     uword marked_tags = insns.raw_ptr()->tags_;
-    marked_tags = RawObject::OldBit::update(true, marked_tags);
-    marked_tags = RawObject::OldAndNotMarkedBit::update(false, marked_tags);
-    marked_tags = RawObject::OldAndNotRememberedBit::update(true, marked_tags);
-    marked_tags = RawObject::NewBit::update(false, marked_tags);
+    marked_tags = ObjectLayout::OldBit::update(true, marked_tags);
+    marked_tags = ObjectLayout::OldAndNotMarkedBit::update(false, marked_tags);
+    marked_tags =
+        ObjectLayout::OldAndNotRememberedBit::update(true, marked_tags);
+    marked_tags = ObjectLayout::NewBit::update(false, marked_tags);
 #if defined(HASH_IN_OBJECT_HEADER)
     // Can't use GetObjectTagsAndHash because the update methods discard the
     // high bits.
@@ -1258,7 +1261,7 @@
       descriptors = code.pc_descriptors();
 
       PcDescriptors::Iterator iterator(
-          descriptors, /*kind_mask=*/RawPcDescriptors::kBSSRelocation);
+          descriptors, /*kind_mask=*/PcDescriptorsLayout::kBSSRelocation);
 
       while (iterator.MoveNext()) {
         const intptr_t reloc_offset = iterator.PcOffset();
@@ -1322,7 +1325,7 @@
   ASSERT(instructions_image != NULL);
 }
 
-RawApiError* ImageReader::VerifyAlignment() const {
+ApiErrorPtr ImageReader::VerifyAlignment() const {
   if (!Utils::IsAligned(data_image_, kObjectAlignment) ||
       !Utils::IsAligned(instructions_image_, kMaxObjectAlignment)) {
     return ApiError::New(
@@ -1344,23 +1347,23 @@
 }
 #endif
 
-RawInstructions* ImageReader::GetInstructionsAt(uint32_t offset) const {
+InstructionsPtr ImageReader::GetInstructionsAt(uint32_t offset) const {
   ASSERT(Utils::IsAligned(offset, kObjectAlignment));
 
-  RawObject* result = RawObject::FromAddr(
+  ObjectPtr result = ObjectLayout::FromAddr(
       reinterpret_cast<uword>(instructions_image_) + offset);
   ASSERT(result->IsInstructions());
-  ASSERT(result->IsMarked());
+  ASSERT(result->ptr()->IsMarked());
 
   return Instructions::RawCast(result);
 }
 
-RawObject* ImageReader::GetObjectAt(uint32_t offset) const {
+ObjectPtr ImageReader::GetObjectAt(uint32_t offset) const {
   ASSERT(Utils::IsAligned(offset, kObjectAlignment));
 
-  RawObject* result =
-      RawObject::FromAddr(reinterpret_cast<uword>(data_image_) + offset);
-  ASSERT(result->IsMarked());
+  ObjectPtr result =
+      ObjectLayout::FromAddr(reinterpret_cast<uword>(data_image_) + offset);
+  ASSERT(result->ptr()->IsMarked());
 
   return result;
 }
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index 3d87113..94a57ca 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -28,10 +28,6 @@
 class Elf;
 class Instructions;
 class Object;
-class RawApiError;
-class RawCode;
-class RawInstructions;
-class RawObject;
 
 class Image : ValueObject {
  public:
@@ -67,12 +63,12 @@
  public:
   ImageReader(const uint8_t* data_image, const uint8_t* instructions_image);
 
-  RawApiError* VerifyAlignment() const;
+  ApiErrorPtr VerifyAlignment() const;
 
   ONLY_IN_PRECOMPILED(uword GetBareInstructionsAt(uint32_t offset) const);
   ONLY_IN_PRECOMPILED(uword GetBareInstructionsEnd() const);
-  RawInstructions* GetInstructionsAt(uint32_t offset) const;
-  RawObject* GetObjectAt(uint32_t offset) const;
+  InstructionsPtr GetInstructionsAt(uint32_t offset) const;
+  ObjectPtr GetObjectAt(uint32_t offset) const;
 
  private:
   const uint8_t* data_image_;
@@ -84,16 +80,16 @@
 struct ObjectOffsetPair {
  public:
   ObjectOffsetPair() : ObjectOffsetPair(NULL, 0) {}
-  ObjectOffsetPair(RawObject* obj, int32_t off) : object(obj), offset(off) {}
+  ObjectOffsetPair(ObjectPtr obj, int32_t off) : object(obj), offset(off) {}
 
-  RawObject* object;
+  ObjectPtr object;
   int32_t offset;
 };
 
 class ObjectOffsetTrait {
  public:
   // Typedefs needed for the DirectChainedHashMap template.
-  typedef RawObject* Key;
+  typedef ObjectPtr Key;
   typedef int32_t Value;
   typedef ObjectOffsetPair Pair;
 
@@ -119,7 +115,7 @@
     InsertBytesOfTrampoline,
   };
 
-  ImageWriterCommand(intptr_t expected_offset, RawCode* code)
+  ImageWriterCommand(intptr_t expected_offset, CodePtr code)
       : expected_offset(expected_offset),
         op(ImageWriterCommand::InsertInstructionOfCode),
         insert_instruction_of_code({code}) {}
@@ -138,7 +134,7 @@
   Opcode op;
   union {
     struct {
-      RawCode* code;
+      CodePtr code;
     } insert_instruction_of_code;
     struct {
       uint8_t* buffer;
@@ -172,8 +168,8 @@
            offset_space_ == V8SnapshotProfileWriter::kIsolateData ||
            offset_space_ == V8SnapshotProfileWriter::kIsolateText;
   }
-  int32_t GetTextOffsetFor(RawInstructions* instructions, RawCode* code);
-  uint32_t GetDataOffsetFor(RawObject* raw_object);
+  int32_t GetTextOffsetFor(InstructionsPtr instructions, CodePtr code);
+  uint32_t GetDataOffsetFor(ObjectPtr raw_object);
 
   void Write(WriteStream* clustered_stream, bool vm);
   intptr_t data_size() const { return next_data_offset_; }
@@ -191,7 +187,7 @@
 
   void TraceInstructions(const Instructions& instructions);
 
-  static intptr_t SizeInSnapshot(RawObject* object);
+  static intptr_t SizeInSnapshot(ObjectPtr object);
   static const intptr_t kBareInstructionsAlignment = 4;
 
   static_assert(
@@ -200,9 +196,9 @@
       "Target object alignment is larger than the host object alignment");
 
   // Converts the target object size (in bytes) to an appropriate argument for
-  // RawObject::SizeTag methods on the host machine.
+  // ObjectLayout::SizeTag methods on the host machine.
   //
-  // RawObject::SizeTag expects a size divisible by kObjectAlignment and
+  // ObjectLayout::SizeTag expects a size divisible by kObjectAlignment and
   // checks this in debug mode, but the size on the target machine may not be
   // divisible by the host machine's object alignment if they differ.
   //
@@ -219,8 +215,8 @@
 
   static UNLESS_DEBUG(constexpr) compiler::target::uword
       UpdateObjectSizeForTarget(intptr_t size, uword marked_tags) {
-    return RawObject::SizeTag::update(AdjustObjectSizeForTarget(size),
-                                      marked_tags);
+    return ObjectLayout::SizeTag::update(AdjustObjectSizeForTarget(size),
+                                         marked_tags);
   }
 
   // Returns nullptr if there is no profile writer.
@@ -235,9 +231,7 @@
   void DumpInstructionsSizes();
 
   struct InstructionsData {
-    InstructionsData(RawInstructions* insns,
-                     RawCode* code,
-                     intptr_t text_offset)
+    InstructionsData(InstructionsPtr insns, CodePtr code, intptr_t text_offset)
         : raw_insns_(insns),
           raw_code_(code),
           text_offset_(text_offset),
@@ -254,11 +248,11 @@
           trampoline_length(trampoline_length) {}
 
     union {
-      RawInstructions* raw_insns_;
+      InstructionsPtr raw_insns_;
       const Instructions* insns_;
     };
     union {
-      RawCode* raw_code_;
+      CodePtr raw_code_;
       const Code* code_;
     };
     intptr_t text_offset_;
@@ -268,10 +262,10 @@
   };
 
   struct ObjectData {
-    explicit ObjectData(RawObject* raw_obj) : raw_obj_(raw_obj) {}
+    explicit ObjectData(ObjectPtr raw_obj) : raw_obj_(raw_obj) {}
 
     union {
-      RawObject* raw_obj_;
+      ObjectPtr raw_obj_;
       const Object* obj_;
     };
   };
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index 37f4113..465f888 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -64,9 +64,8 @@
   ASSERT(reg == R9);
 }
 
-RawCode* NativeCallPattern::target() const {
-  return reinterpret_cast<RawCode*>(
-      object_pool_.ObjectAt(target_code_pool_index_));
+CodePtr NativeCallPattern::target() const {
+  return static_cast<CodePtr>(object_pool_.ObjectAt(target_code_pool_index_));
 }
 
 void NativeCallPattern::set_target(const Code& new_target) const {
@@ -103,7 +102,7 @@
   } else {
     intptr_t value = 0;
     start = DecodeLoadWordImmediate(end, reg, &value);
-    *obj = reinterpret_cast<RawObject*>(value);
+    *obj = static_cast<ObjectPtr>(value);
   }
   return start;
 }
@@ -259,16 +258,15 @@
   return false;
 }
 
-RawCode* CallPattern::TargetCode() const {
-  return reinterpret_cast<RawCode*>(
-      object_pool_.ObjectAt(target_code_pool_index_));
+CodePtr CallPattern::TargetCode() const {
+  return static_cast<CodePtr>(object_pool_.ObjectAt(target_code_pool_index_));
 }
 
 void CallPattern::SetTargetCode(const Code& target_code) const {
   object_pool_.SetObjectAt(target_code_pool_index_, target_code);
 }
 
-RawObject* ICCallPattern::Data() const {
+ObjectPtr ICCallPattern::Data() const {
   return object_pool_.ObjectAt(data_pool_index_);
 }
 
@@ -277,8 +275,8 @@
   object_pool_.SetObjectAt(data_pool_index_, data);
 }
 
-RawCode* ICCallPattern::TargetCode() const {
-  return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_pool_index_));
+CodePtr ICCallPattern::TargetCode() const {
+  return static_cast<CodePtr>(object_pool_.ObjectAt(target_pool_index_));
 }
 
 void ICCallPattern::SetTargetCode(const Code& target_code) const {
@@ -290,7 +288,7 @@
       data_pool_index_(-1),
       target_pool_index_(-1) {}
 
-RawObject* SwitchableCallPatternBase::data() const {
+ObjectPtr SwitchableCallPatternBase::data() const {
   return object_pool_.ObjectAt(data_pool_index_);
 }
 
@@ -314,8 +312,8 @@
   ASSERT(reg == CODE_REG);
 }
 
-RawCode* SwitchableCallPattern::target() const {
-  return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_pool_index_));
+CodePtr SwitchableCallPattern::target() const {
+  return static_cast<CodePtr>(object_pool_.ObjectAt(target_pool_index_));
 }
 void SwitchableCallPattern::SetTarget(const Code& target) const {
   ASSERT(Object::Handle(object_pool_.ObjectAt(target_pool_index_)).IsCode());
@@ -338,13 +336,13 @@
   ASSERT(reg == LR);
 }
 
-RawCode* BareSwitchableCallPattern::target() const {
+CodePtr BareSwitchableCallPattern::target() const {
   const uword pc = object_pool_.RawValueAt(target_pool_index_);
-  auto rct = Isolate::Current()->reverse_pc_lookup_cache();
+  auto rct = IsolateGroup::Current()->reverse_pc_lookup_cache();
   if (rct->Contains(pc)) {
     return rct->Lookup(pc);
   }
-  rct = Dart::vm_isolate()->reverse_pc_lookup_cache();
+  rct = Dart::vm_isolate()->group()->reverse_pc_lookup_cache();
   if (rct->Contains(pc)) {
     return rct->Lookup(pc);
   }
diff --git a/runtime/vm/instructions_arm.h b/runtime/vm/instructions_arm.h
index 6933278..1ddbc90 100644
--- a/runtime/vm/instructions_arm.h
+++ b/runtime/vm/instructions_arm.h
@@ -13,6 +13,7 @@
 #include "vm/allocation.h"
 #include "vm/constants.h"
 #include "vm/native_function.h"
+#include "vm/tagged_pointer.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 #include "vm/compiler/assembler/assembler.h"
@@ -24,9 +25,7 @@
 class Code;
 class Object;
 class ObjectPool;
-class RawCode;
-class RawICData;
-class RawObject;
+class CodeLayout;
 
 class InstructionPattern : public AllStatic {
  public:
@@ -75,7 +74,7 @@
  public:
   CallPattern(uword pc, const Code& code);
 
-  RawCode* TargetCode() const;
+  CodePtr TargetCode() const;
   void SetTargetCode(const Code& code) const;
 
  private:
@@ -90,10 +89,10 @@
  public:
   ICCallPattern(uword pc, const Code& code);
 
-  RawObject* Data() const;
+  ObjectPtr Data() const;
   void SetData(const Object& data) const;
 
-  RawCode* TargetCode() const;
+  CodePtr TargetCode() const;
   void SetTargetCode(const Code& code) const;
 
  private:
@@ -109,7 +108,7 @@
  public:
   NativeCallPattern(uword pc, const Code& code);
 
-  RawCode* target() const;
+  CodePtr target() const;
   void set_target(const Code& target) const;
 
   NativeFunction native_function() const;
@@ -134,7 +133,7 @@
  public:
   explicit SwitchableCallPatternBase(const Code& code);
 
-  RawObject* data() const;
+  ObjectPtr data() const;
   void SetData(const Object& data) const;
 
  protected:
@@ -154,7 +153,7 @@
  public:
   SwitchableCallPattern(uword pc, const Code& code);
 
-  RawCode* target() const;
+  CodePtr target() const;
   void SetTarget(const Code& target) const;
 
  private:
@@ -169,7 +168,7 @@
  public:
   BareSwitchableCallPattern(uword pc, const Code& code);
 
-  RawCode* target() const;
+  CodePtr target() const;
   void SetTarget(const Code& target) const;
 
  private:
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index c83b9e2..037e777 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -65,9 +65,8 @@
   ASSERT(reg == R5);
 }
 
-RawCode* NativeCallPattern::target() const {
-  return reinterpret_cast<RawCode*>(
-      object_pool_.ObjectAt(target_code_pool_index_));
+CodePtr NativeCallPattern::target() const {
+  return static_cast<CodePtr>(object_pool_.ObjectAt(target_code_pool_index_));
 }
 
 void NativeCallPattern::set_target(const Code& target) const {
@@ -108,7 +107,7 @@
     // Case 2.
     intptr_t value = 0;
     start = DecodeLoadWordImmediate(end, reg, &value);
-    *obj = reinterpret_cast<RawObject*>(value);
+    *obj = static_cast<ObjectPtr>(value);
   }
   return start;
 }
@@ -372,9 +371,8 @@
   instr->SetInstructionBits(instr->InstructionBits() | B22);
 }
 
-RawCode* CallPattern::TargetCode() const {
-  return reinterpret_cast<RawCode*>(
-      object_pool_.ObjectAt(target_code_pool_index_));
+CodePtr CallPattern::TargetCode() const {
+  return static_cast<CodePtr>(object_pool_.ObjectAt(target_code_pool_index_));
 }
 
 void CallPattern::SetTargetCode(const Code& target) const {
@@ -382,7 +380,7 @@
   // No need to flush the instruction cache, since the code is not modified.
 }
 
-RawObject* ICCallPattern::Data() const {
+ObjectPtr ICCallPattern::Data() const {
   return object_pool_.ObjectAt(data_pool_index_);
 }
 
@@ -391,8 +389,8 @@
   object_pool_.SetObjectAt(data_pool_index_, data);
 }
 
-RawCode* ICCallPattern::TargetCode() const {
-  return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_pool_index_));
+CodePtr ICCallPattern::TargetCode() const {
+  return static_cast<CodePtr>(object_pool_.ObjectAt(target_pool_index_));
 }
 
 void ICCallPattern::SetTargetCode(const Code& target) const {
@@ -405,7 +403,7 @@
       data_pool_index_(-1),
       target_pool_index_(-1) {}
 
-RawObject* SwitchableCallPatternBase::data() const {
+ObjectPtr SwitchableCallPatternBase::data() const {
   return object_pool_.ObjectAt(data_pool_index_);
 }
 
@@ -431,8 +429,8 @@
   target_pool_index_ = pool_index + 1;
 }
 
-RawCode* SwitchableCallPattern::target() const {
-  return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_pool_index_));
+CodePtr SwitchableCallPattern::target() const {
+  return static_cast<CodePtr>(object_pool_.ObjectAt(target_pool_index_));
 }
 
 void SwitchableCallPattern::SetTarget(const Code& target) const {
@@ -457,13 +455,13 @@
   target_pool_index_ = pool_index + 1;
 }
 
-RawCode* BareSwitchableCallPattern::target() const {
+CodePtr BareSwitchableCallPattern::target() const {
   const uword pc = object_pool_.RawValueAt(target_pool_index_);
-  auto rct = Isolate::Current()->reverse_pc_lookup_cache();
+  auto rct = IsolateGroup::Current()->reverse_pc_lookup_cache();
   if (rct->Contains(pc)) {
     return rct->Lookup(pc);
   }
-  rct = Dart::vm_isolate()->reverse_pc_lookup_cache();
+  rct = Dart::vm_isolate()->group()->reverse_pc_lookup_cache();
   if (rct->Contains(pc)) {
     return rct->Lookup(pc);
   }
diff --git a/runtime/vm/instructions_arm64.h b/runtime/vm/instructions_arm64.h
index 2c1b62b..4a8f7e2 100644
--- a/runtime/vm/instructions_arm64.h
+++ b/runtime/vm/instructions_arm64.h
@@ -13,6 +13,7 @@
 #include "vm/allocation.h"
 #include "vm/constants.h"
 #include "vm/native_function.h"
+#include "vm/tagged_pointer.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 #include "vm/compiler/assembler/assembler.h"
@@ -24,9 +25,6 @@
 class ICData;
 class Object;
 class ObjectPool;
-class RawCode;
-class RawICData;
-class RawObject;
 
 class InstructionPattern : public AllStatic {
  public:
@@ -86,7 +84,7 @@
  public:
   CallPattern(uword pc, const Code& code);
 
-  RawCode* TargetCode() const;
+  CodePtr TargetCode() const;
   void SetTargetCode(const Code& target) const;
 
  private:
@@ -101,10 +99,10 @@
  public:
   ICCallPattern(uword pc, const Code& caller_code);
 
-  RawObject* Data() const;
+  ObjectPtr Data() const;
   void SetData(const Object& data) const;
 
-  RawCode* TargetCode() const;
+  CodePtr TargetCode() const;
   void SetTargetCode(const Code& target) const;
 
  private:
@@ -120,7 +118,7 @@
  public:
   NativeCallPattern(uword pc, const Code& code);
 
-  RawCode* target() const;
+  CodePtr target() const;
   void set_target(const Code& target) const;
 
   NativeFunction native_function() const;
@@ -145,7 +143,7 @@
  public:
   explicit SwitchableCallPatternBase(const Code& code);
 
-  RawObject* data() const;
+  ObjectPtr data() const;
   void SetData(const Object& data) const;
 
  protected:
@@ -165,7 +163,7 @@
  public:
   SwitchableCallPattern(uword pc, const Code& code);
 
-  RawCode* target() const;
+  CodePtr target() const;
   void SetTarget(const Code& target) const;
 
  private:
@@ -180,7 +178,7 @@
  public:
   BareSwitchableCallPattern(uword pc, const Code& code);
 
-  RawCode* target() const;
+  CodePtr target() const;
   void SetTarget(const Code& target) const;
 
  private:
diff --git a/runtime/vm/instructions_kbc.cc b/runtime/vm/instructions_kbc.cc
index a8a3608..b427738 100644
--- a/runtime/vm/instructions_kbc.cc
+++ b/runtime/vm/instructions_kbc.cc
@@ -13,7 +13,7 @@
 
 namespace dart {
 
-RawTypedData* KBCNativeCallPattern::GetNativeEntryDataAt(
+TypedDataPtr KBCNativeCallPattern::GetNativeEntryDataAt(
     uword pc,
     const Bytecode& bytecode) {
   ASSERT(bytecode.ContainsInstructionAt(pc));
diff --git a/runtime/vm/instructions_kbc.h b/runtime/vm/instructions_kbc.h
index d210a28..5bfdb11 100644
--- a/runtime/vm/instructions_kbc.h
+++ b/runtime/vm/instructions_kbc.h
@@ -15,7 +15,7 @@
 
 class KBCNativeCallPattern : public AllStatic {
  public:
-  static RawTypedData* GetNativeEntryDataAt(uword pc, const Bytecode& bytecode);
+  static TypedDataPtr GetNativeEntryDataAt(uword pc, const Bytecode& bytecode);
 };
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 21044dc..c5b27e3 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -76,7 +76,7 @@
   jmp_buf buffer_;
 
  private:
-  RawObject** fp_;
+  ObjectPtr* fp_;
   Interpreter* interpreter_;
   InterpreterSetjmpBuffer* link_;
 
@@ -86,12 +86,13 @@
   DISALLOW_COPY_AND_ASSIGN(InterpreterSetjmpBuffer);
 };
 
-DART_FORCE_INLINE static RawObject** SavedCallerFP(RawObject** FP) {
-  return reinterpret_cast<RawObject**>(FP[kKBCSavedCallerFpSlotFromFp]);
+DART_FORCE_INLINE static ObjectPtr* SavedCallerFP(ObjectPtr* FP) {
+  return reinterpret_cast<ObjectPtr*>(
+      static_cast<uword>(FP[kKBCSavedCallerFpSlotFromFp]));
 }
 
-DART_FORCE_INLINE static RawObject** FrameArguments(RawObject** FP,
-                                                    intptr_t argc) {
+DART_FORCE_INLINE static ObjectPtr* FrameArguments(ObjectPtr* FP,
+                                                   intptr_t argc) {
   return FP - (kKBCDartFrameFixedSize + argc);
 }
 
@@ -100,34 +101,34 @@
 class InterpreterHelpers {
  public:
 #define DEFINE_CASTS(Type)                                                     \
-  DART_FORCE_INLINE static Raw##Type* CastTo##Type(RawObject* obj) {           \
+  DART_FORCE_INLINE static Type##Ptr CastTo##Type(ObjectPtr obj) {             \
     ASSERT((k##Type##Cid == kSmiCid)                                           \
                ? !obj->IsHeapObject()                                          \
                : (k##Type##Cid == kIntegerCid)                                 \
                      ? (!obj->IsHeapObject() || obj->IsMint())                 \
                      : obj->Is##Type());                                       \
-    return reinterpret_cast<Raw##Type*>(obj);                                  \
+    return static_cast<Type##Ptr>(obj);                                        \
   }
   CLASS_LIST(DEFINE_CASTS)
 #undef DEFINE_CASTS
 
-  DART_FORCE_INLINE static RawSmi* GetClassIdAsSmi(RawObject* obj) {
+  DART_FORCE_INLINE static SmiPtr GetClassIdAsSmi(ObjectPtr obj) {
     return Smi::New(obj->IsHeapObject() ? obj->GetClassId()
                                         : static_cast<intptr_t>(kSmiCid));
   }
 
-  DART_FORCE_INLINE static intptr_t GetClassId(RawObject* obj) {
+  DART_FORCE_INLINE static intptr_t GetClassId(ObjectPtr obj) {
     return obj->IsHeapObject() ? obj->GetClassId()
                                : static_cast<intptr_t>(kSmiCid);
   }
 
-  DART_FORCE_INLINE static RawTypeArguments* GetTypeArguments(
+  DART_FORCE_INLINE static TypeArgumentsPtr GetTypeArguments(
       Thread* thread,
-      RawInstance* instance) {
-    RawClass* instance_class =
+      InstancePtr instance) {
+    ClassPtr instance_class =
         thread->isolate()->class_table()->At(GetClassId(instance));
     return instance_class->ptr()->num_type_arguments_ > 0
-               ? reinterpret_cast<RawTypeArguments**>(instance->ptr())
+               ? reinterpret_cast<TypeArgumentsPtr*>(instance->ptr())
                      [instance_class->ptr()
                           ->host_type_arguments_field_offset_in_words_]
                : TypeArguments::null();
@@ -136,57 +137,56 @@
   // The usage counter is actually a 'hotness' counter.
   // For an instance call, both the usage counters of the caller and of the
   // calle will get incremented, as well as the ICdata counter at the call site.
-  DART_FORCE_INLINE static void IncrementUsageCounter(RawFunction* f) {
+  DART_FORCE_INLINE static void IncrementUsageCounter(FunctionPtr f) {
     f->ptr()->usage_counter_++;
   }
 
-  DART_FORCE_INLINE static void IncrementICUsageCount(RawObject** entries,
+  DART_FORCE_INLINE static void IncrementICUsageCount(ObjectPtr* entries,
                                                       intptr_t offset,
                                                       intptr_t args_tested) {
     const intptr_t count_offset = ICData::CountIndexFor(args_tested);
     const intptr_t raw_smi_old =
-        reinterpret_cast<intptr_t>(entries[offset + count_offset]);
+        static_cast<intptr_t>(entries[offset + count_offset]);
     const intptr_t raw_smi_new = raw_smi_old + Smi::RawValue(1);
     *reinterpret_cast<intptr_t*>(&entries[offset + count_offset]) = raw_smi_new;
   }
 
-  DART_FORCE_INLINE static bool CheckIndex(RawSmi* index, RawSmi* length) {
-    return !index->IsHeapObject() && (reinterpret_cast<intptr_t>(index) >= 0) &&
-           (reinterpret_cast<intptr_t>(index) <
-            reinterpret_cast<intptr_t>(length));
+  DART_FORCE_INLINE static bool CheckIndex(SmiPtr index, SmiPtr length) {
+    return !index->IsHeapObject() && (static_cast<intptr_t>(index) >= 0) &&
+           (static_cast<intptr_t>(index) < static_cast<intptr_t>(length));
   }
 
-  DART_FORCE_INLINE static intptr_t ArgDescTypeArgsLen(RawArray* argdesc) {
-    return Smi::Value(*reinterpret_cast<RawSmi**>(
+  DART_FORCE_INLINE static intptr_t ArgDescTypeArgsLen(ArrayPtr argdesc) {
+    return Smi::Value(*reinterpret_cast<SmiPtr*>(
         reinterpret_cast<uword>(argdesc->ptr()) +
         Array::element_offset(ArgumentsDescriptor::kTypeArgsLenIndex)));
   }
 
-  DART_FORCE_INLINE static intptr_t ArgDescArgCount(RawArray* argdesc) {
-    return Smi::Value(*reinterpret_cast<RawSmi**>(
+  DART_FORCE_INLINE static intptr_t ArgDescArgCount(ArrayPtr argdesc) {
+    return Smi::Value(*reinterpret_cast<SmiPtr*>(
         reinterpret_cast<uword>(argdesc->ptr()) +
         Array::element_offset(ArgumentsDescriptor::kCountIndex)));
   }
 
-  DART_FORCE_INLINE static intptr_t ArgDescArgSize(RawArray* argdesc) {
-    return Smi::Value(*reinterpret_cast<RawSmi**>(
+  DART_FORCE_INLINE static intptr_t ArgDescArgSize(ArrayPtr argdesc) {
+    return Smi::Value(*reinterpret_cast<SmiPtr*>(
         reinterpret_cast<uword>(argdesc->ptr()) +
         Array::element_offset(ArgumentsDescriptor::kSizeIndex)));
   }
 
-  DART_FORCE_INLINE static intptr_t ArgDescPosCount(RawArray* argdesc) {
-    return Smi::Value(*reinterpret_cast<RawSmi**>(
+  DART_FORCE_INLINE static intptr_t ArgDescPosCount(ArrayPtr argdesc) {
+    return Smi::Value(*reinterpret_cast<SmiPtr*>(
         reinterpret_cast<uword>(argdesc->ptr()) +
         Array::element_offset(ArgumentsDescriptor::kPositionalCountIndex)));
   }
 
-  DART_FORCE_INLINE static RawBytecode* FrameBytecode(RawObject** FP) {
+  DART_FORCE_INLINE static BytecodePtr FrameBytecode(ObjectPtr* FP) {
     ASSERT(GetClassId(FP[kKBCPcMarkerSlotFromFp]) == kBytecodeCid);
-    return static_cast<RawBytecode*>(FP[kKBCPcMarkerSlotFromFp]);
+    return static_cast<BytecodePtr>(FP[kKBCPcMarkerSlotFromFp]);
   }
 
-  DART_FORCE_INLINE static bool FieldNeedsGuardUpdate(RawField* field,
-                                                      RawObject* value) {
+  DART_FORCE_INLINE static bool FieldNeedsGuardUpdate(FieldPtr field,
+                                                      ObjectPtr value) {
     // The interpreter should never see a cloned field.
     ASSERT(field->ptr()->owner_->GetClassId() != kFieldCid);
 
@@ -232,42 +232,43 @@
     return false;
   }
 
-  DART_FORCE_INLINE static bool IsFinalized(RawClass* cls) {
+  DART_FORCE_INLINE static bool IsFinalized(ClassPtr cls) {
     return Class::ClassFinalizedBits::decode(cls->ptr()->state_bits_) ==
-           RawClass::kFinalized;
+           ClassLayout::kFinalized;
   }
 };
 
-DART_FORCE_INLINE static const KBCInstr* SavedCallerPC(RawObject** FP) {
-  return reinterpret_cast<const KBCInstr*>(FP[kKBCSavedCallerPcSlotFromFp]);
+DART_FORCE_INLINE static const KBCInstr* SavedCallerPC(ObjectPtr* FP) {
+  return reinterpret_cast<const KBCInstr*>(
+      static_cast<uword>(FP[kKBCSavedCallerPcSlotFromFp]));
 }
 
-DART_FORCE_INLINE static RawFunction* FrameFunction(RawObject** FP) {
-  RawFunction* function = static_cast<RawFunction*>(FP[kKBCFunctionSlotFromFp]);
+DART_FORCE_INLINE static FunctionPtr FrameFunction(ObjectPtr* FP) {
+  FunctionPtr function = static_cast<FunctionPtr>(FP[kKBCFunctionSlotFromFp]);
   ASSERT(InterpreterHelpers::GetClassId(function) == kFunctionCid ||
          InterpreterHelpers::GetClassId(function) == kNullCid);
   return function;
 }
 
-DART_FORCE_INLINE static RawObject* InitializeHeader(uword addr,
-                                                     intptr_t class_id,
-                                                     intptr_t instance_size) {
+DART_FORCE_INLINE static ObjectPtr InitializeHeader(uword addr,
+                                                    intptr_t class_id,
+                                                    intptr_t instance_size) {
   uint32_t tags = 0;
-  tags = RawObject::ClassIdTag::update(class_id, tags);
-  tags = RawObject::SizeTag::update(instance_size, tags);
-  tags = RawObject::OldBit::update(false, tags);
-  tags = RawObject::OldAndNotMarkedBit::update(false, tags);
-  tags = RawObject::OldAndNotRememberedBit::update(false, tags);
-  tags = RawObject::NewBit::update(true, tags);
+  tags = ObjectLayout::ClassIdTag::update(class_id, tags);
+  tags = ObjectLayout::SizeTag::update(instance_size, tags);
+  tags = ObjectLayout::OldBit::update(false, tags);
+  tags = ObjectLayout::OldAndNotMarkedBit::update(false, tags);
+  tags = ObjectLayout::OldAndNotRememberedBit::update(false, tags);
+  tags = ObjectLayout::NewBit::update(true, tags);
   // Also writes zero in the hash_ field.
   *reinterpret_cast<uword*>(addr + Object::tags_offset()) = tags;
-  return RawObject::FromAddr(addr);
+  return ObjectLayout::FromAddr(addr);
 }
 
 DART_FORCE_INLINE static bool TryAllocate(Thread* thread,
                                           intptr_t class_id,
                                           intptr_t instance_size,
-                                          RawObject** result) {
+                                          ObjectPtr* result) {
   ASSERT(instance_size > 0);
   ASSERT(Utils::IsAligned(instance_size, kObjectAlignment));
 
@@ -295,14 +296,13 @@
 }
 
 bool LookupCache::Lookup(intptr_t receiver_cid,
-                         RawString* function_name,
-                         RawArray* arguments_descriptor,
-                         RawFunction** target) const {
+                         StringPtr function_name,
+                         ArrayPtr arguments_descriptor,
+                         FunctionPtr* target) const {
   ASSERT(receiver_cid != kIllegalCid);  // Sentinel value.
 
-  const intptr_t hash = receiver_cid ^
-                        reinterpret_cast<intptr_t>(function_name) ^
-                        reinterpret_cast<intptr_t>(arguments_descriptor);
+  const intptr_t hash = receiver_cid ^ static_cast<intptr_t>(function_name) ^
+                        static_cast<intptr_t>(arguments_descriptor);
   const intptr_t probe1 = hash & kTableMask;
   if (entries_[probe1].receiver_cid == receiver_cid &&
       entries_[probe1].function_name == function_name &&
@@ -323,17 +323,16 @@
 }
 
 void LookupCache::Insert(intptr_t receiver_cid,
-                         RawString* function_name,
-                         RawArray* arguments_descriptor,
-                         RawFunction* target) {
+                         StringPtr function_name,
+                         ArrayPtr arguments_descriptor,
+                         FunctionPtr target) {
   // Otherwise we have to clear the cache or rehash on scavenges too.
   ASSERT(function_name->IsOldObject());
   ASSERT(arguments_descriptor->IsOldObject());
   ASSERT(target->IsOldObject());
 
-  const intptr_t hash = receiver_cid ^
-                        reinterpret_cast<intptr_t>(function_name) ^
-                        reinterpret_cast<intptr_t>(arguments_descriptor);
+  const intptr_t hash = receiver_cid ^ static_cast<intptr_t>(function_name) ^
+                        static_cast<intptr_t>(arguments_descriptor);
   const intptr_t probe1 = hash & kTableMask;
   if (entries_[probe1].receiver_cid == kIllegalCid) {
     entries_[probe1].receiver_cid = receiver_cid;
@@ -359,7 +358,11 @@
 }
 
 Interpreter::Interpreter()
-    : stack_(NULL), fp_(NULL), pp_(NULL), argdesc_(NULL), lookup_cache_() {
+    : stack_(NULL),
+      fp_(NULL),
+      pp_(nullptr),
+      argdesc_(nullptr),
+      lookup_cache_() {
   // Setup interpreter support first. Some of this information is needed to
   // setup the architecture state.
   // We allocate the stack here, the size is computed as the sum of
@@ -503,15 +506,15 @@
 typedef double (*InterpreterLeafFloatRuntimeCall)(double d0, double d1);
 
 void Interpreter::Exit(Thread* thread,
-                       RawObject** base,
-                       RawObject** frame,
+                       ObjectPtr* base,
+                       ObjectPtr* frame,
                        const KBCInstr* pc) {
   frame[0] = Function::null();
   frame[1] = Bytecode::null();
-  frame[2] = reinterpret_cast<RawObject*>(reinterpret_cast<uword>(pc));
-  frame[3] = reinterpret_cast<RawObject*>(base);
+  frame[2] = static_cast<ObjectPtr>(reinterpret_cast<uword>(pc));
+  frame[3] = static_cast<ObjectPtr>(reinterpret_cast<uword>(base));
 
-  RawObject** exit_fp = frame + kKBCDartFrameFixedSize;
+  ObjectPtr* exit_fp = frame + kKBCDartFrameFixedSize;
   thread->set_top_exit_frame_info(reinterpret_cast<uword>(exit_fp));
   fp_ = exit_fp;
 
@@ -527,8 +530,8 @@
 void Interpreter::Unexit(Thread* thread) {
 #if !defined(PRODUCT)
   // For the profiler.
-  RawObject** exit_fp =
-      reinterpret_cast<RawObject**>(thread->top_exit_frame_info());
+  ObjectPtr* exit_fp =
+      reinterpret_cast<ObjectPtr*>(thread->top_exit_frame_info());
   ASSERT(exit_fp != 0);
   pc_ = SavedCallerPC(exit_fp);
   fp_ = SavedCallerFP(exit_fp);
@@ -537,7 +540,7 @@
 }
 
 // Calling into runtime may trigger garbage collection and relocate objects,
-// so all RawObject* pointers become outdated and should not be used across
+// so all ObjectPtr pointers become outdated and should not be used across
 // runtime calls.
 // Note: functions below are marked DART_NOINLINE to recover performance where
 // inlining these functions into the interpreter loop seemed to cause some code
@@ -576,15 +579,25 @@
   }
 }
 
+extern "C" {
+// Note: The invocation stub follows the C ABI, so we cannot pass C++ struct
+// values like ObjectPtr. In some calling conventions (IA32), ObjectPtr is
+// passed/returned different from a pointer.
+typedef uword /*ObjectPtr*/ (*invokestub)(uword /*CodePtr*/ code,
+                                          uword /*ArrayPtr*/ argdesc,
+                                          ObjectPtr* arg0,
+                                          Thread* thread);
+}
+
 DART_NOINLINE bool Interpreter::InvokeCompiled(Thread* thread,
-                                               RawFunction* function,
-                                               RawObject** call_base,
-                                               RawObject** call_top,
+                                               FunctionPtr function,
+                                               ObjectPtr* call_base,
+                                               ObjectPtr* call_top,
                                                const KBCInstr** pc,
-                                               RawObject*** FP,
-                                               RawObject*** SP) {
+                                               ObjectPtr** FP,
+                                               ObjectPtr** SP) {
   ASSERT(Function::HasCode(function));
-  RawCode* volatile code = function->ptr()->code_;
+  CodePtr code = function->ptr()->code_;
   ASSERT(code != StubCode::LazyCompile().raw());
   // TODO(regis): Once we share the same stack, try to invoke directly.
 #if defined(DEBUG)
@@ -594,11 +607,9 @@
   }
 #endif
   // On success, returns a RawInstance.  On failure, a RawError.
-  typedef RawObject* (*invokestub)(RawCode * code, RawArray * argdesc,
-                                   RawObject * *arg0, Thread * thread);
   invokestub volatile entrypoint = reinterpret_cast<invokestub>(
       StubCode::InvokeDartCodeFromBytecode().EntryPoint());
-  RawObject* volatile result;
+  ObjectPtr result;
   Exit(thread, *FP, call_top + 1, *pc);
   {
     InterpreterSetjmpBuffer buffer(this);
@@ -610,14 +621,15 @@
       if (!thread->os_thread()->HasStackHeadroom()) {
         thread->SetStackLimit(-1);
       }
-      result = bit_copy<RawObject*, int64_t>(
-          Simulator::Current()->Call(reinterpret_cast<intptr_t>(entrypoint),
-                                     reinterpret_cast<intptr_t>(code),
-                                     reinterpret_cast<intptr_t>(argdesc_),
-                                     reinterpret_cast<intptr_t>(call_base),
-                                     reinterpret_cast<intptr_t>(thread)));
+      result = bit_copy<ObjectPtr, int64_t>(Simulator::Current()->Call(
+          reinterpret_cast<intptr_t>(entrypoint), static_cast<intptr_t>(code),
+          static_cast<intptr_t>(argdesc_),
+          reinterpret_cast<intptr_t>(call_base),
+          reinterpret_cast<intptr_t>(thread)));
 #else
-      result = entrypoint(code, argdesc_, call_base, thread);
+      result = static_cast<ObjectPtr>(entrypoint(static_cast<uword>(code),
+                                                 static_cast<uword>(argdesc_),
+                                                 call_base, thread));
 #endif
       ASSERT(thread->vm_tag() == VMTag::kDartInterpretedTagId);
       ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
@@ -665,12 +677,12 @@
 }
 
 DART_FORCE_INLINE bool Interpreter::InvokeBytecode(Thread* thread,
-                                                   RawFunction* function,
-                                                   RawObject** call_base,
-                                                   RawObject** call_top,
+                                                   FunctionPtr function,
+                                                   ObjectPtr* call_base,
+                                                   ObjectPtr* call_top,
                                                    const KBCInstr** pc,
-                                                   RawObject*** FP,
-                                                   RawObject*** SP) {
+                                                   ObjectPtr** FP,
+                                                   ObjectPtr** SP) {
   ASSERT(Function::HasBytecode(function));
 #if defined(DEBUG)
   if (IsTracingExecution()) {
@@ -679,13 +691,14 @@
               Function::Handle(function).ToFullyQualifiedCString());
   }
 #endif
-  RawObject** callee_fp = call_top + kKBCDartFrameFixedSize;
+  ObjectPtr* callee_fp = call_top + kKBCDartFrameFixedSize;
   ASSERT(function == FrameFunction(callee_fp));
-  RawBytecode* bytecode = function->ptr()->bytecode_;
+  BytecodePtr bytecode = function->ptr()->bytecode_;
   callee_fp[kKBCPcMarkerSlotFromFp] = bytecode;
   callee_fp[kKBCSavedCallerPcSlotFromFp] =
-      reinterpret_cast<RawObject*>(reinterpret_cast<uword>(*pc));
-  callee_fp[kKBCSavedCallerFpSlotFromFp] = reinterpret_cast<RawObject*>(*FP);
+      static_cast<ObjectPtr>(reinterpret_cast<uword>(*pc));
+  callee_fp[kKBCSavedCallerFpSlotFromFp] =
+      static_cast<ObjectPtr>(reinterpret_cast<uword>(*FP));
   pp_ = bytecode->ptr()->object_pool_;
   *pc = reinterpret_cast<const KBCInstr*>(bytecode->ptr()->instructions_);
   NOT_IN_PRODUCT(pc_ = *pc);  // For the profiler.
@@ -696,13 +709,13 @@
 }
 
 DART_FORCE_INLINE bool Interpreter::Invoke(Thread* thread,
-                                           RawObject** call_base,
-                                           RawObject** call_top,
+                                           ObjectPtr* call_base,
+                                           ObjectPtr* call_top,
                                            const KBCInstr** pc,
-                                           RawObject*** FP,
-                                           RawObject*** SP) {
-  RawObject** callee_fp = call_top + kKBCDartFrameFixedSize;
-  RawFunction* function = FrameFunction(callee_fp);
+                                           ObjectPtr** FP,
+                                           ObjectPtr** SP) {
+  ObjectPtr* callee_fp = call_top + kKBCDartFrameFixedSize;
+  FunctionPtr function = FrameFunction(callee_fp);
 
   for (;;) {
     if (Function::HasCode(function)) {
@@ -728,12 +741,12 @@
 }
 
 DART_FORCE_INLINE bool Interpreter::InstanceCall(Thread* thread,
-                                                 RawString* target_name,
-                                                 RawObject** call_base,
-                                                 RawObject** top,
+                                                 StringPtr target_name,
+                                                 ObjectPtr* call_base,
+                                                 ObjectPtr* top,
                                                  const KBCInstr** pc,
-                                                 RawObject*** FP,
-                                                 RawObject*** SP) {
+                                                 ObjectPtr** FP,
+                                                 ObjectPtr** SP) {
   const intptr_t type_args_len =
       InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
   const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
@@ -741,7 +754,7 @@
   intptr_t receiver_cid =
       InterpreterHelpers::GetClassId(call_base[receiver_idx]);
 
-  RawFunction* target;
+  FunctionPtr target;
   if (UNLIKELY(!lookup_cache_.Lookup(receiver_cid, target_name, argdesc_,
                                      &target))) {
     // Table lookup miss.
@@ -759,9 +772,9 @@
       return false;
     }
 
-    target = static_cast<RawFunction*>(top[4]);
-    target_name = static_cast<RawString*>(top[2]);
-    argdesc_ = static_cast<RawArray*>(top[3]);
+    target = static_cast<FunctionPtr>(top[4]);
+    target_name = static_cast<StringPtr>(top[2]);
+    argdesc_ = static_cast<ArrayPtr>(top[3]);
     ASSERT(target->IsFunction());
     lookup_cache_.Insert(receiver_cid, target_name, argdesc_, target);
   }
@@ -971,7 +984,7 @@
 #define UNBOX_INT64(value, obj, selector)                                      \
   int64_t value;                                                               \
   {                                                                            \
-    word raw_value = reinterpret_cast<word>(obj);                              \
+    word raw_value = static_cast<word>(obj);                                   \
     if (LIKELY((raw_value & kSmiTagMask) == kSmiTag)) {                        \
       value = raw_value >> kSmiTagShift;                                       \
     } else {                                                                   \
@@ -1047,8 +1060,8 @@
 
 bool Interpreter::CopyParameters(Thread* thread,
                                  const KBCInstr** pc,
-                                 RawObject*** FP,
-                                 RawObject*** SP,
+                                 ObjectPtr** FP,
+                                 ObjectPtr** SP,
                                  const intptr_t num_fixed_params,
                                  const intptr_t num_opt_pos_params,
                                  const intptr_t num_opt_named_params) {
@@ -1066,7 +1079,7 @@
   }
 
   // Copy all passed position arguments.
-  RawObject** first_arg = FrameArguments(*FP, arg_count);
+  ObjectPtr* first_arg = FrameArguments(*FP, arg_count);
   memmove(*FP, first_arg, pos_count * kWordSize);
 
   if (num_opt_named_params != 0) {
@@ -1075,7 +1088,7 @@
     // default values encoded as pairs of LoadConstant instructions that
     // follows the entry point and find matching values via arguments
     // descriptor.
-    RawObject** argdesc_data = argdesc_->ptr()->data();
+    ObjectPtr* argdesc_data = argdesc_->ptr()->data();
 
     intptr_t i = 0;  // argument position
     intptr_t j = 0;  // parameter position
@@ -1089,11 +1102,11 @@
       const uint8_t reg = KernelBytecode::DecodeA(load_name);
       ASSERT(reg == KernelBytecode::DecodeA(load_value));
 
-      RawString* name = static_cast<RawString*>(
+      StringPtr name = static_cast<StringPtr>(
           LOAD_CONSTANT(KernelBytecode::DecodeE(load_name)));
       if (name == argdesc_data[ArgumentsDescriptor::name_index(i)]) {
         // Parameter was passed. Fetch passed value.
-        const intptr_t arg_index = Smi::Value(static_cast<RawSmi*>(
+        const intptr_t arg_index = Smi::Value(static_cast<SmiPtr>(
             argdesc_data[ArgumentsDescriptor::position_index(i)]));
         (*FP)[reg] = first_arg[arg_index];
         ++i;  // Consume passed argument.
@@ -1161,28 +1174,28 @@
 
 bool Interpreter::AssertAssignable(Thread* thread,
                                    const KBCInstr* pc,
-                                   RawObject** FP,
-                                   RawObject** call_top,
-                                   RawObject** args,
-                                   RawSubtypeTestCache* cache) {
-  RawObject* null_value = Object::null();
+                                   ObjectPtr* FP,
+                                   ObjectPtr* call_top,
+                                   ObjectPtr* args,
+                                   SubtypeTestCachePtr cache) {
+  ObjectPtr null_value = Object::null();
   if (cache != null_value) {
-    RawInstance* instance = static_cast<RawInstance*>(args[0]);
-    RawTypeArguments* instantiator_type_arguments =
-        static_cast<RawTypeArguments*>(args[2]);
-    RawTypeArguments* function_type_arguments =
-        static_cast<RawTypeArguments*>(args[3]);
+    InstancePtr instance = static_cast<InstancePtr>(args[0]);
+    TypeArgumentsPtr instantiator_type_arguments =
+        static_cast<TypeArgumentsPtr>(args[2]);
+    TypeArgumentsPtr function_type_arguments =
+        static_cast<TypeArgumentsPtr>(args[3]);
 
     const intptr_t cid = InterpreterHelpers::GetClassId(instance);
 
-    RawTypeArguments* instance_type_arguments =
-        static_cast<RawTypeArguments*>(null_value);
-    RawObject* instance_cid_or_function;
+    TypeArgumentsPtr instance_type_arguments =
+        static_cast<TypeArgumentsPtr>(null_value);
+    ObjectPtr instance_cid_or_function;
 
-    RawTypeArguments* parent_function_type_arguments;
-    RawTypeArguments* delayed_function_type_arguments;
+    TypeArgumentsPtr parent_function_type_arguments;
+    TypeArgumentsPtr delayed_function_type_arguments;
     if (cid == kClosureCid) {
-      RawClosure* closure = static_cast<RawClosure*>(instance);
+      ClosurePtr closure = static_cast<ClosurePtr>(instance);
       instance_type_arguments = closure->ptr()->instantiator_type_arguments_;
       parent_function_type_arguments = closure->ptr()->function_type_arguments_;
       delayed_function_type_arguments = closure->ptr()->delayed_type_arguments_;
@@ -1190,21 +1203,21 @@
     } else {
       instance_cid_or_function = Smi::New(cid);
 
-      RawClass* instance_class = thread->isolate()->class_table()->At(cid);
+      ClassPtr instance_class = thread->isolate()->class_table()->At(cid);
       if (instance_class->ptr()->num_type_arguments_ < 0) {
         goto AssertAssignableCallRuntime;
       } else if (instance_class->ptr()->num_type_arguments_ > 0) {
-        instance_type_arguments = reinterpret_cast<RawTypeArguments**>(
+        instance_type_arguments = reinterpret_cast<TypeArgumentsPtr*>(
             instance->ptr())[instance_class->ptr()
                                  ->host_type_arguments_field_offset_in_words_];
       }
       parent_function_type_arguments =
-          static_cast<RawTypeArguments*>(null_value);
+          static_cast<TypeArgumentsPtr>(null_value);
       delayed_function_type_arguments =
-          static_cast<RawTypeArguments*>(null_value);
+          static_cast<TypeArgumentsPtr>(null_value);
     }
 
-    for (RawObject** entries = cache->ptr()->cache_->ptr()->data();
+    for (ObjectPtr* entries = cache->ptr()->cache_->ptr()->data();
          entries[0] != null_value;
          entries += SubtypeTestCache::kTestEntryLength) {
       if ((entries[SubtypeTestCache::kInstanceClassIdOrFunction] ==
@@ -1245,29 +1258,29 @@
 template <bool is_getter>
 bool Interpreter::AssertAssignableField(Thread* thread,
                                         const KBCInstr* pc,
-                                        RawObject** FP,
-                                        RawObject** SP,
-                                        RawInstance* instance,
-                                        RawField* field,
-                                        RawInstance* value) {
-  RawAbstractType* field_type = field->ptr()->type_;
+                                        ObjectPtr* FP,
+                                        ObjectPtr* SP,
+                                        InstancePtr instance,
+                                        FieldPtr field,
+                                        InstancePtr value) {
+  AbstractTypePtr field_type = field->ptr()->type_;
   // Perform type test of value if field type is not one of dynamic, object,
   // or void, and if the value is not null.
   if (field_type->GetClassId() == kTypeCid) {
-    classid_t cid = Smi::Value(reinterpret_cast<RawSmi*>(
-        Type::RawCast(field_type)->ptr()->type_class_id_));
+    classid_t cid = Smi::Value(
+        static_cast<SmiPtr>(Type::RawCast(field_type)->ptr()->type_class_id_));
     // TODO(regis): Revisit shortcut for NNBD.
     if (cid == kDynamicCid || cid == kInstanceCid || cid == kVoidCid) {
       return true;
     }
   }
-  RawObject* null_value = Object::null();
+  ObjectPtr null_value = Object::null();
   if (value == null_value) {
     // TODO(regis): Revisit null shortcut for NNBD.
     return true;
   }
 
-  RawSubtypeTestCache* cache = field->ptr()->type_test_cache_;
+  SubtypeTestCachePtr cache = field->ptr()->type_test_cache_;
   if (UNLIKELY(cache == null_value)) {
     // Allocate new cache.
     SP[1] = instance;    // Preserve.
@@ -1283,10 +1296,10 @@
     }
 
     // Reload objects after the call which may trigger GC.
-    instance = reinterpret_cast<RawInstance*>(SP[1]);
-    field = reinterpret_cast<RawField*>(SP[2]);
-    value = reinterpret_cast<RawInstance*>(SP[3]);
-    cache = reinterpret_cast<RawSubtypeTestCache*>(SP[4]);
+    instance = static_cast<InstancePtr>(SP[1]);
+    field = static_cast<FieldPtr>(SP[2]);
+    value = static_cast<InstancePtr>(SP[3]);
+    cache = static_cast<SubtypeTestCachePtr>(SP[4]);
     field_type = field->ptr()->type_;
     field->ptr()->type_test_cache_ = cache;
   }
@@ -1302,10 +1315,10 @@
                           /* args */ SP + 1, cache);
 }
 
-RawObject* Interpreter::Call(const Function& function,
-                             const Array& arguments_descriptor,
-                             const Array& arguments,
-                             Thread* thread) {
+ObjectPtr Interpreter::Call(const Function& function,
+                            const Array& arguments_descriptor,
+                            const Array& arguments,
+                            Thread* thread) {
   return Call(function.raw(), arguments_descriptor.raw(), arguments.Length(),
               arguments.raw_ptr()->data(), thread);
 }
@@ -1315,12 +1328,12 @@
 DART_NOINLINE bool Interpreter::AllocateMint(Thread* thread,
                                              int64_t value,
                                              const KBCInstr* pc,
-                                             RawObject** FP,
-                                             RawObject** SP) {
+                                             ObjectPtr* FP,
+                                             ObjectPtr* SP) {
   ASSERT(!Smi::IsValid(value));
-  RawMint* result;
+  MintPtr result;
   if (TryAllocate(thread, kMintCid, Mint::InstanceSize(),
-                  reinterpret_cast<RawObject**>(&result))) {
+                  reinterpret_cast<ObjectPtr*>(&result))) {
     result->ptr()->value_ = value;
     SP[0] = result;
     return true;
@@ -1333,7 +1346,7 @@
     if (!InvokeRuntime(thread, this, DRT_AllocateObject, args)) {
       return false;
     }
-    reinterpret_cast<RawMint*>(SP[0])->ptr()->value_ = value;
+    static_cast<MintPtr>(SP[0])->ptr()->value_ = value;
     return true;
   }
 }
@@ -1343,11 +1356,11 @@
 DART_NOINLINE bool Interpreter::AllocateDouble(Thread* thread,
                                                double value,
                                                const KBCInstr* pc,
-                                               RawObject** FP,
-                                               RawObject** SP) {
-  RawDouble* result;
+                                               ObjectPtr* FP,
+                                               ObjectPtr* SP) {
+  DoublePtr result;
   if (TryAllocate(thread, kDoubleCid, Double::InstanceSize(),
-                  reinterpret_cast<RawObject**>(&result))) {
+                  reinterpret_cast<ObjectPtr*>(&result))) {
     result->ptr()->value_ = value;
     SP[0] = result;
     return true;
@@ -1370,11 +1383,11 @@
 DART_NOINLINE bool Interpreter::AllocateFloat32x4(Thread* thread,
                                                   simd128_value_t value,
                                                   const KBCInstr* pc,
-                                                  RawObject** FP,
-                                                  RawObject** SP) {
-  RawFloat32x4* result;
+                                                  ObjectPtr* FP,
+                                                  ObjectPtr* SP) {
+  Float32x4Ptr result;
   if (TryAllocate(thread, kFloat32x4Cid, Float32x4::InstanceSize(),
-                  reinterpret_cast<RawObject**>(&result))) {
+                  reinterpret_cast<ObjectPtr*>(&result))) {
     value.writeTo(result->ptr()->value_);
     SP[0] = result;
     return true;
@@ -1397,11 +1410,11 @@
 DART_NOINLINE bool Interpreter::AllocateFloat64x2(Thread* thread,
                                                   simd128_value_t value,
                                                   const KBCInstr* pc,
-                                                  RawObject** FP,
-                                                  RawObject** SP) {
-  RawFloat64x2* result;
+                                                  ObjectPtr* FP,
+                                                  ObjectPtr* SP) {
+  Float64x2Ptr result;
   if (TryAllocate(thread, kFloat64x2Cid, Float64x2::InstanceSize(),
-                  reinterpret_cast<RawObject**>(&result))) {
+                  reinterpret_cast<ObjectPtr*>(&result))) {
     value.writeTo(result->ptr()->value_);
     SP[0] = result;
     return true;
@@ -1422,17 +1435,17 @@
 // Allocate a _List with the given type arguments and length and put it into
 // SP[0]. Returns false on exception.
 bool Interpreter::AllocateArray(Thread* thread,
-                                RawTypeArguments* type_args,
-                                RawObject* length_object,
+                                TypeArgumentsPtr type_args,
+                                ObjectPtr length_object,
                                 const KBCInstr* pc,
-                                RawObject** FP,
-                                RawObject** SP) {
+                                ObjectPtr* FP,
+                                ObjectPtr* SP) {
   if (LIKELY(!length_object->IsHeapObject())) {
     const intptr_t length = Smi::Value(Smi::RawCast(length_object));
     if (LIKELY(Array::IsValidLength(length))) {
-      RawArray* result;
+      ArrayPtr result;
       if (TryAllocate(thread, kArrayCid, Array::InstanceSize(length),
-                      reinterpret_cast<RawObject**>(&result))) {
+                      reinterpret_cast<ObjectPtr*>(&result))) {
         result->ptr()->type_arguments_ = type_args;
         result->ptr()->length_ = Smi::New(length);
         for (intptr_t i = 0; i < length; i++) {
@@ -1457,15 +1470,15 @@
 bool Interpreter::AllocateContext(Thread* thread,
                                   intptr_t num_context_variables,
                                   const KBCInstr* pc,
-                                  RawObject** FP,
-                                  RawObject** SP) {
-  RawContext* result;
+                                  ObjectPtr* FP,
+                                  ObjectPtr* SP) {
+  ContextPtr result;
   if (TryAllocate(thread, kContextCid,
                   Context::InstanceSize(num_context_variables),
-                  reinterpret_cast<RawObject**>(&result))) {
+                  reinterpret_cast<ObjectPtr*>(&result))) {
     result->ptr()->num_variables_ = num_context_variables;
-    RawObject* null_value = Object::null();
-    result->ptr()->parent_ = static_cast<RawContext*>(null_value);
+    ObjectPtr null_value = Object::null();
+    result->ptr()->parent_ = static_cast<ContextPtr>(null_value);
     for (intptr_t i = 0; i < num_context_variables; i++) {
       result->ptr()->data()[i] = null_value;
     }
@@ -1484,17 +1497,17 @@
 // Returns false on exception.
 bool Interpreter::AllocateClosure(Thread* thread,
                                   const KBCInstr* pc,
-                                  RawObject** FP,
-                                  RawObject** SP) {
+                                  ObjectPtr* FP,
+                                  ObjectPtr* SP) {
   const intptr_t instance_size = Closure::InstanceSize();
-  RawClosure* result;
+  ClosurePtr result;
   if (TryAllocate(thread, kClosureCid, instance_size,
-                  reinterpret_cast<RawObject**>(&result))) {
-    uword start = RawObject::ToAddr(result);
-    RawObject* null_value = Object::null();
-    for (intptr_t offset = sizeof(RawInstance); offset < instance_size;
+                  reinterpret_cast<ObjectPtr*>(&result))) {
+    uword start = ObjectLayout::ToAddr(result);
+    ObjectPtr null_value = Object::null();
+    for (intptr_t offset = sizeof(InstanceLayout); offset < instance_size;
          offset += kWordSize) {
-      *reinterpret_cast<RawObject**>(start + offset) = null_value;
+      *reinterpret_cast<ObjectPtr*>(start + offset) = null_value;
     }
     SP[0] = result;
     return true;
@@ -1508,21 +1521,21 @@
   }
 }
 
-RawObject* Interpreter::Call(RawFunction* function,
-                             RawArray* argdesc,
-                             intptr_t argc,
-                             RawObject* const* argv,
-                             Thread* thread) {
+ObjectPtr Interpreter::Call(FunctionPtr function,
+                            ArrayPtr argdesc,
+                            intptr_t argc,
+                            ObjectPtr const* argv,
+                            Thread* thread) {
   // Interpreter state (see constants_kbc.h for high-level overview).
   const KBCInstr* pc;  // Program Counter: points to the next op to execute.
-  RawObject** FP;      // Frame Pointer.
-  RawObject** SP;      // Stack Pointer.
+  ObjectPtr* FP;       // Frame Pointer.
+  ObjectPtr* SP;       // Stack Pointer.
 
   uint32_t op;  // Currently executing op.
 
   bool reentering = fp_ != NULL;
   if (!reentering) {
-    fp_ = reinterpret_cast<RawObject**>(stack_base_);
+    fp_ = reinterpret_cast<ObjectPtr*>(stack_base_);
   }
 #if defined(DEBUG)
   if (IsTracingExecution()) {
@@ -1565,22 +1578,22 @@
 
   // Save outer top_exit_frame_info, current argdesc, and current pp.
   fp_[kKBCExitLinkSlotFromEntryFp] =
-      reinterpret_cast<RawObject*>(thread->top_exit_frame_info());
+      static_cast<ObjectPtr>(thread->top_exit_frame_info());
   thread->set_top_exit_frame_info(0);
-  fp_[kKBCSavedArgDescSlotFromEntryFp] = reinterpret_cast<RawObject*>(argdesc_);
-  fp_[kKBCSavedPpSlotFromEntryFp] = reinterpret_cast<RawObject*>(pp_);
+  fp_[kKBCSavedArgDescSlotFromEntryFp] = static_cast<ObjectPtr>(argdesc_);
+  fp_[kKBCSavedPpSlotFromEntryFp] = static_cast<ObjectPtr>(pp_);
 
   // Copy arguments and setup the Dart frame.
   for (intptr_t i = 0; i < arg_count; i++) {
     fp_[kKBCEntrySavedSlots + i] = argv[argc < 0 ? -i : i];
   }
 
-  RawBytecode* bytecode = function->ptr()->bytecode_;
+  BytecodePtr bytecode = function->ptr()->bytecode_;
   FP[kKBCFunctionSlotFromFp] = function;
   FP[kKBCPcMarkerSlotFromFp] = bytecode;
-  FP[kKBCSavedCallerPcSlotFromFp] =
-      reinterpret_cast<RawObject*>(kEntryFramePcMarker);
-  FP[kKBCSavedCallerFpSlotFromFp] = reinterpret_cast<RawObject*>(fp_);
+  FP[kKBCSavedCallerPcSlotFromFp] = static_cast<ObjectPtr>(kEntryFramePcMarker);
+  FP[kKBCSavedCallerFpSlotFromFp] =
+      static_cast<ObjectPtr>(reinterpret_cast<uword>(fp_));
 
   // Load argument descriptor.
   argdesc_ = argdesc;
@@ -1603,9 +1616,9 @@
   thread->set_top_resource(NULL);
 
   // Cache some frequently used values in the frame.
-  RawBool* true_value = Bool::True().raw();
-  RawBool* false_value = Bool::False().raw();
-  RawObject* null_value = Object::null();
+  BoolPtr true_value = Bool::True().raw();
+  BoolPtr false_value = Bool::False().raw();
+  ObjectPtr null_value = Object::null();
 
 #ifdef DART_HAS_COMPUTED_GOTO
   static const void* dispatch[] = {
@@ -1701,7 +1714,7 @@
                        NativeArguments(thread, 0, nullptr, nullptr));
       }
     }
-    RawFunction* function = FrameFunction(FP);
+    FunctionPtr function = FrameFunction(FP);
     int32_t counter = ++(function->ptr()->usage_counter_);
     if (UNLIKELY(FLAG_compilation_counter_threshold >= 0 &&
                  counter >= FLAG_compilation_counter_threshold &&
@@ -1746,7 +1759,7 @@
   {
     BYTECODE(InstantiateType, D);
     // Stack: instantiator type args, function type args
-    RawObject* type = LOAD_CONSTANT(rD);
+    ObjectPtr type = LOAD_CONSTANT(rD);
     SP[1] = type;
     SP[2] = SP[-1];
     SP[3] = SP[0];
@@ -1762,21 +1775,21 @@
   {
     BYTECODE(InstantiateTypeArgumentsTOS, A_E);
     // Stack: instantiator type args, function type args
-    RawTypeArguments* type_arguments =
-        static_cast<RawTypeArguments*>(LOAD_CONSTANT(rE));
+    TypeArgumentsPtr type_arguments =
+        static_cast<TypeArgumentsPtr>(LOAD_CONSTANT(rE));
 
-    RawObject* instantiator_type_args = SP[-1];
-    RawObject* function_type_args = SP[0];
+    ObjectPtr instantiator_type_args = SP[-1];
+    ObjectPtr function_type_args = SP[0];
     // If both instantiators are null and if the type argument vector
     // instantiated from null becomes a vector of dynamic, then use null as
     // the type arguments.
     if ((rA == 0) || (null_value != instantiator_type_args) ||
         (null_value != function_type_args)) {
       // First lookup in the cache.
-      RawArray* instantiations = type_arguments->ptr()->instantiations_;
+      ArrayPtr instantiations = type_arguments->ptr()->instantiations_;
       for (intptr_t i = 0;
            instantiations->ptr()->data()[i] !=
-           reinterpret_cast<RawObject*>(TypeArguments::kNoInstantiator);
+           static_cast<ObjectPtr>(TypeArguments::kNoInstantiator);
            i += TypeArguments::Instantiation::kSizeInWords) {
         if ((instantiations->ptr()->data()
                  [i +
@@ -1905,9 +1918,9 @@
 
       InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
       *++SP = LOAD_CONSTANT(kidx);
-      RawObject** call_base = SP - argc;
-      RawObject** call_top = SP;
-      argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx + 1));
+      ObjectPtr* call_base = SP - argc;
+      ObjectPtr* call_top = SP;
+      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
       if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
         HANDLE_EXCEPTION;
       }
@@ -1926,9 +1939,9 @@
 
       InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
       *++SP = LOAD_CONSTANT(kidx);
-      RawObject** call_base = SP - argc;
-      RawObject** call_top = SP;
-      argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx + 1));
+      ObjectPtr* call_base = SP - argc;
+      ObjectPtr* call_top = SP;
+      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
       if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
         HANDLE_EXCEPTION;
       }
@@ -1944,13 +1957,13 @@
       const uint32_t argc = rF;
       const uint32_t kidx = rD;
 
-      RawObject** call_base = SP - argc + 1;
-      RawObject** call_top = SP + 1;
+      ObjectPtr* call_base = SP - argc + 1;
+      ObjectPtr* call_top = SP + 1;
 
       InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      RawString* target_name =
-          static_cast<RawFunction*>(LOAD_CONSTANT(kidx))->ptr()->name_;
-      argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx + 1));
+      StringPtr target_name =
+          static_cast<FunctionPtr>(LOAD_CONSTANT(kidx))->ptr()->name_;
+      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
       if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
                         &SP)) {
         HANDLE_EXCEPTION;
@@ -1966,13 +1979,13 @@
       const uint32_t argc = rF;
       const uint32_t kidx = rD;
 
-      RawObject** call_base = SP - argc + 1;
-      RawObject** call_top = SP + 1;
+      ObjectPtr* call_base = SP - argc + 1;
+      ObjectPtr* call_top = SP + 1;
 
       InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      RawString* target_name =
-          static_cast<RawFunction*>(LOAD_CONSTANT(kidx))->ptr()->name_;
-      argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx + 1));
+      StringPtr target_name =
+          static_cast<FunctionPtr>(LOAD_CONSTANT(kidx))->ptr()->name_;
+      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
       if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
                         &SP)) {
         HANDLE_EXCEPTION;
@@ -1989,16 +2002,16 @@
       const uint32_t argc = rF;
       const uint32_t kidx = rD;
 
-      RawClosure* receiver = Closure::RawCast(*SP--);
-      RawObject** call_base = SP - argc + 1;
-      RawObject** call_top = SP + 1;
+      ClosurePtr receiver = Closure::RawCast(*SP--);
+      ObjectPtr* call_base = SP - argc + 1;
+      ObjectPtr* call_top = SP + 1;
 
       InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
       if (UNLIKELY(receiver == null_value)) {
         SP[0] = Symbols::Call().raw();
         goto ThrowNullError;
       }
-      argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx));
+      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx));
       call_top[0] = receiver->ptr()->function_;
 
       if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
@@ -2016,13 +2029,13 @@
       const uint32_t argc = rF;
       const uint32_t kidx = rD;
 
-      RawObject** call_base = SP - argc + 1;
-      RawObject** call_top = SP + 1;
+      ObjectPtr* call_base = SP - argc + 1;
+      ObjectPtr* call_top = SP + 1;
 
       InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      RawString* target_name =
-          static_cast<RawFunction*>(LOAD_CONSTANT(kidx))->ptr()->name_;
-      argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx + 1));
+      StringPtr target_name =
+          static_cast<FunctionPtr>(LOAD_CONSTANT(kidx))->ptr()->name_;
+      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
       if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
                         &SP)) {
         HANDLE_EXCEPTION;
@@ -2039,11 +2052,11 @@
       const uint32_t argc = rF;
       const uint32_t kidx = rD;
 
-      RawObject** call_base = SP - argc + 1;
-      RawObject** call_top = SP + 1;
+      ObjectPtr* call_base = SP - argc + 1;
+      ObjectPtr* call_top = SP + 1;
 
       InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      RawString* target_name = String::RawCast(LOAD_CONSTANT(kidx));
+      StringPtr target_name = String::RawCast(LOAD_CONSTANT(kidx));
       argdesc_ = Array::RawCast(LOAD_CONSTANT(kidx + 1));
       if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
                         &SP)) {
@@ -2056,7 +2069,7 @@
 
   {
     BYTECODE(NativeCall, D);
-    RawTypedData* data = static_cast<RawTypedData*>(LOAD_CONSTANT(rD));
+    TypedDataPtr data = static_cast<TypedDataPtr>(LOAD_CONSTANT(rD));
     MethodRecognizer::Kind kind = NativeEntryData::GetKind(data);
     switch (kind) {
       case MethodRecognizer::kObjectEquals: {
@@ -2065,8 +2078,8 @@
       } break;
       case MethodRecognizer::kStringBaseLength:
       case MethodRecognizer::kStringBaseIsEmpty: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[0]);
-        SP[0] = reinterpret_cast<RawObject**>(
+        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
+        SP[0] = reinterpret_cast<ObjectPtr*>(
             instance->ptr())[String::length_offset() / kWordSize];
         if (kind == MethodRecognizer::kStringBaseIsEmpty) {
           SP[0] =
@@ -2074,29 +2087,29 @@
         }
       } break;
       case MethodRecognizer::kGrowableArrayLength: {
-        RawGrowableObjectArray* instance =
-            reinterpret_cast<RawGrowableObjectArray*>(SP[0]);
+        GrowableObjectArrayPtr instance =
+            static_cast<GrowableObjectArrayPtr>(SP[0]);
         SP[0] = instance->ptr()->length_;
       } break;
       case MethodRecognizer::kObjectArrayLength:
       case MethodRecognizer::kImmutableArrayLength: {
-        RawArray* instance = reinterpret_cast<RawArray*>(SP[0]);
+        ArrayPtr instance = static_cast<ArrayPtr>(SP[0]);
         SP[0] = instance->ptr()->length_;
       } break;
       case MethodRecognizer::kTypedListLength:
       case MethodRecognizer::kTypedListViewLength:
       case MethodRecognizer::kByteDataViewLength: {
-        RawTypedDataBase* instance = reinterpret_cast<RawTypedDataBase*>(SP[0]);
+        TypedDataBasePtr instance = static_cast<TypedDataBasePtr>(SP[0]);
         SP[0] = instance->ptr()->length_;
       } break;
       case MethodRecognizer::kByteDataViewOffsetInBytes:
       case MethodRecognizer::kTypedDataViewOffsetInBytes: {
-        RawTypedDataView* instance = reinterpret_cast<RawTypedDataView*>(SP[0]);
+        TypedDataViewPtr instance = static_cast<TypedDataViewPtr>(SP[0]);
         SP[0] = instance->ptr()->offset_in_bytes_;
       } break;
       case MethodRecognizer::kByteDataViewTypedData:
       case MethodRecognizer::kTypedDataViewTypedData: {
-        RawTypedDataView* instance = reinterpret_cast<RawTypedDataView*>(SP[0]);
+        TypedDataViewPtr instance = static_cast<TypedDataViewPtr>(SP[0]);
         SP[0] = instance->ptr()->typed_data_;
       } break;
       case MethodRecognizer::kClassIDgetID: {
@@ -2106,8 +2119,8 @@
         SP[0] = Object::null();
       } break;
       case MethodRecognizer::kGrowableArrayCapacity: {
-        RawGrowableObjectArray* instance =
-            reinterpret_cast<RawGrowableObjectArray*>(SP[0]);
+        GrowableObjectArrayPtr instance =
+            static_cast<GrowableObjectArrayPtr>(SP[0]);
         SP[0] = instance->ptr()->data_->ptr()->length_;
       } break;
       case MethodRecognizer::kListFactory: {
@@ -2116,8 +2129,8 @@
         //                                            : new _GrowableList<E>(0);
         // }
         if (InterpreterHelpers::ArgDescPosCount(argdesc_) == 2) {
-          RawTypeArguments* type_args = TypeArguments::RawCast(SP[-1]);
-          RawObject* length = SP[0];
+          TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
+          ObjectPtr length = SP[0];
           SP--;
           if (!AllocateArray(thread, type_args, length, pc, FP, SP)) {
             HANDLE_EXCEPTION;
@@ -2142,72 +2155,74 @@
         }
       } break;
       case MethodRecognizer::kObjectArrayAllocate: {
-        RawTypeArguments* type_args = TypeArguments::RawCast(SP[-1]);
-        RawObject* length = SP[0];
+        TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
+        ObjectPtr length = SP[0];
         SP--;
         if (!AllocateArray(thread, type_args, length, pc, FP, SP)) {
           HANDLE_EXCEPTION;
         }
       } break;
       case MethodRecognizer::kLinkedHashMap_getIndex: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[0]);
-        SP[0] = reinterpret_cast<RawObject**>(
+        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
+        SP[0] = reinterpret_cast<ObjectPtr*>(
             instance->ptr())[LinkedHashMap::index_offset() / kWordSize];
       } break;
       case MethodRecognizer::kLinkedHashMap_setIndex: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[-1]);
-        instance->StorePointer(reinterpret_cast<RawObject**>(instance->ptr()) +
-                                   LinkedHashMap::index_offset() / kWordSize,
-                               SP[0]);
+        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
+        instance->ptr()->StorePointer(
+            reinterpret_cast<ObjectPtr*>(instance->ptr()) +
+                LinkedHashMap::index_offset() / kWordSize,
+            SP[0]);
         *--SP = null_value;
       } break;
       case MethodRecognizer::kLinkedHashMap_getData: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[0]);
-        SP[0] = reinterpret_cast<RawObject**>(
+        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
+        SP[0] = reinterpret_cast<ObjectPtr*>(
             instance->ptr())[LinkedHashMap::data_offset() / kWordSize];
       } break;
       case MethodRecognizer::kLinkedHashMap_setData: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[-1]);
-        instance->StorePointer(reinterpret_cast<RawObject**>(instance->ptr()) +
-                                   LinkedHashMap::data_offset() / kWordSize,
-                               SP[0]);
+        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
+        instance->ptr()->StorePointer(
+            reinterpret_cast<ObjectPtr*>(instance->ptr()) +
+                LinkedHashMap::data_offset() / kWordSize,
+            SP[0]);
         *--SP = null_value;
       } break;
       case MethodRecognizer::kLinkedHashMap_getHashMask: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[0]);
-        SP[0] = reinterpret_cast<RawObject**>(
+        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
+        SP[0] = reinterpret_cast<ObjectPtr*>(
             instance->ptr())[LinkedHashMap::hash_mask_offset() / kWordSize];
       } break;
       case MethodRecognizer::kLinkedHashMap_setHashMask: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[-1]);
+        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
         ASSERT(!SP[0]->IsHeapObject());
-        reinterpret_cast<RawObject**>(
+        reinterpret_cast<ObjectPtr*>(
             instance->ptr())[LinkedHashMap::hash_mask_offset() / kWordSize] =
             SP[0];
         *--SP = null_value;
       } break;
       case MethodRecognizer::kLinkedHashMap_getUsedData: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[0]);
-        SP[0] = reinterpret_cast<RawObject**>(
+        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
+        SP[0] = reinterpret_cast<ObjectPtr*>(
             instance->ptr())[LinkedHashMap::used_data_offset() / kWordSize];
       } break;
       case MethodRecognizer::kLinkedHashMap_setUsedData: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[-1]);
+        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
         ASSERT(!SP[0]->IsHeapObject());
-        reinterpret_cast<RawObject**>(
+        reinterpret_cast<ObjectPtr*>(
             instance->ptr())[LinkedHashMap::used_data_offset() / kWordSize] =
             SP[0];
         *--SP = null_value;
       } break;
       case MethodRecognizer::kLinkedHashMap_getDeletedKeys: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[0]);
-        SP[0] = reinterpret_cast<RawObject**>(
+        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
+        SP[0] = reinterpret_cast<ObjectPtr*>(
             instance->ptr())[LinkedHashMap::deleted_keys_offset() / kWordSize];
       } break;
       case MethodRecognizer::kLinkedHashMap_setDeletedKeys: {
-        RawInstance* instance = reinterpret_cast<RawInstance*>(SP[-1]);
+        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
         ASSERT(!SP[0]->IsHeapObject());
-        reinterpret_cast<RawObject**>(
+        reinterpret_cast<ObjectPtr*>(
             instance->ptr())[LinkedHashMap::deleted_keys_offset() / kWordSize] =
             SP[0];
         *--SP = null_value;
@@ -2231,8 +2246,8 @@
 
         *++SP = null_value;  // Result slot.
 
-        RawObject** incoming_args = SP - num_arguments;
-        RawObject** return_slot = SP;
+        ObjectPtr* incoming_args = SP - num_arguments;
+        ObjectPtr* return_slot = SP;
         Exit(thread, FP, SP + 1, pc);
         NativeArguments native_args(thread, argc_tag, incoming_args,
                                     return_slot);
@@ -2249,10 +2264,9 @@
   }
 
   {
-    RawObject* result;  // result to return to the caller.
-
     BYTECODE(ReturnTOS, 0);
     DEBUG_CHECK;
+    ObjectPtr result;  // result to return to the caller.
     result = *SP;
     // Restore caller PC.
     pc = SavedCallerPC(FP);
@@ -2260,14 +2274,12 @@
     // Check if it is a fake PC marking the entry frame.
     if (IsEntryFrameMarker(pc)) {
       // Pop entry frame.
-      RawObject** entry_fp = SavedCallerFP(FP);
+      ObjectPtr* entry_fp = SavedCallerFP(FP);
       // Restore exit frame info saved in entry frame.
-      pp_ = reinterpret_cast<RawObjectPool*>(
-          entry_fp[kKBCSavedPpSlotFromEntryFp]);
-      argdesc_ = reinterpret_cast<RawArray*>(
-          entry_fp[kKBCSavedArgDescSlotFromEntryFp]);
-      uword exit_fp =
-          reinterpret_cast<uword>(entry_fp[kKBCExitLinkSlotFromEntryFp]);
+      pp_ = static_cast<ObjectPoolPtr>(entry_fp[kKBCSavedPpSlotFromEntryFp]);
+      argdesc_ =
+          static_cast<ArrayPtr>(entry_fp[kKBCSavedArgDescSlotFromEntryFp]);
+      uword exit_fp = static_cast<uword>(entry_fp[kKBCExitLinkSlotFromEntryFp]);
       thread->set_top_exit_frame_info(exit_fp);
       thread->set_top_resource(top_resource);
       thread->set_vm_tag(vm_tag);
@@ -2312,12 +2324,12 @@
 
   {
     BYTECODE(InitLateField, D);
-    RawField* field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-    RawInstance* instance = reinterpret_cast<RawInstance*>(SP[0]);
+    FieldPtr field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
+    InstancePtr instance = static_cast<InstancePtr>(SP[0]);
     intptr_t offset_in_words = field->ptr()->host_offset_or_field_id_;
 
-    instance->StorePointer(
-        reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words,
+    instance->ptr()->StorePointer(
+        reinterpret_cast<ObjectPtr*>(instance->ptr()) + offset_in_words,
         Object::RawCast(Object::sentinel().raw()), thread);
 
     SP -= 1;  // Drop instance.
@@ -2341,8 +2353,8 @@
 
   {
     BYTECODE(StoreStaticTOS, D);
-    RawField* field = reinterpret_cast<RawField*>(LOAD_CONSTANT(rD));
-    RawInstance* value = static_cast<RawInstance*>(*SP--);
+    FieldPtr field = static_cast<FieldPtr>(LOAD_CONSTANT(rD));
+    InstancePtr value = static_cast<InstancePtr>(*SP--);
     intptr_t field_id = field->ptr()->host_offset_or_field_id_;
     thread->field_table_values()[field_id] = value;
     DISPATCH();
@@ -2350,9 +2362,9 @@
 
   {
     BYTECODE(LoadStatic, D);
-    RawField* field = reinterpret_cast<RawField*>(LOAD_CONSTANT(rD));
+    FieldPtr field = static_cast<FieldPtr>(LOAD_CONSTANT(rD));
     intptr_t field_id = field->ptr()->host_offset_or_field_id_;
-    RawInstance* value = thread->field_table_values()[field_id];
+    InstancePtr value = thread->field_table_values()[field_id];
     ASSERT((value != Object::sentinel().raw()) &&
            (value != Object::transition_sentinel().raw()));
     *++SP = value;
@@ -2361,9 +2373,9 @@
 
   {
     BYTECODE(StoreFieldTOS, D);
-    RawField* field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-    RawInstance* instance = reinterpret_cast<RawInstance*>(SP[-1]);
-    RawObject* value = reinterpret_cast<RawObject*>(SP[0]);
+    FieldPtr field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
+    InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
+    ObjectPtr value = static_cast<ObjectPtr>(SP[0]);
     intptr_t offset_in_words = field->ptr()->host_offset_or_field_id_;
 
     if (InterpreterHelpers::FieldNeedsGuardUpdate(field, value)) {
@@ -2379,7 +2391,7 @@
 
       // Reload objects after the call which may trigger GC.
       field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-      instance = reinterpret_cast<RawInstance*>(SP[-1]);
+      instance = static_cast<InstancePtr>(SP[-1]);
       value = SP[0];
     }
 
@@ -2389,47 +2401,47 @@
     classid_t guarded_cid = field->ptr()->guarded_cid_;
     if (unboxing && (guarded_cid == kDoubleCid) && supports_unboxed_doubles_) {
       double raw_value = Double::RawCast(value)->ptr()->value_;
-      ASSERT(*(reinterpret_cast<RawDouble**>(instance->ptr()) +
+      ASSERT(*(reinterpret_cast<DoublePtr*>(instance->ptr()) +
                offset_in_words) == null_value);  // Initializing store.
       if (!AllocateDouble(thread, raw_value, pc, FP, SP)) {
         HANDLE_EXCEPTION;
       }
-      RawDouble* box = Double::RawCast(SP[0]);
-      instance = reinterpret_cast<RawInstance*>(SP[-1]);
-      instance->StorePointer(
-          reinterpret_cast<RawDouble**>(instance->ptr()) + offset_in_words, box,
+      DoublePtr box = Double::RawCast(SP[0]);
+      instance = static_cast<InstancePtr>(SP[-1]);
+      instance->ptr()->StorePointer(
+          reinterpret_cast<DoublePtr*>(instance->ptr()) + offset_in_words, box,
           thread);
     } else if (unboxing && (guarded_cid == kFloat32x4Cid) &&
                supports_unboxed_simd128_) {
       simd128_value_t raw_value;
       raw_value.readFrom(Float32x4::RawCast(value)->ptr()->value_);
-      ASSERT(*(reinterpret_cast<RawFloat32x4**>(instance->ptr()) +
+      ASSERT(*(reinterpret_cast<Float32x4Ptr*>(instance->ptr()) +
                offset_in_words) == null_value);  // Initializing store.
       if (!AllocateFloat32x4(thread, raw_value, pc, FP, SP)) {
         HANDLE_EXCEPTION;
       }
-      RawFloat32x4* box = Float32x4::RawCast(SP[0]);
-      instance = reinterpret_cast<RawInstance*>(SP[-1]);
-      instance->StorePointer(
-          reinterpret_cast<RawFloat32x4**>(instance->ptr()) + offset_in_words,
+      Float32x4Ptr box = Float32x4::RawCast(SP[0]);
+      instance = static_cast<InstancePtr>(SP[-1]);
+      instance->ptr()->StorePointer(
+          reinterpret_cast<Float32x4Ptr*>(instance->ptr()) + offset_in_words,
           box, thread);
     } else if (unboxing && (guarded_cid == kFloat64x2Cid) &&
                supports_unboxed_simd128_) {
       simd128_value_t raw_value;
       raw_value.readFrom(Float64x2::RawCast(value)->ptr()->value_);
-      ASSERT(*(reinterpret_cast<RawFloat64x2**>(instance->ptr()) +
+      ASSERT(*(reinterpret_cast<Float64x2Ptr*>(instance->ptr()) +
                offset_in_words) == null_value);  // Initializing store.
       if (!AllocateFloat64x2(thread, raw_value, pc, FP, SP)) {
         HANDLE_EXCEPTION;
       }
-      RawFloat64x2* box = Float64x2::RawCast(SP[0]);
-      instance = reinterpret_cast<RawInstance*>(SP[-1]);
-      instance->StorePointer(
-          reinterpret_cast<RawFloat64x2**>(instance->ptr()) + offset_in_words,
+      Float64x2Ptr box = Float64x2::RawCast(SP[0]);
+      instance = static_cast<InstancePtr>(SP[-1]);
+      instance->ptr()->StorePointer(
+          reinterpret_cast<Float64x2Ptr*>(instance->ptr()) + offset_in_words,
           box, thread);
     } else {
-      instance->StorePointer(
-          reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words,
+      instance->ptr()->StorePointer(
+          reinterpret_cast<ObjectPtr*>(instance->ptr()) + offset_in_words,
           value, thread);
     }
 
@@ -2441,13 +2453,13 @@
     BYTECODE(StoreContextParent, 0);
     const uword offset_in_words =
         static_cast<uword>(Context::parent_offset() / kWordSize);
-    RawContext* instance = reinterpret_cast<RawContext*>(SP[-1]);
-    RawContext* value = reinterpret_cast<RawContext*>(SP[0]);
+    ContextPtr instance = static_cast<ContextPtr>(SP[-1]);
+    ContextPtr value = static_cast<ContextPtr>(SP[0]);
     SP -= 2;  // Drop instance and value.
 
-    instance->StorePointer(
-        reinterpret_cast<RawContext**>(instance->ptr()) + offset_in_words,
-        value, thread);
+    instance->ptr()->StorePointer(
+        reinterpret_cast<ContextPtr*>(instance->ptr()) + offset_in_words, value,
+        thread);
 
     DISPATCH();
   }
@@ -2456,12 +2468,12 @@
     BYTECODE(StoreContextVar, A_E);
     const uword offset_in_words =
         static_cast<uword>(Context::variable_offset(rE) / kWordSize);
-    RawContext* instance = reinterpret_cast<RawContext*>(SP[-1]);
-    RawObject* value = reinterpret_cast<RawContext*>(SP[0]);
+    ContextPtr instance = static_cast<ContextPtr>(SP[-1]);
+    ObjectPtr value = static_cast<ContextPtr>(SP[0]);
     SP -= 2;  // Drop instance and value.
     ASSERT(rE < static_cast<uint32_t>(instance->ptr()->num_variables_));
-    instance->StorePointer(
-        reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words, value,
+    instance->ptr()->StorePointer(
+        reinterpret_cast<ObjectPtr*>(instance->ptr()) + offset_in_words, value,
         thread);
 
     DISPATCH();
@@ -2473,7 +2485,7 @@
     // Currently only used to load closure fields, which are not unboxed.
     // If used for general field, code for copying the mutable box must be
     // added.
-    RawField* field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
+    FieldPtr field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
     const bool unboxing =
         (field->ptr()->is_nullable_ != kNullCid) &&
         Field::UnboxingCandidateBit::decode(field->ptr()->kind_bits_);
@@ -2481,8 +2493,8 @@
 #endif
     const uword offset_in_words =
         static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))));
-    RawInstance* instance = static_cast<RawInstance*>(SP[0]);
-    SP[0] = reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words];
+    InstancePtr instance = static_cast<InstancePtr>(SP[0]);
+    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
     DISPATCH();
   }
 
@@ -2490,8 +2502,8 @@
     BYTECODE(LoadTypeArgumentsField, D);
     const uword offset_in_words =
         static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))));
-    RawInstance* instance = static_cast<RawInstance*>(SP[0]);
-    SP[0] = reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words];
+    InstancePtr instance = static_cast<InstancePtr>(SP[0]);
+    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
     DISPATCH();
   }
 
@@ -2499,8 +2511,8 @@
     BYTECODE(LoadContextParent, 0);
     const uword offset_in_words =
         static_cast<uword>(Context::parent_offset() / kWordSize);
-    RawContext* instance = static_cast<RawContext*>(SP[0]);
-    SP[0] = reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words];
+    ContextPtr instance = static_cast<ContextPtr>(SP[0]);
+    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
     DISPATCH();
   }
 
@@ -2508,9 +2520,9 @@
     BYTECODE(LoadContextVar, A_E);
     const uword offset_in_words =
         static_cast<uword>(Context::variable_offset(rE) / kWordSize);
-    RawContext* instance = static_cast<RawContext*>(SP[0]);
+    ContextPtr instance = static_cast<ContextPtr>(SP[0]);
     ASSERT(rE < static_cast<uint32_t>(instance->ptr()->num_variables_));
-    SP[0] = reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words];
+    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
     DISPATCH();
   }
 
@@ -2536,17 +2548,17 @@
 
   {
     BYTECODE(Allocate, D);
-    RawClass* cls = Class::RawCast(LOAD_CONSTANT(rD));
+    ClassPtr cls = Class::RawCast(LOAD_CONSTANT(rD));
     if (LIKELY(InterpreterHelpers::IsFinalized(cls))) {
       const intptr_t class_id = cls->ptr()->id_;
       const intptr_t instance_size = cls->ptr()->host_instance_size_in_words_
                                      << kWordSizeLog2;
-      RawObject* result;
+      ObjectPtr result;
       if (TryAllocate(thread, class_id, instance_size, &result)) {
-        uword start = RawObject::ToAddr(result);
-        for (intptr_t offset = sizeof(RawInstance); offset < instance_size;
+        uword start = ObjectLayout::ToAddr(result);
+        for (intptr_t offset = sizeof(InstanceLayout); offset < instance_size;
              offset += kWordSize) {
-          *reinterpret_cast<RawObject**>(start + offset) = null_value;
+          *reinterpret_cast<ObjectPtr*>(start + offset) = null_value;
         }
         *++SP = result;
         DISPATCH();
@@ -2565,23 +2577,23 @@
 
   {
     BYTECODE(AllocateT, 0);
-    RawClass* cls = Class::RawCast(SP[0]);
-    RawTypeArguments* type_args = TypeArguments::RawCast(SP[-1]);
+    ClassPtr cls = Class::RawCast(SP[0]);
+    TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
     if (LIKELY(InterpreterHelpers::IsFinalized(cls))) {
       const intptr_t class_id = cls->ptr()->id_;
       const intptr_t instance_size = cls->ptr()->host_instance_size_in_words_
                                      << kWordSizeLog2;
-      RawObject* result;
+      ObjectPtr result;
       if (TryAllocate(thread, class_id, instance_size, &result)) {
-        uword start = RawObject::ToAddr(result);
-        for (intptr_t offset = sizeof(RawInstance); offset < instance_size;
+        uword start = ObjectLayout::ToAddr(result);
+        for (intptr_t offset = sizeof(InstanceLayout); offset < instance_size;
              offset += kWordSize) {
-          *reinterpret_cast<RawObject**>(start + offset) = null_value;
+          *reinterpret_cast<ObjectPtr*>(start + offset) = null_value;
         }
         const intptr_t type_args_offset =
             cls->ptr()->host_type_arguments_field_offset_in_words_
             << kWordSizeLog2;
-        *reinterpret_cast<RawObject**>(start + type_args_offset) = type_args;
+        *reinterpret_cast<ObjectPtr*>(start + type_args_offset) = type_args;
         *--SP = result;
         DISPATCH();
       }
@@ -2598,8 +2610,8 @@
 
   {
     BYTECODE(CreateArrayTOS, 0);
-    RawTypeArguments* type_args = TypeArguments::RawCast(SP[-1]);
-    RawObject* length = SP[0];
+    TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
+    ObjectPtr length = SP[0];
     SP--;
     if (!AllocateArray(thread, type_args, length, pc, FP, SP)) {
       HANDLE_EXCEPTION;
@@ -2610,14 +2622,14 @@
   {
     BYTECODE(AssertAssignable, A_E);
     // Stack: instance, type, instantiator type args, function type args, name
-    RawObject** args = SP - 4;
+    ObjectPtr* args = SP - 4;
     const bool may_be_smi = (rA == 1);
     const bool is_smi =
-        ((reinterpret_cast<intptr_t>(args[0]) & kSmiTagMask) == kSmiTag);
+        ((static_cast<intptr_t>(args[0]) & kSmiTagMask) == kSmiTag);
     const bool smi_ok = is_smi && may_be_smi;
     if (!smi_ok && (args[0] != null_value)) {
-      RawSubtypeTestCache* cache =
-          static_cast<RawSubtypeTestCache*>(LOAD_CONSTANT(rE));
+      SubtypeTestCachePtr cache =
+          static_cast<SubtypeTestCachePtr>(LOAD_CONSTANT(rE));
 
       if (!AssertAssignable(thread, pc, FP, SP, args, cache)) {
         HANDLE_EXCEPTION;
@@ -2630,7 +2642,7 @@
 
   {
     BYTECODE(AssertSubtype, 0);
-    RawObject** args = SP - 4;
+    ObjectPtr* args = SP - 4;
 
     // TODO(kustermann): Implement fast case for common arguments.
 
@@ -2643,7 +2655,7 @@
 
     // This is unused, since the negative case throws an exception.
     SP++;
-    RawObject** result_slot = SP;
+    ObjectPtr* result_slot = SP;
 
     Exit(thread, FP, SP + 1, pc);
     INVOKE_RUNTIME(DRT_SubtypeCheck,
@@ -2657,7 +2669,7 @@
 
   {
     BYTECODE(AssertBoolean, A);
-    RawObject* value = SP[0];
+    ObjectPtr value = SP[0];
     if (rA != 0u) {  // Should we perform type check?
       if ((value == true_value) || (value == false_value)) {
         goto AssertBooleanOk;
@@ -2764,12 +2776,12 @@
   {
     BYTECODE(StoreIndexedTOS, 0);
     SP -= 3;
-    RawArray* array = RAW_CAST(Array, SP[1]);
-    RawSmi* index = RAW_CAST(Smi, SP[2]);
-    RawObject* value = SP[3];
+    ArrayPtr array = RAW_CAST(Array, SP[1]);
+    SmiPtr index = RAW_CAST(Smi, SP[2]);
+    ObjectPtr value = SP[3];
     ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    array->StorePointer(array->ptr()->data() + Smi::Value(index), value,
-                        thread);
+    array->ptr()->StorePointer(array->ptr()->data() + Smi::Value(index), value,
+                               thread);
     DISPATCH();
   }
 
@@ -3139,20 +3151,20 @@
   {
     BYTECODE(VMInternal_ImplicitGetter, 0);
 
-    RawFunction* function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == RawFunction::kImplicitGetter);
+    FunctionPtr function = FrameFunction(FP);
+    ASSERT(Function::kind(function) == FunctionLayout::kImplicitGetter);
 
     BUMP_USAGE_COUNTER_ON_ENTRY(function);
 
     // Field object is cached in function's data_.
-    RawField* field = reinterpret_cast<RawField*>(function->ptr()->data_);
+    FieldPtr field = static_cast<FieldPtr>(function->ptr()->data_);
     intptr_t offset_in_words = field->ptr()->host_offset_or_field_id_;
 
     const intptr_t kArgc = 1;
-    RawInstance* instance =
-        reinterpret_cast<RawInstance*>(FrameArguments(FP, kArgc)[0]);
-    RawInstance* value =
-        reinterpret_cast<RawInstance**>(instance->ptr())[offset_in_words];
+    InstancePtr instance =
+        static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
+    InstancePtr value =
+        reinterpret_cast<InstancePtr*>(instance->ptr())[offset_in_words];
 
     if (UNLIKELY(value == Object::sentinel().raw())) {
       SP[1] = 0;  // Result slot.
@@ -3164,10 +3176,10 @@
           NativeArguments(thread, 2, /* argv */ SP + 2, /* ret val */ SP + 1));
 
       function = FrameFunction(FP);
-      instance = reinterpret_cast<RawInstance*>(SP[2]);
-      field = reinterpret_cast<RawField*>(SP[3]);
+      instance = static_cast<InstancePtr>(SP[2]);
+      field = static_cast<FieldPtr>(SP[3]);
       offset_in_words = field->ptr()->host_offset_or_field_id_;
-      value = reinterpret_cast<RawInstance**>(instance->ptr())[offset_in_words];
+      value = reinterpret_cast<InstancePtr*>(instance->ptr())[offset_in_words];
     }
 
     *++SP = value;
@@ -3179,9 +3191,9 @@
         HANDLE_EXCEPTION;
       }
       // Reload objects after the call which may trigger GC.
-      field = reinterpret_cast<RawField*>(FrameFunction(FP)->ptr()->data_);
-      instance = reinterpret_cast<RawInstance*>(FrameArguments(FP, kArgc)[0]);
-      value = reinterpret_cast<RawInstance**>(instance->ptr())[offset_in_words];
+      field = static_cast<FieldPtr>(FrameFunction(FP)->ptr()->data_);
+      instance = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
+      value = reinterpret_cast<InstancePtr*>(instance->ptr())[offset_in_words];
     }
 #endif
 
@@ -3220,28 +3232,27 @@
   {
     BYTECODE(VMInternal_ImplicitSetter, 0);
 
-    RawFunction* function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == RawFunction::kImplicitSetter);
+    FunctionPtr function = FrameFunction(FP);
+    ASSERT(Function::kind(function) == FunctionLayout::kImplicitSetter);
 
     BUMP_USAGE_COUNTER_ON_ENTRY(function);
 
     // Field object is cached in function's data_.
-    RawField* field = reinterpret_cast<RawField*>(function->ptr()->data_);
+    FieldPtr field = static_cast<FieldPtr>(function->ptr()->data_);
     intptr_t offset_in_words = field->ptr()->host_offset_or_field_id_;
     const intptr_t kArgc = 2;
-    RawInstance* instance =
-        reinterpret_cast<RawInstance*>(FrameArguments(FP, kArgc)[0]);
-    RawInstance* value =
-        reinterpret_cast<RawInstance*>(FrameArguments(FP, kArgc)[1]);
+    InstancePtr instance =
+        static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
+    InstancePtr value = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[1]);
 
     if (!AssertAssignableField<false>(thread, pc, FP, SP, instance, field,
                                       value)) {
       HANDLE_EXCEPTION;
     }
     // Reload objects after the call which may trigger GC.
-    field = reinterpret_cast<RawField*>(FrameFunction(FP)->ptr()->data_);
-    instance = reinterpret_cast<RawInstance*>(FrameArguments(FP, kArgc)[0]);
-    value = reinterpret_cast<RawInstance*>(FrameArguments(FP, kArgc)[1]);
+    field = static_cast<FieldPtr>(FrameFunction(FP)->ptr()->data_);
+    instance = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
+    value = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[1]);
 
     if (InterpreterHelpers::FieldNeedsGuardUpdate(field, value)) {
       SP[1] = 0;  // Unused result of runtime call.
@@ -3255,9 +3266,9 @@
       }
 
       // Reload objects after the call which may trigger GC.
-      field = reinterpret_cast<RawField*>(FrameFunction(FP)->ptr()->data_);
-      instance = reinterpret_cast<RawInstance*>(FrameArguments(FP, kArgc)[0]);
-      value = reinterpret_cast<RawInstance*>(FrameArguments(FP, kArgc)[1]);
+      field = static_cast<FieldPtr>(FrameFunction(FP)->ptr()->data_);
+      instance = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
+      value = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[1]);
     }
 
     const bool unboxing =
@@ -3266,29 +3277,29 @@
     classid_t guarded_cid = field->ptr()->guarded_cid_;
     if (unboxing && (guarded_cid == kDoubleCid) && supports_unboxed_doubles_) {
       double raw_value = Double::RawCast(value)->ptr()->value_;
-      RawDouble* box =
-          *(reinterpret_cast<RawDouble**>(instance->ptr()) + offset_in_words);
+      DoublePtr box =
+          *(reinterpret_cast<DoublePtr*>(instance->ptr()) + offset_in_words);
       ASSERT(box != null_value);  // Non-initializing store.
       box->ptr()->value_ = raw_value;
     } else if (unboxing && (guarded_cid == kFloat32x4Cid) &&
                supports_unboxed_simd128_) {
       simd128_value_t raw_value;
       raw_value.readFrom(Float32x4::RawCast(value)->ptr()->value_);
-      RawFloat32x4* box = *(reinterpret_cast<RawFloat32x4**>(instance->ptr()) +
-                            offset_in_words);
+      Float32x4Ptr box =
+          *(reinterpret_cast<Float32x4Ptr*>(instance->ptr()) + offset_in_words);
       ASSERT(box != null_value);  // Non-initializing store.
       raw_value.writeTo(box->ptr()->value_);
     } else if (unboxing && (guarded_cid == kFloat64x2Cid) &&
                supports_unboxed_simd128_) {
       simd128_value_t raw_value;
       raw_value.readFrom(Float64x2::RawCast(value)->ptr()->value_);
-      RawFloat64x2* box = *(reinterpret_cast<RawFloat64x2**>(instance->ptr()) +
-                            offset_in_words);
+      Float64x2Ptr box =
+          *(reinterpret_cast<Float64x2Ptr*>(instance->ptr()) + offset_in_words);
       ASSERT(box != null_value);  // Non-initializing store.
       raw_value.writeTo(box->ptr()->value_);
     } else {
-      instance->StorePointer(
-          reinterpret_cast<RawInstance**>(instance->ptr()) + offset_in_words,
+      instance->ptr()->StorePointer(
+          reinterpret_cast<InstancePtr*>(instance->ptr()) + offset_in_words,
           value, thread);
     }
 
@@ -3300,15 +3311,15 @@
   {
     BYTECODE(VMInternal_ImplicitStaticGetter, 0);
 
-    RawFunction* function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == RawFunction::kImplicitStaticGetter);
+    FunctionPtr function = FrameFunction(FP);
+    ASSERT(Function::kind(function) == FunctionLayout::kImplicitStaticGetter);
 
     BUMP_USAGE_COUNTER_ON_ENTRY(function);
 
     // Field object is cached in function's data_.
-    RawField* field = reinterpret_cast<RawField*>(function->ptr()->data_);
+    FieldPtr field = static_cast<FieldPtr>(function->ptr()->data_);
     intptr_t field_id = field->ptr()->host_offset_or_field_id_;
-    RawInstance* value = thread->field_table_values()[field_id];
+    InstancePtr value = thread->field_table_values()[field_id];
     if (value == Object::sentinel().raw() ||
         value == Object::transition_sentinel().raw()) {
       SP[1] = 0;  // Unused result of invoking the initializer.
@@ -3319,7 +3330,7 @@
 
       // Reload objects after the call which may trigger GC.
       function = FrameFunction(FP);
-      field = reinterpret_cast<RawField*>(function->ptr()->data_);
+      field = static_cast<FieldPtr>(function->ptr()->data_);
       // The field is initialized by the runtime call, but not returned.
       intptr_t field_id = field->ptr()->host_offset_or_field_id_;
       value = thread->field_table_values()[field_id];
@@ -3330,9 +3341,9 @@
 
 #if !defined(PRODUCT)
     if (UNLIKELY(Field::NeedsLoadGuardBit::decode(field->ptr()->kind_bits_))) {
-      if (!AssertAssignableField<true>(
-              thread, pc, FP, SP, reinterpret_cast<RawInstance*>(null_value),
-              field, value)) {
+      if (!AssertAssignableField<true>(thread, pc, FP, SP,
+                                       static_cast<InstancePtr>(null_value),
+                                       field, value)) {
         HANDLE_EXCEPTION;
       }
     }
@@ -3344,8 +3355,8 @@
   {
     BYTECODE(VMInternal_MethodExtractor, 0);
 
-    RawFunction* function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == RawFunction::kMethodExtractor);
+    FunctionPtr function = FrameFunction(FP);
+    ASSERT(Function::kind(function) == FunctionLayout::kMethodExtractor);
 
     BUMP_USAGE_COUNTER_ON_ENTRY(function);
 
@@ -3361,21 +3372,22 @@
       HANDLE_EXCEPTION;
     }
 
-    RawContext* context = Context::RawCast(*SP--);
-    RawInstance* instance = Instance::RawCast(FrameArguments(FP, 1)[0]);
-    context->StorePointer(
-        reinterpret_cast<RawInstance**>(&context->ptr()->data()[0]), instance);
+    ContextPtr context = Context::RawCast(*SP--);
+    InstancePtr instance = Instance::RawCast(FrameArguments(FP, 1)[0]);
+    context->ptr()->StorePointer(
+        reinterpret_cast<InstancePtr*>(&context->ptr()->data()[0]), instance);
 
-    RawClosure* closure = Closure::RawCast(*SP);
-    closure->StorePointer(
+    ClosurePtr closure = Closure::RawCast(*SP);
+    closure->ptr()->StorePointer(
         &closure->ptr()->instantiator_type_arguments_,
         InterpreterHelpers::GetTypeArguments(thread, instance));
     // function_type_arguments_ is already null
     closure->ptr()->delayed_type_arguments_ =
         Object::empty_type_arguments().raw();
-    closure->StorePointer(&closure->ptr()->function_,
-                          Function::RawCast(FrameFunction(FP)->ptr()->data_));
-    closure->StorePointer(&closure->ptr()->context_, context);
+    closure->ptr()->StorePointer(
+        &closure->ptr()->function_,
+        Function::RawCast(FrameFunction(FP)->ptr()->data_));
+    closure->ptr()->StorePointer(&closure->ptr()->context_, context);
     // hash_ is already null
 
     DISPATCH();
@@ -3384,8 +3396,8 @@
   {
     BYTECODE(VMInternal_InvokeClosure, 0);
 
-    RawFunction* function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == RawFunction::kInvokeFieldDispatcher);
+    FunctionPtr function = FrameFunction(FP);
+    ASSERT(Function::kind(function) == FunctionLayout::kInvokeFieldDispatcher);
 
     BUMP_USAGE_COUNTER_ON_ENTRY(function);
 
@@ -3395,7 +3407,7 @@
     const intptr_t argc =
         InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
 
-    RawClosure* receiver =
+    ClosurePtr receiver =
         Closure::RawCast(FrameArguments(FP, argc)[receiver_idx]);
     function = receiver->ptr()->function_;
 
@@ -3406,8 +3418,8 @@
   {
     BYTECODE(VMInternal_InvokeField, 0);
 
-    RawFunction* function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == RawFunction::kInvokeFieldDispatcher);
+    FunctionPtr function = FrameFunction(FP);
+    ASSERT(Function::kind(function) == FunctionLayout::kInvokeFieldDispatcher);
 
     BUMP_USAGE_COUNTER_ON_ENTRY(function);
 
@@ -3417,7 +3429,7 @@
     const intptr_t argc =
         InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
 
-    RawObject* receiver = FrameArguments(FP, argc)[receiver_idx];
+    ObjectPtr receiver = FrameArguments(FP, argc)[receiver_idx];
 
     // Invoke field getter on receiver.
     {
@@ -3482,8 +3494,8 @@
     }
 
     // Copy arguments into the newly allocated array.
-    RawObject** argv = FrameArguments(FP, argc);
-    RawArray* array = static_cast<RawArray*>(SP[4]);
+    ObjectPtr* argv = FrameArguments(FP, argc);
+    ArrayPtr array = static_cast<ArrayPtr>(SP[4]);
     ASSERT(array->GetClassId() == kArrayCid);
     for (intptr_t i = 0; i < argc; i++) {
       array->ptr()->data()[i] = argv[i];
@@ -3508,16 +3520,17 @@
 
   {
     BYTECODE(VMInternal_ForwardDynamicInvocation, 0);
-    RawFunction* function = FrameFunction(FP);
+    FunctionPtr function = FrameFunction(FP);
     ASSERT(Function::kind(function) ==
-           RawFunction::kDynamicInvocationForwarder);
+           FunctionLayout::kDynamicInvocationForwarder);
 
     BUMP_USAGE_COUNTER_ON_ENTRY(function);
 
-    RawArray* checks = Array::RawCast(function->ptr()->data_);
-    RawFunction* target = Function::RawCast(checks->ptr()->data()[0]);
-    ASSERT(Function::kind(target) != RawFunction::kDynamicInvocationForwarder);
-    RawBytecode* target_bytecode = target->ptr()->bytecode_;
+    ArrayPtr checks = Array::RawCast(function->ptr()->data_);
+    FunctionPtr target = Function::RawCast(checks->ptr()->data()[0]);
+    ASSERT(Function::kind(target) !=
+           FunctionLayout::kDynamicInvocationForwarder);
+    BytecodePtr target_bytecode = target->ptr()->bytecode_;
     ASSERT(target_bytecode != Bytecode::null());
     ASSERT(target_bytecode->IsBytecode());
 
@@ -3545,7 +3558,7 @@
     const intptr_t argc =
         InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
 
-    RawInstance* receiver =
+    InstancePtr receiver =
         Instance::RawCast(FrameArguments(FP, argc)[receiver_idx]);
     SP[5] = InterpreterHelpers::GetTypeArguments(thread, receiver);
 
@@ -3566,7 +3579,7 @@
     }
 
     for (intptr_t i = 2; i < len; i++) {
-      RawParameterTypeCheck* check =
+      ParameterTypeCheckPtr check =
           ParameterTypeCheck::RawCast(checks->ptr()->data()[i]);
 
       if (LIKELY(check->ptr()->index_ != 0)) {
@@ -3612,35 +3625,37 @@
 
   {
     BYTECODE(VMInternal_NoSuchMethodDispatcher, 0);
-    RawFunction* function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == RawFunction::kNoSuchMethodDispatcher);
+    FunctionPtr function = FrameFunction(FP);
+    ASSERT(Function::kind(function) == FunctionLayout::kNoSuchMethodDispatcher);
     goto NoSuchMethodFromPrologue;
   }
 
   {
     BYTECODE(VMInternal_ImplicitStaticClosure, 0);
-    RawFunction* function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == RawFunction::kImplicitClosureFunction);
+    FunctionPtr function = FrameFunction(FP);
+    ASSERT(Function::kind(function) ==
+           FunctionLayout::kImplicitClosureFunction);
     UNIMPLEMENTED();
     DISPATCH();
   }
 
   {
     BYTECODE(VMInternal_ImplicitInstanceClosure, 0);
-    RawFunction* function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == RawFunction::kImplicitClosureFunction);
+    FunctionPtr function = FrameFunction(FP);
+    ASSERT(Function::kind(function) ==
+           FunctionLayout::kImplicitClosureFunction);
     UNIMPLEMENTED();
     DISPATCH();
   }
 
   {
   TailCallSP1:
-    RawFunction* function = Function::RawCast(SP[1]);
+    FunctionPtr function = Function::RawCast(SP[1]);
 
     for (;;) {
       if (Function::HasBytecode(function)) {
         ASSERT(function->IsFunction());
-        RawBytecode* bytecode = function->ptr()->bytecode_;
+        BytecodePtr bytecode = function->ptr()->bytecode_;
         ASSERT(bytecode->IsBytecode());
         FP[kKBCFunctionSlotFromFp] = function;
         FP[kKBCPcMarkerSlotFromFp] = bytecode;
@@ -3656,13 +3671,13 @@
         const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
         const intptr_t argc =
             InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-        RawObject** argv = FrameArguments(FP, argc);
+        ObjectPtr* argv = FrameArguments(FP, argc);
         for (intptr_t i = 0; i < argc; i++) {
           *++SP = argv[i];
         }
 
-        RawObject** call_base = SP - argc + 1;
-        RawObject** call_top = SP + 1;
+        ObjectPtr* call_base = SP - argc + 1;
+        ObjectPtr* call_top = SP + 1;
         call_top[0] = function;
         if (!InvokeCompiled(thread, function, call_base, call_top, &pc, &FP,
                             &SP)) {
@@ -3693,14 +3708,14 @@
   // Helper used to handle noSuchMethod on closures.
   {
   NoSuchMethodFromPrologue:
-    RawFunction* function = FrameFunction(FP);
+    FunctionPtr function = FrameFunction(FP);
 
     const intptr_t type_args_len =
         InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
     const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
     const intptr_t argc =
         InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-    RawObject** args = FrameArguments(FP, argc);
+    ObjectPtr* args = FrameArguments(FP, argc);
 
     SP[1] = null_value;
     SP[2] = args[receiver_idx];
@@ -3719,7 +3734,7 @@
       }
 
       // Copy arguments into the newly allocated array.
-      RawArray* array = static_cast<RawArray*>(SP[5]);
+      ArrayPtr array = static_cast<ArrayPtr>(SP[5]);
       ASSERT(array->GetClassId() == kArrayCid);
       for (intptr_t i = 0; i < argc; i++) {
         array->ptr()->data()[i] = args[i];
@@ -3776,10 +3791,9 @@
     FP = fp_;
     pc = pc_;
     if (IsEntryFrameMarker(pc)) {
-      pp_ = reinterpret_cast<RawObjectPool*>(fp_[kKBCSavedPpSlotFromEntryFp]);
-      argdesc_ =
-          reinterpret_cast<RawArray*>(fp_[kKBCSavedArgDescSlotFromEntryFp]);
-      uword exit_fp = reinterpret_cast<uword>(fp_[kKBCExitLinkSlotFromEntryFp]);
+      pp_ = static_cast<ObjectPoolPtr>(fp_[kKBCSavedPpSlotFromEntryFp]);
+      argdesc_ = static_cast<ArrayPtr>(fp_[kKBCSavedArgDescSlotFromEntryFp]);
+      uword exit_fp = static_cast<uword>(fp_[kKBCExitLinkSlotFromEntryFp]);
       thread->set_top_exit_frame_info(exit_fp);
       thread->set_top_resource(top_resource);
       thread->set_vm_tag(vm_tag);
@@ -3819,13 +3833,13 @@
   // in the previous C++ frames.
   StackResource::Unwind(thread);
 
-  fp_ = reinterpret_cast<RawObject**>(fp);
+  fp_ = reinterpret_cast<ObjectPtr*>(fp);
 
   if (pc == StubCode::RunExceptionHandler().EntryPoint()) {
     // The RunExceptionHandler stub is a placeholder.  We implement
     // its behavior here.
-    RawObject* raw_exception = thread->active_exception();
-    RawObject* raw_stacktrace = thread->active_stacktrace();
+    ObjectPtr raw_exception = thread->active_exception();
+    ObjectPtr raw_stacktrace = thread->active_stacktrace();
     ASSERT(raw_exception != Object::null());
     thread->set_active_exception(Object::null_object());
     thread->set_active_stacktrace(Object::null_object());
@@ -3846,8 +3860,8 @@
 }
 
 void Interpreter::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&pp_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&argdesc_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&pp_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&argdesc_));
 }
 
 }  // namespace dart
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index 03d913a..bc76fc9 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -10,6 +10,7 @@
 
 #include "vm/compiler/method_recognizer.h"
 #include "vm/constants_kbc.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
@@ -18,17 +19,6 @@
 class InterpreterSetjmpBuffer;
 class Isolate;
 class ObjectPointerVisitor;
-class RawArray;
-class RawField;
-class RawFunction;
-class RawICData;
-class RawImmutableArray;
-class RawInstance;
-class RawObject;
-class RawObjectPool;
-class RawString;
-class RawSubtypeTestCache;
-class RawTypeArguments;
 class Thread;
 
 class LookupCache : public ValueObject {
@@ -41,20 +31,20 @@
 
   void Clear();
   bool Lookup(intptr_t receiver_cid,
-              RawString* function_name,
-              RawArray* arguments_descriptor,
-              RawFunction** target) const;
+              StringPtr function_name,
+              ArrayPtr arguments_descriptor,
+              FunctionPtr* target) const;
   void Insert(intptr_t receiver_cid,
-              RawString* function_name,
-              RawArray* arguments_descriptor,
-              RawFunction* target);
+              StringPtr function_name,
+              ArrayPtr arguments_descriptor,
+              FunctionPtr target);
 
  private:
   struct Entry {
     intptr_t receiver_cid;
-    RawString* function_name;
-    RawArray* arguments_descriptor;
-    RawFunction* target;
+    StringPtr function_name;
+    ArrayPtr arguments_descriptor;
+    FunctionPtr target;
   };
 
   static const intptr_t kNumEntries = 1024;
@@ -69,8 +59,8 @@
 // instruction returning the value in result. Otherwise interpreter proceeds to
 // execute the body of the function.
 typedef bool (*IntrinsicHandler)(Thread* thread,
-                                 RawObject** FP,
-                                 RawObject** result);
+                                 ObjectPtr* FP,
+                                 ObjectPtr* result);
 
 class Interpreter {
  public:
@@ -104,16 +94,16 @@
     return reinterpret_cast<word>(pc) == kEntryFramePcMarker;
   }
 
-  RawObject* Call(const Function& function,
-                  const Array& arguments_descriptor,
-                  const Array& arguments,
-                  Thread* thread);
+  ObjectPtr Call(const Function& function,
+                 const Array& arguments_descriptor,
+                 const Array& arguments,
+                 Thread* thread);
 
-  RawObject* Call(RawFunction* function,
-                  RawArray* argdesc,
-                  intptr_t argc,
-                  RawObject* const* argv,
-                  Thread* thread);
+  ObjectPtr Call(FunctionPtr function,
+                 ArrayPtr argdesc,
+                 intptr_t argc,
+                 ObjectPtr const* argv,
+                 Thread* thread);
 
   void JumpToFrame(uword pc, uword sp, uword fp, Thread* thread);
 
@@ -137,113 +127,113 @@
   uword overflow_stack_limit_;
   uword stack_limit_;
 
-  RawObject** volatile fp_;
+  ObjectPtr* volatile fp_;
   const KBCInstr* volatile pc_;
   DEBUG_ONLY(uint64_t icount_;)
 
   InterpreterSetjmpBuffer* last_setjmp_buffer_;
 
-  RawObjectPool* pp_;  // Pool Pointer.
-  RawArray* argdesc_;  // Arguments Descriptor: used to pass information between
-                       // call instruction and the function entry.
-  RawObject* special_[KernelBytecode::kSpecialIndexCount];
+  ObjectPoolPtr pp_;  // Pool Pointer.
+  ArrayPtr argdesc_;  // Arguments Descriptor: used to pass information between
+                      // call instruction and the function entry.
+  ObjectPtr special_[KernelBytecode::kSpecialIndexCount];
 
   LookupCache lookup_cache_;
 
   void Exit(Thread* thread,
-            RawObject** base,
-            RawObject** exit_frame,
+            ObjectPtr* base,
+            ObjectPtr* exit_frame,
             const KBCInstr* pc);
 
   bool Invoke(Thread* thread,
-              RawObject** call_base,
-              RawObject** call_top,
+              ObjectPtr* call_base,
+              ObjectPtr* call_top,
               const KBCInstr** pc,
-              RawObject*** FP,
-              RawObject*** SP);
+              ObjectPtr** FP,
+              ObjectPtr** SP);
 
   bool InvokeCompiled(Thread* thread,
-                      RawFunction* function,
-                      RawObject** call_base,
-                      RawObject** call_top,
+                      FunctionPtr function,
+                      ObjectPtr* call_base,
+                      ObjectPtr* call_top,
                       const KBCInstr** pc,
-                      RawObject*** FP,
-                      RawObject*** SP);
+                      ObjectPtr** FP,
+                      ObjectPtr** SP);
 
   bool InvokeBytecode(Thread* thread,
-                      RawFunction* function,
-                      RawObject** call_base,
-                      RawObject** call_top,
+                      FunctionPtr function,
+                      ObjectPtr* call_base,
+                      ObjectPtr* call_top,
                       const KBCInstr** pc,
-                      RawObject*** FP,
-                      RawObject*** SP);
+                      ObjectPtr** FP,
+                      ObjectPtr** SP);
 
   bool InstanceCall(Thread* thread,
-                    RawString* target_name,
-                    RawObject** call_base,
-                    RawObject** call_top,
+                    StringPtr target_name,
+                    ObjectPtr* call_base,
+                    ObjectPtr* call_top,
                     const KBCInstr** pc,
-                    RawObject*** FP,
-                    RawObject*** SP);
+                    ObjectPtr** FP,
+                    ObjectPtr** SP);
 
   bool CopyParameters(Thread* thread,
                       const KBCInstr** pc,
-                      RawObject*** FP,
-                      RawObject*** SP,
+                      ObjectPtr** FP,
+                      ObjectPtr** SP,
                       const intptr_t num_fixed_params,
                       const intptr_t num_opt_pos_params,
                       const intptr_t num_opt_named_params);
 
   bool AssertAssignable(Thread* thread,
                         const KBCInstr* pc,
-                        RawObject** FP,
-                        RawObject** call_top,
-                        RawObject** args,
-                        RawSubtypeTestCache* cache);
+                        ObjectPtr* FP,
+                        ObjectPtr* call_top,
+                        ObjectPtr* args,
+                        SubtypeTestCachePtr cache);
   template <bool is_getter>
   bool AssertAssignableField(Thread* thread,
                              const KBCInstr* pc,
-                             RawObject** FP,
-                             RawObject** SP,
-                             RawInstance* instance,
-                             RawField* field,
-                             RawInstance* value);
+                             ObjectPtr* FP,
+                             ObjectPtr* SP,
+                             InstancePtr instance,
+                             FieldPtr field,
+                             InstancePtr value);
 
   bool AllocateMint(Thread* thread,
                     int64_t value,
                     const KBCInstr* pc,
-                    RawObject** FP,
-                    RawObject** SP);
+                    ObjectPtr* FP,
+                    ObjectPtr* SP);
   bool AllocateDouble(Thread* thread,
                       double value,
                       const KBCInstr* pc,
-                      RawObject** FP,
-                      RawObject** SP);
+                      ObjectPtr* FP,
+                      ObjectPtr* SP);
   bool AllocateFloat32x4(Thread* thread,
                          simd128_value_t value,
                          const KBCInstr* pc,
-                         RawObject** FP,
-                         RawObject** SP);
+                         ObjectPtr* FP,
+                         ObjectPtr* SP);
   bool AllocateFloat64x2(Thread* thread,
                          simd128_value_t value,
                          const KBCInstr* pc,
-                         RawObject** FP,
-                         RawObject** SP);
+                         ObjectPtr* FP,
+                         ObjectPtr* SP);
   bool AllocateArray(Thread* thread,
-                     RawTypeArguments* type_args,
-                     RawObject* length,
+                     TypeArgumentsPtr type_args,
+                     ObjectPtr length,
                      const KBCInstr* pc,
-                     RawObject** FP,
-                     RawObject** SP);
+                     ObjectPtr* FP,
+                     ObjectPtr* SP);
   bool AllocateContext(Thread* thread,
                        intptr_t num_variables,
                        const KBCInstr* pc,
-                       RawObject** FP,
-                       RawObject** SP);
+                       ObjectPtr* FP,
+                       ObjectPtr* SP);
   bool AllocateClosure(Thread* thread,
                        const KBCInstr* pc,
-                       RawObject** FP,
-                       RawObject** SP);
+                       ObjectPtr* FP,
+                       ObjectPtr* SP);
 
 #if defined(DEBUG)
   // Returns true if tracing of executed instructions is enabled.
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 6af9e05..1a74498 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -117,7 +117,7 @@
   }
 }
 
-static RawInstance* DeserializeMessage(Thread* thread, Message* message) {
+static InstancePtr DeserializeMessage(Thread* thread, Message* message) {
   if (message == NULL) {
     return Instance::null();
   }
@@ -274,6 +274,9 @@
   // Ensure we destroy the heap before the other members.
   heap_ = nullptr;
   ASSERT(marking_stack_ == nullptr);
+
+  delete reverse_pc_lookup_cache_;
+  reverse_pc_lookup_cache_ = nullptr;
 }
 
 void IsolateGroup::RegisterIsolate(Isolate* isolate) {
@@ -645,6 +648,15 @@
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 }
 
+Bequest::~Bequest() {
+  IsolateGroup* isolate_group = IsolateGroup::Current();
+  CHECK_ISOLATE_GROUP(isolate_group);
+  NoSafepointScope no_safepoint_scope;
+  ApiState* state = isolate_group->api_state();
+  ASSERT(state != nullptr);
+  state->FreePersistentHandle(handle_);
+}
+
 void Isolate::RegisterClass(const Class& cls) {
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
   if (group()->IsReloading()) {
@@ -755,7 +767,7 @@
  private:
   // A result of false indicates that the isolate should terminate the
   // processing of further events.
-  RawError* HandleLibMessage(const Array& message);
+  ErrorPtr HandleLibMessage(const Array& message);
 
   MessageStatus ProcessUnhandledException(const Error& result);
   Isolate* isolate_;
@@ -773,7 +785,7 @@
 // Isolate library OOB messages are fixed sized arrays which have the
 // following format:
 // [ OOB dispatch, Isolate library dispatch, <message specific data> ]
-RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) {
+ErrorPtr IsolateMessageHandler::HandleLibMessage(const Array& message) {
   if (message.Length() < 2) return Error::null();
   Zone* zone = T->zone();
   const Object& type = Object::Handle(zone, message.At(1));
@@ -1039,6 +1051,11 @@
     msg_obj = message->raw_obj();
     // We should only be sending RawObjects that can be converted to CObjects.
     ASSERT(ApiObjectConverter::CanConvert(msg_obj.raw()));
+  } else if (message->IsBequest()) {
+    Bequest* bequest = message->bequest();
+    PersistentHandle* handle = bequest->handle();
+    const Object& obj = Object::Handle(zone, handle->raw());
+    msg_obj = obj.raw();
   } else {
     MessageSnapshotReader reader(message.get(), thread);
     msg_obj = reader.ReadObject();
@@ -1247,7 +1264,7 @@
       // exception.
       if (result.IsUnhandledException()) {
         const UnhandledException& error = UnhandledException::Cast(result);
-        RawInstance* exception = error.exception();
+        InstancePtr exception = error.exception();
         if ((exception == I->object_store()->out_of_memory()) ||
             (exception == I->object_store()->stack_overflow())) {
           // We didn't notify the debugger when the stack was full. Do it now.
@@ -1452,9 +1469,6 @@
   // RELEASE_ASSERT(reload_context_ == NULL);
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
-  delete reverse_pc_lookup_cache_;
-  reverse_pc_lookup_cache_ = nullptr;
-
   if (FLAG_enable_interpreter) {
     delete background_compiler_;
     background_compiler_ = nullptr;
@@ -1622,9 +1636,9 @@
   return mutator_thread_;
 }
 
-RawObject* Isolate::CallTagHandler(Dart_LibraryTag tag,
-                                   const Object& arg1,
-                                   const Object& arg2) {
+ObjectPtr Isolate::CallTagHandler(Dart_LibraryTag tag,
+                                  const Object& arg1,
+                                  const Object& arg2) {
   Thread* thread = Thread::Current();
   Api::Scope api_scope(thread);
   Dart_Handle api_arg1 = Api::NewHandle(thread, arg1.raw());
@@ -1686,7 +1700,7 @@
 #endif  // !defined(PRODUCT)
 }
 
-RawError* Isolate::PausePostRequest() {
+ErrorPtr Isolate::PausePostRequest() {
 #if !defined(PRODUCT)
   if (debugger_ == nullptr) {
     return Error::null();
@@ -2172,7 +2186,7 @@
   Dart::ShutdownIsolate(isolate);
 }
 
-void Isolate::SetStickyError(RawError* sticky_error) {
+void Isolate::SetStickyError(ErrorPtr sticky_error) {
   ASSERT(
       ((sticky_error_ == Error::null()) || (sticky_error == Error::null())) &&
       (sticky_error != sticky_error_));
@@ -2199,8 +2213,8 @@
 // collisions with this simple hash value. However, iterating over
 // all closure functions becomes more difficult, especially when
 // the list/map changes while iterating over it.
-RawFunction* Isolate::LookupClosureFunction(const Function& parent,
-                                            TokenPosition token_pos) const {
+FunctionPtr Isolate::LookupClosureFunction(const Function& parent,
+                                           TokenPosition token_pos) const {
   const GrowableObjectArray& closures =
       GrowableObjectArray::Handle(object_store()->closure_functions());
   ASSERT(!closures.IsNull());
@@ -2228,7 +2242,7 @@
   return -1;
 }
 
-RawFunction* Isolate::ClosureFunctionFromIndex(intptr_t idx) const {
+FunctionPtr Isolate::ClosureFunctionFromIndex(intptr_t idx) const {
   const GrowableObjectArray& closures_array =
       GrowableObjectArray::Handle(object_store()->closure_functions());
   if ((idx < 0) || (idx >= closures_array.Length())) {
@@ -2375,6 +2389,12 @@
   Isolate::UnMarkIsolateReady(this);
   LowLevelShutdown();
 
+  if (bequest_.get() != nullptr) {
+    auto beneficiary = bequest_->beneficiary();
+    PortMap::PostMessage(Message::New(beneficiary, bequest_.release(),
+                                      Message::kNormalPriority));
+  }
+
   // Now we can unregister from the thread, invoke cleanup callback, delete the
   // isolate (and possibly the isolate group).
   Isolate::LowLevelCleanup(this);
@@ -2472,30 +2492,29 @@
 
   visitor->clear_gc_root_type();
   // Visit the objects directly referenced from the isolate structure.
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&current_tag_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&default_tag_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&ic_miss_code_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&tag_table_));
-  visitor->VisitPointer(
-      reinterpret_cast<RawObject**>(&deoptimized_code_array_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&sticky_error_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&current_tag_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&default_tag_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&ic_miss_code_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&tag_table_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&deoptimized_code_array_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&sticky_error_));
   if (isolate_group_ != nullptr) {
     if (isolate_group_->source()->hot_reload_blobs_ != nullptr) {
-      visitor->VisitPointer(reinterpret_cast<RawObject**>(
+      visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(
           &(isolate_group_->source()->hot_reload_blobs_)));
     }
   }
 #if !defined(PRODUCT)
   visitor->VisitPointer(
-      reinterpret_cast<RawObject**>(&pending_service_extension_calls_));
+      reinterpret_cast<ObjectPtr*>(&pending_service_extension_calls_));
   visitor->VisitPointer(
-      reinterpret_cast<RawObject**>(&registered_service_extension_handlers_));
+      reinterpret_cast<ObjectPtr*>(&registered_service_extension_handlers_));
 #endif  // !defined(PRODUCT)
   // Visit the boxed_field_list_.
   // 'boxed_field_list_' access via mutator and background compilation threads
   // is guarded with a monitor. This means that we can visit it only
   // when at safepoint or the field_list_mutex_ lock has been taken.
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&boxed_field_list_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&boxed_field_list_));
 
   if (background_compiler() != nullptr) {
     background_compiler()->VisitPointers(visitor);
@@ -2637,7 +2656,7 @@
   if (object_store() != nullptr) {
     object_store()->VisitObjectPointers(visitor);
   }
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&saved_unlinked_calls_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&saved_unlinked_calls_));
   VisitStackPointers(visitor, validate_frames);
 }
 
@@ -2690,8 +2709,8 @@
                  /*at_safepoint=*/true);
 }
 
-RawClass* Isolate::GetClassForHeapWalkAt(intptr_t cid) {
-  RawClass* raw_class = nullptr;
+ClassPtr Isolate::GetClassForHeapWalkAt(intptr_t cid) {
+  ClassPtr raw_class = nullptr;
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
   if (group()->IsReloading()) {
     raw_class = reload_context()->GetClassForHeapWalkAt(cid);
@@ -2961,9 +2980,9 @@
   deoptimized_code.Add(code);
 }
 
-RawError* Isolate::StealStickyError() {
+ErrorPtr Isolate::StealStickyError() {
   NoSafepointScope no_safepoint;
-  RawError* return_value = sticky_error_;
+  ErrorPtr return_value = sticky_error_;
   sticky_error_ = Error::null();
   return return_value;
 }
@@ -2994,7 +3013,7 @@
   array.Add(Field::Handle(field.Original()), Heap::kOld);
 }
 
-RawField* Isolate::GetDeoptimizingBoxedField() {
+FieldPtr Isolate::GetDeoptimizingBoxedField() {
   ASSERT(Thread::Current()->IsMutatorThread());
   SafepointMutexLocker ml(&field_list_mutex_);
   if (boxed_field_list_ == GrowableObjectArray::null()) {
@@ -3009,7 +3028,7 @@
 }
 
 #ifndef PRODUCT
-RawError* Isolate::InvokePendingServiceExtensionCalls() {
+ErrorPtr Isolate::InvokePendingServiceExtensionCalls() {
   GrowableObjectArray& calls =
       GrowableObjectArray::Handle(GetAndClearPendingServiceExtensionCalls());
   if (calls.IsNull()) {
@@ -3082,8 +3101,8 @@
   return Error::null();
 }
 
-RawGrowableObjectArray* Isolate::GetAndClearPendingServiceExtensionCalls() {
-  RawGrowableObjectArray* r = pending_service_extension_calls_;
+GrowableObjectArrayPtr Isolate::GetAndClearPendingServiceExtensionCalls() {
+  GrowableObjectArrayPtr r = pending_service_extension_calls_;
   pending_service_extension_calls_ = GrowableObjectArray::null();
   return r;
 }
@@ -3177,7 +3196,7 @@
 // operation atomically in the face of random OOB messages. Do not port
 // to Dart code unless you can ensure that the operations will can be
 // done atomically.
-RawInstance* Isolate::LookupServiceExtensionHandler(const String& name) {
+InstancePtr Isolate::LookupServiceExtensionHandler(const String& name) {
   const GrowableObjectArray& handlers =
       GrowableObjectArray::Handle(registered_service_extension_handlers());
   if (handlers.IsNull()) {
@@ -3640,7 +3659,7 @@
   delete[] debug_name_;
 }
 
-RawObject* IsolateSpawnState::ResolveFunction() {
+ObjectPtr IsolateSpawnState::ResolveFunction() {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -3717,11 +3736,11 @@
   return func.raw();
 }
 
-RawInstance* IsolateSpawnState::BuildArgs(Thread* thread) {
+InstancePtr IsolateSpawnState::BuildArgs(Thread* thread) {
   return DeserializeMessage(thread, serialized_args_.get());
 }
 
-RawInstance* IsolateSpawnState::BuildMessage(Thread* thread) {
+InstancePtr IsolateSpawnState::BuildMessage(Thread* thread) {
   return DeserializeMessage(thread, serialized_message_.get());
 }
 
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index eaaf89c..7b784b9 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -71,19 +71,7 @@
 class ObjectIdRing;
 class ObjectPointerVisitor;
 class ObjectStore;
-class RawInstance;
-class RawArray;
-class RawContext;
-class RawDouble;
-class RawError;
-class RawField;
-class RawGrowableObjectArray;
-class RawMint;
-class RawObject;
-class RawInteger;
-class RawFloat32x4;
-class RawInt32x4;
-class RawUserTag;
+class PersistentHandle;
 class ReversePcLookupCache;
 class RwLock;
 class SafepointRwLock;
@@ -228,7 +216,7 @@
   std::unique_ptr<intptr_t[]> cid_permutation_map;
 
   // List of weak pointers to external typed data for hot reload blobs.
-  RawArray* hot_reload_blobs_;
+  ArrayPtr hot_reload_blobs_;
   intptr_t num_hot_reloads_;
 };
 
@@ -502,10 +490,22 @@
   void RememberLiveTemporaries();
   void DeferredMarkLiveTemporaries();
 
-  RawArray* saved_unlinked_calls() const { return saved_unlinked_calls_; }
+  ArrayPtr saved_unlinked_calls() const { return saved_unlinked_calls_; }
   void set_saved_unlinked_calls(const Array& saved_unlinked_calls);
 
+  // Returns the pc -> code lookup cache object for this isolate.
+  ReversePcLookupCache* reverse_pc_lookup_cache() const {
+    return reverse_pc_lookup_cache_;
+  }
+
+  // Sets the pc -> code lookup cache object for this isolate.
+  void set_reverse_pc_lookup_cache(ReversePcLookupCache* table) {
+    ASSERT(reverse_pc_lookup_cache_ == nullptr);
+    reverse_pc_lookup_cache_ = table;
+  }
+
  private:
+  friend class Dart;  // For `object_store_ = ` in Dart::Init
   friend class Heap;
   friend class StackFrame;  // For `[isolates_].First()`.
   // For `object_store_shared_ptr()`, `class_table_shared_ptr()`
@@ -584,12 +584,29 @@
   std::unique_ptr<StoreBuffer> store_buffer_;
   std::unique_ptr<Heap> heap_;
   std::unique_ptr<DispatchTable> dispatch_table_;
-  RawArray* saved_unlinked_calls_;
+  ReversePcLookupCache* reverse_pc_lookup_cache_ = nullptr;
+  ArrayPtr saved_unlinked_calls_;
 
   IdleTimeHandler idle_time_handler_;
   uint32_t isolate_group_flags_ = 0;
 };
 
+// When an isolate sends-and-exits this class represent things that it passed
+// to the beneficiary.
+class Bequest {
+ public:
+  Bequest(PersistentHandle* handle, Dart_Port beneficiary)
+      : handle_(handle), beneficiary_(beneficiary) {}
+  ~Bequest();
+
+  PersistentHandle* handle() { return handle_; }
+  Dart_Port beneficiary() { return beneficiary_; }
+
+ private:
+  PersistentHandle* handle_;
+  Dart_Port beneficiary_;
+};
+
 class Isolate : public BaseIsolate, public IntrusiveDListEntry<Isolate> {
  public:
   // Keep both these enums in sync with isolate_patch.dart.
@@ -646,8 +663,8 @@
 
   ClassTable* class_table() { return class_table_.get(); }
 
-  RawClass** cached_class_table_table() { return cached_class_table_table_; }
-  void set_cached_class_table_table(RawClass** cached_class_table_table) {
+  ClassPtr* cached_class_table_table() { return cached_class_table_table_; }
+  void set_cached_class_table_table(ClassPtr* cached_class_table_table) {
     cached_class_table_table_ = cached_class_table_table;
   }
   static intptr_t cached_class_table_table_offset() {
@@ -693,7 +710,7 @@
   }
 
   // Prefers old classes when we are in the middle of a reload.
-  RawClass* GetClassForHeapWalkAt(intptr_t cid);
+  ClassPtr GetClassForHeapWalkAt(intptr_t cid);
 
   static intptr_t ic_miss_code_offset() {
     return OFFSET_OF(Isolate, ic_miss_code_);
@@ -707,6 +724,10 @@
     message_notify_callback_ = value;
   }
 
+  void bequeath(std::unique_ptr<Bequest> bequest) {
+    bequest_ = std::move(bequest);
+  }
+
   IsolateGroupSource* source() const { return isolate_group_->source(); }
   IsolateGroup* group() const { return isolate_group_; }
 
@@ -756,9 +777,9 @@
   bool HasTagHandler() const {
     return group()->library_tag_handler() != nullptr;
   }
-  RawObject* CallTagHandler(Dart_LibraryTag tag,
-                            const Object& arg1,
-                            const Object& arg2);
+  ObjectPtr CallTagHandler(Dart_LibraryTag tag,
+                           const Object& arg1,
+                           const Object& arg2);
 
   void SetupImagePage(const uint8_t* snapshot_buffer, bool is_executable);
 
@@ -986,7 +1007,7 @@
   }
 #endif  // !defined(PRODUCT)
 
-  RawError* PausePostRequest();
+  ErrorPtr PausePostRequest();
 
   uword user_tag() const { return user_tag_; }
   static intptr_t user_tag_offset() { return OFFSET_OF(Isolate, user_tag_); }
@@ -1006,28 +1027,28 @@
 
   static intptr_t IsolateListLength();
 
-  RawGrowableObjectArray* tag_table() const { return tag_table_; }
+  GrowableObjectArrayPtr tag_table() const { return tag_table_; }
   void set_tag_table(const GrowableObjectArray& value);
 
-  RawUserTag* current_tag() const { return current_tag_; }
+  UserTagPtr current_tag() const { return current_tag_; }
   void set_current_tag(const UserTag& tag);
 
-  RawUserTag* default_tag() const { return default_tag_; }
+  UserTagPtr default_tag() const { return default_tag_; }
   void set_default_tag(const UserTag& tag);
 
   void set_ic_miss_code(const Code& code);
 
-  RawGrowableObjectArray* deoptimized_code_array() const {
+  GrowableObjectArrayPtr deoptimized_code_array() const {
     return deoptimized_code_array_;
   }
   void set_deoptimized_code_array(const GrowableObjectArray& value);
   void TrackDeoptimizedCode(const Code& code);
 
   // Also sends a paused at exit event over the service protocol.
-  void SetStickyError(RawError* sticky_error);
+  void SetStickyError(ErrorPtr sticky_error);
 
-  RawError* sticky_error() const { return sticky_error_; }
-  DART_WARN_UNUSED_RESULT RawError* StealStickyError();
+  ErrorPtr sticky_error() const { return sticky_error_; }
+  DART_WARN_UNUSED_RESULT ErrorPtr StealStickyError();
 
   // In precompilation we finalize all regular classes before compiling.
   bool all_classes_finalized() const {
@@ -1048,10 +1069,10 @@
   // deoptimization in the mutator thread.
   void AddDeoptimizingBoxedField(const Field& field);
   // Returns Field::null() if none available in the list.
-  RawField* GetDeoptimizingBoxedField();
+  FieldPtr GetDeoptimizingBoxedField();
 
 #ifndef PRODUCT
-  RawError* InvokePendingServiceExtensionCalls();
+  ErrorPtr InvokePendingServiceExtensionCalls();
   void AppendServiceExtensionCall(const Instance& closure,
                                   const String& method_name,
                                   const Array& parameter_keys,
@@ -1060,7 +1081,7 @@
                                   const Instance& id);
   void RegisterServiceExtensionHandler(const String& name,
                                        const Instance& closure);
-  RawInstance* LookupServiceExtensionHandler(const String& name);
+  InstancePtr LookupServiceExtensionHandler(const String& name);
 #endif
 
   static void VisitIsolates(IsolateVisitor* visitor);
@@ -1071,10 +1092,10 @@
 #endif
 
   void AddClosureFunction(const Function& function) const;
-  RawFunction* LookupClosureFunction(const Function& parent,
-                                     TokenPosition token_pos) const;
+  FunctionPtr LookupClosureFunction(const Function& parent,
+                                    TokenPosition token_pos) const;
   intptr_t FindClosureIndex(const Function& needle) const;
-  RawFunction* ClosureFunctionFromIndex(intptr_t idx) const;
+  FunctionPtr ClosureFunctionFromIndex(intptr_t idx) const;
 
   bool is_service_isolate() const {
     return IsServiceIsolateBit::decode(isolate_flags_);
@@ -1119,17 +1140,6 @@
     return group()->dispatch_table();
   }
 
-  // Returns the pc -> code lookup cache object for this isolate.
-  ReversePcLookupCache* reverse_pc_lookup_cache() const {
-    return reverse_pc_lookup_cache_;
-  }
-
-  // Sets the pc -> code lookup cache object for this isolate.
-  void set_reverse_pc_lookup_cache(ReversePcLookupCache* table) {
-    ASSERT(reverse_pc_lookup_cache_ == nullptr);
-    reverse_pc_lookup_cache_ = table;
-  }
-
   // Isolate-specific flag handling.
   static void FlagsInitialize(Dart_IsolateFlags* api_flags);
   void FlagsCopyTo(Dart_IsolateFlags* api_flags) const;
@@ -1267,12 +1277,12 @@
   void set_user_tag(uword tag) { user_tag_ = tag; }
 
 #if !defined(PRODUCT)
-  RawGrowableObjectArray* GetAndClearPendingServiceExtensionCalls();
-  RawGrowableObjectArray* pending_service_extension_calls() const {
+  GrowableObjectArrayPtr GetAndClearPendingServiceExtensionCalls();
+  GrowableObjectArrayPtr pending_service_extension_calls() const {
     return pending_service_extension_calls_;
   }
   void set_pending_service_extension_calls(const GrowableObjectArray& value);
-  RawGrowableObjectArray* registered_service_extension_handlers() const {
+  GrowableObjectArrayPtr registered_service_extension_handlers() const {
     return registered_service_extension_handlers_;
   }
   void set_registered_service_extension_handlers(
@@ -1298,14 +1308,14 @@
   // We use only word-sized fields to avoid differences in struct packing on the
   // different architectures. See also CheckOffsets in dart.cc.
   uword user_tag_ = 0;
-  RawUserTag* current_tag_;
-  RawUserTag* default_tag_;
-  RawCode* ic_miss_code_;
+  UserTagPtr current_tag_;
+  UserTagPtr default_tag_;
+  CodePtr ic_miss_code_;
   // Cached value of object_store_shared_ptr_, here for generated code access
   ObjectStore* cached_object_store_ = nullptr;
   SharedClassTable* shared_class_table_ = nullptr;
   // Cached value of class_table_->table_, here for generated code access
-  RawClass** cached_class_table_table_ = nullptr;
+  ClassPtr* cached_class_table_table_ = nullptr;
   FieldTable* field_table_ = nullptr;
   bool single_step_ = false;
   // End accessed from generated code.
@@ -1374,12 +1384,12 @@
   enum {kPendingHandlerIndex = 0, kPendingMethodNameIndex, kPendingKeysIndex,
         kPendingValuesIndex,      kPendingReplyPortIndex,  kPendingIdIndex,
         kPendingEntrySize};
-  RawGrowableObjectArray* pending_service_extension_calls_;
+  GrowableObjectArrayPtr pending_service_extension_calls_;
 
   // We use 2 list entries for each registered extension handler.
   enum {kRegisteredNameIndex = 0, kRegisteredHandlerIndex,
         kRegisteredEntrySize};
-  RawGrowableObjectArray* registered_service_extension_handlers_;
+  GrowableObjectArrayPtr registered_service_extension_handlers_;
 
   // Used to wake the isolate when it is in the pause event loop.
   Monitor* pause_loop_monitor_ = nullptr;
@@ -1428,16 +1438,19 @@
   MallocGrowableArray<PendingLazyDeopt>* pending_deopts_;
   DeoptContext* deopt_context_ = nullptr;
 
-  RawGrowableObjectArray* tag_table_;
+  GrowableObjectArrayPtr tag_table_;
 
-  RawGrowableObjectArray* deoptimized_code_array_;
+  GrowableObjectArrayPtr deoptimized_code_array_;
 
-  RawError* sticky_error_;
+  ErrorPtr sticky_error_;
+
+  std::unique_ptr<Bequest> bequest_;
+  Dart_Port beneficiary_ = 0;
 
   // Protect access to boxed_field_list_.
   Mutex field_list_mutex_;
   // List of fields that became boxed and that trigger deoptimization.
-  RawGrowableObjectArray* boxed_field_list_;
+  GrowableObjectArrayPtr boxed_field_list_;
 
   // This guards spawn_count_. An isolate cannot complete shutdown and be
   // destroyed while there are child isolates in the midst of a spawn.
@@ -1451,7 +1464,6 @@
   const char** obfuscation_map_ = nullptr;
 
   DispatchTable* dispatch_table_ = nullptr;
-  ReversePcLookupCache* reverse_pc_lookup_cache_ = nullptr;
 
   // Used during message sending of messages between isolates.
   std::unique_ptr<WeakTable> forward_table_new_;
@@ -1595,9 +1607,9 @@
   bool errors_are_fatal() const { return errors_are_fatal_; }
   Dart_IsolateFlags* isolate_flags() { return &isolate_flags_; }
 
-  RawObject* ResolveFunction();
-  RawInstance* BuildArgs(Thread* thread);
-  RawInstance* BuildMessage(Thread* thread);
+  ObjectPtr ResolveFunction();
+  InstancePtr BuildArgs(Thread* thread);
+  InstancePtr BuildMessage(Thread* thread);
 
   IsolateGroup* isolate_group() const { return isolate_group_; }
 
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 1c936d4..faaa2ac 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -72,7 +72,7 @@
   explicit ObjectLocator(IsolateGroupReloadContext* context)
       : context_(context), count_(0) {}
 
-  void VisitObject(RawObject* obj) {
+  void VisitObject(ObjectPtr obj) {
     InstanceMorpher* morpher =
         context_->instance_morpher_by_cid_.LookupValue(obj->GetClassId());
     if (morpher != NULL) {
@@ -186,13 +186,13 @@
       before_(zone, 16),
       after_(zone, 16) {}
 
-void InstanceMorpher::AddObject(RawObject* object) {
+void InstanceMorpher::AddObject(ObjectPtr object) {
   ASSERT(object->GetClassId() == cid_);
   const Instance& instance = Instance::Cast(Object::Handle(Z, object));
   before_.Add(&instance);
 }
 
-RawInstance* InstanceMorpher::Morph(const Instance& instance) const {
+InstancePtr InstanceMorpher::Morph(const Instance& instance) const {
   // Code can reference constants / canonical objects either directly in the
   // instruction stream (ia32) or via an object pool.
   //
@@ -281,13 +281,13 @@
   context->ReportError(error);
 }
 
-RawError* ReasonForCancelling::ToError() {
+ErrorPtr ReasonForCancelling::ToError() {
   // By default create the error returned from ToString.
   const String& message = String::Handle(ToString());
   return LanguageError::New(message);
 }
 
-RawString* ReasonForCancelling::ToString() {
+StringPtr ReasonForCancelling::ToString() {
   UNREACHABLE();
   return NULL;
 }
@@ -314,7 +314,7 @@
   jsobj.AddProperty("message", message.ToCString());
 }
 
-RawError* IsolateGroupReloadContext::error() const {
+ErrorPtr IsolateGroupReloadContext::error() const {
   ASSERT(!reasons_to_cancel_reload_.is_empty());
   // Report the first error to the surroundings.
   return reasons_to_cancel_reload_.At(0)->ToError();
@@ -350,7 +350,7 @@
 
   static uword Hash(const Object& obj) {
     uword class_name_hash = String::HashRawSymbol(Class::Cast(obj).Name());
-    RawLibrary* raw_library = Class::Cast(obj).library();
+    LibraryPtr raw_library = Class::Cast(obj).library();
     if (raw_library == Library::null()) {
       return class_name_hash;
     }
@@ -516,8 +516,8 @@
  private:
   const Error& error_;
 
-  RawError* ToError() { return error_.raw(); }
-  RawString* ToString() {
+  ErrorPtr ToError() { return error_.raw(); }
+  StringPtr ToString() {
     return String::NewFormatted("%s", error_.ToErrorCString());
   }
 };
@@ -1040,7 +1040,7 @@
   }
 }
 
-RawObject* IsolateReloadContext::ReloadPhase2LoadKernel(
+ObjectPtr IsolateReloadContext::ReloadPhase2LoadKernel(
     kernel::Program* program,
     const String& root_lib_url) {
   Thread* thread = Thread::Current();
@@ -1235,7 +1235,7 @@
 
   // Copy the class table for isolate.
   ClassTable* class_table = I->class_table();
-  RawClass** saved_class_table = nullptr;
+  ClassPtr* saved_class_table = nullptr;
   class_table->CopyBeforeHotReload(&saved_class_table, &saved_num_cids_);
 
   // Copy classes into saved_class_table_ first. Make sure there are no
@@ -1768,8 +1768,8 @@
   }
 }
 
-RawClass* IsolateReloadContext::GetClassForHeapWalkAt(intptr_t cid) {
-  RawClass** class_table = saved_class_table_.load(std::memory_order_acquire);
+ClassPtr IsolateReloadContext::GetClassForHeapWalkAt(intptr_t cid) {
+  ClassPtr* class_table = saved_class_table_.load(std::memory_order_acquire);
   if (class_table != NULL) {
     ASSERT(cid > 0);
     ASSERT(cid < saved_num_cids_);
@@ -1791,7 +1791,7 @@
 }
 
 void IsolateReloadContext::DiscardSavedClassTable(bool is_rollback) {
-  RawClass** local_saved_class_table =
+  ClassPtr* local_saved_class_table =
       saved_class_table_.load(std::memory_order_relaxed);
   I->class_table()->ResetAfterHotReload(local_saved_class_table,
                                         saved_num_cids_, is_rollback);
@@ -1813,10 +1813,10 @@
 void IsolateReloadContext::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(from(), to());
 
-  RawClass** saved_class_table =
+  ClassPtr* saved_class_table =
       saved_class_table_.load(std::memory_order_relaxed);
   if (saved_class_table != NULL) {
-    auto class_table = reinterpret_cast<RawObject**>(&(saved_class_table[0]));
+    auto class_table = reinterpret_cast<ObjectPtr*>(&(saved_class_table[0]));
     visitor->VisitPointers(class_table, saved_num_cids_);
   }
 }
@@ -1883,22 +1883,22 @@
         instances_(instances) {}
   virtual ~InvalidationCollector() {}
 
-  void VisitObject(RawObject* obj) {
+  void VisitObject(ObjectPtr obj) {
     intptr_t cid = obj->GetClassId();
     if (cid == kFunctionCid) {
       const Function& func =
-          Function::Handle(zone_, static_cast<RawFunction*>(obj));
+          Function::Handle(zone_, static_cast<FunctionPtr>(obj));
       if (!func.ForceOptimize()) {
         // Force-optimized functions cannot deoptimize.
         functions_->Add(&func);
       }
     } else if (cid == kKernelProgramInfoCid) {
       kernel_infos_->Add(&KernelProgramInfo::Handle(
-          zone_, static_cast<RawKernelProgramInfo*>(obj)));
+          zone_, static_cast<KernelProgramInfoPtr>(obj)));
     } else if (cid == kFieldCid) {
-      fields_->Add(&Field::Handle(zone_, static_cast<RawField*>(obj)));
+      fields_->Add(&Field::Handle(zone_, static_cast<FieldPtr>(obj)));
     } else if (cid > kNumPredefinedCids) {
-      instances_->Add(&Instance::Handle(zone_, static_cast<RawInstance*>(obj)));
+      instances_->Add(&Instance::Handle(zone_, static_cast<InstancePtr>(obj)));
     }
   }
 
@@ -2254,8 +2254,7 @@
   RunInvalidationVisitors();
 }
 
-RawClass* IsolateReloadContext::OldClassOrNull(
-    const Class& replacement_or_new) {
+ClassPtr IsolateReloadContext::OldClassOrNull(const Class& replacement_or_new) {
   UnorderedHashSet<ClassMapTraits> old_classes_set(old_classes_set_storage_);
   Class& cls = Class::Handle();
   cls ^= old_classes_set.GetOrNull(replacement_or_new);
@@ -2263,7 +2262,7 @@
   return cls.raw();
 }
 
-RawString* IsolateReloadContext::FindLibraryPrivateKey(
+StringPtr IsolateReloadContext::FindLibraryPrivateKey(
     const Library& replacement_or_new) {
   const Library& old = Library::Handle(OldLibraryOrNull(replacement_or_new));
   if (old.IsNull()) {
@@ -2277,7 +2276,7 @@
   return old.private_key();
 }
 
-RawLibrary* IsolateReloadContext::OldLibraryOrNull(
+LibraryPtr IsolateReloadContext::OldLibraryOrNull(
     const Library& replacement_or_new) {
   UnorderedHashSet<LibraryMapTraits> old_libraries_set(
       old_libraries_set_storage_);
@@ -2295,7 +2294,7 @@
 
 // Attempt to find the pair to |replacement_or_new| with the knowledge that
 // the base url prefix has moved.
-RawLibrary* IsolateReloadContext::OldLibraryOrNullBaseMoved(
+LibraryPtr IsolateReloadContext::OldLibraryOrNullBaseMoved(
     const Library& replacement_or_new) {
   const String& url_prefix =
       String::Handle(group_reload_context_->root_url_prefix_);
diff --git a/runtime/vm/isolate_reload.h b/runtime/vm/isolate_reload.h
index 5bcf2a3..492b5bf 100644
--- a/runtime/vm/isolate_reload.h
+++ b/runtime/vm/isolate_reload.h
@@ -48,11 +48,6 @@
 class ObjectLocator;
 class ObjectPointerVisitor;
 class ObjectStore;
-class RawError;
-class RawGrowableObjectArray;
-class RawLibrary;
-class RawObject;
-class RawString;
 class Script;
 class UpdateClassesVisitor;
 
@@ -74,10 +69,10 @@
   virtual ~InstanceMorpher() {}
 
   // Called on each instance that needs to be morphed.
-  RawInstance* Morph(const Instance& instance) const;
+  InstancePtr Morph(const Instance& instance) const;
 
   // Adds an object to be morphed.
-  void AddObject(RawObject* object);
+  void AddObject(ObjectPtr object);
 
   // Create the morphed objects based on the before() list.
   void CreateMorphedCopies();
@@ -118,11 +113,11 @@
 
   // Conversion to a VM error object.
   // Default implementation calls ToString.
-  virtual RawError* ToError();
+  virtual ErrorPtr ToError();
 
   // Conversion to a string object.
   // Default implementation calls ToError.
-  virtual RawString* ToString();
+  virtual StringPtr ToString();
 
   // Append the reason to JSON array.
   virtual void AppendTo(JSONArray* array);
@@ -165,7 +160,7 @@
   IsolateGroup* isolate_group() const { return isolate_group_; }
   bool reload_aborted() const { return HasReasonsForCancelling(); }
   bool reload_skipped() const { return reload_skipped_; }
-  RawError* error() const;
+  ErrorPtr error() const;
   int64_t start_time_micros() const { return start_time_micros_; }
   int64_t reload_timestamp() const { return reload_timestamp_; }
 
@@ -278,13 +273,11 @@
   BitVector* modified_libs_ = nullptr;
 
   String& root_lib_url_;
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&root_url_prefix_);
-  }
-  RawString* root_url_prefix_;
-  RawString* old_root_url_prefix_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&old_root_url_prefix_);
+  ObjectPtr* from() { return reinterpret_cast<ObjectPtr*>(&root_url_prefix_); }
+  StringPtr root_url_prefix_;
+  StringPtr old_root_url_prefix_;
+  ObjectPtr* to() {
+    return reinterpret_cast<ObjectPtr*>(&old_root_url_prefix_);
   }
 
   friend class Isolate;
@@ -295,7 +288,7 @@
   friend class ReasonForCancelling;
   friend class IsolateReloadContext;
   friend class IsolateGroup;  // GetClassSizeForHeapWalkAt
-  friend class RawObject;     // GetClassSizeForHeapWalkAt
+  friend class ObjectLayout;  // GetClassSizeForHeapWalkAt
 
   static Dart_FileModifiedCallback file_modified_callback_;
 };
@@ -321,14 +314,14 @@
   bool IsDirty(const Library& lib);
 
   // Prefers old classes when we are in the middle of a reload.
-  RawClass* GetClassForHeapWalkAt(intptr_t cid);
+  ClassPtr GetClassForHeapWalkAt(intptr_t cid);
   void DiscardSavedClassTable(bool is_rollback);
 
   void RegisterClass(const Class& new_cls);
 
   // Finds the library private key for |replacement_or_new| or return null
   // if |replacement_or_new| is new.
-  RawString* FindLibraryPrivateKey(const Library& replacement_or_new);
+  StringPtr FindLibraryPrivateKey(const Library& replacement_or_new);
 
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
@@ -340,8 +333,8 @@
 
   void ReloadPhase1AllocateStorageMapsAndCheckpoint();
   void CheckpointClasses();
-  RawObject* ReloadPhase2LoadKernel(kernel::Program* program,
-                                    const String& root_lib_url);
+  ObjectPtr ReloadPhase2LoadKernel(kernel::Program* program,
+                                   const String& root_lib_url);
   void ReloadPhase3FinalizeLoading();
   void ReloadPhase4CommitPrepare();
   void ReloadPhase4CommitFinish();
@@ -382,12 +375,12 @@
   std::shared_ptr<IsolateGroupReloadContext> group_reload_context_;
   Isolate* isolate_;
   intptr_t saved_num_cids_ = -1;
-  std::atomic<RawClass**> saved_class_table_;
+  std::atomic<ClassPtr*> saved_class_table_;
   MallocGrowableArray<LibraryInfo> library_infos_;
 
-  RawClass* OldClassOrNull(const Class& replacement_or_new);
-  RawLibrary* OldLibraryOrNull(const Library& replacement_or_new);
-  RawLibrary* OldLibraryOrNullBaseMoved(const Library& replacement_or_new);
+  ClassPtr OldClassOrNull(const Class& replacement_or_new);
+  LibraryPtr OldLibraryOrNull(const Library& replacement_or_new);
+  LibraryPtr OldLibraryOrNullBaseMoved(const Library& replacement_or_new);
 
   void BuildLibraryMapping();
   void BuildRemovedClassesSet();
@@ -401,19 +394,19 @@
   void AddEnumBecomeMapping(const Object& old, const Object& neu);
   void RebuildDirectSubclasses();
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&old_classes_set_storage_);
+  ObjectPtr* from() {
+    return reinterpret_cast<ObjectPtr*>(&old_classes_set_storage_);
   }
-  RawArray* old_classes_set_storage_;
-  RawArray* class_map_storage_;
-  RawArray* removed_class_set_storage_;
-  RawArray* old_libraries_set_storage_;
-  RawArray* library_map_storage_;
-  RawArray* become_map_storage_;
-  RawGrowableObjectArray* become_enum_mappings_;
-  RawLibrary* saved_root_library_;
-  RawGrowableObjectArray* saved_libraries_;
-  RawObject** to() { return reinterpret_cast<RawObject**>(&saved_libraries_); }
+  ArrayPtr old_classes_set_storage_;
+  ArrayPtr class_map_storage_;
+  ArrayPtr removed_class_set_storage_;
+  ArrayPtr old_libraries_set_storage_;
+  ArrayPtr library_map_storage_;
+  ArrayPtr become_map_storage_;
+  GrowableObjectArrayPtr become_enum_mappings_;
+  LibraryPtr saved_root_library_;
+  GrowableObjectArrayPtr saved_libraries_;
+  ObjectPtr* to() { return reinterpret_cast<ObjectPtr*>(&saved_libraries_); }
 
   friend class Isolate;
   friend class Class;  // AddStaticFieldMapping, AddEnumBecomeMapping.
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index ed39f1a..5f16ca6 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -4002,7 +4002,7 @@
   }
   virtual ~FindNoInstancesOfClass() {}
 
-  virtual bool FindObject(RawObject* obj) const {
+  virtual bool FindObject(ObjectPtr obj) const {
     return obj->GetClassId() == cid_;
   }
 
@@ -4516,7 +4516,7 @@
   lib = TestCase::ReloadTestScript(kReloadScript);
   EXPECT_VALID(lib);
   EXPECT_ERROR(SimpleInvokeError(lib, "main"),
-               "Unimplemented handling of static target arity change");
+               "Static call with invalid arguments");
 }
 
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index 07035fe..bae68b3 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -453,17 +453,17 @@
   return parameter_keys_->Length();
 }
 
-RawObject* JSONStream::GetObjectParameterKey(intptr_t i) const {
+ObjectPtr JSONStream::GetObjectParameterKey(intptr_t i) const {
   ASSERT((i >= 0) && (i < NumObjectParameters()));
   return parameter_keys_->At(i);
 }
 
-RawObject* JSONStream::GetObjectParameterValue(intptr_t i) const {
+ObjectPtr JSONStream::GetObjectParameterValue(intptr_t i) const {
   ASSERT((i >= 0) && (i < NumObjectParameters()));
   return parameter_values_->At(i);
 }
 
-RawObject* JSONStream::LookupObjectParam(const char* c_key) const {
+ObjectPtr JSONStream::LookupObjectParam(const char* c_key) const {
   const String& key = String::Handle(String::New(c_key));
   Object& test = Object::Handle();
   const intptr_t num_object_parameters = NumObjectParameters();
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index f0ee450..89907d4d 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -108,9 +108,9 @@
   Dart_Port reply_port() const { return reply_port_; }
 
   intptr_t NumObjectParameters() const;
-  RawObject* GetObjectParameterKey(intptr_t i) const;
-  RawObject* GetObjectParameterValue(intptr_t i) const;
-  RawObject* LookupObjectParam(const char* key) const;
+  ObjectPtr GetObjectParameterKey(intptr_t i) const;
+  ObjectPtr GetObjectParameterValue(intptr_t i) const;
+  ObjectPtr LookupObjectParam(const char* key) const;
 
   intptr_t num_params() const { return num_params_; }
   const char* GetParamKey(intptr_t i) const { return param_keys_[i]; }
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 5e69eac..1b98d07 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -205,7 +205,7 @@
  * possibly contain duplicate and unsorted data at the end.
  * Otherwise (when sublist doesn't exist in list) return new empty array.
  */
-static RawArray* AsSortedDuplicateFreeArray(GrowableArray<intptr_t>* source) {
+static ArrayPtr AsSortedDuplicateFreeArray(GrowableArray<intptr_t>* source) {
   intptr_t size = source->length();
   if (size == 0) {
     return Object::empty_array().raw();
@@ -300,7 +300,7 @@
       object = pool.ObjectAt(i);
       if (object.IsFunction()) {
         closure ^= object.raw();
-        if (closure.kind() == RawFunction::kClosureFunction &&
+        if (closure.kind() == FunctionLayout::kClosureFunction &&
             closure.IsLocalFunction()) {
           CollectTokenPosition(closure.token_pos(), token_positions);
           CollectTokenPosition(closure.end_token_pos(), token_positions);
@@ -492,8 +492,8 @@
                            data_program_offset),
         constant_reader_(this, active_class) {}
 
-  RawObject* EvaluateMetadata(intptr_t kernel_offset,
-                              bool is_annotations_offset) {
+  ObjectPtr EvaluateMetadata(intptr_t kernel_offset,
+                             bool is_annotations_offset) {
     SetOffset(kernel_offset);
 
     // Library and LibraryDependency objects do not have a tag in kernel binary.
@@ -528,8 +528,8 @@
   DISALLOW_COPY_AND_ASSIGN(MetadataEvaluator);
 };
 
-RawObject* EvaluateMetadata(const Field& metadata_field,
-                            bool is_annotations_offset) {
+ObjectPtr EvaluateMetadata(const Field& metadata_field,
+                           bool is_annotations_offset) {
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     Thread* thread = Thread::Current();
@@ -570,7 +570,7 @@
                            data_program_offset),
         constant_reader_(this, active_class) {}
 
-  RawObject* BuildParameterDescriptor(const Function& function);
+  ObjectPtr BuildParameterDescriptor(const Function& function);
 
  private:
   ConstantReader constant_reader_;
@@ -578,7 +578,7 @@
   DISALLOW_COPY_AND_ASSIGN(ParameterDescriptorBuilder);
 };
 
-RawObject* ParameterDescriptorBuilder::BuildParameterDescriptor(
+ObjectPtr ParameterDescriptorBuilder::BuildParameterDescriptor(
     const Function& function) {
   SetOffset(function.kernel_offset());
   ReadUntilFunctionNode();
@@ -638,7 +638,7 @@
   return param_descriptor.raw();
 }
 
-RawObject* BuildParameterDescriptor(const Function& function) {
+ObjectPtr BuildParameterDescriptor(const Function& function) {
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     Thread* thread = Thread::Current();
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index ca2f6e2..a0edfe7 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -203,9 +203,9 @@
 
 void CollectTokenPositionsFor(const Script& script);
 
-RawObject* EvaluateMetadata(const Field& metadata_field,
-                            bool is_annotations_offset);
-RawObject* BuildParameterDescriptor(const Function& function);
+ObjectPtr EvaluateMetadata(const Field& metadata_field,
+                           bool is_annotations_offset);
+ObjectPtr BuildParameterDescriptor(const Function& function);
 
 // Fills in [is_covariant] and [is_generic_covariant_impl] vectors
 // according to covariance attributes of [function] parameters.
@@ -225,7 +225,7 @@
 // Returns a list of ParameterTypeChecks needed by a dynamic invocation
 // forwarder that targets [function]. Indices in these checks correspond to
 // bytecode frame indices.
-RawArray* CollectDynamicInvocationChecks(const Function& function);
+ArrayPtr CollectDynamicInvocationChecks(const Function& function);
 
 ProcedureAttributesMetadata ProcedureAttributesOf(const Function& function,
                                                   Zone* zone);
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index 3d5a2c3..de75ae3 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -31,7 +31,7 @@
   return "Unknown";
 }
 
-RawTypedData* Reader::ReadLineStartsData(intptr_t line_start_count) {
+TypedDataPtr Reader::ReadLineStartsData(intptr_t line_start_count) {
   TypedData& line_starts_data = TypedData::Handle(
       TypedData::New(kTypedDataInt8ArrayCid, line_start_count, Heap::kOld));
 
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 4ceb1c7..af2d8ba 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -415,7 +415,7 @@
   const uint8_t* raw_buffer() const { return raw_buffer_; }
   void set_raw_buffer(const uint8_t* raw_buffer) { raw_buffer_ = raw_buffer; }
 
-  RawExternalTypedData* ExternalDataFromTo(intptr_t start, intptr_t end) {
+  ExternalTypedDataPtr ExternalDataFromTo(intptr_t start, intptr_t end) {
     return ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
                                   const_cast<uint8_t*>(buffer() + start),
                                   end - start, Heap::kOld);
@@ -426,7 +426,7 @@
     return &buffer()[offset];
   }
 
-  RawTypedData* ReadLineStartsData(intptr_t line_start_count);
+  TypedDataPtr ReadLineStartsData(intptr_t line_start_count);
 
  private:
   const uint8_t* buffer() const {
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index b4fea2c..7bfd7d7 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -115,7 +115,7 @@
   DISALLOW_COPY_AND_ASSIGN(SimpleExpressionConverter);
 };
 
-RawArray* KernelLoader::MakeFieldsArray() {
+ArrayPtr KernelLoader::MakeFieldsArray() {
   const intptr_t len = fields_.length();
   const Array& res = Array::Handle(zone_, Array::New(len, Heap::kOld));
   for (intptr_t i = 0; i < len; i++) {
@@ -124,7 +124,7 @@
   return res.raw();
 }
 
-RawArray* KernelLoader::MakeFunctionsArray() {
+ArrayPtr KernelLoader::MakeFunctionsArray() {
   const intptr_t len = functions_.length();
   const Array& res = Array::Handle(zone_, Array::New(len, Heap::kOld));
   for (intptr_t i = 0; i < len; i++) {
@@ -133,12 +133,12 @@
   return res.raw();
 }
 
-RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary(
+LibraryPtr BuildingTranslationHelper::LookupLibraryByKernelLibrary(
     NameIndex library) {
   return loader_->LookupLibrary(library);
 }
 
-RawClass* BuildingTranslationHelper::LookupClassByKernelClass(NameIndex klass) {
+ClassPtr BuildingTranslationHelper::LookupClassByKernelClass(NameIndex klass) {
 #if defined(DEBUG)
   LibraryLookupHandleScope library_lookup_handle_scope(library_lookup_handle_);
 #endif  // defined(DEBUG)
@@ -337,9 +337,9 @@
   subprogram_file_starts->Reverse();
 }
 
-RawString* KernelLoader::FindSourceForScript(const uint8_t* kernel_buffer,
-                                             intptr_t kernel_buffer_length,
-                                             const String& uri) {
+StringPtr KernelLoader::FindSourceForScript(const uint8_t* kernel_buffer,
+                                            intptr_t kernel_buffer_length,
+                                            const String& uri) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   TranslationHelper translation_helper(thread);
@@ -566,7 +566,7 @@
   kernel_program_info_.set_potential_natives(potential_natives_);
 }
 
-RawString* KernelLoader::DetectExternalNameCtor() {
+StringPtr KernelLoader::DetectExternalNameCtor() {
   helper_.ReadTag();
   helper_.ReadPosition();
   NameIndex annotation_class = H.EnclosingName(
@@ -721,7 +721,7 @@
 #endif
 }
 
-RawObject* KernelLoader::LoadProgram(bool process_pending_classes) {
+ObjectPtr KernelLoader::LoadProgram(bool process_pending_classes) {
   ASSERT(kernel_program_info_.constants() == Array::null());
 
   if (!program_->is_single_program()) {
@@ -793,7 +793,7 @@
   }
 }
 
-RawObject* KernelLoader::LoadExpressionEvaluationFunction(
+ObjectPtr KernelLoader::LoadExpressionEvaluationFunction(
     const String& library_url,
     const String& klass) {
   // Find the original context, i.e. library/class, in which the evaluation will
@@ -986,7 +986,7 @@
   field.set_has_nontrivial_initializer(false);
 }
 
-RawLibrary* KernelLoader::LoadLibrary(intptr_t index) {
+LibraryPtr KernelLoader::LoadLibrary(intptr_t index) {
   if (!program_->is_single_program()) {
     FATAL(
         "Trying to load a concatenated dill file at a time where that is "
@@ -1675,7 +1675,7 @@
     }
 
     Function& function = Function::ZoneHandle(
-        Z, Function::New(name, RawFunction::kConstructor,
+        Z, Function::New(name, FunctionLayout::kConstructor,
                          false,  // is_static
                          constructor_helper.IsConst(),
                          false,  // is_abstract
@@ -1939,7 +1939,7 @@
   procedure_helper.SetJustRead(ProcedureHelper::kAnnotations);
   const Object& script_class =
       ClassForScriptAt(owner, procedure_helper.source_uri_index_);
-  RawFunction::Kind kind = GetFunctionType(procedure_helper.kind_);
+  FunctionLayout::Kind kind = GetFunctionType(procedure_helper.kind_);
 
   // We do not register expression evaluation libraries with the VM:
   // The expression evaluation functions should be GC-able as soon as
@@ -2006,19 +2006,19 @@
 
   switch (function_node_helper.dart_async_marker_) {
     case FunctionNodeHelper::kSyncStar:
-      function.set_modifier(RawFunction::kSyncGen);
+      function.set_modifier(FunctionLayout::kSyncGen);
       function.set_is_visible(!FLAG_causal_async_stacks &&
                               !FLAG_lazy_async_stacks);
       break;
     case FunctionNodeHelper::kAsync:
-      function.set_modifier(RawFunction::kAsync);
+      function.set_modifier(FunctionLayout::kAsync);
       function.set_is_inlinable(!FLAG_causal_async_stacks &&
                                 !FLAG_lazy_async_stacks);
       function.set_is_visible(!FLAG_causal_async_stacks &&
                               !FLAG_lazy_async_stacks);
       break;
     case FunctionNodeHelper::kAsyncStar:
-      function.set_modifier(RawFunction::kAsyncGen);
+      function.set_modifier(FunctionLayout::kAsyncGen);
       function.set_is_inlinable(!FLAG_causal_async_stacks &&
                                 !FLAG_lazy_async_stacks);
       function.set_is_visible(!FLAG_causal_async_stacks &&
@@ -2088,8 +2088,8 @@
   return klass;
 }
 
-RawScript* KernelLoader::LoadScriptAt(intptr_t index,
-                                      UriToSourceTable* uri_to_source_table) {
+ScriptPtr KernelLoader::LoadScriptAt(intptr_t index,
+                                     UriToSourceTable* uri_to_source_table) {
   const String& uri_string = helper_.SourceTableUriFor(index);
   const String& import_uri_string =
       helper_.SourceTableImportUriFor(index, program_->binary_version());
@@ -2189,8 +2189,8 @@
       Z,
       Function::New(
           getter_name,
-          field_helper->IsStatic() ? RawFunction::kImplicitStaticGetter
-                                   : RawFunction::kImplicitGetter,
+          field_helper->IsStatic() ? FunctionLayout::kImplicitStaticGetter
+                                   : FunctionLayout::kImplicitGetter,
           field_helper->IsStatic(),
           // The functions created by the parser have is_const for static fields
           // that are const (not just final) and they have is_const for
@@ -2216,7 +2216,7 @@
     ASSERT(!field_helper->IsConst());
     const String& setter_name = H.DartSetterName(field_helper->canonical_name_);
     Function& setter = Function::ZoneHandle(
-        Z, Function::New(setter_name, RawFunction::kImplicitSetter,
+        Z, Function::New(setter_name, FunctionLayout::kImplicitSetter,
                          field_helper->IsStatic(),
                          false,  // is_const
                          false,  // is_abstract
@@ -2234,8 +2234,8 @@
   }
 }
 
-RawLibrary* KernelLoader::LookupLibraryOrNull(NameIndex library) {
-  RawLibrary* result;
+LibraryPtr KernelLoader::LookupLibraryOrNull(NameIndex library) {
+  LibraryPtr result;
   name_index_handle_ = Smi::New(library);
   {
     result = kernel_program_info_.LookupLibrary(thread_, name_index_handle_);
@@ -2258,10 +2258,10 @@
                                             handle);
 }
 
-RawLibrary* KernelLoader::LookupLibrary(NameIndex library) {
+LibraryPtr KernelLoader::LookupLibrary(NameIndex library) {
   name_index_handle_ = Smi::New(library);
   {
-    RawLibrary* result =
+    LibraryPtr result =
         kernel_program_info_.LookupLibrary(thread_, name_index_handle_);
     NoSafepointScope no_safepoint_scope(thread_);
     if (result != Library::null()) {
@@ -2292,14 +2292,14 @@
                                             handle);
 }
 
-RawLibrary* KernelLoader::LookupLibraryFromClass(NameIndex klass) {
+LibraryPtr KernelLoader::LookupLibraryFromClass(NameIndex klass) {
   return LookupLibrary(H.CanonicalNameParent(klass));
 }
 
-RawClass* KernelLoader::LookupClass(const Library& library, NameIndex klass) {
+ClassPtr KernelLoader::LookupClass(const Library& library, NameIndex klass) {
   name_index_handle_ = Smi::New(klass);
   {
-    RawClass* raw_class =
+    ClassPtr raw_class =
         kernel_program_info_.LookupClass(thread_, name_index_handle_);
     NoSafepointScope no_safepoint_scope(thread_);
     if (raw_class != Class::null()) {
@@ -2331,23 +2331,23 @@
   return handle.raw();
 }
 
-RawFunction::Kind KernelLoader::GetFunctionType(
+FunctionLayout::Kind KernelLoader::GetFunctionType(
     ProcedureHelper::Kind procedure_kind) {
   intptr_t lookuptable[] = {
-      RawFunction::kRegularFunction,  // Procedure::kMethod
-      RawFunction::kGetterFunction,   // Procedure::kGetter
-      RawFunction::kSetterFunction,   // Procedure::kSetter
-      RawFunction::kRegularFunction,  // Procedure::kOperator
-      RawFunction::kConstructor,      // Procedure::kFactory
+      FunctionLayout::kRegularFunction,  // Procedure::kMethod
+      FunctionLayout::kGetterFunction,   // Procedure::kGetter
+      FunctionLayout::kSetterFunction,   // Procedure::kSetter
+      FunctionLayout::kRegularFunction,  // Procedure::kOperator
+      FunctionLayout::kConstructor,      // Procedure::kFactory
   };
   intptr_t kind = static_cast<int>(procedure_kind);
   ASSERT(0 <= kind && kind <= ProcedureHelper::kFactory);
-  return static_cast<RawFunction::Kind>(lookuptable[kind]);
+  return static_cast<FunctionLayout::Kind>(lookuptable[kind]);
 }
 
-RawFunction* CreateFieldInitializerFunction(Thread* thread,
-                                            Zone* zone,
-                                            const Field& field) {
+FunctionPtr CreateFieldInitializerFunction(Thread* thread,
+                                           Zone* zone,
+                                           const Field& field) {
   ASSERT(field.InitializerFunction() == Function::null());
 
   String& init_name = String::Handle(zone, field.name());
@@ -2372,7 +2372,7 @@
 
   // Create a static initializer.
   const Function& initializer_fun = Function::Handle(
-      zone, Function::New(init_name, RawFunction::kFieldInitializer,
+      zone, Function::New(init_name, FunctionLayout::kFieldInitializer,
                           field.is_static(),  // is_static
                           false,              // is_const
                           false,              // is_abstract
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index 3298101..8e79898 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -31,8 +31,8 @@
         library_lookup_handle_(Library::Handle(thread->zone())) {}
   virtual ~BuildingTranslationHelper() {}
 
-  virtual RawLibrary* LookupLibraryByKernelLibrary(NameIndex library);
-  virtual RawClass* LookupClassByKernelClass(NameIndex klass);
+  virtual LibraryPtr LookupLibraryByKernelLibrary(NameIndex library);
+  virtual ClassPtr LookupClassByKernelClass(NameIndex klass);
 
  private:
   KernelLoader* loader_;
@@ -188,15 +188,15 @@
 
   // Returns the library containing the main procedure, null if there
   // was no main procedure, or a failure object if there was an error.
-  RawObject* LoadProgram(bool process_pending_classes = true);
+  ObjectPtr LoadProgram(bool process_pending_classes = true);
 
   // Load given library.
   void LoadLibrary(const Library& library);
 
   // Returns the function which will evaluate the expression, or a failure
   // object if there was an error.
-  RawObject* LoadExpressionEvaluationFunction(const String& library_url,
-                                              const String& klass);
+  ObjectPtr LoadExpressionEvaluationFunction(const String& library_url,
+                                             const String& klass);
 
   // Finds all libraries that have been modified in this incremental
   // version of the kernel program file.
@@ -212,9 +212,9 @@
                                     intptr_t* p_num_classes,
                                     intptr_t* p_num_procedures);
 
-  static RawString* FindSourceForScript(const uint8_t* kernel_buffer,
-                                        intptr_t kernel_buffer_length,
-                                        const String& url);
+  static StringPtr FindSourceForScript(const uint8_t* kernel_buffer,
+                                       intptr_t kernel_buffer_length,
+                                       const String& url);
 
   void FinishTopLevelClassLoading(const Class& toplevel_class,
                                   const Library& library,
@@ -228,7 +228,7 @@
   // Check for the presence of a (possibly const) constructor for the
   // 'ExternalName' class. If found, returns the name parameter to the
   // constructor.
-  RawString* DetectExternalNameCtor();
+  StringPtr DetectExternalNameCtor();
 
   // Check for the presence of a (possibly const) constructor for the 'pragma'
   // class. Returns whether it was found (no details about the type of pragma).
@@ -255,7 +255,7 @@
   void InitializeFields(
       DirectChainedHashMap<UriToSourceTableTrait>* uri_to_source_table);
 
-  RawLibrary* LoadLibrary(intptr_t index);
+  LibraryPtr LoadLibrary(intptr_t index);
 
   const String& LibraryUri(intptr_t library_index) {
     return translation_helper_.DartSymbolPlain(
@@ -316,10 +316,10 @@
                      bool in_class,
                      intptr_t procedure_end);
 
-  RawArray* MakeFieldsArray();
-  RawArray* MakeFunctionsArray();
+  ArrayPtr MakeFieldsArray();
+  ArrayPtr MakeFunctionsArray();
 
-  RawScript* LoadScriptAt(
+  ScriptPtr LoadScriptAt(
       intptr_t index,
       DirectChainedHashMap<UriToSourceTableTrait>* uri_to_source_table);
 
@@ -327,7 +327,7 @@
   // for klass whose script corresponds to the uri index.
   // Otherwise return klass.
   const Object& ClassForScriptAt(const Class& klass, intptr_t source_uri_index);
-  RawScript* ScriptAt(intptr_t source_uri_index) {
+  ScriptPtr ScriptAt(intptr_t source_uri_index) {
     return kernel_program_info_.ScriptAt(source_uri_index);
   }
 
@@ -339,12 +339,12 @@
   void LoadLibraryImportsAndExports(Library* library,
                                     const Class& toplevel_class);
 
-  RawLibrary* LookupLibraryOrNull(NameIndex library);
-  RawLibrary* LookupLibrary(NameIndex library);
-  RawLibrary* LookupLibraryFromClass(NameIndex klass);
-  RawClass* LookupClass(const Library& library, NameIndex klass);
+  LibraryPtr LookupLibraryOrNull(NameIndex library);
+  LibraryPtr LookupLibrary(NameIndex library);
+  LibraryPtr LookupLibraryFromClass(NameIndex klass);
+  ClassPtr LookupClass(const Library& library, NameIndex klass);
 
-  RawFunction::Kind GetFunctionType(ProcedureHelper::Kind procedure_kind);
+  FunctionLayout::Kind GetFunctionType(ProcedureHelper::Kind procedure_kind);
 
   void EnsureExternalClassIsLookedUp() {
     if (external_name_class_.IsNull()) {
@@ -456,9 +456,9 @@
   DISALLOW_COPY_AND_ASSIGN(KernelLoader);
 };
 
-RawFunction* CreateFieldInitializerFunction(Thread* thread,
-                                            Zone* zone,
-                                            const Field& field);
+FunctionPtr CreateFieldInitializerFunction(Thread* thread,
+                                           Zone* zone,
+                                           const Field& field);
 
 }  // namespace kernel
 }  // namespace dart
diff --git a/runtime/vm/megamorphic_cache_table.cc b/runtime/vm/megamorphic_cache_table.cc
index d0550ee3..439cccc 100644
--- a/runtime/vm/megamorphic_cache_table.cc
+++ b/runtime/vm/megamorphic_cache_table.cc
@@ -13,9 +13,9 @@
 
 namespace dart {
 
-RawMegamorphicCache* MegamorphicCacheTable::Lookup(Thread* thread,
-                                                   const String& name,
-                                                   const Array& descriptor) {
+MegamorphicCachePtr MegamorphicCacheTable::Lookup(Thread* thread,
+                                                  const String& name,
+                                                  const Array& descriptor) {
   Isolate* isolate = thread->isolate();
   // Multiple compilation threads could access this lookup.
   SafepointMutexLocker ml(isolate->megamorphic_mutex());
@@ -44,7 +44,7 @@
   return cache.raw();
 }
 
-RawFunction* MegamorphicCacheTable::miss_handler(Isolate* isolate) {
+FunctionPtr MegamorphicCacheTable::miss_handler(Isolate* isolate) {
   ASSERT(isolate->object_store()->megamorphic_call_miss_function() !=
          Function::null());
   return isolate->object_store()->megamorphic_call_miss_function();
@@ -70,7 +70,7 @@
   const Class& cls =
       Class::Handle(Type::Handle(Type::DartFunctionType()).type_class());
   const Function& function = Function::Handle(Function::New(
-      Symbols::MegamorphicCallMiss(), RawFunction::kRegularFunction,
+      Symbols::MegamorphicCallMiss(), FunctionLayout::kRegularFunction,
       true,   // Static, but called as a method.
       false,  // Not const.
       false,  // Not abstract.
diff --git a/runtime/vm/megamorphic_cache_table.h b/runtime/vm/megamorphic_cache_table.h
index 6b68c6c..fb714a3 100644
--- a/runtime/vm/megamorphic_cache_table.h
+++ b/runtime/vm/megamorphic_cache_table.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_MEGAMORPHIC_CACHE_TABLE_H_
 
 #include "vm/allocation.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
@@ -17,17 +18,12 @@
 class Function;
 class Isolate;
 class ObjectPointerVisitor;
-class RawArray;
-class RawFunction;
-class RawCode;
-class RawMegamorphicCache;
-class RawString;
 class String;
 class Thread;
 
 class MegamorphicCacheTable : public AllStatic {
  public:
-  static RawFunction* miss_handler(Isolate* isolate);
+  static FunctionPtr miss_handler(Isolate* isolate);
   NOT_IN_PRECOMPILED(static void InitMissHandler(Isolate* isolate));
 
   // Re-initializes the megamorphic miss handler function in the object store.
@@ -39,9 +35,9 @@
       static void ReInitMissHandlerCode(Isolate* isolate,
                                         compiler::ObjectPoolBuilder* wrapper));
 
-  static RawMegamorphicCache* Lookup(Thread* thread,
-                                     const String& name,
-                                     const Array& descriptor);
+  static MegamorphicCachePtr Lookup(Thread* thread,
+                                    const String& name,
+                                    const Array& descriptor);
 
   static void PrintSizes(Isolate* isolate);
 };
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc
index 59c1917..b4d4c69 100644
--- a/runtime/vm/message.cc
+++ b/runtime/vm/message.cc
@@ -24,38 +24,57 @@
     : next_(NULL),
       dest_port_(dest_port),
       delivery_failure_port_(delivery_failure_port),
-      snapshot_(snapshot),
+      payload_(snapshot),
       snapshot_length_(snapshot_length),
       finalizable_data_(finalizable_data),
       priority_(priority) {
   ASSERT((priority == kNormalPriority) ||
          (delivery_failure_port == kIllegalPort));
-  ASSERT(!IsRaw());
+  ASSERT(IsSnapshot());
 }
 
 Message::Message(Dart_Port dest_port,
-                 RawObject* raw_obj,
+                 ObjectPtr raw_obj,
                  Priority priority,
                  Dart_Port delivery_failure_port)
     : next_(NULL),
       dest_port_(dest_port),
       delivery_failure_port_(delivery_failure_port),
-      snapshot_(reinterpret_cast<uint8_t*>(raw_obj)),
+      payload_(raw_obj),
       snapshot_length_(0),
       finalizable_data_(NULL),
       priority_(priority) {
-  ASSERT(!raw_obj->IsHeapObject() || raw_obj->InVMIsolateHeap());
+  ASSERT(!raw_obj->IsHeapObject() || raw_obj->ptr()->InVMIsolateHeap());
   ASSERT((priority == kNormalPriority) ||
          (delivery_failure_port == kIllegalPort));
   ASSERT(IsRaw());
 }
 
+Message::Message(Dart_Port dest_port,
+                 Bequest* bequest,
+                 Priority priority,
+                 Dart_Port delivery_failure_port)
+    : next_(nullptr),
+      dest_port_(dest_port),
+      delivery_failure_port_(delivery_failure_port),
+      payload_(bequest),
+      snapshot_length_(-1),
+      finalizable_data_(nullptr),
+      priority_(priority) {
+  ASSERT((priority == kNormalPriority) ||
+         (delivery_failure_port == kIllegalPort));
+  ASSERT(IsBequest());
+}
+
 Message::~Message() {
   ASSERT(delivery_failure_port_ == kIllegalPort);
-  if (!IsRaw()) {
-    free(snapshot_);
+  if (IsSnapshot()) {
+    free(payload_.snapshot_);
   }
   delete finalizable_data_;
+  if (IsBequest()) {
+    delete (payload_.bequest_);
+  }
 }
 
 bool Message::RedirectToDeliveryFailurePort() {
diff --git a/runtime/vm/message.h b/runtime/vm/message.h
index 6694940..d29e7fb 100644
--- a/runtime/vm/message.h
+++ b/runtime/vm/message.h
@@ -12,14 +12,19 @@
 #include "vm/allocation.h"
 #include "vm/finalizable_data.h"
 #include "vm/globals.h"
+#include "vm/tagged_pointer.h"
 
 // Duplicated from dart_api.h to avoid including the whole header.
 typedef int64_t Dart_Port;
 
 namespace dart {
 
+class Bequest;
 class JSONStream;
-class RawObject;
+class PersistentHandle;
+class HeapPage;
+class WeakTable;
+class FreeList;
 
 class Message {
  public:
@@ -58,7 +63,12 @@
   // Message objects can also carry RawObject pointers for Smis and objects in
   // the VM heap. This is indicated by setting the len_ field to 0.
   Message(Dart_Port dest_port,
-          RawObject* raw_obj,
+          ObjectPtr raw_obj,
+          Priority priority,
+          Dart_Port delivery_failure_port = kIllegalPort);
+
+  Message(Dart_Port dest_port,
+          Bequest* bequest,
           Priority priority,
           Dart_Port delivery_failure_port = kIllegalPort);
 
@@ -72,8 +82,8 @@
   Dart_Port dest_port() const { return dest_port_; }
 
   uint8_t* snapshot() const {
-    ASSERT(!IsRaw());
-    return snapshot_;
+    ASSERT(IsSnapshot());
+    return payload_.snapshot_;
   }
   intptr_t snapshot_length() const { return snapshot_length_; }
 
@@ -87,14 +97,25 @@
     return size;
   }
 
-  RawObject* raw_obj() const {
+  ObjectPtr raw_obj() const {
     ASSERT(IsRaw());
-    return reinterpret_cast<RawObject*>(snapshot_);
+    return payload_.raw_obj_;
+  }
+  Bequest* bequest() const {
+    ASSERT(IsBequest());
+    return payload_.bequest_;
   }
   Priority priority() const { return priority_; }
 
+  // A message processed at any interrupt point (stack overflow check) instead
+  // of at the top of the message loop. Control messages from dart:isolate or
+  // vm-service requests.
   bool IsOOB() const { return priority_ == Message::kOOBPriority; }
+  bool IsSnapshot() const { return !IsRaw() && !IsBequest(); }
+  // A message whose object is an immortal object from the vm-isolate's heap.
   bool IsRaw() const { return snapshot_length_ == 0; }
+  // A message sent from sendAndExit.
+  bool IsBequest() const { return snapshot_length_ == -1; }
 
   bool RedirectToDeliveryFailurePort();
 
@@ -114,7 +135,15 @@
   Message* next_;
   Dart_Port dest_port_;
   Dart_Port delivery_failure_port_;
-  uint8_t* snapshot_;
+  union Payload {
+    Payload(uint8_t* snapshot) : snapshot_(snapshot) {}
+    Payload(ObjectPtr raw_obj) : raw_obj_(raw_obj) {}
+    Payload(Bequest* bequest) : bequest_(bequest) {}
+
+    uint8_t* snapshot_;
+    ObjectPtr raw_obj_;
+    Bequest* bequest_;
+  } payload_;
   intptr_t snapshot_length_;
   MessageFinalizableData* finalizable_data_;
   Priority priority_;
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index 67a3599..18fdad6 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -16,7 +16,6 @@
 // Forward declarations.
 class BootstrapNatives;
 class Object;
-class RawObject;
 class Simulator;
 class Thread;
 
@@ -83,11 +82,11 @@
   // Includes type arguments vector.
   int ArgCount() const { return ArgcBits::decode(argc_tag_); }
 
-  RawObject* ArgAt(int index) const {
+  ObjectPtr ArgAt(int index) const {
     ASSERT((index >= 0) && (index < ArgCount()));
-    RawObject** arg_ptr =
+    ObjectPtr* arg_ptr =
         &(argv_[ReverseArgOrderBit::decode(argc_tag_) ? index : -index]);
-    // Tell MemorySanitizer the RawObject* was initialized (by generated code).
+    // Tell MemorySanitizer the ObjectPtr was initialized (by generated code).
     MSAN_UNPOISON(arg_ptr, kWordSize);
     return *arg_ptr;
   }
@@ -95,7 +94,7 @@
   void SetArgAt(int index, const Object& value) const {
     ASSERT(thread_->execution_state() == Thread::kThreadInVM);
     ASSERT((index >= 0) && (index < ArgCount()));
-    RawObject** arg_ptr =
+    ObjectPtr* arg_ptr =
         &(argv_[ReverseArgOrderBit::decode(argc_tag_) ? index : -index]);
     *arg_ptr = value.raw();
   }
@@ -106,7 +105,7 @@
     return ArgCount() - NumHiddenArgs(function_bits);
   }
 
-  RawObject* NativeArg0() const {
+  ObjectPtr NativeArg0() const {
     int function_bits = FunctionBits::decode(argc_tag_);
     if ((function_bits & (kClosureFunctionBit | kInstanceFunctionBit)) ==
         (kClosureFunctionBit | kInstanceFunctionBit)) {
@@ -121,7 +120,7 @@
     return ArgAt(NumHiddenArgs(function_bits));
   }
 
-  RawObject* NativeArgAt(int index) const {
+  ObjectPtr NativeArgAt(int index) const {
     ASSERT((index >= 0) && (index < NativeArgCount()));
     if (index == 0) {
       return NativeArg0();
@@ -131,7 +130,7 @@
     return ArgAt(actual_index);
   }
 
-  RawTypeArguments* NativeTypeArgs() const {
+  TypeArgumentsPtr NativeTypeArgs() const {
     ASSERT(ToGenericFunction());
     return TypeArguments::RawCast(ArgAt(0));
   }
@@ -148,7 +147,7 @@
     return 0;
   }
 
-  RawAbstractType* NativeTypeArgAt(int index) const {
+  AbstractTypePtr NativeTypeArgAt(int index) const {
     ASSERT((index >= 0) && (index < NativeTypeArgCount()));
     TypeArguments& type_args = TypeArguments::Handle(NativeTypeArgs());
     if (type_args.IsNull()) {
@@ -163,7 +162,7 @@
     *retval_ = value.raw();
   }
 
-  RawObject* ReturnValue() const {
+  ObjectPtr ReturnValue() const {
     // Tell MemorySanitizer the retval_ was initialized (by generated code).
     MSAN_UNPOISON(retval_, kWordSize);
     return *retval_;
@@ -242,8 +241,8 @@
   // on the stack.
   NativeArguments(Thread* thread,
                   int argc_tag,
-                  RawObject** argv,
-                  RawObject** retval)
+                  ObjectPtr* argv,
+                  ObjectPtr* retval)
       : thread_(thread),
         argc_tag_(ReverseArgOrderBit::update(true, argc_tag)),
         argv_(argv),
@@ -253,7 +252,7 @@
   // exceedingly careful when we use it.  If there are any other side
   // effects in the statement that may cause GC, it could lead to
   // bugs.
-  void SetReturnUnsafe(RawObject* value) const {
+  void SetReturnUnsafe(ObjectPtr value) const {
     ASSERT(thread_->execution_state() == Thread::kThreadInVM);
     *retval_ = value;
   }
@@ -290,8 +289,8 @@
 
   Thread* thread_;      // Current thread pointer.
   intptr_t argc_tag_;   // Encodes argument count and invoked native call type.
-  RawObject** argv_;    // Pointer to an array of arguments to runtime call.
-  RawObject** retval_;  // Pointer to the return value area.
+  ObjectPtr* argv_;     // Pointer to an array of arguments to runtime call.
+  ObjectPtr* retval_;   // Pointer to the return value area.
 };
 
 }  // namespace dart
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index ccfc289..44f3d91b 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -91,7 +91,7 @@
 }
 
 bool NativeEntry::ReturnValueIsError(NativeArguments* arguments) {
-  RawObject* retval = arguments->ReturnValue();
+  ObjectPtr retval = arguments->ReturnValue();
   return (retval->IsHeapObject() && IsErrorClassId(retval->GetClassId()));
 }
 
@@ -136,7 +136,7 @@
     // Be careful holding return_value_unsafe without a handle here.
     // A return of Object::sentinel means the return value has already
     // been set.
-    RawObject* return_value_unsafe = reinterpret_cast<BootstrapNativeFunction>(
+    ObjectPtr return_value_unsafe = reinterpret_cast<BootstrapNativeFunction>(
         func)(thread, zone.GetZone(), arguments);
     if (return_value_unsafe != Object::sentinel().raw()) {
       ASSERT(return_value_unsafe->IsDartInstance());
@@ -376,7 +376,7 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
 // Note: not GC safe. Use with care.
-NativeEntryData::Payload* NativeEntryData::FromTypedArray(RawTypedData* data) {
+NativeEntryData::Payload* NativeEntryData::FromTypedArray(TypedDataPtr data) {
   return reinterpret_cast<Payload*>(data->ptr()->data());
 }
 
@@ -388,7 +388,7 @@
   FromTypedArray(data_.raw())->kind = value;
 }
 
-MethodRecognizer::Kind NativeEntryData::GetKind(RawTypedData* data) {
+MethodRecognizer::Kind NativeEntryData::GetKind(TypedDataPtr data) {
   return FromTypedArray(data)->kind;
 }
 
@@ -400,7 +400,7 @@
   FromTypedArray(data_.raw())->trampoline = value;
 }
 
-NativeFunctionWrapper NativeEntryData::GetTrampoline(RawTypedData* data) {
+NativeFunctionWrapper NativeEntryData::GetTrampoline(TypedDataPtr data) {
   return FromTypedArray(data)->trampoline;
 }
 
@@ -412,7 +412,7 @@
   FromTypedArray(data_.raw())->native_function = value;
 }
 
-NativeFunction NativeEntryData::GetNativeFunction(RawTypedData* data) {
+NativeFunction NativeEntryData::GetNativeFunction(TypedDataPtr data) {
   return FromTypedArray(data)->native_function;
 }
 
@@ -424,14 +424,14 @@
   FromTypedArray(data_.raw())->argc_tag = value;
 }
 
-intptr_t NativeEntryData::GetArgcTag(RawTypedData* data) {
+intptr_t NativeEntryData::GetArgcTag(TypedDataPtr data) {
   return FromTypedArray(data)->argc_tag;
 }
 
-RawTypedData* NativeEntryData::New(MethodRecognizer::Kind kind,
-                                   NativeFunctionWrapper trampoline,
-                                   NativeFunction native_function,
-                                   intptr_t argc_tag) {
+TypedDataPtr NativeEntryData::New(MethodRecognizer::Kind kind,
+                                  NativeFunctionWrapper trampoline,
+                                  NativeFunction native_function,
+                                  intptr_t argc_tag) {
   const TypedData& data = TypedData::Handle(
       TypedData::New(kTypedDataUint8ArrayCid, sizeof(Payload), Heap::kOld));
   NativeEntryData native_entry(data);
diff --git a/runtime/vm/native_entry.h b/runtime/vm/native_entry.h
index d9d4264..fae4261 100644
--- a/runtime/vm/native_entry.h
+++ b/runtime/vm/native_entry.h
@@ -33,25 +33,25 @@
   } while (0)
 #endif
 
-typedef RawObject* (*BootstrapNativeFunction)(Thread* thread,
-                                              Zone* zone,
-                                              NativeArguments* arguments);
+typedef ObjectPtr (*BootstrapNativeFunction)(Thread* thread,
+                                             Zone* zone,
+                                             NativeArguments* arguments);
 
 #define NATIVE_ENTRY_FUNCTION(name) BootstrapNatives::DN_##name
 
 #define DEFINE_NATIVE_ENTRY(name, type_argument_count, argument_count)         \
-  static RawObject* DN_Helper##name(Isolate* isolate, Thread* thread,          \
-                                    Zone* zone, NativeArguments* arguments);   \
-  RawObject* NATIVE_ENTRY_FUNCTION(name)(Thread * thread, Zone * zone,         \
-                                         NativeArguments * arguments) {        \
+  static ObjectPtr DN_Helper##name(Isolate* isolate, Thread* thread,           \
+                                   Zone* zone, NativeArguments* arguments);    \
+  ObjectPtr NATIVE_ENTRY_FUNCTION(name)(Thread * thread, Zone * zone,          \
+                                        NativeArguments * arguments) {         \
     TRACE_NATIVE_CALL("%s", "" #name);                                         \
     ASSERT(arguments->NativeArgCount() == argument_count);                     \
     /* Note: a longer type arguments vector may be passed */                   \
     ASSERT(arguments->NativeTypeArgCount() >= type_argument_count);            \
     return DN_Helper##name(thread->isolate(), thread, zone, arguments);        \
   }                                                                            \
-  static RawObject* DN_Helper##name(Isolate* isolate, Thread* thread,          \
-                                    Zone* zone, NativeArguments* arguments)
+  static ObjectPtr DN_Helper##name(Isolate* isolate, Thread* thread,           \
+                                   Zone* zone, NativeArguments* arguments)
 
 // Helpers that throw an argument exception.
 void DartNativeThrowTypeArgumentCountException(int num_type_args,
@@ -140,24 +140,24 @@
 
   MethodRecognizer::Kind kind() const;
   void set_kind(MethodRecognizer::Kind value) const;
-  static MethodRecognizer::Kind GetKind(RawTypedData* data);
+  static MethodRecognizer::Kind GetKind(TypedDataPtr data);
 
   NativeFunctionWrapper trampoline() const;
   void set_trampoline(NativeFunctionWrapper value) const;
-  static NativeFunctionWrapper GetTrampoline(RawTypedData* data);
+  static NativeFunctionWrapper GetTrampoline(TypedDataPtr data);
 
   NativeFunction native_function() const;
   void set_native_function(NativeFunction value) const;
-  static NativeFunction GetNativeFunction(RawTypedData* data);
+  static NativeFunction GetNativeFunction(TypedDataPtr data);
 
   intptr_t argc_tag() const;
   void set_argc_tag(intptr_t value) const;
-  static intptr_t GetArgcTag(RawTypedData* data);
+  static intptr_t GetArgcTag(TypedDataPtr data);
 
-  static RawTypedData* New(MethodRecognizer::Kind kind,
-                           NativeFunctionWrapper trampoline,
-                           NativeFunction native_function,
-                           intptr_t argc_tag);
+  static TypedDataPtr New(MethodRecognizer::Kind kind,
+                          NativeFunctionWrapper trampoline,
+                          NativeFunction native_function,
+                          intptr_t argc_tag);
 
  private:
   struct Payload {
@@ -167,7 +167,7 @@
     MethodRecognizer::Kind kind;
   };
 
-  static Payload* FromTypedArray(RawTypedData* data);
+  static Payload* FromTypedArray(TypedDataPtr data);
 
   const TypedData& data_;
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 373f524..ec90971 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -33,6 +33,7 @@
 #include "vm/heap/become.h"
 #include "vm/heap/heap.h"
 #include "vm/heap/weak_code.h"
+#include "vm/image_snapshot.h"
 #include "vm/isolate_reload.h"
 #include "vm/kernel.h"
 #include "vm/kernel_binary.h"
@@ -106,9 +107,9 @@
 static const intptr_t kInitPrefixLength = strlen(kInitPrefix);
 
 // A cache of VM heap allocated preinitialized empty ic data entry arrays.
-RawArray* ICData::cached_icdata_arrays_[kCachedICDataArrayCount];
+ArrayPtr ICData::cached_icdata_arrays_[kCachedICDataArrayCount];
 // A VM heap allocated preinitialized empty subtype entry array.
-RawArray* SubtypeTestCache::cached_array_;
+ArrayPtr SubtypeTestCache::cached_array_;
 
 cpp_vtable Object::builtin_vtables_[kNumPredefinedCids] = {};
 
@@ -117,11 +118,11 @@
 #if defined(RAW_NULL)
 #error RAW_NULL should not be defined.
 #endif
-#define RAW_NULL kHeapObjectTag
+#define RAW_NULL static_cast<uword>(kHeapObjectTag)
 
 #define CHECK_ERROR(error)                                                     \
   {                                                                            \
-    RawError* err = (error);                                                   \
+    ErrorPtr err = (error);                                                    \
     if (err != Error::null()) {                                                \
       return err;                                                              \
     }                                                                          \
@@ -132,64 +133,50 @@
 SHARED_READONLY_HANDLES_LIST(DEFINE_SHARED_READONLY_HANDLE)
 #undef DEFINE_SHARED_READONLY_HANDLE
 
-RawObject* Object::null_ = reinterpret_cast<RawObject*>(RAW_NULL);
-RawBool* Object::true_ = reinterpret_cast<RawBool*>(RAW_NULL);
-RawBool* Object::false_ = reinterpret_cast<RawBool*>(RAW_NULL);
-RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::never_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::closure_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::signature_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::redirection_data_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::ffi_trampoline_data_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::namespace_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::kernel_program_info_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::bytecode_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::instructions_section_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::object_pool_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::code_source_map_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::compressed_stackmaps_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::var_descriptors_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::exception_handlers_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::dyncalltypecheck_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::singletargetcache_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::unlinkedcall_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::monomorphicsmiablecall_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::icdata_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::megamorphic_cache_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::subtypetestcache_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::api_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::language_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::unhandled_exception_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::unwind_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::weak_serialization_reference_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
+ObjectPtr Object::null_ = static_cast<ObjectPtr>(RAW_NULL);
+BoolPtr Object::true_ = static_cast<BoolPtr>(RAW_NULL);
+BoolPtr Object::false_ = static_cast<BoolPtr>(RAW_NULL);
+ClassPtr Object::class_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::dynamic_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::void_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::type_arguments_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::patch_class_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::function_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::closure_data_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::signature_data_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::redirection_data_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::ffi_trampoline_data_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::field_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::script_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::library_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::namespace_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::kernel_program_info_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::code_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::bytecode_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::instructions_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::instructions_section_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::object_pool_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::pc_descriptors_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::code_source_map_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::compressed_stackmaps_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::var_descriptors_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::exception_handlers_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::context_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::context_scope_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::dyncalltypecheck_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::singletargetcache_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::unlinkedcall_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::monomorphicsmiablecall_class_ =
+    static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::icdata_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::megamorphic_cache_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::subtypetestcache_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::api_error_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::language_error_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::unhandled_exception_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::unwind_error_class_ = static_cast<ClassPtr>(RAW_NULL);
+ClassPtr Object::weak_serialization_reference_class_ =
+    static_cast<ClassPtr>(RAW_NULL);
 
 const double MegamorphicCache::kLoadFactor = 0.50;
 
@@ -201,7 +188,7 @@
 }
 
 // Remove private keys, but retain getter/setter/constructor/mixin manglings.
-RawString* String::RemovePrivateKey(const String& name) {
+StringPtr String::RemovePrivateKey(const String& name) {
   ASSERT(name.IsOneByteString());
   GrowableArray<uint8_t> without_key(name.Length());
   intptr_t i = 0;
@@ -399,8 +386,8 @@
   return printer.buffer();
 }
 
-RawString* String::ScrubNameRetainPrivate(const String& name,
-                                          bool is_extension) {
+StringPtr String::ScrubNameRetainPrivate(const String& name,
+                                         bool is_extension) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
   intptr_t len = name.Length();
   intptr_t start = 0;
@@ -526,7 +513,7 @@
   return '\0';
 }
 
-static RawBytecode* CreateVMInternalBytecode(KernelBytecode::Opcode opcode) {
+static BytecodePtr CreateVMInternalBytecode(KernelBytecode::Opcode opcode) {
   const KBCInstr* instructions = nullptr;
   intptr_t instructions_size = 0;
 
@@ -555,7 +542,7 @@
   // clear the object.
   {
     uword address = heap->Allocate(Instance::InstanceSize(), Heap::kOld);
-    null_ = reinterpret_cast<RawInstance*>(address + kHeapObjectTag);
+    null_ = static_cast<InstancePtr>(address + kHeapObjectTag);
     // The call below is using 'null_' to initialize itself.
     InitializeObject(address, kNullCid, Instance::InstanceSize());
   }
@@ -572,29 +559,29 @@
   {
     // Allocate true.
     uword address = heap->Allocate(Bool::InstanceSize(), Heap::kOld);
-    true_ = reinterpret_cast<RawBool*>(address + kHeapObjectTag);
+    true_ = static_cast<BoolPtr>(address + kHeapObjectTag);
     InitializeObject(address, kBoolCid, Bool::InstanceSize());
     true_->ptr()->value_ = true;
-    true_->SetCanonical();
+    true_->ptr()->SetCanonical();
   }
   {
     // Allocate false.
     uword address = heap->Allocate(Bool::InstanceSize(), Heap::kOld);
-    false_ = reinterpret_cast<RawBool*>(address + kHeapObjectTag);
+    false_ = static_cast<BoolPtr>(address + kHeapObjectTag);
     InitializeObject(address, kBoolCid, Bool::InstanceSize());
     false_->ptr()->value_ = false;
-    false_->SetCanonical();
+    false_->ptr()->SetCanonical();
   }
 
   // Check that the objects have been allocated at appropriate addresses.
-  ASSERT(reinterpret_cast<uword>(true_) ==
-         reinterpret_cast<uword>(null_) + kTrueOffsetFromNull);
-  ASSERT(reinterpret_cast<uword>(false_) ==
-         reinterpret_cast<uword>(null_) + kFalseOffsetFromNull);
-  ASSERT((reinterpret_cast<uword>(true_) & kBoolValueMask) == 0);
-  ASSERT((reinterpret_cast<uword>(false_) & kBoolValueMask) != 0);
-  ASSERT(reinterpret_cast<uword>(false_) ==
-         (reinterpret_cast<uword>(true_) | kBoolValueMask));
+  ASSERT(static_cast<uword>(true_) ==
+         static_cast<uword>(null_) + kTrueOffsetFromNull);
+  ASSERT(static_cast<uword>(false_) ==
+         static_cast<uword>(null_) + kFalseOffsetFromNull);
+  ASSERT((static_cast<uword>(true_) & kBoolValueMask) == 0);
+  ASSERT((static_cast<uword>(false_) & kBoolValueMask) != 0);
+  ASSERT(static_cast<uword>(false_) ==
+         (static_cast<uword>(true_) | kBoolValueMask));
 }
 
 void Object::InitVtables() {
@@ -729,7 +716,7 @@
   {
     intptr_t size = Class::InstanceSize();
     uword address = heap->Allocate(size, Heap::kOld);
-    class_class_ = reinterpret_cast<RawClass*>(address + kHeapObjectTag);
+    class_class_ = static_cast<ClassPtr>(address + kHeapObjectTag);
     InitializeObject(address, Class::kClassId, size);
 
     Class fake;
@@ -762,6 +749,14 @@
   cls.set_num_type_arguments(0);
   isolate->object_store()->set_null_class(cls);
 
+  // Allocate and initialize Never class.
+  cls = Class::New<Instance, RTN::Instance>(kNeverCid, isolate);
+  cls.set_num_type_arguments(0);
+  cls.set_is_finalized();
+  cls.set_is_declaration_loaded();
+  cls.set_is_type_finalized();
+  isolate->object_store()->set_never_class(cls);
+
   // Allocate and initialize the free list element class.
   cls =
       Class::New<FreeListElement::FakeInstance,
@@ -949,8 +944,8 @@
   {
     uword address = heap->Allocate(Array::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(0));
-    Array::initializeHandle(
-        empty_array_, reinterpret_cast<RawArray*>(address + kHeapObjectTag));
+    Array::initializeHandle(empty_array_,
+                            static_cast<ArrayPtr>(address + kHeapObjectTag));
     empty_array_->StoreSmi(&empty_array_->raw_ptr()->length_, Smi::New(0));
     empty_array_->SetCanonical();
   }
@@ -960,8 +955,8 @@
   {
     uword address = heap->Allocate(Array::InstanceSize(1), Heap::kOld);
     InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(1));
-    Array::initializeHandle(
-        zero_array_, reinterpret_cast<RawArray*>(address + kHeapObjectTag));
+    Array::initializeHandle(zero_array_,
+                            static_cast<ArrayPtr>(address + kHeapObjectTag));
     zero_array_->StoreSmi(&zero_array_->raw_ptr()->length_, Smi::New(1));
     smi = Smi::New(0);
     zero_array_->SetAt(0, smi);
@@ -974,7 +969,7 @@
     InitializeObject(address, kContextScopeCid, ContextScope::InstanceSize(0));
     ContextScope::initializeHandle(
         empty_context_scope_,
-        reinterpret_cast<RawContextScope*>(address + kHeapObjectTag));
+        static_cast<ContextScopePtr>(address + kHeapObjectTag));
     empty_context_scope_->StoreNonPointer(
         &empty_context_scope_->raw_ptr()->num_variables_, 0);
     empty_context_scope_->StoreNonPointer(
@@ -988,7 +983,7 @@
     InitializeObject(address, kObjectPoolCid, ObjectPool::InstanceSize(0));
     ObjectPool::initializeHandle(
         empty_object_pool_,
-        reinterpret_cast<RawObjectPool*>(address + kHeapObjectTag));
+        static_cast<ObjectPoolPtr>(address + kHeapObjectTag));
     empty_object_pool_->StoreNonPointer(&empty_object_pool_->raw_ptr()->length_,
                                         0);
     empty_object_pool_->SetCanonical();
@@ -1001,7 +996,7 @@
                      PcDescriptors::InstanceSize(0));
     PcDescriptors::initializeHandle(
         empty_descriptors_,
-        reinterpret_cast<RawPcDescriptors*>(address + kHeapObjectTag));
+        static_cast<PcDescriptorsPtr>(address + kHeapObjectTag));
     empty_descriptors_->StoreNonPointer(&empty_descriptors_->raw_ptr()->length_,
                                         0);
     empty_descriptors_->SetCanonical();
@@ -1015,7 +1010,7 @@
                      LocalVarDescriptors::InstanceSize(0));
     LocalVarDescriptors::initializeHandle(
         empty_var_descriptors_,
-        reinterpret_cast<RawLocalVarDescriptors*>(address + kHeapObjectTag));
+        static_cast<LocalVarDescriptorsPtr>(address + kHeapObjectTag));
     empty_var_descriptors_->StoreNonPointer(
         &empty_var_descriptors_->raw_ptr()->num_entries_, 0);
     empty_var_descriptors_->SetCanonical();
@@ -1031,7 +1026,7 @@
                      ExceptionHandlers::InstanceSize(0));
     ExceptionHandlers::initializeHandle(
         empty_exception_handlers_,
-        reinterpret_cast<RawExceptionHandlers*>(address + kHeapObjectTag));
+        static_cast<ExceptionHandlersPtr>(address + kHeapObjectTag));
     empty_exception_handlers_->StoreNonPointer(
         &empty_exception_handlers_->raw_ptr()->num_entries_, 0);
     empty_exception_handlers_->SetCanonical();
@@ -1044,7 +1039,7 @@
                      TypeArguments::InstanceSize(0));
     TypeArguments::initializeHandle(
         empty_type_arguments_,
-        reinterpret_cast<RawTypeArguments*>(address + kHeapObjectTag));
+        static_cast<TypeArgumentsPtr>(address + kHeapObjectTag));
     empty_type_arguments_->StoreSmi(&empty_type_arguments_->raw_ptr()->length_,
                                     Smi::New(0));
     empty_type_arguments_->StoreSmi(&empty_type_arguments_->raw_ptr()->hash_,
@@ -1071,13 +1066,6 @@
   cls.set_is_type_finalized();
   void_class_ = cls.raw();
 
-  cls = Class::New<Instance, RTN::Instance>(kNeverCid, isolate);
-  cls.set_num_type_arguments(0);
-  cls.set_is_finalized();
-  cls.set_is_declaration_loaded();
-  cls.set_is_type_finalized();
-  never_class_ = cls.raw();
-
   cls = Class::New<Type, RTN::Type>(isolate);
   cls.set_is_finalized();
   cls.set_is_declaration_loaded();
@@ -1097,9 +1085,6 @@
   void_type_->ComputeHash();
   void_type_->SetCanonical();
 
-  cls = never_class_;
-  *never_type_ = Type::NewNonParameterizedType(cls);
-
   // Since TypeArguments objects are passed as function arguments, make them
   // behave as Dart instances, although they are just VM objects.
   // Note that we cannot set the super type to ObjectType, which does not live
@@ -1249,7 +1234,7 @@
 
 void Object::FinishInit(Isolate* isolate) {
   // The type testing stubs we initialize in AbstractType objects for the
-  // canonical type of kDynamicCid/kVoidCid/kNeverCid need to be set in this
+  // canonical type of kDynamicCid/kVoidCid need to be set in this
   // method, which is called after StubCode::InitOnce().
   Code& code = Code::Handle();
 
@@ -1258,54 +1243,50 @@
 
   code = TypeTestingStubGenerator::DefaultCodeForType(*void_type_);
   void_type_->SetTypeTestingStub(code);
-
-  code = TypeTestingStubGenerator::DefaultCodeForType(*never_type_);
-  never_type_->SetTypeTestingStub(code);
 }
 
 void Object::Cleanup() {
-  null_ = reinterpret_cast<RawObject*>(RAW_NULL);
-  true_ = reinterpret_cast<RawBool*>(RAW_NULL);
-  false_ = reinterpret_cast<RawBool*>(RAW_NULL);
-  class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  void_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  never_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  closure_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  signature_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  redirection_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  ffi_trampoline_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  field_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  script_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  library_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  namespace_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  kernel_program_info_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  code_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  bytecode_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  instructions_section_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  object_pool_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  code_source_map_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  compressed_stackmaps_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  var_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  exception_handlers_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  context_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  dyncalltypecheck_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  singletargetcache_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  unlinkedcall_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  monomorphicsmiablecall_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  icdata_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  megamorphic_cache_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  subtypetestcache_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  api_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  language_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  unhandled_exception_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  unwind_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  null_ = static_cast<ObjectPtr>(RAW_NULL);
+  true_ = static_cast<BoolPtr>(RAW_NULL);
+  false_ = static_cast<BoolPtr>(RAW_NULL);
+  class_class_ = static_cast<ClassPtr>(RAW_NULL);
+  dynamic_class_ = static_cast<ClassPtr>(RAW_NULL);
+  void_class_ = static_cast<ClassPtr>(RAW_NULL);
+  type_arguments_class_ = static_cast<ClassPtr>(RAW_NULL);
+  patch_class_class_ = static_cast<ClassPtr>(RAW_NULL);
+  function_class_ = static_cast<ClassPtr>(RAW_NULL);
+  closure_data_class_ = static_cast<ClassPtr>(RAW_NULL);
+  signature_data_class_ = static_cast<ClassPtr>(RAW_NULL);
+  redirection_data_class_ = static_cast<ClassPtr>(RAW_NULL);
+  ffi_trampoline_data_class_ = static_cast<ClassPtr>(RAW_NULL);
+  field_class_ = static_cast<ClassPtr>(RAW_NULL);
+  script_class_ = static_cast<ClassPtr>(RAW_NULL);
+  library_class_ = static_cast<ClassPtr>(RAW_NULL);
+  namespace_class_ = static_cast<ClassPtr>(RAW_NULL);
+  kernel_program_info_class_ = static_cast<ClassPtr>(RAW_NULL);
+  code_class_ = static_cast<ClassPtr>(RAW_NULL);
+  bytecode_class_ = static_cast<ClassPtr>(RAW_NULL);
+  instructions_class_ = static_cast<ClassPtr>(RAW_NULL);
+  instructions_section_class_ = static_cast<ClassPtr>(RAW_NULL);
+  object_pool_class_ = static_cast<ClassPtr>(RAW_NULL);
+  pc_descriptors_class_ = static_cast<ClassPtr>(RAW_NULL);
+  code_source_map_class_ = static_cast<ClassPtr>(RAW_NULL);
+  compressed_stackmaps_class_ = static_cast<ClassPtr>(RAW_NULL);
+  var_descriptors_class_ = static_cast<ClassPtr>(RAW_NULL);
+  exception_handlers_class_ = static_cast<ClassPtr>(RAW_NULL);
+  context_class_ = static_cast<ClassPtr>(RAW_NULL);
+  context_scope_class_ = static_cast<ClassPtr>(RAW_NULL);
+  dyncalltypecheck_class_ = static_cast<ClassPtr>(RAW_NULL);
+  singletargetcache_class_ = static_cast<ClassPtr>(RAW_NULL);
+  unlinkedcall_class_ = static_cast<ClassPtr>(RAW_NULL);
+  monomorphicsmiablecall_class_ = static_cast<ClassPtr>(RAW_NULL);
+  icdata_class_ = static_cast<ClassPtr>(RAW_NULL);
+  megamorphic_cache_class_ = static_cast<ClassPtr>(RAW_NULL);
+  subtypetestcache_class_ = static_cast<ClassPtr>(RAW_NULL);
+  api_error_class_ = static_cast<ClassPtr>(RAW_NULL);
+  language_error_class_ = static_cast<ClassPtr>(RAW_NULL);
+  unhandled_exception_class_ = static_cast<ClassPtr>(RAW_NULL);
+  unwind_error_class_ = static_cast<ClassPtr>(RAW_NULL);
 }
 
 // An object visitor which will mark all visited objects. This is used to
@@ -1321,13 +1302,13 @@
   {
   }
 
-  void VisitObject(RawObject* obj) {
+  void VisitObject(ObjectPtr obj) {
     // Free list elements should never be marked.
-    ASSERT(!obj->IsMarked());
+    ASSERT(!obj->ptr()->IsMarked());
     // No forwarding corpses in the VM isolate.
     ASSERT(!obj->IsForwardingCorpse());
     if (!obj->IsFreeListElement()) {
-      obj->SetMarkBitUnsynchronized();
+      obj->ptr()->SetMarkBitUnsynchronized();
       Object::FinalizeReadOnlyObject(obj);
 #if defined(HASH_IN_OBJECT_HEADER)
       // These objects end up in the read-only VM isolate which is shared
@@ -1373,7 +1354,6 @@
   SET_CLASS_NAME(class, Class);
   SET_CLASS_NAME(dynamic, Dynamic);
   SET_CLASS_NAME(void, Void);
-  SET_CLASS_NAME(never, Never);
   SET_CLASS_NAME(type_arguments, TypeArguments);
   SET_CLASS_NAME(patch_class, PatchClass);
   SET_CLASS_NAME(function, Function);
@@ -1410,12 +1390,13 @@
   SET_CLASS_NAME(unhandled_exception, UnhandledException);
   SET_CLASS_NAME(unwind_error, UnwindError);
 
-  // Set up names for object array and one byte string class which are
-  // pre-allocated in the vm isolate also.
+  // Set up names for classes which are also pre-allocated in the vm isolate.
   cls = isolate->object_store()->array_class();
   cls.set_name(Symbols::_List());
   cls = isolate->object_store()->one_byte_string_class();
   cls.set_name(Symbols::OneByteString());
+  cls = isolate->object_store()->never_class();
+  cls.set_name(Symbols::Never());
 
   // Set up names for the pseudo-classes for free list elements and forwarding
   // corpses. Mainly this makes VM debugging easier.
@@ -1437,62 +1418,62 @@
   }
 }
 
-void Object::FinalizeReadOnlyObject(RawObject* object) {
+void Object::FinalizeReadOnlyObject(ObjectPtr object) {
   NoSafepointScope no_safepoint;
   intptr_t cid = object->GetClassId();
   if (cid == kOneByteStringCid) {
-    RawOneByteString* str = static_cast<RawOneByteString*>(object);
+    OneByteStringPtr str = static_cast<OneByteStringPtr>(object);
     if (String::GetCachedHash(str) == 0) {
       intptr_t hash = String::Hash(str);
       String::SetCachedHash(str, hash);
     }
     intptr_t size = OneByteString::UnroundedSize(str);
-    ASSERT(size <= str->HeapSize());
-    memset(reinterpret_cast<void*>(RawObject::ToAddr(str) + size), 0,
-           str->HeapSize() - size);
+    ASSERT(size <= str->ptr()->HeapSize());
+    memset(reinterpret_cast<void*>(ObjectLayout::ToAddr(str) + size), 0,
+           str->ptr()->HeapSize() - size);
   } else if (cid == kTwoByteStringCid) {
-    RawTwoByteString* str = static_cast<RawTwoByteString*>(object);
+    TwoByteStringPtr str = static_cast<TwoByteStringPtr>(object);
     if (String::GetCachedHash(str) == 0) {
       intptr_t hash = String::Hash(str);
       String::SetCachedHash(str, hash);
     }
     ASSERT(String::GetCachedHash(str) != 0);
     intptr_t size = TwoByteString::UnroundedSize(str);
-    ASSERT(size <= str->HeapSize());
-    memset(reinterpret_cast<void*>(RawObject::ToAddr(str) + size), 0,
-           str->HeapSize() - size);
+    ASSERT(size <= str->ptr()->HeapSize());
+    memset(reinterpret_cast<void*>(ObjectLayout::ToAddr(str) + size), 0,
+           str->ptr()->HeapSize() - size);
   } else if (cid == kExternalOneByteStringCid) {
-    RawExternalOneByteString* str =
-        static_cast<RawExternalOneByteString*>(object);
+    ExternalOneByteStringPtr str =
+        static_cast<ExternalOneByteStringPtr>(object);
     if (String::GetCachedHash(str) == 0) {
       intptr_t hash = String::Hash(str);
       String::SetCachedHash(str, hash);
     }
   } else if (cid == kExternalTwoByteStringCid) {
-    RawExternalTwoByteString* str =
-        static_cast<RawExternalTwoByteString*>(object);
+    ExternalTwoByteStringPtr str =
+        static_cast<ExternalTwoByteStringPtr>(object);
     if (String::GetCachedHash(str) == 0) {
       intptr_t hash = String::Hash(str);
       String::SetCachedHash(str, hash);
     }
   } else if (cid == kCodeSourceMapCid) {
-    RawCodeSourceMap* map = CodeSourceMap::RawCast(object);
+    CodeSourceMapPtr map = CodeSourceMap::RawCast(object);
     intptr_t size = CodeSourceMap::UnroundedSize(map);
-    ASSERT(size <= map->HeapSize());
-    memset(reinterpret_cast<void*>(RawObject::ToAddr(map) + size), 0,
-           map->HeapSize() - size);
+    ASSERT(size <= map->ptr()->HeapSize());
+    memset(reinterpret_cast<void*>(ObjectLayout::ToAddr(map) + size), 0,
+           map->ptr()->HeapSize() - size);
   } else if (cid == kCompressedStackMapsCid) {
-    RawCompressedStackMaps* maps = CompressedStackMaps::RawCast(object);
+    CompressedStackMapsPtr maps = CompressedStackMaps::RawCast(object);
     intptr_t size = CompressedStackMaps::UnroundedSize(maps);
-    ASSERT(size <= maps->HeapSize());
-    memset(reinterpret_cast<void*>(RawObject::ToAddr(maps) + size), 0,
-           maps->HeapSize() - size);
+    ASSERT(size <= maps->ptr()->HeapSize());
+    memset(reinterpret_cast<void*>(ObjectLayout::ToAddr(maps) + size), 0,
+           maps->ptr()->HeapSize() - size);
   } else if (cid == kPcDescriptorsCid) {
-    RawPcDescriptors* desc = PcDescriptors::RawCast(object);
+    PcDescriptorsPtr desc = PcDescriptors::RawCast(object);
     intptr_t size = PcDescriptors::UnroundedSize(desc);
-    ASSERT(size <= desc->HeapSize());
-    memset(reinterpret_cast<void*>(RawObject::ToAddr(desc) + size), 0,
-           desc->HeapSize() - size);
+    ASSERT(size <= desc->ptr()->HeapSize());
+    memset(reinterpret_cast<void*>(ObjectLayout::ToAddr(desc) + size), 0,
+           desc->ptr()->HeapSize() - size);
   }
 }
 
@@ -1514,18 +1495,19 @@
   if (original_size > used_size) {
     intptr_t leftover_size = original_size - used_size;
 
-    uword addr = RawObject::ToAddr(obj.raw()) + used_size;
+    uword addr = ObjectLayout::ToAddr(obj.raw()) + used_size;
     if (leftover_size >= TypedData::InstanceSize(0)) {
       // Update the leftover space as a TypedDataInt8Array object.
-      RawTypedData* raw =
-          reinterpret_cast<RawTypedData*>(RawObject::FromAddr(addr));
-      uword new_tags = RawObject::ClassIdTag::update(kTypedDataInt8ArrayCid, 0);
-      new_tags = RawObject::SizeTag::update(leftover_size, new_tags);
+      TypedDataPtr raw =
+          static_cast<TypedDataPtr>(ObjectLayout::FromAddr(addr));
+      uword new_tags =
+          ObjectLayout::ClassIdTag::update(kTypedDataInt8ArrayCid, 0);
+      new_tags = ObjectLayout::SizeTag::update(leftover_size, new_tags);
       const bool is_old = obj.raw()->IsOldObject();
-      new_tags = RawObject::OldBit::update(is_old, new_tags);
-      new_tags = RawObject::OldAndNotMarkedBit::update(is_old, new_tags);
-      new_tags = RawObject::OldAndNotRememberedBit::update(is_old, new_tags);
-      new_tags = RawObject::NewBit::update(!is_old, new_tags);
+      new_tags = ObjectLayout::OldBit::update(is_old, new_tags);
+      new_tags = ObjectLayout::OldAndNotMarkedBit::update(is_old, new_tags);
+      new_tags = ObjectLayout::OldAndNotRememberedBit::update(is_old, new_tags);
+      new_tags = ObjectLayout::NewBit::update(!is_old, new_tags);
       // On architectures with a relaxed memory model, the concurrent marker may
       // observe the write of the filler object's header before observing the
       // new array length, and so treat it as a pointer. Ensure it is a Smi so
@@ -1542,19 +1524,19 @@
 
       intptr_t leftover_len = (leftover_size - TypedData::InstanceSize(0));
       ASSERT(TypedData::InstanceSize(leftover_len) == leftover_size);
-      raw->StoreSmi(&(raw->ptr()->length_), Smi::New(leftover_len));
-      raw->RecomputeDataField();
+      raw->ptr()->StoreSmi(&(raw->ptr()->length_), Smi::New(leftover_len));
+      raw->ptr()->RecomputeDataField();
     } else {
       // Update the leftover space as a basic object.
       ASSERT(leftover_size == Object::InstanceSize());
-      RawObject* raw = reinterpret_cast<RawObject*>(RawObject::FromAddr(addr));
-      uword new_tags = RawObject::ClassIdTag::update(kInstanceCid, 0);
-      new_tags = RawObject::SizeTag::update(leftover_size, new_tags);
+      ObjectPtr raw = static_cast<ObjectPtr>(ObjectLayout::FromAddr(addr));
+      uword new_tags = ObjectLayout::ClassIdTag::update(kInstanceCid, 0);
+      new_tags = ObjectLayout::SizeTag::update(leftover_size, new_tags);
       const bool is_old = obj.raw()->IsOldObject();
-      new_tags = RawObject::OldBit::update(is_old, new_tags);
-      new_tags = RawObject::OldAndNotMarkedBit::update(is_old, new_tags);
-      new_tags = RawObject::OldAndNotRememberedBit::update(is_old, new_tags);
-      new_tags = RawObject::NewBit::update(!is_old, new_tags);
+      new_tags = ObjectLayout::OldBit::update(is_old, new_tags);
+      new_tags = ObjectLayout::OldAndNotMarkedBit::update(is_old, new_tags);
+      new_tags = ObjectLayout::OldAndNotRememberedBit::update(is_old, new_tags);
+      new_tags = ObjectLayout::NewBit::update(!is_old, new_tags);
       // On architectures with a relaxed memory model, the concurrent marker may
       // observe the write of the filler object's header before observing the
       // new array length, and so treat it as a pointer. Ensure it is a Smi so
@@ -1616,9 +1598,9 @@
 //
 // A non-NULL kernel argument indicates (1).
 // A NULL kernel indicates (2) or (3).
-RawError* Object::Init(Isolate* isolate,
-                       const uint8_t* kernel_buffer,
-                       intptr_t kernel_buffer_size) {
+ErrorPtr Object::Init(Isolate* isolate,
+                      const uint8_t* kernel_buffer,
+                      intptr_t kernel_buffer_size) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   ASSERT(isolate == thread->isolate());
@@ -1852,6 +1834,14 @@
     RegisterClass(cls, Symbols::Null(), core_lib);
     pending_classes.Add(cls);
 
+    cls = Class::New<Instance, RTN::Instance>(kNeverCid, isolate);
+    cls.set_num_type_arguments(0);
+    cls.set_is_finalized();
+    cls.set_is_declaration_loaded();
+    cls.set_is_type_finalized();
+    cls.set_name(Symbols::Never());
+    object_store->set_never_class(cls);
+
     ASSERT(!library_prefix_cls.IsNull());
     RegisterPrivateClass(library_prefix_cls, Symbols::_LibraryPrefix(),
                          core_lib);
@@ -2191,6 +2181,13 @@
     type = object_store->object_type();
     cls.set_super_type(type);
 
+    cls = object_store->never_class();
+    type = Type::New(cls, Object::null_type_arguments(),
+                     TokenPosition::kNoSource, Nullability::kNonNullable);
+    type.SetIsFinalized();
+    type ^= type.Canonicalize();
+    object_store->set_never_type(type);
+
     // Create and cache commonly used type arguments <int>, <double>,
     // <String>, <String, dynamic> and <String, String>.
     type_args = TypeArguments::New(1);
@@ -2488,6 +2485,9 @@
     cls = Class::New<Instance, RTN::Instance>(kNullCid, isolate);
     object_store->set_null_class(cls);
 
+    cls = Class::New<Instance, RTN::Instance>(kNeverCid, isolate);
+    object_store->set_never_class(cls);
+
     cls = Class::New<Capability, RTN::Capability>(isolate);
     cls = Class::New<ReceivePort, RTN::ReceivePort>(isolate);
     cls = Class::New<SendPort, RTN::SendPort>(isolate);
@@ -2509,16 +2509,16 @@
 
 #if defined(DEBUG)
 bool Object::InVMIsolateHeap() const {
-  if (FLAG_verify_handles && raw()->InVMIsolateHeap()) {
+  if (FLAG_verify_handles && raw()->ptr()->InVMIsolateHeap()) {
     Heap* vm_isolate_heap = Dart::vm_isolate()->heap();
-    uword addr = RawObject::ToAddr(raw());
+    uword addr = ObjectLayout::ToAddr(raw());
     if (!vm_isolate_heap->Contains(addr)) {
       ASSERT(FLAG_write_protect_code);
-      addr = RawObject::ToAddr(HeapPage::ToWritable(raw()));
+      addr = ObjectLayout::ToAddr(HeapPage::ToWritable(raw()));
       ASSERT(vm_isolate_heap->Contains(addr));
     }
   }
-  return raw()->InVMIsolateHeap();
+  return raw()->ptr()->InVMIsolateHeap();
 }
 #endif  // DEBUG
 
@@ -2526,7 +2526,7 @@
   THR_Print("%s\n", ToCString());
 }
 
-RawString* Object::DictionaryName() const {
+StringPtr Object::DictionaryName() const {
   return String::null();
 }
 
@@ -2535,7 +2535,7 @@
   // an 8-byte write from the this loop, but doesn't overwrite that entry with
   // the 4-byte relaxed store of the header below, then reports false data races
   // based on the record of the 8-byte write.
-  uword cur = address + sizeof(RawObject);
+  uword cur = address + sizeof(ObjectLayout);
   uword end = address + size;
   if (class_id == kInstructionsCid) {
     compiler::target::uword initial_value = kBreakInstructionFiller;
@@ -2554,7 +2554,7 @@
       needs_init = Heap::IsAllocatableInNewSpace(size) ||
                    Heap::IsAllocatableViaFreeLists(size);
     } else {
-      initial_value = reinterpret_cast<uword>(null_);
+      initial_value = static_cast<uword>(null_);
       needs_init = true;
     }
     if (needs_init) {
@@ -2575,17 +2575,17 @@
   }
   uint32_t tags = 0;
   ASSERT(class_id != kIllegalCid);
-  tags = RawObject::ClassIdTag::update(class_id, tags);
-  tags = RawObject::SizeTag::update(size, tags);
+  tags = ObjectLayout::ClassIdTag::update(class_id, tags);
+  tags = ObjectLayout::SizeTag::update(size, tags);
   const bool is_old =
       (address & kNewObjectAlignmentOffset) == kOldObjectAlignmentOffset;
-  tags = RawObject::OldBit::update(is_old, tags);
-  tags = RawObject::OldAndNotMarkedBit::update(is_old, tags);
-  tags = RawObject::OldAndNotRememberedBit::update(is_old, tags);
-  tags = RawObject::NewBit::update(!is_old, tags);
-  reinterpret_cast<RawObject*>(address)->tags_ = tags;
+  tags = ObjectLayout::OldBit::update(is_old, tags);
+  tags = ObjectLayout::OldAndNotMarkedBit::update(is_old, tags);
+  tags = ObjectLayout::OldAndNotRememberedBit::update(is_old, tags);
+  tags = ObjectLayout::NewBit::update(!is_old, tags);
+  reinterpret_cast<ObjectLayout*>(address)->tags_ = tags;
 #if defined(HASH_IN_OBJECT_HEADER)
-  reinterpret_cast<RawObject*>(address)->hash_ = 0;
+  reinterpret_cast<ObjectLayout*>(address)->hash_ = 0;
 #endif
 }
 
@@ -2601,10 +2601,10 @@
       Heap* isolate_heap = IsolateGroup::Current()->heap();
       if (!isolate_heap->new_space()->scavenging()) {
         Heap* vm_isolate_heap = Dart::vm_isolate()->heap();
-        uword addr = RawObject::ToAddr(raw_);
+        uword addr = ObjectLayout::ToAddr(raw_);
         if (!isolate_heap->Contains(addr) && !vm_isolate_heap->Contains(addr)) {
           ASSERT(FLAG_write_protect_code);
-          addr = RawObject::ToAddr(HeapPage::ToWritable(raw_));
+          addr = ObjectLayout::ToAddr(HeapPage::ToWritable(raw_));
           ASSERT(isolate_heap->Contains(addr) ||
                  vm_isolate_heap->Contains(addr));
         }
@@ -2614,7 +2614,7 @@
 #endif
 }
 
-RawObject* Object::Allocate(intptr_t cls_id, intptr_t size, Heap::Space space) {
+ObjectPtr Object::Allocate(intptr_t cls_id, intptr_t size, Heap::Space space) {
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   Thread* thread = Thread::Current();
   ASSERT(thread->execution_state() == Thread::kThreadInVM);
@@ -2644,14 +2644,14 @@
 #endif  // !PRODUCT
   NoSafepointScope no_safepoint;
   InitializeObject(address, cls_id, size);
-  RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag);
-  ASSERT(cls_id == RawObject::ClassIdTag::decode(raw_obj->ptr()->tags_));
+  ObjectPtr raw_obj = static_cast<ObjectPtr>(address + kHeapObjectTag);
+  ASSERT(cls_id == ObjectLayout::ClassIdTag::decode(raw_obj->ptr()->tags_));
   if (raw_obj->IsOldObject() && UNLIKELY(thread->is_marking())) {
     // Black allocation. Prevents a data race between the mutator and concurrent
     // marker on ARM and ARM64 (the marker may observe a publishing store of
     // this object before the stores that initialize its slots), and helps the
     // collection to finish sooner.
-    raw_obj->SetMarkBitUnsynchronized();
+    raw_obj->ptr()->SetMarkBitUnsynchronized();
     // Setting the mark bit must not be ordered after a publishing store of this
     // object. Adding a barrier here is cheaper than making every store into the
     // heap a store-release. Compare Scavenger::ScavengePointer.
@@ -2663,26 +2663,26 @@
 
 class WriteBarrierUpdateVisitor : public ObjectPointerVisitor {
  public:
-  explicit WriteBarrierUpdateVisitor(Thread* thread, RawObject* obj)
+  explicit WriteBarrierUpdateVisitor(Thread* thread, ObjectPtr obj)
       : ObjectPointerVisitor(thread->isolate()->group()),
         thread_(thread),
         old_obj_(obj) {
     ASSERT(old_obj_->IsOldObject());
   }
 
-  void VisitPointers(RawObject** from, RawObject** to) {
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
     if (old_obj_->IsArray()) {
-      for (RawObject** slot = from; slot <= to; ++slot) {
-        RawObject* value = *slot;
+      for (ObjectPtr* slot = from; slot <= to; ++slot) {
+        ObjectPtr value = *slot;
         if (value->IsHeapObject()) {
-          old_obj_->CheckArrayPointerStore(slot, value, thread_);
+          old_obj_->ptr()->CheckArrayPointerStore(slot, value, thread_);
         }
       }
     } else {
-      for (RawObject** slot = from; slot <= to; ++slot) {
-        RawObject* value = *slot;
+      for (ObjectPtr* slot = from; slot <= to; ++slot) {
+        ObjectPtr value = *slot;
         if (value->IsHeapObject()) {
-          old_obj_->CheckHeapPointerStore(value, thread_);
+          old_obj_->ptr()->CheckHeapPointerStore(value, thread_);
         }
       }
     }
@@ -2690,7 +2690,7 @@
 
  private:
   Thread* thread_;
-  RawObject* old_obj_;
+  ObjectPtr old_obj_;
 
   DISALLOW_COPY_AND_ASSIGN(WriteBarrierUpdateVisitor);
 };
@@ -2703,15 +2703,15 @@
   return (IsZoneHandle() || IsReadOnlyHandle());
 }
 
-RawObject* Object::Clone(const Object& orig, Heap::Space space) {
+ObjectPtr Object::Clone(const Object& orig, Heap::Space space) {
   const Class& cls = Class::Handle(orig.clazz());
-  intptr_t size = orig.raw()->HeapSize();
-  RawObject* raw_clone = Object::Allocate(cls.id(), size, space);
+  intptr_t size = orig.raw()->ptr()->HeapSize();
+  ObjectPtr raw_clone = Object::Allocate(cls.id(), size, space);
   NoSafepointScope no_safepoint;
   // Copy the body of the original into the clone.
-  uword orig_addr = RawObject::ToAddr(orig.raw());
-  uword clone_addr = RawObject::ToAddr(raw_clone);
-  static const intptr_t kHeaderSizeInBytes = sizeof(RawObject);
+  uword orig_addr = ObjectLayout::ToAddr(orig.raw());
+  uword clone_addr = ObjectLayout::ToAddr(raw_clone);
+  static const intptr_t kHeaderSizeInBytes = sizeof(ObjectLayout);
   memmove(reinterpret_cast<uint8_t*>(clone_addr + kHeaderSizeInBytes),
           reinterpret_cast<uint8_t*>(orig_addr + kHeaderSizeInBytes),
           size - kHeaderSizeInBytes);
@@ -2722,15 +2722,15 @@
     return raw_clone;
   }
   WriteBarrierUpdateVisitor visitor(Thread::Current(), raw_clone);
-  raw_clone->VisitPointers(&visitor);
+  raw_clone->ptr()->VisitPointers(&visitor);
   return raw_clone;
 }
 
-RawString* Class::Name() const {
+StringPtr Class::Name() const {
   return raw_ptr()->name_;
 }
 
-RawString* Class::ScrubbedName() const {
+StringPtr Class::ScrubbedName() const {
   return Symbols::New(Thread::Current(), ScrubbedNameCString());
 }
 
@@ -2738,7 +2738,7 @@
   return String::ScrubName(String::Handle(Name()));
 }
 
-RawString* Class::UserVisibleName() const {
+StringPtr Class::UserVisibleName() const {
 #if !defined(PRODUCT)
   ASSERT(raw_ptr()->user_name_ != String::null());
   return raw_ptr()->user_name_;
@@ -2755,7 +2755,7 @@
   return GenerateUserVisibleName();  // No caching in PRODUCT, regenerate.
 }
 
-RawClass* Class::Mixin() const {
+ClassPtr Class::Mixin() const {
   if (is_transformed_mixin_application()) {
     const Array& interfaces = Array::Handle(this->interfaces());
     const Type& mixin_type =
@@ -2771,11 +2771,11 @@
 
 bool Class::IsInFullSnapshot() const {
   NoSafepointScope no_safepoint;
-  return RawLibrary::InFullSnapshotBit::decode(
+  return LibraryLayout::InFullSnapshotBit::decode(
       raw_ptr()->library_->ptr()->flags_);
 }
 
-RawAbstractType* Class::RareType() const {
+AbstractTypePtr Class::RareType() const {
   if (!IsGeneric() && !IsClosureClass() && !IsTypedefClass()) {
     return DeclarationType();
   }
@@ -2788,11 +2788,11 @@
 }
 
 template <class FakeObject, class TargetFakeObject>
-RawClass* Class::New(Isolate* isolate, bool register_class) {
+ClassPtr Class::New(Isolate* isolate, bool register_class) {
   ASSERT(Object::class_class() != Class::null());
   Class& result = Class::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Class::kClassId, Class::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -2869,7 +2869,7 @@
                Object::empty_array().raw());
 }
 
-RawArray* Class::OffsetToFieldMap(bool original_classes) const {
+ArrayPtr Class::OffsetToFieldMap(bool original_classes) const {
   Array& array = Array::Handle(raw_ptr()->offset_in_words_to_field_);
   if (array.IsNull()) {
     ASSERT(is_finalized());
@@ -2999,7 +2999,7 @@
   }
 }
 
-RawFunction* Class::FunctionFromIndex(intptr_t idx) const {
+FunctionPtr Class::FunctionFromIndex(intptr_t idx) const {
   const Array& funcs = Array::Handle(functions());
   if ((idx < 0) || (idx >= funcs.Length())) {
     return Function::null();
@@ -3010,7 +3010,7 @@
   return func.raw();
 }
 
-RawFunction* Class::ImplicitClosureFunctionFromIndex(intptr_t idx) const {
+FunctionPtr Class::ImplicitClosureFunctionFromIndex(intptr_t idx) const {
   const Array& funcs = Array::Handle(functions());
   if ((idx < 0) || (idx >= funcs.Length())) {
     return Function::null();
@@ -3082,7 +3082,7 @@
   return -1;
 }
 
-RawFunction* Class::InvocationDispatcherFunctionFromIndex(intptr_t idx) const {
+FunctionPtr Class::InvocationDispatcherFunctionFromIndex(intptr_t idx) const {
   Thread* thread = Thread::Current();
   REUSABLE_ARRAY_HANDLESCOPE(thread);
   REUSABLE_OBJECT_HANDLESCOPE(thread);
@@ -3217,7 +3217,7 @@
   return num_type_args;
 }
 
-RawClass* Class::SuperClass(bool original_classes) const {
+ClassPtr Class::SuperClass(bool original_classes) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -3242,7 +3242,7 @@
   StorePointer(&raw_ptr()->super_type_, value.raw());
 }
 
-RawTypeParameter* Class::LookupTypeParameter(const String& type_name) const {
+TypeParameterPtr Class::LookupTypeParameter(const String& type_name) const {
   ASSERT(!type_name.IsNull());
   Thread* thread = Thread::Current();
   REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread);
@@ -3336,17 +3336,17 @@
         intptr_t field_size;
         switch (field.guarded_cid()) {
           case kDoubleCid:
-            field_size = sizeof(RawDouble::value_);
+            field_size = sizeof(DoubleLayout::value_);
             break;
           case kFloat32x4Cid:
-            field_size = sizeof(RawFloat32x4::value_);
+            field_size = sizeof(Float32x4Layout::value_);
             break;
           case kFloat64x2Cid:
-            field_size = sizeof(RawFloat64x2::value_);
+            field_size = sizeof(Float64x2Layout::value_);
             break;
           default:
             if (field.is_non_nullable_integer()) {
-              field_size = sizeof(RawMint::value_);
+              field_size = sizeof(MintLayout::value_);
             } else {
               UNREACHABLE();
               field_size = 0;
@@ -3420,13 +3420,13 @@
   entry.Set<Class::kInvocationDispatcherFunction>(dispatcher);
 }
 
-RawFunction* Class::GetInvocationDispatcher(const String& target_name,
-                                            const Array& args_desc,
-                                            RawFunction::Kind kind,
-                                            bool create_if_absent) const {
-  ASSERT(kind == RawFunction::kNoSuchMethodDispatcher ||
-         kind == RawFunction::kInvokeFieldDispatcher ||
-         kind == RawFunction::kDynamicInvocationForwarder);
+FunctionPtr Class::GetInvocationDispatcher(const String& target_name,
+                                           const Array& args_desc,
+                                           FunctionLayout::Kind kind,
+                                           bool create_if_absent) const {
+  ASSERT(kind == FunctionLayout::kNoSuchMethodDispatcher ||
+         kind == FunctionLayout::kInvokeFieldDispatcher ||
+         kind == FunctionLayout::kDynamicInvocationForwarder);
   auto Z = Thread::Current()->zone();
   auto& function = Function::Handle(Z);
   auto& name = String::Handle(Z);
@@ -3454,9 +3454,9 @@
   return function.raw();
 }
 
-RawFunction* Class::CreateInvocationDispatcher(const String& target_name,
-                                               const Array& args_desc,
-                                               RawFunction::Kind kind) const {
+FunctionPtr Class::CreateInvocationDispatcher(const String& target_name,
+                                              const Array& args_desc,
+                                              FunctionLayout::Kind kind) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Function& invocation = Function::Handle(
@@ -3519,7 +3519,7 @@
 // does not have a getter called M but has a method called M then an extractor
 // is created and injected as a getter (under the name get:M) into the class
 // owning method M.
-RawFunction* Function::CreateMethodExtractor(const String& getter_name) const {
+FunctionPtr Function::CreateMethodExtractor(const String& getter_name) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   ASSERT(Field::IsGetterName(getter_name));
@@ -3530,7 +3530,7 @@
   Function& extractor = Function::Handle(
       zone,
       Function::New(String::Handle(zone, Symbols::New(thread, getter_name)),
-                    RawFunction::kMethodExtractor,
+                    FunctionLayout::kMethodExtractor,
                     false,  // Not static.
                     false,  // Not const.
                     is_abstract(),
@@ -3557,7 +3557,7 @@
   return extractor.raw();
 }
 
-RawFunction* Function::GetMethodExtractor(const String& getter_name) const {
+FunctionPtr Function::GetMethodExtractor(const String& getter_name) const {
   ASSERT(Field::IsGetterName(getter_name));
   const Function& closure_function =
       Function::Handle(ImplicitClosureFunction());
@@ -3566,7 +3566,7 @@
   if (result.IsNull()) {
     result = CreateMethodExtractor(getter_name);
   }
-  ASSERT(result.kind() == RawFunction::kMethodExtractor);
+  ASSERT(result.kind() == FunctionLayout::kMethodExtractor);
   return result.raw();
 }
 
@@ -3637,8 +3637,7 @@
   return name.StartsWith(Symbols::DynamicPrefix());
 }
 
-RawString* Function::DemangleDynamicInvocationForwarderName(
-    const String& name) {
+StringPtr Function::DemangleDynamicInvocationForwarderName(const String& name) {
   const intptr_t kDynamicPrefixLength = 4;  // "dyn:"
   ASSERT(Symbols::DynamicPrefix().Length() == kDynamicPrefixLength);
   return Symbols::New(Thread::Current(), name, kDynamicPrefixLength,
@@ -3646,7 +3645,7 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-RawFunction* Function::CreateDynamicInvocationForwarder(
+FunctionPtr Function::CreateDynamicInvocationForwarder(
     const String& mangled_name) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -3660,7 +3659,7 @@
   forwarder.set_is_native(false);
   // TODO(dartbug.com/37737): Currently, we intentionally keep the recognized
   // kind when creating the dynamic invocation forwarder.
-  forwarder.set_kind(RawFunction::kDynamicInvocationForwarder);
+  forwarder.set_kind(FunctionLayout::kDynamicInvocationForwarder);
   forwarder.set_is_debuggable(false);
 
   // TODO(vegorov) for error reporting reasons it is better to make this
@@ -3687,18 +3686,18 @@
   return forwarder.raw();
 }
 
-RawString* Function::CreateDynamicInvocationForwarderName(const String& name) {
+StringPtr Function::CreateDynamicInvocationForwarderName(const String& name) {
   return Symbols::FromConcat(Thread::Current(), Symbols::DynamicPrefix(), name);
 }
 
-RawFunction* Function::GetDynamicInvocationForwarder(
+FunctionPtr Function::GetDynamicInvocationForwarder(
     const String& mangled_name,
     bool allow_add /* = true */) const {
   ASSERT(IsDynamicInvocationForwarderName(mangled_name));
   const Class& owner = Class::Handle(Owner());
   Function& result = Function::Handle(owner.GetInvocationDispatcher(
       mangled_name, Array::null_array(),
-      RawFunction::kDynamicInvocationForwarder, /*create_if_absent=*/false));
+      FunctionLayout::kDynamicInvocationForwarder, /*create_if_absent=*/false));
 
   if (!result.IsNull()) {
     return result.raw();
@@ -3736,7 +3735,7 @@
   return subtype->IsSubtypeOf(*supertype, Heap::kOld);
 }
 
-RawArray* Class::invocation_dispatcher_cache() const {
+ArrayPtr Class::invocation_dispatcher_cache() const {
   return raw_ptr()->invocation_dispatcher_cache_;
 }
 
@@ -3886,12 +3885,12 @@
 //   i.e., klass.RareType().
 // * For throwing a NSM in a library, we just pass the null instance as
 //   receiver.
-static RawObject* ThrowNoSuchMethod(const Instance& receiver,
-                                    const String& function_name,
-                                    const Array& arguments,
-                                    const Array& argument_names,
-                                    const InvocationMirror::Level level,
-                                    const InvocationMirror::Kind kind) {
+static ObjectPtr ThrowNoSuchMethod(const Instance& receiver,
+                                   const String& function_name,
+                                   const Array& arguments,
+                                   const Array& argument_names,
+                                   const InvocationMirror::Level level,
+                                   const InvocationMirror::Kind kind) {
   const Smi& invocation_type =
       Smi::Handle(Smi::New(InvocationMirror::EncodeType(level, kind)));
 
@@ -3912,10 +3911,10 @@
   return DartEntry::InvokeFunction(throwNew, args);
 }
 
-static RawObject* ThrowTypeError(const TokenPosition token_pos,
-                                 const Instance& src_value,
-                                 const AbstractType& dst_type,
-                                 const String& dst_name) {
+static ObjectPtr ThrowTypeError(const TokenPosition token_pos,
+                                const Instance& src_value,
+                                const AbstractType& dst_type,
+                                const String& dst_name) {
   const Array& args = Array::Handle(Array::New(4));
   const Smi& pos = Smi::Handle(Smi::New(token_pos.value()));
   args.SetAt(0, pos);
@@ -3931,10 +3930,10 @@
   return DartEntry::InvokeFunction(throwNew, args);
 }
 
-RawObject* Class::InvokeGetter(const String& getter_name,
-                               bool throw_nsm_if_absent,
-                               bool respect_reflectable,
-                               bool check_is_entrypoint) const {
+ObjectPtr Class::InvokeGetter(const String& getter_name,
+                              bool throw_nsm_if_absent,
+                              bool respect_reflectable,
+                              bool check_is_entrypoint) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -3991,10 +3990,10 @@
   return field.StaticValue();
 }
 
-RawObject* Class::InvokeSetter(const String& setter_name,
-                               const Instance& value,
-                               bool respect_reflectable,
-                               bool check_is_entrypoint) const {
+ObjectPtr Class::InvokeSetter(const String& setter_name,
+                              const Instance& value,
+                              bool respect_reflectable,
+                              bool check_is_entrypoint) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -4060,11 +4059,11 @@
   return value.raw();
 }
 
-RawObject* Class::Invoke(const String& function_name,
-                         const Array& args,
-                         const Array& arg_names,
-                         bool respect_reflectable,
-                         bool check_is_entrypoint) const {
+ObjectPtr Class::Invoke(const String& function_name,
+                        const Array& args,
+                        const Array& arg_names,
+                        bool respect_reflectable,
+                        bool check_is_entrypoint) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -4115,7 +4114,7 @@
         AbstractType::Handle(zone, RareType()), function_name, args, arg_names,
         InvocationMirror::kStatic, InvocationMirror::kMethod);
   }
-  RawObject* type_error =
+  ObjectPtr type_error =
       function.DoArgumentTypesMatch(args, args_descriptor, type_args);
   if (type_error != Error::null()) {
     return type_error;
@@ -4123,7 +4122,7 @@
   return DartEntry::InvokeFunction(function, args, args_descriptor_array);
 }
 
-static RawObject* EvaluateCompiledExpressionHelper(
+static ObjectPtr EvaluateCompiledExpressionHelper(
     const ExternalTypedData& kernel_buffer,
     const Array& type_definitions,
     const String& library_url,
@@ -4131,7 +4130,7 @@
     const Array& arguments,
     const TypeArguments& type_arguments);
 
-RawObject* Class::EvaluateCompiledExpression(
+ObjectPtr Class::EvaluateCompiledExpression(
     const ExternalTypedData& kernel_buffer,
     const Array& type_definitions,
     const Array& arguments,
@@ -4169,7 +4168,7 @@
 }
 
 // Ensure that top level parsing of the class has been done.
-RawError* Class::EnsureIsFinalized(Thread* thread) const {
+ErrorPtr Class::EnsureIsFinalized(Thread* thread) const {
   ASSERT(!IsNull());
   // Finalized classes have already been parsed.
   if (is_finalized()) {
@@ -4275,11 +4274,11 @@
 }
 
 template <class FakeInstance, class TargetFakeInstance>
-RawClass* Class::NewCommon(intptr_t index) {
+ClassPtr Class::NewCommon(intptr_t index) {
   ASSERT(Object::class_class() != Class::null());
   Class& result = Class::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Class::kClassId, Class::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -4311,10 +4310,10 @@
 }
 
 template <class FakeInstance, class TargetFakeInstance>
-RawClass* Class::New(intptr_t index,
-                     Isolate* isolate,
-                     bool register_class,
-                     bool is_abstract) {
+ClassPtr Class::New(intptr_t index,
+                    Isolate* isolate,
+                    bool register_class,
+                    bool is_abstract) {
   Class& result =
       Class::Handle(NewCommon<FakeInstance, TargetFakeInstance>(index));
   if (is_abstract) {
@@ -4326,11 +4325,11 @@
   return result.raw();
 }
 
-RawClass* Class::New(const Library& lib,
-                     const String& name,
-                     const Script& script,
-                     TokenPosition token_pos,
-                     bool register_class) {
+ClassPtr Class::New(const Library& lib,
+                    const String& name,
+                    const Script& script,
+                    TokenPosition token_pos,
+                    bool register_class) {
   Class& result =
       Class::Handle(NewCommon<Instance, RTN::Instance>(kIllegalCid));
   result.set_library(lib);
@@ -4349,13 +4348,13 @@
   return result.raw();
 }
 
-RawClass* Class::NewInstanceClass() {
+ClassPtr Class::NewInstanceClass() {
   return Class::New<Instance, RTN::Instance>(kIllegalCid, Isolate::Current());
 }
 
-RawClass* Class::NewNativeWrapper(const Library& library,
-                                  const String& name,
-                                  int field_count) {
+ClassPtr Class::NewNativeWrapper(const Library& library,
+                                 const String& name,
+                                 int field_count) {
   Class& cls = Class::Handle(library.LookupClass(name));
   if (cls.IsNull()) {
     cls = New(library, name, Script::Handle(), TokenPosition::kNoSource);
@@ -4365,14 +4364,14 @@
     cls.set_super_type(Type::Handle(Type::ObjectType()));
     // Compute instance size. First word contains a pointer to a properly
     // sized typed array once the first native field has been set.
-    const intptr_t host_instance_size = sizeof(RawInstance) + kWordSize;
+    const intptr_t host_instance_size = sizeof(InstanceLayout) + kWordSize;
 #if defined(PRECOMPILER)
     const intptr_t target_instance_size =
         compiler::target::Instance::InstanceSize() +
         compiler::target::kWordSize;
 #else
     const intptr_t target_instance_size =
-        sizeof(RawInstance) + compiler::target::kWordSize;
+        sizeof(InstanceLayout) + compiler::target::kWordSize;
 #endif
     cls.set_instance_size(
         RoundedAllocationSize(host_instance_size),
@@ -4390,7 +4389,7 @@
   }
 }
 
-RawClass* Class::NewStringClass(intptr_t class_id, Isolate* isolate) {
+ClassPtr Class::NewStringClass(intptr_t class_id, Isolate* isolate) {
   intptr_t host_instance_size, target_instance_size;
   if (class_id == kOneByteStringCid) {
     host_instance_size = OneByteString::InstanceSize();
@@ -4423,7 +4422,7 @@
   return result.raw();
 }
 
-RawClass* Class::NewTypedDataClass(intptr_t class_id, Isolate* isolate) {
+ClassPtr Class::NewTypedDataClass(intptr_t class_id, Isolate* isolate) {
   ASSERT(IsTypedDataClassId(class_id));
   const intptr_t host_instance_size = TypedData::InstanceSize();
   const intptr_t target_instance_size =
@@ -4441,7 +4440,7 @@
   return result.raw();
 }
 
-RawClass* Class::NewTypedDataViewClass(intptr_t class_id, Isolate* isolate) {
+ClassPtr Class::NewTypedDataViewClass(intptr_t class_id, Isolate* isolate) {
   ASSERT(IsTypedDataViewClassId(class_id));
   const intptr_t host_instance_size = TypedDataView::InstanceSize();
   const intptr_t target_instance_size = compiler::target::RoundedAllocationSize(
@@ -4460,8 +4459,7 @@
   return result.raw();
 }
 
-RawClass* Class::NewExternalTypedDataClass(intptr_t class_id,
-                                           Isolate* isolate) {
+ClassPtr Class::NewExternalTypedDataClass(intptr_t class_id, Isolate* isolate) {
   ASSERT(IsExternalTypedDataClassId(class_id));
   const intptr_t host_instance_size = ExternalTypedData::InstanceSize();
   const intptr_t target_instance_size = compiler::target::RoundedAllocationSize(
@@ -4480,7 +4478,7 @@
   return result.raw();
 }
 
-RawClass* Class::NewPointerClass(intptr_t class_id, Isolate* isolate) {
+ClassPtr Class::NewPointerClass(intptr_t class_id, Isolate* isolate) {
   ASSERT(IsFfiPointerClassId(class_id));
   intptr_t host_instance_size = Pointer::InstanceSize();
   intptr_t target_instance_size =
@@ -4721,14 +4719,14 @@
 
 void Class::set_is_declaration_loaded() const {
   ASSERT(!is_declaration_loaded());
-  set_state_bits(ClassLoadingBits::update(RawClass::kDeclarationLoaded,
+  set_state_bits(ClassLoadingBits::update(ClassLayout::kDeclarationLoaded,
                                           raw_ptr()->state_bits_));
 }
 
 void Class::set_is_type_finalized() const {
   ASSERT(is_declaration_loaded());
   ASSERT(!is_type_finalized());
-  set_state_bits(ClassLoadingBits::update(RawClass::kTypeFinalized,
+  set_state_bits(ClassLoadingBits::update(ClassLayout::kTypeFinalized,
                                           raw_ptr()->state_bits_));
 }
 
@@ -4767,13 +4765,13 @@
 
 void Class::set_is_finalized() const {
   ASSERT(!is_finalized());
-  set_state_bits(
-      ClassFinalizedBits::update(RawClass::kFinalized, raw_ptr()->state_bits_));
+  set_state_bits(ClassFinalizedBits::update(ClassLayout::kFinalized,
+                                            raw_ptr()->state_bits_));
 }
 
 void Class::set_is_prefinalized() const {
   ASSERT(!is_finalized());
-  set_state_bits(ClassFinalizedBits::update(RawClass::kPreFinalized,
+  set_state_bits(ClassFinalizedBits::update(ClassLayout::kPreFinalized,
                                             raw_ptr()->state_bits_));
 }
 
@@ -4835,7 +4833,7 @@
   StorePointer(&raw_ptr()->direct_subclasses_, GrowableObjectArray::null());
 }
 
-RawArray* Class::constants() const {
+ArrayPtr Class::constants() const {
   return raw_ptr()->constants_;
 }
 
@@ -4859,7 +4857,7 @@
   StorePointer(&raw_ptr()->declaration_type_, value.raw());
 }
 
-RawType* Class::DeclarationType() const {
+TypePtr Class::DeclarationType() const {
   ASSERT(is_declaration_loaded());
   if (IsNullClass()) {
     return Type::NullType();
@@ -5099,49 +5097,48 @@
   return Library::IsPrivate(String::Handle(Name()));
 }
 
-RawFunction* Class::LookupDynamicFunction(const String& name) const {
+FunctionPtr Class::LookupDynamicFunction(const String& name) const {
   return LookupFunction(name, kInstance);
 }
 
-RawFunction* Class::LookupDynamicFunctionAllowAbstract(
+FunctionPtr Class::LookupDynamicFunctionAllowAbstract(
     const String& name) const {
   return LookupFunction(name, kInstanceAllowAbstract);
 }
 
-RawFunction* Class::LookupDynamicFunctionAllowPrivate(
-    const String& name) const {
+FunctionPtr Class::LookupDynamicFunctionAllowPrivate(const String& name) const {
   return LookupFunctionAllowPrivate(name, kInstance);
 }
 
-RawFunction* Class::LookupStaticFunction(const String& name) const {
+FunctionPtr Class::LookupStaticFunction(const String& name) const {
   return LookupFunction(name, kStatic);
 }
 
-RawFunction* Class::LookupStaticFunctionAllowPrivate(const String& name) const {
+FunctionPtr Class::LookupStaticFunctionAllowPrivate(const String& name) const {
   return LookupFunctionAllowPrivate(name, kStatic);
 }
 
-RawFunction* Class::LookupConstructor(const String& name) const {
+FunctionPtr Class::LookupConstructor(const String& name) const {
   return LookupFunction(name, kConstructor);
 }
 
-RawFunction* Class::LookupConstructorAllowPrivate(const String& name) const {
+FunctionPtr Class::LookupConstructorAllowPrivate(const String& name) const {
   return LookupFunctionAllowPrivate(name, kConstructor);
 }
 
-RawFunction* Class::LookupFactory(const String& name) const {
+FunctionPtr Class::LookupFactory(const String& name) const {
   return LookupFunction(name, kFactory);
 }
 
-RawFunction* Class::LookupFactoryAllowPrivate(const String& name) const {
+FunctionPtr Class::LookupFactoryAllowPrivate(const String& name) const {
   return LookupFunctionAllowPrivate(name, kFactory);
 }
 
-RawFunction* Class::LookupFunction(const String& name) const {
+FunctionPtr Class::LookupFunction(const String& name) const {
   return LookupFunction(name, kAny);
 }
 
-RawFunction* Class::LookupFunctionAllowPrivate(const String& name) const {
+FunctionPtr Class::LookupFunctionAllowPrivate(const String& name) const {
   return LookupFunctionAllowPrivate(name, kAny);
 }
 
@@ -5169,7 +5166,7 @@
   return true;
 }
 
-RawFunction* Class::CheckFunctionType(const Function& func, MemberKind kind) {
+FunctionPtr Class::CheckFunctionType(const Function& func, MemberKind kind) {
   if ((kind == kInstance) || (kind == kInstanceAllowAbstract)) {
     if (func.IsDynamicFunction(kind == kInstanceAllowAbstract)) {
       return func.raw();
@@ -5194,7 +5191,7 @@
   return Function::null();
 }
 
-RawFunction* Class::LookupFunction(const String& name, MemberKind kind) const {
+FunctionPtr Class::LookupFunction(const String& name, MemberKind kind) const {
   ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   if (EnsureIsFinalized(thread) != Error::null()) {
@@ -5245,8 +5242,8 @@
   return Function::null();
 }
 
-RawFunction* Class::LookupFunctionAllowPrivate(const String& name,
-                                               MemberKind kind) const {
+FunctionPtr Class::LookupFunctionAllowPrivate(const String& name,
+                                              MemberKind kind) const {
   ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   if (EnsureIsFinalized(thread) != Error::null()) {
@@ -5272,17 +5269,17 @@
   return Function::null();
 }
 
-RawFunction* Class::LookupGetterFunction(const String& name) const {
+FunctionPtr Class::LookupGetterFunction(const String& name) const {
   return LookupAccessorFunction(kGetterPrefix, kGetterPrefixLength, name);
 }
 
-RawFunction* Class::LookupSetterFunction(const String& name) const {
+FunctionPtr Class::LookupSetterFunction(const String& name) const {
   return LookupAccessorFunction(kSetterPrefix, kSetterPrefixLength, name);
 }
 
-RawFunction* Class::LookupAccessorFunction(const char* prefix,
-                                           intptr_t prefix_length,
-                                           const String& name) const {
+FunctionPtr Class::LookupAccessorFunction(const char* prefix,
+                                          intptr_t prefix_length,
+                                          const String& name) const {
   ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   if (EnsureIsFinalized(thread) != Error::null()) {
@@ -5308,19 +5305,19 @@
   return Function::null();
 }
 
-RawField* Class::LookupInstanceField(const String& name) const {
+FieldPtr Class::LookupInstanceField(const String& name) const {
   return LookupField(name, kInstance);
 }
 
-RawField* Class::LookupStaticField(const String& name) const {
+FieldPtr Class::LookupStaticField(const String& name) const {
   return LookupField(name, kStatic);
 }
 
-RawField* Class::LookupField(const String& name) const {
+FieldPtr Class::LookupField(const String& name) const {
   return LookupField(name, kAny);
 }
 
-RawField* Class::LookupField(const String& name, MemberKind kind) const {
+FieldPtr Class::LookupField(const String& name, MemberKind kind) const {
   ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   if (EnsureIsFinalized(thread) != Error::null()) {
@@ -5367,8 +5364,8 @@
   return Field::null();
 }
 
-RawField* Class::LookupFieldAllowPrivate(const String& name,
-                                         bool instance_only) const {
+FieldPtr Class::LookupFieldAllowPrivate(const String& name,
+                                        bool instance_only) const {
   ASSERT(!IsNull());
   // Use slow string compare, ignoring privacy name mangling.
   Thread* thread = Thread::Current();
@@ -5398,7 +5395,7 @@
   return Field::null();
 }
 
-RawField* Class::LookupInstanceFieldAllowPrivate(const String& name) const {
+FieldPtr Class::LookupInstanceFieldAllowPrivate(const String& name) const {
   Field& field = Field::Handle(LookupFieldAllowPrivate(name, true));
   if (!field.IsNull() && !field.is_static()) {
     return field.raw();
@@ -5406,7 +5403,7 @@
   return Field::null();
 }
 
-RawField* Class::LookupStaticFieldAllowPrivate(const String& name) const {
+FieldPtr Class::LookupStaticFieldAllowPrivate(const String& name) const {
   Field& field = Field::Handle(LookupFieldAllowPrivate(name));
   if (!field.IsNull() && field.is_static()) {
     return field.raw();
@@ -5493,7 +5490,7 @@
     return KeyType::Hash(ObjectType::Cast(key).value());
   }
   static uword Hash(const KeyType& key) { return key.Hash(); }
-  static RawObject* NewKey(const KeyType& obj) {
+  static ObjectPtr NewKey(const KeyType& obj) {
     if (obj.key_ != NULL) {
       return obj.key_->raw();
     } else {
@@ -5508,7 +5505,7 @@
     CanonicalMintSet;
 
 // Returns an instance of Double or Double::null().
-RawDouble* Class::LookupCanonicalDouble(Zone* zone, double value) const {
+DoublePtr Class::LookupCanonicalDouble(Zone* zone, double value) const {
   ASSERT(this->raw() == Isolate::Current()->object_store()->double_class());
   if (this->constants() == Object::empty_array().raw()) return Double::null();
 
@@ -5520,7 +5517,7 @@
 }
 
 // Returns an instance of Mint or Mint::null().
-RawMint* Class::LookupCanonicalMint(Zone* zone, int64_t value) const {
+MintPtr Class::LookupCanonicalMint(Zone* zone, int64_t value) const {
   ASSERT(this->raw() == Isolate::Current()->object_store()->mint_class());
   if (this->constants() == Object::empty_array().raw()) return Mint::null();
 
@@ -5572,14 +5569,14 @@
     return Instance::Cast(key).CanonicalizeHash();
   }
   static uword Hash(const CanonicalInstanceKey& key) { return key.Hash(); }
-  static RawObject* NewKey(const CanonicalInstanceKey& obj) {
+  static ObjectPtr NewKey(const CanonicalInstanceKey& obj) {
     return obj.key_.raw();
   }
 };
 typedef UnorderedHashSet<CanonicalInstanceTraits> CanonicalInstancesSet;
 
-RawInstance* Class::LookupCanonicalInstance(Zone* zone,
-                                            const Instance& value) const {
+InstancePtr Class::LookupCanonicalInstance(Zone* zone,
+                                           const Instance& value) const {
   ASSERT(this->raw() == value.clazz());
   ASSERT(is_finalized() || is_prefinalized());
   Instance& canonical_value = Instance::Handle(zone);
@@ -5591,8 +5588,8 @@
   return canonical_value.raw();
 }
 
-RawInstance* Class::InsertCanonicalConstant(Zone* zone,
-                                            const Instance& constant) const {
+InstancePtr Class::InsertCanonicalConstant(Zone* zone,
+                                           const Instance& constant) const {
   ASSERT(this->raw() == constant.clazz());
   Instance& canonical_value = Instance::Handle(zone);
   if (this->constants() == Object::empty_array().raw()) {
@@ -5744,10 +5741,10 @@
   return result;
 }
 
-RawTypeArguments* TypeArguments::Prepend(Zone* zone,
-                                         const TypeArguments& other,
-                                         intptr_t other_length,
-                                         intptr_t total_length) const {
+TypeArgumentsPtr TypeArguments::Prepend(Zone* zone,
+                                        const TypeArguments& other,
+                                        intptr_t other_length,
+                                        intptr_t total_length) const {
   if (IsNull() && other.IsNull()) {
     return TypeArguments::null();
   }
@@ -5765,7 +5762,7 @@
   return result.Canonicalize();
 }
 
-RawTypeArguments* TypeArguments::ConcatenateTypeParameters(
+TypeArgumentsPtr TypeArguments::ConcatenateTypeParameters(
     Zone* zone,
     const TypeArguments& other) const {
   ASSERT(!IsNull() && !other.IsNull());
@@ -5785,14 +5782,14 @@
   return result.raw();
 }
 
-RawString* TypeArguments::Name() const {
+StringPtr TypeArguments::Name() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
   PrintSubvectorName(0, Length(), kInternalName, &printer);
   return Symbols::New(thread, printer.buffer());
 }
 
-RawString* TypeArguments::UserVisibleName() const {
+StringPtr TypeArguments::UserVisibleName() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
   PrintSubvectorName(0, Length(), kUserVisibleName, &printer);
@@ -5945,7 +5942,7 @@
   return num;
 }
 
-RawArray* TypeArguments::instantiations() const {
+ArrayPtr TypeArguments::instantiations() const {
   return raw_ptr()->instantiations_;
 }
 
@@ -5968,12 +5965,12 @@
   return Smi::Value(raw_ptr()->nullability_);
 }
 
-RawAbstractType* TypeArguments::TypeAt(intptr_t index) const {
+AbstractTypePtr TypeArguments::TypeAt(intptr_t index) const {
   ASSERT(!IsNull());
   return *TypeAddr(index);
 }
 
-RawAbstractType* TypeArguments::TypeAtNullSafe(intptr_t index) const {
+AbstractTypePtr TypeArguments::TypeAtNullSafe(intptr_t index) const {
   if (IsNull()) {
     // null vector represents infinite list of dynamics
     return Type::dynamic_type().raw();
@@ -6185,7 +6182,7 @@
   return true;
 }
 
-RawTypeArguments* TypeArguments::InstantiateFrom(
+TypeArgumentsPtr TypeArguments::InstantiateFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
@@ -6225,7 +6222,7 @@
   return instantiated_array.raw();
 }
 
-RawTypeArguments* TypeArguments::InstantiateAndCanonicalizeFrom(
+TypeArgumentsPtr TypeArguments::InstantiateAndCanonicalizeFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments) const {
   ASSERT(!IsInstantiated());
@@ -6296,15 +6293,15 @@
   return result.raw();
 }
 
-RawTypeArguments* TypeArguments::New(intptr_t len, Heap::Space space) {
+TypeArgumentsPtr TypeArguments::New(intptr_t len, Heap::Space space) {
   if (len < 0 || len > kMaxElements) {
     // This should be caught before we reach here.
     FATAL1("Fatal error in TypeArguments::New: invalid len %" Pd "\n", len);
   }
   TypeArguments& result = TypeArguments::Handle();
   {
-    RawObject* raw = Object::Allocate(TypeArguments::kClassId,
-                                      TypeArguments::InstanceSize(len), space);
+    ObjectPtr raw = Object::Allocate(TypeArguments::kClassId,
+                                     TypeArguments::InstanceSize(len), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     // Length must be set before we start storing into the array.
@@ -6319,7 +6316,7 @@
   return result.raw();
 }
 
-RawAbstractType* const* TypeArguments::TypeAddr(intptr_t index) const {
+AbstractTypePtr const* TypeArguments::TypeAddr(intptr_t index) const {
   ASSERT((index >= 0) && (index < Length()));
   return &raw_ptr()->types()[index];
 }
@@ -6331,7 +6328,7 @@
   StoreSmi(&raw_ptr()->length_, Smi::New(value));
 }
 
-RawTypeArguments* TypeArguments::Canonicalize(TrailPtr trail) const {
+TypeArgumentsPtr TypeArguments::Canonicalize(TrailPtr trail) const {
   if (IsNull() || IsCanonical()) {
     ASSERT(IsOld());
     return this->raw();
@@ -6436,8 +6433,8 @@
   return OS::SCreate(Thread::Current()->zone(), "PatchClass for %s", cls_name);
 }
 
-RawPatchClass* PatchClass::New(const Class& patched_class,
-                               const Class& origin_class) {
+PatchClassPtr PatchClass::New(const Class& patched_class,
+                              const Class& origin_class) {
   const PatchClass& result = PatchClass::Handle(PatchClass::New());
   result.set_patched_class(patched_class);
   result.set_origin_class(origin_class);
@@ -6446,8 +6443,8 @@
   return result.raw();
 }
 
-RawPatchClass* PatchClass::New(const Class& patched_class,
-                               const Script& script) {
+PatchClassPtr PatchClass::New(const Class& patched_class,
+                              const Script& script) {
   const PatchClass& result = PatchClass::Handle(PatchClass::New());
   result.set_patched_class(patched_class);
   result.set_origin_class(patched_class);
@@ -6456,11 +6453,11 @@
   return result.raw();
 }
 
-RawPatchClass* PatchClass::New() {
+PatchClassPtr PatchClass::New() {
   ASSERT(Object::patch_class_class() != Class::null());
-  RawObject* raw = Object::Allocate(PatchClass::kClassId,
-                                    PatchClass::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawPatchClass*>(raw);
+  ObjectPtr raw = Object::Allocate(PatchClass::kClassId,
+                                   PatchClass::InstanceSize(), Heap::kOld);
+  return static_cast<PatchClassPtr>(raw);
 }
 
 void PatchClass::set_patched_class(const Class& value) const {
@@ -6556,11 +6553,11 @@
     }
   }
   switch (kind()) {
-    case RawFunction::kDynamicInvocationForwarder:
+    case FunctionLayout::kDynamicInvocationForwarder:
       return is_declared_in_bytecode();
-    case RawFunction::kImplicitClosureFunction:
-    case RawFunction::kIrregexpFunction:
-    case RawFunction::kFfiTrampoline:
+    case FunctionLayout::kImplicitClosureFunction:
+    case FunctionLayout::kIrregexpFunction:
+    case FunctionLayout::kFfiTrampoline:
       return false;
     default:
       return true;
@@ -6587,7 +6584,7 @@
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-bool Function::HasCode(RawFunction* function) {
+bool Function::HasCode(FunctionPtr function) {
   NoSafepointScope no_safepoint;
   ASSERT(function->ptr()->code_ != Code::null());
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -6707,7 +6704,7 @@
 #endif
 }
 
-RawContextScope* Function::context_scope() const {
+ContextScopePtr Function::context_scope() const {
   if (IsClosureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
     ASSERT(!obj.IsNull());
@@ -6726,7 +6723,7 @@
   UNREACHABLE();
 }
 
-RawInstance* Function::implicit_static_closure() const {
+InstancePtr Function::implicit_static_closure() const {
   if (IsImplicitStaticClosureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
     ASSERT(!obj.IsNull());
@@ -6745,7 +6742,7 @@
   UNREACHABLE();
 }
 
-RawScript* Function::eval_script() const {
+ScriptPtr Function::eval_script() const {
   const Object& obj = Object::Handle(raw_ptr()->data_);
   if (obj.IsScript()) {
     return Script::Cast(obj).raw();
@@ -6759,53 +6756,53 @@
   set_data(script);
 }
 
-RawFunction* Function::extracted_method_closure() const {
-  ASSERT(kind() == RawFunction::kMethodExtractor);
+FunctionPtr Function::extracted_method_closure() const {
+  ASSERT(kind() == FunctionLayout::kMethodExtractor);
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(obj.IsFunction());
   return Function::Cast(obj).raw();
 }
 
 void Function::set_extracted_method_closure(const Function& value) const {
-  ASSERT(kind() == RawFunction::kMethodExtractor);
+  ASSERT(kind() == FunctionLayout::kMethodExtractor);
   ASSERT(raw_ptr()->data_ == Object::null());
   set_data(value);
 }
 
-RawArray* Function::saved_args_desc() const {
-  ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher ||
-         kind() == RawFunction::kInvokeFieldDispatcher);
+ArrayPtr Function::saved_args_desc() const {
+  ASSERT(kind() == FunctionLayout::kNoSuchMethodDispatcher ||
+         kind() == FunctionLayout::kInvokeFieldDispatcher);
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(obj.IsArray());
   return Array::Cast(obj).raw();
 }
 
 void Function::set_saved_args_desc(const Array& value) const {
-  ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher ||
-         kind() == RawFunction::kInvokeFieldDispatcher);
+  ASSERT(kind() == FunctionLayout::kNoSuchMethodDispatcher ||
+         kind() == FunctionLayout::kInvokeFieldDispatcher);
   ASSERT(raw_ptr()->data_ == Object::null());
   set_data(value);
 }
 
-RawField* Function::accessor_field() const {
-  ASSERT(kind() == RawFunction::kImplicitGetter ||
-         kind() == RawFunction::kImplicitSetter ||
-         kind() == RawFunction::kImplicitStaticGetter ||
-         kind() == RawFunction::kFieldInitializer);
+FieldPtr Function::accessor_field() const {
+  ASSERT(kind() == FunctionLayout::kImplicitGetter ||
+         kind() == FunctionLayout::kImplicitSetter ||
+         kind() == FunctionLayout::kImplicitStaticGetter ||
+         kind() == FunctionLayout::kFieldInitializer);
   return Field::RawCast(raw_ptr()->data_);
 }
 
 void Function::set_accessor_field(const Field& value) const {
-  ASSERT(kind() == RawFunction::kImplicitGetter ||
-         kind() == RawFunction::kImplicitSetter ||
-         kind() == RawFunction::kImplicitStaticGetter ||
-         kind() == RawFunction::kFieldInitializer);
+  ASSERT(kind() == FunctionLayout::kImplicitGetter ||
+         kind() == FunctionLayout::kImplicitSetter ||
+         kind() == FunctionLayout::kImplicitStaticGetter ||
+         kind() == FunctionLayout::kFieldInitializer);
   // Top level classes may be finalized multiple times.
   ASSERT(raw_ptr()->data_ == Object::null() || raw_ptr()->data_ == value.raw());
   set_data(value);
 }
 
-RawFunction* Function::parent_function() const {
+FunctionPtr Function::parent_function() const {
   if (IsClosureFunction() || IsSignatureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
     ASSERT(!obj.IsNull());
@@ -6830,8 +6827,8 @@
 }
 
 // Enclosing outermost function of this local function.
-RawFunction* Function::GetOutermostFunction() const {
-  RawFunction* parent = parent_function();
+FunctionPtr Function::GetOutermostFunction() const {
+  FunctionPtr parent = parent_function();
   if (parent == Object::null()) {
     return raw();
   }
@@ -6859,7 +6856,7 @@
   return false;
 }
 
-RawFunction* Function::implicit_closure_function() const {
+FunctionPtr Function::implicit_closure_function() const {
   if (IsClosureFunction() || IsSignatureFunction() || IsFactory() ||
       IsDispatcherOrImplicitAccessor() || IsFieldInitializer()) {
     return Function::null();
@@ -6897,7 +6894,7 @@
   }
 }
 
-RawType* Function::ExistingSignatureType() const {
+TypePtr Function::ExistingSignatureType() const {
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(!obj.IsNull());
   if (IsSignatureFunction()) {
@@ -6917,7 +6914,7 @@
   FfiTrampolineData::Cast(obj).set_c_signature(sig);
 }
 
-RawFunction* Function::FfiCSignature() const {
+FunctionPtr Function::FfiCSignature() const {
   ASSERT(IsFfiTrampoline());
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(!obj.IsNull());
@@ -6938,7 +6935,7 @@
   FfiTrampolineData::Cast(obj).set_callback_id(value);
 }
 
-RawFunction* Function::FfiCallbackTarget() const {
+FunctionPtr Function::FfiCallbackTarget() const {
   ASSERT(IsFfiTrampoline());
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(!obj.IsNull());
@@ -6952,7 +6949,7 @@
   FfiTrampolineData::Cast(obj).set_callback_target(target);
 }
 
-RawInstance* Function::FfiCallbackExceptionalReturn() const {
+InstancePtr Function::FfiCallbackExceptionalReturn() const {
   ASSERT(IsFfiTrampoline());
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(!obj.IsNull());
@@ -6966,7 +6963,7 @@
   FfiTrampolineData::Cast(obj).set_callback_exceptional_return(value);
 }
 
-RawType* Function::SignatureType(Nullability nullability) const {
+TypePtr Function::SignatureType(Nullability nullability) const {
   Type& type = Type::Handle(ExistingSignatureType());
   if (type.IsNull()) {
     // The function type of this function is not yet cached and needs to be
@@ -7030,7 +7027,7 @@
   return true;
 }
 
-RawType* Function::RedirectionType() const {
+TypePtr Function::RedirectionType() const {
   ASSERT(IsRedirectingFactory());
   ASSERT(!is_native());
   const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -7038,8 +7035,8 @@
   return RedirectionData::Cast(obj).type();
 }
 
-const char* Function::KindToCString(RawFunction::Kind kind) {
-  return RawFunction::KindToCString(kind);
+const char* Function::KindToCString(FunctionLayout::Kind kind) {
+  return FunctionLayout::KindToCString(kind);
 }
 
 void Function::SetRedirectionType(const Type& type) const {
@@ -7052,7 +7049,7 @@
   RedirectionData::Cast(obj).set_type(type);
 }
 
-RawString* Function::RedirectionIdentifier() const {
+StringPtr Function::RedirectionIdentifier() const {
   ASSERT(IsRedirectingFactory());
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(!obj.IsNull());
@@ -7069,7 +7066,7 @@
   RedirectionData::Cast(obj).set_identifier(identifier);
 }
 
-RawFunction* Function::RedirectionTarget() const {
+FunctionPtr Function::RedirectionTarget() const {
   ASSERT(IsRedirectingFactory());
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(!obj.IsNull());
@@ -7086,15 +7083,15 @@
   RedirectionData::Cast(obj).set_target(target);
 }
 
-RawFunction* Function::ForwardingTarget() const {
-  ASSERT(kind() == RawFunction::kDynamicInvocationForwarder);
+FunctionPtr Function::ForwardingTarget() const {
+  ASSERT(kind() == FunctionLayout::kDynamicInvocationForwarder);
   Array& checks = Array::Handle();
   checks ^= raw_ptr()->data_;
   return Function::RawCast(checks.At(0));
 }
 
 void Function::SetForwardingChecks(const Array& checks) const {
-  ASSERT(kind() == RawFunction::kDynamicInvocationForwarder);
+  ASSERT(kind() == FunctionLayout::kDynamicInvocationForwarder);
   ASSERT(checks.Length() >= 1);
   ASSERT(Object::Handle(checks.At(0)).IsFunction());
   set_data(checks);
@@ -7149,24 +7146,24 @@
   StorePointer(&raw_ptr()->owner_, value.raw());
 }
 
-RawRegExp* Function::regexp() const {
-  ASSERT(kind() == RawFunction::kIrregexpFunction);
+RegExpPtr Function::regexp() const {
+  ASSERT(kind() == FunctionLayout::kIrregexpFunction);
   const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data_));
   return RegExp::RawCast(pair.At(0));
 }
 
 class StickySpecialization : public BitField<intptr_t, bool, 0, 1> {};
 class StringSpecializationCid
-    : public BitField<intptr_t, intptr_t, 1, RawObject::kClassIdTagSize> {};
+    : public BitField<intptr_t, intptr_t, 1, ObjectLayout::kClassIdTagSize> {};
 
 intptr_t Function::string_specialization_cid() const {
-  ASSERT(kind() == RawFunction::kIrregexpFunction);
+  ASSERT(kind() == FunctionLayout::kIrregexpFunction);
   const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data_));
   return StringSpecializationCid::decode(Smi::Value(Smi::RawCast(pair.At(1))));
 }
 
 bool Function::is_sticky_specialization() const {
-  ASSERT(kind() == RawFunction::kIrregexpFunction);
+  ASSERT(kind() == FunctionLayout::kIrregexpFunction);
   const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data_));
   return StickySpecialization::decode(Smi::Value(Smi::RawCast(pair.At(1))));
 }
@@ -7174,7 +7171,7 @@
 void Function::SetRegExpData(const RegExp& regexp,
                              intptr_t string_specialization_cid,
                              bool sticky) const {
-  ASSERT(kind() == RawFunction::kIrregexpFunction);
+  ASSERT(kind() == FunctionLayout::kIrregexpFunction);
   ASSERT(IsStringClassId(string_specialization_cid));
   ASSERT(raw_ptr()->data_ == Object::null());
   const Array& pair = Array::Handle(Array::New(2, Heap::kOld));
@@ -7185,7 +7182,7 @@
   set_data(pair);
 }
 
-RawString* Function::native_name() const {
+StringPtr Function::native_name() const {
   ASSERT(is_native());
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(obj.IsArray());
@@ -7221,7 +7218,7 @@
   StorePointer(&raw_ptr()->result_type_, value.raw());
 }
 
-RawAbstractType* Function::ParameterTypeAt(intptr_t index) const {
+AbstractTypePtr Function::ParameterTypeAt(intptr_t index) const {
   const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_);
   return AbstractType::RawCast(parameter_types.At(index));
 }
@@ -7230,7 +7227,7 @@
                                   const AbstractType& value) const {
   ASSERT(!value.IsNull());
   // Method extractor parameters are shared and are in the VM heap.
-  ASSERT(kind() != RawFunction::kMethodExtractor);
+  ASSERT(kind() != FunctionLayout::kMethodExtractor);
   const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_);
   parameter_types.SetAt(index, value);
 }
@@ -7239,7 +7236,7 @@
   StorePointer(&raw_ptr()->parameter_types_, value.raw());
 }
 
-RawString* Function::ParameterNameAt(intptr_t index) const {
+StringPtr Function::ParameterNameAt(intptr_t index) const {
   const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_);
   return String::RawCast(parameter_names.At(index));
 }
@@ -7279,7 +7276,7 @@
   if (flag_index >= parameter_names.Length()) {
     return false;
   }
-  RawObject* element = parameter_names.At(flag_index);
+  ObjectPtr element = parameter_names.At(flag_index);
   if (element == Object::null()) {
     return false;
   }
@@ -7293,7 +7290,7 @@
   const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_);
   ASSERT(flag_index < parameter_names.Length());
   intptr_t flag;
-  RawObject* element = parameter_names.At(flag_index);
+  ObjectPtr element = parameter_names.At(flag_index);
   if (element == Object::null()) {
     flag = 0;
   } else {
@@ -7358,9 +7355,8 @@
   }
 }
 
-RawTypeParameter* Function::LookupTypeParameter(
-    const String& type_name,
-    intptr_t* function_level) const {
+TypeParameterPtr Function::LookupTypeParameter(const String& type_name,
+                                               intptr_t* function_level) const {
   ASSERT(!type_name.IsNull());
   Thread* thread = Thread::Current();
   REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread);
@@ -7398,11 +7394,11 @@
   return TypeParameter::null();
 }
 
-void Function::set_kind(RawFunction::Kind value) const {
+void Function::set_kind(FunctionLayout::Kind value) const {
   set_kind_tag(KindBits::update(value, raw_ptr()->kind_tag_));
 }
 
-void Function::set_modifier(RawFunction::AsyncModifier value) const {
+void Function::set_modifier(FunctionLayout::AsyncModifier value) const {
   set_kind_tag(ModifierBits::update(value, raw_ptr()->kind_tag_));
 }
 
@@ -7431,20 +7427,20 @@
 
 void Function::set_num_fixed_parameters(intptr_t value) const {
   ASSERT(value >= 0);
-  ASSERT(Utils::IsUint(RawFunction::kMaxFixedParametersBits, value));
+  ASSERT(Utils::IsUint(FunctionLayout::kMaxFixedParametersBits, value));
   const uint32_t* original = &raw_ptr()->packed_fields_;
-  StoreNonPointer(original, RawFunction::PackedNumFixedParameters::update(
+  StoreNonPointer(original, FunctionLayout::PackedNumFixedParameters::update(
                                 value, *original));
 }
 
 void Function::SetNumOptionalParameters(intptr_t value,
                                         bool are_optional_positional) const {
-  ASSERT(Utils::IsUint(RawFunction::kMaxOptionalParametersBits, value));
+  ASSERT(Utils::IsUint(FunctionLayout::kMaxOptionalParametersBits, value));
   uint32_t packed_fields = raw_ptr()->packed_fields_;
-  packed_fields = RawFunction::PackedHasNamedOptionalParameters::update(
+  packed_fields = FunctionLayout::PackedHasNamedOptionalParameters::update(
       !are_optional_positional, packed_fields);
   packed_fields =
-      RawFunction::PackedNumOptionalParameters::update(value, packed_fields);
+      FunctionLayout::PackedNumOptionalParameters::update(value, packed_fields);
   set_packed_fields(packed_fields);
 }
 
@@ -7505,24 +7501,24 @@
 }
 
 intptr_t Function::NumImplicitParameters() const {
-  const RawFunction::Kind k = kind();
-  if (k == RawFunction::kConstructor) {
+  const FunctionLayout::Kind k = kind();
+  if (k == FunctionLayout::kConstructor) {
     // Type arguments for factory; instance for generative constructor.
     return 1;
   }
-  if ((k == RawFunction::kClosureFunction) ||
-      (k == RawFunction::kImplicitClosureFunction) ||
-      (k == RawFunction::kSignatureFunction) ||
-      (k == RawFunction::kFfiTrampoline)) {
+  if ((k == FunctionLayout::kClosureFunction) ||
+      (k == FunctionLayout::kImplicitClosureFunction) ||
+      (k == FunctionLayout::kSignatureFunction) ||
+      (k == FunctionLayout::kFfiTrampoline)) {
     return 1;  // Closure object.
   }
   if (!is_static()) {
     // Closure functions defined inside instance (i.e. non-static) functions are
     // marked as non-static, but they do not have a receiver.
     // Closures are handled above.
-    ASSERT((k != RawFunction::kClosureFunction) &&
-           (k != RawFunction::kImplicitClosureFunction) &&
-           (k != RawFunction::kSignatureFunction));
+    ASSERT((k != FunctionLayout::kClosureFunction) &&
+           (k != FunctionLayout::kImplicitClosureFunction) &&
+           (k != FunctionLayout::kSignatureFunction));
     return 1;  // Receiver.
   }
   return 0;  // No implicit parameters.
@@ -7686,7 +7682,7 @@
   return true;
 }
 
-RawObject* Function::DoArgumentTypesMatch(
+ObjectPtr Function::DoArgumentTypesMatch(
     const Array& args,
     const ArgumentsDescriptor& args_desc,
     const TypeArguments& instantiator_type_args) const {
@@ -7859,7 +7855,7 @@
   return chars;
 }
 
-RawFunction* Function::InstantiateSignatureFrom(
+FunctionPtr Function::InstantiateSignatureFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
@@ -8155,32 +8151,32 @@
   return IsGenerativeConstructor() && (token_pos() == end_token_pos());
 }
 
-bool Function::IsImplicitStaticClosureFunction(RawFunction* func) {
+bool Function::IsImplicitStaticClosureFunction(FunctionPtr func) {
   NoSafepointScope no_safepoint;
   uint32_t kind_tag = func->ptr()->kind_tag_;
   return (KindBits::decode(kind_tag) ==
-          RawFunction::kImplicitClosureFunction) &&
+          FunctionLayout::kImplicitClosureFunction) &&
          StaticBit::decode(kind_tag);
 }
 
-RawFunction* Function::New(Heap::Space space) {
+FunctionPtr Function::New(Heap::Space space) {
   ASSERT(Object::function_class() != Class::null());
-  RawObject* raw =
+  ObjectPtr raw =
       Object::Allocate(Function::kClassId, Function::InstanceSize(), space);
-  return reinterpret_cast<RawFunction*>(raw);
+  return static_cast<FunctionPtr>(raw);
 }
 
-RawFunction* Function::New(const String& name,
-                           RawFunction::Kind kind,
-                           bool is_static,
-                           bool is_const,
-                           bool is_abstract,
-                           bool is_external,
-                           bool is_native,
-                           const Object& owner,
-                           TokenPosition token_pos,
-                           Heap::Space space) {
-  ASSERT(!owner.IsNull() || (kind == RawFunction::kSignatureFunction));
+FunctionPtr Function::New(const String& name,
+                          FunctionLayout::Kind kind,
+                          bool is_static,
+                          bool is_const,
+                          bool is_abstract,
+                          bool is_external,
+                          bool is_native,
+                          const Object& owner,
+                          TokenPosition token_pos,
+                          Heap::Space space) {
+  ASSERT(!owner.IsNull() || (kind == FunctionLayout::kSignatureFunction));
   const Function& result = Function::Handle(Function::New(space));
   result.set_kind_tag(0);
   result.set_parameter_types(Object::empty_array());
@@ -8189,7 +8185,7 @@
   result.set_kind_tag(0);  // Ensure determinism of uninitialized bits.
   result.set_kind(kind);
   result.set_recognized_kind(MethodRecognizer::kUnknown);
-  result.set_modifier(RawFunction::kNoModifier);
+  result.set_modifier(FunctionLayout::kNoModifier);
   result.set_is_static(is_static);
   result.set_is_const(is_const);
   result.set_is_abstract(is_abstract);
@@ -8222,16 +8218,16 @@
   result.set_is_inlinable(true);
   result.reset_unboxed_parameters_and_return();
   result.SetInstructionsSafe(StubCode::LazyCompile());
-  if (kind == RawFunction::kClosureFunction ||
-      kind == RawFunction::kImplicitClosureFunction) {
+  if (kind == FunctionLayout::kClosureFunction ||
+      kind == FunctionLayout::kImplicitClosureFunction) {
     ASSERT(space == Heap::kOld);
     const ClosureData& data = ClosureData::Handle(ClosureData::New());
     result.set_data(data);
-  } else if (kind == RawFunction::kSignatureFunction) {
+  } else if (kind == FunctionLayout::kSignatureFunction) {
     const SignatureData& data =
         SignatureData::Handle(SignatureData::New(space));
     result.set_data(data);
-  } else if (kind == RawFunction::kFfiTrampoline) {
+  } else if (kind == FunctionLayout::kFfiTrampoline) {
     const FfiTrampolineData& data =
         FfiTrampolineData::Handle(FfiTrampolineData::New());
     result.set_data(data);
@@ -8250,13 +8246,13 @@
   return result.raw();
 }
 
-RawFunction* Function::NewClosureFunctionWithKind(RawFunction::Kind kind,
-                                                  const String& name,
-                                                  const Function& parent,
-                                                  TokenPosition token_pos,
-                                                  const Object& owner) {
-  ASSERT((kind == RawFunction::kClosureFunction) ||
-         (kind == RawFunction::kImplicitClosureFunction));
+FunctionPtr Function::NewClosureFunctionWithKind(FunctionLayout::Kind kind,
+                                                 const String& name,
+                                                 const Function& parent,
+                                                 TokenPosition token_pos,
+                                                 const Object& owner) {
+  ASSERT((kind == FunctionLayout::kClosureFunction) ||
+         (kind == FunctionLayout::kImplicitClosureFunction));
   ASSERT(!parent.IsNull());
   ASSERT(!owner.IsNull());
   const Function& result = Function::Handle(
@@ -8270,30 +8266,30 @@
   return result.raw();
 }
 
-RawFunction* Function::NewClosureFunction(const String& name,
-                                          const Function& parent,
-                                          TokenPosition token_pos) {
+FunctionPtr Function::NewClosureFunction(const String& name,
+                                         const Function& parent,
+                                         TokenPosition token_pos) {
   // Use the owner defining the parent function and not the class containing it.
   const Object& parent_owner = Object::Handle(parent.RawOwner());
-  return NewClosureFunctionWithKind(RawFunction::kClosureFunction, name, parent,
-                                    token_pos, parent_owner);
-}
-
-RawFunction* Function::NewImplicitClosureFunction(const String& name,
-                                                  const Function& parent,
-                                                  TokenPosition token_pos) {
-  // Use the owner defining the parent function and not the class containing it.
-  const Object& parent_owner = Object::Handle(parent.RawOwner());
-  return NewClosureFunctionWithKind(RawFunction::kImplicitClosureFunction, name,
+  return NewClosureFunctionWithKind(FunctionLayout::kClosureFunction, name,
                                     parent, token_pos, parent_owner);
 }
 
-RawFunction* Function::NewSignatureFunction(const Object& owner,
-                                            const Function& parent,
-                                            TokenPosition token_pos,
-                                            Heap::Space space) {
+FunctionPtr Function::NewImplicitClosureFunction(const String& name,
+                                                 const Function& parent,
+                                                 TokenPosition token_pos) {
+  // Use the owner defining the parent function and not the class containing it.
+  const Object& parent_owner = Object::Handle(parent.RawOwner());
+  return NewClosureFunctionWithKind(FunctionLayout::kImplicitClosureFunction,
+                                    name, parent, token_pos, parent_owner);
+}
+
+FunctionPtr Function::NewSignatureFunction(const Object& owner,
+                                           const Function& parent,
+                                           TokenPosition token_pos,
+                                           Heap::Space space) {
   const Function& result = Function::Handle(Function::New(
-      Symbols::AnonymousSignature(), RawFunction::kSignatureFunction,
+      Symbols::AnonymousSignature(), FunctionLayout::kSignatureFunction,
       /* is_static = */ false,
       /* is_const = */ false,
       /* is_abstract = */ false,
@@ -8308,15 +8304,15 @@
   return result.raw();
 }
 
-RawFunction* Function::NewEvalFunction(const Class& owner,
-                                       const Script& script,
-                                       bool is_static) {
+FunctionPtr Function::NewEvalFunction(const Class& owner,
+                                      const Script& script,
+                                      bool is_static) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const Function& result = Function::Handle(
       zone,
       Function::New(String::Handle(Symbols::New(thread, ":Eval")),
-                    RawFunction::kRegularFunction, is_static,
+                    FunctionLayout::kRegularFunction, is_static,
                     /* is_const = */ false,
                     /* is_abstract = */ false,
                     /* is_external = */ false,
@@ -8336,7 +8332,7 @@
 #endif
 }
 
-RawFunction* Function::ImplicitClosureFunction() const {
+FunctionPtr Function::ImplicitClosureFunction() const {
   // Return the existing implicit closure function if any.
   if (implicit_closure_function() != Function::null()) {
     return implicit_closure_function();
@@ -8455,14 +8451,14 @@
   }
 }
 
-RawString* Function::Signature() const {
+StringPtr Function::Signature() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
   PrintSignature(kInternalName, &printer);
   return Symbols::New(thread, printer.buffer());
 }
 
-RawString* Function::UserVisibleSignature() const {
+StringPtr Function::UserVisibleSignature() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
   PrintSignature(kUserVisibleName, &printer);
@@ -8527,7 +8523,7 @@
   }
 }
 
-RawInstance* Function::ImplicitStaticClosure() const {
+InstancePtr Function::ImplicitStaticClosure() const {
   ASSERT(IsImplicitStaticClosureFunction());
   if (implicit_static_closure() == Instance::null()) {
     Zone* zone = Thread::Current()->zone();
@@ -8541,7 +8537,7 @@
   return implicit_static_closure();
 }
 
-RawInstance* Function::ImplicitInstanceClosure(const Instance& receiver) const {
+InstancePtr Function::ImplicitInstanceClosure(const Instance& receiver) const {
   ASSERT(IsImplicitClosureFunction());
   Zone* zone = Thread::Current()->zone();
   const Context& context = Context::Handle(zone, Context::New(1));
@@ -8647,7 +8643,7 @@
   return true;
 }
 
-RawClass* Function::Owner() const {
+ClassPtr Function::Owner() const {
   if (raw_ptr()->owner_ == Object::null()) {
     ASSERT(IsSignatureFunction());
     return Class::null();
@@ -8660,7 +8656,7 @@
   return PatchClass::Cast(obj).patched_class();
 }
 
-RawClass* Function::origin() const {
+ClassPtr Function::origin() const {
   if (raw_ptr()->owner_ == Object::null()) {
     ASSERT(IsSignatureFunction());
     return Class::null();
@@ -8705,7 +8701,7 @@
   set_data(data_field);
 }
 
-RawScript* Function::script() const {
+ScriptPtr Function::script() const {
   // NOTE(turnidge): If you update this function, you probably want to
   // update Class::PatchFieldsAndFunctions() at the same time.
   Object& data = Object::Handle(raw_ptr()->data_);
@@ -8738,7 +8734,7 @@
   return Class::Cast(obj).script();
 }
 
-RawExternalTypedData* Function::KernelData() const {
+ExternalTypedDataPtr Function::KernelData() const {
   Object& data = Object::Handle(raw_ptr()->data_);
   if (data.IsArray()) {
     Object& script = Object::Handle(Array::Cast(data).At(0));
@@ -8807,7 +8803,7 @@
   return String::ScrubName(String::Handle(name()), is_extension_member());
 }
 
-RawString* Function::UserVisibleName() const {
+StringPtr Function::UserVisibleName() const {
   if (FLAG_show_internal_names) {
     return name();
   }
@@ -8816,14 +8812,14 @@
       String::ScrubName(String::Handle(name()), is_extension_member()));
 }
 
-RawString* Function::QualifiedScrubbedName() const {
+StringPtr Function::QualifiedScrubbedName() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
   PrintQualifiedName(kScrubbedName, &printer);
   return Symbols::New(thread, printer.buffer());
 }
 
-RawString* Function::QualifiedUserVisibleName() const {
+StringPtr Function::QualifiedUserVisibleName() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
   PrintQualifiedName(kUserVisibleName, &printer);
@@ -8865,7 +8861,7 @@
   }
   const Class& cls = Class::Handle(Owner());
   if (!cls.IsTopLevel()) {
-    if (fun.kind() == RawFunction::kConstructor) {
+    if (fun.kind() == FunctionLayout::kConstructor) {
       printer->AddString("new ");
     } else {
       const Class& mixin = Class::Handle(cls.Mixin());
@@ -8879,7 +8875,7 @@
   printer->AddString(fun.UserVisibleNameCString());
 }
 
-RawString* Function::GetSource() const {
+StringPtr Function::GetSource() const {
   if (IsImplicitConstructor() || IsSignatureFunction() || is_synthetic()) {
     // We may need to handle more cases when the restrictions on mixins are
     // relaxed. In particular we might start associating some source with the
@@ -9007,12 +9003,12 @@
 }
 
 void Function::set_ic_data_array(const Array& value) const {
-  StorePointer<RawArray*, std::memory_order_release>(&raw_ptr()->ic_data_array_,
-                                                     value.raw());
+  StorePointer<ArrayPtr, std::memory_order_release>(&raw_ptr()->ic_data_array_,
+                                                    value.raw());
 }
 
-RawArray* Function::ic_data_array() const {
-  return LoadPointer<RawArray*, std::memory_order_acquire>(
+ArrayPtr Function::ic_data_array() const {
+  return LoadPointer<ArrayPtr, std::memory_order_acquire>(
       &raw_ptr()->ic_data_array_);
 }
 
@@ -9020,7 +9016,7 @@
   set_ic_data_array(Array::null_array());
 }
 
-RawICData* Function::FindICData(intptr_t deopt_id) const {
+ICDataPtr Function::FindICData(intptr_t deopt_id) const {
   const Array& array = Array::Handle(ic_data_array());
   ICData& ic_data = ICData::Handle();
   for (intptr_t i = 1; i < array.Length(); i++) {
@@ -9083,7 +9079,7 @@
   return true;
 }
 
-RawCode* Function::EnsureHasCode() const {
+CodePtr Function::EnsureHasCode() const {
   if (HasCode()) return CurrentCode();
   Thread* thread = Thread::Current();
   ASSERT(thread->IsMutatorThread());
@@ -9156,47 +9152,47 @@
   const char* kind_str = NULL;
   const char* const_str = is_const() ? " const" : "";
   switch (kind()) {
-    case RawFunction::kRegularFunction:
-    case RawFunction::kClosureFunction:
-    case RawFunction::kImplicitClosureFunction:
-    case RawFunction::kGetterFunction:
-    case RawFunction::kSetterFunction:
+    case FunctionLayout::kRegularFunction:
+    case FunctionLayout::kClosureFunction:
+    case FunctionLayout::kImplicitClosureFunction:
+    case FunctionLayout::kGetterFunction:
+    case FunctionLayout::kSetterFunction:
       kind_str = "";
       break;
-    case RawFunction::kSignatureFunction:
+    case FunctionLayout::kSignatureFunction:
       kind_str = " signature";
       break;
-    case RawFunction::kConstructor:
+    case FunctionLayout::kConstructor:
       kind_str = is_static() ? " factory" : " constructor";
       break;
-    case RawFunction::kImplicitGetter:
+    case FunctionLayout::kImplicitGetter:
       kind_str = " getter";
       break;
-    case RawFunction::kImplicitSetter:
+    case FunctionLayout::kImplicitSetter:
       kind_str = " setter";
       break;
-    case RawFunction::kImplicitStaticGetter:
+    case FunctionLayout::kImplicitStaticGetter:
       kind_str = " static-getter";
       break;
-    case RawFunction::kFieldInitializer:
+    case FunctionLayout::kFieldInitializer:
       kind_str = " field-initializer";
       break;
-    case RawFunction::kMethodExtractor:
+    case FunctionLayout::kMethodExtractor:
       kind_str = " method-extractor";
       break;
-    case RawFunction::kNoSuchMethodDispatcher:
+    case FunctionLayout::kNoSuchMethodDispatcher:
       kind_str = " no-such-method-dispatcher";
       break;
-    case RawFunction::kDynamicInvocationForwarder:
+    case FunctionLayout::kDynamicInvocationForwarder:
       kind_str = " dynamic-invocation-forwarder";
       break;
-    case RawFunction::kInvokeFieldDispatcher:
+    case FunctionLayout::kInvokeFieldDispatcher:
       kind_str = " invoke-field-dispatcher";
       break;
-    case RawFunction::kIrregexpFunction:
+    case FunctionLayout::kIrregexpFunction:
       kind_str = " irregexp-function";
       break;
-    case RawFunction::kFfiTrampoline:
+    case FunctionLayout::kFfiTrampoline:
       kind_str = " ffi-trampoline-function";
       break;
     default:
@@ -9226,11 +9222,11 @@
   StorePointer(&raw_ptr()->signature_type_, value.raw());
 }
 
-RawClosureData* ClosureData::New() {
+ClosureDataPtr ClosureData::New() {
   ASSERT(Object::closure_data_class() != Class::null());
-  RawObject* raw = Object::Allocate(ClosureData::kClassId,
-                                    ClosureData::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawClosureData*>(raw);
+  ObjectPtr raw = Object::Allocate(ClosureData::kClassId,
+                                   ClosureData::InstanceSize(), Heap::kOld);
+  return static_cast<ClosureDataPtr>(raw);
 }
 
 const char* ClosureData::ToCString() const {
@@ -9243,10 +9239,10 @@
                      "ClosureData: context_scope: 0x%" Px
                      " parent_function: %s signature_type: %s"
                      " implicit_static_closure: 0x%" Px,
-                     reinterpret_cast<uword>(context_scope()),
+                     static_cast<uword>(context_scope()),
                      parent.IsNull() ? "null" : parent.ToCString(),
                      type.IsNull() ? "null" : type.ToCString(),
-                     reinterpret_cast<uword>(implicit_static_closure()));
+                     static_cast<uword>(implicit_static_closure()));
 }
 
 void SignatureData::set_parent_function(const Function& value) const {
@@ -9257,11 +9253,11 @@
   StorePointer(&raw_ptr()->signature_type_, value.raw());
 }
 
-RawSignatureData* SignatureData::New(Heap::Space space) {
+SignatureDataPtr SignatureData::New(Heap::Space space) {
   ASSERT(Object::signature_data_class() != Class::null());
-  RawObject* raw = Object::Allocate(SignatureData::kClassId,
-                                    SignatureData::InstanceSize(), space);
-  return reinterpret_cast<RawSignatureData*>(raw);
+  ObjectPtr raw = Object::Allocate(SignatureData::kClassId,
+                                   SignatureData::InstanceSize(), space);
+  return static_cast<SignatureDataPtr>(raw);
 }
 
 const char* SignatureData::ToCString() const {
@@ -9289,11 +9285,11 @@
   StorePointer(&raw_ptr()->target_, value.raw());
 }
 
-RawRedirectionData* RedirectionData::New() {
+RedirectionDataPtr RedirectionData::New() {
   ASSERT(Object::redirection_data_class() != Class::null());
-  RawObject* raw = Object::Allocate(
-      RedirectionData::kClassId, RedirectionData::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawRedirectionData*>(raw);
+  ObjectPtr raw = Object::Allocate(RedirectionData::kClassId,
+                                   RedirectionData::InstanceSize(), Heap::kOld);
+  return static_cast<RedirectionDataPtr>(raw);
 }
 
 const char* RedirectionData::ToCString() const {
@@ -9331,12 +9327,12 @@
   StorePointer(&raw_ptr()->callback_exceptional_return_, value.raw());
 }
 
-RawFfiTrampolineData* FfiTrampolineData::New() {
+FfiTrampolineDataPtr FfiTrampolineData::New() {
   ASSERT(Object::ffi_trampoline_data_class() != Class::null());
-  RawObject* raw =
+  ObjectPtr raw =
       Object::Allocate(FfiTrampolineData::kClassId,
                        FfiTrampolineData::InstanceSize(), Heap::kOld);
-  RawFfiTrampolineData* data = reinterpret_cast<RawFfiTrampolineData*>(raw);
+  FfiTrampolineDataPtr data = static_cast<FfiTrampolineDataPtr>(raw);
   data->ptr()->callback_id_ = 0;
   return data;
 }
@@ -9350,11 +9346,11 @@
       signature_type_name.IsNull() ? "null" : signature_type_name.ToCString());
 }
 
-RawField* Field::CloneFromOriginal() const {
+FieldPtr Field::CloneFromOriginal() const {
   return this->Clone(*this);
 }
 
-RawField* Field::Original() const {
+FieldPtr Field::Original() const {
   if (IsNull()) {
     return Field::null();
   }
@@ -9384,44 +9380,44 @@
 void Field::SetOriginal(const Field& value) const {
   ASSERT(value.IsOriginal());
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->owner_, reinterpret_cast<RawObject*>(value.raw()));
+  StorePointer(&raw_ptr()->owner_, static_cast<ObjectPtr>(value.raw()));
 }
 
-RawString* Field::GetterName(const String& field_name) {
+StringPtr Field::GetterName(const String& field_name) {
   return String::Concat(Symbols::GetterPrefix(), field_name);
 }
 
-RawString* Field::GetterSymbol(const String& field_name) {
+StringPtr Field::GetterSymbol(const String& field_name) {
   return Symbols::FromGet(Thread::Current(), field_name);
 }
 
-RawString* Field::LookupGetterSymbol(const String& field_name) {
+StringPtr Field::LookupGetterSymbol(const String& field_name) {
   return Symbols::LookupFromGet(Thread::Current(), field_name);
 }
 
-RawString* Field::SetterName(const String& field_name) {
+StringPtr Field::SetterName(const String& field_name) {
   return String::Concat(Symbols::SetterPrefix(), field_name);
 }
 
-RawString* Field::SetterSymbol(const String& field_name) {
+StringPtr Field::SetterSymbol(const String& field_name) {
   return Symbols::FromSet(Thread::Current(), field_name);
 }
 
-RawString* Field::LookupSetterSymbol(const String& field_name) {
+StringPtr Field::LookupSetterSymbol(const String& field_name) {
   return Symbols::LookupFromSet(Thread::Current(), field_name);
 }
 
-RawString* Field::NameFromGetter(const String& getter_name) {
+StringPtr Field::NameFromGetter(const String& getter_name) {
   return Symbols::New(Thread::Current(), getter_name, kGetterPrefixLength,
                       getter_name.Length() - kGetterPrefixLength);
 }
 
-RawString* Field::NameFromSetter(const String& setter_name) {
+StringPtr Field::NameFromSetter(const String& setter_name) {
   return Symbols::New(Thread::Current(), setter_name, kSetterPrefixLength,
                       setter_name.Length() - kSetterPrefixLength);
 }
 
-RawString* Field::NameFromInit(const String& init_name) {
+StringPtr Field::NameFromInit(const String& init_name) {
   return Symbols::New(Thread::Current(), init_name, kInitPrefixLength,
                       init_name.Length() - kInitPrefixLength);
 }
@@ -9444,7 +9440,7 @@
   StorePointer(&raw_ptr()->name_, value.raw());
 }
 
-RawObject* Field::RawOwner() const {
+ObjectPtr Field::RawOwner() const {
   if (IsOriginal()) {
     return raw_ptr()->owner_;
   } else {
@@ -9455,7 +9451,7 @@
   }
 }
 
-RawClass* Field::Owner() const {
+ClassPtr Field::Owner() const {
   const Field& field = Field::Handle(Original());
   ASSERT(field.IsOriginal());
   const Object& obj = Object::Handle(field.raw_ptr()->owner_);
@@ -9466,7 +9462,7 @@
   return PatchClass::Cast(obj).patched_class();
 }
 
-RawClass* Field::Origin() const {
+ClassPtr Field::Origin() const {
   const Field& field = Field::Handle(Original());
   ASSERT(field.IsOriginal());
   const Object& obj = Object::Handle(field.raw_ptr()->owner_);
@@ -9477,7 +9473,7 @@
   return PatchClass::Cast(obj).origin_class();
 }
 
-RawScript* Field::Script() const {
+ScriptPtr Field::Script() const {
   // NOTE(turnidge): If you update this function, you probably want to
   // update Class::PatchFieldsAndFunctions() at the same time.
   const Field& field = Field::Handle(Original());
@@ -9490,7 +9486,7 @@
   return PatchClass::Cast(obj).script();
 }
 
-RawExternalTypedData* Field::KernelData() const {
+ExternalTypedDataPtr Field::KernelData() const {
   const Object& obj = Object::Handle(this->raw_ptr()->owner_);
   // During background JIT compilation field objects are copied
   // and copy points to the original field via the owner field.
@@ -9539,11 +9535,11 @@
   }
 }
 
-RawField* Field::New() {
+FieldPtr Field::New() {
   ASSERT(Object::field_class() != Class::null());
-  RawObject* raw =
+  ObjectPtr raw =
       Object::Allocate(Field::kClassId, Field::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawField*>(raw);
+  return static_cast<FieldPtr>(raw);
 }
 
 void Field::InitializeNew(const Field& result,
@@ -9611,16 +9607,16 @@
   }
 }
 
-RawField* Field::New(const String& name,
-                     bool is_static,
-                     bool is_final,
-                     bool is_const,
-                     bool is_reflectable,
-                     bool is_late,
-                     const Object& owner,
-                     const AbstractType& type,
-                     TokenPosition token_pos,
-                     TokenPosition end_token_pos) {
+FieldPtr Field::New(const String& name,
+                    bool is_static,
+                    bool is_final,
+                    bool is_const,
+                    bool is_reflectable,
+                    bool is_late,
+                    const Object& owner,
+                    const AbstractType& type,
+                    TokenPosition token_pos,
+                    TokenPosition end_token_pos) {
   ASSERT(!owner.IsNull());
   const Field& result = Field::Handle(Field::New());
   InitializeNew(result, name, is_static, is_final, is_const, is_reflectable,
@@ -9629,13 +9625,13 @@
   return result.raw();
 }
 
-RawField* Field::NewTopLevel(const String& name,
-                             bool is_final,
-                             bool is_const,
-                             bool is_late,
-                             const Object& owner,
-                             TokenPosition token_pos,
-                             TokenPosition end_token_pos) {
+FieldPtr Field::NewTopLevel(const String& name,
+                            bool is_final,
+                            bool is_const,
+                            bool is_late,
+                            const Object& owner,
+                            TokenPosition token_pos,
+                            TokenPosition end_token_pos) {
   ASSERT(!owner.IsNull());
   const Field& result = Field::Handle(Field::New());
   InitializeNew(result, name, true,       /* is_static */
@@ -9644,7 +9640,7 @@
   return result.raw();
 }
 
-RawField* Field::Clone(const Field& original) const {
+FieldPtr Field::Clone(const Field& original) const {
   if (original.IsNull()) {
     return Field::null();
   }
@@ -9668,7 +9664,7 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
-RawString* Field::InitializingExpression() const {
+StringPtr Field::InitializingExpression() const {
   UNREACHABLE();
   return String::null();
 }
@@ -9681,7 +9677,7 @@
   return String::ScrubName(String::Handle(name()), is_extension_member());
 }
 
-RawString* Field::UserVisibleName() const {
+StringPtr Field::UserVisibleName() const {
   if (FLAG_show_internal_names) {
     return name();
   }
@@ -9767,7 +9763,7 @@
 // Build a closure object that gets (or sets) the contents of a static
 // field f and cache the closure in a newly created static field
 // named #f (or #f= in case of a setter).
-RawInstance* Field::AccessorClosure(bool make_setter) const {
+InstancePtr Field::AccessorClosure(bool make_setter) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   ASSERT(is_static());
@@ -9795,15 +9791,15 @@
   return Instance::null();
 }
 
-RawInstance* Field::GetterClosure() const {
+InstancePtr Field::GetterClosure() const {
   return AccessorClosure(false);
 }
 
-RawInstance* Field::SetterClosure() const {
+InstancePtr Field::SetterClosure() const {
   return AccessorClosure(true);
 }
 
-RawArray* Field::dependent_code() const {
+ArrayPtr Field::dependent_code() const {
   return raw_ptr()->dependent_code_;
 }
 
@@ -9876,12 +9872,12 @@
 bool Field::IsUninitialized() const {
   Thread* thread = Thread::Current();
   const FieldTable* field_table = thread->isolate()->field_table();
-  const RawInstance* raw_value = field_table->At(field_id());
+  const InstancePtr raw_value = field_table->At(field_id());
   ASSERT(raw_value != Object::transition_sentinel().raw());
   return raw_value == Object::sentinel().raw();
 }
 
-RawFunction* Field::EnsureInitializerFunction() const {
+FunctionPtr Field::EnsureInitializerFunction() const {
   ASSERT(has_nontrivial_initializer());
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -9906,7 +9902,7 @@
   return raw_ptr()->initializer_function_ != Function::null();
 }
 
-RawError* Field::InitializeInstance(const Instance& instance) const {
+ErrorPtr Field::InitializeInstance(const Instance& instance) const {
   ASSERT(IsOriginal());
   ASSERT(is_instance());
   ASSERT(instance.GetField(*this) == Object::sentinel().raw());
@@ -9940,7 +9936,7 @@
   return Error::null();
 }
 
-RawError* Field::InitializeStatic() const {
+ErrorPtr Field::InitializeStatic() const {
   ASSERT(IsOriginal());
   ASSERT(is_static());
   if (StaticValue() == Object::sentinel().raw()) {
@@ -9981,7 +9977,7 @@
   return Error::null();
 }
 
-RawObject* Field::EvaluateInitializer() const {
+ObjectPtr Field::EvaluateInitializer() const {
   Thread* const thread = Thread::Current();
   ASSERT(thread->IsMutatorThread());
   NoOOBMessageScope no_msg_scope(thread);
@@ -10459,7 +10455,7 @@
   return raw_ptr()->source_ != String::null();
 }
 
-RawString* Script::Source() const {
+StringPtr Script::Source() const {
   return raw_ptr()->source_;
 }
 
@@ -10491,7 +10487,7 @@
   StoreNonPointer(&raw_ptr()->kernel_script_index_, kernel_script_index);
 }
 
-RawTypedData* Script::kernel_string_offsets() const {
+TypedDataPtr Script::kernel_string_offsets() const {
   KernelProgramInfo& program_info =
       KernelProgramInfo::Handle(kernel_program_info());
   ASSERT(!program_info.IsNull());
@@ -10530,7 +10526,7 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
-RawGrowableObjectArray* Script::GenerateLineNumberArray() const {
+GrowableObjectArrayPtr Script::GenerateLineNumberArray() const {
   Zone* zone = Thread::Current()->zone();
   const GrowableObjectArray& info =
       GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
@@ -10605,11 +10601,11 @@
   StorePointer(&raw_ptr()->debug_positions_, value.raw());
 }
 
-RawTypedData* Script::line_starts() const {
+TypedDataPtr Script::line_starts() const {
   return raw_ptr()->line_starts_;
 }
 
-RawArray* Script::debug_positions() const {
+ArrayPtr Script::debug_positions() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
   Array& debug_positions_array = Array::Handle(raw_ptr()->debug_positions_);
   if (debug_positions_array.IsNull()) {
@@ -10625,12 +10621,13 @@
 }
 
 void Script::SetLazyLookupSourceAndLineStarts(bool value) const {
-  set_flags(RawScript::LazyLookupSourceAndLineStartsBit::update(
+  set_flags(ScriptLayout::LazyLookupSourceAndLineStartsBit::update(
       value, raw_ptr()->flags_));
 }
 
 bool Script::IsLazyLookupSourceAndLineStarts() const {
-  return RawScript::LazyLookupSourceAndLineStartsBit::decode(raw_ptr()->flags_);
+  return ScriptLayout::LazyLookupSourceAndLineStartsBit::decode(
+      raw_ptr()->flags_);
 }
 
 void Script::set_load_timestamp(int64_t value) const {
@@ -10762,7 +10759,7 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
-RawString* Script::GetLine(intptr_t line_number, Heap::Space space) const {
+StringPtr Script::GetLine(intptr_t line_number, Heap::Space space) const {
   const String& src = String::Handle(Source());
   if (src.IsNull()) {
     ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT);
@@ -10797,7 +10794,7 @@
   }
 }
 
-RawString* Script::GetSnippet(TokenPosition from, TokenPosition to) const {
+StringPtr Script::GetSnippet(TokenPosition from, TokenPosition to) const {
   intptr_t from_line;
   intptr_t from_column;
   intptr_t to_line;
@@ -10807,10 +10804,10 @@
   return GetSnippet(from_line, from_column, to_line, to_column);
 }
 
-RawString* Script::GetSnippet(intptr_t from_line,
-                              intptr_t from_column,
-                              intptr_t to_line,
-                              intptr_t to_column) const {
+StringPtr Script::GetSnippet(intptr_t from_line,
+                             intptr_t from_column,
+                             intptr_t to_line,
+                             intptr_t to_column) const {
   const String& src = String::Handle(Source());
   if (src.IsNull()) {
     return Symbols::OptimizedOut().raw();
@@ -10860,20 +10857,20 @@
   return snippet.raw();
 }
 
-RawScript* Script::New() {
+ScriptPtr Script::New() {
   ASSERT(Object::script_class() != Class::null());
-  RawObject* raw =
+  ObjectPtr raw =
       Object::Allocate(Script::kClassId, Script::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawScript*>(raw);
+  return static_cast<ScriptPtr>(raw);
 }
 
-RawScript* Script::New(const String& url, const String& source) {
+ScriptPtr Script::New(const String& url, const String& source) {
   return Script::New(url, url, source);
 }
 
-RawScript* Script::New(const String& url,
-                       const String& resolved_url,
-                       const String& source) {
+ScriptPtr Script::New(const String& url,
+                      const String& resolved_url,
+                      const String& source) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const Script& result = Script::Handle(zone, Script::New());
@@ -10894,7 +10891,7 @@
   return OS::SCreate(Thread::Current()->zone(), "Script(%s)", name.ToCString());
 }
 
-RawLibrary* Script::FindLibrary() const {
+LibraryPtr Script::FindLibrary() const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -10922,7 +10919,7 @@
   MoveToNextObject();
 }
 
-RawObject* DictionaryIterator::GetNext() {
+ObjectPtr DictionaryIterator::GetNext() {
   ASSERT(HasNext());
   int ix = next_ix_++;
   MoveToNextObject();
@@ -10947,7 +10944,7 @@
   MoveToNextClass();
 }
 
-RawClass* ClassDictionaryIterator::GetNextClass() {
+ClassPtr ClassDictionaryIterator::GetNextClass() {
   ASSERT(HasNext());
   Class& cls = Class::Handle();
   if (next_ix_ < size_) {
@@ -10978,7 +10975,7 @@
   Advance();
 }
 
-RawLibraryPrefix* LibraryPrefixIterator::GetNext() {
+LibraryPrefixPtr LibraryPrefixIterator::GetNext() {
   ASSERT(HasNext());
   int ix = next_ix_++;
   Object& obj = Object::Handle(array_.At(ix));
@@ -11037,32 +11034,32 @@
 
 void Library::SetLoadInProgress() const {
   // Must not already be in the process of being loaded.
-  ASSERT(raw_ptr()->load_state_ <= RawLibrary::kLoadRequested);
-  StoreNonPointer(&raw_ptr()->load_state_, RawLibrary::kLoadInProgress);
+  ASSERT(raw_ptr()->load_state_ <= LibraryLayout::kLoadRequested);
+  StoreNonPointer(&raw_ptr()->load_state_, LibraryLayout::kLoadInProgress);
 }
 
 void Library::SetLoadRequested() const {
   // Must not be already loaded.
-  ASSERT(raw_ptr()->load_state_ == RawLibrary::kAllocated);
-  StoreNonPointer(&raw_ptr()->load_state_, RawLibrary::kLoadRequested);
+  ASSERT(raw_ptr()->load_state_ == LibraryLayout::kAllocated);
+  StoreNonPointer(&raw_ptr()->load_state_, LibraryLayout::kLoadRequested);
 }
 
 void Library::SetLoaded() const {
   // Should not be already loaded or just allocated.
   ASSERT(LoadInProgress() || LoadRequested());
-  StoreNonPointer(&raw_ptr()->load_state_, RawLibrary::kLoaded);
+  StoreNonPointer(&raw_ptr()->load_state_, LibraryLayout::kLoaded);
 }
 
-static RawString* MakeClassMetaName(Thread* thread,
-                                    Zone* zone,
-                                    const Class& cls) {
+static StringPtr MakeClassMetaName(Thread* thread,
+                                   Zone* zone,
+                                   const Class& cls) {
   return Symbols::FromConcat(thread, Symbols::At(),
                              String::Handle(zone, cls.Name()));
 }
 
-static RawString* MakeFieldMetaName(Thread* thread,
-                                    Zone* zone,
-                                    const Field& field) {
+static StringPtr MakeFieldMetaName(Thread* thread,
+                                   Zone* zone,
+                                   const Field& field) {
   const String& cname = String::Handle(
       zone,
       MakeClassMetaName(thread, zone, Class::Handle(zone, field.Origin())));
@@ -11073,9 +11070,9 @@
   return Symbols::FromConcatAll(thread, pieces);
 }
 
-static RawString* MakeFunctionMetaName(Thread* thread,
-                                       Zone* zone,
-                                       const Function& func) {
+static StringPtr MakeFunctionMetaName(Thread* thread,
+                                      Zone* zone,
+                                      const Function& func) {
   const String& cname = String::Handle(
       zone,
       MakeClassMetaName(thread, zone, Class::Handle(zone, func.origin())));
@@ -11086,9 +11083,9 @@
   return Symbols::FromConcatAll(thread, pieces);
 }
 
-static RawString* MakeTypeParameterMetaName(Thread* thread,
-                                            Zone* zone,
-                                            const TypeParameter& param) {
+static StringPtr MakeTypeParameterMetaName(Thread* thread,
+                                           Zone* zone,
+                                           const TypeParameter& param) {
   const String& cname = String::Handle(
       zone,
       MakeClassMetaName(thread, zone,
@@ -11189,7 +11186,7 @@
               bytecode_offset);
 }
 
-RawString* Library::MakeMetadataName(const Object& obj) const {
+StringPtr Library::MakeMetadataName(const Object& obj) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   if (obj.IsClass()) {
@@ -11207,7 +11204,7 @@
   return String::null();
 }
 
-RawField* Library::GetMetadataField(const String& metaname) const {
+FieldPtr Library::GetMetadataField(const String& metaname) const {
   const GrowableObjectArray& metadata =
       GrowableObjectArray::Handle(this->metadata());
   Field& entry = Field::Handle();
@@ -11240,7 +11237,7 @@
   }
 }
 
-RawObject* Library::GetMetadata(const Object& obj) const {
+ObjectPtr Library::GetMetadata(const Object& obj) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Object::empty_array().raw();
 #else
@@ -11288,8 +11285,7 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-RawArray* Library::GetExtendedMetadata(const Object& obj,
-                                       intptr_t count) const {
+ArrayPtr Library::GetExtendedMetadata(const Object& obj, intptr_t count) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Object::empty_array().raw();
 #else
@@ -11314,7 +11310,7 @@
            name.CharAt(3) == ':'));
 }
 
-RawObject* Library::ResolveName(const String& name) const {
+ObjectPtr Library::ResolveName(const String& name) const {
   Object& obj = Object::Handle();
   if (FLAG_use_lib_cache && LookupResolvedNamesCache(name, &obj)) {
     return obj.raw();
@@ -11543,8 +11539,8 @@
 // Lookup a name in the library's re-export namespace.
 // This lookup can occur from two different threads: background compiler and
 // mutator thread.
-RawObject* Library::LookupReExport(const String& name,
-                                   ZoneGrowableArray<intptr_t>* trail) const {
+ObjectPtr Library::LookupReExport(const String& name,
+                                  ZoneGrowableArray<intptr_t>* trail) const {
   if (!HasExports()) {
     return Object::null();
   }
@@ -11582,7 +11578,7 @@
   return obj.raw();
 }
 
-RawObject* Library::LookupEntry(const String& name, intptr_t* index) const {
+ObjectPtr Library::LookupEntry(const String& name, intptr_t* index) const {
   ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   REUSABLE_ARRAY_HANDLESCOPE(thread);
@@ -11635,7 +11631,7 @@
   scripts.Add(candidate);
 }
 
-RawArray* Library::LoadedScripts() const {
+ArrayPtr Library::LoadedScripts() const {
   ASSERT(Thread::Current()->IsMutatorThread());
   // We compute the list of loaded scripts lazily. The result is
   // cached in loaded_scripts_.
@@ -11705,8 +11701,8 @@
 
 // TODO(hausner): we might want to add a script dictionary to the
 // library class to make this lookup faster.
-RawScript* Library::LookupScript(const String& url,
-                                 bool useResolvedUri /* = false */) const {
+ScriptPtr Library::LookupScript(const String& url,
+                                bool useResolvedUri /* = false */) const {
   const intptr_t url_length = url.Length();
   if (url_length == 0) {
     return Script::null();
@@ -11756,12 +11752,12 @@
   }
 }
 
-RawObject* Library::LookupLocalObject(const String& name) const {
+ObjectPtr Library::LookupLocalObject(const String& name) const {
   intptr_t index;
   return LookupEntry(name, &index);
 }
 
-RawObject* Library::LookupLocalOrReExportObject(const String& name) const {
+ObjectPtr Library::LookupLocalOrReExportObject(const String& name) const {
   intptr_t index;
   EnsureTopLevelClassIsFinalized();
   const Object& result = Object::Handle(LookupEntry(name, &index));
@@ -11771,7 +11767,7 @@
   return LookupReExport(name);
 }
 
-RawField* Library::LookupFieldAllowPrivate(const String& name) const {
+FieldPtr Library::LookupFieldAllowPrivate(const String& name) const {
   EnsureTopLevelClassIsFinalized();
   Object& obj = Object::Handle(LookupObjectAllowPrivate(name));
   if (obj.IsField()) {
@@ -11780,7 +11776,7 @@
   return Field::null();
 }
 
-RawField* Library::LookupLocalField(const String& name) const {
+FieldPtr Library::LookupLocalField(const String& name) const {
   EnsureTopLevelClassIsFinalized();
   Object& obj = Object::Handle(LookupLocalObjectAllowPrivate(name));
   if (obj.IsField()) {
@@ -11789,7 +11785,7 @@
   return Field::null();
 }
 
-RawFunction* Library::LookupFunctionAllowPrivate(const String& name) const {
+FunctionPtr Library::LookupFunctionAllowPrivate(const String& name) const {
   EnsureTopLevelClassIsFinalized();
   Object& obj = Object::Handle(LookupObjectAllowPrivate(name));
   if (obj.IsFunction()) {
@@ -11798,7 +11794,7 @@
   return Function::null();
 }
 
-RawFunction* Library::LookupLocalFunction(const String& name) const {
+FunctionPtr Library::LookupLocalFunction(const String& name) const {
   EnsureTopLevelClassIsFinalized();
   Object& obj = Object::Handle(LookupLocalObjectAllowPrivate(name));
   if (obj.IsFunction()) {
@@ -11807,7 +11803,7 @@
   return Function::null();
 }
 
-RawObject* Library::LookupLocalObjectAllowPrivate(const String& name) const {
+ObjectPtr Library::LookupLocalObjectAllowPrivate(const String& name) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Object& obj = Object::Handle(zone, Object::null());
@@ -11819,7 +11815,7 @@
   return obj.raw();
 }
 
-RawObject* Library::LookupObjectAllowPrivate(const String& name) const {
+ObjectPtr Library::LookupObjectAllowPrivate(const String& name) const {
   // First check if name is found in the local scope of the library.
   Object& obj = Object::Handle(LookupLocalObjectAllowPrivate(name));
   if (!obj.IsNull()) {
@@ -11835,7 +11831,7 @@
   return LookupImportedObject(name);
 }
 
-RawObject* Library::LookupImportedObject(const String& name) const {
+ObjectPtr Library::LookupImportedObject(const String& name) const {
   Object& obj = Object::Handle();
   Namespace& import = Namespace::Handle();
   Library& import_lib = Library::Handle();
@@ -11896,7 +11892,7 @@
   return found_obj.raw();
 }
 
-RawClass* Library::LookupClass(const String& name) const {
+ClassPtr Library::LookupClass(const String& name) const {
   Object& obj = Object::Handle(LookupLocalObject(name));
   if (obj.IsNull() && !ShouldBePrivate(name)) {
     obj = LookupImportedObject(name);
@@ -11907,7 +11903,7 @@
   return Class::null();
 }
 
-RawClass* Library::LookupLocalClass(const String& name) const {
+ClassPtr Library::LookupLocalClass(const String& name) const {
   Object& obj = Object::Handle(LookupLocalObject(name));
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
@@ -11915,7 +11911,7 @@
   return Class::null();
 }
 
-RawClass* Library::LookupClassAllowPrivate(const String& name) const {
+ClassPtr Library::LookupClassAllowPrivate(const String& name) const {
   // See if the class is available in this library or in the top level
   // scope of any imported library.
   Zone* zone = Thread::Current()->zone();
@@ -11937,7 +11933,7 @@
 }
 
 // Mixin applications can have multiple private keys from different libraries.
-RawClass* Library::SlowLookupClassAllowMultiPartPrivate(
+ClassPtr Library::SlowLookupClassAllowMultiPartPrivate(
     const String& name) const {
   Array& dict = Array::Handle(dictionary());
   Object& entry = Object::Handle();
@@ -11955,7 +11951,7 @@
   return Class::null();
 }
 
-RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const {
+LibraryPrefixPtr Library::LookupLocalLibraryPrefix(const String& name) const {
   const Object& obj = Object::Handle(LookupLocalObject(name));
   if (obj.IsLibraryPrefix()) {
     return LibraryPrefix::Cast(obj).raw();
@@ -11972,7 +11968,7 @@
   StorePointer(&raw_ptr()->metadata_, value.raw());
 }
 
-RawLibrary* Library::ImportLibraryAt(intptr_t index) const {
+LibraryPtr Library::ImportLibraryAt(intptr_t index) const {
   Namespace& import = Namespace::Handle(ImportAt(index));
   if (import.IsNull()) {
     return Library::null();
@@ -11980,7 +11976,7 @@
   return import.library();
 }
 
-RawNamespace* Library::ImportAt(intptr_t index) const {
+NamespacePtr Library::ImportAt(intptr_t index) const {
   if ((index < 0) || index >= num_imports()) {
     return Namespace::null();
   }
@@ -12055,7 +12051,7 @@
   exports.SetAt(num_exports, ns);
 }
 
-static RawArray* NewDictionary(intptr_t initial_size) {
+static ArrayPtr NewDictionary(intptr_t initial_size) {
   const Array& dict = Array::Handle(Array::New(initial_size + 1, Heap::kOld));
   // The last element of the dictionary specifies the number of in use slots.
   dict.SetAt(initial_size, Object::smi_zero());
@@ -12107,22 +12103,20 @@
   StoreNonPointer(&raw_ptr()->num_imports_, 0);
 }
 
-RawLibrary* Library::New() {
+LibraryPtr Library::New() {
   ASSERT(Object::library_class() != Class::null());
-  RawObject* raw =
+  ObjectPtr raw =
       Object::Allocate(Library::kClassId, Library::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawLibrary*>(raw);
+  return static_cast<LibraryPtr>(raw);
 }
 
-RawLibrary* Library::NewLibraryHelper(const String& url, bool import_core_lib) {
+LibraryPtr Library::NewLibraryHelper(const String& url, bool import_core_lib) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   ASSERT(thread->IsMutatorThread());
   // Force the url to have a hash code.
   url.Hash();
   const bool dart_scheme = url.StartsWith(Symbols::DartScheme());
-  const bool dart_private_scheme =
-      dart_scheme && url.StartsWith(Symbols::DartSchemePrivate());
   const Library& result = Library::Handle(zone, Library::New());
   result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw());
   result.StorePointer(&result.raw_ptr()->url_, url.raw());
@@ -12144,10 +12138,7 @@
   result.set_flags(0);
   result.set_is_in_fullsnapshot(false);
   result.set_is_nnbd(false);
-  if (dart_private_scheme) {
-    // Never debug dart:_ libraries.
-    result.set_debuggable(false);
-  } else if (dart_scheme) {
+  if (dart_scheme) {
     // Only debug dart: libraries if we have been requested to show invisible
     // frames.
     result.set_debuggable(FLAG_show_invisible_frames);
@@ -12159,7 +12150,7 @@
   NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
   NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
   result.StoreNonPointer(&result.raw_ptr()->load_state_,
-                         RawLibrary::kAllocated);
+                         LibraryLayout::kAllocated);
   result.StoreNonPointer(&result.raw_ptr()->index_, -1);
   result.InitClassDictionary();
   result.InitImportList();
@@ -12175,7 +12166,7 @@
   return result.raw();
 }
 
-RawLibrary* Library::New(const String& url) {
+LibraryPtr Library::New(const String& url) {
   return NewLibraryHelper(url, false);
 }
 
@@ -12196,7 +12187,7 @@
 }
 
 // Invoke the function, or noSuchMethod if it is null.
-static RawObject* InvokeInstanceFunction(
+static ObjectPtr InvokeInstanceFunction(
     const Instance& receiver,
     const Function& function,
     const String& target_name,
@@ -12212,18 +12203,18 @@
     return DartEntry::InvokeNoSuchMethod(receiver, target_name, args,
                                          args_descriptor_array);
   }
-  RawObject* type_error = function.DoArgumentTypesMatch(args, args_descriptor,
-                                                        instantiator_type_args);
+  ObjectPtr type_error = function.DoArgumentTypesMatch(args, args_descriptor,
+                                                       instantiator_type_args);
   if (type_error != Error::null()) {
     return type_error;
   }
   return DartEntry::InvokeFunction(function, args, args_descriptor_array);
 }
 
-RawObject* Library::InvokeGetter(const String& getter_name,
-                                 bool throw_nsm_if_absent,
-                                 bool respect_reflectable,
-                                 bool check_is_entrypoint) const {
+ObjectPtr Library::InvokeGetter(const String& getter_name,
+                                bool throw_nsm_if_absent,
+                                bool respect_reflectable,
+                                bool check_is_entrypoint) const {
   Object& obj = Object::Handle(LookupLocalOrReExportObject(getter_name));
   Function& getter = Function::Handle();
   if (obj.IsField()) {
@@ -12288,10 +12279,10 @@
   return DartEntry::InvokeFunction(getter, Object::empty_array());
 }
 
-RawObject* Library::InvokeSetter(const String& setter_name,
-                                 const Instance& value,
-                                 bool respect_reflectable,
-                                 bool check_is_entrypoint) const {
+ObjectPtr Library::InvokeSetter(const String& setter_name,
+                                const Instance& value,
+                                bool respect_reflectable,
+                                bool check_is_entrypoint) const {
   Object& obj = Object::Handle(LookupLocalOrReExportObject(setter_name));
   const String& internal_setter_name =
       String::Handle(Field::SetterName(setter_name));
@@ -12352,11 +12343,11 @@
   return DartEntry::InvokeFunction(setter, args);
 }
 
-RawObject* Library::Invoke(const String& function_name,
-                           const Array& args,
-                           const Array& arg_names,
-                           bool respect_reflectable,
-                           bool check_is_entrypoint) const {
+ObjectPtr Library::Invoke(const String& function_name,
+                          const Array& args,
+                          const Array& arg_names,
+                          bool respect_reflectable,
+                          bool check_is_entrypoint) const {
   // TODO(regis): Support invocation of generic functions with type arguments.
   const int kTypeArgsLen = 0;
 
@@ -12407,7 +12398,7 @@
         function_name, args, arg_names, InvocationMirror::kTopLevel,
         InvocationMirror::kMethod);
   }
-  RawObject* type_error =
+  ObjectPtr type_error =
       function.DoArgumentTypesMatch(args, args_descriptor, type_args);
   if (type_error != Error::null()) {
     return type_error;
@@ -12415,7 +12406,7 @@
   return DartEntry::InvokeFunction(function, args, args_descriptor_array);
 }
 
-RawObject* Library::EvaluateCompiledExpression(
+ObjectPtr Library::EvaluateCompiledExpression(
     const ExternalTypedData& kernel_buffer,
     const Array& type_definitions,
     const Array& arguments,
@@ -12475,11 +12466,11 @@
 
   static uword Hash(const Object& key) { return String::Cast(key).Hash(); }
 
-  static RawObject* NewKey(const String& str) { return str.raw(); }
+  static ObjectPtr NewKey(const String& str) { return str.raw(); }
 };
 typedef UnorderedHashMap<LibraryLookupTraits> LibraryLookupMap;
 
-static RawObject* EvaluateCompiledExpressionHelper(
+static ObjectPtr EvaluateCompiledExpressionHelper(
     const ExternalTypedData& kernel_buffer,
     const Array& type_definitions,
     const String& library_url,
@@ -12548,7 +12539,7 @@
 }
 
 // Returns library with given url in current isolate, or NULL.
-RawLibrary* Library::LookupLibrary(Thread* thread, const String& url) {
+LibraryPtr Library::LookupLibrary(Thread* thread, const String& url) {
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
   ObjectStore* object_store = isolate->object_store();
@@ -12638,7 +12629,7 @@
   return name.EqualsConcat(member, private_key);
 }
 
-RawClass* Library::LookupCoreClass(const String& class_name) {
+ClassPtr Library::LookupCoreClass(const String& class_name) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const Library& core_lib = Library::Handle(zone, Library::CoreLibrary());
@@ -12653,7 +12644,7 @@
 
 // Cannot handle qualified names properly as it only appends private key to
 // the end (e.g. _Alfa.foo -> _Alfa.foo@...).
-RawString* Library::PrivateName(const String& name) const {
+StringPtr Library::PrivateName(const String& name) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   ASSERT(IsPrivate(name));
@@ -12665,7 +12656,7 @@
   return str.raw();
 }
 
-RawLibrary* Library::GetLibrary(intptr_t index) {
+LibraryPtr Library::GetLibrary(intptr_t index) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -12728,65 +12719,65 @@
   isolate->object_store()->set_libraries_map(map.Release());
 }
 
-RawLibrary* Library::AsyncLibrary() {
+LibraryPtr Library::AsyncLibrary() {
   return Isolate::Current()->object_store()->async_library();
 }
 
-RawLibrary* Library::ConvertLibrary() {
+LibraryPtr Library::ConvertLibrary() {
   return Isolate::Current()->object_store()->convert_library();
 }
 
-RawLibrary* Library::CoreLibrary() {
+LibraryPtr Library::CoreLibrary() {
   return Isolate::Current()->object_store()->core_library();
 }
 
-RawLibrary* Library::CollectionLibrary() {
+LibraryPtr Library::CollectionLibrary() {
   return Isolate::Current()->object_store()->collection_library();
 }
 
-RawLibrary* Library::DeveloperLibrary() {
+LibraryPtr Library::DeveloperLibrary() {
   return Isolate::Current()->object_store()->developer_library();
 }
 
-RawLibrary* Library::FfiLibrary() {
+LibraryPtr Library::FfiLibrary() {
   return Isolate::Current()->object_store()->ffi_library();
 }
 
-RawLibrary* Library::InternalLibrary() {
+LibraryPtr Library::InternalLibrary() {
   return Isolate::Current()->object_store()->_internal_library();
 }
 
-RawLibrary* Library::IsolateLibrary() {
+LibraryPtr Library::IsolateLibrary() {
   return Isolate::Current()->object_store()->isolate_library();
 }
 
-RawLibrary* Library::MathLibrary() {
+LibraryPtr Library::MathLibrary() {
   return Isolate::Current()->object_store()->math_library();
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-RawLibrary* Library::MirrorsLibrary() {
+LibraryPtr Library::MirrorsLibrary() {
   return Isolate::Current()->object_store()->mirrors_library();
 }
 #endif
 
-RawLibrary* Library::NativeWrappersLibrary() {
+LibraryPtr Library::NativeWrappersLibrary() {
   return Isolate::Current()->object_store()->native_wrappers_library();
 }
 
-RawLibrary* Library::ProfilerLibrary() {
+LibraryPtr Library::ProfilerLibrary() {
   return Isolate::Current()->object_store()->profiler_library();
 }
 
-RawLibrary* Library::TypedDataLibrary() {
+LibraryPtr Library::TypedDataLibrary() {
   return Isolate::Current()->object_store()->typed_data_library();
 }
 
-RawLibrary* Library::VMServiceLibrary() {
+LibraryPtr Library::VMServiceLibrary() {
   return Isolate::Current()->object_store()->_vmservice_library();
 }
 
-RawLibrary* Library::WasmLibrary() {
+LibraryPtr Library::WasmLibrary() {
   return Isolate::Current()->object_store()->wasm_library();
 }
 
@@ -12797,7 +12788,7 @@
                      name.ToCString());
 }
 
-RawLibrary* LibraryPrefix::GetLibrary(int index) const {
+LibraryPtr LibraryPrefix::GetLibrary(int index) const {
   if ((index >= 0) || (index < num_imports())) {
     const Array& imports = Array::Handle(this->imports());
     Namespace& import = Namespace::Handle();
@@ -12826,16 +12817,16 @@
   set_num_imports(num_current_imports + 1);
 }
 
-RawLibraryPrefix* LibraryPrefix::New() {
-  RawObject* raw = Object::Allocate(LibraryPrefix::kClassId,
-                                    LibraryPrefix::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawLibraryPrefix*>(raw);
+LibraryPrefixPtr LibraryPrefix::New() {
+  ObjectPtr raw = Object::Allocate(LibraryPrefix::kClassId,
+                                   LibraryPrefix::InstanceSize(), Heap::kOld);
+  return static_cast<LibraryPrefixPtr>(raw);
 }
 
-RawLibraryPrefix* LibraryPrefix::New(const String& name,
-                                     const Namespace& import,
-                                     bool deferred_load,
-                                     const Library& importer) {
+LibraryPrefixPtr LibraryPrefix::New(const String& name,
+                                    const Namespace& import,
+                                    bool deferred_load,
+                                    const Library& importer) {
   const LibraryPrefix& result = LibraryPrefix::Handle(LibraryPrefix::New());
   result.set_name(name);
   result.set_num_imports(0);
@@ -12892,7 +12883,7 @@
   set_metadata_field(field);
 }
 
-RawObject* Namespace::GetMetadata() const {
+ObjectPtr Namespace::GetMetadata() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Object::empty_array().raw();
 #else
@@ -12971,8 +12962,8 @@
 
 // Look up object with given name in library and filter out hidden
 // names. Also look up getters and setters.
-RawObject* Namespace::Lookup(const String& name,
-                             ZoneGrowableArray<intptr_t>* trail) const {
+ObjectPtr Namespace::Lookup(const String& name,
+                            ZoneGrowableArray<intptr_t>* trail) const {
   Zone* zone = Thread::Current()->zone();
   const Library& lib = Library::Handle(zone, library());
 
@@ -13028,16 +13019,16 @@
   return obj.raw();
 }
 
-RawNamespace* Namespace::New() {
+NamespacePtr Namespace::New() {
   ASSERT(Object::namespace_class() != Class::null());
-  RawObject* raw = Object::Allocate(Namespace::kClassId,
-                                    Namespace::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawNamespace*>(raw);
+  ObjectPtr raw = Object::Allocate(Namespace::kClassId,
+                                   Namespace::InstanceSize(), Heap::kOld);
+  return static_cast<NamespacePtr>(raw);
 }
 
-RawNamespace* Namespace::New(const Library& library,
-                             const Array& show_names,
-                             const Array& hide_names) {
+NamespacePtr Namespace::New(const Library& library,
+                            const Array& show_names,
+                            const Array& hide_names) {
   ASSERT(show_names.IsNull() || (show_names.Length() > 0));
   ASSERT(hide_names.IsNull() || (hide_names.Length() > 0));
   const Namespace& result = Namespace::Handle(Namespace::New());
@@ -13047,14 +13038,14 @@
   return result.raw();
 }
 
-RawKernelProgramInfo* KernelProgramInfo::New() {
-  RawObject* raw =
+KernelProgramInfoPtr KernelProgramInfo::New() {
+  ObjectPtr raw =
       Object::Allocate(KernelProgramInfo::kClassId,
                        KernelProgramInfo::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawKernelProgramInfo*>(raw);
+  return static_cast<KernelProgramInfoPtr>(raw);
 }
 
-RawKernelProgramInfo* KernelProgramInfo::New(
+KernelProgramInfoPtr KernelProgramInfo::New(
     const TypedData& string_offsets,
     const ExternalTypedData& string_data,
     const TypedData& canonical_names,
@@ -13089,9 +13080,9 @@
   return "[KernelProgramInfo]";
 }
 
-RawScript* KernelProgramInfo::ScriptAt(intptr_t index) const {
+ScriptPtr KernelProgramInfo::ScriptAt(intptr_t index) const {
   const Array& all_scripts = Array::Handle(scripts());
-  RawObject* script = all_scripts.At(index);
+  ObjectPtr script = all_scripts.At(index);
   return Script::RawCast(script);
 }
 
@@ -13128,8 +13119,8 @@
 
 typedef UnorderedHashMap<SmiTraits> IntHashMap;
 
-RawLibrary* KernelProgramInfo::LookupLibrary(Thread* thread,
-                                             const Smi& name_index) const {
+LibraryPtr KernelProgramInfo::LookupLibrary(Thread* thread,
+                                            const Smi& name_index) const {
   REUSABLE_ARRAY_HANDLESCOPE(thread);
   REUSABLE_LIBRARY_HANDLESCOPE(thread);
   REUSABLE_OBJECT_HANDLESCOPE(thread);
@@ -13150,9 +13141,9 @@
   return result.raw();
 }
 
-RawLibrary* KernelProgramInfo::InsertLibrary(Thread* thread,
-                                             const Smi& name_index,
-                                             const Library& lib) const {
+LibraryPtr KernelProgramInfo::InsertLibrary(Thread* thread,
+                                            const Smi& name_index,
+                                            const Library& lib) const {
   REUSABLE_ARRAY_HANDLESCOPE(thread);
   REUSABLE_LIBRARY_HANDLESCOPE(thread);
   REUSABLE_OBJECT_HANDLESCOPE(thread);
@@ -13177,8 +13168,8 @@
   StorePointer(&raw_ptr()->classes_cache_, cache.raw());
 }
 
-RawClass* KernelProgramInfo::LookupClass(Thread* thread,
-                                         const Smi& name_index) const {
+ClassPtr KernelProgramInfo::LookupClass(Thread* thread,
+                                        const Smi& name_index) const {
   REUSABLE_ARRAY_HANDLESCOPE(thread);
   REUSABLE_CLASS_HANDLESCOPE(thread);
   REUSABLE_OBJECT_HANDLESCOPE(thread);
@@ -13199,9 +13190,9 @@
   return result.raw();
 }
 
-RawClass* KernelProgramInfo::InsertClass(Thread* thread,
-                                         const Smi& name_index,
-                                         const Class& klass) const {
+ClassPtr KernelProgramInfo::InsertClass(Thread* thread,
+                                        const Smi& name_index,
+                                        const Class& klass) const {
   REUSABLE_ARRAY_HANDLESCOPE(thread);
   REUSABLE_CLASS_HANDLESCOPE(thread);
   REUSABLE_OBJECT_HANDLESCOPE(thread);
@@ -13227,7 +13218,7 @@
   StorePointer(&raw_ptr()->bytecode_component_, bytecode_component.raw());
 }
 
-RawError* Library::CompileAll(bool ignore_error /* = false */) {
+ErrorPtr Library::CompileAll(bool ignore_error /* = false */) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Error& error = Error::Handle(zone);
@@ -13275,7 +13266,7 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
-RawError* Library::FinalizeAllClasses() {
+ErrorPtr Library::FinalizeAllClasses() {
   Thread* thread = Thread::Current();
   ASSERT(thread->IsMutatorThread());
   Zone* zone = thread->zone();
@@ -13307,7 +13298,7 @@
   return Error::null();
 }
 
-RawError* Library::ReadAllBytecode() {
+ErrorPtr Library::ReadAllBytecode() {
   Thread* thread = Thread::Current();
   ASSERT(thread->IsMutatorThread());
   Zone* zone = thread->zone();
@@ -13337,9 +13328,9 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 // Return Function::null() if function does not exist in libs.
-RawFunction* Library::GetFunction(const GrowableArray<Library*>& libs,
-                                  const char* class_name,
-                                  const char* function_name) {
+FunctionPtr Library::GetFunction(const GrowableArray<Library*>& libs,
+                                 const char* class_name,
+                                 const char* function_name) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Function& func = Function::Handle(zone);
@@ -13369,7 +13360,7 @@
   return Function::null();
 }
 
-RawObject* Library::GetFunctionClosure(const String& name) const {
+ObjectPtr Library::GetFunctionClosure(const String& name) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Function& func = Function::Handle(zone, LookupFunctionAllowPrivate(name));
@@ -13460,7 +13451,7 @@
 }
 #endif  // defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME).
 
-RawInstructions* Instructions::New(intptr_t size, bool has_monomorphic_entry) {
+InstructionsPtr Instructions::New(intptr_t size, bool has_monomorphic_entry) {
   ASSERT(size >= 0);
   ASSERT(Object::instructions_class() != Class::null());
   if (size < 0 || size > kMaxElements) {
@@ -13470,7 +13461,7 @@
   Instructions& result = Instructions::Handle();
   {
     uword aligned_size = Instructions::InstanceSize(size);
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Instructions::kClassId, aligned_size, Heap::kCode);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -13533,7 +13524,7 @@
   return Utils::DecodeSLEB128<intptr_t>(data, Length(), byte_index);
 }
 
-RawObjectPool* ObjectPool::New(intptr_t len) {
+ObjectPoolPtr ObjectPool::New(intptr_t len) {
   ASSERT(Object::object_pool_class() != Class::null());
   if (len < 0 || len > kMaxElements) {
     // This should be caught before we reach here.
@@ -13542,7 +13533,7 @@
   ObjectPool& result = ObjectPool::Handle();
   {
     uword size = ObjectPool::InstanceSize(len);
-    RawObject* raw = Object::Allocate(ObjectPool::kClassId, size, Heap::kOld);
+    ObjectPtr raw = Object::Allocate(ObjectPool::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -13556,7 +13547,7 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-RawObjectPool* ObjectPool::NewFromBuilder(
+ObjectPoolPtr ObjectPool::NewFromBuilder(
     const compiler::ObjectPoolBuilder& builder) {
   const intptr_t len = builder.CurrentLength();
   if (len == 0) {
@@ -13653,14 +13644,13 @@
   }
 }
 
-RawPcDescriptors* PcDescriptors::New(GrowableArray<uint8_t>* data) {
+PcDescriptorsPtr PcDescriptors::New(GrowableArray<uint8_t>* data) {
   ASSERT(Object::pc_descriptors_class() != Class::null());
   Thread* thread = Thread::Current();
   PcDescriptors& result = PcDescriptors::Handle(thread->zone());
   {
     uword size = PcDescriptors::InstanceSize(data->length());
-    RawObject* raw =
-        Object::Allocate(PcDescriptors::kClassId, size, Heap::kOld);
+    ObjectPtr raw = Object::Allocate(PcDescriptors::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(data->length());
@@ -13669,14 +13659,13 @@
   return result.raw();
 }
 
-RawPcDescriptors* PcDescriptors::New(intptr_t length) {
+PcDescriptorsPtr PcDescriptors::New(intptr_t length) {
   ASSERT(Object::pc_descriptors_class() != Class::null());
   Thread* thread = Thread::Current();
   PcDescriptors& result = PcDescriptors::Handle(thread->zone());
   {
     uword size = PcDescriptors::InstanceSize(length);
-    RawObject* raw =
-        Object::Allocate(PcDescriptors::kClassId, size, Heap::kOld);
+    ObjectPtr raw = Object::Allocate(PcDescriptors::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(length);
@@ -13684,25 +13673,25 @@
   return result.raw();
 }
 
-const char* PcDescriptors::KindAsStr(RawPcDescriptors::Kind kind) {
+const char* PcDescriptors::KindAsStr(PcDescriptorsLayout::Kind kind) {
   switch (kind) {
-    case RawPcDescriptors::kDeopt:
+    case PcDescriptorsLayout::kDeopt:
       return "deopt        ";
-    case RawPcDescriptors::kIcCall:
+    case PcDescriptorsLayout::kIcCall:
       return "ic-call      ";
-    case RawPcDescriptors::kUnoptStaticCall:
+    case PcDescriptorsLayout::kUnoptStaticCall:
       return "unopt-call   ";
-    case RawPcDescriptors::kRuntimeCall:
+    case PcDescriptorsLayout::kRuntimeCall:
       return "runtime-call ";
-    case RawPcDescriptors::kOsrEntry:
+    case PcDescriptorsLayout::kOsrEntry:
       return "osr-entry    ";
-    case RawPcDescriptors::kRewind:
+    case PcDescriptorsLayout::kRewind:
       return "rewind       ";
-    case RawPcDescriptors::kBSSRelocation:
+    case PcDescriptorsLayout::kBSSRelocation:
       return "bss reloc    ";
-    case RawPcDescriptors::kOther:
+    case PcDescriptorsLayout::kOther:
       return "other        ";
-    case RawPcDescriptors::kAnyKind:
+    case PcDescriptorsLayout::kAnyKind:
       UNREACHABLE();
       break;
   }
@@ -13731,7 +13720,7 @@
   // First compute the buffer size required.
   intptr_t len = 1;  // Trailing '\0'.
   {
-    Iterator iter(*this, RawPcDescriptors::kAnyKind);
+    Iterator iter(*this, PcDescriptorsLayout::kAnyKind);
     while (iter.MoveNext()) {
       len += Utils::SNPrint(NULL, 0, FORMAT, addr_width, iter.PcOffset(),
                             KindAsStr(iter.Kind()), iter.DeoptId(),
@@ -13743,7 +13732,7 @@
   char* buffer = Thread::Current()->zone()->Alloc<char>(len);
   // Layout the fields in the buffer.
   intptr_t index = 0;
-  Iterator iter(*this, RawPcDescriptors::kAnyKind);
+  Iterator iter(*this, PcDescriptorsLayout::kAnyKind);
   while (iter.MoveNext()) {
     index += Utils::SNPrint((buffer + index), (len - index), FORMAT, addr_width,
                             iter.PcOffset(), KindAsStr(iter.Kind()),
@@ -13767,7 +13756,7 @@
   }
   intptr_t max_deopt_id = 0;
   Iterator max_iter(*this,
-                    RawPcDescriptors::kDeopt | RawPcDescriptors::kIcCall);
+                    PcDescriptorsLayout::kDeopt | PcDescriptorsLayout::kIcCall);
   while (max_iter.MoveNext()) {
     if (max_iter.DeoptId() > max_deopt_id) {
       max_deopt_id = max_iter.DeoptId();
@@ -13777,7 +13766,8 @@
   Zone* zone = Thread::Current()->zone();
   BitVector* deopt_ids = new (zone) BitVector(zone, max_deopt_id + 1);
   BitVector* iccall_ids = new (zone) BitVector(zone, max_deopt_id + 1);
-  Iterator iter(*this, RawPcDescriptors::kDeopt | RawPcDescriptors::kIcCall);
+  Iterator iter(*this,
+                PcDescriptorsLayout::kDeopt | PcDescriptorsLayout::kIcCall);
   while (iter.MoveNext()) {
     // 'deopt_id' is set for kDeopt and kIcCall and must be unique for one kind.
     if (DeoptId::IsDeoptAfter(iter.DeoptId())) {
@@ -13786,7 +13776,7 @@
       // lead to issues in the future. Fix that and enable verification.
       continue;
     }
-    if (iter.Kind() == RawPcDescriptors::kDeopt) {
+    if (iter.Kind() == PcDescriptorsLayout::kDeopt) {
       ASSERT(!deopt_ids->Contains(iter.DeoptId()));
       deopt_ids->Add(iter.DeoptId());
     } else {
@@ -13801,14 +13791,13 @@
   StoreNonPointer(&raw_ptr()->length_, value);
 }
 
-RawCodeSourceMap* CodeSourceMap::New(intptr_t length) {
+CodeSourceMapPtr CodeSourceMap::New(intptr_t length) {
   ASSERT(Object::code_source_map_class() != Class::null());
   Thread* thread = Thread::Current();
   CodeSourceMap& result = CodeSourceMap::Handle(thread->zone());
   {
     uword size = CodeSourceMap::InstanceSize(length);
-    RawObject* raw =
-        Object::Allocate(CodeSourceMap::kClassId, size, Heap::kOld);
+    ObjectPtr raw = Object::Allocate(CodeSourceMap::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(length);
@@ -13829,7 +13818,7 @@
   return FinalizeHash(hash, kHashBits);
 }
 
-RawCompressedStackMaps* CompressedStackMaps::New(
+CompressedStackMapsPtr CompressedStackMaps::New(
     const GrowableArray<uint8_t>& payload,
     bool is_global_table,
     bool uses_global_table) {
@@ -13839,7 +13828,7 @@
   auto& result = CompressedStackMaps::Handle();
 
   const uintptr_t payload_size = payload.length();
-  if (!RawCompressedStackMaps::SizeField::is_valid(payload_size)) {
+  if (!CompressedStackMapsLayout::SizeField::is_valid(payload_size)) {
     FATAL1(
         "Fatal error in CompressedStackMaps::New: "
         "invalid payload size %" Pu "\n",
@@ -13848,16 +13837,16 @@
   {
     // CompressedStackMaps data objects are associated with a code object,
     // allocate them in old generation.
-    RawObject* raw = Object::Allocate(
+    ObjectPtr raw = Object::Allocate(
         CompressedStackMaps::kClassId,
         CompressedStackMaps::InstanceSize(payload_size), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(
         &result.raw_ptr()->flags_and_size_,
-        RawCompressedStackMaps::GlobalTableBit::encode(is_global_table) |
-            RawCompressedStackMaps::UsesTableBit::encode(uses_global_table) |
-            RawCompressedStackMaps::SizeField::encode(payload_size));
+        CompressedStackMapsLayout::GlobalTableBit::encode(is_global_table) |
+            CompressedStackMapsLayout::UsesTableBit::encode(uses_global_table) |
+            CompressedStackMapsLayout::SizeField::encode(payload_size));
     auto cursor = result.UnsafeMutableNonPointer(result.raw_ptr()->data());
     memcpy(cursor, payload.data(), payload.length());  // NOLINT
   }
@@ -13877,35 +13866,37 @@
   return it.ToCString(zone);
 }
 
-RawString* LocalVarDescriptors::GetName(intptr_t var_index) const {
+StringPtr LocalVarDescriptors::GetName(intptr_t var_index) const {
   ASSERT(var_index < Length());
-  ASSERT(Object::Handle(*raw()->nameAddrAt(var_index)).IsString());
-  return *raw()->nameAddrAt(var_index);
+  ASSERT(Object::Handle(*raw()->ptr()->nameAddrAt(var_index)).IsString());
+  return *raw()->ptr()->nameAddrAt(var_index);
 }
 
-void LocalVarDescriptors::SetVar(intptr_t var_index,
-                                 const String& name,
-                                 RawLocalVarDescriptors::VarInfo* info) const {
+void LocalVarDescriptors::SetVar(
+    intptr_t var_index,
+    const String& name,
+    LocalVarDescriptorsLayout::VarInfo* info) const {
   ASSERT(var_index < Length());
   ASSERT(!name.IsNull());
-  StorePointer(raw()->nameAddrAt(var_index), name.raw());
-  raw()->data()[var_index] = *info;
+  StorePointer(raw()->ptr()->nameAddrAt(var_index), name.raw());
+  raw()->ptr()->data()[var_index] = *info;
 }
 
-void LocalVarDescriptors::GetInfo(intptr_t var_index,
-                                  RawLocalVarDescriptors::VarInfo* info) const {
+void LocalVarDescriptors::GetInfo(
+    intptr_t var_index,
+    LocalVarDescriptorsLayout::VarInfo* info) const {
   ASSERT(var_index < Length());
-  *info = raw()->data()[var_index];
+  *info = raw()->ptr()->data()[var_index];
 }
 
 static int PrintVarInfo(char* buffer,
                         int len,
                         intptr_t i,
                         const String& var_name,
-                        const RawLocalVarDescriptors::VarInfo& info) {
-  const RawLocalVarDescriptors::VarInfoKind kind = info.kind();
+                        const LocalVarDescriptorsLayout::VarInfo& info) {
+  const LocalVarDescriptorsLayout::VarInfoKind kind = info.kind();
   const int32_t index = info.index();
-  if (kind == RawLocalVarDescriptors::kContextLevel) {
+  if (kind == LocalVarDescriptorsLayout::kContextLevel) {
     return Utils::SNPrint(buffer, len,
                           "%2" Pd
                           " %-13s level=%-3d"
@@ -13913,7 +13904,7 @@
                           i, LocalVarDescriptors::KindToCString(kind), index,
                           static_cast<int>(info.begin_pos.value()),
                           static_cast<int>(info.end_pos.value()));
-  } else if (kind == RawLocalVarDescriptors::kContextVar) {
+  } else if (kind == LocalVarDescriptorsLayout::kContextVar) {
     return Utils::SNPrint(
         buffer, len,
         "%2" Pd
@@ -13944,7 +13935,7 @@
   intptr_t len = 1;  // Trailing '\0'.
   String& var_name = String::Handle();
   for (intptr_t i = 0; i < Length(); i++) {
-    RawLocalVarDescriptors::VarInfo info;
+    LocalVarDescriptorsLayout::VarInfo info;
     var_name = GetName(i);
     GetInfo(i, &info);
     len += PrintVarInfo(NULL, 0, i, var_name, info);
@@ -13953,7 +13944,7 @@
   buffer[0] = '\0';
   intptr_t num_chars = 0;
   for (intptr_t i = 0; i < Length(); i++) {
-    RawLocalVarDescriptors::VarInfo info;
+    LocalVarDescriptorsLayout::VarInfo info;
     var_name = GetName(i);
     GetInfo(i, &info);
     num_chars += PrintVarInfo((buffer + num_chars), (len - num_chars), i,
@@ -13963,15 +13954,15 @@
 }
 
 const char* LocalVarDescriptors::KindToCString(
-    RawLocalVarDescriptors::VarInfoKind kind) {
+    LocalVarDescriptorsLayout::VarInfoKind kind) {
   switch (kind) {
-    case RawLocalVarDescriptors::kStackVar:
+    case LocalVarDescriptorsLayout::kStackVar:
       return "StackVar";
-    case RawLocalVarDescriptors::kContextVar:
+    case LocalVarDescriptorsLayout::kContextVar:
       return "ContextVar";
-    case RawLocalVarDescriptors::kContextLevel:
+    case LocalVarDescriptorsLayout::kContextLevel:
       return "ContextLevel";
-    case RawLocalVarDescriptors::kSavedCurrentContext:
+    case LocalVarDescriptorsLayout::kSavedCurrentContext:
       return "CurrentCtx";
     default:
       UNIMPLEMENTED();
@@ -13979,19 +13970,19 @@
   }
 }
 
-RawLocalVarDescriptors* LocalVarDescriptors::New(intptr_t num_variables) {
+LocalVarDescriptorsPtr LocalVarDescriptors::New(intptr_t num_variables) {
   ASSERT(Object::var_descriptors_class() != Class::null());
   if (num_variables < 0 || num_variables > kMaxElements) {
     // This should be caught before we reach here.
     FATAL2(
         "Fatal error in LocalVarDescriptors::New: "
         "invalid num_variables %" Pd ". Maximum is: %d\n",
-        num_variables, RawLocalVarDescriptors::kMaxIndex);
+        num_variables, LocalVarDescriptorsLayout::kMaxIndex);
   }
   LocalVarDescriptors& result = LocalVarDescriptors::Handle();
   {
     uword size = LocalVarDescriptors::InstanceSize(num_variables);
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(LocalVarDescriptors::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -14070,7 +14061,7 @@
   handled_types_data.SetAt(try_index, handled_types);
 }
 
-RawArray* ExceptionHandlers::GetHandledTypes(intptr_t try_index) const {
+ArrayPtr ExceptionHandlers::GetHandledTypes(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < num_entries()));
   Array& array = Array::Handle(raw_ptr()->handled_types_data_);
   array ^= array.At(try_index);
@@ -14081,7 +14072,7 @@
   StorePointer(&raw_ptr()->handled_types_data_, value.raw());
 }
 
-RawExceptionHandlers* ExceptionHandlers::New(intptr_t num_handlers) {
+ExceptionHandlersPtr ExceptionHandlers::New(intptr_t num_handlers) {
   ASSERT(Object::exception_handlers_class() != Class::null());
   if ((num_handlers < 0) || (num_handlers >= kMaxHandlers)) {
     FATAL1(
@@ -14092,7 +14083,7 @@
   ExceptionHandlers& result = ExceptionHandlers::Handle();
   {
     uword size = ExceptionHandlers::InstanceSize(num_handlers);
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(ExceptionHandlers::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -14105,7 +14096,7 @@
   return result.raw();
 }
 
-RawExceptionHandlers* ExceptionHandlers::New(const Array& handled_types_data) {
+ExceptionHandlersPtr ExceptionHandlers::New(const Array& handled_types_data) {
   ASSERT(Object::exception_handlers_class() != Class::null());
   const intptr_t num_handlers = handled_types_data.Length();
   if ((num_handlers < 0) || (num_handlers >= kMaxHandlers)) {
@@ -14117,7 +14108,7 @@
   ExceptionHandlers& result = ExceptionHandlers::Handle();
   {
     uword size = ExceptionHandlers::InstanceSize(num_handlers);
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(ExceptionHandlers::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -14200,10 +14191,10 @@
                              Object::Handle(zone, name()).ToCString());
 }
 
-RawParameterTypeCheck* ParameterTypeCheck::New() {
+ParameterTypeCheckPtr ParameterTypeCheck::New() {
   ParameterTypeCheck& result = ParameterTypeCheck::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(ParameterTypeCheck::kClassId,
                          ParameterTypeCheck::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
@@ -14221,11 +14212,11 @@
   return "SingleTargetCache";
 }
 
-RawSingleTargetCache* SingleTargetCache::New() {
+SingleTargetCachePtr SingleTargetCache::New() {
   SingleTargetCache& result = SingleTargetCache::Handle();
   {
     // IC data objects are long living objects, allocate them in old generation.
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(SingleTargetCache::kClassId,
                          SingleTargetCache::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
@@ -14264,7 +14255,7 @@
   return "UnlinkedCall";
 }
 
-RawUnlinkedCall* UnlinkedCall::New() {
+UnlinkedCallPtr UnlinkedCall::New() {
   UnlinkedCall& result = UnlinkedCall::Handle();
   result ^= Object::Allocate(UnlinkedCall::kClassId,
                              UnlinkedCall::InstanceSize(), Heap::kOld);
@@ -14272,8 +14263,8 @@
   return result.raw();
 }
 
-RawMonomorphicSmiableCall* MonomorphicSmiableCall::New(classid_t expected_cid,
-                                                       const Code& target) {
+MonomorphicSmiableCallPtr MonomorphicSmiableCall::New(classid_t expected_cid,
+                                                      const Code& target) {
   auto& result = MonomorphicSmiableCall::Handle();
   result ^=
       Object::Allocate(MonomorphicSmiableCall::kClassId,
@@ -14331,7 +14322,7 @@
       name.ToCString(), num_args, num_checks, type_args_len);
 }
 
-RawFunction* ICData::Owner() const {
+FunctionPtr ICData::Owner() const {
   Object& obj = Object::Handle(raw_ptr()->owner_);
   if (obj.IsNull()) {
     ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT);
@@ -14345,7 +14336,7 @@
   }
 }
 
-RawICData* ICData::Original() const {
+ICDataPtr ICData::Original() const {
   if (IsNull()) {
     return ICData::null();
   }
@@ -14360,11 +14351,11 @@
 void ICData::SetOriginal(const ICData& value) const {
   ASSERT(value.IsOriginal());
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->owner_, reinterpret_cast<RawObject*>(value.raw()));
+  StorePointer(&raw_ptr()->owner_, static_cast<ObjectPtr>(value.raw()));
 }
 
 void ICData::set_owner(const Function& value) const {
-  StorePointer(&raw_ptr()->owner_, reinterpret_cast<RawObject*>(value.raw()));
+  StorePointer(&raw_ptr()->owner_, static_cast<ObjectPtr>(value.raw()));
 }
 
 void ICData::set_deopt_id(intptr_t value) const {
@@ -14378,8 +14369,8 @@
 
 void ICData::set_entries(const Array& value) const {
   ASSERT(!value.IsNull());
-  StorePointer<RawArray*, std::memory_order_release>(&raw_ptr()->entries_,
-                                                     value.raw());
+  StorePointer<ArrayPtr, std::memory_order_release>(&raw_ptr()->entries_,
+                                                    value.raw());
 }
 
 intptr_t ICData::NumArgsTested() const {
@@ -14782,7 +14773,7 @@
   set_entries(data);
 }
 
-RawArray* ICData::Grow(intptr_t* index) const {
+ArrayPtr ICData::Grow(intptr_t* index) const {
   Array& data = Array::Handle(entries());
   // Last entry in array should be a sentinel and will be the new entry
   // that can be updated after growing.
@@ -14968,11 +14959,11 @@
   ASSERT(!IsSentinelAt(index));
   const intptr_t data_pos = index * TestEntryLength();
   NoSafepointScope no_safepoint;
-  RawArray* raw_data = entries();
+  ArrayPtr raw_data = entries();
   return Smi::Value(Smi::RawCast(raw_data->ptr()->data()[data_pos]));
 }
 
-RawFunction* ICData::GetTargetAt(intptr_t index) const {
+FunctionPtr ICData::GetTargetAt(intptr_t index) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
   return nullptr;
@@ -14982,17 +14973,17 @@
   ASSERT(Object::Handle(Array::Handle(entries()).At(data_pos)).IsFunction());
 
   NoSafepointScope no_safepoint;
-  RawArray* raw_data = entries();
-  return reinterpret_cast<RawFunction*>(raw_data->ptr()->data()[data_pos]);
+  ArrayPtr raw_data = entries();
+  return static_cast<FunctionPtr>(raw_data->ptr()->data()[data_pos]);
 #endif
 }
 
-RawObject* ICData::GetTargetOrCodeAt(intptr_t index) const {
+ObjectPtr ICData::GetTargetOrCodeAt(intptr_t index) const {
   const intptr_t data_pos =
       index * TestEntryLength() + TargetIndexFor(NumArgsTested());
 
   NoSafepointScope no_safepoint;
-  RawArray* raw_data = entries();
+  ArrayPtr raw_data = entries();
   return raw_data->ptr()->data()[data_pos];
 }
 
@@ -15075,8 +15066,8 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-RawICData* ICData::AsUnaryClassChecksForCid(intptr_t cid,
-                                            const Function& target) const {
+ICDataPtr ICData::AsUnaryClassChecksForCid(intptr_t cid,
+                                           const Function& target) const {
   ASSERT(!IsNull());
   const intptr_t kNumArgsTested = 1;
   ICData& result = ICData::Handle(ICData::NewFrom(*this, kNumArgsTested));
@@ -15086,7 +15077,7 @@
   return result.raw();
 }
 
-RawICData* ICData::AsUnaryClassChecksForArgNr(intptr_t arg_nr) const {
+ICDataPtr ICData::AsUnaryClassChecksForArgNr(intptr_t arg_nr) const {
   ASSERT(!IsNull());
   ASSERT(NumArgsTested() > arg_nr);
   if ((arg_nr == 0) && (NumArgsTested() == 1)) {
@@ -15144,7 +15135,7 @@
   return (a->count < b->count) ? 1 : 0;
 }
 
-RawICData* ICData::AsUnaryClassChecksSortedByCount() const {
+ICDataPtr ICData::AsUnaryClassChecksSortedByCount() const {
   ASSERT(!IsNull());
   const intptr_t kNumArgsTested = 1;
   const intptr_t len = NumberOfChecks();
@@ -15196,7 +15187,7 @@
   return result.raw();
 }
 
-RawUnlinkedCall* ICData::AsUnlinkedCall() const {
+UnlinkedCallPtr ICData::AsUnlinkedCall() const {
   ASSERT(NumArgsTested() == 1);
   ASSERT(!is_tracking_exactness());
   const UnlinkedCall& result = UnlinkedCall::Handle(UnlinkedCall::New());
@@ -15255,8 +15246,8 @@
   }
 }
 
-RawArray* ICData::NewNonCachedEmptyICDataArray(intptr_t num_args_tested,
-                                               bool tracking_exactness) {
+ArrayPtr ICData::NewNonCachedEmptyICDataArray(intptr_t num_args_tested,
+                                              bool tracking_exactness) {
   // IC data array must be null terminated (sentinel entry).
   const intptr_t len = TestEntryLengthFor(num_args_tested, tracking_exactness);
   const Array& array = Array::Handle(Array::New(len, Heap::kOld));
@@ -15265,8 +15256,8 @@
   return array.raw();
 }
 
-RawArray* ICData::CachedEmptyICDataArray(intptr_t num_args_tested,
-                                         bool tracking_exactness) {
+ArrayPtr ICData::CachedEmptyICDataArray(intptr_t num_args_tested,
+                                        bool tracking_exactness) {
   if (tracking_exactness) {
     ASSERT(num_args_tested == 1);
     return cached_icdata_arrays_[kCachedICDataOneArgWithExactnessTrackingIdx];
@@ -15281,14 +15272,14 @@
 }
 
 // Does not initialize ICData array.
-RawICData* ICData::NewDescriptor(Zone* zone,
-                                 const Function& owner,
-                                 const String& target_name,
-                                 const Array& arguments_descriptor,
-                                 intptr_t deopt_id,
-                                 intptr_t num_args_tested,
-                                 RebindRule rebind_rule,
-                                 const AbstractType& receivers_static_type) {
+ICDataPtr ICData::NewDescriptor(Zone* zone,
+                                const Function& owner,
+                                const String& target_name,
+                                const Array& arguments_descriptor,
+                                intptr_t deopt_id,
+                                intptr_t num_args_tested,
+                                RebindRule rebind_rule,
+                                const AbstractType& receivers_static_type) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // We should only have null owners in the precompiled runtime, if the
   // owning function for a Code object was optimized out.
@@ -15301,7 +15292,7 @@
   ICData& result = ICData::Handle(zone);
   {
     // IC data objects are long living objects, allocate them in old generation.
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(ICData::kClassId, ICData::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -15321,11 +15312,11 @@
   return entries()->IsImmutableArray();
 }
 
-RawICData* ICData::New() {
+ICDataPtr ICData::New() {
   ICData& result = ICData::Handle();
   {
     // IC data objects are long living objects, allocate them in old generation.
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(ICData::kClassId, ICData::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -15335,13 +15326,13 @@
   return result.raw();
 }
 
-RawICData* ICData::New(const Function& owner,
-                       const String& target_name,
-                       const Array& arguments_descriptor,
-                       intptr_t deopt_id,
-                       intptr_t num_args_tested,
-                       RebindRule rebind_rule,
-                       const AbstractType& receivers_static_type) {
+ICDataPtr ICData::New(const Function& owner,
+                      const String& target_name,
+                      const Array& arguments_descriptor,
+                      intptr_t deopt_id,
+                      intptr_t num_args_tested,
+                      RebindRule rebind_rule,
+                      const AbstractType& receivers_static_type) {
   Zone* zone = Thread::Current()->zone();
   const ICData& result = ICData::Handle(
       zone,
@@ -15354,7 +15345,7 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-RawICData* ICData::NewFrom(const ICData& from, intptr_t num_args_tested) {
+ICDataPtr ICData::NewFrom(const ICData& from, intptr_t num_args_tested) {
   // See comment in [ICData::Clone] why we access the megamorphic bit first.
   const bool is_megamorphic = from.is_megamorphic();
 
@@ -15369,7 +15360,7 @@
   return result.raw();
 }
 
-RawICData* ICData::Clone(const ICData& from) {
+ICDataPtr ICData::Clone(const ICData& from) {
   Zone* zone = Thread::Current()->zone();
 
   // We have to check the megamorphic bit before accessing the entries of the
@@ -15425,14 +15416,14 @@
          object.raw()->IsHeapObject() && !object.IsWeakSerializationReference();
 }
 
-RawObject* WeakSerializationReference::Wrap(Zone* zone, const Object& target) {
+ObjectPtr WeakSerializationReference::Wrap(Zone* zone, const Object& target) {
   if (!CanWrap(target)) return target.raw();
   ASSERT(Object::weak_serialization_reference_class() != Class::null());
   WeakSerializationReference& result = WeakSerializationReference::Handle(zone);
   {
-    RawObject* raw = Object::Allocate(
-        WeakSerializationReference::kClassId,
-        WeakSerializationReference::InstanceSize(), Heap::kOld);
+    ObjectPtr raw = Object::Allocate(WeakSerializationReference::kClassId,
+                                     WeakSerializationReference::InstanceSize(),
+                                     Heap::kOld);
     NoSafepointScope no_safepoint;
 
     result ^= raw;
@@ -15476,7 +15467,7 @@
                   Smi::Handle(Smi::New(pc)));
 }
 
-RawString* Code::Comments::CommentAt(intptr_t idx) const {
+StringPtr Code::Comments::CommentAt(intptr_t idx) const {
   return String::RawCast(comments_.At(idx * kNumberOfEntries + kCommentEntry));
 }
 
@@ -15519,7 +15510,7 @@
   return false;
 }
 
-RawLocalVarDescriptors* Code::GetLocalVarDescriptors() const {
+LocalVarDescriptorsPtr Code::GetLocalVarDescriptors() const {
   const LocalVarDescriptors& v = LocalVarDescriptors::Handle(var_descriptors());
   if (v.IsNull()) {
     ASSERT(!is_optimized());
@@ -15575,7 +15566,7 @@
 #endif
 
 #if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER)
-RawTypedData* Code::catch_entry_moves_maps() const {
+TypedDataPtr Code::catch_entry_moves_maps() const {
   ASSERT(FLAG_precompiled_mode);
   return TypedData::RawCast(raw_ptr()->catch_entry_);
 }
@@ -15616,7 +15607,7 @@
 #endif  // DEBUG
 }
 
-RawObjectPool* Code::GetObjectPool() const {
+ObjectPoolPtr Code::GetObjectPool() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   if (FLAG_use_bare_instructions) {
     return Isolate::Current()->object_store()->global_object_pool();
@@ -15633,9 +15624,9 @@
 #endif
 }
 
-RawTypedData* Code::GetDeoptInfoAtPc(uword pc,
-                                     ICData::DeoptReasonId* deopt_reason,
-                                     uint32_t* deopt_flags) const {
+TypedDataPtr Code::GetDeoptInfoAtPc(uword pc,
+                                    ICData::DeoptReasonId* deopt_reason,
+                                    uint32_t* deopt_flags) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT);
   return TypedData::null();
@@ -15693,7 +15684,7 @@
   return -1;
 }
 
-RawFunction* Code::GetStaticCallTargetFunctionAt(uword pc) const {
+FunctionPtr Code::GetStaticCallTargetFunctionAt(uword pc) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
   return Function::null();
@@ -15780,7 +15771,7 @@
 #else
   ASSERT(offset >= 0);
   StoreSmi(
-      reinterpret_cast<RawSmi* const*>(&raw_ptr()->return_address_metadata_),
+      reinterpret_cast<SmiPtr const*>(&raw_ptr()->return_address_metadata_),
       Smi::New(offset));
 #endif
 }
@@ -15800,7 +15791,7 @@
 #endif
 }
 
-RawArray* Code::inlined_id_to_function() const {
+ArrayPtr Code::inlined_id_to_function() const {
   return raw_ptr()->inlined_id_to_function_;
 }
 
@@ -15809,7 +15800,7 @@
   StorePointer(&raw_ptr()->inlined_id_to_function_, value.raw());
 }
 
-RawCode* Code::New(intptr_t pointer_offsets_length) {
+CodePtr Code::New(intptr_t pointer_offsets_length) {
   if (pointer_offsets_length < 0 || pointer_offsets_length > kMaxElements) {
     // This should be caught before we reach here.
     FATAL1("Fatal error in Code::New: invalid pointer_offsets_length %" Pd "\n",
@@ -15819,7 +15810,7 @@
   Code& result = Code::Handle();
   {
     uword size = Code::InstanceSize(pointer_offsets_length);
-    RawObject* raw = Object::Allocate(Code::kClassId, size, Heap::kOld);
+    ObjectPtr raw = Object::Allocate(Code::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_pointer_offsets_length(pointer_offsets_length);
@@ -15834,12 +15825,12 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-RawCode* Code::FinalizeCodeAndNotify(const Function& function,
-                                     FlowGraphCompiler* compiler,
-                                     compiler::Assembler* assembler,
-                                     PoolAttachment pool_attachment,
-                                     bool optimized,
-                                     CodeStatistics* stats) {
+CodePtr Code::FinalizeCodeAndNotify(const Function& function,
+                                    FlowGraphCompiler* compiler,
+                                    compiler::Assembler* assembler,
+                                    PoolAttachment pool_attachment,
+                                    bool optimized,
+                                    CodeStatistics* stats) {
   DEBUG_ASSERT(IsMutatorOrAtSafepoint());
   const auto& code = Code::Handle(
       FinalizeCode(compiler, assembler, pool_attachment, optimized, stats));
@@ -15847,12 +15838,12 @@
   return code.raw();
 }
 
-RawCode* Code::FinalizeCodeAndNotify(const char* name,
-                                     FlowGraphCompiler* compiler,
-                                     compiler::Assembler* assembler,
-                                     PoolAttachment pool_attachment,
-                                     bool optimized,
-                                     CodeStatistics* stats) {
+CodePtr Code::FinalizeCodeAndNotify(const char* name,
+                                    FlowGraphCompiler* compiler,
+                                    compiler::Assembler* assembler,
+                                    PoolAttachment pool_attachment,
+                                    bool optimized,
+                                    CodeStatistics* stats) {
   DEBUG_ASSERT(IsMutatorOrAtSafepoint());
   const auto& code = Code::Handle(
       FinalizeCode(compiler, assembler, pool_attachment, optimized, stats));
@@ -15864,11 +15855,11 @@
 DECLARE_FLAG(charp, write_v8_snapshot_profile_to);
 #endif  // defined(DART_PRECOMPILER)
 
-RawCode* Code::FinalizeCode(FlowGraphCompiler* compiler,
-                            compiler::Assembler* assembler,
-                            PoolAttachment pool_attachment,
-                            bool optimized,
-                            CodeStatistics* stats /* = nullptr */) {
+CodePtr Code::FinalizeCode(FlowGraphCompiler* compiler,
+                           compiler::Assembler* assembler,
+                           PoolAttachment pool_attachment,
+                           bool optimized,
+                           CodeStatistics* stats /* = nullptr */) {
   DEBUG_ASSERT(IsMutatorOrAtSafepoint());
 
   ASSERT(assembler != NULL);
@@ -15934,17 +15925,17 @@
       ASSERT(object->IsOld());
       // N.B. The pointer is embedded in the Instructions object, but visited
       // through the Code object.
-      code.raw()->StorePointer(reinterpret_cast<RawObject**>(addr),
-                               object->raw());
+      code.raw()->ptr()->StorePointer(reinterpret_cast<ObjectPtr*>(addr),
+                                      object->raw());
     }
 
     // Write protect instructions and, if supported by OS, use dual mapping
     // for execution.
     if (FLAG_write_protect_code) {
-      uword address = RawObject::ToAddr(instrs.raw());
+      uword address = ObjectLayout::ToAddr(instrs.raw());
       // Check if a dual mapping exists.
       instrs = Instructions::RawCast(HeapPage::ToExecutable(instrs.raw()));
-      uword exec_address = RawObject::ToAddr(instrs.raw());
+      uword exec_address = ObjectLayout::ToAddr(instrs.raw());
       const bool use_dual_mapping = exec_address != address;
       ASSERT(use_dual_mapping == FLAG_dual_map_code);
 
@@ -15953,14 +15944,14 @@
       // Yet the writable mapping is still turned back from RW to R.
       if (use_dual_mapping) {
         VirtualMemory::Protect(reinterpret_cast<void*>(address),
-                               instrs.raw()->HeapSize(),
+                               instrs.raw()->ptr()->HeapSize(),
                                VirtualMemory::kReadOnly);
         address = exec_address;
       } else {
         // If dual mapping is disabled and we write protect then we have to
         // change the single mapping from RW -> RX.
         VirtualMemory::Protect(reinterpret_cast<void*>(address),
-                               instrs.raw()->HeapSize(),
+                               instrs.raw()->ptr()->HeapSize(),
                                VirtualMemory::kReadExecute);
       }
     }
@@ -16049,34 +16040,34 @@
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-bool Code::SlowFindRawCodeVisitor::FindObject(RawObject* raw_obj) const {
-  return RawCode::ContainsPC(raw_obj, pc_);
+bool Code::SlowFindRawCodeVisitor::FindObject(ObjectPtr raw_obj) const {
+  return CodeLayout::ContainsPC(raw_obj, pc_);
 }
 
-RawCode* Code::LookupCodeInIsolate(Isolate* isolate, uword pc) {
+CodePtr Code::LookupCodeInIsolate(Isolate* isolate, uword pc) {
   ASSERT((isolate == Isolate::Current()) || (isolate == Dart::vm_isolate()));
   if (isolate->heap() == NULL) {
     return Code::null();
   }
   HeapIterationScope heap_iteration_scope(Thread::Current());
   SlowFindRawCodeVisitor visitor(pc);
-  RawObject* needle = isolate->heap()->FindOldObject(&visitor);
+  ObjectPtr needle = isolate->heap()->FindOldObject(&visitor);
   if (needle != Code::null()) {
-    return static_cast<RawCode*>(needle);
+    return static_cast<CodePtr>(needle);
   }
   return Code::null();
 }
 
-RawCode* Code::LookupCode(uword pc) {
+CodePtr Code::LookupCode(uword pc) {
   return LookupCodeInIsolate(Isolate::Current(), pc);
 }
 
-RawCode* Code::LookupCodeInVmIsolate(uword pc) {
+CodePtr Code::LookupCodeInVmIsolate(uword pc) {
   return LookupCodeInIsolate(Dart::vm_isolate(), pc);
 }
 
 // Given a pc and a timestamp, lookup the code.
-RawCode* Code::FindCode(uword pc, int64_t timestamp) {
+CodePtr Code::FindCode(uword pc, int64_t timestamp) {
   Code& code = Code::Handle(Code::LookupCode(pc));
   if (!code.IsNull() && (code.compile_timestamp() == timestamp) &&
       (code.PayloadStart() == pc)) {
@@ -16095,7 +16086,7 @@
 TokenPosition Code::GetTokenIndexOfPC(uword pc) const {
   uword pc_offset = pc - PayloadStart();
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
   while (iter.MoveNext()) {
     if (iter.PcOffset() == pc_offset) {
       return iter.TokenPos();
@@ -16105,7 +16096,7 @@
 }
 
 uword Code::GetPcForDeoptId(intptr_t deopt_id,
-                            RawPcDescriptors::Kind kind) const {
+                            PcDescriptorsLayout::Kind kind) const {
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, kind);
   while (iter.MoveNext()) {
@@ -16122,7 +16113,7 @@
 intptr_t Code::GetDeoptIdForOsr(uword pc) const {
   uword pc_offset = pc - PayloadStart();
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kOsrEntry);
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kOsrEntry);
   while (iter.MoveNext()) {
     if (iter.PcOffset() == pc_offset) {
       return iter.DeoptId();
@@ -16219,8 +16210,8 @@
                         new_code.UncheckedEntryPointOffset());
 }
 
-void Code::InitializeCachedEntryPointsFrom(RawCode* code,
-                                           RawInstructions* instructions,
+void Code::InitializeCachedEntryPointsFrom(CodePtr code,
+                                           InstructionsPtr instructions,
                                            uint32_t unchecked_offset) {
   NoSafepointScope _;
   const uword entry_point = Instructions::EntryPoint(instructions);
@@ -16328,15 +16319,15 @@
 #endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 }
 
-RawBytecode* Bytecode::New(uword instructions,
-                           intptr_t instructions_size,
-                           intptr_t instructions_offset,
-                           const ObjectPool& object_pool) {
+BytecodePtr Bytecode::New(uword instructions,
+                          intptr_t instructions_size,
+                          intptr_t instructions_offset,
+                          const ObjectPool& object_pool) {
   ASSERT(Object::bytecode_class() != Class::null());
   Bytecode& result = Bytecode::Handle();
   {
     uword size = Bytecode::InstanceSize();
-    RawObject* raw = Object::Allocate(Bytecode::kClassId, size, Heap::kOld);
+    ObjectPtr raw = Object::Allocate(Bytecode::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_instructions(instructions);
@@ -16350,7 +16341,7 @@
   return result.raw();
 }
 
-RawExternalTypedData* Bytecode::GetBinary(Zone* zone) const {
+ExternalTypedDataPtr Bytecode::GetBinary(Zone* zone) const {
   const Function& func = Function::Handle(zone, function());
   if (func.IsNull()) {
     return ExternalTypedData::null();
@@ -16391,7 +16382,7 @@
   intptr_t try_index = -1;
   const uword pc_offset = return_address - PayloadStart();
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
   while (iter.MoveNext()) {
     // PC descriptors for try blocks in bytecode are generated in pairs,
     // marking start and end of a try block.
@@ -16505,23 +16496,22 @@
   return zone->PrintToString("[Bytecode] %s", function_name);
 }
 
-bool Bytecode::SlowFindRawBytecodeVisitor::FindObject(
-    RawObject* raw_obj) const {
-  return RawBytecode::ContainsPC(raw_obj, pc_);
+bool Bytecode::SlowFindRawBytecodeVisitor::FindObject(ObjectPtr raw_obj) const {
+  return BytecodeLayout::ContainsPC(raw_obj, pc_);
 }
 
-RawBytecode* Bytecode::FindCode(uword pc) {
+BytecodePtr Bytecode::FindCode(uword pc) {
   Thread* thread = Thread::Current();
   HeapIterationScope heap_iteration_scope(thread);
   SlowFindRawBytecodeVisitor visitor(pc);
-  RawObject* needle = thread->heap()->FindOldObject(&visitor);
+  ObjectPtr needle = thread->heap()->FindOldObject(&visitor);
   if (needle != Bytecode::null()) {
-    return static_cast<RawBytecode*>(needle);
+    return static_cast<BytecodePtr>(needle);
   }
   return Bytecode::null();
 }
 
-RawLocalVarDescriptors* Bytecode::GetLocalVarDescriptors() const {
+LocalVarDescriptorsPtr Bytecode::GetLocalVarDescriptors() const {
 #if defined(PRODUCT) || defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
   return LocalVarDescriptors::null();
@@ -16550,7 +16540,7 @@
   return level;
 }
 
-RawContext* Context::New(intptr_t num_variables, Heap::Space space) {
+ContextPtr Context::New(intptr_t num_variables, Heap::Space space) {
   ASSERT(num_variables >= 0);
   ASSERT(Object::context_class() != Class::null());
 
@@ -16561,7 +16551,7 @@
   }
   Context& result = Context::Handle();
   {
-    RawObject* raw = Object::Allocate(
+    ObjectPtr raw = Object::Allocate(
         Context::kClassId, Context::InstanceSize(num_variables), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -16621,7 +16611,7 @@
   THR_Print("}\n");
 }
 
-RawContextScope* ContextScope::New(intptr_t num_variables, bool is_implicit) {
+ContextScopePtr ContextScope::New(intptr_t num_variables, bool is_implicit) {
   ASSERT(Object::context_scope_class() != Class::null());
   if (num_variables < 0 || num_variables > kMaxElements) {
     // This should be caught before we reach here.
@@ -16631,7 +16621,7 @@
   intptr_t size = ContextScope::InstanceSize(num_variables);
   ContextScope& result = ContextScope::Handle();
   {
-    RawObject* raw = Object::Allocate(ContextScope::kClassId, size, Heap::kOld);
+    ObjectPtr raw = Object::Allocate(ContextScope::kClassId, size, Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_num_variables(num_variables);
@@ -16663,7 +16653,7 @@
            Smi::New(declaration_token_pos.value()));
 }
 
-RawString* ContextScope::NameAt(intptr_t scope_index) const {
+StringPtr ContextScope::NameAt(intptr_t scope_index) const {
   return VariableDescAddr(scope_index)->name;
 }
 
@@ -16688,27 +16678,27 @@
 }
 
 bool ContextScope::IsFinalAt(intptr_t scope_index) const {
-  return GetFlagAt(scope_index, RawContextScope::VariableDesc::kIsFinal);
+  return GetFlagAt(scope_index, ContextScopeLayout::VariableDesc::kIsFinal);
 }
 
 void ContextScope::SetIsFinalAt(intptr_t scope_index, bool is_final) const {
-  SetFlagAt(scope_index, RawContextScope::VariableDesc::kIsFinal, is_final);
+  SetFlagAt(scope_index, ContextScopeLayout::VariableDesc::kIsFinal, is_final);
 }
 
 bool ContextScope::IsLateAt(intptr_t scope_index) const {
-  return GetFlagAt(scope_index, RawContextScope::VariableDesc::kIsLate);
+  return GetFlagAt(scope_index, ContextScopeLayout::VariableDesc::kIsLate);
 }
 
 void ContextScope::SetIsLateAt(intptr_t scope_index, bool is_late) const {
-  SetFlagAt(scope_index, RawContextScope::VariableDesc::kIsLate, is_late);
+  SetFlagAt(scope_index, ContextScopeLayout::VariableDesc::kIsLate, is_late);
 }
 
 bool ContextScope::IsConstAt(intptr_t scope_index) const {
-  return GetFlagAt(scope_index, RawContextScope::VariableDesc::kIsConst);
+  return GetFlagAt(scope_index, ContextScopeLayout::VariableDesc::kIsConst);
 }
 
 void ContextScope::SetIsConstAt(intptr_t scope_index, bool is_const) const {
-  SetFlagAt(scope_index, RawContextScope::VariableDesc::kIsConst, is_const);
+  SetFlagAt(scope_index, ContextScopeLayout::VariableDesc::kIsConst, is_const);
 }
 
 intptr_t ContextScope::LateInitOffsetAt(intptr_t scope_index) const {
@@ -16721,7 +16711,7 @@
            Smi::New(late_init_offset));
 }
 
-RawAbstractType* ContextScope::TypeAt(intptr_t scope_index) const {
+AbstractTypePtr ContextScope::TypeAt(intptr_t scope_index) const {
   ASSERT(!IsConstAt(scope_index));
   return VariableDescAddr(scope_index)->type;
 }
@@ -16731,7 +16721,7 @@
   StorePointer(&(VariableDescAddr(scope_index)->type), type.raw());
 }
 
-RawInstance* ContextScope::ConstValueAt(intptr_t scope_index) const {
+InstancePtr ContextScope::ConstValueAt(intptr_t scope_index) const {
   ASSERT(IsConstAt(scope_index));
   return VariableDescAddr(scope_index)->value;
 }
@@ -16780,7 +16770,7 @@
   return prev_cstr;
 }
 
-RawArray* MegamorphicCache::buckets() const {
+ArrayPtr MegamorphicCache::buckets() const {
   return raw_ptr()->buckets_;
 }
 
@@ -16807,10 +16797,10 @@
   StoreNonPointer(&raw_ptr()->filled_entry_count_, count);
 }
 
-RawMegamorphicCache* MegamorphicCache::New() {
+MegamorphicCachePtr MegamorphicCache::New() {
   MegamorphicCache& result = MegamorphicCache::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(MegamorphicCache::kClassId,
                          MegamorphicCache::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
@@ -16820,11 +16810,11 @@
   return result.raw();
 }
 
-RawMegamorphicCache* MegamorphicCache::New(const String& target_name,
-                                           const Array& arguments_descriptor) {
+MegamorphicCachePtr MegamorphicCache::New(const String& target_name,
+                                          const Array& arguments_descriptor) {
   MegamorphicCache& result = MegamorphicCache::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(MegamorphicCache::kClassId,
                          MegamorphicCache::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
@@ -16916,10 +16906,10 @@
   intptr_t capacity = mask() + 1;
   for (intptr_t i = 0; i < capacity; ++i) {
     const intptr_t target_index = i * kEntryLength + kTargetFunctionIndex;
-    RawObject** slot = &Array::DataOf(buckets())[target_index];
+    ObjectPtr* slot = &Array::DataOf(buckets())[target_index];
     const intptr_t cid = (*slot)->GetClassIdMayBeSmi();
     if (cid == kFunctionCid) {
-      RawCode* code = Function::CurrentCodeOf(Function::RawCast(*slot));
+      CodePtr code = Function::CurrentCodeOf(Function::RawCast(*slot));
       *slot = Smi::FromAlignedAddress(Code::EntryPointOf(code));
     } else {
       ASSERT(cid == kSmiCid);
@@ -16935,13 +16925,13 @@
   cached_array_ = NULL;
 }
 
-RawSubtypeTestCache* SubtypeTestCache::New() {
+SubtypeTestCachePtr SubtypeTestCache::New() {
   ASSERT(Object::subtypetestcache_class() != Class::null());
   SubtypeTestCache& result = SubtypeTestCache::Handle();
   {
     // SubtypeTestCache objects are long living objects, allocate them in the
     // old generation.
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(SubtypeTestCache::kClassId,
                          SubtypeTestCache::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
@@ -17036,14 +17026,14 @@
   return "Error";
 }
 
-RawApiError* ApiError::New() {
+ApiErrorPtr ApiError::New() {
   ASSERT(Object::api_error_class() != Class::null());
-  RawObject* raw = Object::Allocate(ApiError::kClassId,
-                                    ApiError::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawApiError*>(raw);
+  ObjectPtr raw = Object::Allocate(ApiError::kClassId, ApiError::InstanceSize(),
+                                   Heap::kOld);
+  return static_cast<ApiErrorPtr>(raw);
 }
 
-RawApiError* ApiError::New(const String& message, Heap::Space space) {
+ApiErrorPtr ApiError::New(const String& message, Heap::Space space) {
 #ifndef PRODUCT
   if (FLAG_print_stacktrace_at_api_error) {
     OS::PrintErr("ApiError: %s\n", message.ToCString());
@@ -17054,7 +17044,7 @@
   ASSERT(Object::api_error_class() != Class::null());
   ApiError& result = ApiError::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(ApiError::kClassId, ApiError::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -17076,26 +17066,26 @@
   return "ApiError";
 }
 
-RawLanguageError* LanguageError::New() {
+LanguageErrorPtr LanguageError::New() {
   ASSERT(Object::language_error_class() != Class::null());
-  RawObject* raw = Object::Allocate(LanguageError::kClassId,
-                                    LanguageError::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawLanguageError*>(raw);
+  ObjectPtr raw = Object::Allocate(LanguageError::kClassId,
+                                   LanguageError::InstanceSize(), Heap::kOld);
+  return static_cast<LanguageErrorPtr>(raw);
 }
 
-RawLanguageError* LanguageError::NewFormattedV(const Error& prev_error,
-                                               const Script& script,
-                                               TokenPosition token_pos,
-                                               bool report_after_token,
-                                               Report::Kind kind,
-                                               Heap::Space space,
-                                               const char* format,
-                                               va_list args) {
+LanguageErrorPtr LanguageError::NewFormattedV(const Error& prev_error,
+                                              const Script& script,
+                                              TokenPosition token_pos,
+                                              bool report_after_token,
+                                              Report::Kind kind,
+                                              Heap::Space space,
+                                              const char* format,
+                                              va_list args) {
   ASSERT(Object::language_error_class() != Class::null());
   LanguageError& result = LanguageError::Handle();
   {
-    RawObject* raw = Object::Allocate(LanguageError::kClassId,
-                                      LanguageError::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(LanguageError::kClassId,
+                                     LanguageError::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -17109,17 +17099,17 @@
   return result.raw();
 }
 
-RawLanguageError* LanguageError::NewFormatted(const Error& prev_error,
-                                              const Script& script,
-                                              TokenPosition token_pos,
-                                              bool report_after_token,
-                                              Report::Kind kind,
-                                              Heap::Space space,
-                                              const char* format,
-                                              ...) {
+LanguageErrorPtr LanguageError::NewFormatted(const Error& prev_error,
+                                             const Script& script,
+                                             TokenPosition token_pos,
+                                             bool report_after_token,
+                                             Report::Kind kind,
+                                             Heap::Space space,
+                                             const char* format,
+                                             ...) {
   va_list args;
   va_start(args, format);
-  RawLanguageError* result = LanguageError::NewFormattedV(
+  LanguageErrorPtr result = LanguageError::NewFormattedV(
       prev_error, script, token_pos, report_after_token, kind, space, format,
       args);
   NoSafepointScope no_safepoint;
@@ -17127,14 +17117,14 @@
   return result;
 }
 
-RawLanguageError* LanguageError::New(const String& formatted_message,
-                                     Report::Kind kind,
-                                     Heap::Space space) {
+LanguageErrorPtr LanguageError::New(const String& formatted_message,
+                                    Report::Kind kind,
+                                    Heap::Space space) {
   ASSERT(Object::language_error_class() != Class::null());
   LanguageError& result = LanguageError::Handle();
   {
-    RawObject* raw = Object::Allocate(LanguageError::kClassId,
-                                      LanguageError::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(LanguageError::kClassId,
+                                     LanguageError::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -17172,7 +17162,7 @@
   StorePointer(&raw_ptr()->formatted_message_, value.raw());
 }
 
-RawString* LanguageError::FormatMessage() const {
+StringPtr LanguageError::FormatMessage() const {
   if (formatted_message() != String::null()) {
     return formatted_message();
   }
@@ -17200,15 +17190,14 @@
   return "LanguageError";
 }
 
-RawUnhandledException* UnhandledException::New(const Instance& exception,
-                                               const Instance& stacktrace,
-                                               Heap::Space space) {
+UnhandledExceptionPtr UnhandledException::New(const Instance& exception,
+                                              const Instance& stacktrace,
+                                              Heap::Space space) {
   ASSERT(Object::unhandled_exception_class() != Class::null());
   UnhandledException& result = UnhandledException::Handle();
   {
-    RawObject* raw =
-        Object::Allocate(UnhandledException::kClassId,
-                         UnhandledException::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(UnhandledException::kClassId,
+                                     UnhandledException::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -17217,13 +17206,12 @@
   return result.raw();
 }
 
-RawUnhandledException* UnhandledException::New(Heap::Space space) {
+UnhandledExceptionPtr UnhandledException::New(Heap::Space space) {
   ASSERT(Object::unhandled_exception_class() != Class::null());
   UnhandledException& result = UnhandledException::Handle();
   {
-    RawObject* raw =
-        Object::Allocate(UnhandledException::kClassId,
-                         UnhandledException::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(UnhandledException::kClassId,
+                                     UnhandledException::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -17275,12 +17263,12 @@
   return "UnhandledException";
 }
 
-RawUnwindError* UnwindError::New(const String& message, Heap::Space space) {
+UnwindErrorPtr UnwindError::New(const String& message, Heap::Space space) {
   ASSERT(Object::unwind_error_class() != Class::null());
   UnwindError& result = UnwindError::Handle();
   {
-    RawObject* raw = Object::Allocate(UnwindError::kClassId,
-                                      UnwindError::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(UnwindError::kClassId,
+                                     UnwindError::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -17306,9 +17294,9 @@
   return "UnwindError";
 }
 
-RawObject* Instance::InvokeGetter(const String& getter_name,
-                                  bool respect_reflectable,
-                                  bool check_is_entrypoint) const {
+ObjectPtr Instance::InvokeGetter(const String& getter_name,
+                                 bool respect_reflectable,
+                                 bool check_is_entrypoint) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -17328,7 +17316,7 @@
     // The getter must correspond to either an entry-point field or a getter
     // method explicitly marked.
     Field& field = Field::Handle(zone);
-    if (function.kind() == RawFunction::kImplicitGetter) {
+    if (function.kind() == FunctionLayout::kImplicitGetter) {
       field = function.accessor_field();
     }
     if (!field.IsNull()) {
@@ -17366,10 +17354,10 @@
                                 type_args);
 }
 
-RawObject* Instance::InvokeSetter(const String& setter_name,
-                                  const Instance& value,
-                                  bool respect_reflectable,
-                                  bool check_is_entrypoint) const {
+ObjectPtr Instance::InvokeSetter(const String& setter_name,
+                                 const Instance& value,
+                                 bool respect_reflectable,
+                                 bool check_is_entrypoint) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -17389,7 +17377,7 @@
     // The setter must correspond to either an entry-point field or a setter
     // method explicitly marked.
     Field& field = Field::Handle(zone);
-    if (setter.kind() == RawFunction::kImplicitSetter) {
+    if (setter.kind() == FunctionLayout::kImplicitSetter) {
       field = setter.accessor_field();
     }
     if (!field.IsNull()) {
@@ -17413,11 +17401,11 @@
                                 type_args);
 }
 
-RawObject* Instance::Invoke(const String& function_name,
-                            const Array& args,
-                            const Array& arg_names,
-                            bool respect_reflectable,
-                            bool check_is_entrypoint) const {
+ObjectPtr Instance::Invoke(const String& function_name,
+                           const Array& args,
+                           const Array& arg_names,
+                           bool respect_reflectable,
+                           bool check_is_entrypoint) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Class& klass = Class::Handle(zone, clazz());
@@ -17449,7 +17437,7 @@
       if (check_is_entrypoint) {
         CHECK_ERROR(EntryPointFieldInvocationError(function_name));
       }
-      ASSERT(function.kind() != RawFunction::kMethodExtractor);
+      ASSERT(function.kind() != FunctionLayout::kMethodExtractor);
       // Invoke the getter.
       const int kNumArgs = 1;
       const Array& getter_args = Array::Handle(zone, Array::New(kNumArgs));
@@ -17477,7 +17465,7 @@
                                 type_args);
 }
 
-RawObject* Instance::EvaluateCompiledExpression(
+ObjectPtr Instance::EvaluateCompiledExpression(
     const Class& method_cls,
     const ExternalTypedData& kernel_buffer,
     const Array& type_definitions,
@@ -17499,13 +17487,13 @@
       type_arguments);
 }
 
-RawObject* Instance::HashCode() const {
+ObjectPtr Instance::HashCode() const {
   // TODO(koda): Optimize for all builtin classes and all classes
   // that do not override hashCode.
   return DartLibraryCalls::HashCode(*this);
 }
 
-RawObject* Instance::IdentityHashCode() const {
+ObjectPtr Instance::IdentityHashCode() const {
   return DartLibraryCalls::IdentityHashCode(*this);
 }
 
@@ -17532,8 +17520,8 @@
     uword other_addr = reinterpret_cast<uword>(other.raw_ptr());
     for (intptr_t offset = Instance::NextFieldOffset(); offset < instance_size;
          offset += kWordSize) {
-      if ((*reinterpret_cast<RawObject**>(this_addr + offset)) !=
-          (*reinterpret_cast<RawObject**>(other_addr + offset))) {
+      if ((*reinterpret_cast<ObjectPtr*>(this_addr + offset)) !=
+          (*reinterpret_cast<ObjectPtr*>(other_addr + offset))) {
         return false;
       }
     }
@@ -17567,7 +17555,7 @@
       hash =
           CombineHashes(hash, *reinterpret_cast<intptr_t*>(this_addr + offset));
     } else {
-      member ^= *reinterpret_cast<RawObject**>(this_addr + offset);
+      member ^= *reinterpret_cast<ObjectPtr*>(this_addr + offset);
       hash = CombineHashes(hash, member.CanonicalizeHash());
     }
   }
@@ -17584,7 +17572,7 @@
 
   bool has_pointers() const { return has_pointers_; }
 
-  void VisitPointers(RawObject** first, RawObject** last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
     if (first != last) {
       has_pointers_ = true;
     }
@@ -17638,19 +17626,19 @@
 #if defined(DEBUG)
     // Make sure that we are not missing any fields.
     CheckForPointers has_pointers(Isolate::Current()->group());
-    this->raw()->VisitPointers(&has_pointers);
+    this->raw()->ptr()->VisitPointers(&has_pointers);
     ASSERT(!has_pointers.has_pointers());
 #endif  // DEBUG
   }
   return true;
 }
 
-RawInstance* Instance::CopyShallowToOldSpace(Thread* thread) const {
+InstancePtr Instance::CopyShallowToOldSpace(Thread* thread) const {
   return Instance::RawCast(Object::Clone(*this, Heap::kOld));
 }
 
-RawInstance* Instance::CheckAndCanonicalize(Thread* thread,
-                                            const char** error_str) const {
+InstancePtr Instance::CheckAndCanonicalize(Thread* thread,
+                                           const char** error_str) const {
   ASSERT(error_str != NULL);
   ASSERT(*error_str == NULL);
   ASSERT(!IsNull());
@@ -17695,7 +17683,7 @@
 }
 #endif  // DEBUG
 
-RawObject* Instance::GetField(const Field& field) const {
+ObjectPtr Instance::GetField(const Field& field) const {
   if (FLAG_precompiled_mode && field.is_unboxing_candidate()) {
     switch (field.guarded_cid()) {
       case kDoubleCid:
@@ -17750,7 +17738,7 @@
   }
 }
 
-RawAbstractType* Instance::GetType(Heap::Space space) const {
+AbstractTypePtr Instance::GetType(Heap::Space space) const {
   if (IsNull()) {
     return Type::NullType();
   }
@@ -17791,7 +17779,7 @@
   return type.raw();
 }
 
-RawTypeArguments* Instance::GetTypeArguments() const {
+TypeArgumentsPtr Instance::GetTypeArguments() const {
   ASSERT(!IsType());
   const Class& cls = Class::Handle(clazz());
   intptr_t field_offset = cls.host_type_arguments_field_offset();
@@ -18064,8 +18052,7 @@
 
 intptr_t* Instance::NativeFieldsDataAddr() const {
   ASSERT(Thread::Current()->no_safepoint_scope_depth() > 0);
-  RawTypedData* native_fields =
-      reinterpret_cast<RawTypedData*>(*NativeFieldsAddr());
+  TypedDataPtr native_fields = static_cast<TypedDataPtr>(*NativeFieldsAddr());
   if (native_fields == TypedData::null()) {
     return NULL;
   }
@@ -18123,24 +18110,24 @@
   return false;
 }
 
-RawInstance* Instance::New(const Class& cls, Heap::Space space) {
+InstancePtr Instance::New(const Class& cls, Heap::Space space) {
   Thread* thread = Thread::Current();
   if (cls.EnsureIsFinalized(thread) != Error::null()) {
     return Instance::null();
   }
   intptr_t instance_size = cls.host_instance_size();
   ASSERT(instance_size > 0);
-  RawObject* raw = Object::Allocate(cls.id(), instance_size, space);
-  return reinterpret_cast<RawInstance*>(raw);
+  ObjectPtr raw = Object::Allocate(cls.id(), instance_size, space);
+  return static_cast<InstancePtr>(raw);
 }
 
-RawInstance* Instance::NewFromCidAndSize(SharedClassTable* shared_class_table,
-                                         classid_t cid,
-                                         Heap::Space heap) {
+InstancePtr Instance::NewFromCidAndSize(SharedClassTable* shared_class_table,
+                                        classid_t cid,
+                                        Heap::Space heap) {
   const intptr_t instance_size = shared_class_table->SizeAt(cid);
   ASSERT(instance_size > 0);
-  RawObject* raw = Object::Allocate(cid, instance_size, heap);
-  return reinterpret_cast<RawInstance*>(raw);
+  ObjectPtr raw = Object::Allocate(cid, instance_size, heap);
+  return static_cast<InstancePtr>(raw);
 }
 
 bool Instance::IsValidFieldOffset(intptr_t offset) const {
@@ -18229,13 +18216,13 @@
   return kIllegalCid;
 }
 
-RawClass* AbstractType::type_class() const {
+ClassPtr AbstractType::type_class() const {
   // AbstractType is an abstract class.
   UNREACHABLE();
   return Class::null();
 }
 
-RawTypeArguments* AbstractType::arguments() const {
+TypeArgumentsPtr AbstractType::arguments() const {
   // AbstractType is an abstract class.
   UNREACHABLE();
   return NULL;
@@ -18284,7 +18271,7 @@
   return true;
 }
 
-RawAbstractType* AbstractType::SetInstantiatedNullability(
+AbstractTypePtr AbstractType::SetInstantiatedNullability(
     const TypeParameter& type_param,
     Heap::Space space) const {
   Nullability result_nullability;
@@ -18321,7 +18308,7 @@
       .SetInstantiatedNullability(type_param, space);
 }
 
-RawAbstractType* AbstractType::NormalizeFutureOrType(Heap::Space space) const {
+AbstractTypePtr AbstractType::NormalizeFutureOrType(Heap::Space space) const {
   if (Dart::non_nullable_flag()) {
     if (IsFutureOrType()) {
       const AbstractType& unwrapped_type =
@@ -18348,7 +18335,7 @@
           ASSERT(!cls.IsNull());
           const TypeArguments& type_args =
               TypeArguments::Handle(TypeArguments::New(1));
-          type_args.SetTypeAt(0, never_type());
+          type_args.SetTypeAt(0, Type::Handle(object_store->never_type()));
           Type& type =
               Type::Handle(Type::New(cls, type_args, TokenPosition::kNoSource,
                                      Nullability::kNonNullable));
@@ -18430,7 +18417,7 @@
   return false;
 }
 
-RawAbstractType* AbstractType::InstantiateFrom(
+AbstractTypePtr AbstractType::InstantiateFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
@@ -18441,7 +18428,7 @@
   return NULL;
 }
 
-RawAbstractType* AbstractType::Canonicalize(TrailPtr trail) const {
+AbstractTypePtr AbstractType::Canonicalize(TrailPtr trail) const {
   // AbstractType is an abstract class.
   UNREACHABLE();
   return NULL;
@@ -18452,7 +18439,7 @@
   UNREACHABLE();
 }
 
-RawAbstractType* AbstractType::OnlyBuddyInTrail(TrailPtr trail) const {
+AbstractTypePtr AbstractType::OnlyBuddyInTrail(TrailPtr trail) const {
   if (trail == NULL) {
     return AbstractType::null();
   }
@@ -18547,7 +18534,7 @@
   }
 }
 
-RawString* AbstractType::PrintURIs(URIs* uris) {
+StringPtr AbstractType::PrintURIs(URIs* uris) {
   ASSERT(uris != NULL);
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -18588,14 +18575,14 @@
   }
 }
 
-RawString* AbstractType::Name() const {
+StringPtr AbstractType::Name() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
   PrintName(kInternalName, &printer);
   return Symbols::New(thread, printer.buffer());
 }
 
-RawString* AbstractType::UserVisibleName() const {
+StringPtr AbstractType::UserVisibleName() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
   PrintName(kUserVisibleName, &printer);
@@ -18683,7 +18670,7 @@
   // the type.
 }
 
-RawString* AbstractType::ClassName() const {
+StringPtr AbstractType::ClassName() const {
   ASSERT(!IsFunctionType());
   return Class::Handle(type_class()).Name();
 }
@@ -18781,7 +18768,7 @@
   return HasTypeClass() && type_class_id() == kFfiPointerCid;
 }
 
-RawAbstractType* AbstractType::UnwrapFutureOr() const {
+AbstractTypePtr AbstractType::UnwrapFutureOr() const {
   if (!IsFutureOrType()) {
     return raw();
   }
@@ -18957,8 +18944,7 @@
   if (stub.IsNull()) {
     // This only happens during bootstrapping when creating Type objects before
     // we have the instructions.
-    ASSERT(type_class_id() == kDynamicCid || type_class_id() == kVoidCid ||
-           type_class_id() == kNeverCid);
+    ASSERT(type_class_id() == kDynamicCid || type_class_id() == kVoidCid);
     StoreNonPointer(&raw_ptr()->type_test_stub_entry_point_, 0);
   } else {
     StoreNonPointer(&raw_ptr()->type_test_stub_entry_point_, stub.EntryPoint());
@@ -18966,87 +18952,87 @@
   StorePointer(&raw_ptr()->type_test_stub_, stub.raw());
 }
 
-RawType* Type::NullType() {
+TypePtr Type::NullType() {
   return Isolate::Current()->object_store()->null_type();
 }
 
-RawType* Type::DynamicType() {
+TypePtr Type::DynamicType() {
   return Object::dynamic_type().raw();
 }
 
-RawType* Type::VoidType() {
+TypePtr Type::VoidType() {
   return Object::void_type().raw();
 }
 
-RawType* Type::NeverType() {
-  return Object::never_type().raw();
+TypePtr Type::NeverType() {
+  return Isolate::Current()->object_store()->never_type();
 }
 
-RawType* Type::ObjectType() {
+TypePtr Type::ObjectType() {
   return Isolate::Current()->object_store()->object_type();
 }
 
-RawType* Type::BoolType() {
+TypePtr Type::BoolType() {
   return Isolate::Current()->object_store()->bool_type();
 }
 
-RawType* Type::IntType() {
+TypePtr Type::IntType() {
   return Isolate::Current()->object_store()->int_type();
 }
 
-RawType* Type::NullableIntType() {
+TypePtr Type::NullableIntType() {
   return Isolate::Current()->object_store()->nullable_int_type();
 }
 
-RawType* Type::SmiType() {
+TypePtr Type::SmiType() {
   return Isolate::Current()->object_store()->smi_type();
 }
 
-RawType* Type::MintType() {
+TypePtr Type::MintType() {
   return Isolate::Current()->object_store()->mint_type();
 }
 
-RawType* Type::Double() {
+TypePtr Type::Double() {
   return Isolate::Current()->object_store()->double_type();
 }
 
-RawType* Type::NullableDouble() {
+TypePtr Type::NullableDouble() {
   return Isolate::Current()->object_store()->nullable_double_type();
 }
 
-RawType* Type::Float32x4() {
+TypePtr Type::Float32x4() {
   return Isolate::Current()->object_store()->float32x4_type();
 }
 
-RawType* Type::Float64x2() {
+TypePtr Type::Float64x2() {
   return Isolate::Current()->object_store()->float64x2_type();
 }
 
-RawType* Type::Int32x4() {
+TypePtr Type::Int32x4() {
   return Isolate::Current()->object_store()->int32x4_type();
 }
 
-RawType* Type::Number() {
+TypePtr Type::Number() {
   return Isolate::Current()->object_store()->number_type();
 }
 
-RawType* Type::StringType() {
+TypePtr Type::StringType() {
   return Isolate::Current()->object_store()->string_type();
 }
 
-RawType* Type::ArrayType() {
+TypePtr Type::ArrayType() {
   return Isolate::Current()->object_store()->array_type();
 }
 
-RawType* Type::DartFunctionType() {
+TypePtr Type::DartFunctionType() {
   return Isolate::Current()->object_store()->function_type();
 }
 
-RawType* Type::DartTypeType() {
+TypePtr Type::DartTypeType() {
   return Isolate::Current()->object_store()->type_type();
 }
 
-RawType* Type::NewNonParameterizedType(const Class& type_class) {
+TypePtr Type::NewNonParameterizedType(const Class& type_class) {
   ASSERT(type_class.NumTypeArguments() == 0);
   if (type_class.IsNullClass()) {
     return Type::NullType();
@@ -19076,24 +19062,24 @@
 void Type::SetIsFinalized() const {
   ASSERT(!IsFinalized());
   if (IsInstantiated()) {
-    set_type_state(RawType::kFinalizedInstantiated);
+    set_type_state(TypeLayout::kFinalizedInstantiated);
   } else {
-    set_type_state(RawType::kFinalizedUninstantiated);
+    set_type_state(TypeLayout::kFinalizedUninstantiated);
   }
 }
 
 void Type::ResetIsFinalized() const {
   ASSERT(IsFinalized());
-  set_type_state(RawType::kBeingFinalized);
+  set_type_state(TypeLayout::kBeingFinalized);
   SetIsFinalized();
 }
 
 void Type::SetIsBeingFinalized() const {
   ASSERT(!IsFinalized() && !IsBeingFinalized());
-  set_type_state(RawType::kBeingFinalized);
+  set_type_state(TypeLayout::kBeingFinalized);
 }
 
-RawType* Type::ToNullability(Nullability value, Heap::Space space) const {
+TypePtr Type::ToNullability(Nullability value, Heap::Space space) const {
   if (nullability() == value) {
     return raw();
   }
@@ -19126,7 +19112,7 @@
   return type.raw();
 }
 
-RawFunction* Type::signature() const {
+FunctionPtr Type::signature() const {
   intptr_t cid = raw_ptr()->signature_->GetClassId();
   if (cid == kNullCid) {
     return Function::null();
@@ -19143,18 +19129,18 @@
   return Smi::Value(raw_ptr()->type_class_id_);
 }
 
-RawClass* Type::type_class() const {
+ClassPtr Type::type_class() const {
   return Isolate::Current()->class_table()->At(type_class_id());
 }
 
 bool Type::IsInstantiated(Genericity genericity,
                           intptr_t num_free_fun_type_params,
                           TrailPtr trail) const {
-  if (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) {
+  if (raw_ptr()->type_state_ == TypeLayout::kFinalizedInstantiated) {
     return true;
   }
   if ((genericity == kAny) && (num_free_fun_type_params == kAllFree) &&
-      (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated)) {
+      (raw_ptr()->type_state_ == TypeLayout::kFinalizedUninstantiated)) {
     return false;
   }
   if (IsFunctionType()) {
@@ -19188,7 +19174,7 @@
                                       num_free_fun_type_params, trail);
 }
 
-RawAbstractType* Type::InstantiateFrom(
+AbstractTypePtr Type::InstantiateFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
@@ -19455,7 +19441,7 @@
   return nullability() == declaration_nullability;
 }
 
-RawAbstractType* Type::Canonicalize(TrailPtr trail) const {
+AbstractTypePtr Type::Canonicalize(TrailPtr trail) const {
   ASSERT(IsFinalized());
   if (IsCanonical()) {
     ASSERT(TypeArguments::Handle(arguments()).IsOld());
@@ -19484,7 +19470,8 @@
     ASSERT(!cls.IsNullClass() || IsNullable());
     Type& type = Type::Handle(zone, cls.declaration_type());
     if (type.IsNull()) {
-      ASSERT(!cls.raw()->InVMIsolateHeap() || (isolate == Dart::vm_isolate()));
+      ASSERT(!cls.raw()->ptr()->InVMIsolateHeap() ||
+             (isolate == Dart::vm_isolate()));
       // Canonicalize the type arguments of the supertype, if any.
       TypeArguments& type_args = TypeArguments::Handle(zone, arguments());
       type_args = type_args.Canonicalize(trail);
@@ -19628,9 +19615,7 @@
 #endif  // DEBUG
 
 void Type::EnumerateURIs(URIs* uris) const {
-  // N.B. Not all types with kNeverCid answer true to IsNeverType, but none of
-  // them have a URI.
-  if (IsDynamicType() || IsVoidType() || (type_class_id() == kNeverCid)) {
+  if (IsDynamicType() || IsVoidType() || IsNeverType()) {
     return;
   }
   Thread* thread = Thread::Current();
@@ -19707,24 +19692,24 @@
   StorePointer(&raw_ptr()->arguments_, value.raw());
 }
 
-RawType* Type::New(Heap::Space space) {
-  RawObject* raw =
-      Object::Allocate(Type::kClassId, Type::InstanceSize(), space);
-  return reinterpret_cast<RawType*>(raw);
+TypePtr Type::New(Heap::Space space) {
+  ObjectPtr raw = Object::Allocate(Type::kClassId, Type::InstanceSize(), space);
+  return static_cast<TypePtr>(raw);
 }
 
-RawType* Type::New(const Class& clazz,
-                   const TypeArguments& arguments,
-                   TokenPosition token_pos,
-                   Nullability nullability,
-                   Heap::Space space) {
+TypePtr Type::New(const Class& clazz,
+                  const TypeArguments& arguments,
+                  TokenPosition token_pos,
+                  Nullability nullability,
+                  Heap::Space space) {
   Zone* Z = Thread::Current()->zone();
   const Type& result = Type::Handle(Z, Type::New(space));
   result.set_type_class(clazz);
   result.set_arguments(arguments);
   result.SetHash(0);
   result.set_token_pos(token_pos);
-  result.StoreNonPointer(&result.raw_ptr()->type_state_, RawType::kAllocated);
+  result.StoreNonPointer(&result.raw_ptr()->type_state_,
+                         TypeLayout::kAllocated);
   result.set_nullability(nullability);
 
   result.SetTypeTestingStub(
@@ -19738,8 +19723,8 @@
 }
 
 void Type::set_type_state(int8_t state) const {
-  ASSERT((state >= RawType::kAllocated) &&
-         (state <= RawType::kFinalizedUninstantiated));
+  ASSERT((state >= TypeLayout::kAllocated) &&
+         (state <= TypeLayout::kFinalizedUninstantiated));
   StoreNonPointer(&raw_ptr()->type_state_, state);
 }
 
@@ -19814,7 +19799,7 @@
   return !ref_type.IsNull() && ref_type.IsEquivalent(other, kind, trail);
 }
 
-RawTypeRef* TypeRef::InstantiateFrom(
+AbstractTypePtr TypeRef::InstantiateFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
@@ -19857,7 +19842,7 @@
 // Consider the type Derived, where class Derived extends Base<Derived>.
 // The first type argument of its flattened type argument vector is Derived,
 // represented by a TypeRef pointing to itself.
-RawAbstractType* TypeRef::Canonicalize(TrailPtr trail) const {
+AbstractTypePtr TypeRef::Canonicalize(TrailPtr trail) const {
   if (TestAndAddToTrail(&trail)) {
     return raw();
   }
@@ -19905,13 +19890,13 @@
   return FinalizeHash(result, kHashBits);
 }
 
-RawTypeRef* TypeRef::New() {
-  RawObject* raw =
+TypeRefPtr TypeRef::New() {
+  ObjectPtr raw =
       Object::Allocate(TypeRef::kClassId, TypeRef::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawTypeRef*>(raw);
+  return static_cast<TypeRefPtr>(raw);
 }
 
-RawTypeRef* TypeRef::New(const AbstractType& type) {
+TypeRefPtr TypeRef::New(const AbstractType& type) {
   Zone* Z = Thread::Current()->zone();
   const TypeRef& result = TypeRef::Handle(Z, TypeRef::New());
   result.set_type(type);
@@ -19939,11 +19924,11 @@
 
 void TypeParameter::SetIsFinalized() const {
   ASSERT(!IsFinalized());
-  set_flags(RawTypeParameter::FinalizedBit::update(true, raw_ptr()->flags_));
+  set_flags(TypeParameterLayout::FinalizedBit::update(true, raw_ptr()->flags_));
 }
 
 void TypeParameter::SetGenericCovariantImpl(bool value) const {
-  set_flags(RawTypeParameter::GenericCovariantImplBit::update(
+  set_flags(TypeParameterLayout::GenericCovariantImplBit::update(
       value, raw_ptr()->flags_));
 }
 
@@ -19951,8 +19936,8 @@
   StoreNonPointer(&raw_ptr()->nullability_, static_cast<int8_t>(value));
 }
 
-RawTypeParameter* TypeParameter::ToNullability(Nullability value,
-                                               Heap::Space space) const {
+TypeParameterPtr TypeParameter::ToNullability(Nullability value,
+                                              Heap::Space space) const {
   if (nullability() == value) {
     return raw();
   }
@@ -20069,7 +20054,7 @@
   return raw_ptr()->parameterized_class_id_;
 }
 
-RawClass* TypeParameter::parameterized_class() const {
+ClassPtr TypeParameter::parameterized_class() const {
   classid_t cid = parameterized_class_id();
   if (cid == kFunctionCid) {
     return Class::null();
@@ -20096,7 +20081,7 @@
   StorePointer(&raw_ptr()->bound_, value.raw());
 }
 
-RawAbstractType* TypeParameter::GetFromTypeArguments(
+AbstractTypePtr TypeParameter::GetFromTypeArguments(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments) const {
   ASSERT(IsFinalized());
@@ -20106,7 +20091,7 @@
   return type_args.TypeAtNullSafe(index());
 }
 
-RawAbstractType* TypeParameter::InstantiateFrom(
+AbstractTypePtr TypeParameter::InstantiateFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
@@ -20196,20 +20181,20 @@
   return result;
 }
 
-RawTypeParameter* TypeParameter::New() {
-  RawObject* raw = Object::Allocate(TypeParameter::kClassId,
-                                    TypeParameter::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawTypeParameter*>(raw);
+TypeParameterPtr TypeParameter::New() {
+  ObjectPtr raw = Object::Allocate(TypeParameter::kClassId,
+                                   TypeParameter::InstanceSize(), Heap::kOld);
+  return static_cast<TypeParameterPtr>(raw);
 }
 
-RawTypeParameter* TypeParameter::New(const Class& parameterized_class,
-                                     const Function& parameterized_function,
-                                     intptr_t index,
-                                     const String& name,
-                                     const AbstractType& bound,
-                                     bool is_generic_covariant_impl,
-                                     Nullability nullability,
-                                     TokenPosition token_pos) {
+TypeParameterPtr TypeParameter::New(const Class& parameterized_class,
+                                    const Function& parameterized_function,
+                                    intptr_t index,
+                                    const String& name,
+                                    const AbstractType& bound,
+                                    bool is_generic_covariant_impl,
+                                    Nullability nullability,
+                                    TokenPosition token_pos) {
   ASSERT(parameterized_class.IsNull() != parameterized_function.IsNull());
   Zone* Z = Thread::Current()->zone();
   const TypeParameter& result = TypeParameter::Handle(Z, TypeParameter::New());
@@ -20264,12 +20249,12 @@
   return printer.buffer();
 }
 
-RawInstance* Number::CheckAndCanonicalize(Thread* thread,
-                                          const char** error_str) const {
+InstancePtr Number::CheckAndCanonicalize(Thread* thread,
+                                         const char** error_str) const {
   intptr_t cid = GetClassId();
   switch (cid) {
     case kSmiCid:
-      return reinterpret_cast<RawSmi*>(raw_value());
+      return static_cast<SmiPtr>(raw_value());
     case kMintCid:
       return Mint::NewCanonical(Mint::Cast(*this).value());
     case kDoubleCid:
@@ -20317,7 +20302,7 @@
   return "NULL Integer";
 }
 
-RawInteger* Integer::New(const String& str, Heap::Space space) {
+IntegerPtr Integer::New(const String& str, Heap::Space space) {
   // We are not supposed to have integers represented as two byte strings.
   ASSERT(str.IsOneByteString());
   if (str.IsNull() || (str.Length() == 0)) {
@@ -20332,7 +20317,7 @@
   return Integer::New(value, space);
 }
 
-RawInteger* Integer::NewCanonical(const String& str) {
+IntegerPtr Integer::NewCanonical(const String& str) {
   // We are not supposed to have integers represented as two byte strings.
   ASSERT(str.IsOneByteString());
   int64_t value = 0;
@@ -20344,14 +20329,14 @@
   return NewCanonical(value);
 }
 
-RawInteger* Integer::NewCanonical(int64_t value) {
+IntegerPtr Integer::NewCanonical(int64_t value) {
   if (Smi::IsValid(value)) {
     return Smi::New(static_cast<intptr_t>(value));
   }
   return Mint::NewCanonical(value);
 }
 
-RawInteger* Integer::New(int64_t value, Heap::Space space) {
+IntegerPtr Integer::New(int64_t value, Heap::Space space) {
   const bool is_smi = Smi::IsValid(value);
   if (is_smi) {
     return Smi::New(static_cast<intptr_t>(value));
@@ -20359,7 +20344,7 @@
   return Mint::New(value, space);
 }
 
-RawInteger* Integer::NewFromUint64(uint64_t value, Heap::Space space) {
+IntegerPtr Integer::NewFromUint64(uint64_t value, Heap::Space space) {
   return Integer::New(static_cast<int64_t>(value), space);
 }
 
@@ -20415,7 +20400,7 @@
   return 0;
 }
 
-RawInteger* Integer::AsValidInteger() const {
+IntegerPtr Integer::AsValidInteger() const {
   if (IsSmi()) return raw();
   if (IsMint()) {
     Mint& mint = Mint::Handle();
@@ -20439,9 +20424,9 @@
   }
 }
 
-RawInteger* Integer::ArithmeticOp(Token::Kind operation,
-                                  const Integer& other,
-                                  Heap::Space space) const {
+IntegerPtr Integer::ArithmeticOp(Token::Kind operation,
+                                 const Integer& other,
+                                 Heap::Space space) const {
   // In 32-bit mode, the result of any operation between two Smis will fit in a
   // 32-bit signed result, except the product of two Smis, which will be 64-bit.
   // In 64-bit mode, the result of any operation between two Smis will fit in a
@@ -20521,9 +20506,9 @@
   }
 }
 
-RawInteger* Integer::BitOp(Token::Kind kind,
-                           const Integer& other,
-                           Heap::Space space) const {
+IntegerPtr Integer::BitOp(Token::Kind kind,
+                          const Integer& other,
+                          Heap::Space space) const {
   if (IsSmi() && other.IsSmi()) {
     intptr_t op1_value = Smi::Value(Smi::RawCast(raw()));
     intptr_t op2_value = Smi::Value(Smi::RawCast(other.raw()));
@@ -20560,9 +20545,9 @@
   }
 }
 
-RawInteger* Integer::ShiftOp(Token::Kind kind,
-                             const Integer& other,
-                             Heap::Space space) const {
+IntegerPtr Integer::ShiftOp(Token::Kind kind,
+                            const Integer& other,
+                            Heap::Space space) const {
   int64_t a = AsInt64Value();
   int64_t b = other.AsInt64Value();
   ASSERT(b >= 0);
@@ -20622,7 +20607,7 @@
   return OS::SCreate(Thread::Current()->zone(), "%" Pd "", Value());
 }
 
-RawClass* Smi::Class() {
+ClassPtr Smi::Class() {
   return Isolate::Current()->object_store()->smi_class();
 }
 
@@ -20630,13 +20615,13 @@
   StoreNonPointer(&raw_ptr()->value_, value);
 }
 
-RawMint* Mint::New(int64_t val, Heap::Space space) {
+MintPtr Mint::New(int64_t val, Heap::Space space) {
   // Do not allocate a Mint if Smi would do.
   ASSERT(!Smi::IsValid(val));
   ASSERT(Isolate::Current()->object_store()->mint_class() != Class::null());
   Mint& result = Mint::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Mint::kClassId, Mint::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -20645,7 +20630,7 @@
   return result.raw();
 }
 
-RawMint* Mint::NewCanonical(int64_t value) {
+MintPtr Mint::NewCanonical(int64_t value) {
   // Do not allocate a Mint if Smi would do.
   ASSERT(!Smi::IsValid(value));
   Thread* thread = Thread::Current();
@@ -20756,11 +20741,11 @@
   return Hash64To32(bit_cast<uint64_t>(value()));
 }
 
-RawDouble* Double::New(double d, Heap::Space space) {
+DoublePtr Double::New(double d, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->double_class() != Class::null());
   Double& result = Double::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Double::kClassId, Double::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -20769,7 +20754,7 @@
   return result.raw();
 }
 
-RawDouble* Double::New(const String& str, Heap::Space space) {
+DoublePtr Double::New(const String& str, Heap::Space space) {
   double double_value;
   if (!CStringToDouble(str.ToCString(), str.Length(), &double_value)) {
     return Double::Handle().raw();
@@ -20777,7 +20762,7 @@
   return New(double_value, space);
 }
 
-RawDouble* Double::NewCanonical(double value) {
+DoublePtr Double::NewCanonical(double value) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -20807,7 +20792,7 @@
   }
 }
 
-RawDouble* Double::NewCanonical(const String& str) {
+DoublePtr Double::NewCanonical(const String& str) {
   double double_value;
   if (!CStringToDouble(str.ToCString(), str.Length(), &double_value)) {
     return Double::Handle().raw();
@@ -20815,7 +20800,7 @@
   return NewCanonical(double_value);
 }
 
-RawString* Number::ToString(Heap::Space space) const {
+StringPtr Number::ToString(Heap::Space space) const {
   // Refactoring can avoid Zone::Alloc and strlen, but gains are insignificant.
   const char* cstr = ToCString();
   intptr_t len = strlen(cstr);
@@ -20915,28 +20900,26 @@
   return hasher.Finalize(String::kHashBits);
 }
 
-intptr_t String::Hash(RawString* raw) {
+intptr_t String::Hash(StringPtr raw) {
   StringHasher hasher;
   uword length = Smi::Value(raw->ptr()->length_);
   if (raw->IsOneByteString() || raw->IsExternalOneByteString()) {
     const uint8_t* data;
     if (raw->IsOneByteString()) {
-      data = reinterpret_cast<RawOneByteString*>(raw)->ptr()->data();
+      data = static_cast<OneByteStringPtr>(raw)->ptr()->data();
     } else {
       ASSERT(raw->IsExternalOneByteString());
-      RawExternalOneByteString* str =
-          reinterpret_cast<RawExternalOneByteString*>(raw);
+      ExternalOneByteStringPtr str = static_cast<ExternalOneByteStringPtr>(raw);
       data = str->ptr()->external_data_;
     }
     return String::Hash(data, length);
   } else {
     const uint16_t* data;
     if (raw->IsTwoByteString()) {
-      data = reinterpret_cast<RawTwoByteString*>(raw)->ptr()->data();
+      data = static_cast<TwoByteStringPtr>(raw)->ptr()->data();
     } else {
       ASSERT(raw->IsExternalTwoByteString());
-      RawExternalTwoByteString* str =
-          reinterpret_cast<RawExternalTwoByteString*>(raw);
+      ExternalTwoByteStringPtr str = static_cast<ExternalTwoByteStringPtr>(raw);
       data = str->ptr()->external_data_;
     }
     return String::Hash(data, length);
@@ -21157,8 +21140,8 @@
   return true;
 }
 
-RawInstance* String::CheckAndCanonicalize(Thread* thread,
-                                          const char** error_str) const {
+InstancePtr String::CheckAndCanonicalize(Thread* thread,
+                                         const char** error_str) const {
   if (IsCanonical()) {
     return this->raw();
   }
@@ -21173,16 +21156,16 @@
 }
 #endif  // DEBUG
 
-RawString* String::New(const char* cstr, Heap::Space space) {
+StringPtr String::New(const char* cstr, Heap::Space space) {
   ASSERT(cstr != NULL);
   intptr_t array_len = strlen(cstr);
   const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(cstr);
   return String::FromUTF8(utf8_array, array_len, space);
 }
 
-RawString* String::FromUTF8(const uint8_t* utf8_array,
-                            intptr_t array_len,
-                            Heap::Space space) {
+StringPtr String::FromUTF8(const uint8_t* utf8_array,
+                           intptr_t array_len,
+                           Heap::Space space) {
   Utf8::Type type;
   intptr_t len = Utf8::CodeUnitCount(utf8_array, array_len, &type);
   if (type == Utf8::kLatin1) {
@@ -21208,15 +21191,15 @@
   return strobj.raw();
 }
 
-RawString* String::FromLatin1(const uint8_t* latin1_array,
-                              intptr_t array_len,
-                              Heap::Space space) {
+StringPtr String::FromLatin1(const uint8_t* latin1_array,
+                             intptr_t array_len,
+                             Heap::Space space) {
   return OneByteString::New(latin1_array, array_len, space);
 }
 
-RawString* String::FromUTF16(const uint16_t* utf16_array,
-                             intptr_t array_len,
-                             Heap::Space space) {
+StringPtr String::FromUTF16(const uint16_t* utf16_array,
+                            intptr_t array_len,
+                            Heap::Space space) {
   bool is_one_byte_string = true;
   for (intptr_t i = 0; i < array_len; ++i) {
     if (!Utf::IsLatin1(utf16_array[i])) {
@@ -21230,9 +21213,9 @@
   return TwoByteString::New(utf16_array, array_len, space);
 }
 
-RawString* String::FromUTF32(const int32_t* utf32_array,
-                             intptr_t array_len,
-                             Heap::Space space) {
+StringPtr String::FromUTF32(const int32_t* utf32_array,
+                            intptr_t array_len,
+                            Heap::Space space) {
   bool is_one_byte_string = true;
   intptr_t utf16_len = array_len;
   for (intptr_t i = 0; i < array_len; ++i) {
@@ -21249,7 +21232,7 @@
   return TwoByteString::New(utf16_len, utf32_array, array_len, space);
 }
 
-RawString* String::New(const String& str, Heap::Space space) {
+StringPtr String::New(const String& str, Heap::Space space) {
   // Currently this just creates a copy of the string in the correct space.
   // Once we have external string support, this will also create a heap copy of
   // the string if necessary. Some optimizations are possible, such as not
@@ -21267,22 +21250,22 @@
   return result.raw();
 }
 
-RawString* String::NewExternal(const uint8_t* characters,
-                               intptr_t len,
-                               void* peer,
-                               intptr_t external_allocation_size,
-                               Dart_WeakPersistentHandleFinalizer callback,
-                               Heap::Space space) {
+StringPtr String::NewExternal(const uint8_t* characters,
+                              intptr_t len,
+                              void* peer,
+                              intptr_t external_allocation_size,
+                              Dart_WeakPersistentHandleFinalizer callback,
+                              Heap::Space space) {
   return ExternalOneByteString::New(characters, len, peer,
                                     external_allocation_size, callback, space);
 }
 
-RawString* String::NewExternal(const uint16_t* characters,
-                               intptr_t len,
-                               void* peer,
-                               intptr_t external_allocation_size,
-                               Dart_WeakPersistentHandleFinalizer callback,
-                               Heap::Space space) {
+StringPtr String::NewExternal(const uint16_t* characters,
+                              intptr_t len,
+                              void* peer,
+                              intptr_t external_allocation_size,
+                              Dart_WeakPersistentHandleFinalizer callback,
+                              Heap::Space space) {
   return ExternalTwoByteString::New(characters, len, peer,
                                     external_allocation_size, callback, space);
 }
@@ -21368,7 +21351,7 @@
   }
 }
 
-RawString* String::EscapeSpecialCharacters(const String& str) {
+StringPtr String::EscapeSpecialCharacters(const String& str) {
   if (str.IsOneByteString()) {
     return OneByteString::EscapeSpecialCharacters(str);
   }
@@ -21465,7 +21448,7 @@
   return cstr;
 }
 
-RawString* String::DecodeIRI(const String& str) {
+StringPtr String::DecodeIRI(const String& str) {
   CodePointIterator cpi(str);
   intptr_t num_escapes = 0;
   intptr_t len = str.Length();
@@ -21521,27 +21504,27 @@
   return FromUTF8(utf8, utf8_len);
 }
 
-RawString* String::NewFormatted(const char* format, ...) {
+StringPtr String::NewFormatted(const char* format, ...) {
   va_list args;
   va_start(args, format);
-  RawString* result = NewFormattedV(format, args);
+  StringPtr result = NewFormattedV(format, args);
   NoSafepointScope no_safepoint;
   va_end(args);
   return result;
 }
 
-RawString* String::NewFormatted(Heap::Space space, const char* format, ...) {
+StringPtr String::NewFormatted(Heap::Space space, const char* format, ...) {
   va_list args;
   va_start(args, format);
-  RawString* result = NewFormattedV(format, args, space);
+  StringPtr result = NewFormattedV(format, args, space);
   NoSafepointScope no_safepoint;
   va_end(args);
   return result;
 }
 
-RawString* String::NewFormattedV(const char* format,
-                                 va_list args,
-                                 Heap::Space space) {
+StringPtr String::NewFormattedV(const char* format,
+                                va_list args,
+                                Heap::Space space) {
   va_list args_copy;
   va_copy(args_copy, args);
   intptr_t len = Utils::VSNPrint(NULL, 0, format, args_copy);
@@ -21554,9 +21537,9 @@
   return String::New(buffer, space);
 }
 
-RawString* String::Concat(const String& str1,
-                          const String& str2,
-                          Heap::Space space) {
+StringPtr String::Concat(const String& str1,
+                         const String& str2,
+                         Heap::Space space) {
   ASSERT(!str1.IsNull() && !str2.IsNull());
   intptr_t char_size = Utils::Maximum(str1.CharSize(), str2.CharSize());
   if (char_size == kTwoByteChar) {
@@ -21565,14 +21548,14 @@
   return OneByteString::Concat(str1, str2, space);
 }
 
-RawString* String::ConcatAll(const Array& strings, Heap::Space space) {
+StringPtr String::ConcatAll(const Array& strings, Heap::Space space) {
   return ConcatAllRange(strings, 0, strings.Length(), space);
 }
 
-RawString* String::ConcatAllRange(const Array& strings,
-                                  intptr_t start,
-                                  intptr_t end,
-                                  Heap::Space space) {
+StringPtr String::ConcatAllRange(const Array& strings,
+                                 intptr_t start,
+                                 intptr_t end,
+                                 Heap::Space space) {
   ASSERT(!strings.IsNull());
   ASSERT(start >= 0);
   ASSERT(end <= strings.Length());
@@ -21597,9 +21580,9 @@
   return TwoByteString::ConcatAll(strings, start, end, result_len, space);
 }
 
-RawString* String::SubString(const String& str,
-                             intptr_t begin_index,
-                             Heap::Space space) {
+StringPtr String::SubString(const String& str,
+                            intptr_t begin_index,
+                            Heap::Space space) {
   ASSERT(!str.IsNull());
   if (begin_index >= str.Length()) {
     return String::null();
@@ -21608,11 +21591,11 @@
                            space);
 }
 
-RawString* String::SubString(Thread* thread,
-                             const String& str,
-                             intptr_t begin_index,
-                             intptr_t length,
-                             Heap::Space space) {
+StringPtr String::SubString(Thread* thread,
+                            const String& str,
+                            intptr_t begin_index,
+                            intptr_t length,
+                            Heap::Space space) {
   ASSERT(!str.IsNull());
   ASSERT(begin_index >= 0);
   ASSERT(length >= 0);
@@ -21675,9 +21658,9 @@
                                           callback, external_size);
 }
 
-RawString* String::Transform(int32_t (*mapping)(int32_t ch),
-                             const String& str,
-                             Heap::Space space) {
+StringPtr String::Transform(int32_t (*mapping)(int32_t ch),
+                            const String& str,
+                            Heap::Space space) {
   ASSERT(!str.IsNull());
   bool has_mapping = false;
   int32_t dst_max = 0;
@@ -21700,12 +21683,12 @@
   return TwoByteString::Transform(mapping, str, space);
 }
 
-RawString* String::ToUpperCase(const String& str, Heap::Space space) {
+StringPtr String::ToUpperCase(const String& str, Heap::Space space) {
   // TODO(cshapiro): create a fast-path for OneByteString instances.
   return Transform(CaseMapping::ToUpper, str, space);
 }
 
-RawString* String::ToLowerCase(const String& str, Heap::Space space) {
+StringPtr String::ToLowerCase(const String& str, Heap::Space space) {
   // TODO(cshapiro): create a fast-path for OneByteString instances.
   return Transform(CaseMapping::ToLower, str, space);
 }
@@ -21852,7 +21835,7 @@
   return false;
 }
 
-RawOneByteString* OneByteString::EscapeSpecialCharacters(const String& str) {
+OneByteStringPtr OneByteString::EscapeSpecialCharacters(const String& str) {
   intptr_t len = str.Length();
   if (len > 0) {
     intptr_t num_escapes = 0;
@@ -21884,7 +21867,7 @@
   return OneByteString::raw(Symbols::Empty());
 }
 
-RawOneByteString* ExternalOneByteString::EscapeSpecialCharacters(
+OneByteStringPtr ExternalOneByteString::EscapeSpecialCharacters(
     const String& str) {
   intptr_t len = str.Length();
   if (len > 0) {
@@ -21917,7 +21900,7 @@
   return OneByteString::raw(Symbols::Empty());
 }
 
-RawOneByteString* OneByteString::New(intptr_t len, Heap::Space space) {
+OneByteStringPtr OneByteString::New(intptr_t len, Heap::Space space) {
   ASSERT((Isolate::Current() == Dart::vm_isolate()) ||
          ((Isolate::Current()->object_store() != NULL) &&
           (Isolate::Current()->object_store()->one_byte_string_class() !=
@@ -21927,21 +21910,21 @@
     FATAL1("Fatal error in OneByteString::New: invalid len %" Pd "\n", len);
   }
   {
-    RawObject* raw = Object::Allocate(OneByteString::kClassId,
-                                      OneByteString::InstanceSize(len), space);
+    ObjectPtr raw = Object::Allocate(OneByteString::kClassId,
+                                     OneByteString::InstanceSize(len), space);
     NoSafepointScope no_safepoint;
-    RawOneByteString* result = reinterpret_cast<RawOneByteString*>(raw);
-    result->StoreSmi(&(result->ptr()->length_), Smi::New(len));
+    OneByteStringPtr result = static_cast<OneByteStringPtr>(raw);
+    result->ptr()->StoreSmi(&(result->ptr()->length_), Smi::New(len));
 #if !defined(HASH_IN_OBJECT_HEADER)
-    result->StoreSmi(&(result->ptr()->hash_), Smi::New(0));
+    result->ptr()->StoreSmi(&(result->ptr()->hash_), Smi::New(0));
 #endif
     return result;
   }
 }
 
-RawOneByteString* OneByteString::New(const uint8_t* characters,
-                                     intptr_t len,
-                                     Heap::Space space) {
+OneByteStringPtr OneByteString::New(const uint8_t* characters,
+                                    intptr_t len,
+                                    Heap::Space space) {
   const String& result = String::Handle(OneByteString::New(len, space));
   if (len > 0) {
     NoSafepointScope no_safepoint;
@@ -21950,9 +21933,9 @@
   return OneByteString::raw(result);
 }
 
-RawOneByteString* OneByteString::New(const uint16_t* characters,
-                                     intptr_t len,
-                                     Heap::Space space) {
+OneByteStringPtr OneByteString::New(const uint16_t* characters,
+                                    intptr_t len,
+                                    Heap::Space space) {
   const String& result = String::Handle(OneByteString::New(len, space));
   NoSafepointScope no_safepoint;
   for (intptr_t i = 0; i < len; ++i) {
@@ -21962,9 +21945,9 @@
   return OneByteString::raw(result);
 }
 
-RawOneByteString* OneByteString::New(const int32_t* characters,
-                                     intptr_t len,
-                                     Heap::Space space) {
+OneByteStringPtr OneByteString::New(const int32_t* characters,
+                                    intptr_t len,
+                                    Heap::Space space) {
   const String& result = String::Handle(OneByteString::New(len, space));
   NoSafepointScope no_safepoint;
   for (intptr_t i = 0; i < len; ++i) {
@@ -21974,17 +21957,17 @@
   return OneByteString::raw(result);
 }
 
-RawOneByteString* OneByteString::New(const String& str, Heap::Space space) {
+OneByteStringPtr OneByteString::New(const String& str, Heap::Space space) {
   intptr_t len = str.Length();
   const String& result = String::Handle(OneByteString::New(len, space));
   String::Copy(result, 0, str, 0, len);
   return OneByteString::raw(result);
 }
 
-RawOneByteString* OneByteString::New(const String& other_one_byte_string,
-                                     intptr_t other_start_index,
-                                     intptr_t other_len,
-                                     Heap::Space space) {
+OneByteStringPtr OneByteString::New(const String& other_one_byte_string,
+                                    intptr_t other_start_index,
+                                    intptr_t other_len,
+                                    Heap::Space space) {
   const String& result = String::Handle(OneByteString::New(other_len, space));
   ASSERT(other_one_byte_string.IsOneByteString());
   if (other_len > 0) {
@@ -21996,10 +21979,10 @@
   return OneByteString::raw(result);
 }
 
-RawOneByteString* OneByteString::New(const TypedData& other_typed_data,
-                                     intptr_t other_start_index,
-                                     intptr_t other_len,
-                                     Heap::Space space) {
+OneByteStringPtr OneByteString::New(const TypedData& other_typed_data,
+                                    intptr_t other_start_index,
+                                    intptr_t other_len,
+                                    Heap::Space space) {
   const String& result = String::Handle(OneByteString::New(other_len, space));
   ASSERT(other_typed_data.ElementSizeInBytes() == 1);
   if (other_len > 0) {
@@ -22010,10 +21993,10 @@
   return OneByteString::raw(result);
 }
 
-RawOneByteString* OneByteString::New(const ExternalTypedData& other_typed_data,
-                                     intptr_t other_start_index,
-                                     intptr_t other_len,
-                                     Heap::Space space) {
+OneByteStringPtr OneByteString::New(const ExternalTypedData& other_typed_data,
+                                    intptr_t other_start_index,
+                                    intptr_t other_len,
+                                    Heap::Space space) {
   const String& result = String::Handle(OneByteString::New(other_len, space));
   ASSERT(other_typed_data.ElementSizeInBytes() == 1);
   if (other_len > 0) {
@@ -22024,9 +22007,9 @@
   return OneByteString::raw(result);
 }
 
-RawOneByteString* OneByteString::Concat(const String& str1,
-                                        const String& str2,
-                                        Heap::Space space) {
+OneByteStringPtr OneByteString::Concat(const String& str1,
+                                       const String& str2,
+                                       Heap::Space space) {
   intptr_t len1 = str1.Length();
   intptr_t len2 = str2.Length();
   intptr_t len = len1 + len2;
@@ -22036,11 +22019,11 @@
   return OneByteString::raw(result);
 }
 
-RawOneByteString* OneByteString::ConcatAll(const Array& strings,
-                                           intptr_t start,
-                                           intptr_t end,
-                                           intptr_t len,
-                                           Heap::Space space) {
+OneByteStringPtr OneByteString::ConcatAll(const Array& strings,
+                                          intptr_t start,
+                                          intptr_t end,
+                                          intptr_t len,
+                                          Heap::Space space) {
   ASSERT(!strings.IsNull());
   ASSERT(start >= 0);
   ASSERT(end <= strings.Length());
@@ -22057,9 +22040,9 @@
   return OneByteString::raw(result);
 }
 
-RawOneByteString* OneByteString::Transform(int32_t (*mapping)(int32_t ch),
-                                           const String& str,
-                                           Heap::Space space) {
+OneByteStringPtr OneByteString::Transform(int32_t (*mapping)(int32_t ch),
+                                          const String& str,
+                                          Heap::Space space) {
   ASSERT(!str.IsNull());
   intptr_t len = str.Length();
   const String& result = String::Handle(OneByteString::New(len, space));
@@ -22072,10 +22055,10 @@
   return OneByteString::raw(result);
 }
 
-RawOneByteString* OneByteString::SubStringUnchecked(const String& str,
-                                                    intptr_t begin_index,
-                                                    intptr_t length,
-                                                    Heap::Space space) {
+OneByteStringPtr OneByteString::SubStringUnchecked(const String& str,
+                                                   intptr_t begin_index,
+                                                   intptr_t length,
+                                                   Heap::Space space) {
   ASSERT(!str.IsNull() && str.IsOneByteString());
   ASSERT(begin_index >= 0);
   ASSERT(length >= 0);
@@ -22083,7 +22066,7 @@
     return OneByteString::raw(Symbols::Empty());
   }
   ASSERT(begin_index < str.Length());
-  RawOneByteString* result = OneByteString::New(length, space);
+  OneByteStringPtr result = OneByteString::New(length, space);
   NoSafepointScope no_safepoint;
   if (length > 0) {
     uint8_t* dest = &result->ptr()->data()[0];
@@ -22093,7 +22076,7 @@
   return result;
 }
 
-RawTwoByteString* TwoByteString::EscapeSpecialCharacters(const String& str) {
+TwoByteStringPtr TwoByteString::EscapeSpecialCharacters(const String& str) {
   intptr_t len = str.Length();
   if (len > 0) {
     intptr_t num_escapes = 0;
@@ -22125,16 +22108,17 @@
   return TwoByteString::New(0, Heap::kNew);
 }
 
-RawTwoByteString* TwoByteString::New(intptr_t len, Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->two_byte_string_class());
+TwoByteStringPtr TwoByteString::New(intptr_t len, Heap::Space space) {
+  ASSERT(Isolate::Current()->object_store()->two_byte_string_class() !=
+         nullptr);
   if (len < 0 || len > kMaxElements) {
     // This should be caught before we reach here.
     FATAL1("Fatal error in TwoByteString::New: invalid len %" Pd "\n", len);
   }
   String& result = String::Handle();
   {
-    RawObject* raw = Object::Allocate(TwoByteString::kClassId,
-                                      TwoByteString::InstanceSize(len), space);
+    ObjectPtr raw = Object::Allocate(TwoByteString::kClassId,
+                                     TwoByteString::InstanceSize(len), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -22143,9 +22127,9 @@
   return TwoByteString::raw(result);
 }
 
-RawTwoByteString* TwoByteString::New(const uint16_t* utf16_array,
-                                     intptr_t array_len,
-                                     Heap::Space space) {
+TwoByteStringPtr TwoByteString::New(const uint16_t* utf16_array,
+                                    intptr_t array_len,
+                                    Heap::Space space) {
   ASSERT(array_len > 0);
   const String& result = String::Handle(TwoByteString::New(array_len, space));
   {
@@ -22155,10 +22139,10 @@
   return TwoByteString::raw(result);
 }
 
-RawTwoByteString* TwoByteString::New(intptr_t utf16_len,
-                                     const int32_t* utf32_array,
-                                     intptr_t array_len,
-                                     Heap::Space space) {
+TwoByteStringPtr TwoByteString::New(intptr_t utf16_len,
+                                    const int32_t* utf32_array,
+                                    intptr_t array_len,
+                                    Heap::Space space) {
   ASSERT((array_len > 0) && (utf16_len >= array_len));
   const String& result = String::Handle(TwoByteString::New(utf16_len, space));
   {
@@ -22179,17 +22163,17 @@
   return TwoByteString::raw(result);
 }
 
-RawTwoByteString* TwoByteString::New(const String& str, Heap::Space space) {
+TwoByteStringPtr TwoByteString::New(const String& str, Heap::Space space) {
   intptr_t len = str.Length();
   const String& result = String::Handle(TwoByteString::New(len, space));
   String::Copy(result, 0, str, 0, len);
   return TwoByteString::raw(result);
 }
 
-RawTwoByteString* TwoByteString::New(const TypedData& other_typed_data,
-                                     intptr_t other_start_index,
-                                     intptr_t other_len,
-                                     Heap::Space space) {
+TwoByteStringPtr TwoByteString::New(const TypedData& other_typed_data,
+                                    intptr_t other_start_index,
+                                    intptr_t other_len,
+                                    Heap::Space space) {
   const String& result = String::Handle(TwoByteString::New(other_len, space));
   if (other_len > 0) {
     NoSafepointScope no_safepoint;
@@ -22200,10 +22184,10 @@
   return TwoByteString::raw(result);
 }
 
-RawTwoByteString* TwoByteString::New(const ExternalTypedData& other_typed_data,
-                                     intptr_t other_start_index,
-                                     intptr_t other_len,
-                                     Heap::Space space) {
+TwoByteStringPtr TwoByteString::New(const ExternalTypedData& other_typed_data,
+                                    intptr_t other_start_index,
+                                    intptr_t other_len,
+                                    Heap::Space space) {
   const String& result = String::Handle(TwoByteString::New(other_len, space));
   if (other_len > 0) {
     NoSafepointScope no_safepoint;
@@ -22214,9 +22198,9 @@
   return TwoByteString::raw(result);
 }
 
-RawTwoByteString* TwoByteString::Concat(const String& str1,
-                                        const String& str2,
-                                        Heap::Space space) {
+TwoByteStringPtr TwoByteString::Concat(const String& str1,
+                                       const String& str2,
+                                       Heap::Space space) {
   intptr_t len1 = str1.Length();
   intptr_t len2 = str2.Length();
   intptr_t len = len1 + len2;
@@ -22226,11 +22210,11 @@
   return TwoByteString::raw(result);
 }
 
-RawTwoByteString* TwoByteString::ConcatAll(const Array& strings,
-                                           intptr_t start,
-                                           intptr_t end,
-                                           intptr_t len,
-                                           Heap::Space space) {
+TwoByteStringPtr TwoByteString::ConcatAll(const Array& strings,
+                                          intptr_t start,
+                                          intptr_t end,
+                                          intptr_t len,
+                                          Heap::Space space) {
   ASSERT(!strings.IsNull());
   ASSERT(start >= 0);
   ASSERT(end <= strings.Length());
@@ -22247,9 +22231,9 @@
   return TwoByteString::raw(result);
 }
 
-RawTwoByteString* TwoByteString::Transform(int32_t (*mapping)(int32_t ch),
-                                           const String& str,
-                                           Heap::Space space) {
+TwoByteStringPtr TwoByteString::Transform(int32_t (*mapping)(int32_t ch),
+                                          const String& str,
+                                          Heap::Space space) {
   ASSERT(!str.IsNull());
   intptr_t len = str.Length();
   const String& result = String::Handle(TwoByteString::New(len, space));
@@ -22272,7 +22256,7 @@
   return TwoByteString::raw(result);
 }
 
-RawExternalOneByteString* ExternalOneByteString::New(
+ExternalOneByteStringPtr ExternalOneByteString::New(
     const uint8_t* data,
     intptr_t len,
     void* peer,
@@ -22288,7 +22272,7 @@
   }
   String& result = String::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(ExternalOneByteString::kClassId,
                          ExternalOneByteString::InstanceSize(), space);
     NoSafepointScope no_safepoint;
@@ -22301,7 +22285,7 @@
   return ExternalOneByteString::raw(result);
 }
 
-RawExternalTwoByteString* ExternalTwoByteString::New(
+ExternalTwoByteStringPtr ExternalTwoByteString::New(
     const uint16_t* data,
     intptr_t len,
     void* peer,
@@ -22317,7 +22301,7 @@
   }
   String& result = String::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(ExternalTwoByteString::kClassId,
                          ExternalTwoByteString::InstanceSize(), space);
     NoSafepointScope no_safepoint;
@@ -22330,13 +22314,13 @@
   return ExternalTwoByteString::raw(result);
 }
 
-RawBool* Bool::New(bool value) {
+BoolPtr Bool::New(bool value) {
   ASSERT(Isolate::Current()->object_store()->bool_class() != Class::null());
   Bool& result = Bool::Handle();
   {
     // Since the two boolean instances are singletons we allocate them straight
     // in the old generation.
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Bool::kClassId, Bool::InstanceSize(), Heap::kOld);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -22410,19 +22394,19 @@
   return hash;
 }
 
-RawArray* Array::New(intptr_t len, Heap::Space space) {
+ArrayPtr Array::New(intptr_t len, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->array_class() != Class::null());
-  RawArray* result = New(kClassId, len, space);
+  ArrayPtr result = New(kClassId, len, space);
   if (UseCardMarkingForAllocation(len)) {
     ASSERT(result->IsOldObject());
-    result->SetCardRememberedBitUnsynchronized();
+    result->ptr()->SetCardRememberedBitUnsynchronized();
   }
   return result;
 }
 
-RawArray* Array::New(intptr_t len,
-                     const AbstractType& element_type,
-                     Heap::Space space) {
+ArrayPtr Array::New(intptr_t len,
+                    const AbstractType& element_type,
+                    Heap::Space space) {
   const Array& result = Array::Handle(Array::New(len, space));
   if (!element_type.IsDynamicType()) {
     TypeArguments& type_args = TypeArguments::Handle(TypeArguments::New(1));
@@ -22433,23 +22417,23 @@
   return result.raw();
 }
 
-RawArray* Array::New(intptr_t class_id, intptr_t len, Heap::Space space) {
+ArrayPtr Array::New(intptr_t class_id, intptr_t len, Heap::Space space) {
   if (!IsValidLength(len)) {
     // This should be caught before we reach here.
     FATAL1("Fatal error in Array::New: invalid len %" Pd "\n", len);
   }
   {
-    RawArray* raw = reinterpret_cast<RawArray*>(
+    ArrayPtr raw = static_cast<ArrayPtr>(
         Object::Allocate(class_id, Array::InstanceSize(len), space));
     NoSafepointScope no_safepoint;
-    raw->StoreSmi(&(raw->ptr()->length_), Smi::New(len));
+    raw->ptr()->StoreSmi(&(raw->ptr()->length_), Smi::New(len));
     return raw;
   }
 }
 
-RawArray* Array::Slice(intptr_t start,
-                       intptr_t count,
-                       bool with_type_argument) const {
+ArrayPtr Array::Slice(intptr_t start,
+                      intptr_t count,
+                      bool with_type_argument) const {
   // TODO(vegorov) introduce an array allocation method that fills newly
   // allocated array with values from the given source array instead of
   // null-initializing all elements.
@@ -22472,7 +22456,7 @@
   do {
     old_tags = tags;
     uint32_t new_tags =
-        RawObject::ClassIdTag::update(kImmutableArrayCid, old_tags);
+        ObjectLayout::ClassIdTag::update(kImmutableArrayCid, old_tags);
     tags = CompareAndSwapTags(old_tags, new_tags);
   } while (tags != old_tags);
 }
@@ -22487,9 +22471,9 @@
   return zone->PrintToString(format, Length());
 }
 
-RawArray* Array::Grow(const Array& source,
-                      intptr_t new_length,
-                      Heap::Space space) {
+ArrayPtr Array::Grow(const Array& source,
+                     intptr_t new_length,
+                     Heap::Space space) {
   Zone* zone = Thread::Current()->zone();
   const Array& result = Array::Handle(zone, Array::New(new_length, space));
   intptr_t len = 0;
@@ -22518,6 +22502,9 @@
 
   intptr_t old_len = array.Length();
   ASSERT(new_len <= old_len);
+  if (old_len == new_len) {
+    return;
+  }
   intptr_t old_size = Array::InstanceSize(old_len);
   intptr_t new_size = Array::InstanceSize(new_len);
 
@@ -22534,23 +22521,23 @@
 
   // Update the size in the header field and length of the array object.
   uint32_t tags = array.raw_ptr()->tags_;
-  ASSERT(kArrayCid == RawObject::ClassIdTag::decode(tags));
+  ASSERT(kArrayCid == ObjectLayout::ClassIdTag::decode(tags));
   uint32_t old_tags;
   do {
     old_tags = tags;
-    uint32_t new_tags = RawObject::SizeTag::update(new_size, old_tags);
+    uint32_t new_tags = ObjectLayout::SizeTag::update(new_size, old_tags);
     tags = CompareAndSwapTags(old_tags, new_tags);
   } while (tags != old_tags);
 
   // Between the CAS of the header above and the SetLength below, the array is
   // temporarily in an inconsistent state. The header is considered the
-  // overriding source of object size by RawObject::Size, but the ASSERTs in
-  // RawObject::SizeFromClass must handle this special case.
+  // overriding source of object size by ObjectLayout::Size, but the ASSERTs in
+  // ObjectLayout::SizeFromClass must handle this special case.
   array.SetLengthIgnoreRace(new_len);
 }
 
-RawArray* Array::MakeFixedLength(const GrowableObjectArray& growable_array,
-                                 bool unique) {
+ArrayPtr Array::MakeFixedLength(const GrowableObjectArray& growable_array,
+                                bool unique) {
   ASSERT(!growable_array.IsNull());
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -22617,10 +22604,10 @@
   return true;
 }
 
-RawImmutableArray* ImmutableArray::New(intptr_t len, Heap::Space space) {
+ImmutableArrayPtr ImmutableArray::New(intptr_t len, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->immutable_array_class() !=
          Class::null());
-  return reinterpret_cast<RawImmutableArray*>(Array::New(kClassId, len, space));
+  return static_cast<ImmutableArrayPtr>(Array::New(kClassId, len, space));
 }
 
 void GrowableObjectArray::Add(const Object& value, Heap::Space space) const {
@@ -22648,7 +22635,7 @@
   StorePointer(&(raw_ptr()->data_), new_contents.raw());
 }
 
-RawObject* GrowableObjectArray::RemoveLast() const {
+ObjectPtr GrowableObjectArray::RemoveLast() const {
   ASSERT(!IsNull());
   ASSERT(Length() > 0);
   intptr_t index = Length() - 1;
@@ -22659,21 +22646,21 @@
   return obj.raw();
 }
 
-RawGrowableObjectArray* GrowableObjectArray::New(intptr_t capacity,
-                                                 Heap::Space space) {
-  RawArray* raw_data = (capacity == 0) ? Object::empty_array().raw()
-                                       : Array::New(capacity, space);
+GrowableObjectArrayPtr GrowableObjectArray::New(intptr_t capacity,
+                                                Heap::Space space) {
+  ArrayPtr raw_data = (capacity == 0) ? Object::empty_array().raw()
+                                      : Array::New(capacity, space);
   const Array& data = Array::Handle(raw_data);
   return New(data, space);
 }
 
-RawGrowableObjectArray* GrowableObjectArray::New(const Array& array,
-                                                 Heap::Space space) {
+GrowableObjectArrayPtr GrowableObjectArray::New(const Array& array,
+                                                Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->growable_object_array_class() !=
          Class::null());
   GrowableObjectArray& result = GrowableObjectArray::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(GrowableObjectArray::kClassId,
                          GrowableObjectArray::InstanceSize(), space);
     NoSafepointScope no_safepoint;
@@ -22727,7 +22714,7 @@
   }
 };
 
-RawLinkedHashMap* LinkedHashMap::NewDefault(Heap::Space space) {
+LinkedHashMapPtr LinkedHashMap::NewDefault(Heap::Space space) {
   const Array& data = Array::Handle(Array::New(kInitialIndexSize, space));
   const TypedData& index = TypedData::Handle(
       TypedData::New(kTypedDataUint32ArrayCid, kInitialIndexSize, space));
@@ -22738,12 +22725,12 @@
   return LinkedHashMap::New(data, index, kInitialHashMask, 0, 0, space);
 }
 
-RawLinkedHashMap* LinkedHashMap::New(const Array& data,
-                                     const TypedData& index,
-                                     intptr_t hash_mask,
-                                     intptr_t used_data,
-                                     intptr_t deleted_keys,
-                                     Heap::Space space) {
+LinkedHashMapPtr LinkedHashMap::New(const Array& data,
+                                    const TypedData& index,
+                                    intptr_t hash_mask,
+                                    intptr_t used_data,
+                                    intptr_t deleted_keys,
+                                    Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->linked_hash_map_class() !=
          Class::null());
   LinkedHashMap& result =
@@ -22756,13 +22743,13 @@
   return result.raw();
 }
 
-RawLinkedHashMap* LinkedHashMap::NewUninitialized(Heap::Space space) {
+LinkedHashMapPtr LinkedHashMap::NewUninitialized(Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->linked_hash_map_class() !=
          Class::null());
   LinkedHashMap& result = LinkedHashMap::Handle();
   {
-    RawObject* raw = Object::Allocate(LinkedHashMap::kClassId,
-                                      LinkedHashMap::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(LinkedHashMap::kClassId,
+                                     LinkedHashMap::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22779,16 +22766,16 @@
   UNREACHABLE();
 }
 
-RawFloat32x4* Float32x4::New(float v0,
-                             float v1,
-                             float v2,
-                             float v3,
-                             Heap::Space space) {
+Float32x4Ptr Float32x4::New(float v0,
+                            float v1,
+                            float v2,
+                            float v3,
+                            Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->float32x4_class() !=
          Class::null());
   Float32x4& result = Float32x4::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Float32x4::kClassId, Float32x4::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -22800,12 +22787,12 @@
   return result.raw();
 }
 
-RawFloat32x4* Float32x4::New(simd128_value_t value, Heap::Space space) {
+Float32x4Ptr Float32x4::New(simd128_value_t value, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->float32x4_class() !=
          Class::null());
   Float32x4& result = Float32x4::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Float32x4::kClassId, Float32x4::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -22865,15 +22852,15 @@
                      _w);
 }
 
-RawInt32x4* Int32x4::New(int32_t v0,
-                         int32_t v1,
-                         int32_t v2,
-                         int32_t v3,
-                         Heap::Space space) {
+Int32x4Ptr Int32x4::New(int32_t v0,
+                        int32_t v1,
+                        int32_t v2,
+                        int32_t v3,
+                        Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->int32x4_class() != Class::null());
   Int32x4& result = Int32x4::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Int32x4::kClassId, Int32x4::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -22885,11 +22872,11 @@
   return result.raw();
 }
 
-RawInt32x4* Int32x4::New(simd128_value_t value, Heap::Space space) {
+Int32x4Ptr Int32x4::New(simd128_value_t value, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->int32x4_class() != Class::null());
   Int32x4& result = Int32x4::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Int32x4::kClassId, Int32x4::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -22949,12 +22936,12 @@
                      _y, _z, _w);
 }
 
-RawFloat64x2* Float64x2::New(double value0, double value1, Heap::Space space) {
+Float64x2Ptr Float64x2::New(double value0, double value1, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->float64x2_class() !=
          Class::null());
   Float64x2& result = Float64x2::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Float64x2::kClassId, Float64x2::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -22964,12 +22951,12 @@
   return result.raw();
 }
 
-RawFloat64x2* Float64x2::New(simd128_value_t value, Heap::Space space) {
+Float64x2Ptr Float64x2::New(simd128_value_t value, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->float64x2_class() !=
          Class::null());
   Float64x2& result = Float64x2::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Float64x2::kClassId, Float64x2::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -23063,16 +23050,16 @@
   return FinalizeHash(hash, kHashBits);
 }
 
-RawTypedData* TypedData::New(intptr_t class_id,
-                             intptr_t len,
-                             Heap::Space space) {
+TypedDataPtr TypedData::New(intptr_t class_id,
+                            intptr_t len,
+                            Heap::Space space) {
   if (len < 0 || len > TypedData::MaxElements(class_id)) {
     FATAL1("Fatal error in TypedData::New: invalid len %" Pd "\n", len);
   }
   TypedData& result = TypedData::Handle();
   {
     const intptr_t length_in_bytes = len * ElementSizeInBytes(class_id);
-    RawObject* raw = Object::Allocate(
+    ObjectPtr raw = Object::Allocate(
         class_id, TypedData::InstanceSize(length_in_bytes), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -23100,7 +23087,7 @@
   return dart::AddFinalizer(*this, peer, callback, external_size);
 }
 
-RawExternalTypedData* ExternalTypedData::New(
+ExternalTypedDataPtr ExternalTypedData::New(
     intptr_t class_id,
     uint8_t* data,
     intptr_t len,
@@ -23118,7 +23105,7 @@
 
   ExternalTypedData& result = ExternalTypedData::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(class_id, ExternalTypedData::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -23128,8 +23115,8 @@
   return result.raw();
 }
 
-RawExternalTypedData* ExternalTypedData::NewFinalizeWithFree(uint8_t* data,
-                                                             intptr_t len) {
+ExternalTypedDataPtr ExternalTypedData::NewFinalizeWithFree(uint8_t* data,
+                                                            intptr_t len) {
   ExternalTypedData& result = ExternalTypedData::Handle(ExternalTypedData::New(
       kExternalTypedDataUint8ArrayCid, data, len, Heap::kOld));
   result.AddFinalizer(
@@ -23140,10 +23127,10 @@
   return result.raw();
 }
 
-RawTypedDataView* TypedDataView::New(intptr_t class_id, Heap::Space space) {
+TypedDataViewPtr TypedDataView::New(intptr_t class_id, Heap::Space space) {
   auto& result = TypedDataView::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(class_id, TypedDataView::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -23152,11 +23139,11 @@
   return result.raw();
 }
 
-RawTypedDataView* TypedDataView::New(intptr_t class_id,
-                                     const TypedDataBase& typed_data,
-                                     intptr_t offset_in_bytes,
-                                     intptr_t length,
-                                     Heap::Space space) {
+TypedDataViewPtr TypedDataView::New(intptr_t class_id,
+                                    const TypedDataBase& typed_data,
+                                    intptr_t offset_in_bytes,
+                                    intptr_t length,
+                                    Heap::Space space) {
   auto& result = TypedDataView::Handle(TypedDataView::New(class_id, space));
   result.InitializeWith(typed_data, offset_in_bytes, length);
   return result.raw();
@@ -23177,9 +23164,9 @@
   return "ExternalTypedData";
 }
 
-RawPointer* Pointer::New(const AbstractType& type_arg,
-                         size_t native_address,
-                         Heap::Space space) {
+PointerPtr Pointer::New(const AbstractType& type_arg,
+                        size_t native_address,
+                        Heap::Space space) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -23207,7 +23194,7 @@
                      type_args_name.ToCString(), NativeAddress());
 }
 
-RawDynamicLibrary* DynamicLibrary::New(void* handle, Heap::Space space) {
+DynamicLibraryPtr DynamicLibrary::New(void* handle, Heap::Space space) {
   DynamicLibrary& result = DynamicLibrary::Handle();
   result ^= Object::Allocate(kFfiDynamicLibraryCid,
                              DynamicLibrary::InstanceSize(), space);
@@ -23229,11 +23216,11 @@
                      reinterpret_cast<uintptr_t>(GetHandle()));
 }
 
-RawCapability* Capability::New(uint64_t id, Heap::Space space) {
+CapabilityPtr Capability::New(uint64_t id, Heap::Space space) {
   Capability& result = Capability::Handle();
   {
-    RawObject* raw = Object::Allocate(Capability::kClassId,
-                                      Capability::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(Capability::kClassId,
+                                     Capability::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(&result.raw_ptr()->id_, id);
@@ -23245,9 +23232,9 @@
   return "Capability";
 }
 
-RawReceivePort* ReceivePort::New(Dart_Port id,
-                                 bool is_control_port,
-                                 Heap::Space space) {
+ReceivePortPtr ReceivePort::New(Dart_Port id,
+                                bool is_control_port,
+                                Heap::Space space) {
   ASSERT(id != ILLEGAL_PORT);
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -23256,8 +23243,8 @@
 
   ReceivePort& result = ReceivePort::Handle(zone);
   {
-    RawObject* raw = Object::Allocate(ReceivePort::kClassId,
-                                      ReceivePort::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(ReceivePort::kClassId,
+                                     ReceivePort::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StorePointer(&result.raw_ptr()->send_port_, send_port.raw());
@@ -23274,17 +23261,17 @@
   return "ReceivePort";
 }
 
-RawSendPort* SendPort::New(Dart_Port id, Heap::Space space) {
+SendPortPtr SendPort::New(Dart_Port id, Heap::Space space) {
   return New(id, Isolate::Current()->origin_id(), space);
 }
 
-RawSendPort* SendPort::New(Dart_Port id,
-                           Dart_Port origin_id,
-                           Heap::Space space) {
+SendPortPtr SendPort::New(Dart_Port id,
+                          Dart_Port origin_id,
+                          Heap::Space space) {
   ASSERT(id != ILLEGAL_PORT);
   SendPort& result = SendPort::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(SendPort::kClassId, SendPort::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -23304,15 +23291,15 @@
   delete (reinterpret_cast<TransferableTypedDataPeer*>(peer));
 }
 
-RawTransferableTypedData* TransferableTypedData::New(uint8_t* data,
-                                                     intptr_t length,
-                                                     Heap::Space space) {
+TransferableTypedDataPtr TransferableTypedData::New(uint8_t* data,
+                                                    intptr_t length,
+                                                    Heap::Space space) {
   TransferableTypedDataPeer* peer = new TransferableTypedDataPeer(data, length);
 
   Thread* thread = Thread::Current();
   TransferableTypedData& result = TransferableTypedData::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(TransferableTypedData::kClassId,
                          TransferableTypedData::InstanceSize(), space);
     NoSafepointScope no_safepoint;
@@ -23379,26 +23366,26 @@
   return FinalizeHash(result, String::kHashBits);
 }
 
-RawClosure* Closure::New(const TypeArguments& instantiator_type_arguments,
-                         const TypeArguments& function_type_arguments,
-                         const Function& function,
-                         const Context& context,
-                         Heap::Space space) {
+ClosurePtr Closure::New(const TypeArguments& instantiator_type_arguments,
+                        const TypeArguments& function_type_arguments,
+                        const Function& function,
+                        const Context& context,
+                        Heap::Space space) {
   return Closure::New(instantiator_type_arguments, function_type_arguments,
                       function.IsGeneric() ? Object::empty_type_arguments()
                                            : Object::null_type_arguments(),
                       function, context, space);
 }
 
-RawClosure* Closure::New(const TypeArguments& instantiator_type_arguments,
-                         const TypeArguments& function_type_arguments,
-                         const TypeArguments& delayed_type_arguments,
-                         const Function& function,
-                         const Context& context,
-                         Heap::Space space) {
+ClosurePtr Closure::New(const TypeArguments& instantiator_type_arguments,
+                        const TypeArguments& function_type_arguments,
+                        const TypeArguments& delayed_type_arguments,
+                        const Function& function,
+                        const Context& context,
+                        Heap::Space space) {
   Closure& result = Closure::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(Closure::kClassId, Closure::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -23414,13 +23401,13 @@
   return result.raw();
 }
 
-RawClosure* Closure::New() {
-  RawObject* raw =
+ClosurePtr Closure::New() {
+  ObjectPtr raw =
       Object::Allocate(Closure::kClassId, Closure::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawClosure*>(raw);
+  return static_cast<ClosurePtr>(raw);
 }
 
-RawFunction* Closure::GetInstantiatedSignature(Zone* zone) const {
+FunctionPtr Closure::GetInstantiatedSignature(Zone* zone) const {
   Function& sig_fun = Function::Handle(zone, function());
   TypeArguments& fn_type_args =
       TypeArguments::Handle(zone, function_type_arguments());
@@ -23461,7 +23448,7 @@
   return code_array.Length();
 }
 
-RawObject* StackTrace::CodeAtFrame(intptr_t frame_index) const {
+ObjectPtr StackTrace::CodeAtFrame(intptr_t frame_index) const {
   const Array& code_array = Array::Handle(raw_ptr()->code_array_);
   return code_array.At(frame_index);
 }
@@ -23472,9 +23459,9 @@
   code_array.SetAt(frame_index, code);
 }
 
-RawSmi* StackTrace::PcOffsetAtFrame(intptr_t frame_index) const {
+SmiPtr StackTrace::PcOffsetAtFrame(intptr_t frame_index) const {
   const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_);
-  return reinterpret_cast<RawSmi*>(pc_offset_array.At(frame_index));
+  return static_cast<SmiPtr>(pc_offset_array.At(frame_index));
 }
 
 void StackTrace::SetPcOffsetAtFrame(intptr_t frame_index,
@@ -23503,13 +23490,13 @@
   return raw_ptr()->expand_inlined_;
 }
 
-RawStackTrace* StackTrace::New(const Array& code_array,
-                               const Array& pc_offset_array,
-                               Heap::Space space) {
+StackTracePtr StackTrace::New(const Array& code_array,
+                              const Array& pc_offset_array,
+                              Heap::Space space) {
   StackTrace& result = StackTrace::Handle();
   {
-    RawObject* raw = Object::Allocate(StackTrace::kClassId,
-                                      StackTrace::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(StackTrace::kClassId,
+                                     StackTrace::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -23520,15 +23507,15 @@
   return result.raw();
 }
 
-RawStackTrace* StackTrace::New(const Array& code_array,
-                               const Array& pc_offset_array,
-                               const StackTrace& async_link,
-                               bool skip_sync_start_in_parent_stack,
-                               Heap::Space space) {
+StackTracePtr StackTrace::New(const Array& code_array,
+                              const Array& pc_offset_array,
+                              const StackTrace& async_link,
+                              bool skip_sync_start_in_parent_stack,
+                              Heap::Space space) {
   StackTrace& result = StackTrace::Handle();
   {
-    RawObject* raw = Object::Allocate(StackTrace::kClassId,
-                                      StackTrace::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(StackTrace::kClassId,
+                                     StackTrace::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -23540,40 +23527,45 @@
   return result.raw();
 }
 
-#if defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
-static void PrintStackTraceFrameBodyFromDSO(ZoneTextBuffer* buffer,
-                                            uword call_addr) {
-  uword dso_base;
-  char* dso_name;
-  if (NativeSymbolResolver::LookupSharedObject(call_addr, &dso_base,
-                                               &dso_name)) {
-    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);
+#if defined(DART_PRECOMPILED_RUNTIME)
+static void PrintNonSymbolicStackFrameBody(ZoneTextBuffer* buffer,
+                                           uword call_addr,
+                                           uword isolate_instructions,
+                                           uword vm_instructions) {
+  const word vm_offset = call_addr - vm_instructions;
+  const word isolate_offset = call_addr - isolate_instructions;
+  // Pick the closest instructions section start before the call address.
+  if (vm_offset > 0 && (isolate_offset < 0 || vm_offset < isolate_offset)) {
+    buffer->Printf(" %s+0x%" Px "", kVmSnapshotInstructionsAsmSymbol,
+                   vm_offset);
+  } else if (isolate_offset > 0) {
+    buffer->Printf(" %s+0x%" Px "", kIsolateSnapshotInstructionsAsmSymbol,
+                   isolate_offset);
   } else {
-    buffer->Printf(" <unknown>");
+    uword dso_base;
+    char* dso_name;
+    if (NativeSymbolResolver::LookupSharedObject(call_addr, &dso_base,
+                                                 &dso_name)) {
+      buffer->Printf(" %s", dso_name);
+      NativeSymbolResolver::FreeSymbolName(dso_name);
+    } else {
+      buffer->Printf(" <unknown>");
+    }
   }
   buffer->Printf("\n");
 }
 #endif
 
-static void PrintStackTraceFrameIndex(ZoneTextBuffer* buffer,
-                                      intptr_t frame_index) {
+static void PrintSymbolicStackFrameIndex(ZoneTextBuffer* buffer,
+                                         intptr_t frame_index) {
   buffer->Printf("#%-6" Pd "", frame_index);
 }
 
-static void PrintStackTraceFrameBody(ZoneTextBuffer* buffer,
-                                     const char* function_name,
-                                     const char* url,
-                                     intptr_t line = -1,
-                                     intptr_t column = -1) {
+static void PrintSymbolicStackFrameBody(ZoneTextBuffer* buffer,
+                                        const char* function_name,
+                                        const char* url,
+                                        intptr_t line = -1,
+                                        intptr_t column = -1) {
   buffer->Printf(" %s (%s", function_name, url);
   if (line >= 0) {
     buffer->Printf(":%" Pd "", line);
@@ -23584,11 +23576,11 @@
   buffer->Printf(")\n");
 }
 
-static void PrintStackTraceFrame(Zone* zone,
-                                 ZoneTextBuffer* buffer,
-                                 const Function& function,
-                                 TokenPosition token_pos,
-                                 intptr_t frame_index) {
+static void PrintSymbolicStackFrame(Zone* zone,
+                                    ZoneTextBuffer* buffer,
+                                    const Function& function,
+                                    TokenPosition token_pos,
+                                    intptr_t frame_index) {
   ASSERT(!function.IsNull());
   const auto& script = Script::Handle(zone, function.script());
   auto& handle = String::Handle(zone, function.QualifiedUserVisibleName());
@@ -23611,13 +23603,14 @@
     script.GetTokenLocation(token_pos.SourcePosition(), &line, &column);
   }
 
-  PrintStackTraceFrameIndex(buffer, frame_index);
-  PrintStackTraceFrameBody(buffer, function_name, url, line, column);
+  PrintSymbolicStackFrameIndex(buffer, frame_index);
+  PrintSymbolicStackFrameBody(buffer, function_name, url, line, column);
 }
 
-const char* StackTrace::ToDartCString(const StackTrace& stack_trace_in) {
-  auto const zone = Thread::Current()->zone();
-  auto& stack_trace = StackTrace::Handle(zone, stack_trace_in.raw());
+const char* StackTrace::ToCString() const {
+  auto const T = Thread::Current();
+  auto const zone = T->zone();
+  auto& stack_trace = StackTrace::Handle(zone, this->raw());
   auto& function = Function::Handle(zone);
   auto& code_object = Object::Handle(zone);
   auto& code = Code::Handle(zone);
@@ -23627,6 +23620,30 @@
   GrowableArray<TokenPosition> inlined_token_positions;
   ZoneTextBuffer buffer(zone, 1024);
 
+#if defined(DART_PRECOMPILED_RUNTIME)
+  auto const isolate_instructions = reinterpret_cast<uword>(
+      T->isolate_group()->source()->snapshot_instructions);
+  auto const vm_instructions = reinterpret_cast<uword>(
+      Dart::vm_isolate()->group()->source()->snapshot_instructions);
+  if (FLAG_dwarf_stack_traces_mode) {
+    // The Dart standard requires the output of StackTrace.toString to include
+    // all pending activations with precise source locations (i.e., to expand
+    // inlined frames and provide line and column numbers).
+    buffer.Printf(
+        "Warning: This VM has been configured to produce stack traces "
+        "that violate the Dart standard.\n");
+    // This prologue imitates Android's debuggerd to make it possible to paste
+    // the stack trace into ndk-stack.
+    buffer.Printf(
+        "*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\n");
+    OSThread* thread = OSThread::Current();
+    buffer.Printf("pid: %" Pd ", tid: %" Pd ", name %s\n", OS::ProcessId(),
+                  OSThread::ThreadIdToIntPtr(thread->id()), thread->name());
+    buffer.Printf("isolate_instructions: %" Px "", isolate_instructions);
+    buffer.Printf(" vm_instructions: %" Px "\n", vm_instructions);
+  }
+#endif
+
   // Iterate through the stack frames and create C string description
   // for each frame.
   intptr_t frame_index = 0;
@@ -23653,15 +23670,45 @@
           ASSERT(code.IsFunctionCode());
           function = code.function();
           const uword pc = code.PayloadStart() + pc_offset;
-          if (function.IsNull()) {
 #if defined(DART_PRECOMPILED_RUNTIME)
-            PrintStackTraceFrameIndex(&buffer, frame_index);
-            PrintStackTraceFrameBodyFromDSO(&buffer, pc - 1);
+          // When printing non-symbolic frames, we normally print call
+          // addresses, not return addresses, by subtracting one from the PC to
+          // get an address within the preceding instruction.
+          //
+          // The one exception is a normal closure registered as a listener on a
+          // future. In this case, the returned pc_offset is 0, as the closure
+          // is invoked with the value of the resolved future. Thus, we must
+          // report the return address, as returning a value before the closure
+          // payload will cause failures to decode the frame using DWARF info.
+          const bool is_future_listener = pc_offset == 0;
+          const uword call_addr = is_future_listener ? pc : pc - 1;
+          if (FLAG_dwarf_stack_traces_mode) {
+            // If we have access to the owning function and it would be
+            // invisible in a symbolic stack trace, don't show this frame.
+            // (We can't do the same for inlined functions, though.)
+            if (!FLAG_show_invisible_frames && !function.IsNull() &&
+                !function.is_visible()) {
+              continue;
+            }
+            // This output is formatted like Android's debuggerd. Note debuggerd
+            // prints call addresses instead of return addresses.
+            buffer.Printf("    #%02" Pd " abs %" Pp "", frame_index, call_addr);
+            PrintNonSymbolicStackFrameBody(
+                &buffer, call_addr, isolate_instructions, vm_instructions);
             frame_index++;
-#else
-            UNREACHABLE();
+            continue;
+          } else if (function.IsNull()) {
+            // We can't print the symbolic information since the owner was not
+            // retained, so instead print the static symbol + offset like the
+            // non-symbolic stack traces.
+            PrintSymbolicStackFrameIndex(&buffer, frame_index);
+            PrintNonSymbolicStackFrameBody(
+                &buffer, call_addr, isolate_instructions, vm_instructions);
+            frame_index++;
+            continue;
+          }
 #endif
-          } else if (code.is_optimized() && stack_trace.expand_inlined()) {
+          if (code.is_optimized() && stack_trace.expand_inlined()) {
             code.GetInlinedFunctionsAtReturnAddress(
                 pc_offset, &inlined_functions, &inlined_token_positions);
             ASSERT(inlined_functions.length() >= 1);
@@ -23669,13 +23716,14 @@
               const auto& inlined = *inlined_functions[j];
               auto const pos = inlined_token_positions[j];
               if (FLAG_show_invisible_frames || function.is_visible()) {
-                PrintStackTraceFrame(zone, &buffer, inlined, pos, frame_index);
+                PrintSymbolicStackFrame(zone, &buffer, inlined, pos,
+                                        frame_index);
                 frame_index++;
               }
             }
           } else if (FLAG_show_invisible_frames || function.is_visible()) {
             auto const pos = code.GetTokenIndexOfPC(pc);
-            PrintStackTraceFrame(zone, &buffer, function, pos, frame_index);
+            PrintSymbolicStackFrame(zone, &buffer, function, pos, frame_index);
             frame_index++;
           }
         } else {
@@ -23685,7 +23733,7 @@
           if (FLAG_show_invisible_frames || function.is_visible()) {
             uword pc = bytecode.PayloadStart() + pc_offset;
             auto const pos = bytecode.GetTokenIndexOfPC(pc);
-            PrintStackTraceFrame(zone, &buffer, function, pos, frame_index);
+            PrintSymbolicStackFrame(zone, &buffer, function, pos, frame_index);
             frame_index++;
           }
         }
@@ -23701,83 +23749,6 @@
   return buffer.buffer();
 }
 
-const char* StackTrace::ToDwarfCString(const StackTrace& stack_trace_in) {
-#if defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
-  auto const T = Thread::Current();
-  auto const zone = T->zone();
-  auto& stack_trace = StackTrace::Handle(zone, stack_trace_in.raw());
-  auto& code = Object::Handle(zone);
-  ZoneTextBuffer buffer(zone, 1024);
-
-  // The Dart standard requires the output of StackTrace.toString to include
-  // all pending activations with precise source locations (i.e., to expand
-  // inlined frames and provide line and column numbers).
-  buffer.Printf(
-      "Warning: This VM has been configured to produce stack traces "
-      "that violate the Dart standard.\n");
-  // This prologue imitates Android's debuggerd to make it possible to paste
-  // the stack trace into ndk-stack.
-  buffer.Printf(
-      "*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\n");
-  OSThread* thread = OSThread::Current();
-  buffer.Printf("pid: %" Pd ", tid: %" Pd ", name %s\n", OS::ProcessId(),
-                OSThread::ThreadIdToIntPtr(thread->id()), thread->name());
-  auto const isolate_instructions =
-      T->isolate_group()->source()->snapshot_instructions;
-  auto const vm_instructions =
-      Dart::vm_isolate()->group()->source()->snapshot_instructions;
-  buffer.Printf("isolate_instructions: %" Px "",
-                reinterpret_cast<uintptr_t>(isolate_instructions));
-  buffer.Printf(" vm_instructions: %" Px "\n",
-                reinterpret_cast<uintptr_t>(vm_instructions));
-  intptr_t frame_index = 0;
-  uint32_t frame_skip = 0;
-  do {
-    for (intptr_t i = frame_skip; i < stack_trace.Length(); i++) {
-      code = stack_trace.CodeAtFrame(i);
-      if (code.IsNull()) {
-        // Check for a null function, which indicates a gap in a StackOverflow
-        // or OutOfMemory trace.
-        if ((i < (stack_trace.Length() - 1)) &&
-            (stack_trace.CodeAtFrame(i + 1) != Code::null())) {
-          buffer.AddString("...\n...\n");
-          ASSERT(stack_trace.PcOffsetAtFrame(i) != Smi::null());
-          // To account for gap frames.
-          frame_index += Smi::Value(stack_trace.PcOffsetAtFrame(i));
-        }
-      } else if (code.raw() == StubCode::AsynchronousGapMarker().raw()) {
-        buffer.AddString("<asynchronous suspension>\n");
-        // The frame immediately after the asynchronous gap marker is the
-        // identical to the frame above the marker. Skip the frame to enhance
-        // the readability of the trace.
-        i++;
-      } else {
-        intptr_t pc_offset = Smi::Value(stack_trace.PcOffsetAtFrame(i));
-        // This output is formatted like Android's debuggerd. Note debuggerd
-        // prints call addresses instead of return addresses.
-        uword start = code.IsBytecode() ? Bytecode::Cast(code).PayloadStart()
-                                        : 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);
-        PrintStackTraceFrameBodyFromDSO(&buffer, call_addr);
-        frame_index++;
-      }
-    }
-    // Follow the link.
-    frame_skip = stack_trace.skip_sync_start_in_parent_stack()
-                     ? StackTrace::kSyncAsyncCroppedFrames
-                     : 0;
-    stack_trace = stack_trace.async_link();
-  } while (!stack_trace.IsNull());
-
-  return buffer.buffer();
-#else
-  UNREACHABLE();
-  return NULL;
-#endif  // defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
-}
-
 static void DwarfStackTracesHandler(bool value) {
   FLAG_dwarf_stack_traces_mode = value;
 
@@ -23796,15 +23767,6 @@
                     "Omit CodeSourceMaps in precompiled snapshots and don't "
                     "symbolize stack traces in the precompiled runtime.");
 
-const char* StackTrace::ToCString() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_dwarf_stack_traces_mode) {
-    return ToDwarfCString(*this);
-  }
-#endif
-  return ToDartCString(*this);
-}
-
 void RegExp::set_pattern(const String& pattern) const {
   StorePointer(&raw_ptr()->pattern_, pattern.raw());
 }
@@ -23841,10 +23803,10 @@
   StorePointer(&raw_ptr()->capture_name_map_, array.raw());
 }
 
-RawRegExp* RegExp::New(Heap::Space space) {
+RegExpPtr RegExp::New(Heap::Space space) {
   RegExp& result = RegExp::Handle();
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(RegExp::kClassId, RegExp::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -23921,12 +23883,12 @@
                      str.ToCString(), flags().ToCString());
 }
 
-RawWeakProperty* WeakProperty::New(Heap::Space space) {
+WeakPropertyPtr WeakProperty::New(Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->weak_property_class() !=
          Class::null());
-  RawObject* raw = Object::Allocate(WeakProperty::kClassId,
-                                    WeakProperty::InstanceSize(), space);
-  RawWeakProperty* result = reinterpret_cast<RawWeakProperty*>(raw);
+  ObjectPtr raw = Object::Allocate(WeakProperty::kClassId,
+                                   WeakProperty::InstanceSize(), space);
+  WeakPropertyPtr result = static_cast<WeakPropertyPtr>(raw);
   result->ptr()->next_ = 0;  // Init the list to NULL.
   return result;
 }
@@ -23935,42 +23897,42 @@
   return "_WeakProperty";
 }
 
-RawAbstractType* MirrorReference::GetAbstractTypeReferent() const {
+AbstractTypePtr MirrorReference::GetAbstractTypeReferent() const {
   ASSERT(Object::Handle(referent()).IsAbstractType());
   return AbstractType::Cast(Object::Handle(referent())).raw();
 }
 
-RawClass* MirrorReference::GetClassReferent() const {
+ClassPtr MirrorReference::GetClassReferent() const {
   ASSERT(Object::Handle(referent()).IsClass());
   return Class::Cast(Object::Handle(referent())).raw();
 }
 
-RawField* MirrorReference::GetFieldReferent() const {
+FieldPtr MirrorReference::GetFieldReferent() const {
   ASSERT(Object::Handle(referent()).IsField());
   return Field::Cast(Object::Handle(referent())).raw();
 }
 
-RawFunction* MirrorReference::GetFunctionReferent() const {
+FunctionPtr MirrorReference::GetFunctionReferent() const {
   ASSERT(Object::Handle(referent()).IsFunction());
   return Function::Cast(Object::Handle(referent())).raw();
 }
 
-RawLibrary* MirrorReference::GetLibraryReferent() const {
+LibraryPtr MirrorReference::GetLibraryReferent() const {
   ASSERT(Object::Handle(referent()).IsLibrary());
   return Library::Cast(Object::Handle(referent())).raw();
 }
 
-RawTypeParameter* MirrorReference::GetTypeParameterReferent() const {
+TypeParameterPtr MirrorReference::GetTypeParameterReferent() const {
   ASSERT(Object::Handle(referent()).IsTypeParameter());
   return TypeParameter::Cast(Object::Handle(referent())).raw();
 }
 
-RawMirrorReference* MirrorReference::New(const Object& referent,
-                                         Heap::Space space) {
+MirrorReferencePtr MirrorReference::New(const Object& referent,
+                                        Heap::Space space) {
   MirrorReference& result = MirrorReference::Handle();
   {
-    RawObject* raw = Object::Allocate(MirrorReference::kClassId,
-                                      MirrorReference::InstanceSize(), space);
+    ObjectPtr raw = Object::Allocate(MirrorReference::kClassId,
+                                     MirrorReference::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -23988,7 +23950,7 @@
   isolate->set_current_tag(*this);
 }
 
-RawUserTag* UserTag::New(const String& label, Heap::Space space) {
+UserTagPtr UserTag::New(const String& label, Heap::Space space) {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   ASSERT(isolate->tag_table() != GrowableObjectArray::null());
@@ -24007,7 +23969,7 @@
   }
   // No tag with label exists, create and register with isolate tag table.
   {
-    RawObject* raw =
+    ObjectPtr raw =
         Object::Allocate(UserTag::kClassId, UserTag::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
@@ -24017,7 +23979,7 @@
   return result.raw();
 }
 
-RawUserTag* UserTag::DefaultTag() {
+UserTagPtr UserTag::DefaultTag() {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -24034,7 +23996,7 @@
   return result.raw();
 }
 
-RawUserTag* UserTag::FindTagInIsolate(Thread* thread, const String& label) {
+UserTagPtr UserTag::FindTagInIsolate(Thread* thread, const String& label) {
   Isolate* isolate = thread->isolate();
   Zone* zone = thread->zone();
   ASSERT(isolate->tag_table() != GrowableObjectArray::null());
@@ -24088,7 +24050,7 @@
   return tag_table.Length() == UserTags::kMaxUserTags;
 }
 
-RawUserTag* UserTag::FindTagById(uword tag_id) {
+UserTagPtr UserTag::FindTagById(uword tag_id) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -24159,7 +24121,7 @@
 }
 
 DART_WARN_UNUSED_RESULT
-RawError* VerifyEntryPoint(
+ErrorPtr VerifyEntryPoint(
     const Library& lib,
     const Object& member,
     const Object& annotated,
@@ -24219,7 +24181,7 @@
 }
 
 DART_WARN_UNUSED_RESULT
-RawError* EntryPointFieldInvocationError(const String& getter_name) {
+ErrorPtr EntryPointFieldInvocationError(const String& getter_name) {
   if (!FLAG_verify_entry_points) return Error::null();
 
   char const* error = OS::SCreate(
@@ -24234,31 +24196,31 @@
   return ApiError::New(String::Handle(String::New(error)));
 }
 
-RawError* Function::VerifyCallEntryPoint() const {
+ErrorPtr Function::VerifyCallEntryPoint() const {
   if (!FLAG_verify_entry_points) return Error::null();
 
   const Class& cls = Class::Handle(Owner());
   const Library& lib = Library::Handle(cls.library());
   switch (kind()) {
-    case RawFunction::kRegularFunction:
-    case RawFunction::kSetterFunction:
-    case RawFunction::kConstructor:
+    case FunctionLayout::kRegularFunction:
+    case FunctionLayout::kSetterFunction:
+    case FunctionLayout::kConstructor:
       return dart::VerifyEntryPoint(lib, *this, *this,
                                     {EntryPointPragma::kCallOnly});
       break;
-    case RawFunction::kGetterFunction:
+    case FunctionLayout::kGetterFunction:
       return dart::VerifyEntryPoint(
           lib, *this, *this,
           {EntryPointPragma::kCallOnly, EntryPointPragma::kGetterOnly});
       break;
-    case RawFunction::kImplicitGetter:
+    case FunctionLayout::kImplicitGetter:
       return dart::VerifyEntryPoint(lib, *this, Field::Handle(accessor_field()),
                                     {EntryPointPragma::kGetterOnly});
       break;
-    case RawFunction::kImplicitSetter:
+    case FunctionLayout::kImplicitSetter:
       return dart::VerifyEntryPoint(lib, *this, Field::Handle(accessor_field()),
                                     {EntryPointPragma::kSetterOnly});
-    case RawFunction::kMethodExtractor:
+    case FunctionLayout::kMethodExtractor:
       return Function::Handle(extracted_method_closure())
           .VerifyClosurizedEntryPoint();
       break;
@@ -24268,14 +24230,14 @@
   }
 }
 
-RawError* Function::VerifyClosurizedEntryPoint() const {
+ErrorPtr Function::VerifyClosurizedEntryPoint() const {
   if (!FLAG_verify_entry_points) return Error::null();
 
   const Class& cls = Class::Handle(Owner());
   const Library& lib = Library::Handle(cls.library());
   switch (kind()) {
-    case RawFunction::kRegularFunction:
-    case RawFunction::kImplicitClosureFunction:
+    case FunctionLayout::kRegularFunction:
+    case FunctionLayout::kImplicitClosureFunction:
       return dart::VerifyEntryPoint(lib, *this, *this,
                                     {EntryPointPragma::kGetterOnly});
     default:
@@ -24283,14 +24245,14 @@
   }
 }
 
-RawError* Field::VerifyEntryPoint(EntryPointPragma pragma) const {
+ErrorPtr Field::VerifyEntryPoint(EntryPointPragma pragma) const {
   if (!FLAG_verify_entry_points) return Error::null();
   const Class& cls = Class::Handle(Owner());
   const Library& lib = Library::Handle(cls.library());
   return dart::VerifyEntryPoint(lib, *this, *this, {pragma});
 }
 
-RawError* Class::VerifyEntryPoint() const {
+ErrorPtr Class::VerifyEntryPoint() const {
   if (!FLAG_verify_entry_points) return Error::null();
   const Library& lib = Library::Handle(library());
   if (!lib.IsNull()) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 3b6f97a..39f112a 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -80,8 +80,9 @@
 
 #define BASE_OBJECT_IMPLEMENTATION(object, super)                              \
  public: /* NOLINT */                                                          \
-  using RawObjectType = Raw##object;                                           \
-  Raw##object* raw() const { return reinterpret_cast<Raw##object*>(raw_); }    \
+  using ObjectLayoutType = dart::object##Layout;                               \
+  using ObjectPtrType = dart::object##Ptr;                                     \
+  object##Ptr raw() const { return static_cast<object##Ptr>(raw_); }           \
   bool Is##object() const { return true; }                                     \
   DART_NOINLINE static object& Handle() {                                      \
     return HandleImpl(Thread::Current()->zone(), object::null());              \
@@ -89,10 +90,10 @@
   DART_NOINLINE static object& Handle(Zone* zone) {                            \
     return HandleImpl(zone, object::null());                                   \
   }                                                                            \
-  DART_NOINLINE static object& Handle(Raw##object* raw_ptr) {                  \
+  DART_NOINLINE static object& Handle(object##Ptr raw_ptr) {                   \
     return HandleImpl(Thread::Current()->zone(), raw_ptr);                     \
   }                                                                            \
-  DART_NOINLINE static object& Handle(Zone* zone, Raw##object* raw_ptr) {      \
+  DART_NOINLINE static object& Handle(Zone* zone, object##Ptr raw_ptr) {       \
     return HandleImpl(zone, raw_ptr);                                          \
   }                                                                            \
   DART_NOINLINE static object& ZoneHandle() {                                  \
@@ -101,10 +102,10 @@
   DART_NOINLINE static object& ZoneHandle(Zone* zone) {                        \
     return ZoneHandleImpl(zone, object::null());                               \
   }                                                                            \
-  DART_NOINLINE static object& ZoneHandle(Raw##object* raw_ptr) {              \
+  DART_NOINLINE static object& ZoneHandle(object##Ptr raw_ptr) {               \
     return ZoneHandleImpl(Thread::Current()->zone(), raw_ptr);                 \
   }                                                                            \
-  DART_NOINLINE static object& ZoneHandle(Zone* zone, Raw##object* raw_ptr) {  \
+  DART_NOINLINE static object& ZoneHandle(Zone* zone, object##Ptr raw_ptr) {   \
     return ZoneHandleImpl(zone, raw_ptr);                                      \
   }                                                                            \
   DART_NOINLINE static object* ReadOnlyHandle() {                              \
@@ -112,7 +113,7 @@
     initializeHandle(obj, object::null());                                     \
     return obj;                                                                \
   }                                                                            \
-  DART_NOINLINE static object& CheckedHandle(Zone* zone, RawObject* raw_ptr) { \
+  DART_NOINLINE static object& CheckedHandle(Zone* zone, ObjectPtr raw_ptr) {  \
     object* obj = reinterpret_cast<object*>(VMHandles::AllocateHandle(zone));  \
     initializeHandle(obj, raw_ptr);                                            \
     if (!obj->Is##object()) {                                                  \
@@ -122,7 +123,7 @@
     return *obj;                                                               \
   }                                                                            \
   DART_NOINLINE static object& CheckedZoneHandle(Zone* zone,                   \
-                                                 RawObject* raw_ptr) {         \
+                                                 ObjectPtr raw_ptr) {          \
     object* obj =                                                              \
         reinterpret_cast<object*>(VMHandles::AllocateZoneHandle(zone));        \
     initializeHandle(obj, raw_ptr);                                            \
@@ -132,7 +133,7 @@
     }                                                                          \
     return *obj;                                                               \
   }                                                                            \
-  DART_NOINLINE static object& CheckedZoneHandle(RawObject* raw_ptr) {         \
+  DART_NOINLINE static object& CheckedZoneHandle(ObjectPtr raw_ptr) {          \
     return CheckedZoneHandle(Thread::Current()->zone(), raw_ptr);              \
   }                                                                            \
   /* T::Cast cannot be applied to a null Object, because the object vtable */  \
@@ -142,30 +143,30 @@
     ASSERT(obj.Is##object());                                                  \
     return reinterpret_cast<const object&>(obj);                               \
   }                                                                            \
-  static Raw##object* RawCast(RawObject* raw) {                                \
+  static object##Ptr RawCast(ObjectPtr raw) {                                  \
     ASSERT(Object::Handle(raw).IsNull() || Object::Handle(raw).Is##object());  \
-    return reinterpret_cast<Raw##object*>(raw);                                \
+    return static_cast<object##Ptr>(raw);                                      \
   }                                                                            \
-  static Raw##object* null() {                                                 \
-    return reinterpret_cast<Raw##object*>(Object::null());                     \
+  static object##Ptr null() {                                                  \
+    return static_cast<object##Ptr>(Object::null());                           \
   }                                                                            \
   virtual const char* ToCString() const;                                       \
   static const ClassId kClassId = k##object##Cid;                              \
                                                                                \
  private: /* NOLINT */                                                         \
-  static object& HandleImpl(Zone* zone, Raw##object* raw_ptr) {                \
+  static object& HandleImpl(Zone* zone, object##Ptr raw_ptr) {                 \
     object* obj = reinterpret_cast<object*>(VMHandles::AllocateHandle(zone));  \
     initializeHandle(obj, raw_ptr);                                            \
     return *obj;                                                               \
   }                                                                            \
-  static object& ZoneHandleImpl(Zone* zone, Raw##object* raw_ptr) {            \
+  static object& ZoneHandleImpl(Zone* zone, object##Ptr raw_ptr) {             \
     object* obj =                                                              \
         reinterpret_cast<object*>(VMHandles::AllocateZoneHandle(zone));        \
     initializeHandle(obj, raw_ptr);                                            \
     return *obj;                                                               \
   }                                                                            \
   /* Initialize the handle based on the raw_ptr in the presence of null. */    \
-  static void initializeHandle(object* obj, RawObject* raw_ptr) {              \
+  static void initializeHandle(object* obj, ObjectPtr raw_ptr) {               \
     if (raw_ptr != Object::null()) {                                           \
       obj->SetRaw(raw_ptr);                                                    \
     } else {                                                                   \
@@ -181,7 +182,7 @@
  private: /* NOLINT */                                                         \
   void* operator new(size_t size);                                             \
   object(const object& value) = delete;                                        \
-  void operator=(Raw##super* value) = delete;                                  \
+  void operator=(super##Ptr value) = delete;                                   \
   void operator=(const object& value) = delete;                                \
   void operator=(const super& value) = delete;
 
@@ -205,15 +206,15 @@
 #endif                                            // !PRODUCT
 
 #define SNAPSHOT_READER_SUPPORT(object)                                        \
-  static Raw##object* ReadFrom(SnapshotReader* reader, intptr_t object_id,     \
-                               intptr_t tags, Snapshot::Kind,                  \
-                               bool as_reference);                             \
+  static object##Ptr ReadFrom(SnapshotReader* reader, intptr_t object_id,      \
+                              intptr_t tags, Snapshot::Kind,                   \
+                              bool as_reference);                              \
   friend class SnapshotReader;
 
 #define OBJECT_IMPLEMENTATION(object, super)                                   \
  public: /* NOLINT */                                                          \
-  void operator=(Raw##object* value) { initializeHandle(this, value); }        \
-  void operator^=(RawObject* value) {                                          \
+  void operator=(object##Ptr value) { initializeHandle(this, value); }         \
+  void operator^=(ObjectPtr value) {                                           \
     initializeHandle(this, value);                                             \
     ASSERT(IsNull() || Is##object());                                          \
   }                                                                            \
@@ -226,7 +227,7 @@
 
 #define HEAP_OBJECT_IMPLEMENTATION(object, super)                              \
   OBJECT_IMPLEMENTATION(object, super);                                        \
-  const Raw##object* raw_ptr() const {                                         \
+  const object##Layout* raw_ptr() const {                                      \
     ASSERT(raw() != null());                                                   \
     return raw()->ptr();                                                       \
   }                                                                            \
@@ -237,11 +238,11 @@
 // This macro is used to denote types that do not have a sub-type.
 #define FINAL_HEAP_OBJECT_IMPLEMENTATION_HELPER(object, rettype, super)        \
  public: /* NOLINT */                                                          \
-  void operator=(Raw##object* value) {                                         \
+  void operator=(object##Ptr value) {                                          \
     raw_ = value;                                                              \
     CHECK_HANDLE();                                                            \
   }                                                                            \
-  void operator^=(RawObject* value) {                                          \
+  void operator^=(ObjectPtr value) {                                           \
     raw_ = value;                                                              \
     CHECK_HANDLE();                                                            \
   }                                                                            \
@@ -250,7 +251,7 @@
   object() : super() {}                                                        \
   BASE_OBJECT_IMPLEMENTATION(object, super)                                    \
   OBJECT_SERVICE_SUPPORT(object)                                               \
-  const Raw##object* raw_ptr() const {                                         \
+  const object##Layout* raw_ptr() const {                                      \
     ASSERT(raw() != null());                                                   \
     return raw()->ptr();                                                       \
   }                                                                            \
@@ -277,27 +278,29 @@
 
 class Object {
  public:
-  using RawObjectType = RawObject;
-  static RawObject* RawCast(RawObject* obj) { return obj; }
+  using ObjectLayoutType = ObjectLayout;
+  using ObjectPtrType = ObjectPtr;
+
+  static ObjectPtr RawCast(ObjectPtr obj) { return obj; }
 
   virtual ~Object() {}
 
-  RawObject* raw() const { return raw_; }
-  void operator=(RawObject* value) { initializeHandle(this, value); }
+  ObjectPtr raw() const { return raw_; }
+  void operator=(ObjectPtr value) { initializeHandle(this, value); }
 
   uint32_t CompareAndSwapTags(uint32_t old_tags, uint32_t new_tags) const {
     raw()->ptr()->tags_.StrongCAS(old_tags, new_tags);
     return old_tags;
   }
-  bool IsCanonical() const { return raw()->IsCanonical(); }
-  void SetCanonical() const { raw()->SetCanonical(); }
-  void ClearCanonical() const { raw()->ClearCanonical(); }
+  bool IsCanonical() const { return raw()->ptr()->IsCanonical(); }
+  void SetCanonical() const { raw()->ptr()->SetCanonical(); }
+  void ClearCanonical() const { raw()->ptr()->ClearCanonical(); }
   intptr_t GetClassId() const {
     return !raw()->IsHeapObject() ? static_cast<intptr_t>(kSmiCid)
-                                  : raw()->GetClassId();
+                                  : raw()->ptr()->GetClassId();
   }
-  inline RawClass* clazz() const;
-  static intptr_t tags_offset() { return OFFSET_OF(RawObject, tags_); }
+  inline ClassPtr clazz() const;
+  static intptr_t tags_offset() { return OFFSET_OF(ObjectLayout, tags_); }
 
 // Class testers.
 #define DEFINE_CLASS_TESTER(clazz)                                             \
@@ -327,14 +330,14 @@
   // Object::DictionaryName() returns String::null(). Only subclasses
   // of Object that need to be entered in the library and library prefix
   // namespaces need to provide an implementation.
-  virtual RawString* DictionaryName() const;
+  virtual StringPtr DictionaryName() const;
 
   bool IsNew() const { return raw()->IsNewObject(); }
   bool IsOld() const { return raw()->IsOldObject(); }
 #if defined(DEBUG)
   bool InVMIsolateHeap() const;
 #else
-  bool InVMIsolateHeap() const { return raw()->InVMIsolateHeap(); }
+  bool InVMIsolateHeap() const { return raw()->ptr()->InVMIsolateHeap(); }
 #endif  // DEBUG
 
   // Print the object on stdout for debugging.
@@ -348,7 +351,7 @@
 
   bool IsNotTemporaryScopedHandle() const;
 
-  static Object& Handle(Zone* zone, RawObject* raw_ptr) {
+  static Object& Handle(Zone* zone, ObjectPtr raw_ptr) {
     Object* obj = reinterpret_cast<Object*>(VMHandles::AllocateHandle(zone));
     initializeHandle(obj, raw_ptr);
     return *obj;
@@ -363,11 +366,11 @@
 
   static Object& Handle(Zone* zone) { return Handle(zone, null_); }
 
-  static Object& Handle(RawObject* raw_ptr) {
+  static Object& Handle(ObjectPtr raw_ptr) {
     return Handle(Thread::Current()->zone(), raw_ptr);
   }
 
-  static Object& ZoneHandle(Zone* zone, RawObject* raw_ptr) {
+  static Object& ZoneHandle(Zone* zone, ObjectPtr raw_ptr) {
     Object* obj =
         reinterpret_cast<Object*>(VMHandles::AllocateZoneHandle(zone));
     initializeHandle(obj, raw_ptr);
@@ -380,18 +383,18 @@
     return ZoneHandle(Thread::Current()->zone(), null_);
   }
 
-  static Object& ZoneHandle(RawObject* raw_ptr) {
+  static Object& ZoneHandle(ObjectPtr raw_ptr) {
     return ZoneHandle(Thread::Current()->zone(), raw_ptr);
   }
 
-  static RawObject* null() { return null_; }
+  static ObjectPtr null() { return null_; }
 
 #if defined(HASH_IN_OBJECT_HEADER)
-  static uint32_t GetCachedHash(const RawObject* obj) {
+  static uint32_t GetCachedHash(const ObjectPtr obj) {
     return obj->ptr()->hash_;
   }
 
-  static void SetCachedHash(RawObject* obj, uint32_t hash) {
+  static void SetCachedHash(ObjectPtr obj, uint32_t hash) {
     obj->ptr()->hash_ = hash;
   }
 #endif
@@ -448,7 +451,6 @@
   V(Array, vm_isolate_snapshot_object_table)                                   \
   V(Type, dynamic_type)                                                        \
   V(Type, void_type)                                                           \
-  V(Type, never_type)                                                          \
   V(AbstractType, null_abstract_type)
 
 #define DEFINE_SHARED_READONLY_HANDLE_GETTER(Type, name)                       \
@@ -461,65 +463,60 @@
 
   static void set_vm_isolate_snapshot_object_table(const Array& table);
 
-  static RawClass* class_class() { return class_class_; }
-  static RawClass* dynamic_class() { return dynamic_class_; }
-  static RawClass* void_class() { return void_class_; }
-  static RawClass* never_class() { return never_class_; }
-  static RawClass* type_arguments_class() { return type_arguments_class_; }
-  static RawClass* patch_class_class() { return patch_class_class_; }
-  static RawClass* function_class() { return function_class_; }
-  static RawClass* closure_data_class() { return closure_data_class_; }
-  static RawClass* signature_data_class() { return signature_data_class_; }
-  static RawClass* redirection_data_class() { return redirection_data_class_; }
-  static RawClass* ffi_trampoline_data_class() {
+  static ClassPtr class_class() { return class_class_; }
+  static ClassPtr dynamic_class() { return dynamic_class_; }
+  static ClassPtr void_class() { return void_class_; }
+  static ClassPtr type_arguments_class() { return type_arguments_class_; }
+  static ClassPtr patch_class_class() { return patch_class_class_; }
+  static ClassPtr function_class() { return function_class_; }
+  static ClassPtr closure_data_class() { return closure_data_class_; }
+  static ClassPtr signature_data_class() { return signature_data_class_; }
+  static ClassPtr redirection_data_class() { return redirection_data_class_; }
+  static ClassPtr ffi_trampoline_data_class() {
     return ffi_trampoline_data_class_;
   }
-  static RawClass* field_class() { return field_class_; }
-  static RawClass* script_class() { return script_class_; }
-  static RawClass* library_class() { return library_class_; }
-  static RawClass* namespace_class() { return namespace_class_; }
-  static RawClass* kernel_program_info_class() {
+  static ClassPtr field_class() { return field_class_; }
+  static ClassPtr script_class() { return script_class_; }
+  static ClassPtr library_class() { return library_class_; }
+  static ClassPtr namespace_class() { return namespace_class_; }
+  static ClassPtr kernel_program_info_class() {
     return kernel_program_info_class_;
   }
-  static RawClass* code_class() { return code_class_; }
-  static RawClass* bytecode_class() { return bytecode_class_; }
-  static RawClass* instructions_class() { return instructions_class_; }
-  static RawClass* instructions_section_class() {
+  static ClassPtr code_class() { return code_class_; }
+  static ClassPtr bytecode_class() { return bytecode_class_; }
+  static ClassPtr instructions_class() { return instructions_class_; }
+  static ClassPtr instructions_section_class() {
     return instructions_section_class_;
   }
-  static RawClass* object_pool_class() { return object_pool_class_; }
-  static RawClass* pc_descriptors_class() { return pc_descriptors_class_; }
-  static RawClass* code_source_map_class() { return code_source_map_class_; }
-  static RawClass* compressed_stackmaps_class() {
+  static ClassPtr object_pool_class() { return object_pool_class_; }
+  static ClassPtr pc_descriptors_class() { return pc_descriptors_class_; }
+  static ClassPtr code_source_map_class() { return code_source_map_class_; }
+  static ClassPtr compressed_stackmaps_class() {
     return compressed_stackmaps_class_;
   }
-  static RawClass* var_descriptors_class() { return var_descriptors_class_; }
-  static RawClass* exception_handlers_class() {
+  static ClassPtr var_descriptors_class() { return var_descriptors_class_; }
+  static ClassPtr exception_handlers_class() {
     return exception_handlers_class_;
   }
-  static RawClass* deopt_info_class() { return deopt_info_class_; }
-  static RawClass* context_class() { return context_class_; }
-  static RawClass* context_scope_class() { return context_scope_class_; }
-  static RawClass* api_error_class() { return api_error_class_; }
-  static RawClass* language_error_class() { return language_error_class_; }
-  static RawClass* unhandled_exception_class() {
+  static ClassPtr deopt_info_class() { return deopt_info_class_; }
+  static ClassPtr context_class() { return context_class_; }
+  static ClassPtr context_scope_class() { return context_scope_class_; }
+  static ClassPtr api_error_class() { return api_error_class_; }
+  static ClassPtr language_error_class() { return language_error_class_; }
+  static ClassPtr unhandled_exception_class() {
     return unhandled_exception_class_;
   }
-  static RawClass* unwind_error_class() { return unwind_error_class_; }
-  static RawClass* dyncalltypecheck_class() { return dyncalltypecheck_class_; }
-  static RawClass* singletargetcache_class() {
-    return singletargetcache_class_;
-  }
-  static RawClass* unlinkedcall_class() { return unlinkedcall_class_; }
-  static RawClass* monomorphicsmiablecall_class() {
+  static ClassPtr unwind_error_class() { return unwind_error_class_; }
+  static ClassPtr dyncalltypecheck_class() { return dyncalltypecheck_class_; }
+  static ClassPtr singletargetcache_class() { return singletargetcache_class_; }
+  static ClassPtr unlinkedcall_class() { return unlinkedcall_class_; }
+  static ClassPtr monomorphicsmiablecall_class() {
     return monomorphicsmiablecall_class_;
   }
-  static RawClass* icdata_class() { return icdata_class_; }
-  static RawClass* megamorphic_cache_class() {
-    return megamorphic_cache_class_;
-  }
-  static RawClass* subtypetestcache_class() { return subtypetestcache_class_; }
-  static RawClass* weak_serialization_reference_class() {
+  static ClassPtr icdata_class() { return icdata_class_; }
+  static ClassPtr megamorphic_cache_class() { return megamorphic_cache_class_; }
+  static ClassPtr subtypetestcache_class() { return subtypetestcache_class_; }
+  static ClassPtr weak_serialization_reference_class() {
     return weak_serialization_reference_class_;
   }
 
@@ -529,22 +526,22 @@
   static void InitVtables();
   static void FinishInit(Isolate* isolate);
   static void FinalizeVMIsolate(Isolate* isolate);
-  static void FinalizeReadOnlyObject(RawObject* object);
+  static void FinalizeReadOnlyObject(ObjectPtr object);
 
   static void Cleanup();
 
   // Initialize a new isolate either from a Kernel IR, from source, or from a
   // snapshot.
-  static RawError* Init(Isolate* isolate,
-                        const uint8_t* kernel_buffer,
-                        intptr_t kernel_buffer_size);
+  static ErrorPtr Init(Isolate* isolate,
+                       const uint8_t* kernel_buffer,
+                       intptr_t kernel_buffer_size);
 
   static void MakeUnusedSpaceTraversable(const Object& obj,
                                          intptr_t original_size,
                                          intptr_t used_size);
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawObject));
+    return RoundedAllocationSize(sizeof(ObjectLayout));
   }
 
   template <class FakeObject>
@@ -603,21 +600,21 @@
   // Used for extracting the C++ vtable during bringup.
   Object() : raw_(null_) {}
 
-  uword raw_value() const { return reinterpret_cast<uword>(raw()); }
+  uword raw_value() const { return static_cast<uword>(raw()); }
 
-  inline void SetRaw(RawObject* value);
+  inline void SetRaw(ObjectPtr value);
   void CheckHandle() const;
 
   cpp_vtable vtable() const { return bit_copy<cpp_vtable>(*this); }
   void set_vtable(cpp_vtable value) { *vtable_address() = value; }
 
-  static RawObject* Allocate(intptr_t cls_id, intptr_t size, Heap::Space space);
+  static ObjectPtr Allocate(intptr_t cls_id, intptr_t size, Heap::Space space);
 
   static intptr_t RoundedAllocationSize(intptr_t size) {
     return Utils::RoundUp(size, kObjectAlignment);
   }
 
-  bool Contains(uword addr) const { return raw()->Contains(addr); }
+  bool Contains(uword addr) const { return raw()->ptr()->Contains(addr); }
 
   // Start of field mutator guards.
   //
@@ -627,21 +624,21 @@
 
   template <typename type, std::memory_order order = std::memory_order_relaxed>
   type LoadPointer(type const* addr) const {
-    return raw()->LoadPointer<type, order>(addr);
+    return raw()->ptr()->LoadPointer<type, order>(addr);
   }
 
   template <typename type, std::memory_order order = std::memory_order_relaxed>
   void StorePointer(type const* addr, type value) const {
-    raw()->StorePointer<type, order>(addr, value);
+    raw()->ptr()->StorePointer<type, order>(addr, value);
   }
 
   // Use for storing into an explicitly Smi-typed field of an object
   // (i.e., both the previous and new value are Smis).
-  void StoreSmi(RawSmi* const* addr, RawSmi* value) const {
-    raw()->StoreSmi(addr, value);
+  void StoreSmi(SmiPtr const* addr, SmiPtr value) const {
+    raw()->ptr()->StoreSmi(addr, value);
   }
-  void StoreSmiIgnoreRace(RawSmi* const* addr, RawSmi* value) const {
-    raw()->StoreSmiIgnoreRace(addr, value);
+  void StoreSmiIgnoreRace(SmiPtr const* addr, SmiPtr value) const {
+    raw()->ptr()->StoreSmiIgnoreRace(addr, value);
   }
 
   template <typename FieldType>
@@ -654,14 +651,14 @@
   template <typename FieldType, typename ValueType>
   void StoreNonPointer(const FieldType* addr, ValueType value) const {
     // Can't use Contains, as it uses tags_, which is set through this method.
-    ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(raw()));
+    ASSERT(reinterpret_cast<uword>(addr) >= ObjectLayout::ToAddr(raw()));
     *const_cast<FieldType*>(addr) = value;
   }
 
   template <typename FieldType, typename ValueType, std::memory_order order>
   void StoreNonPointer(const FieldType* addr, ValueType value) const {
     // Can't use Contains, as it uses tags_, which is set through this method.
-    ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(raw()));
+    ASSERT(reinterpret_cast<uword>(addr) >= ObjectLayout::ToAddr(raw()));
     reinterpret_cast<std::atomic<FieldType>*>(const_cast<FieldType*>(addr))
         ->store(value, order);
   }
@@ -692,10 +689,10 @@
 // instantiated with an object pointer type.
 #define STORE_NON_POINTER_ILLEGAL_TYPE(type)                                   \
   template <typename ValueType>                                                \
-  void StoreNonPointer(Raw##type* const* addr, ValueType value) const {        \
+  void StoreNonPointer(type##Ptr const* addr, ValueType value) const {         \
     UnimplementedMethod();                                                     \
   }                                                                            \
-  Raw##type** UnsafeMutableNonPointer(Raw##type* const* addr) const {          \
+  type##Ptr* UnsafeMutableNonPointer(type##Ptr const* addr) const {            \
     UnimplementedMethod();                                                     \
     return NULL;                                                               \
   }
@@ -705,11 +702,11 @@
 #undef STORE_NON_POINTER_ILLEGAL_TYPE
 
   // Allocate an object and copy the body of 'orig'.
-  static RawObject* Clone(const Object& orig, Heap::Space space);
+  static ObjectPtr Clone(const Object& orig, Heap::Space space);
 
   // End of field mutator guards.
 
-  RawObject* raw_;  // The raw object reference.
+  ObjectPtr raw_;  // The raw object reference.
 
  protected:
   void AddCommonObjectProperties(JSONObject* jsobj,
@@ -732,7 +729,7 @@
                                    const Library& lib);
 
   /* Initialize the handle based on the raw_ptr in the presence of null. */
-  static void initializeHandle(Object* obj, RawObject* raw_ptr) {
+  static void initializeHandle(Object* obj, ObjectPtr raw_ptr) {
     if (raw_ptr != Object::null()) {
       obj->SetRaw(raw_ptr);
     } else {
@@ -751,64 +748,61 @@
 
   // The static values below are singletons shared between the different
   // isolates. They are all allocated in the non-GC'd Dart::vm_isolate_.
-  static RawObject* null_;
-  static RawBool* true_;
-  static RawBool* false_;
+  static ObjectPtr null_;
+  static BoolPtr true_;
+  static BoolPtr false_;
 
-  static RawClass* class_class_;           // Class of the Class vm object.
-  static RawClass* dynamic_class_;         // Class of the 'dynamic' type.
-  static RawClass* void_class_;            // Class of the 'void' type.
-  static RawClass* never_class_;           // Class of the 'Never' type.
-  static RawClass* type_arguments_class_;  // Class of TypeArguments vm object.
-  static RawClass* patch_class_class_;     // Class of the PatchClass vm object.
-  static RawClass* function_class_;        // Class of the Function vm object.
-  static RawClass* closure_data_class_;    // Class of ClosureData vm obj.
-  static RawClass* signature_data_class_;  // Class of SignatureData vm obj.
-  static RawClass* redirection_data_class_;  // Class of RedirectionData vm obj.
-  static RawClass* ffi_trampoline_data_class_;  // Class of FfiTrampolineData
-                                                // vm obj.
-  static RawClass* field_class_;                // Class of the Field vm object.
-  static RawClass* script_class_;     // Class of the Script vm object.
-  static RawClass* library_class_;    // Class of the Library vm object.
-  static RawClass* namespace_class_;  // Class of Namespace vm object.
-  static RawClass* kernel_program_info_class_;  // Class of KernelProgramInfo vm
-                                                // object.
-  static RawClass* code_class_;                 // Class of the Code vm object.
-  static RawClass* bytecode_class_;      // Class of the Bytecode vm object.
-  static RawClass* instructions_class_;  // Class of the Instructions vm object.
-  static RawClass*
-      instructions_section_class_;       // Class of InstructionsSection.
-  static RawClass* object_pool_class_;   // Class of the ObjectPool vm object.
-  static RawClass* pc_descriptors_class_;   // Class of PcDescriptors vm object.
-  static RawClass* code_source_map_class_;  // Class of CodeSourceMap vm object.
-  static RawClass*
-      compressed_stackmaps_class_;             // Class of CompressedStackMaps.
-  static RawClass* var_descriptors_class_;     // Class of LocalVarDescriptors.
-  static RawClass* exception_handlers_class_;  // Class of ExceptionHandlers.
-  static RawClass* deopt_info_class_;          // Class of DeoptInfo.
-  static RawClass* context_class_;           // Class of the Context vm object.
-  static RawClass* context_scope_class_;     // Class of ContextScope vm object.
-  static RawClass* dyncalltypecheck_class_;  // Class of ParameterTypeCheck.
-  static RawClass* singletargetcache_class_;  // Class of SingleTargetCache.
-  static RawClass* unlinkedcall_class_;       // Class of UnlinkedCall.
-  static RawClass*
-      monomorphicsmiablecall_class_;  // Class of MonomorphicSmiableCall.
-  static RawClass* icdata_class_;     // Class of ICData.
-  static RawClass* megamorphic_cache_class_;    // Class of MegamorphiCache.
-  static RawClass* subtypetestcache_class_;     // Class of SubtypeTestCache.
-  static RawClass* api_error_class_;            // Class of ApiError.
-  static RawClass* language_error_class_;       // Class of LanguageError.
-  static RawClass* unhandled_exception_class_;  // Class of UnhandledException.
-  static RawClass* unwind_error_class_;         // Class of UnwindError.
+  static ClassPtr class_class_;           // Class of the Class vm object.
+  static ClassPtr dynamic_class_;         // Class of the 'dynamic' type.
+  static ClassPtr void_class_;            // Class of the 'void' type.
+  static ClassPtr type_arguments_class_;  // Class of TypeArguments vm object.
+  static ClassPtr patch_class_class_;     // Class of the PatchClass vm object.
+  static ClassPtr function_class_;        // Class of the Function vm object.
+  static ClassPtr closure_data_class_;    // Class of ClosureData vm obj.
+  static ClassPtr signature_data_class_;  // Class of SignatureData vm obj.
+  static ClassPtr redirection_data_class_;  // Class of RedirectionData vm obj.
+  static ClassPtr ffi_trampoline_data_class_;  // Class of FfiTrampolineData
+                                               // vm obj.
+  static ClassPtr field_class_;                // Class of the Field vm object.
+  static ClassPtr script_class_;               // Class of the Script vm object.
+  static ClassPtr library_class_;    // Class of the Library vm object.
+  static ClassPtr namespace_class_;  // Class of Namespace vm object.
+  static ClassPtr kernel_program_info_class_;  // Class of KernelProgramInfo vm
+                                               // object.
+  static ClassPtr code_class_;                 // Class of the Code vm object.
+  static ClassPtr bytecode_class_;      // Class of the Bytecode vm object.
+  static ClassPtr instructions_class_;  // Class of the Instructions vm object.
+  static ClassPtr instructions_section_class_;  // Class of InstructionsSection.
+  static ClassPtr object_pool_class_;      // Class of the ObjectPool vm object.
+  static ClassPtr pc_descriptors_class_;   // Class of PcDescriptors vm object.
+  static ClassPtr code_source_map_class_;  // Class of CodeSourceMap vm object.
+  static ClassPtr compressed_stackmaps_class_;  // Class of CompressedStackMaps.
+  static ClassPtr var_descriptors_class_;       // Class of LocalVarDescriptors.
+  static ClassPtr exception_handlers_class_;    // Class of ExceptionHandlers.
+  static ClassPtr deopt_info_class_;            // Class of DeoptInfo.
+  static ClassPtr context_class_;            // Class of the Context vm object.
+  static ClassPtr context_scope_class_;      // Class of ContextScope vm object.
+  static ClassPtr dyncalltypecheck_class_;   // Class of ParameterTypeCheck.
+  static ClassPtr singletargetcache_class_;  // Class of SingleTargetCache.
+  static ClassPtr unlinkedcall_class_;       // Class of UnlinkedCall.
+  static ClassPtr
+      monomorphicsmiablecall_class_;         // Class of MonomorphicSmiableCall.
+  static ClassPtr icdata_class_;             // Class of ICData.
+  static ClassPtr megamorphic_cache_class_;  // Class of MegamorphiCache.
+  static ClassPtr subtypetestcache_class_;   // Class of SubtypeTestCache.
+  static ClassPtr api_error_class_;          // Class of ApiError.
+  static ClassPtr language_error_class_;     // Class of LanguageError.
+  static ClassPtr unhandled_exception_class_;  // Class of UnhandledException.
+  static ClassPtr unwind_error_class_;         // Class of UnwindError.
   // Class of WeakSerializationReference.
-  static RawClass* weak_serialization_reference_class_;
+  static ClassPtr weak_serialization_reference_class_;
 
 #define DECLARE_SHARED_READONLY_HANDLE(Type, name) static Type* name##_;
   SHARED_READONLY_HANDLES_LIST(DECLARE_SHARED_READONLY_HANDLE)
 #undef DECLARE_SHARED_READONLY_HANDLE
 
   friend void ClassTable::Register(const Class& cls);
-  friend void RawObject::Validate(IsolateGroup* isolate_group) const;
+  friend void ObjectLayout::Validate(IsolateGroup* isolate_group) const;
   friend class Closure;
   friend class SnapshotReader;
   friend class InstanceDeserializationCluster;
@@ -829,17 +823,17 @@
 
 class PassiveObject : public Object {
  public:
-  void operator=(RawObject* value) { raw_ = value; }
-  void operator^=(RawObject* value) { raw_ = value; }
+  void operator=(ObjectPtr value) { raw_ = value; }
+  void operator^=(ObjectPtr value) { raw_ = value; }
 
-  static PassiveObject& Handle(Zone* zone, RawObject* raw_ptr) {
+  static PassiveObject& Handle(Zone* zone, ObjectPtr raw_ptr) {
     PassiveObject* obj =
         reinterpret_cast<PassiveObject*>(VMHandles::AllocateHandle(zone));
     obj->raw_ = raw_ptr;
     obj->set_vtable(0);
     return *obj;
   }
-  static PassiveObject& Handle(RawObject* raw_ptr) {
+  static PassiveObject& Handle(ObjectPtr raw_ptr) {
     return Handle(Thread::Current()->zone(), raw_ptr);
   }
   static PassiveObject& Handle() {
@@ -848,14 +842,14 @@
   static PassiveObject& Handle(Zone* zone) {
     return Handle(zone, Object::null());
   }
-  static PassiveObject& ZoneHandle(Zone* zone, RawObject* raw_ptr) {
+  static PassiveObject& ZoneHandle(Zone* zone, ObjectPtr raw_ptr) {
     PassiveObject* obj =
         reinterpret_cast<PassiveObject*>(VMHandles::AllocateZoneHandle(zone));
     obj->raw_ = raw_ptr;
     obj->set_vtable(0);
     return *obj;
   }
-  static PassiveObject& ZoneHandle(RawObject* raw_ptr) {
+  static PassiveObject& ZoneHandle(ObjectPtr raw_ptr) {
     return ZoneHandle(Thread::Current()->zone(), raw_ptr);
   }
   static PassiveObject& ZoneHandle() {
@@ -933,10 +927,10 @@
     return host_instance_size();
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   }
-  static intptr_t host_instance_size(RawClass* clazz) {
+  static intptr_t host_instance_size(ClassPtr clazz) {
     return (clazz->ptr()->host_instance_size_in_words_ * kWordSize);
   }
-  static intptr_t target_instance_size(RawClass* clazz) {
+  static intptr_t target_instance_size(ClassPtr clazz) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
     return (clazz->ptr()->target_instance_size_in_words_ *
             compiler::target::kWordSize);
@@ -1005,36 +999,36 @@
   }
 
   static bool is_valid_id(intptr_t value) {
-    return RawObject::ClassIdTag::is_valid(value);
+    return ObjectLayout::ClassIdTag::is_valid(value);
   }
   intptr_t id() const { return raw_ptr()->id_; }
   void set_id(intptr_t value) const {
     ASSERT(is_valid_id(value));
     StoreNonPointer(&raw_ptr()->id_, value);
   }
-  static intptr_t id_offset() { return OFFSET_OF(RawClass, id_); }
+  static intptr_t id_offset() { return OFFSET_OF(ClassLayout, id_); }
   static intptr_t num_type_arguments_offset() {
-    return OFFSET_OF(RawClass, num_type_arguments_);
+    return OFFSET_OF(ClassLayout, num_type_arguments_);
   }
 
-  RawString* Name() const;
-  RawString* ScrubbedName() const;
+  StringPtr Name() const;
+  StringPtr ScrubbedName() const;
   const char* ScrubbedNameCString() const;
-  RawString* UserVisibleName() const;
+  StringPtr UserVisibleName() const;
   const char* UserVisibleNameCString() const;
 
   // The mixin for this class if one exists. Otherwise, returns a raw pointer
   // to this class.
-  RawClass* Mixin() const;
+  ClassPtr Mixin() const;
 
   // The NNBD mode of the library declaring this class.
   NNBDMode nnbd_mode() const;
 
   bool IsInFullSnapshot() const;
 
-  virtual RawString* DictionaryName() const { return Name(); }
+  virtual StringPtr DictionaryName() const { return Name(); }
 
-  RawScript* script() const { return raw_ptr()->script_; }
+  ScriptPtr script() const { return raw_ptr()->script_; }
   void set_script(const Script& value) const;
 
   TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
@@ -1045,7 +1039,7 @@
   int32_t SourceFingerprint() const;
 
   // This class represents a typedef if the signature function is not null.
-  RawFunction* signature_function() const {
+  FunctionPtr signature_function() const {
     return raw_ptr()->signature_function_;
   }
   void set_signature_function(const Function& value) const;
@@ -1053,7 +1047,7 @@
   // Return the Type with type parameters declared by this class filled in with
   // dynamic and type parameters declared in superclasses filled in as declared
   // in superclass clauses.
-  RawAbstractType* RareType() const;
+  AbstractTypePtr RareType() const;
 
   // Return the Type whose arguments are the type parameters declared by this
   // class preceded by the type arguments declared for superclasses, etc.
@@ -1063,18 +1057,18 @@
   // C.DeclarationType() --> C [R, int, R]
   // The declaration type's nullability is either legacy or non-nullable when
   // the non-nullable experiment is enabled.
-  RawType* DeclarationType() const;
+  TypePtr DeclarationType() const;
 
   static intptr_t declaration_type_offset() {
-    return OFFSET_OF(RawClass, declaration_type_);
+    return OFFSET_OF(ClassLayout, declaration_type_);
   }
 
-  RawLibrary* library() const { return raw_ptr()->library_; }
+  LibraryPtr library() const { return raw_ptr()->library_; }
   void set_library(const Library& value) const;
 
   // The type parameters (and their bounds) are specified as an array of
   // TypeParameter.
-  RawTypeArguments* type_parameters() const {
+  TypeArgumentsPtr type_parameters() const {
     ASSERT(is_declaration_loaded());
     return raw_ptr()->type_parameters_;
   }
@@ -1084,12 +1078,12 @@
     return NumTypeParameters(Thread::Current());
   }
   static intptr_t type_parameters_offset() {
-    return OFFSET_OF(RawClass, type_parameters_);
+    return OFFSET_OF(ClassLayout, type_parameters_);
   }
 
   // Return a TypeParameter if the type_name is a type parameter of this class.
   // Return null otherwise.
-  RawTypeParameter* LookupTypeParameter(const String& type_name) const;
+  TypeParameterPtr LookupTypeParameter(const String& type_name) const;
 
   // The type argument vector is flattened and includes the type arguments of
   // the super class.
@@ -1149,49 +1143,49 @@
 #endif  //  !defined(DART_PRECOMPILED_RUNTIME)
   }
   static intptr_t host_type_arguments_field_offset_in_words_offset() {
-    return OFFSET_OF(RawClass, host_type_arguments_field_offset_in_words_);
+    return OFFSET_OF(ClassLayout, host_type_arguments_field_offset_in_words_);
   }
 
   static intptr_t target_type_arguments_field_offset_in_words_offset() {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-    return OFFSET_OF(RawClass, target_type_arguments_field_offset_in_words_);
+    return OFFSET_OF(ClassLayout, target_type_arguments_field_offset_in_words_);
 #else
     return host_type_arguments_field_offset_in_words_offset();
 #endif  //  !defined(DART_PRECOMPILED_RUNTIME)
   }
 
   // The super type of this class, Object type if not explicitly specified.
-  RawAbstractType* super_type() const {
+  AbstractTypePtr super_type() const {
     ASSERT(is_declaration_loaded());
     return raw_ptr()->super_type_;
   }
   void set_super_type(const AbstractType& value) const;
   static intptr_t super_type_offset() {
-    return OFFSET_OF(RawClass, super_type_);
+    return OFFSET_OF(ClassLayout, super_type_);
   }
 
   // Asserts that the class of the super type has been resolved.
   // |original_classes| only has an effect when reloading. If true and we
   // are reloading, it will prefer the original classes to the replacement
   // classes.
-  RawClass* SuperClass(bool original_classes = false) const;
+  ClassPtr SuperClass(bool original_classes = false) const;
 
   // Interfaces is an array of Types.
-  RawArray* interfaces() const {
+  ArrayPtr interfaces() const {
     ASSERT(is_declaration_loaded());
     return raw_ptr()->interfaces_;
   }
   void set_interfaces(const Array& value) const;
 
   // Returns the list of classes directly implementing this class.
-  RawGrowableObjectArray* direct_implementors() const {
+  GrowableObjectArrayPtr direct_implementors() const {
     return raw_ptr()->direct_implementors_;
   }
   void AddDirectImplementor(const Class& subclass, bool is_mixin) const;
   void ClearDirectImplementors() const;
 
   // Returns the list of classes having this class as direct superclass.
-  RawGrowableObjectArray* direct_subclasses() const {
+  GrowableObjectArrayPtr direct_subclasses() const {
     return raw_ptr()->direct_subclasses_;
   }
   void AddDirectSubclass(const Class& subclass) const;
@@ -1223,7 +1217,7 @@
 
   // Check if this class represents the 'Closure' class.
   bool IsClosureClass() const { return id() == kClosureCid; }
-  static bool IsClosureClass(RawClass* cls) {
+  static bool IsClosureClass(ClassPtr cls) {
     NoSafepointScope no_safepoint;
     return cls->ptr()->id_ == kClosureCid;
   }
@@ -1231,9 +1225,9 @@
   // Check if this class represents a typedef class.
   bool IsTypedefClass() const { return signature_function() != Object::null(); }
 
-  static bool IsInFullSnapshot(RawClass* cls) {
+  static bool IsInFullSnapshot(ClassPtr cls) {
     NoSafepointScope no_safepoint;
-    return RawLibrary::InFullSnapshotBit::decode(
+    return LibraryLayout::InFullSnapshotBit::decode(
         cls->ptr()->library_->ptr()->flags_);
   }
 
@@ -1251,10 +1245,10 @@
   bool IsPrivate() const;
 
   DART_WARN_UNUSED_RESULT
-  RawError* VerifyEntryPoint() const;
+  ErrorPtr VerifyEntryPoint() const;
 
   // Returns an array of instance and static fields defined by this class.
-  RawArray* fields() const { return raw_ptr()->fields_; }
+  ArrayPtr fields() const { return raw_ptr()->fields_; }
   void SetFields(const Array& value) const;
   void AddField(const Field& field) const;
   void AddFields(const GrowableArray<const Field*>& fields) const;
@@ -1269,49 +1263,49 @@
   // |original_classes| only has an effect when reloading. If true and we
   // are reloading, it will prefer the original classes to the replacement
   // classes.
-  RawArray* OffsetToFieldMap(bool original_classes = false) const;
+  ArrayPtr OffsetToFieldMap(bool original_classes = false) const;
 
   // Returns true if non-static fields are defined.
   bool HasInstanceFields() const;
 
   // TODO(koda): Unite w/ hash table.
-  RawArray* functions() const { return raw_ptr()->functions_; }
+  ArrayPtr functions() const { return raw_ptr()->functions_; }
   void SetFunctions(const Array& value) const;
   void AddFunction(const Function& function) const;
   void RemoveFunction(const Function& function) const;
-  RawFunction* FunctionFromIndex(intptr_t idx) const;
+  FunctionPtr FunctionFromIndex(intptr_t idx) const;
   intptr_t FindImplicitClosureFunctionIndex(const Function& needle) const;
-  RawFunction* ImplicitClosureFunctionFromIndex(intptr_t idx) const;
+  FunctionPtr ImplicitClosureFunctionFromIndex(intptr_t idx) const;
 
-  RawFunction* LookupDynamicFunction(const String& name) const;
-  RawFunction* LookupDynamicFunctionAllowAbstract(const String& name) const;
-  RawFunction* LookupDynamicFunctionAllowPrivate(const String& name) const;
-  RawFunction* LookupStaticFunction(const String& name) const;
-  RawFunction* LookupStaticFunctionAllowPrivate(const String& name) const;
-  RawFunction* LookupConstructor(const String& name) const;
-  RawFunction* LookupConstructorAllowPrivate(const String& name) const;
-  RawFunction* LookupFactory(const String& name) const;
-  RawFunction* LookupFactoryAllowPrivate(const String& name) const;
-  RawFunction* LookupFunction(const String& name) const;
-  RawFunction* LookupFunctionAllowPrivate(const String& name) const;
-  RawFunction* LookupGetterFunction(const String& name) const;
-  RawFunction* LookupSetterFunction(const String& name) const;
-  RawField* LookupInstanceField(const String& name) const;
-  RawField* LookupStaticField(const String& name) const;
-  RawField* LookupField(const String& name) const;
-  RawField* LookupFieldAllowPrivate(const String& name,
-                                    bool instance_only = false) const;
-  RawField* LookupInstanceFieldAllowPrivate(const String& name) const;
-  RawField* LookupStaticFieldAllowPrivate(const String& name) const;
+  FunctionPtr LookupDynamicFunction(const String& name) const;
+  FunctionPtr LookupDynamicFunctionAllowAbstract(const String& name) const;
+  FunctionPtr LookupDynamicFunctionAllowPrivate(const String& name) const;
+  FunctionPtr LookupStaticFunction(const String& name) const;
+  FunctionPtr LookupStaticFunctionAllowPrivate(const String& name) const;
+  FunctionPtr LookupConstructor(const String& name) const;
+  FunctionPtr LookupConstructorAllowPrivate(const String& name) const;
+  FunctionPtr LookupFactory(const String& name) const;
+  FunctionPtr LookupFactoryAllowPrivate(const String& name) const;
+  FunctionPtr LookupFunction(const String& name) const;
+  FunctionPtr LookupFunctionAllowPrivate(const String& name) const;
+  FunctionPtr LookupGetterFunction(const String& name) const;
+  FunctionPtr LookupSetterFunction(const String& name) const;
+  FieldPtr LookupInstanceField(const String& name) const;
+  FieldPtr LookupStaticField(const String& name) const;
+  FieldPtr LookupField(const String& name) const;
+  FieldPtr LookupFieldAllowPrivate(const String& name,
+                                   bool instance_only = false) const;
+  FieldPtr LookupInstanceFieldAllowPrivate(const String& name) const;
+  FieldPtr LookupStaticFieldAllowPrivate(const String& name) const;
 
-  RawDouble* LookupCanonicalDouble(Zone* zone, double value) const;
-  RawMint* LookupCanonicalMint(Zone* zone, int64_t value) const;
+  DoublePtr LookupCanonicalDouble(Zone* zone, double value) const;
+  MintPtr LookupCanonicalMint(Zone* zone, int64_t value) const;
 
   // The methods above are more efficient than this generic one.
-  RawInstance* LookupCanonicalInstance(Zone* zone, const Instance& value) const;
+  InstancePtr LookupCanonicalInstance(Zone* zone, const Instance& value) const;
 
-  RawInstance* InsertCanonicalConstant(Zone* zone,
-                                       const Instance& constant) const;
+  InstancePtr InsertCanonicalConstant(Zone* zone,
+                                      const Instance& constant) const;
   void InsertCanonicalDouble(Zone* zone, const Double& constant) const;
   void InsertCanonicalMint(Zone* zone, const Mint& constant) const;
 
@@ -1320,7 +1314,7 @@
   bool RequireLegacyErasureOfConstants(Zone* zone) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawClass));
+    return RoundedAllocationSize(sizeof(ClassLayout));
   }
 
   bool is_implemented() const {
@@ -1333,17 +1327,17 @@
   }
   void set_is_abstract() const;
 
-  RawClass::ClassLoadingState class_loading_state() const {
+  ClassLayout::ClassLoadingState class_loading_state() const {
     return ClassLoadingBits::decode(raw_ptr()->state_bits_);
   }
 
   bool is_declaration_loaded() const {
-    return class_loading_state() >= RawClass::kDeclarationLoaded;
+    return class_loading_state() >= ClassLayout::kDeclarationLoaded;
   }
   void set_is_declaration_loaded() const;
 
   bool is_type_finalized() const {
-    return class_loading_state() >= RawClass::kTypeFinalized;
+    return class_loading_state() >= ClassLayout::kTypeFinalized;
   }
   void set_is_type_finalized() const;
 
@@ -1360,13 +1354,13 @@
 
   bool is_finalized() const {
     return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
-           RawClass::kFinalized;
+           ClassLayout::kFinalized;
   }
   void set_is_finalized() const;
 
   bool is_prefinalized() const {
     return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
-           RawClass::kPreFinalized;
+           ClassLayout::kPreFinalized;
   }
 
   void set_is_prefinalized() const;
@@ -1403,18 +1397,18 @@
     StoreNonPointer(&raw_ptr()->num_native_fields_, value);
   }
 
-  RawCode* allocation_stub() const { return raw_ptr()->allocation_stub_; }
+  CodePtr allocation_stub() const { return raw_ptr()->allocation_stub_; }
   void set_allocation_stub(const Code& value) const;
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   intptr_t binary_declaration_offset() const {
-    return RawClass::BinaryDeclarationOffset::decode(
+    return ClassLayout::BinaryDeclarationOffset::decode(
         raw_ptr()->binary_declaration_);
   }
   void set_binary_declaration_offset(intptr_t value) const {
     ASSERT(value >= 0);
     StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    RawClass::BinaryDeclarationOffset::update(
+                    ClassLayout::BinaryDeclarationOffset::update(
                         value, raw_ptr()->binary_declaration_));
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -1459,7 +1453,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     return false;
 #else
-    return RawClass::IsDeclaredInBytecode::decode(
+    return ClassLayout::IsDeclaredInBytecode::decode(
         raw_ptr()->binary_declaration_);
 #endif
   }
@@ -1467,46 +1461,46 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
   void set_is_declared_in_bytecode(bool value) const {
     StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    RawClass::IsDeclaredInBytecode::update(
+                    ClassLayout::IsDeclaredInBytecode::update(
                         value, raw_ptr()->binary_declaration_));
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   void DisableAllocationStub() const;
 
-  RawArray* constants() const;
+  ArrayPtr constants() const;
   void set_constants(const Array& value) const;
 
   intptr_t FindInvocationDispatcherFunctionIndex(const Function& needle) const;
-  RawFunction* InvocationDispatcherFunctionFromIndex(intptr_t idx) const;
+  FunctionPtr InvocationDispatcherFunctionFromIndex(intptr_t idx) const;
 
-  RawFunction* GetInvocationDispatcher(const String& target_name,
-                                       const Array& args_desc,
-                                       RawFunction::Kind kind,
-                                       bool create_if_absent) const;
+  FunctionPtr GetInvocationDispatcher(const String& target_name,
+                                      const Array& args_desc,
+                                      FunctionLayout::Kind kind,
+                                      bool create_if_absent) const;
 
   void Finalize() const;
 
-  RawObject* Invoke(const String& selector,
-                    const Array& arguments,
-                    const Array& argument_names,
-                    bool respect_reflectable = true,
-                    bool check_is_entrypoint = false) const;
-  RawObject* InvokeGetter(const String& selector,
-                          bool throw_nsm_if_absent,
-                          bool respect_reflectable = true,
-                          bool check_is_entrypoint = false) const;
-  RawObject* InvokeSetter(const String& selector,
-                          const Instance& argument,
-                          bool respect_reflectable = true,
-                          bool check_is_entrypoint = false) const;
+  ObjectPtr Invoke(const String& selector,
+                   const Array& arguments,
+                   const Array& argument_names,
+                   bool respect_reflectable = true,
+                   bool check_is_entrypoint = false) const;
+  ObjectPtr InvokeGetter(const String& selector,
+                         bool throw_nsm_if_absent,
+                         bool respect_reflectable = true,
+                         bool check_is_entrypoint = false) const;
+  ObjectPtr InvokeSetter(const String& selector,
+                         const Instance& argument,
+                         bool respect_reflectable = true,
+                         bool check_is_entrypoint = false) const;
 
   // Evaluate the given expression as if it appeared in a static method of this
   // class and return the resulting value, or an error object if evaluating the
   // expression fails. The method has the formal (type) parameters given in
   // (type_)param_names, and is invoked with the (type)argument values given in
   // (type_)param_values.
-  RawObject* EvaluateCompiledExpression(
+  ObjectPtr EvaluateCompiledExpression(
       const ExternalTypedData& kernel_buffer,
       const Array& type_definitions,
       const Array& param_values,
@@ -1516,37 +1510,37 @@
   // number of type arguments) if it is not loaded yet.
   void EnsureDeclarationLoaded() const;
 
-  RawError* EnsureIsFinalized(Thread* thread) const;
+  ErrorPtr EnsureIsFinalized(Thread* thread) const;
 
   // Allocate a class used for VM internal objects.
   template <class FakeObject, class TargetFakeObject>
-  static RawClass* New(Isolate* isolate, bool register_class = true);
+  static ClassPtr New(Isolate* isolate, bool register_class = true);
 
   // Allocate instance classes.
-  static RawClass* New(const Library& lib,
-                       const String& name,
-                       const Script& script,
-                       TokenPosition token_pos,
-                       bool register_class = true);
-  static RawClass* NewNativeWrapper(const Library& library,
-                                    const String& name,
-                                    int num_fields);
+  static ClassPtr New(const Library& lib,
+                      const String& name,
+                      const Script& script,
+                      TokenPosition token_pos,
+                      bool register_class = true);
+  static ClassPtr NewNativeWrapper(const Library& library,
+                                   const String& name,
+                                   int num_fields);
 
   // Allocate the raw string classes.
-  static RawClass* NewStringClass(intptr_t class_id, Isolate* isolate);
+  static ClassPtr NewStringClass(intptr_t class_id, Isolate* isolate);
 
   // Allocate the raw TypedData classes.
-  static RawClass* NewTypedDataClass(intptr_t class_id, Isolate* isolate);
+  static ClassPtr NewTypedDataClass(intptr_t class_id, Isolate* isolate);
 
   // Allocate the raw TypedDataView/ByteDataView classes.
-  static RawClass* NewTypedDataViewClass(intptr_t class_id, Isolate* isolate);
+  static ClassPtr NewTypedDataViewClass(intptr_t class_id, Isolate* isolate);
 
   // Allocate the raw ExternalTypedData classes.
-  static RawClass* NewExternalTypedDataClass(intptr_t class_id,
-                                             Isolate* isolate);
+  static ClassPtr NewExternalTypedDataClass(intptr_t class_id,
+                                            Isolate* isolate);
 
   // Allocate the raw Pointer classes.
-  static RawClass* NewPointerClass(intptr_t class_id, Isolate* isolate);
+  static ClassPtr NewPointerClass(intptr_t class_id, Isolate* isolate);
 
   // Register code that has used CHA for optimization.
   // TODO(srdjan): Also register kind of CHA optimization (e.g.: leaf class,
@@ -1562,7 +1556,7 @@
   // Return the list of code objects that were compiled using CHA of this class.
   // These code objects will be invalidated if new subclasses of this class
   // are finalized.
-  RawArray* dependent_code() const { return raw_ptr()->dependent_code_; }
+  ArrayPtr dependent_code() const { return raw_ptr()->dependent_code_; }
   void set_dependent_code(const Array& array) const;
 
   bool TraceAllocation(Isolate* isolate) const;
@@ -1584,11 +1578,11 @@
                                const Array& args_desc,
                                const Function& dispatcher) const;
 
-  static int32_t host_instance_size_in_words(const RawClass* cls) {
+  static int32_t host_instance_size_in_words(const ClassPtr cls) {
     return cls->ptr()->host_instance_size_in_words_;
   }
 
-  static int32_t target_instance_size_in_words(const RawClass* cls) {
+  static int32_t target_instance_size_in_words(const ClassPtr cls) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
     return cls->ptr()->target_instance_size_in_words_;
 #else
@@ -1596,11 +1590,11 @@
 #endif  //  !defined(DART_PRECOMPILED_RUNTIME)
   }
 
-  static int32_t host_next_field_offset_in_words(const RawClass* cls) {
+  static int32_t host_next_field_offset_in_words(const ClassPtr cls) {
     return cls->ptr()->host_next_field_offset_in_words_;
   }
 
-  static int32_t target_next_field_offset_in_words(const RawClass* cls) {
+  static int32_t target_next_field_offset_in_words(const ClassPtr cls) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
     return cls->ptr()->target_next_field_offset_in_words_;
 #else
@@ -1608,13 +1602,12 @@
 #endif  //  !defined(DART_PRECOMPILED_RUNTIME)
   }
 
-  static int32_t host_type_arguments_field_offset_in_words(
-      const RawClass* cls) {
+  static int32_t host_type_arguments_field_offset_in_words(const ClassPtr cls) {
     return cls->ptr()->host_type_arguments_field_offset_in_words_;
   }
 
   static int32_t target_type_arguments_field_offset_in_words(
-      const RawClass* cls) {
+      const ClassPtr cls) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
     return cls->ptr()->target_type_arguments_field_offset_in_words_;
 #else
@@ -1623,7 +1616,7 @@
   }
 
  private:
-  RawType* declaration_type() const { return raw_ptr()->declaration_type_; }
+  TypePtr declaration_type() const { return raw_ptr()->declaration_type_; }
 
   // Caches the declaration type of this class.
   void set_declaration_type(const Type& type) const;
@@ -1637,7 +1630,7 @@
   bool RequiresInstanceMorphing(const Class& replacement) const;
 
   template <class FakeInstance, class TargetFakeInstance>
-  static RawClass* NewCommon(intptr_t index);
+  static ClassPtr NewCommon(intptr_t index);
 
   enum MemberKind {
     kAny = 0,
@@ -1669,11 +1662,11 @@
   class ConstBit : public BitField<uint32_t, bool, kConstBit, 1> {};
   class ImplementedBit : public BitField<uint32_t, bool, kImplementedBit, 1> {};
   class ClassFinalizedBits : public BitField<uint32_t,
-                                             RawClass::ClassFinalizedState,
+                                             ClassLayout::ClassFinalizedState,
                                              kClassFinalizedPos,
                                              kClassFinalizedSize> {};
   class ClassLoadingBits : public BitField<uint32_t,
-                                           RawClass::ClassLoadingState,
+                                           ClassLayout::ClassLoadingState,
                                            kClassLoadingPos,
                                            kClassLoadingSize> {};
   class AbstractBit : public BitField<uint32_t, bool, kAbstractBit, 1> {};
@@ -1694,11 +1687,11 @@
   const char* GenerateUserVisibleName() const;
   void set_state_bits(intptr_t bits) const;
 
-  RawArray* invocation_dispatcher_cache() const;
+  ArrayPtr invocation_dispatcher_cache() const;
   void set_invocation_dispatcher_cache(const Array& cache) const;
-  RawFunction* CreateInvocationDispatcher(const String& target_name,
-                                          const Array& args_desc,
-                                          RawFunction::Kind kind) const;
+  FunctionPtr CreateInvocationDispatcher(const String& target_name,
+                                         const Array& args_desc,
+                                         FunctionLayout::Kind kind) const;
 
   // Returns the bitmap of unboxed fields
   UnboxedFieldBitmap CalculateFieldOffsets() const;
@@ -1728,25 +1721,25 @@
   // Assigns empty array to all raw class array fields.
   void InitEmptyFields();
 
-  static RawFunction* CheckFunctionType(const Function& func, MemberKind kind);
-  RawFunction* LookupFunction(const String& name, MemberKind kind) const;
-  RawFunction* LookupFunctionAllowPrivate(const String& name,
-                                          MemberKind kind) const;
-  RawField* LookupField(const String& name, MemberKind kind) const;
+  static FunctionPtr CheckFunctionType(const Function& func, MemberKind kind);
+  FunctionPtr LookupFunction(const String& name, MemberKind kind) const;
+  FunctionPtr LookupFunctionAllowPrivate(const String& name,
+                                         MemberKind kind) const;
+  FieldPtr LookupField(const String& name, MemberKind kind) const;
 
-  RawFunction* LookupAccessorFunction(const char* prefix,
-                                      intptr_t prefix_length,
-                                      const String& name) const;
+  FunctionPtr LookupAccessorFunction(const char* prefix,
+                                     intptr_t prefix_length,
+                                     const String& name) const;
 
   // Allocate an instance class which has a VM implementation.
   template <class FakeInstance, class TargetFakeInstance>
-  static RawClass* New(intptr_t id,
-                       Isolate* isolate,
-                       bool register_class = true,
-                       bool is_abstract = false);
+  static ClassPtr New(intptr_t id,
+                      Isolate* isolate,
+                      bool register_class = true,
+                      bool is_abstract = false);
 
   // Helper that calls 'Class::New<Instance>(kIllegalCid)'.
-  static RawClass* NewInstanceClass();
+  static ClassPtr NewInstanceClass();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object);
   friend class AbstractType;
@@ -1767,10 +1760,10 @@
 
 class PatchClass : public Object {
  public:
-  RawClass* patched_class() const { return raw_ptr()->patched_class_; }
-  RawClass* origin_class() const { return raw_ptr()->origin_class_; }
-  RawScript* script() const { return raw_ptr()->script_; }
-  RawExternalTypedData* library_kernel_data() const {
+  ClassPtr patched_class() const { return raw_ptr()->patched_class_; }
+  ClassPtr origin_class() const { return raw_ptr()->origin_class_; }
+  ScriptPtr script() const { return raw_ptr()->script_; }
+  ExternalTypedDataPtr library_kernel_data() const {
     return raw_ptr()->library_kernel_data_;
   }
   void set_library_kernel_data(const ExternalTypedData& data) const;
@@ -1788,24 +1781,24 @@
   }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawPatchClass));
+    return RoundedAllocationSize(sizeof(PatchClassLayout));
   }
-  static bool IsInFullSnapshot(RawPatchClass* cls) {
+  static bool IsInFullSnapshot(PatchClassPtr cls) {
     NoSafepointScope no_safepoint;
     return Class::IsInFullSnapshot(cls->ptr()->patched_class_);
   }
 
-  static RawPatchClass* New(const Class& patched_class,
-                            const Class& origin_class);
+  static PatchClassPtr New(const Class& patched_class,
+                           const Class& origin_class);
 
-  static RawPatchClass* New(const Class& patched_class, const Script& source);
+  static PatchClassPtr New(const Class& patched_class, const Script& source);
 
  private:
   void set_patched_class(const Class& value) const;
   void set_origin_class(const Class& value) const;
   void set_script(const Script& value) const;
 
-  static RawPatchClass* New();
+  static PatchClassPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(PatchClass, Object);
   friend class Class;
@@ -1821,25 +1814,25 @@
 
   // The type parameter to whose bound needs to be checked, or null if this is
   // an ordinary parameter check.
-  RawAbstractType* param() const { return raw_ptr()->param_; }
+  AbstractTypePtr param() const { return raw_ptr()->param_; }
   void set_param(const AbstractType& t) const;
 
   // FP[index] assignable to type, OR param is subtype of bound.
-  RawAbstractType* type_or_bound() const { return raw_ptr()->type_or_bound_; }
+  AbstractTypePtr type_or_bound() const { return raw_ptr()->type_or_bound_; }
   void set_type_or_bound(const AbstractType& t) const;
 
   // The parameter or type parameter's name to use in an error message.
-  RawString* name() const { return raw_ptr()->name_; }
+  StringPtr name() const { return raw_ptr()->name_; }
   void set_name(const String& n) const;
 
-  RawSubtypeTestCache* cache() const { return raw_ptr()->cache_; }
+  SubtypeTestCachePtr cache() const { return raw_ptr()->cache_; }
   void set_cache(const SubtypeTestCache& c) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawParameterTypeCheck));
+    return RoundedAllocationSize(sizeof(ParameterTypeCheckLayout));
   }
 
-  static RawParameterTypeCheck* New();
+  static ParameterTypeCheckPtr New();
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ParameterTypeCheck, Object);
@@ -1848,10 +1841,10 @@
 
 class SingleTargetCache : public Object {
  public:
-  RawCode* target() const { return raw_ptr()->target_; }
+  CodePtr target() const { return raw_ptr()->target_; }
   void set_target(const Code& target) const;
   static intptr_t target_offset() {
-    return OFFSET_OF(RawSingleTargetCache, target_);
+    return OFFSET_OF(SingleTargetCacheLayout, target_);
   }
 
 #define DEFINE_NON_POINTER_FIELD_ACCESSORS(type, name)                         \
@@ -1860,7 +1853,7 @@
     StoreNonPointer(&raw_ptr()->name##_, value);                               \
   }                                                                            \
   static intptr_t name##_offset() {                                            \
-    return OFFSET_OF(RawSingleTargetCache, name##_);                           \
+    return OFFSET_OF(SingleTargetCacheLayout, name##_);                        \
   }
 
   DEFINE_NON_POINTER_FIELD_ACCESSORS(uword, entry_point);
@@ -1869,10 +1862,10 @@
 #undef DEFINE_NON_POINTER_FIELD_ACCESSORS
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawSingleTargetCache));
+    return RoundedAllocationSize(sizeof(SingleTargetCacheLayout));
   }
 
-  static RawSingleTargetCache* New();
+  static SingleTargetCachePtr New();
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache, Object);
@@ -1881,26 +1874,26 @@
 
 class MonomorphicSmiableCall : public Object {
  public:
-  RawCode* target() const { return raw_ptr()->target_; }
+  CodePtr target() const { return raw_ptr()->target_; }
   classid_t expected_cid() const { return raw_ptr()->expected_cid_; }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawMonomorphicSmiableCall));
+    return RoundedAllocationSize(sizeof(MonomorphicSmiableCallLayout));
   }
 
-  static RawMonomorphicSmiableCall* New(classid_t expected_cid,
-                                        const Code& target);
+  static MonomorphicSmiableCallPtr New(classid_t expected_cid,
+                                       const Code& target);
 
   static intptr_t expected_cid_offset() {
-    return OFFSET_OF(RawMonomorphicSmiableCall, expected_cid_);
+    return OFFSET_OF(MonomorphicSmiableCallLayout, expected_cid_);
   }
 
   static intptr_t target_offset() {
-    return OFFSET_OF(RawMonomorphicSmiableCall, target_);
+    return OFFSET_OF(MonomorphicSmiableCallLayout, target_);
   }
 
   static intptr_t entrypoint_offset() {
-    return OFFSET_OF(RawMonomorphicSmiableCall, entrypoint_);
+    return OFFSET_OF(MonomorphicSmiableCallLayout, entrypoint_);
   }
 
  private:
@@ -1910,9 +1903,9 @@
 
 class UnlinkedCall : public Object {
  public:
-  RawString* target_name() const { return raw_ptr()->target_name_; }
+  StringPtr target_name() const { return raw_ptr()->target_name_; }
   void set_target_name(const String& target_name) const;
-  RawArray* args_descriptor() const { return raw_ptr()->args_descriptor_; }
+  ArrayPtr args_descriptor() const { return raw_ptr()->args_descriptor_; }
   void set_args_descriptor(const Array& args_descriptor) const;
 
   bool can_patch_to_monomorphic() const {
@@ -1921,13 +1914,13 @@
   void set_can_patch_to_monomorphic(bool value) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawUnlinkedCall));
+    return RoundedAllocationSize(sizeof(UnlinkedCallLayout));
   }
 
   intptr_t Hashcode() const;
   bool Equals(const UnlinkedCall& other) const;
 
-  static RawUnlinkedCall* New();
+  static UnlinkedCallPtr New();
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(UnlinkedCall, Object);
@@ -1936,16 +1929,16 @@
 
 class CallSiteData : public Object {
  public:
-  RawString* target_name() const { return raw_ptr()->target_name_; }
+  StringPtr target_name() const { return raw_ptr()->target_name_; }
 
-  RawArray* arguments_descriptor() const { return raw_ptr()->args_descriptor_; }
+  ArrayPtr arguments_descriptor() const { return raw_ptr()->args_descriptor_; }
 
   static intptr_t target_name_offset() {
-    return OFFSET_OF(RawCallSiteData, target_name_);
+    return OFFSET_OF(CallSiteDataLayout, target_name_);
   }
 
   static intptr_t arguments_descriptor_offset() {
-    return OFFSET_OF(RawCallSiteData, args_descriptor_);
+    return OFFSET_OF(CallSiteDataLayout, args_descriptor_);
   }
 
  private:
@@ -1966,9 +1959,9 @@
 // compilation. Code may contain only original ICData objects.
 class ICData : public CallSiteData {
  public:
-  RawFunction* Owner() const;
+  FunctionPtr Owner() const;
 
-  RawICData* Original() const;
+  ICDataPtr Original() const;
 
   void SetOriginal(const ICData& value) const;
 
@@ -1998,7 +1991,7 @@
   bool IsImmutable() const;
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  RawAbstractType* receivers_static_type() const {
+  AbstractTypePtr receivers_static_type() const {
     return raw_ptr()->receivers_static_type_;
   }
   void SetReceiversStaticType(const AbstractType& type) const;
@@ -2108,11 +2101,11 @@
   bool NumberOfChecksIs(intptr_t n) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawICData));
+    return RoundedAllocationSize(sizeof(ICDataLayout));
   }
 
   static intptr_t state_bits_offset() {
-    return OFFSET_OF(RawICData, state_bits_);
+    return OFFSET_OF(ICDataLayout, state_bits_);
   }
 
   static intptr_t NumArgsTestedShift() { return kNumArgsTestedPos; }
@@ -2121,13 +2114,13 @@
     return ((1 << kNumArgsTestedSize) - 1) << kNumArgsTestedPos;
   }
 
-  static intptr_t entries_offset() { return OFFSET_OF(RawICData, entries_); }
+  static intptr_t entries_offset() { return OFFSET_OF(ICDataLayout, entries_); }
 
-  static intptr_t owner_offset() { return OFFSET_OF(RawICData, owner_); }
+  static intptr_t owner_offset() { return OFFSET_OF(ICDataLayout, owner_); }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   static intptr_t receivers_static_type_offset() {
-    return OFFSET_OF(RawICData, receivers_static_type_);
+    return OFFSET_OF(ICDataLayout, receivers_static_type_);
   }
 #endif
 
@@ -2187,9 +2180,9 @@
   intptr_t GetReceiverClassIdAt(intptr_t index) const;
   intptr_t GetClassIdAt(intptr_t index, intptr_t arg_nr) const;
 
-  RawFunction* GetTargetAt(intptr_t index) const;
+  FunctionPtr GetTargetAt(intptr_t index) const;
 
-  RawObject* GetTargetOrCodeAt(intptr_t index) const;
+  ObjectPtr GetTargetOrCodeAt(intptr_t index) const;
   void SetCodeAt(intptr_t index, const Code& value) const;
   void SetEntryPointAt(intptr_t index, const Smi& value) const;
 
@@ -2201,20 +2194,18 @@
   // Returns this->raw() if num_args_tested == 1 and arg_nr == 1, otherwise
   // returns a new ICData object containing only unique arg_nr checks.
   // Returns only used entries.
-  RawICData* AsUnaryClassChecksForArgNr(intptr_t arg_nr) const;
-  RawICData* AsUnaryClassChecks() const {
-    return AsUnaryClassChecksForArgNr(0);
-  }
-  RawICData* AsUnaryClassChecksForCid(intptr_t cid,
-                                      const Function& target) const;
+  ICDataPtr AsUnaryClassChecksForArgNr(intptr_t arg_nr) const;
+  ICDataPtr AsUnaryClassChecks() const { return AsUnaryClassChecksForArgNr(0); }
+  ICDataPtr AsUnaryClassChecksForCid(intptr_t cid,
+                                     const Function& target) const;
 
   // Returns ICData with aggregated receiver count, sorted by highest count.
   // Smi not first!! (the convention for ICData used in code generation is that
   // Smi check is first)
   // Used for printing and optimizations.
-  RawICData* AsUnaryClassChecksSortedByCount() const;
+  ICDataPtr AsUnaryClassChecksSortedByCount() const;
 
-  RawUnlinkedCall* AsUnlinkedCall() const;
+  UnlinkedCallPtr AsUnlinkedCall() const;
 
   bool HasReceiverClassId(intptr_t class_id) const;
 
@@ -2222,7 +2213,7 @@
   // the receiver type. Receiver type is expected to be a fully
   // instantiated generic (but not a FutureOr).
   // See StaticTypeExactnessState for more information.
-  static RawICData* New(
+  static ICDataPtr New(
       const Function& owner,
       const String& target_name,
       const Array& arguments_descriptor,
@@ -2230,10 +2221,10 @@
       intptr_t num_args_tested,
       RebindRule rebind_rule,
       const AbstractType& receiver_type = Object::null_abstract_type());
-  static RawICData* NewFrom(const ICData& from, intptr_t num_args_tested);
+  static ICDataPtr NewFrom(const ICData& from, intptr_t num_args_tested);
 
   // Generates a new ICData with descriptor and data array copied (deep clone).
-  static RawICData* Clone(const ICData& from);
+  static ICDataPtr Clone(const ICData& from);
 
   static intptr_t TestEntryLengthFor(intptr_t num_args,
                                      bool tracking_exactness);
@@ -2272,8 +2263,8 @@
 
   intptr_t FindCheck(const GrowableArray<intptr_t>& cids) const;
 
-  RawArray* entries() const {
-    return LoadPointer<RawArray*, std::memory_order_acquire>(
+  ArrayPtr entries() const {
+    return LoadPointer<ArrayPtr, std::memory_order_acquire>(
         &raw_ptr()->entries_);
   }
 
@@ -2290,11 +2281,11 @@
  private:
   friend class FlowGraphSerializer;  // For is_megamorphic()
 
-  static RawICData* New();
+  static ICDataPtr New();
 
   // Grows the array and also sets the argument to the index that should be used
   // for the new entry.
-  RawArray* Grow(intptr_t* index) const;
+  ArrayPtr Grow(intptr_t* index) const;
 
   void set_owner(const Function& value) const;
   void set_deopt_id(intptr_t value) const;
@@ -2334,7 +2325,7 @@
   };
 
   COMPILE_ASSERT(kReceiverCannotBeSmiPos + kReceiverCannotBeSmiSize <=
-                 sizeof(RawICData::state_bits_) * kBitsPerWord);
+                 sizeof(ICDataLayout::state_bits_) * kBitsPerWord);
   COMPILE_ASSERT(kNumRebindRules <= (1 << kRebindRuleSize));
 
   class NumArgsTestedBits : public BitField<uint32_t,
@@ -2367,23 +2358,23 @@
 #endif  // DEBUG
 
   intptr_t TestEntryLength() const;
-  static RawArray* NewNonCachedEmptyICDataArray(intptr_t num_args_tested,
-                                                bool tracking_exactness);
-  static RawArray* CachedEmptyICDataArray(intptr_t num_args_tested,
-                                          bool tracking_exactness);
-  static RawICData* NewDescriptor(Zone* zone,
-                                  const Function& owner,
-                                  const String& target_name,
-                                  const Array& arguments_descriptor,
-                                  intptr_t deopt_id,
-                                  intptr_t num_args_tested,
-                                  RebindRule rebind_rule,
-                                  const AbstractType& receiver_type);
+  static ArrayPtr NewNonCachedEmptyICDataArray(intptr_t num_args_tested,
+                                               bool tracking_exactness);
+  static ArrayPtr CachedEmptyICDataArray(intptr_t num_args_tested,
+                                         bool tracking_exactness);
+  static ICDataPtr NewDescriptor(Zone* zone,
+                                 const Function& owner,
+                                 const String& target_name,
+                                 const Array& arguments_descriptor,
+                                 intptr_t deopt_id,
+                                 intptr_t num_args_tested,
+                                 RebindRule rebind_rule,
+                                 const AbstractType& receiver_type);
 
   static void WriteSentinel(const Array& data, intptr_t test_entry_length);
 
   // A cache of VM heap allocated preinitialized empty ic data entry arrays.
-  static RawArray* cached_icdata_arrays_[kCachedICDataArrayCount];
+  static ArrayPtr cached_icdata_arrays_[kCachedICDataArrayCount];
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, CallSiteData);
   friend class CallSiteResetter;
@@ -2417,18 +2408,18 @@
 
 class Function : public Object {
  public:
-  RawString* name() const { return raw_ptr()->name_; }
-  RawString* UserVisibleName() const;  // Same as scrubbed name.
+  StringPtr name() const { return raw_ptr()->name_; }
+  StringPtr UserVisibleName() const;  // Same as scrubbed name.
   const char* UserVisibleNameCString() const;
 
   void PrintQualifiedName(NameVisibility name_visibility,
                           ZoneTextBuffer* printer) const;
-  RawString* QualifiedScrubbedName() const;
-  RawString* QualifiedUserVisibleName() const;
+  StringPtr QualifiedScrubbedName() const;
+  StringPtr QualifiedUserVisibleName() const;
 
-  virtual RawString* DictionaryName() const { return name(); }
+  virtual StringPtr DictionaryName() const { return name(); }
 
-  RawString* GetSource() const;
+  StringPtr GetSource() const;
 
   // Return the type of this function's signature. It may not be canonical yet.
   // For example, if this function has a signature of the form
@@ -2437,9 +2428,9 @@
   // function type with uninstantiated type arguments 'T' and 'R' as elements of
   // its type argument vector.
   // A function type is non-nullable by default.
-  RawType* SignatureType(
+  TypePtr SignatureType(
       Nullability nullability = Nullability::kNonNullable) const;
-  RawType* ExistingSignatureType() const;
+  TypePtr ExistingSignatureType() const;
 
   // Update the signature type (with a canonical version).
   void SetSignatureType(const Type& value) const;
@@ -2450,7 +2441,7 @@
 
   // Retrieves the "C signature" function for an FFI trampoline.
   // Can only be used on FFI trampolines.
-  RawFunction* FfiCSignature() const;
+  FunctionPtr FfiCSignature() const;
 
   // Can only be called on FFI trampolines.
   // -1 for Dart -> native calls.
@@ -2461,20 +2452,20 @@
 
   // Can only be called on FFI trampolines.
   // Null for Dart -> native calls.
-  RawFunction* FfiCallbackTarget() const;
+  FunctionPtr FfiCallbackTarget() const;
 
   // Can only be called on FFI trampolines.
   void SetFfiCallbackTarget(const Function& target) const;
 
   // Can only be called on FFI trampolines.
   // Null for Dart -> native calls.
-  RawInstance* FfiCallbackExceptionalReturn() const;
+  InstancePtr FfiCallbackExceptionalReturn() const;
 
   // Can only be called on FFI trampolines.
   void SetFfiCallbackExceptionalReturn(const Instance& value) const;
 
   // Return a new function with instantiated result and parameter types.
-  RawFunction* InstantiateSignatureFrom(
+  FunctionPtr InstantiateSignatureFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
@@ -2484,14 +2475,14 @@
   // internal signature of the given function. In this example, T is a type
   // parameter of this function and R is a type parameter of class C, the owner
   // of the function. B and C are not type parameters.
-  RawString* Signature() const;
+  StringPtr Signature() const;
 
   // Build a string of the form '<T>(T, {B b, C c}) => R' representing the
   // user visible signature of the given function. In this example, T is a type
   // parameter of this function and R is a type parameter of class C, the owner
   // of the function. B and C are not type parameters.
   // Implicit parameters are hidden.
-  RawString* UserVisibleSignature() const;
+  StringPtr UserVisibleSignature() const;
 
   void PrintSignature(NameVisibility name_visibility,
                       ZoneTextBuffer* printer) const;
@@ -2505,36 +2496,36 @@
                                 intptr_t num_free_fun_type_params = kAllFree,
                                 TrailPtr trail = NULL) const;
 
-  RawClass* Owner() const;
+  ClassPtr Owner() const;
   void set_owner(const Object& value) const;
-  RawClass* origin() const;
-  RawScript* script() const;
-  RawObject* RawOwner() const { return raw_ptr()->owner_; }
+  ClassPtr origin() const;
+  ScriptPtr script() const;
+  ObjectPtr RawOwner() const { return raw_ptr()->owner_; }
 
   // The NNBD mode of the library declaring this function.
   // TODO(alexmarkov): nnbd_mode() doesn't work for mixins.
   // It should be either removed or fixed.
   NNBDMode nnbd_mode() const { return Class::Handle(origin()).nnbd_mode(); }
 
-  RawRegExp* regexp() const;
+  RegExpPtr regexp() const;
   intptr_t string_specialization_cid() const;
   bool is_sticky_specialization() const;
   void SetRegExpData(const RegExp& regexp,
                      intptr_t string_specialization_cid,
                      bool sticky) const;
 
-  RawString* native_name() const;
+  StringPtr native_name() const;
   void set_native_name(const String& name) const;
 
-  RawAbstractType* result_type() const { return raw_ptr()->result_type_; }
+  AbstractTypePtr result_type() const { return raw_ptr()->result_type_; }
   void set_result_type(const AbstractType& value) const;
 
   // The parameters, starting with NumImplicitParameters() parameters which are
   // only visible to the VM, but not to Dart users.
   // Note that type checks exclude implicit parameters.
-  RawAbstractType* ParameterTypeAt(intptr_t index) const;
+  AbstractTypePtr ParameterTypeAt(intptr_t index) const;
   void SetParameterTypeAt(intptr_t index, const AbstractType& value) const;
-  RawArray* parameter_types() const { return raw_ptr()->parameter_types_; }
+  ArrayPtr parameter_types() const { return raw_ptr()->parameter_types_; }
   void set_parameter_types(const Array& value) const;
 
   // Parameter names are valid for all valid parameter indices, and are not
@@ -2542,9 +2533,9 @@
   // required) they're stored at the end of this array, so the size of this
   // array isn't necessarily NumParameters(), but the first NumParameters()
   // elements are the names.
-  RawString* ParameterNameAt(intptr_t index) const;
+  StringPtr ParameterNameAt(intptr_t index) const;
   void SetParameterNameAt(intptr_t index, const String& value) const;
-  RawArray* parameter_names() const { return raw_ptr()->parameter_names_; }
+  ArrayPtr parameter_names() const { return raw_ptr()->parameter_names_; }
   void set_parameter_names(const Array& value) const;
 
   // The required flags are stored at the end of the parameter_names. The flags
@@ -2563,7 +2554,7 @@
 
   // The type parameters (and their bounds) are specified as an array of
   // TypeParameter.
-  RawTypeArguments* type_parameters() const {
+  TypeArgumentsPtr type_parameters() const {
     return raw_ptr()->type_parameters_;
   }
   void set_type_parameters(const TypeArguments& value) const;
@@ -2587,8 +2578,8 @@
   // function or of one of its parent functions.
   // Unless NULL, adjust function_level accordingly (in and out parameter).
   // Return null otherwise.
-  RawTypeParameter* LookupTypeParameter(const String& type_name,
-                                        intptr_t* function_level) const;
+  TypeParameterPtr LookupTypeParameter(const String& type_name,
+                                       intptr_t* function_level) const;
 
   // Return true if this function declares type parameters.
   bool IsGeneric() const { return NumTypeParameters(Thread::Current()) > 0; }
@@ -2611,7 +2602,7 @@
   // unoptimized version of the code.  If the code contains errors, it calls
   // Exceptions::PropagateError and does not return.  Normally returns the
   // current code, whether it is optimized or unoptimized.
-  RawCode* EnsureHasCode() const;
+  CodePtr EnsureHasCode() const;
 
   // Disables optimized code and switches to unoptimized code (or the lazy
   // compilation stub).
@@ -2622,54 +2613,54 @@
 
   // Return the most recently compiled and installed code for this function.
   // It is not the only Code object that points to this function.
-  RawCode* CurrentCode() const { return CurrentCodeOf(raw()); }
+  CodePtr CurrentCode() const { return CurrentCodeOf(raw()); }
 
   bool SafeToClosurize() const;
 
-  static RawCode* CurrentCodeOf(const RawFunction* function) {
+  static CodePtr CurrentCodeOf(const FunctionPtr function) {
     return function->ptr()->code_;
   }
 
-  RawCode* unoptimized_code() const {
+  CodePtr unoptimized_code() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
-    return static_cast<RawCode*>(Object::null());
+    return static_cast<CodePtr>(Object::null());
 #else
     return raw_ptr()->unoptimized_code_;
 #endif
   }
   void set_unoptimized_code(const Code& value) const;
   bool HasCode() const;
-  static bool HasCode(RawFunction* function);
+  static bool HasCode(FunctionPtr function);
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  static inline bool HasBytecode(RawFunction* function);
+  static inline bool HasBytecode(FunctionPtr function);
 #endif
 
-  static intptr_t code_offset() { return OFFSET_OF(RawFunction, code_); }
+  static intptr_t code_offset() { return OFFSET_OF(FunctionLayout, code_); }
 
   static intptr_t result_type_offset() {
-    return OFFSET_OF(RawFunction, result_type_);
+    return OFFSET_OF(FunctionLayout, result_type_);
   }
 
   static intptr_t entry_point_offset(
       CodeEntryKind entry_kind = CodeEntryKind::kNormal) {
     switch (entry_kind) {
       case CodeEntryKind::kNormal:
-        return OFFSET_OF(RawFunction, entry_point_);
+        return OFFSET_OF(FunctionLayout, entry_point_);
       case CodeEntryKind::kUnchecked:
-        return OFFSET_OF(RawFunction, unchecked_entry_point_);
+        return OFFSET_OF(FunctionLayout, unchecked_entry_point_);
       default:
         UNREACHABLE();
     }
   }
 
   static intptr_t unchecked_entry_point_offset() {
-    return OFFSET_OF(RawFunction, unchecked_entry_point_);
+    return OFFSET_OF(FunctionLayout, unchecked_entry_point_);
   }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   bool IsBytecodeAllowed(Zone* zone) const;
   void AttachBytecode(const Bytecode& bytecode) const;
-  RawBytecode* bytecode() const { return raw_ptr()->bytecode_; }
+  BytecodePtr bytecode() const { return raw_ptr()->bytecode_; }
   inline bool HasBytecode() const;
 #else
   inline bool HasBytecode() const { return false; }
@@ -2681,44 +2672,44 @@
   // set in this function.
   bool HasBreakpoint() const;
 
-  RawContextScope* context_scope() const;
+  ContextScopePtr context_scope() const;
   void set_context_scope(const ContextScope& value) const;
 
   // Enclosing function of this local function.
-  RawFunction* parent_function() const;
+  FunctionPtr parent_function() const;
 
   // Enclosing outermost function of this local function.
-  RawFunction* GetOutermostFunction() const;
+  FunctionPtr GetOutermostFunction() const;
 
   void set_extracted_method_closure(const Function& function) const;
-  RawFunction* extracted_method_closure() const;
+  FunctionPtr extracted_method_closure() const;
 
   void set_saved_args_desc(const Array& array) const;
-  RawArray* saved_args_desc() const;
+  ArrayPtr saved_args_desc() const;
 
   void set_accessor_field(const Field& value) const;
-  RawField* accessor_field() const;
+  FieldPtr accessor_field() const;
 
   bool IsMethodExtractor() const {
-    return kind() == RawFunction::kMethodExtractor;
+    return kind() == FunctionLayout::kMethodExtractor;
   }
 
   bool IsNoSuchMethodDispatcher() const {
-    return kind() == RawFunction::kNoSuchMethodDispatcher;
+    return kind() == FunctionLayout::kNoSuchMethodDispatcher;
   }
 
   bool IsInvokeFieldDispatcher() const {
-    return kind() == RawFunction::kInvokeFieldDispatcher;
+    return kind() == FunctionLayout::kInvokeFieldDispatcher;
   }
 
   bool IsDynamicInvocationForwarder() const {
-    return kind() == RawFunction::kDynamicInvocationForwarder;
+    return kind() == FunctionLayout::kDynamicInvocationForwarder;
   }
 
   bool IsImplicitGetterOrSetter() const {
-    return kind() == RawFunction::kImplicitGetter ||
-           kind() == RawFunction::kImplicitSetter ||
-           kind() == RawFunction::kImplicitStaticGetter;
+    return kind() == FunctionLayout::kImplicitGetter ||
+           kind() == FunctionLayout::kImplicitSetter ||
+           kind() == FunctionLayout::kImplicitStaticGetter;
   }
 
   // Returns true iff an implicit closure function has been created
@@ -2730,48 +2721,48 @@
   // Returns the closure function implicitly created for this function.  If none
   // exists yet, create one and remember it.  Implicit closure functions are
   // used in VM Closure instances that represent results of tear-off operations.
-  RawFunction* ImplicitClosureFunction() const;
+  FunctionPtr ImplicitClosureFunction() const;
   void DropUncompiledImplicitClosureFunction() const;
 
   // Return the closure implicitly created for this function.
   // If none exists yet, create one and remember it.
-  RawInstance* ImplicitStaticClosure() const;
+  InstancePtr ImplicitStaticClosure() const;
 
-  RawInstance* ImplicitInstanceClosure(const Instance& receiver) const;
+  InstancePtr ImplicitInstanceClosure(const Instance& receiver) const;
 
   intptr_t ComputeClosureHash() const;
 
   // Redirection information for a redirecting factory.
   bool IsRedirectingFactory() const;
-  RawType* RedirectionType() const;
+  TypePtr RedirectionType() const;
   void SetRedirectionType(const Type& type) const;
-  RawString* RedirectionIdentifier() const;
+  StringPtr RedirectionIdentifier() const;
   void SetRedirectionIdentifier(const String& identifier) const;
-  RawFunction* RedirectionTarget() const;
+  FunctionPtr RedirectionTarget() const;
   void SetRedirectionTarget(const Function& target) const;
 
-  RawFunction* ForwardingTarget() const;
+  FunctionPtr ForwardingTarget() const;
   void SetForwardingChecks(const Array& checks) const;
 
-  RawFunction::Kind kind() const {
+  FunctionLayout::Kind kind() const {
     return KindBits::decode(raw_ptr()->kind_tag_);
   }
-  static RawFunction::Kind kind(RawFunction* function) {
+  static FunctionLayout::Kind kind(FunctionPtr function) {
     return KindBits::decode(function->ptr()->kind_tag_);
   }
 
-  RawFunction::AsyncModifier modifier() const {
+  FunctionLayout::AsyncModifier modifier() const {
     return ModifierBits::decode(raw_ptr()->kind_tag_);
   }
 
-  static const char* KindToCString(RawFunction::Kind kind);
+  static const char* KindToCString(FunctionLayout::Kind kind);
 
   bool IsGenerativeConstructor() const {
-    return (kind() == RawFunction::kConstructor) && !is_static();
+    return (kind() == FunctionLayout::kConstructor) && !is_static();
   }
   bool IsImplicitConstructor() const;
   bool IsFactory() const {
-    return (kind() == RawFunction::kConstructor) && is_static();
+    return (kind() == FunctionLayout::kConstructor) && is_static();
   }
 
   // Whether this function can receive an invocation where the number and names
@@ -2782,7 +2773,7 @@
 
   bool HasThisParameter() const {
     return IsDynamicFunction(/*allow_abstract=*/true) ||
-           IsGenerativeConstructor();
+           IsGenerativeConstructor() || (IsFieldInitializer() && !is_static());
   }
 
   bool IsDynamicFunction(bool allow_abstract = false) const {
@@ -2790,23 +2781,23 @@
       return false;
     }
     switch (kind()) {
-      case RawFunction::kRegularFunction:
-      case RawFunction::kGetterFunction:
-      case RawFunction::kSetterFunction:
-      case RawFunction::kImplicitGetter:
-      case RawFunction::kImplicitSetter:
-      case RawFunction::kMethodExtractor:
-      case RawFunction::kNoSuchMethodDispatcher:
-      case RawFunction::kInvokeFieldDispatcher:
-      case RawFunction::kDynamicInvocationForwarder:
+      case FunctionLayout::kRegularFunction:
+      case FunctionLayout::kGetterFunction:
+      case FunctionLayout::kSetterFunction:
+      case FunctionLayout::kImplicitGetter:
+      case FunctionLayout::kImplicitSetter:
+      case FunctionLayout::kMethodExtractor:
+      case FunctionLayout::kNoSuchMethodDispatcher:
+      case FunctionLayout::kInvokeFieldDispatcher:
+      case FunctionLayout::kDynamicInvocationForwarder:
         return true;
-      case RawFunction::kClosureFunction:
-      case RawFunction::kImplicitClosureFunction:
-      case RawFunction::kSignatureFunction:
-      case RawFunction::kConstructor:
-      case RawFunction::kImplicitStaticGetter:
-      case RawFunction::kFieldInitializer:
-      case RawFunction::kIrregexpFunction:
+      case FunctionLayout::kClosureFunction:
+      case FunctionLayout::kImplicitClosureFunction:
+      case FunctionLayout::kSignatureFunction:
+      case FunctionLayout::kConstructor:
+      case FunctionLayout::kImplicitStaticGetter:
+      case FunctionLayout::kFieldInitializer:
+      case FunctionLayout::kIrregexpFunction:
         return false;
       default:
         UNREACHABLE();
@@ -2818,23 +2809,23 @@
       return false;
     }
     switch (kind()) {
-      case RawFunction::kRegularFunction:
-      case RawFunction::kGetterFunction:
-      case RawFunction::kSetterFunction:
-      case RawFunction::kImplicitGetter:
-      case RawFunction::kImplicitSetter:
-      case RawFunction::kImplicitStaticGetter:
-      case RawFunction::kFieldInitializer:
-      case RawFunction::kIrregexpFunction:
+      case FunctionLayout::kRegularFunction:
+      case FunctionLayout::kGetterFunction:
+      case FunctionLayout::kSetterFunction:
+      case FunctionLayout::kImplicitGetter:
+      case FunctionLayout::kImplicitSetter:
+      case FunctionLayout::kImplicitStaticGetter:
+      case FunctionLayout::kFieldInitializer:
+      case FunctionLayout::kIrregexpFunction:
         return true;
-      case RawFunction::kClosureFunction:
-      case RawFunction::kImplicitClosureFunction:
-      case RawFunction::kSignatureFunction:
-      case RawFunction::kConstructor:
-      case RawFunction::kMethodExtractor:
-      case RawFunction::kNoSuchMethodDispatcher:
-      case RawFunction::kInvokeFieldDispatcher:
-      case RawFunction::kDynamicInvocationForwarder:
+      case FunctionLayout::kClosureFunction:
+      case FunctionLayout::kImplicitClosureFunction:
+      case FunctionLayout::kSignatureFunction:
+      case FunctionLayout::kConstructor:
+      case FunctionLayout::kMethodExtractor:
+      case FunctionLayout::kNoSuchMethodDispatcher:
+      case FunctionLayout::kInvokeFieldDispatcher:
+      case FunctionLayout::kDynamicInvocationForwarder:
         return false;
       default:
         UNREACHABLE();
@@ -2848,7 +2839,7 @@
       return false;
     }
     return IsClosureFunction() ||
-           !(is_static() || (kind() == RawFunction::kConstructor));
+           !(is_static() || (kind() == FunctionLayout::kConstructor));
   }
 
   bool NeedsMonomorphicCheckedEntry(Zone* zone) const;
@@ -2880,7 +2871,7 @@
   }
 
   intptr_t num_fixed_parameters() const {
-    return RawFunction::PackedNumFixedParameters::decode(
+    return FunctionLayout::PackedNumFixedParameters::decode(
         raw_ptr()->packed_fields_);
   }
   void set_num_fixed_parameters(intptr_t value) const;
@@ -2889,19 +2880,19 @@
   void set_packed_fields(uint32_t packed_fields) const;
 
   bool HasOptionalParameters() const {
-    return RawFunction::PackedNumOptionalParameters::decode(
+    return FunctionLayout::PackedNumOptionalParameters::decode(
                raw_ptr()->packed_fields_) > 0;
   }
   bool HasOptionalNamedParameters() const {
     return HasOptionalParameters() &&
-           RawFunction::PackedHasNamedOptionalParameters::decode(
+           FunctionLayout::PackedHasNamedOptionalParameters::decode(
                raw_ptr()->packed_fields_);
   }
   bool HasOptionalPositionalParameters() const {
     return HasOptionalParameters() && !HasOptionalNamedParameters();
   }
   intptr_t NumOptionalParameters() const {
-    return RawFunction::PackedNumOptionalParameters::decode(
+    return FunctionLayout::PackedNumOptionalParameters::decode(
         raw_ptr()->packed_fields_);
   }
   void SetNumOptionalParameters(intptr_t num_optional_parameters,
@@ -2930,7 +2921,9 @@
   void set_##name(type value) const { UNREACHABLE(); }
 #else
 #define DEFINE_GETTERS_AND_SETTERS(return_type, type, name)                    \
-  static intptr_t name##_offset() { return OFFSET_OF(RawFunction, name##_); }  \
+  static intptr_t name##_offset() {                                            \
+    return OFFSET_OF(FunctionLayout, name##_);                                 \
+  }                                                                            \
   return_type name() const { return raw_ptr()->name##_; }                      \
                                                                                \
   void set_##name(type value) const {                                          \
@@ -2944,13 +2937,13 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   intptr_t binary_declaration_offset() const {
-    return RawFunction::BinaryDeclarationOffset::decode(
+    return FunctionLayout::BinaryDeclarationOffset::decode(
         raw_ptr()->binary_declaration_);
   }
   void set_binary_declaration_offset(intptr_t value) const {
     ASSERT(value >= 0);
     StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    RawFunction::BinaryDeclarationOffset::update(
+                    FunctionLayout::BinaryDeclarationOffset::update(
                         value, raw_ptr()->binary_declaration_));
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -2995,7 +2988,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     return false;
 #else
-    return RawFunction::IsDeclaredInBytecode::decode(
+    return FunctionLayout::IsDeclaredInBytecode::decode(
         raw_ptr()->binary_declaration_);
 #endif
   }
@@ -3003,7 +2996,7 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
   void set_is_declared_in_bytecode(bool value) const {
     StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    RawFunction::IsDeclaredInBytecode::update(
+                    FunctionLayout::IsDeclaredInBytecode::update(
                         value, raw_ptr()->binary_declaration_));
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -3029,7 +3022,7 @@
 
   intptr_t KernelDataProgramOffset() const;
 
-  RawExternalTypedData* KernelData() const;
+  ExternalTypedDataPtr KernelData() const;
 
   bool IsOptimizable() const;
   void SetIsOptimizable(bool value) const;
@@ -3075,7 +3068,7 @@
 
   // Returns a TypeError if the provided arguments don't match the function
   // parameter types, NULL otherwise. Assumes AreValidArguments is called first.
-  RawObject* DoArgumentTypesMatch(
+  ObjectPtr DoArgumentTypesMatch(
       const Array& args,
       const ArgumentsDescriptor& arg_names,
       const TypeArguments& instantiator_type_args) const;
@@ -3100,13 +3093,13 @@
 
   static constexpr intptr_t maximum_unboxed_parameter_count() {
     // Subtracts one that represents the return value
-    return RawFunction::UnboxedParameterBitmap::kCapacity - 1;
+    return FunctionLayout::UnboxedParameterBitmap::kCapacity - 1;
   }
 
   void reset_unboxed_parameters_and_return() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
     StoreNonPointer(&raw_ptr()->unboxed_parameters_info_,
-                    RawFunction::UnboxedParameterBitmap());
+                    FunctionLayout::UnboxedParameterBitmap());
 #endif  //  !defined(DART_PRECOMPILED_RUNTIME)
   }
 
@@ -3114,7 +3107,7 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
     ASSERT(index >= 0 && index < maximum_unboxed_parameter_count());
     index++;  // position 0 is reserved for the return value
-    const_cast<RawFunction::UnboxedParameterBitmap*>(
+    const_cast<FunctionLayout::UnboxedParameterBitmap*>(
         &raw_ptr()->unboxed_parameters_info_)
         ->SetUnboxedInteger(index);
 #else
@@ -3126,7 +3119,7 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
     ASSERT(index >= 0 && index < maximum_unboxed_parameter_count());
     index++;  // position 0 is reserved for the return value
-    const_cast<RawFunction::UnboxedParameterBitmap*>(
+    const_cast<FunctionLayout::UnboxedParameterBitmap*>(
         &raw_ptr()->unboxed_parameters_info_)
         ->SetUnboxedDouble(index);
 
@@ -3137,7 +3130,7 @@
 
   void set_unboxed_integer_return() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-    const_cast<RawFunction::UnboxedParameterBitmap*>(
+    const_cast<FunctionLayout::UnboxedParameterBitmap*>(
         &raw_ptr()->unboxed_parameters_info_)
         ->SetUnboxedInteger(0);
 #else
@@ -3147,7 +3140,7 @@
 
   void set_unboxed_double_return() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-    const_cast<RawFunction::UnboxedParameterBitmap*>(
+    const_cast<FunctionLayout::UnboxedParameterBitmap*>(
         &raw_ptr()->unboxed_parameters_info_)
         ->SetUnboxedDouble(0);
 
@@ -3216,12 +3209,12 @@
 
   bool IsDispatcherOrImplicitAccessor() const {
     switch (kind()) {
-      case RawFunction::kImplicitGetter:
-      case RawFunction::kImplicitSetter:
-      case RawFunction::kImplicitStaticGetter:
-      case RawFunction::kNoSuchMethodDispatcher:
-      case RawFunction::kInvokeFieldDispatcher:
-      case RawFunction::kDynamicInvocationForwarder:
+      case FunctionLayout::kImplicitGetter:
+      case FunctionLayout::kImplicitSetter:
+      case FunctionLayout::kImplicitStaticGetter:
+      case FunctionLayout::kNoSuchMethodDispatcher:
+      case FunctionLayout::kInvokeFieldDispatcher:
+      case FunctionLayout::kDynamicInvocationForwarder:
         return true;
       default:
         return false;
@@ -3230,47 +3223,47 @@
 
   // Returns true if this function represents an explicit getter function.
   bool IsGetterFunction() const {
-    return kind() == RawFunction::kGetterFunction;
+    return kind() == FunctionLayout::kGetterFunction;
   }
 
   // Returns true if this function represents an implicit getter function.
   bool IsImplicitGetterFunction() const {
-    return kind() == RawFunction::kImplicitGetter;
+    return kind() == FunctionLayout::kImplicitGetter;
   }
 
   // Returns true if this function represents an explicit setter function.
   bool IsSetterFunction() const {
-    return kind() == RawFunction::kSetterFunction;
+    return kind() == FunctionLayout::kSetterFunction;
   }
 
   // Returns true if this function represents an implicit setter function.
   bool IsImplicitSetterFunction() const {
-    return kind() == RawFunction::kImplicitSetter;
+    return kind() == FunctionLayout::kImplicitSetter;
   }
 
-  // Returns true if this function represents an the initializer for a static or
+  // Returns true if this function represents an initializer for a static or
   // instance field. The function returns the initial value and the caller is
   // responsible for setting the field.
   bool IsFieldInitializer() const {
-    return kind() == RawFunction::kFieldInitializer;
+    return kind() == FunctionLayout::kFieldInitializer;
   }
 
   // Returns true if this function represents a (possibly implicit) closure
   // function.
   bool IsClosureFunction() const {
-    RawFunction::Kind k = kind();
-    return (k == RawFunction::kClosureFunction) ||
-           (k == RawFunction::kImplicitClosureFunction);
+    FunctionLayout::Kind k = kind();
+    return (k == FunctionLayout::kClosureFunction) ||
+           (k == FunctionLayout::kImplicitClosureFunction);
   }
 
   // Returns true if this function represents a generated irregexp function.
   bool IsIrregexpFunction() const {
-    return kind() == RawFunction::kIrregexpFunction;
+    return kind() == FunctionLayout::kIrregexpFunction;
   }
 
   // Returns true if this function represents an implicit closure function.
   bool IsImplicitClosureFunction() const {
-    return kind() == RawFunction::kImplicitClosureFunction;
+    return kind() == FunctionLayout::kImplicitClosureFunction;
   }
 
   // Returns true if this function represents a non implicit closure function.
@@ -3283,7 +3276,7 @@
   bool IsImplicitStaticClosureFunction() const {
     return IsImplicitClosureFunction() && is_static();
   }
-  static bool IsImplicitStaticClosureFunction(RawFunction* func);
+  static bool IsImplicitStaticClosureFunction(FunctionPtr func);
 
   // Returns true if this function represents an implicit instance closure
   // function.
@@ -3296,20 +3289,22 @@
 
   // Returns true if this function represents a signature function without code.
   bool IsSignatureFunction() const {
-    return kind() == RawFunction::kSignatureFunction;
+    return kind() == FunctionLayout::kSignatureFunction;
   }
-  static bool IsSignatureFunction(RawFunction* function) {
+  static bool IsSignatureFunction(FunctionPtr function) {
     NoSafepointScope no_safepoint;
     return KindBits::decode(function->ptr()->kind_tag_) ==
-           RawFunction::kSignatureFunction;
+           FunctionLayout::kSignatureFunction;
   }
 
   // Returns true if this function represents an ffi trampoline.
-  bool IsFfiTrampoline() const { return kind() == RawFunction::kFfiTrampoline; }
-  static bool IsFfiTrampoline(RawFunction* function) {
+  bool IsFfiTrampoline() const {
+    return kind() == FunctionLayout::kFfiTrampoline;
+  }
+  static bool IsFfiTrampoline(FunctionPtr function) {
     NoSafepointScope no_safepoint;
     return KindBits::decode(function->ptr()->kind_tag_) ==
-           RawFunction::kFfiTrampoline;
+           FunctionLayout::kFfiTrampoline;
   }
 
   bool IsFfiLoad() const {
@@ -3334,7 +3329,7 @@
     return kind == MethodRecognizer::kFfiGetAddress;
   }
 
-  bool IsAsyncFunction() const { return modifier() == RawFunction::kAsync; }
+  bool IsAsyncFunction() const { return modifier() == FunctionLayout::kAsync; }
 
   bool IsAsyncClosure() const {
     return is_generated_body() &&
@@ -3342,10 +3337,12 @@
   }
 
   bool IsGenerator() const {
-    return (modifier() & RawFunction::kGeneratorBit) != 0;
+    return (modifier() & FunctionLayout::kGeneratorBit) != 0;
   }
 
-  bool IsSyncGenerator() const { return modifier() == RawFunction::kSyncGen; }
+  bool IsSyncGenerator() const {
+    return modifier() == FunctionLayout::kSyncGen;
+  }
 
   bool IsSyncGenClosure() const {
     return is_generated_body() &&
@@ -3357,7 +3354,9 @@
            Function::Handle(parent_function()).IsGenerator();
   }
 
-  bool IsAsyncGenerator() const { return modifier() == RawFunction::kAsyncGen; }
+  bool IsAsyncGenerator() const {
+    return modifier() == FunctionLayout::kAsyncGen;
+  }
 
   bool IsAsyncGenClosure() const {
     return is_generated_body() &&
@@ -3365,11 +3364,11 @@
   }
 
   bool IsAsyncOrGenerator() const {
-    return modifier() != RawFunction::kNoModifier;
+    return modifier() != FunctionLayout::kNoModifier;
   }
 
   bool IsTypedDataViewFactory() const {
-    if (is_native() && kind() == RawFunction::kConstructor) {
+    if (is_native() && kind() == FunctionLayout::kConstructor) {
       // This is a native factory constructor.
       const Class& klass = Class::Handle(Owner());
       return IsTypedDataViewClassId(klass.id());
@@ -3378,71 +3377,71 @@
   }
 
   DART_WARN_UNUSED_RESULT
-  RawError* VerifyCallEntryPoint() const;
+  ErrorPtr VerifyCallEntryPoint() const;
 
   DART_WARN_UNUSED_RESULT
-  RawError* VerifyClosurizedEntryPoint() const;
+  ErrorPtr VerifyClosurizedEntryPoint() const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawFunction));
+    return RoundedAllocationSize(sizeof(FunctionLayout));
   }
 
-  static RawFunction* New(const String& name,
-                          RawFunction::Kind kind,
-                          bool is_static,
-                          bool is_const,
-                          bool is_abstract,
-                          bool is_external,
-                          bool is_native,
-                          const Object& owner,
-                          TokenPosition token_pos,
-                          Heap::Space space = Heap::kOld);
+  static FunctionPtr New(const String& name,
+                         FunctionLayout::Kind kind,
+                         bool is_static,
+                         bool is_const,
+                         bool is_abstract,
+                         bool is_external,
+                         bool is_native,
+                         const Object& owner,
+                         TokenPosition token_pos,
+                         Heap::Space space = Heap::kOld);
 
   // Allocates a new Function object representing a closure function
   // with given kind - kClosureFunction or kImplicitClosureFunction.
-  static RawFunction* NewClosureFunctionWithKind(RawFunction::Kind kind,
-                                                 const String& name,
-                                                 const Function& parent,
-                                                 TokenPosition token_pos,
-                                                 const Object& owner);
+  static FunctionPtr NewClosureFunctionWithKind(FunctionLayout::Kind kind,
+                                                const String& name,
+                                                const Function& parent,
+                                                TokenPosition token_pos,
+                                                const Object& owner);
 
   // Allocates a new Function object representing a closure function.
-  static RawFunction* NewClosureFunction(const String& name,
-                                         const Function& parent,
-                                         TokenPosition token_pos);
+  static FunctionPtr NewClosureFunction(const String& name,
+                                        const Function& parent,
+                                        TokenPosition token_pos);
 
   // Allocates a new Function object representing an implicit closure function.
-  static RawFunction* NewImplicitClosureFunction(const String& name,
-                                                 const Function& parent,
-                                                 TokenPosition token_pos);
+  static FunctionPtr NewImplicitClosureFunction(const String& name,
+                                                const Function& parent,
+                                                TokenPosition token_pos);
 
   // Allocates a new Function object representing a signature function.
   // The owner is the scope class of the function type.
   // The parent is the enclosing function or null if none.
-  static RawFunction* NewSignatureFunction(const Object& owner,
-                                           const Function& parent,
-                                           TokenPosition token_pos,
-                                           Heap::Space space = Heap::kOld);
+  static FunctionPtr NewSignatureFunction(const Object& owner,
+                                          const Function& parent,
+                                          TokenPosition token_pos,
+                                          Heap::Space space = Heap::kOld);
 
-  static RawFunction* NewEvalFunction(const Class& owner,
-                                      const Script& script,
-                                      bool is_static);
+  static FunctionPtr NewEvalFunction(const Class& owner,
+                                     const Script& script,
+                                     bool is_static);
 
-  RawFunction* CreateMethodExtractor(const String& getter_name) const;
-  RawFunction* GetMethodExtractor(const String& getter_name) const;
+  FunctionPtr CreateMethodExtractor(const String& getter_name) const;
+  FunctionPtr GetMethodExtractor(const String& getter_name) const;
 
   static bool IsDynamicInvocationForwarderName(const String& name);
 
-  static RawString* DemangleDynamicInvocationForwarderName(const String& name);
+  static StringPtr DemangleDynamicInvocationForwarderName(const String& name);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  static RawString* CreateDynamicInvocationForwarderName(const String& name);
+  static StringPtr CreateDynamicInvocationForwarderName(const String& name);
 
-  RawFunction* CreateDynamicInvocationForwarder(
+  FunctionPtr CreateDynamicInvocationForwarder(
       const String& mangled_name) const;
 
-  RawFunction* GetDynamicInvocationForwarder(const String& mangled_name,
-                                             bool allow_add = true) const;
+  FunctionPtr GetDynamicInvocationForwarder(const String& mangled_name,
+                                            bool allow_add = true) const;
 #endif
 
   // Slow function, use in asserts to track changes in important library
@@ -3461,14 +3460,14 @@
   void RestoreICDataMap(ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data,
                         bool clone_ic_data) const;
 
-  RawArray* ic_data_array() const;
+  ArrayPtr ic_data_array() const;
   void ClearICDataArray() const;
-  RawICData* FindICData(intptr_t deopt_id) const;
+  ICDataPtr FindICData(intptr_t deopt_id) const;
 
   // Sets deopt reason in all ICData-s with given deopt_id.
   void SetDeoptReasonForAll(intptr_t deopt_id, ICData::DeoptReasonId reason);
 
-  void set_modifier(RawFunction::AsyncModifier value) const;
+  void set_modifier(FunctionLayout::AsyncModifier value) const;
 
 // 'WasCompiled' is true if the function was compiled once in this
 // VM instantiation. It is independent from presence of type feedback
@@ -3568,22 +3567,22 @@
   //              some functions known to be execute infrequently and functions
   //              which have been de-optimized too many times.
   bool is_optimizable() const {
-    return RawFunction::OptimizableBit::decode(raw_ptr()->packed_fields_);
+    return FunctionLayout::OptimizableBit::decode(raw_ptr()->packed_fields_);
   }
   void set_is_optimizable(bool value) const {
-    set_packed_fields(
-        RawFunction::OptimizableBit::update(value, raw_ptr()->packed_fields_));
+    set_packed_fields(FunctionLayout::OptimizableBit::update(
+        value, raw_ptr()->packed_fields_));
   }
 
   // Indicates whether this function can be optimized on the background compiler
   // thread.
   bool is_background_optimizable() const {
-    return RawFunction::BackgroundOptimizableBit::decode(
+    return FunctionLayout::BackgroundOptimizableBit::decode(
         raw_ptr()->packed_fields_);
   }
 
   void set_is_background_optimizable(bool value) const {
-    set_packed_fields(RawFunction::BackgroundOptimizableBit::update(
+    set_packed_fields(FunctionLayout::BackgroundOptimizableBit::update(
         value, raw_ptr()->packed_fields_));
   }
 
@@ -3610,10 +3609,10 @@
                  (1 << kRecognizedTagSize));
   COMPILE_ASSERT(kNumTagBits <=
                  (kBitsPerByte *
-                  sizeof(static_cast<RawFunction*>(0)->kind_tag_)));
+                  sizeof(static_cast<FunctionLayout*>(nullptr)->kind_tag_)));
 
   class KindBits : public BitField<uint32_t,
-                                   RawFunction::Kind,
+                                   FunctionLayout::Kind,
                                    kKindTagPos,
                                    kKindTagSize> {};
 
@@ -3622,7 +3621,7 @@
                                          kRecognizedTagPos,
                                          kRecognizedTagSize> {};
   class ModifierBits : public BitField<uint32_t,
-                                       RawFunction::AsyncModifier,
+                                       FunctionLayout::AsyncModifier,
                                        kModifierPos,
                                        kModifierSize> {};
 
@@ -3632,18 +3631,18 @@
 #undef DEFINE_BIT
 
   void set_name(const String& value) const;
-  void set_kind(RawFunction::Kind value) const;
+  void set_kind(FunctionLayout::Kind value) const;
   void set_parent_function(const Function& value) const;
-  RawFunction* implicit_closure_function() const;
+  FunctionPtr implicit_closure_function() const;
   void set_implicit_closure_function(const Function& value) const;
-  RawInstance* implicit_static_closure() const;
+  InstancePtr implicit_static_closure() const;
   void set_implicit_static_closure(const Instance& closure) const;
-  RawScript* eval_script() const;
+  ScriptPtr eval_script() const;
   void set_eval_script(const Script& value) const;
   void set_num_optional_parameters(intptr_t value) const;  // Encoded value.
   void set_kind_tag(uint32_t value) const;
   void set_data(const Object& value) const;
-  static RawFunction* New(Heap::Space space = Heap::kOld);
+  static FunctionPtr New(Heap::Space space = Heap::kOld);
 
   void PrintSignatureParameters(Thread* thread,
                                 Zone* zone,
@@ -3667,9 +3666,9 @@
   friend class Class;
   friend class SnapshotWriter;
   friend class Parser;  // For set_eval_script.
-  // RawFunction::VisitFunctionPointers accesses the private constructor of
+  // FunctionLayout::VisitFunctionPointers accesses the private constructor of
   // Function.
-  friend class RawFunction;
+  friend class FunctionLayout;
   friend class ClassFinalizer;  // To reset parent_function.
   friend class Type;            // To adjust parent_function.
 };
@@ -3677,25 +3676,25 @@
 class ClosureData : public Object {
  public:
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawClosureData));
+    return RoundedAllocationSize(sizeof(ClosureDataLayout));
   }
 
  private:
-  RawContextScope* context_scope() const { return raw_ptr()->context_scope_; }
+  ContextScopePtr context_scope() const { return raw_ptr()->context_scope_; }
   void set_context_scope(const ContextScope& value) const;
 
   // Enclosing function of this local function.
-  RawFunction* parent_function() const { return raw_ptr()->parent_function_; }
+  FunctionPtr parent_function() const { return raw_ptr()->parent_function_; }
   void set_parent_function(const Function& value) const;
 
   // Signature type of this closure function.
-  RawType* signature_type() const { return raw_ptr()->signature_type_; }
+  TypePtr signature_type() const { return raw_ptr()->signature_type_; }
   void set_signature_type(const Type& value) const;
 
-  RawInstance* implicit_static_closure() const { return raw_ptr()->closure_; }
+  InstancePtr implicit_static_closure() const { return raw_ptr()->closure_; }
   void set_implicit_static_closure(const Instance& closure) const;
 
-  static RawClosureData* New();
+  static ClosureDataPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object);
   friend class Class;
@@ -3706,19 +3705,19 @@
 class SignatureData : public Object {
  public:
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawSignatureData));
+    return RoundedAllocationSize(sizeof(SignatureDataLayout));
   }
 
  private:
   // Enclosing function of this signature function.
-  RawFunction* parent_function() const { return raw_ptr()->parent_function_; }
+  FunctionPtr parent_function() const { return raw_ptr()->parent_function_; }
   void set_parent_function(const Function& value) const;
 
   // Signature type of this signature function.
-  RawType* signature_type() const { return raw_ptr()->signature_type_; }
+  TypePtr signature_type() const { return raw_ptr()->signature_type_; }
   void set_signature_type(const Type& value) const;
 
-  static RawSignatureData* New(Heap::Space space = Heap::kOld);
+  static SignatureDataPtr New(Heap::Space space = Heap::kOld);
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(SignatureData, Object);
   friend class Class;
@@ -3729,23 +3728,23 @@
 class RedirectionData : public Object {
  public:
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawRedirectionData));
+    return RoundedAllocationSize(sizeof(RedirectionDataLayout));
   }
 
  private:
   // The type specifies the class and type arguments of the target constructor.
-  RawType* type() const { return raw_ptr()->type_; }
+  TypePtr type() const { return raw_ptr()->type_; }
   void set_type(const Type& value) const;
 
   // The optional identifier specifies a named constructor.
-  RawString* identifier() const { return raw_ptr()->identifier_; }
+  StringPtr identifier() const { return raw_ptr()->identifier_; }
   void set_identifier(const String& value) const;
 
   // The resolved constructor or factory target of the redirection.
-  RawFunction* target() const { return raw_ptr()->target_; }
+  FunctionPtr target() const { return raw_ptr()->target_; }
   void set_target(const Function& value) const;
 
-  static RawRedirectionData* New();
+  static RedirectionDataPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(RedirectionData, Object);
   friend class Class;
@@ -3764,21 +3763,21 @@
 class FfiTrampolineData : public Object {
  public:
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawFfiTrampolineData));
+    return RoundedAllocationSize(sizeof(FfiTrampolineDataLayout));
   }
 
  private:
   // Signature type of this closure function.
-  RawType* signature_type() const { return raw_ptr()->signature_type_; }
+  TypePtr signature_type() const { return raw_ptr()->signature_type_; }
   void set_signature_type(const Type& value) const;
 
-  RawFunction* c_signature() const { return raw_ptr()->c_signature_; }
+  FunctionPtr c_signature() const { return raw_ptr()->c_signature_; }
   void set_c_signature(const Function& value) const;
 
-  RawFunction* callback_target() const { return raw_ptr()->callback_target_; }
+  FunctionPtr callback_target() const { return raw_ptr()->callback_target_; }
   void set_callback_target(const Function& value) const;
 
-  RawInstance* callback_exceptional_return() const {
+  InstancePtr callback_exceptional_return() const {
     return raw_ptr()->callback_exceptional_return_;
   }
   void set_callback_exceptional_return(const Instance& value) const;
@@ -3786,7 +3785,7 @@
   int32_t callback_id() const { return raw_ptr()->callback_id_; }
   void set_callback_id(int32_t value) const;
 
-  static RawFfiTrampolineData* New();
+  static FfiTrampolineDataPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(FfiTrampolineData, Object);
   friend class Class;
@@ -3799,7 +3798,7 @@
   // The field that this field was cloned from, or this field itself if it isn't
   // a clone. The purpose of cloning is that the fields the background compiler
   // sees are consistent.
-  RawField* Original() const;
+  FieldPtr Original() const;
 
   // Set the original field that this field was cloned from.
   void SetOriginal(const Field& value) const;
@@ -3815,12 +3814,12 @@
 
   // Returns a field cloned from 'this'. 'this' is set as the
   // original field of result.
-  RawField* CloneFromOriginal() const;
+  FieldPtr CloneFromOriginal() const;
 
-  RawString* name() const { return raw_ptr()->name_; }
-  RawString* UserVisibleName() const;  // Same as scrubbed name.
+  StringPtr name() const { return raw_ptr()->name_; }
+  StringPtr UserVisibleName() const;  // Same as scrubbed name.
   const char* UserVisibleNameCString() const;
-  virtual RawString* DictionaryName() const { return name(); }
+  virtual StringPtr DictionaryName() const { return name(); }
 
   bool is_static() const { return StaticBit::decode(raw_ptr()->kind_bits_); }
   bool is_instance() const { return !is_static(); }
@@ -3884,13 +3883,13 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   intptr_t binary_declaration_offset() const {
-    return RawField::BinaryDeclarationOffset::decode(
+    return FieldLayout::BinaryDeclarationOffset::decode(
         raw_ptr()->binary_declaration_);
   }
   void set_binary_declaration_offset(intptr_t value) const {
     ASSERT(value >= 0);
     StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    RawField::BinaryDeclarationOffset::update(
+                    FieldLayout::BinaryDeclarationOffset::update(
                         value, raw_ptr()->binary_declaration_));
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -3935,7 +3934,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     return false;
 #else
-    return RawField::IsDeclaredInBytecode::decode(
+    return FieldLayout::IsDeclaredInBytecode::decode(
         raw_ptr()->binary_declaration_);
 #endif
   }
@@ -3943,14 +3942,14 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
   void set_is_declared_in_bytecode(bool value) const {
     StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    RawField::IsDeclaredInBytecode::update(
+                    FieldLayout::IsDeclaredInBytecode::update(
                         value, raw_ptr()->binary_declaration_));
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   void InheritBinaryDeclarationFrom(const Field& src) const;
 
-  RawExternalTypedData* KernelData() const;
+  ExternalTypedDataPtr KernelData() const;
 
   intptr_t KernelDataProgramOffset() const;
 
@@ -3962,7 +3961,7 @@
 
   inline intptr_t TargetOffset() const;
 
-  inline RawInstance* StaticValue() const;
+  inline InstancePtr StaticValue() const;
   void SetStaticValue(const Instance& value,
                       bool save_initial_value = false) const;
 
@@ -3970,59 +3969,61 @@
   inline void set_field_id(intptr_t field_id) const;
 
 #ifndef DART_PRECOMPILED_RUNTIME
-  RawInstance* saved_initial_value() const {
+  InstancePtr saved_initial_value() const {
     return raw_ptr()->saved_initial_value_;
   }
   inline void set_saved_initial_value(const Instance& value) const;
 #endif
 
-  RawClass* Owner() const;
-  RawClass* Origin() const;  // Either mixin class, or same as owner().
-  RawScript* Script() const;
-  RawObject* RawOwner() const;
+  ClassPtr Owner() const;
+  ClassPtr Origin() const;  // Either mixin class, or same as owner().
+  ScriptPtr Script() const;
+  ObjectPtr RawOwner() const;
 
-  RawAbstractType* type() const { return raw_ptr()->type_; }
+  AbstractTypePtr type() const { return raw_ptr()->type_; }
   // Used by class finalizer, otherwise initialized in constructor.
   void SetFieldType(const AbstractType& value) const;
 
   DART_WARN_UNUSED_RESULT
-  RawError* VerifyEntryPoint(EntryPointPragma kind) const;
+  ErrorPtr VerifyEntryPoint(EntryPointPragma kind) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawField));
+    return RoundedAllocationSize(sizeof(FieldLayout));
   }
 
-  static RawField* New(const String& name,
-                       bool is_static,
-                       bool is_final,
-                       bool is_const,
-                       bool is_reflectable,
-                       bool is_late,
-                       const Object& owner,
-                       const AbstractType& type,
-                       TokenPosition token_pos,
-                       TokenPosition end_token_pos);
+  static FieldPtr New(const String& name,
+                      bool is_static,
+                      bool is_final,
+                      bool is_const,
+                      bool is_reflectable,
+                      bool is_late,
+                      const Object& owner,
+                      const AbstractType& type,
+                      TokenPosition token_pos,
+                      TokenPosition end_token_pos);
 
-  static RawField* NewTopLevel(const String& name,
-                               bool is_final,
-                               bool is_const,
-                               bool is_late,
-                               const Object& owner,
-                               TokenPosition token_pos,
-                               TokenPosition end_token_pos);
+  static FieldPtr NewTopLevel(const String& name,
+                              bool is_final,
+                              bool is_const,
+                              bool is_late,
+                              const Object& owner,
+                              TokenPosition token_pos,
+                              TokenPosition end_token_pos);
 
   // Allocate new field object, clone values from this field. The
   // original is specified.
-  RawField* Clone(const Field& original) const;
+  FieldPtr Clone(const Field& original) const;
 
-  static intptr_t kind_bits_offset() { return OFFSET_OF(RawField, kind_bits_); }
+  static intptr_t kind_bits_offset() {
+    return OFFSET_OF(FieldLayout, kind_bits_);
+  }
 
   TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
   TokenPosition end_token_pos() const { return raw_ptr()->end_token_pos_; }
 
   int32_t SourceFingerprint() const;
 
-  RawString* InitializingExpression() const;
+  StringPtr InitializingExpression() const;
 
   bool has_nontrivial_initializer() const {
     return HasNontrivialInitializerBit::decode(raw_ptr()->kind_bits_);
@@ -4070,10 +4071,10 @@
   }
 
   static intptr_t static_type_exactness_state_offset() {
-    return OFFSET_OF(RawField, static_type_exactness_state_);
+    return OFFSET_OF(FieldLayout, static_type_exactness_state_);
   }
 
-  static inline intptr_t TargetOffsetOf(const RawField* field) {
+  static inline intptr_t TargetOffsetOf(const FieldPtr field) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
     return field->ptr()->target_offset_;
 #else
@@ -4106,7 +4107,7 @@
     StoreNonPointer(&raw_ptr()->guarded_cid_, cid);
   }
   static intptr_t guarded_cid_offset() {
-    return OFFSET_OF(RawField, guarded_cid_);
+    return OFFSET_OF(FieldLayout, guarded_cid_);
   }
   // Return the list length that any list stored in this field is guaranteed
   // to have. If length is kUnknownFixedLength the length has not
@@ -4115,12 +4116,12 @@
   intptr_t guarded_list_length() const;
   void set_guarded_list_length(intptr_t list_length) const;
   static intptr_t guarded_list_length_offset() {
-    return OFFSET_OF(RawField, guarded_list_length_);
+    return OFFSET_OF(FieldLayout, guarded_list_length_);
   }
   intptr_t guarded_list_length_in_object_offset() const;
   void set_guarded_list_length_in_object_offset(intptr_t offset) const;
   static intptr_t guarded_list_length_in_object_offset_offset() {
-    return OFFSET_OF(RawField, guarded_list_length_in_object_offset_);
+    return OFFSET_OF(FieldLayout, guarded_list_length_in_object_offset_);
   }
 
   bool needs_length_check() const {
@@ -4186,7 +4187,7 @@
     StoreNonPointer(&raw_ptr()->is_nullable_, val ? kNullCid : kIllegalCid);
   }
   static intptr_t is_nullable_offset() {
-    return OFFSET_OF(RawField, is_nullable_);
+    return OFFSET_OF(FieldLayout, is_nullable_);
   }
 
   // Record store of the given value into this field. May trigger
@@ -4199,7 +4200,7 @@
   // assumptions about guarded class id and nullability of this field.
   // These code objects must be deoptimized when field's properties change.
   // Code objects are held weakly via an indirection through WeakProperty.
-  RawArray* dependent_code() const;
+  ArrayPtr dependent_code() const;
   void set_dependent_code(const Array& array) const;
 
   // Add the given code object to the list of dependent ones.
@@ -4215,15 +4216,15 @@
   bool IsUninitialized() const;
 
   // Run initializer and set field value.
-  DART_WARN_UNUSED_RESULT RawError* InitializeInstance(
-      const Instance& instance) const;
-  DART_WARN_UNUSED_RESULT RawError* InitializeStatic() const;
+  DART_WARN_UNUSED_RESULT ErrorPtr
+  InitializeInstance(const Instance& instance) const;
+  DART_WARN_UNUSED_RESULT ErrorPtr InitializeStatic() const;
 
   // Run initializer only.
-  DART_WARN_UNUSED_RESULT RawObject* EvaluateInitializer() const;
+  DART_WARN_UNUSED_RESULT ObjectPtr EvaluateInitializer() const;
 
-  RawFunction* EnsureInitializerFunction() const;
-  RawFunction* InitializerFunction() const {
+  FunctionPtr EnsureInitializerFunction() const;
+  FunctionPtr InitializerFunction() const {
     return raw_ptr()->initializer_function_;
   }
   void SetInitializerFunction(const Function& initializer) const;
@@ -4231,28 +4232,28 @@
 
   // For static fields only. Constructs a closure that gets/sets the
   // field value.
-  RawInstance* GetterClosure() const;
-  RawInstance* SetterClosure() const;
-  RawInstance* AccessorClosure(bool make_setter) const;
+  InstancePtr GetterClosure() const;
+  InstancePtr SetterClosure() const;
+  InstancePtr AccessorClosure(bool make_setter) const;
 
   // Constructs getter and setter names for fields and vice versa.
-  static RawString* GetterName(const String& field_name);
-  static RawString* GetterSymbol(const String& field_name);
+  static StringPtr GetterName(const String& field_name);
+  static StringPtr GetterSymbol(const String& field_name);
   // Returns String::null() if getter symbol does not exist.
-  static RawString* LookupGetterSymbol(const String& field_name);
-  static RawString* SetterName(const String& field_name);
-  static RawString* SetterSymbol(const String& field_name);
+  static StringPtr LookupGetterSymbol(const String& field_name);
+  static StringPtr SetterName(const String& field_name);
+  static StringPtr SetterSymbol(const String& field_name);
   // Returns String::null() if setter symbol does not exist.
-  static RawString* LookupSetterSymbol(const String& field_name);
-  static RawString* NameFromGetter(const String& getter_name);
-  static RawString* NameFromSetter(const String& setter_name);
-  static RawString* NameFromInit(const String& init_name);
+  static StringPtr LookupSetterSymbol(const String& field_name);
+  static StringPtr NameFromGetter(const String& getter_name);
+  static StringPtr NameFromSetter(const String& setter_name);
+  static StringPtr NameFromInit(const String& init_name);
   static bool IsGetterName(const String& function_name);
   static bool IsSetterName(const String& function_name);
   static bool IsInitName(const String& function_name);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  RawSubtypeTestCache* type_test_cache() const {
+  SubtypeTestCachePtr type_test_cache() const {
     return raw_ptr()->type_test_cache_;
   }
   void set_type_test_cache(const SubtypeTestCache& cache) const;
@@ -4358,29 +4359,29 @@
     StoreNonPointer(&raw_ptr()->kind_bits_, value);
   }
 
-  static RawField* New();
+  static FieldPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Field, Object);
   friend class Class;
   friend class HeapProfiler;
-  friend class RawField;
+  friend class FieldLayout;
   friend class FieldSerializationCluster;
   friend class FieldDeserializationCluster;
 };
 
 class Script : public Object {
  public:
-  RawString* url() const { return raw_ptr()->url_; }
+  StringPtr url() const { return raw_ptr()->url_; }
   void set_url(const String& value) const;
 
   // The actual url which was loaded from disk, if provided by the embedder.
-  RawString* resolved_url() const { return raw_ptr()->resolved_url_; }
+  StringPtr resolved_url() const { return raw_ptr()->resolved_url_; }
   bool HasSource() const;
-  RawString* Source() const;
+  StringPtr Source() const;
   bool IsPartOfDartColonLibrary() const;
 
   void LookupSourceAndLineStarts(Zone* zone) const;
-  RawGrowableObjectArray* GenerateLineNumberArray() const;
+  GrowableObjectArrayPtr GenerateLineNumberArray() const;
 
   intptr_t line_offset() const { return raw_ptr()->line_offset_; }
   intptr_t col_offset() const { return raw_ptr()->col_offset_; }
@@ -4388,12 +4389,12 @@
   // The load time in milliseconds since epoch.
   int64_t load_timestamp() const { return raw_ptr()->load_timestamp_; }
 
-  RawArray* compile_time_constants() const {
+  ArrayPtr compile_time_constants() const {
     return raw_ptr()->compile_time_constants_;
   }
   void set_compile_time_constants(const Array& value) const;
 
-  RawKernelProgramInfo* kernel_program_info() const {
+  KernelProgramInfoPtr kernel_program_info() const {
     return raw_ptr()->kernel_program_info_;
   }
   void set_kernel_program_info(const KernelProgramInfo& info) const;
@@ -4403,22 +4404,21 @@
   }
   void set_kernel_script_index(const intptr_t kernel_script_index) const;
 
-  RawTypedData* kernel_string_offsets() const;
+  TypedDataPtr kernel_string_offsets() const;
 
-  RawTypedData* line_starts() const;
+  TypedDataPtr line_starts() const;
 
   void set_line_starts(const TypedData& value) const;
 
   void set_debug_positions(const Array& value) const;
 
-  RawLibrary* FindLibrary() const;
-  RawString* GetLine(intptr_t line_number,
-                     Heap::Space space = Heap::kNew) const;
-  RawString* GetSnippet(TokenPosition from, TokenPosition to) const;
-  RawString* GetSnippet(intptr_t from_line,
-                        intptr_t from_column,
-                        intptr_t to_line,
-                        intptr_t to_column) const;
+  LibraryPtr FindLibrary() const;
+  StringPtr GetLine(intptr_t line_number, Heap::Space space = Heap::kNew) const;
+  StringPtr GetSnippet(TokenPosition from, TokenPosition to) const;
+  StringPtr GetSnippet(intptr_t from_line,
+                       intptr_t from_column,
+                       intptr_t to_line,
+                       intptr_t to_column) const;
 
   void SetLocationOffset(intptr_t line_offset, intptr_t col_offset) const;
 
@@ -4437,14 +4437,14 @@
                         TokenPosition* last_token_index) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawScript));
+    return RoundedAllocationSize(sizeof(ScriptLayout));
   }
 
-  static RawScript* New(const String& url, const String& source);
+  static ScriptPtr New(const String& url, const String& source);
 
-  static RawScript* New(const String& url,
-                        const String& resolved_url,
-                        const String& source);
+  static ScriptPtr New(const String& url,
+                       const String& resolved_url,
+                       const String& source);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   void LoadSourceFromKernel(const uint8_t* kernel_buffer,
@@ -4459,9 +4459,9 @@
   void set_source(const String& value) const;
   void set_flags(uint8_t value) const;
   void set_load_timestamp(int64_t value) const;
-  RawArray* debug_positions() const;
+  ArrayPtr debug_positions() const;
 
-  static RawScript* New();
+  static ScriptPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Script, Object);
   friend class Class;
@@ -4475,7 +4475,7 @@
   bool HasNext() const { return next_ix_ < size_; }
 
   // Returns next non-null raw object.
-  RawObject* GetNext();
+  ObjectPtr GetNext();
 
  private:
   void MoveToNextObject();
@@ -4506,7 +4506,7 @@
   }
 
   // Returns a non-null raw class.
-  RawClass* GetNextClass();
+  ClassPtr GetNextClass();
 
  private:
   void MoveToNextClass();
@@ -4519,7 +4519,7 @@
 class LibraryPrefixIterator : public DictionaryIterator {
  public:
   explicit LibraryPrefixIterator(const Library& library);
-  RawLibraryPrefix* GetNext();
+  LibraryPrefixPtr GetNext();
 
  private:
   void Advance();
@@ -4528,51 +4528,53 @@
 
 class Library : public Object {
  public:
-  RawString* name() const { return raw_ptr()->name_; }
+  StringPtr name() const { return raw_ptr()->name_; }
   void SetName(const String& name) const;
 
-  RawString* url() const { return raw_ptr()->url_; }
-  RawString* private_key() const { return raw_ptr()->private_key_; }
+  StringPtr url() const { return raw_ptr()->url_; }
+  StringPtr private_key() const { return raw_ptr()->private_key_; }
   bool LoadNotStarted() const {
-    return raw_ptr()->load_state_ == RawLibrary::kAllocated;
+    return raw_ptr()->load_state_ == LibraryLayout::kAllocated;
   }
   bool LoadRequested() const {
-    return raw_ptr()->load_state_ == RawLibrary::kLoadRequested;
+    return raw_ptr()->load_state_ == LibraryLayout::kLoadRequested;
   }
   bool LoadInProgress() const {
-    return raw_ptr()->load_state_ == RawLibrary::kLoadInProgress;
+    return raw_ptr()->load_state_ == LibraryLayout::kLoadInProgress;
   }
   void SetLoadRequested() const;
   void SetLoadInProgress() const;
-  bool Loaded() const { return raw_ptr()->load_state_ == RawLibrary::kLoaded; }
+  bool Loaded() const {
+    return raw_ptr()->load_state_ == LibraryLayout::kLoaded;
+  }
   void SetLoaded() const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawLibrary));
+    return RoundedAllocationSize(sizeof(LibraryLayout));
   }
 
-  static RawLibrary* New(const String& url);
+  static LibraryPtr New(const String& url);
 
-  RawObject* Invoke(const String& selector,
-                    const Array& arguments,
-                    const Array& argument_names,
-                    bool respect_reflectable = true,
-                    bool check_is_entrypoint = false) const;
-  RawObject* InvokeGetter(const String& selector,
-                          bool throw_nsm_if_absent,
-                          bool respect_reflectable = true,
-                          bool check_is_entrypoint = false) const;
-  RawObject* InvokeSetter(const String& selector,
-                          const Instance& argument,
-                          bool respect_reflectable = true,
-                          bool check_is_entrypoint = false) const;
+  ObjectPtr Invoke(const String& selector,
+                   const Array& arguments,
+                   const Array& argument_names,
+                   bool respect_reflectable = true,
+                   bool check_is_entrypoint = false) const;
+  ObjectPtr InvokeGetter(const String& selector,
+                         bool throw_nsm_if_absent,
+                         bool respect_reflectable = true,
+                         bool check_is_entrypoint = false) const;
+  ObjectPtr InvokeSetter(const String& selector,
+                         const Instance& argument,
+                         bool respect_reflectable = true,
+                         bool check_is_entrypoint = false) const;
 
   // Evaluate the given expression as if it appeared in an top-level method of
   // this library and return the resulting value, or an error object if
   // evaluating the expression fails. The method has the formal (type)
   // parameters given in (type_)param_names, and is invoked with the (type)
   // argument values given in (type_)param_values.
-  RawObject* EvaluateCompiledExpression(
+  ObjectPtr EvaluateCompiledExpression(
       const ExternalTypedData& kernel_buffer,
       const Array& type_definitions,
       const Array& param_values,
@@ -4585,20 +4587,20 @@
   // more regular.
   void AddClass(const Class& cls) const;
   void AddObject(const Object& obj, const String& name) const;
-  RawObject* LookupReExport(const String& name,
-                            ZoneGrowableArray<intptr_t>* visited = NULL) const;
-  RawObject* LookupObjectAllowPrivate(const String& name) const;
-  RawObject* LookupLocalOrReExportObject(const String& name) const;
-  RawObject* LookupImportedObject(const String& name) const;
-  RawClass* LookupClass(const String& name) const;
-  RawClass* LookupClassAllowPrivate(const String& name) const;
-  RawClass* SlowLookupClassAllowMultiPartPrivate(const String& name) const;
-  RawClass* LookupLocalClass(const String& name) const;
-  RawField* LookupFieldAllowPrivate(const String& name) const;
-  RawField* LookupLocalField(const String& name) const;
-  RawFunction* LookupFunctionAllowPrivate(const String& name) const;
-  RawFunction* LookupLocalFunction(const String& name) const;
-  RawLibraryPrefix* LookupLocalLibraryPrefix(const String& name) const;
+  ObjectPtr LookupReExport(const String& name,
+                           ZoneGrowableArray<intptr_t>* visited = NULL) const;
+  ObjectPtr LookupObjectAllowPrivate(const String& name) const;
+  ObjectPtr LookupLocalOrReExportObject(const String& name) const;
+  ObjectPtr LookupImportedObject(const String& name) const;
+  ClassPtr LookupClass(const String& name) const;
+  ClassPtr LookupClassAllowPrivate(const String& name) const;
+  ClassPtr SlowLookupClassAllowMultiPartPrivate(const String& name) const;
+  ClassPtr LookupLocalClass(const String& name) const;
+  FieldPtr LookupFieldAllowPrivate(const String& name) const;
+  FieldPtr LookupLocalField(const String& name) const;
+  FunctionPtr LookupFunctionAllowPrivate(const String& name) const;
+  FunctionPtr LookupLocalFunction(const String& name) const;
+  LibraryPrefixPtr LookupLocalLibraryPrefix(const String& name) const;
 
   // Look up a Script based on a url. If 'useResolvedUri' is not provided or is
   // false, 'url' should have a 'dart:' scheme for Dart core libraries,
@@ -4606,8 +4608,8 @@
   //
   // If 'useResolvedUri' is true, 'url' should have a 'org-dartlang-sdk:' scheme
   // for Dart core libraries and a 'file:' scheme otherwise.
-  RawScript* LookupScript(const String& url, bool useResolvedUri = false) const;
-  RawArray* LoadedScripts() const;
+  ScriptPtr LookupScript(const String& url, bool useResolvedUri = false) const;
+  ArrayPtr LoadedScripts() const;
 
   // Resolve name in the scope of this library. First check the cache
   // of already resolved names for this library. Then look in the
@@ -4616,7 +4618,7 @@
   // If the local dictionary contains no entry for these names,
   // look in the scopes of all libraries that are imported
   // without a library prefix.
-  RawObject* ResolveName(const String& name) const;
+  ObjectPtr ResolveName(const String& name) const;
 
   void AddAnonymousClass(const Class& cls) const;
 
@@ -4644,8 +4646,8 @@
   void CloneMetadataFrom(const Library& from_library,
                          const Function& from_fun,
                          const Function& to_fun) const;
-  RawObject* GetMetadata(const Object& obj) const;
-  RawArray* GetExtendedMetadata(const Object& obj, intptr_t count) const;
+  ObjectPtr GetMetadata(const Object& obj) const;
+  ArrayPtr GetExtendedMetadata(const Object& obj, intptr_t count) const;
 
   // Tries to finds a @pragma annotation on [object].
   //
@@ -4663,20 +4665,20 @@
                          const String& pragma_name,
                          Object* options);
 
-  RawClass* toplevel_class() const { return raw_ptr()->toplevel_class_; }
+  ClassPtr toplevel_class() const { return raw_ptr()->toplevel_class_; }
   void set_toplevel_class(const Class& value) const;
 
-  RawGrowableObjectArray* used_scripts() const {
+  GrowableObjectArrayPtr used_scripts() const {
     return raw_ptr()->used_scripts_;
   }
 
   // Library imports.
-  RawArray* imports() const { return raw_ptr()->imports_; }
-  RawArray* exports() const { return raw_ptr()->exports_; }
+  ArrayPtr imports() const { return raw_ptr()->imports_; }
+  ArrayPtr exports() const { return raw_ptr()->exports_; }
   void AddImport(const Namespace& ns) const;
   intptr_t num_imports() const { return raw_ptr()->num_imports_; }
-  RawNamespace* ImportAt(intptr_t index) const;
-  RawLibrary* ImportLibraryAt(intptr_t index) const;
+  NamespacePtr ImportAt(intptr_t index) const;
+  LibraryPtr ImportLibraryAt(intptr_t index) const;
 
   void DropDependenciesAndCaches() const;
 
@@ -4697,17 +4699,18 @@
   }
 
   bool is_in_fullsnapshot() const {
-    return RawLibrary::InFullSnapshotBit::decode(raw_ptr()->flags_);
+    return LibraryLayout::InFullSnapshotBit::decode(raw_ptr()->flags_);
   }
   void set_is_in_fullsnapshot(bool value) const {
-    set_flags(RawLibrary::InFullSnapshotBit::update(value, raw_ptr()->flags_));
+    set_flags(
+        LibraryLayout::InFullSnapshotBit::update(value, raw_ptr()->flags_));
   }
 
   bool is_nnbd() const {
-    return RawLibrary::NnbdBit::decode(raw_ptr()->flags_);
+    return LibraryLayout::NnbdBit::decode(raw_ptr()->flags_);
   }
   void set_is_nnbd(bool value) const {
-    set_flags(RawLibrary::NnbdBit::update(value, raw_ptr()->flags_));
+    set_flags(LibraryLayout::NnbdBit::update(value, raw_ptr()->flags_));
   }
 
   NNBDMode nnbd_mode() const {
@@ -4716,14 +4719,14 @@
 
   NNBDCompiledMode nnbd_compiled_mode() const {
     return static_cast<NNBDCompiledMode>(
-        RawLibrary::NnbdCompiledModeBits::decode(raw_ptr()->flags_));
+        LibraryLayout::NnbdCompiledModeBits::decode(raw_ptr()->flags_));
   }
   void set_nnbd_compiled_mode(NNBDCompiledMode value) const {
-    set_flags(RawLibrary::NnbdCompiledModeBits::update(
+    set_flags(LibraryLayout::NnbdCompiledModeBits::update(
         static_cast<uint8_t>(value), raw_ptr()->flags_));
   }
 
-  RawString* PrivateName(const String& name) const;
+  StringPtr PrivateName(const String& name) const;
 
   intptr_t index() const { return raw_ptr()->index_; }
   void set_index(intptr_t value) const {
@@ -4735,17 +4738,17 @@
                                 const GrowableObjectArray& libs);
 
   bool IsDebuggable() const {
-    return RawLibrary::DebuggableBit::decode(raw_ptr()->flags_);
+    return LibraryLayout::DebuggableBit::decode(raw_ptr()->flags_);
   }
   void set_debuggable(bool value) const {
-    set_flags(RawLibrary::DebuggableBit::update(value, raw_ptr()->flags_));
+    set_flags(LibraryLayout::DebuggableBit::update(value, raw_ptr()->flags_));
   }
 
   bool is_dart_scheme() const {
-    return RawLibrary::DartSchemeBit::decode(raw_ptr()->flags_);
+    return LibraryLayout::DartSchemeBit::decode(raw_ptr()->flags_);
   }
   void set_is_dart_scheme(bool value) const {
-    set_flags(RawLibrary::DartSchemeBit::update(value, raw_ptr()->flags_));
+    set_flags(LibraryLayout::DartSchemeBit::update(value, raw_ptr()->flags_));
   }
 
   // Includes 'dart:async', 'dart:typed_data', etc.
@@ -4753,18 +4756,18 @@
 
   inline intptr_t UrlHash() const;
 
-  RawExternalTypedData* kernel_data() const { return raw_ptr()->kernel_data_; }
+  ExternalTypedDataPtr kernel_data() const { return raw_ptr()->kernel_data_; }
   void set_kernel_data(const ExternalTypedData& data) const;
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   intptr_t binary_declaration_offset() const {
-    return RawLibrary::BinaryDeclarationOffset::decode(
+    return LibraryLayout::BinaryDeclarationOffset::decode(
         raw_ptr()->binary_declaration_);
   }
   void set_binary_declaration_offset(intptr_t value) const {
     ASSERT(value >= 0);
     StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    RawLibrary::BinaryDeclarationOffset::update(
+                    LibraryLayout::BinaryDeclarationOffset::update(
                         value, raw_ptr()->binary_declaration_));
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -4809,7 +4812,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     return false;
 #else
-    return RawLibrary::IsDeclaredInBytecode::decode(
+    return LibraryLayout::IsDeclaredInBytecode::decode(
         raw_ptr()->binary_declaration_);
 #endif
   }
@@ -4817,42 +4820,42 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
   void set_is_declared_in_bytecode(bool value) const {
     StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    RawLibrary::IsDeclaredInBytecode::update(
+                    LibraryLayout::IsDeclaredInBytecode::update(
                         value, raw_ptr()->binary_declaration_));
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-  static RawLibrary* LookupLibrary(Thread* thread, const String& url);
-  static RawLibrary* GetLibrary(intptr_t index);
+  static LibraryPtr LookupLibrary(Thread* thread, const String& url);
+  static LibraryPtr GetLibrary(intptr_t index);
 
   static void InitCoreLibrary(Isolate* isolate);
   static void InitNativeWrappersLibrary(Isolate* isolate, bool is_kernel_file);
 
-  static RawLibrary* AsyncLibrary();
-  static RawLibrary* ConvertLibrary();
-  static RawLibrary* CoreLibrary();
-  static RawLibrary* CollectionLibrary();
-  static RawLibrary* DeveloperLibrary();
-  static RawLibrary* FfiLibrary();
-  static RawLibrary* InternalLibrary();
-  static RawLibrary* IsolateLibrary();
-  static RawLibrary* MathLibrary();
+  static LibraryPtr AsyncLibrary();
+  static LibraryPtr ConvertLibrary();
+  static LibraryPtr CoreLibrary();
+  static LibraryPtr CollectionLibrary();
+  static LibraryPtr DeveloperLibrary();
+  static LibraryPtr FfiLibrary();
+  static LibraryPtr InternalLibrary();
+  static LibraryPtr IsolateLibrary();
+  static LibraryPtr MathLibrary();
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  static RawLibrary* MirrorsLibrary();
+  static LibraryPtr MirrorsLibrary();
 #endif
-  static RawLibrary* NativeWrappersLibrary();
-  static RawLibrary* ProfilerLibrary();
-  static RawLibrary* TypedDataLibrary();
-  static RawLibrary* VMServiceLibrary();
-  static RawLibrary* WasmLibrary();
+  static LibraryPtr NativeWrappersLibrary();
+  static LibraryPtr ProfilerLibrary();
+  static LibraryPtr TypedDataLibrary();
+  static LibraryPtr VMServiceLibrary();
+  static LibraryPtr WasmLibrary();
 
   // Eagerly compile all classes and functions in the library.
-  static RawError* CompileAll(bool ignore_error = false);
+  static ErrorPtr CompileAll(bool ignore_error = false);
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // Finalize all classes in all libraries.
-  static RawError* FinalizeAllClasses();
+  static ErrorPtr FinalizeAllClasses();
   // Eagerly read all bytecode.
-  static RawError* ReadAllBytecode();
+  static ErrorPtr ReadAllBytecode();
 #endif
 
 #if defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME)
@@ -4871,12 +4874,12 @@
 
   // Lookup class in the core lib which also contains various VM
   // helper methods and classes. Allow look up of private classes.
-  static RawClass* LookupCoreClass(const String& class_name);
+  static ClassPtr LookupCoreClass(const String& class_name);
 
   // Return Function::null() if function does not exist in libs.
-  static RawFunction* GetFunction(const GrowableArray<Library*>& libs,
-                                  const char* class_name,
-                                  const char* function_name);
+  static FunctionPtr GetFunction(const GrowableArray<Library*>& libs,
+                                 const char* class_name,
+                                 const char* function_name);
 
   // Character used to indicate a private identifier.
   static const char kPrivateIdentifierStart = '_';
@@ -4891,7 +4894,7 @@
   // Returns a closure of top level function 'name' in the exported namespace
   // of this library. If a top level function 'name' does not exist we look
   // for a top level getter 'name' that returns a closure.
-  RawObject* GetFunctionClosure(const String& name) const;
+  ObjectPtr GetFunctionClosure(const String& name) const;
 
   // Ensures that all top-level functions and variables (fields) are loaded.
   void EnsureTopLevelClassIsFinalized() const;
@@ -4900,7 +4903,7 @@
   static const int kInitialImportsCapacity = 4;
   static const int kImportsCapacityIncrement = 8;
 
-  static RawLibrary* New();
+  static LibraryPtr New();
 
   // These methods are only used by the Precompiler to obfuscate
   // the name and url.
@@ -4910,13 +4913,13 @@
   void set_num_imports(intptr_t value) const;
   void set_flags(uint8_t flags) const;
   bool HasExports() const;
-  RawArray* loaded_scripts() const { return raw_ptr()->loaded_scripts_; }
-  RawGrowableObjectArray* metadata() const { return raw_ptr()->metadata_; }
+  ArrayPtr loaded_scripts() const { return raw_ptr()->loaded_scripts_; }
+  GrowableObjectArrayPtr metadata() const { return raw_ptr()->metadata_; }
   void set_metadata(const GrowableObjectArray& value) const;
-  RawArray* dictionary() const { return raw_ptr()->dictionary_; }
+  ArrayPtr dictionary() const { return raw_ptr()->dictionary_; }
   void InitClassDictionary() const;
 
-  RawArray* resolved_names() const { return raw_ptr()->resolved_names_; }
+  ArrayPtr resolved_names() const { return raw_ptr()->resolved_names_; }
   bool LookupResolvedNamesCache(const String& name, Object* obj) const;
   void AddToResolvedNamesCache(const String& name, const Object& obj) const;
   void InitResolvedNamesCache() const;
@@ -4924,7 +4927,7 @@
   void InvalidateResolvedName(const String& name) const;
   void InvalidateResolvedNamesCache() const;
 
-  RawArray* exported_names() const { return raw_ptr()->exported_names_; }
+  ArrayPtr exported_names() const { return raw_ptr()->exported_names_; }
   bool LookupExportedNamesCache(const String& name, Object* obj) const;
   void AddToExportedNamesCache(const String& name, const Object& obj) const;
   void InitExportedNamesCache() const;
@@ -4933,15 +4936,15 @@
 
   void InitImportList() const;
   void RehashDictionary(const Array& old_dict, intptr_t new_dict_size) const;
-  static RawLibrary* NewLibraryHelper(const String& url, bool import_core_lib);
-  RawObject* LookupEntry(const String& name, intptr_t* index) const;
-  RawObject* LookupLocalObjectAllowPrivate(const String& name) const;
-  RawObject* LookupLocalObject(const String& name) const;
+  static LibraryPtr NewLibraryHelper(const String& url, bool import_core_lib);
+  ObjectPtr LookupEntry(const String& name, intptr_t* index) const;
+  ObjectPtr LookupLocalObjectAllowPrivate(const String& name) const;
+  ObjectPtr LookupLocalObject(const String& name) const;
 
   void AllocatePrivateKey() const;
 
-  RawString* MakeMetadataName(const Object& obj) const;
-  RawField* GetMetadataField(const String& metaname) const;
+  StringPtr MakeMetadataName(const Object& obj) const;
+  FieldPtr GetMetadataField(const String& metaname) const;
   void AddMetadata(const Object& owner,
                    const String& name,
                    TokenPosition token_pos,
@@ -4965,31 +4968,31 @@
 // the show/hide combinators.
 class Namespace : public Object {
  public:
-  RawLibrary* library() const { return raw_ptr()->library_; }
-  RawArray* show_names() const { return raw_ptr()->show_names_; }
-  RawArray* hide_names() const { return raw_ptr()->hide_names_; }
+  LibraryPtr library() const { return raw_ptr()->library_; }
+  ArrayPtr show_names() const { return raw_ptr()->show_names_; }
+  ArrayPtr hide_names() const { return raw_ptr()->hide_names_; }
 
   void AddMetadata(const Object& owner,
                    TokenPosition token_pos,
                    intptr_t kernel_offset = 0);
-  RawObject* GetMetadata() const;
+  ObjectPtr GetMetadata() const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawNamespace));
+    return RoundedAllocationSize(sizeof(NamespaceLayout));
   }
 
   bool HidesName(const String& name) const;
-  RawObject* Lookup(const String& name,
-                    ZoneGrowableArray<intptr_t>* trail = NULL) const;
+  ObjectPtr Lookup(const String& name,
+                   ZoneGrowableArray<intptr_t>* trail = NULL) const;
 
-  static RawNamespace* New(const Library& library,
-                           const Array& show_names,
-                           const Array& hide_names);
+  static NamespacePtr New(const Library& library,
+                          const Array& show_names,
+                          const Array& hide_names);
 
  private:
-  static RawNamespace* New();
+  static NamespacePtr New();
 
-  RawField* metadata_field() const { return raw_ptr()->metadata_field_; }
+  FieldPtr metadata_field() const { return raw_ptr()->metadata_field_; }
   void set_metadata_field(const Field& value) const;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Namespace, Object);
@@ -4999,46 +5002,46 @@
 
 class KernelProgramInfo : public Object {
  public:
-  static RawKernelProgramInfo* New(const TypedData& string_offsets,
-                                   const ExternalTypedData& string_data,
-                                   const TypedData& canonical_names,
-                                   const ExternalTypedData& metadata_payload,
-                                   const ExternalTypedData& metadata_mappings,
-                                   const ExternalTypedData& constants_table,
-                                   const Array& scripts,
-                                   const Array& libraries_cache,
-                                   const Array& classes_cache,
-                                   const Object& retained_kernel_blob,
-                                   const uint32_t binary_version);
+  static KernelProgramInfoPtr New(const TypedData& string_offsets,
+                                  const ExternalTypedData& string_data,
+                                  const TypedData& canonical_names,
+                                  const ExternalTypedData& metadata_payload,
+                                  const ExternalTypedData& metadata_mappings,
+                                  const ExternalTypedData& constants_table,
+                                  const Array& scripts,
+                                  const Array& libraries_cache,
+                                  const Array& classes_cache,
+                                  const Object& retained_kernel_blob,
+                                  const uint32_t binary_version);
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawKernelProgramInfo));
+    return RoundedAllocationSize(sizeof(KernelProgramInfoLayout));
   }
 
-  RawTypedData* string_offsets() const { return raw_ptr()->string_offsets_; }
+  TypedDataPtr string_offsets() const { return raw_ptr()->string_offsets_; }
 
-  RawExternalTypedData* string_data() const { return raw_ptr()->string_data_; }
+  ExternalTypedDataPtr string_data() const { return raw_ptr()->string_data_; }
 
-  RawTypedData* canonical_names() const { return raw_ptr()->canonical_names_; }
+  TypedDataPtr canonical_names() const { return raw_ptr()->canonical_names_; }
 
-  RawExternalTypedData* metadata_payloads() const {
+  ExternalTypedDataPtr metadata_payloads() const {
     return raw_ptr()->metadata_payloads_;
   }
 
-  RawExternalTypedData* metadata_mappings() const {
+  ExternalTypedDataPtr metadata_mappings() const {
     return raw_ptr()->metadata_mappings_;
   }
 
-  RawExternalTypedData* constants_table() const {
+  ExternalTypedDataPtr constants_table() const {
     return raw_ptr()->constants_table_;
   }
 
   void set_constants_table(const ExternalTypedData& value) const;
 
-  RawArray* scripts() const { return raw_ptr()->scripts_; }
+  ArrayPtr scripts() const { return raw_ptr()->scripts_; }
   void set_scripts(const Array& scripts) const;
 
-  RawArray* constants() const { return raw_ptr()->constants_; }
+  ArrayPtr constants() const { return raw_ptr()->constants_; }
   void set_constants(const Array& constants) const;
 
   uint32_t kernel_binary_version() const {
@@ -5051,40 +5054,38 @@
   // (since native names are encoded as constants).
   //
   // This array will hold the functions which might need their native name set.
-  RawGrowableObjectArray* potential_natives() const {
+  GrowableObjectArrayPtr potential_natives() const {
     return raw_ptr()->potential_natives_;
   }
   void set_potential_natives(const GrowableObjectArray& candidates) const;
 
-  RawGrowableObjectArray* potential_pragma_functions() const {
+  GrowableObjectArrayPtr potential_pragma_functions() const {
     return raw_ptr()->potential_pragma_functions_;
   }
   void set_potential_pragma_functions(
       const GrowableObjectArray& candidates) const;
 
-  RawScript* ScriptAt(intptr_t index) const;
+  ScriptPtr ScriptAt(intptr_t index) const;
 
-  RawArray* libraries_cache() const { return raw_ptr()->libraries_cache_; }
+  ArrayPtr libraries_cache() const { return raw_ptr()->libraries_cache_; }
   void set_libraries_cache(const Array& cache) const;
-  RawLibrary* LookupLibrary(Thread* thread, const Smi& name_index) const;
-  RawLibrary* InsertLibrary(Thread* thread,
-                            const Smi& name_index,
-                            const Library& lib) const;
+  LibraryPtr LookupLibrary(Thread* thread, const Smi& name_index) const;
+  LibraryPtr InsertLibrary(Thread* thread,
+                           const Smi& name_index,
+                           const Library& lib) const;
 
-  RawArray* classes_cache() const { return raw_ptr()->classes_cache_; }
+  ArrayPtr classes_cache() const { return raw_ptr()->classes_cache_; }
   void set_classes_cache(const Array& cache) const;
-  RawClass* LookupClass(Thread* thread, const Smi& name_index) const;
-  RawClass* InsertClass(Thread* thread,
-                        const Smi& name_index,
-                        const Class& klass) const;
+  ClassPtr LookupClass(Thread* thread, const Smi& name_index) const;
+  ClassPtr InsertClass(Thread* thread,
+                       const Smi& name_index,
+                       const Class& klass) const;
 
-  RawArray* bytecode_component() const {
-    return raw_ptr()->bytecode_component_;
-  }
+  ArrayPtr bytecode_component() const { return raw_ptr()->bytecode_component_; }
   void set_bytecode_component(const Array& bytecode_component) const;
 
  private:
-  static RawKernelProgramInfo* New();
+  static KernelProgramInfoPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(KernelProgramInfo, Object);
   friend class Class;
@@ -5117,21 +5118,23 @@
     StoreNonPointer(&raw_ptr()->length_, value);
   }
 
-  static intptr_t length_offset() { return OFFSET_OF(RawObjectPool, length_); }
+  static intptr_t length_offset() {
+    return OFFSET_OF(ObjectPoolLayout, length_);
+  }
   static intptr_t data_offset() {
-    return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data);
+    return OFFSET_OF_RETURNED_VALUE(ObjectPoolLayout, data);
   }
   static intptr_t element_offset(intptr_t index) {
-    return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data) +
-           sizeof(RawObjectPool::Entry) * index;
+    return OFFSET_OF_RETURNED_VALUE(ObjectPoolLayout, data) +
+           sizeof(ObjectPoolLayout::Entry) * index;
   }
 
-  struct ArrayLayout {
+  struct ArrayTraits {
     static intptr_t elements_start_offset() {
       return ObjectPool::data_offset();
     }
 
-    static constexpr intptr_t kElementSize = sizeof(RawObjectPool::Entry);
+    static constexpr intptr_t kElementSize = sizeof(ObjectPoolLayout::Entry);
   };
 
   EntryType TypeAt(intptr_t index) const {
@@ -5148,7 +5151,7 @@
     StoreNonPointer(&raw_ptr()->entry_bits()[index], bits);
   }
 
-  RawObject* ObjectAt(intptr_t index) const {
+  ObjectPtr ObjectAt(intptr_t index) const {
     ASSERT((TypeAt(index) == EntryType::kTaggedObject) ||
            (TypeAt(index) == EntryType::kNativeEntryData));
     return EntryAddr(index)->raw_obj_;
@@ -5170,36 +5173,37 @@
   }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawObjectPool) ==
-           OFFSET_OF_RETURNED_VALUE(RawObjectPool, data));
+    ASSERT(sizeof(ObjectPoolLayout) ==
+           OFFSET_OF_RETURNED_VALUE(ObjectPoolLayout, data));
     return 0;
   }
 
   static const intptr_t kBytesPerElement =
-      sizeof(RawObjectPool::Entry) + sizeof(uint8_t);
+      sizeof(ObjectPoolLayout::Entry) + sizeof(uint8_t);
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize(intptr_t len) {
     // Ensure that variable length data is not adding to the object length.
-    ASSERT(sizeof(RawObjectPool) == (sizeof(RawObject) + (1 * kWordSize)));
+    ASSERT(sizeof(ObjectPoolLayout) ==
+           (sizeof(ObjectLayout) + (1 * kWordSize)));
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(sizeof(RawObjectPool) +
+    return RoundedAllocationSize(sizeof(ObjectPoolLayout) +
                                  (len * kBytesPerElement));
   }
 
-  static RawObjectPool* NewFromBuilder(
+  static ObjectPoolPtr NewFromBuilder(
       const compiler::ObjectPoolBuilder& builder);
-  static RawObjectPool* New(intptr_t len);
+  static ObjectPoolPtr New(intptr_t len);
 
   void CopyInto(compiler::ObjectPoolBuilder* builder) const;
 
-  // Returns the pool index from the offset relative to a tagged RawObjectPool*,
+  // Returns the pool index from the offset relative to a tagged ObjectPoolPtr,
   // adjusting for the tag-bit.
   static intptr_t IndexFromOffset(intptr_t offset) {
     ASSERT(
         Utils::IsAligned(offset + kHeapObjectTag, compiler::target::kWordSize));
     return (offset + kHeapObjectTag - data_offset()) /
-           sizeof(RawObjectPool::Entry);
+           sizeof(ObjectPoolLayout::Entry);
   }
 
   static intptr_t OffsetFromIndex(intptr_t index) {
@@ -5209,7 +5213,7 @@
   void DebugPrint() const;
 
  private:
-  RawObjectPool::Entry const* EntryAddr(intptr_t index) const {
+  ObjectPoolLayout::Entry const* EntryAddr(intptr_t index) const {
     ASSERT((index >= 0) && (index < Length()));
     return &raw_ptr()->data()[index];
   }
@@ -5217,7 +5221,7 @@
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ObjectPool, Object);
   friend class Class;
   friend class Object;
-  friend class RawObjectPool;
+  friend class ObjectPoolLayout;
 };
 
 class Instructions : public Object {
@@ -5234,21 +5238,21 @@
 
   // Excludes HeaderSize().
   intptr_t Size() const { return SizeBits::decode(raw_ptr()->size_and_flags_); }
-  static intptr_t Size(const RawInstructions* instr) {
+  static intptr_t Size(const InstructionsPtr instr) {
     return SizeBits::decode(instr->ptr()->size_and_flags_);
   }
 
   bool HasMonomorphicEntry() const {
     return FlagsBits::decode(raw_ptr()->size_and_flags_);
   }
-  static bool HasMonomorphicEntry(const RawInstructions* instr) {
+  static bool HasMonomorphicEntry(const InstructionsPtr instr) {
     return FlagsBits::decode(instr->ptr()->size_and_flags_);
   }
 
   uword PayloadStart() const { return PayloadStart(raw()); }
   uword MonomorphicEntryPoint() const { return MonomorphicEntryPoint(raw()); }
   uword EntryPoint() const { return EntryPoint(raw()); }
-  static uword PayloadStart(const RawInstructions* instr) {
+  static uword PayloadStart(const InstructionsPtr instr) {
     return reinterpret_cast<uword>(instr->ptr()) + HeaderSize();
   }
 
@@ -5278,7 +5282,7 @@
 #error Missing entry offsets for current architecture
 #endif
 
-  static uword MonomorphicEntryPoint(const RawInstructions* instr) {
+  static uword MonomorphicEntryPoint(const InstructionsPtr instr) {
     uword entry = PayloadStart(instr);
     if (HasMonomorphicEntry(instr)) {
       entry += !FLAG_precompiled_mode ? kMonomorphicEntryOffsetJIT
@@ -5287,7 +5291,7 @@
     return entry;
   }
 
-  static uword EntryPoint(const RawInstructions* instr) {
+  static uword EntryPoint(const InstructionsPtr instr) {
     uword entry = PayloadStart(instr);
     if (HasMonomorphicEntry(instr)) {
       entry += !FLAG_precompiled_mode ? kPolymorphicEntryOffsetJIT
@@ -5297,12 +5301,12 @@
   }
 
   static const intptr_t kMaxElements =
-      (kMaxInt32 - (sizeof(RawInstructions) + sizeof(RawObject) +
+      (kMaxInt32 - (sizeof(InstructionsLayout) + sizeof(ObjectLayout) +
                     (2 * kMaxObjectAlignment)));
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawInstructions) ==
-           OFFSET_OF_RETURNED_VALUE(RawInstructions, data));
+    ASSERT(sizeof(InstructionsLayout) ==
+           OFFSET_OF_RETURNED_VALUE(InstructionsLayout, data));
     return 0;
   }
 
@@ -5311,19 +5315,19 @@
   }
 
   static intptr_t HeaderSize() {
-    return Utils::RoundUp(sizeof(RawInstructions), kWordSize);
+    return Utils::RoundUp(sizeof(InstructionsLayout), kWordSize);
   }
 
-  static RawInstructions* FromPayloadStart(uword payload_start) {
-    return reinterpret_cast<RawInstructions*>(payload_start - HeaderSize() +
-                                              kHeapObjectTag);
+  static InstructionsPtr FromPayloadStart(uword payload_start) {
+    return static_cast<InstructionsPtr>(payload_start - HeaderSize() +
+                                        kHeapObjectTag);
   }
 
   bool Equals(const Instructions& other) const {
     return Equals(raw(), other.raw());
   }
 
-  static bool Equals(RawInstructions* a, RawInstructions* b) {
+  static bool Equals(InstructionsPtr a, InstructionsPtr b) {
     if (Size(a) != Size(b)) return false;
     NoSafepointScope no_safepoint;
     return memcmp(a->ptr(), b->ptr(), InstanceSize(Size(a))) == 0;
@@ -5348,7 +5352,7 @@
   // only be created using the Code::FinalizeCode method. This method creates
   // the RawInstruction and RawCode objects, sets up the pointer offsets
   // and links the two in a GC safe manner.
-  static RawInstructions* New(intptr_t size, bool has_monomorphic_entry);
+  static InstructionsPtr New(intptr_t size, bool has_monomorphic_entry);
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Instructions, Object);
   friend class Class;
@@ -5364,12 +5368,12 @@
  public:
   // Excludes HeaderSize().
   intptr_t Size() const { return raw_ptr()->payload_length_; }
-  static intptr_t Size(const RawInstructionsSection* instr) {
+  static intptr_t Size(const InstructionsSectionPtr instr) {
     return instr->ptr()->payload_length_;
   }
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawInstructionsSection) ==
-           OFFSET_OF_RETURNED_VALUE(RawInstructionsSection, data));
+    ASSERT(sizeof(InstructionsSectionLayout) ==
+           OFFSET_OF_RETURNED_VALUE(InstructionsSectionLayout, data));
     return 0;
   }
 
@@ -5378,7 +5382,7 @@
   }
 
   static intptr_t HeaderSize() {
-    return Utils::RoundUp(sizeof(RawInstructionsSection), kWordSize);
+    return Utils::RoundUp(sizeof(InstructionsSectionLayout), kWordSize);
   }
 
  private:
@@ -5390,34 +5394,35 @@
  public:
   intptr_t Length() const;
 
-  RawString* GetName(intptr_t var_index) const;
+  StringPtr GetName(intptr_t var_index) const;
 
   void SetVar(intptr_t var_index,
               const String& name,
-              RawLocalVarDescriptors::VarInfo* info) const;
+              LocalVarDescriptorsLayout::VarInfo* info) const;
 
-  void GetInfo(intptr_t var_index, RawLocalVarDescriptors::VarInfo* info) const;
+  void GetInfo(intptr_t var_index,
+               LocalVarDescriptorsLayout::VarInfo* info) const;
 
   static const intptr_t kBytesPerElement =
-      sizeof(RawLocalVarDescriptors::VarInfo);
-  static const intptr_t kMaxElements = RawLocalVarDescriptors::kMaxIndex;
+      sizeof(LocalVarDescriptorsLayout::VarInfo);
+  static const intptr_t kMaxElements = LocalVarDescriptorsLayout::kMaxIndex;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawLocalVarDescriptors) ==
-           OFFSET_OF_RETURNED_VALUE(RawLocalVarDescriptors, names));
+    ASSERT(sizeof(LocalVarDescriptorsLayout) ==
+           OFFSET_OF_RETURNED_VALUE(LocalVarDescriptorsLayout, names));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(0 <= len && len <= kMaxElements);
     return RoundedAllocationSize(
-        sizeof(RawLocalVarDescriptors) +
+        sizeof(LocalVarDescriptorsLayout) +
         (len * kWordSize)  // RawStrings for names.
-        + (len * sizeof(RawLocalVarDescriptors::VarInfo)));
+        + (len * sizeof(LocalVarDescriptorsLayout::VarInfo)));
   }
 
-  static RawLocalVarDescriptors* New(intptr_t num_variables);
+  static LocalVarDescriptorsPtr New(intptr_t num_variables);
 
-  static const char* KindToCString(RawLocalVarDescriptors::VarInfoKind kind);
+  static const char* KindToCString(LocalVarDescriptorsLayout::VarInfoKind kind);
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object);
@@ -5430,15 +5435,15 @@
   static const intptr_t kBytesPerElement = 1;
   static const intptr_t kMaxElements = kMaxInt32 / kBytesPerElement;
 
-  static intptr_t UnroundedSize(RawPcDescriptors* desc) {
+  static intptr_t UnroundedSize(PcDescriptorsPtr desc) {
     return UnroundedSize(desc->ptr()->length_);
   }
   static intptr_t UnroundedSize(intptr_t len) {
-    return sizeof(RawPcDescriptors) + len;
+    return sizeof(PcDescriptorsLayout) + len;
   }
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawPcDescriptors) ==
-           OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data));
+    ASSERT(sizeof(PcDescriptorsLayout) ==
+           OFFSET_OF_RETURNED_VALUE(PcDescriptorsLayout, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -5446,7 +5451,7 @@
     return RoundedAllocationSize(UnroundedSize(len));
   }
 
-  static RawPcDescriptors* New(GrowableArray<uint8_t>* delta_encoded_data);
+  static PcDescriptorsPtr New(GrowableArray<uint8_t>* delta_encoded_data);
 
   // Verify (assert) assumptions about pc descriptors in debug mode.
   void Verify(const Function& function) const;
@@ -5463,7 +5468,7 @@
 
   // We would have a VisitPointers function here to traverse the
   // pc descriptors table to visit objects if any in the table.
-  // Note: never return a reference to a RawPcDescriptors::PcDescriptorRec
+  // Note: never return a reference to a PcDescriptorsLayout::PcDescriptorRec
   // as the object can move.
   class Iterator : ValueObject {
    public:
@@ -5476,7 +5481,7 @@
           cur_deopt_id_(0),
           cur_token_pos_(0),
           cur_try_index_(0),
-          cur_yield_index_(RawPcDescriptors::kInvalidYieldIndex) {}
+          cur_yield_index_(PcDescriptorsLayout::kInvalidYieldIndex) {}
 
     bool MoveNext() {
       // Moves to record that matches kind_mask_.
@@ -5484,11 +5489,12 @@
         const int32_t kind_and_metadata =
             descriptors_.DecodeInteger(&byte_index_);
         cur_kind_ =
-            RawPcDescriptors::KindAndMetadata::DecodeKind(kind_and_metadata);
-        cur_try_index_ = RawPcDescriptors::KindAndMetadata::DecodeTryIndex(
+            PcDescriptorsLayout::KindAndMetadata::DecodeKind(kind_and_metadata);
+        cur_try_index_ = PcDescriptorsLayout::KindAndMetadata::DecodeTryIndex(
             kind_and_metadata);
-        cur_yield_index_ = RawPcDescriptors::KindAndMetadata::DecodeYieldIndex(
-            kind_and_metadata);
+        cur_yield_index_ =
+            PcDescriptorsLayout::KindAndMetadata::DecodeYieldIndex(
+                kind_and_metadata);
 
         cur_pc_offset_ += descriptors_.DecodeInteger(&byte_index_);
 
@@ -5509,8 +5515,8 @@
     TokenPosition TokenPos() const { return TokenPosition(cur_token_pos_); }
     intptr_t TryIndex() const { return cur_try_index_; }
     intptr_t YieldIndex() const { return cur_yield_index_; }
-    RawPcDescriptors::Kind Kind() const {
-      return static_cast<RawPcDescriptors::Kind>(cur_kind_);
+    PcDescriptorsLayout::Kind Kind() const {
+      return static_cast<PcDescriptorsLayout::Kind>(cur_kind_);
     }
 
    private:
@@ -5551,9 +5557,9 @@
   }
 
  private:
-  static const char* KindAsStr(RawPcDescriptors::Kind kind);
+  static const char* KindAsStr(PcDescriptorsLayout::Kind kind);
 
-  static RawPcDescriptors* New(intptr_t length);
+  static PcDescriptorsPtr New(intptr_t length);
 
   void SetLength(intptr_t value) const;
   void CopyData(GrowableArray<uint8_t>* data);
@@ -5568,15 +5574,15 @@
   static const intptr_t kBytesPerElement = 1;
   static const intptr_t kMaxElements = kMaxInt32 / kBytesPerElement;
 
-  static intptr_t UnroundedSize(RawCodeSourceMap* map) {
+  static intptr_t UnroundedSize(CodeSourceMapPtr map) {
     return UnroundedSize(map->ptr()->length_);
   }
   static intptr_t UnroundedSize(intptr_t len) {
-    return sizeof(RawCodeSourceMap) + len;
+    return sizeof(CodeSourceMapLayout) + len;
   }
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawCodeSourceMap) ==
-           OFFSET_OF_RETURNED_VALUE(RawCodeSourceMap, data));
+    ASSERT(sizeof(CodeSourceMapLayout) ==
+           OFFSET_OF_RETURNED_VALUE(CodeSourceMapLayout, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -5584,7 +5590,7 @@
     return RoundedAllocationSize(UnroundedSize(len));
   }
 
-  static RawCodeSourceMap* New(intptr_t length);
+  static CodeSourceMapPtr New(intptr_t length);
 
   intptr_t Length() const { return raw_ptr()->length_; }
   uint8_t* Data() const {
@@ -5614,8 +5620,8 @@
   static const intptr_t kHashBits = 30;
 
   uintptr_t payload_size() const { return PayloadSizeOf(raw()); }
-  static uintptr_t PayloadSizeOf(const RawCompressedStackMaps* raw) {
-    return RawCompressedStackMaps::SizeField::decode(
+  static uintptr_t PayloadSizeOf(const CompressedStackMapsPtr raw) {
+    return CompressedStackMapsLayout::SizeField::decode(
         raw->ptr()->flags_and_size_);
   }
 
@@ -5633,15 +5639,15 @@
   bool Equals(const CompressedStackMaps* other) const { return Equals(*other); }
   intptr_t Hashcode() const;
 
-  static intptr_t UnroundedSize(RawCompressedStackMaps* maps) {
+  static intptr_t UnroundedSize(CompressedStackMapsPtr maps) {
     return UnroundedSize(CompressedStackMaps::PayloadSizeOf(maps));
   }
   static intptr_t UnroundedSize(intptr_t length) {
-    return sizeof(RawCompressedStackMaps) + length;
+    return sizeof(CompressedStackMapsLayout) + length;
   }
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawCompressedStackMaps) ==
-           OFFSET_OF_RETURNED_VALUE(RawCompressedStackMaps, data));
+    ASSERT(sizeof(CompressedStackMapsLayout) ==
+           OFFSET_OF_RETURNED_VALUE(CompressedStackMapsLayout, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t length) {
@@ -5649,35 +5655,35 @@
   }
 
   bool UsesGlobalTable() const { return !IsNull() && UsesGlobalTable(raw()); }
-  static bool UsesGlobalTable(const RawCompressedStackMaps* raw) {
-    return RawCompressedStackMaps::UsesTableBit::decode(
+  static bool UsesGlobalTable(const CompressedStackMapsPtr raw) {
+    return CompressedStackMapsLayout::UsesTableBit::decode(
         raw->ptr()->flags_and_size_);
   }
 
   bool IsGlobalTable() const { return !IsNull() && IsGlobalTable(raw()); }
-  static bool IsGlobalTable(const RawCompressedStackMaps* raw) {
-    return RawCompressedStackMaps::GlobalTableBit::decode(
+  static bool IsGlobalTable(const CompressedStackMapsPtr raw) {
+    return CompressedStackMapsLayout::GlobalTableBit::decode(
         raw->ptr()->flags_and_size_);
   }
 
-  static RawCompressedStackMaps* NewInlined(
+  static CompressedStackMapsPtr NewInlined(
       const GrowableArray<uint8_t>& bytes) {
     return New(bytes, /*is_global_table=*/false, /*uses_global_table=*/false);
   }
-  static RawCompressedStackMaps* NewUsingTable(
+  static CompressedStackMapsPtr NewUsingTable(
       const GrowableArray<uint8_t>& bytes) {
     return New(bytes, /*is_global_table=*/false, /*uses_global_table=*/true);
   }
 
-  static RawCompressedStackMaps* NewGlobalTable(
+  static CompressedStackMapsPtr NewGlobalTable(
       const GrowableArray<uint8_t>& bytes) {
     return New(bytes, /*is_global_table=*/true, /*uses_global_table=*/false);
   }
 
  private:
-  static RawCompressedStackMaps* New(const GrowableArray<uint8_t>& bytes,
-                                     bool is_global_table,
-                                     bool uses_global_table);
+  static CompressedStackMapsPtr New(const GrowableArray<uint8_t>& bytes,
+                                    bool is_global_table,
+                                    bool uses_global_table);
 
   uint8_t PayloadByte(uintptr_t offset) const {
     ASSERT(offset < payload_size());
@@ -5710,22 +5716,22 @@
                       bool has_catch_all,
                       bool is_generated) const;
 
-  RawArray* GetHandledTypes(intptr_t try_index) const;
+  ArrayPtr GetHandledTypes(intptr_t try_index) const;
   void SetHandledTypes(intptr_t try_index, const Array& handled_types) const;
   bool HasCatchAll(intptr_t try_index) const;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawExceptionHandlers) ==
-           OFFSET_OF_RETURNED_VALUE(RawExceptionHandlers, data));
+    ASSERT(sizeof(ExceptionHandlersLayout) ==
+           OFFSET_OF_RETURNED_VALUE(ExceptionHandlersLayout, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
-    return RoundedAllocationSize(sizeof(RawExceptionHandlers) +
+    return RoundedAllocationSize(sizeof(ExceptionHandlersLayout) +
                                  (len * sizeof(ExceptionHandlerInfo)));
   }
 
-  static RawExceptionHandlers* New(intptr_t num_handlers);
-  static RawExceptionHandlers* New(const Array& handled_types_data);
+  static ExceptionHandlersPtr New(intptr_t num_handlers);
+  static ExceptionHandlersPtr New(const Array& handled_types_data);
 
   // We would have a VisitPointers function here to traverse the
   // exception handler table to visit objects if any in the table.
@@ -5758,7 +5764,7 @@
 //       Object::null() from target() means the WSR represents a dropped target.
 //
 // Unfortunately a WSR is not a proxy for the original object, so if WSRs may
-// appear as field contents (currently only possible for RawObject* fields),
+// appear as field contents (currently only possible for ObjectPtr fields),
 // then code that accesses that field must handle the case where an WSR has
 // been introduced. Before serialization, Unwrap can be used to take a
 // Object reference or RawObject pointer and remove any WSR wrapping before use.
@@ -5769,8 +5775,8 @@
 //  * Code::owner_
 class WeakSerializationReference : public Object {
  public:
-  RawObject* target() const { return TargetOf(raw()); }
-  static RawObject* TargetOf(const RawWeakSerializationReference* raw) {
+  ObjectPtr target() const { return TargetOf(raw()); }
+  static ObjectPtr TargetOf(const WeakSerializationReferencePtr raw) {
 #if defined(DART_PRECOMPILED_RUNTIME)
     // WSRs in the precompiled runtime only contain some remaining info about
     // their old target, not a reference to the target itself..
@@ -5783,7 +5789,7 @@
   }
 
   classid_t TargetClassId() const { return TargetClassIdOf(raw()); }
-  static classid_t TargetClassIdOf(const RawWeakSerializationReference* raw) {
+  static classid_t TargetClassIdOf(const WeakSerializationReferencePtr raw) {
 #if defined(DART_PRECOMPILED_RUNTIME)
     // No new instances of WSRs are created in the precompiled runtime, so
     // this instance came from deserialization and thus must be the empty WSR.
@@ -5793,23 +5799,23 @@
 #endif
   }
 
-  static RawObject* Unwrap(const Object& obj) { return Unwrap(obj.raw()); }
+  static ObjectPtr Unwrap(const Object& obj) { return Unwrap(obj.raw()); }
   // Gets the underlying object from a WSR, or the original object if it is
   // not one. Notably, Unwrap(Wrap(r)) == r for all raw objects r, whether
   // CanWrap(r) or not. However, this will not hold if a serialization and
   // deserialization step is put between the two calls.
-  static RawObject* Unwrap(RawObject* obj) {
+  static ObjectPtr Unwrap(ObjectPtr obj) {
     if (!obj->IsWeakSerializationReference()) return obj;
-    return TargetOf(reinterpret_cast<RawWeakSerializationReference*>(obj));
+    return TargetOf(static_cast<WeakSerializationReferencePtr>(obj));
   }
 
   // An Unwrap that only unwraps if there's a valid target, otherwise the
   // WSR is returned. Useful for cases where we want to call Object methods
   // like ToCString() on whatever non-null object we can get.
-  static RawObject* UnwrapIfTarget(const Object& obj) {
+  static ObjectPtr UnwrapIfTarget(const Object& obj) {
     return UnwrapIfTarget(obj.raw());
   }
-  static RawObject* UnwrapIfTarget(RawObject* raw) {
+  static ObjectPtr UnwrapIfTarget(ObjectPtr raw) {
 #if defined(DART_PRECOMPILED_RUNTIME)
     // In the precompiled runtime, WSRs never have a target so we always return
     // the argument.
@@ -5831,22 +5837,22 @@
   // whether CanWrap(r) or not. Unlike Unwrap, this is still true even if
   // there is a serialization and deserialization step between the two calls,
   // since that information is saved in the serialized WSR.
-  static classid_t UnwrappedClassIdOf(RawObject* obj) {
+  static classid_t UnwrappedClassIdOf(ObjectPtr obj) {
     if (!obj->IsWeakSerializationReference()) return obj->GetClassId();
     return TargetClassIdOf(WeakSerializationReference::RawCast(obj));
   }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawWeakSerializationReference));
+    return RoundedAllocationSize(sizeof(WeakSerializationReferenceLayout));
   }
 
 #if defined(DART_PRECOMPILER)
   // Returns true if a new WSR would be created when calling Wrap.
   static bool CanWrap(const Object& object);
 
-  // This returns RawObject*, not RawWeakSerializationReference*, because
+  // This returns ObjectPtr, not WeakSerializationReferencePtr, because
   // target.raw() is returned when CanWrap(target) is false.
-  static RawObject* Wrap(Zone* zone, const Object& target);
+  static ObjectPtr Wrap(Zone* zone, const Object& target);
 #endif
 
  private:
@@ -5857,7 +5863,7 @@
 class Code : public Object {
  public:
   // When dual mapping, this returns the executable view.
-  RawInstructions* active_instructions() const {
+  InstructionsPtr active_instructions() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
     return NULL;
@@ -5867,13 +5873,13 @@
   }
 
   // When dual mapping, these return the executable view.
-  RawInstructions* instructions() const { return raw_ptr()->instructions_; }
-  static RawInstructions* InstructionsOf(const RawCode* code) {
+  InstructionsPtr instructions() const { return raw_ptr()->instructions_; }
+  static InstructionsPtr InstructionsOf(const CodePtr code) {
     return code->ptr()->instructions_;
   }
 
   static intptr_t saved_instructions_offset() {
-    return OFFSET_OF(RawCode, instructions_);
+    return OFFSET_OF(CodeLayout, instructions_);
   }
 
   using EntryKind = CodeEntryKind;
@@ -5884,21 +5890,21 @@
   static intptr_t entry_point_offset(EntryKind kind = EntryKind::kNormal) {
     switch (kind) {
       case EntryKind::kNormal:
-        return OFFSET_OF(RawCode, entry_point_);
+        return OFFSET_OF(CodeLayout, entry_point_);
       case EntryKind::kUnchecked:
-        return OFFSET_OF(RawCode, unchecked_entry_point_);
+        return OFFSET_OF(CodeLayout, unchecked_entry_point_);
       case EntryKind::kMonomorphic:
-        return OFFSET_OF(RawCode, monomorphic_entry_point_);
+        return OFFSET_OF(CodeLayout, monomorphic_entry_point_);
       case EntryKind::kMonomorphicUnchecked:
-        return OFFSET_OF(RawCode, monomorphic_unchecked_entry_point_);
+        return OFFSET_OF(CodeLayout, monomorphic_unchecked_entry_point_);
       default:
         UNREACHABLE();
     }
   }
 
-  RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; }
+  ObjectPoolPtr object_pool() const { return raw_ptr()->object_pool_; }
   static intptr_t object_pool_offset() {
-    return OFFSET_OF(RawCode, object_pool_);
+    return OFFSET_OF(CodeLayout, object_pool_);
   }
 
   intptr_t pointer_offsets_length() const {
@@ -5909,7 +5915,7 @@
     return OptimizedBit::decode(raw_ptr()->state_bits_);
   }
   void set_is_optimized(bool value) const;
-  static bool IsOptimized(RawCode* code) {
+  static bool IsOptimized(CodePtr code) {
     return Code::OptimizedBit::decode(code->ptr()->state_bits_);
   }
 
@@ -5922,7 +5928,7 @@
   void set_is_alive(bool value) const;
 
   bool HasMonomorphicEntry() const { return HasMonomorphicEntry(raw()); }
-  static bool HasMonomorphicEntry(const RawCode* code) {
+  static bool HasMonomorphicEntry(const CodePtr code) {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return code->ptr()->entry_point_ != code->ptr()->monomorphic_entry_point_;
 #else
@@ -5932,7 +5938,7 @@
 
   // Returns the payload start of [instructions()].
   uword PayloadStart() const { return PayloadStartOf(raw()); }
-  static uword PayloadStartOf(const RawCode* code) {
+  static uword PayloadStartOf(const CodePtr code) {
 #if defined(DART_PRECOMPILED_RUNTIME)
     const uword entry_offset = HasMonomorphicEntry(code)
                                    ? Instructions::kPolymorphicEntryOffsetAOT
@@ -5945,7 +5951,7 @@
 
   // Returns the entry point of [instructions()].
   uword EntryPoint() const { return EntryPointOf(raw()); }
-  static uword EntryPointOf(const RawCode* code) {
+  static uword EntryPointOf(const CodePtr code) {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return code->ptr()->entry_point_;
 #else
@@ -5980,7 +5986,7 @@
 
   // Returns the size of [instructions()].
   intptr_t Size() const { return PayloadSizeOf(raw()); }
-  static intptr_t PayloadSizeOf(const RawCode* code) {
+  static intptr_t PayloadSizeOf(const CodePtr code) {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return code->ptr()->instructions_length_;
 #else
@@ -5988,29 +5994,27 @@
 #endif
   }
 
-  RawObjectPool* GetObjectPool() const;
+  ObjectPoolPtr GetObjectPool() const;
   // Returns whether the given PC address is in [instructions()].
   bool ContainsInstructionAt(uword addr) const {
     return ContainsInstructionAt(raw(), addr);
   }
 
   // Returns whether the given PC address is in [InstructionsOf(code)].
-  static bool ContainsInstructionAt(const RawCode* code, uword pc) {
-    return RawCode::ContainsPC(code, pc);
+  static bool ContainsInstructionAt(const CodePtr code, uword pc) {
+    return CodeLayout::ContainsPC(code, pc);
   }
 
   // Returns true if there is a debugger breakpoint set in this code object.
   bool HasBreakpoint() const;
 
-  RawPcDescriptors* pc_descriptors() const {
-    return raw_ptr()->pc_descriptors_;
-  }
+  PcDescriptorsPtr pc_descriptors() const { return raw_ptr()->pc_descriptors_; }
   void set_pc_descriptors(const PcDescriptors& descriptors) const {
     ASSERT(descriptors.IsOld());
     StorePointer(&raw_ptr()->pc_descriptors_, descriptors.raw());
   }
 
-  RawCodeSourceMap* code_source_map() const {
+  CodeSourceMapPtr code_source_map() const {
     return raw_ptr()->code_source_map_;
   }
 
@@ -6020,7 +6024,7 @@
   }
 
   // Array of DeoptInfo objects.
-  RawArray* deopt_info_array() const {
+  ArrayPtr deopt_info_array() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
     return NULL;
@@ -6036,11 +6040,11 @@
 #endif
 
 #if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER)
-  RawTypedData* catch_entry_moves_maps() const;
+  TypedDataPtr catch_entry_moves_maps() const;
   void set_catch_entry_moves_maps(const TypedData& maps) const;
 #endif
 
-  RawCompressedStackMaps* compressed_stackmaps() const {
+  CompressedStackMapsPtr compressed_stackmaps() const {
     return raw_ptr()->compressed_stackmaps_;
   }
   void set_compressed_stackmaps(const CompressedStackMaps& maps) const;
@@ -6076,7 +6080,7 @@
       : public BitField<intptr_t, intptr_t, EntryPointField::kNextBit, 26> {};
 
   void set_static_calls_target_table(const Array& value) const;
-  RawArray* static_calls_target_table() const {
+  ArrayPtr static_calls_target_table() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
     return NULL;
@@ -6085,12 +6089,12 @@
 #endif
   }
 
-  RawTypedData* GetDeoptInfoAtPc(uword pc,
-                                 ICData::DeoptReasonId* deopt_reason,
-                                 uint32_t* deopt_flags) const;
+  TypedDataPtr GetDeoptInfoAtPc(uword pc,
+                                ICData::DeoptReasonId* deopt_reason,
+                                uint32_t* deopt_flags) const;
 
   // Returns null if there is no static call at 'pc'.
-  RawFunction* GetStaticCallTargetFunctionAt(uword pc) const;
+  FunctionPtr GetStaticCallTargetFunctionAt(uword pc) const;
   // Aborts if there is no static call at 'pc'.
   void SetStaticCallTargetCodeAt(uword pc, const Code& code) const;
   void SetStubCallTargetCodeAt(uword pc, const Code& code) const;
@@ -6107,7 +6111,7 @@
     void SetCommentAt(intptr_t idx, const String& comment);
 
     intptr_t PCOffsetAt(intptr_t idx) const;
-    RawString* CommentAt(intptr_t idx) const;
+    StringPtr CommentAt(intptr_t idx) const;
 
    private:
     explicit Comments(const Array& comments);
@@ -6129,7 +6133,7 @@
   const Comments& comments() const;
   void set_comments(const Comments& comments) const;
 
-  RawObject* return_address_metadata() const {
+  ObjectPtr return_address_metadata() const {
 #if defined(PRODUCT)
     UNREACHABLE();
     return NULL;
@@ -6142,7 +6146,7 @@
   // Returns -1 if no prologue offset is available.
   intptr_t GetPrologueOffset() const;
 
-  RawArray* inlined_id_to_function() const;
+  ArrayPtr inlined_id_to_function() const;
   void set_inlined_id_to_function(const Array& value) const;
 
   // Provides the call stack at the given pc offset, with the top-of-stack in
@@ -6170,7 +6174,7 @@
   void DumpInlineIntervals() const;
   void DumpSourcePositions(bool relative_addresses = false) const;
 
-  RawLocalVarDescriptors* var_descriptors() const {
+  LocalVarDescriptorsPtr var_descriptors() const {
 #if defined(PRODUCT)
     UNREACHABLE();
     return NULL;
@@ -6188,9 +6192,9 @@
   }
 
   // Will compute local var descriptors if necessary.
-  RawLocalVarDescriptors* GetLocalVarDescriptors() const;
+  LocalVarDescriptorsPtr GetLocalVarDescriptors() const;
 
-  RawExceptionHandlers* exception_handlers() const {
+  ExceptionHandlersPtr exception_handlers() const {
     return raw_ptr()->exception_handlers_;
   }
   void set_exception_handlers(const ExceptionHandlers& handlers) const {
@@ -6204,36 +6208,36 @@
   // TODO(turnidge): Consider dropping this function and making
   // everybody use owner().  Currently this function is misused - even
   // while generating the snapshot.
-  RawFunction* function() const {
+  FunctionPtr function() const {
     ASSERT(IsFunctionCode());
     return Function::RawCast(
         WeakSerializationReference::Unwrap(raw_ptr()->owner_));
   }
 
-  RawObject* owner() const { return raw_ptr()->owner_; }
+  ObjectPtr owner() const { return raw_ptr()->owner_; }
   void set_owner(const Object& owner) const;
 
   classid_t OwnerClassId() const { return OwnerClassIdOf(raw()); }
-  static classid_t OwnerClassIdOf(RawCode* raw) {
+  static classid_t OwnerClassIdOf(CodePtr raw) {
     return WeakSerializationReference::UnwrappedClassIdOf(raw->ptr()->owner_);
   }
 
-  static intptr_t owner_offset() { return OFFSET_OF(RawCode, owner_); }
+  static intptr_t owner_offset() { return OFFSET_OF(CodeLayout, owner_); }
 
   // We would have a VisitPointers function here to traverse all the
   // embedded objects in the instructions using pointer_offsets.
 
   static const intptr_t kBytesPerElement =
-      sizeof(reinterpret_cast<RawCode*>(0)->data()[0]);
+      sizeof(reinterpret_cast<CodeLayout*>(0)->data()[0]);
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawCode) == OFFSET_OF_RETURNED_VALUE(RawCode, data));
+    ASSERT(sizeof(CodeLayout) == OFFSET_OF_RETURNED_VALUE(CodeLayout, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(sizeof(RawCode) + (len * kBytesPerElement));
+    return RoundedAllocationSize(sizeof(CodeLayout) + (len * kBytesPerElement));
   }
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // Finalizes the generated code, by generating various kinds of metadata (e.g.
@@ -6244,11 +6248,11 @@
   // then a new [ObjectPool] will be attached to the code object as well.
   // Otherwise the caller is responsible for doing this via
   // `Object::set_object_pool()`.
-  static RawCode* FinalizeCode(FlowGraphCompiler* compiler,
-                               compiler::Assembler* assembler,
-                               PoolAttachment pool_attachment,
-                               bool optimized,
-                               CodeStatistics* stats);
+  static CodePtr FinalizeCode(FlowGraphCompiler* compiler,
+                              compiler::Assembler* assembler,
+                              PoolAttachment pool_attachment,
+                              bool optimized,
+                              CodeStatistics* stats);
 
   // Notifies all active [CodeObserver]s.
   static void NotifyCodeObservers(const Code& code, bool optimized);
@@ -6260,23 +6264,23 @@
                                   bool optimized);
 
   // Calls [FinalizeCode] and also notifies [CodeObserver]s.
-  static RawCode* FinalizeCodeAndNotify(const Function& function,
-                                        FlowGraphCompiler* compiler,
-                                        compiler::Assembler* assembler,
-                                        PoolAttachment pool_attachment,
-                                        bool optimized = false,
-                                        CodeStatistics* stats = nullptr);
-  static RawCode* FinalizeCodeAndNotify(const char* name,
-                                        FlowGraphCompiler* compiler,
-                                        compiler::Assembler* assembler,
-                                        PoolAttachment pool_attachment,
-                                        bool optimized = false,
-                                        CodeStatistics* stats = nullptr);
+  static CodePtr FinalizeCodeAndNotify(const Function& function,
+                                       FlowGraphCompiler* compiler,
+                                       compiler::Assembler* assembler,
+                                       PoolAttachment pool_attachment,
+                                       bool optimized = false,
+                                       CodeStatistics* stats = nullptr);
+  static CodePtr FinalizeCodeAndNotify(const char* name,
+                                       FlowGraphCompiler* compiler,
+                                       compiler::Assembler* assembler,
+                                       PoolAttachment pool_attachment,
+                                       bool optimized = false,
+                                       CodeStatistics* stats = nullptr);
 
 #endif
-  static RawCode* LookupCode(uword pc);
-  static RawCode* LookupCodeInVmIsolate(uword pc);
-  static RawCode* FindCode(uword pc, int64_t timestamp);
+  static CodePtr LookupCode(uword pc);
+  static CodePtr LookupCodeInVmIsolate(uword pc);
+  static CodePtr FindCode(uword pc, int64_t timestamp);
 
   int32_t GetPointerOffsetAt(int index) const {
     NoSafepointScope no_safepoint;
@@ -6285,7 +6289,8 @@
   TokenPosition GetTokenIndexOfPC(uword pc) const;
 
   // Find pc, return 0 if not found.
-  uword GetPcForDeoptId(intptr_t deopt_id, RawPcDescriptors::Kind kind) const;
+  uword GetPcForDeoptId(intptr_t deopt_id,
+                        PcDescriptorsLayout::Kind kind) const;
   intptr_t GetDeoptIdForOsr(uword pc) const;
 
   const char* Name() const;
@@ -6315,7 +6320,7 @@
   }
 
   bool IsDisabled() const { return IsDisabled(raw()); }
-  static bool IsDisabled(RawCode* code) {
+  static bool IsDisabled(CodePtr code) {
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
     return false;
@@ -6324,15 +6329,15 @@
 #endif
   }
 
-  void set_object_pool(RawObjectPool* object_pool) const {
+  void set_object_pool(ObjectPoolPtr object_pool) const {
     StorePointer(&raw_ptr()->object_pool_, object_pool);
   }
 
  private:
   void set_state_bits(intptr_t bits) const;
 
-  friend class RawObject;  // For RawObject::SizeFromClass().
-  friend class RawCode;
+  friend class ObjectLayout;  // For ObjectLayout::SizeFromClass().
+  friend class CodeLayout;
   enum {
     kOptimizedBit = 0,
     kForceOptimizedBit = 1,
@@ -6358,7 +6363,7 @@
     virtual ~SlowFindRawCodeVisitor() {}
 
     // Check if object matches find condition.
-    virtual bool FindObject(RawObject* obj) const;
+    virtual bool FindObject(ObjectPtr obj) const;
 
    private:
     const uword pc_;
@@ -6378,8 +6383,8 @@
 
   // Initializes the cached entrypoint addresses in [code] as calculated
   // from [instructions] and [unchecked_offset].
-  static void InitializeCachedEntryPointsFrom(RawCode* code,
-                                              RawInstructions* instructions,
+  static void InitializeCachedEntryPointsFrom(CodePtr code,
+                                              InstructionsPtr instructions,
                                               uint32_t unchecked_offset);
 
   // Sets [active_instructions_] to [instructions] and updates the cached
@@ -6405,7 +6410,7 @@
   uint32_t UncheckedEntryPointOffset() const {
     return UncheckedEntryPointOffsetOf(raw());
   }
-  static uint32_t UncheckedEntryPointOffsetOf(RawCode* code) {
+  static uint32_t UncheckedEntryPointOffsetOf(CodePtr code) {
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
@@ -6430,13 +6435,13 @@
   }
 
   intptr_t BinarySearchInSCallTable(uword pc) const;
-  static RawCode* LookupCodeInIsolate(Isolate* isolate, uword pc);
+  static CodePtr LookupCodeInIsolate(Isolate* isolate, uword pc);
 
   // New is a private method as RawInstruction and RawCode objects should
   // only be created using the Code::FinalizeCode method. This method creates
   // the RawInstruction and RawCode objects, sets up the pointer offsets
   // and links the two in a GC safe manner.
-  static RawCode* New(intptr_t pointer_offsets_length);
+  static CodePtr New(intptr_t pointer_offsets_length);
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object);
   friend class Class;
@@ -6454,7 +6459,7 @@
   friend class ProgramVisitor;         // for set_instructions
   // So that the RawFunction pointer visitor can determine whether code the
   // function points to is optimized.
-  friend class RawFunction;
+  friend class FunctionLayout;
   friend class CallSiteResetter;
   friend class CodeKeyValueTrait;  // for UncheckedEntryPointOffset
 };
@@ -6466,15 +6471,13 @@
   uword PayloadStart() const { return instructions(); }
   intptr_t Size() const { return raw_ptr()->instructions_size_; }
 
-  RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; }
+  ObjectPoolPtr object_pool() const { return raw_ptr()->object_pool_; }
 
   bool ContainsInstructionAt(uword addr) const {
-    return RawBytecode::ContainsPC(raw(), addr);
+    return BytecodeLayout::ContainsPC(raw(), addr);
   }
 
-  RawPcDescriptors* pc_descriptors() const {
-    return raw_ptr()->pc_descriptors_;
-  }
+  PcDescriptorsPtr pc_descriptors() const { return raw_ptr()->pc_descriptors_; }
   void set_pc_descriptors(const PcDescriptors& descriptors) const {
     ASSERT(descriptors.IsOld());
     StorePointer(&raw_ptr()->pc_descriptors_, descriptors.raw());
@@ -6482,7 +6485,7 @@
 
   void Disassemble(DisassemblyFormatter* formatter = NULL) const;
 
-  RawExceptionHandlers* exception_handlers() const {
+  ExceptionHandlersPtr exception_handlers() const {
     return raw_ptr()->exception_handlers_;
   }
   void set_exception_handlers(const ExceptionHandlers& handlers) const {
@@ -6490,7 +6493,7 @@
     StorePointer(&raw_ptr()->exception_handlers_, handlers.raw());
   }
 
-  RawFunction* function() const { return raw_ptr()->function_; }
+  FunctionPtr function() const { return raw_ptr()->function_; }
 
   void set_function(const Function& function) const {
     ASSERT(function.IsOld());
@@ -6498,14 +6501,14 @@
   }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawBytecode));
+    return RoundedAllocationSize(sizeof(BytecodeLayout));
   }
-  static RawBytecode* New(uword instructions,
-                          intptr_t instructions_size,
-                          intptr_t instructions_offset,
-                          const ObjectPool& object_pool);
+  static BytecodePtr New(uword instructions,
+                         intptr_t instructions_size,
+                         intptr_t instructions_offset,
+                         const ObjectPool& object_pool);
 
-  RawExternalTypedData* GetBinary(Zone* zone) const;
+  ExternalTypedDataPtr GetBinary(Zone* zone) const;
 
   TokenPosition GetTokenIndexOfPC(uword return_address) const;
   intptr_t GetTryIndexAtPc(uword return_address) const;
@@ -6546,7 +6549,7 @@
     return (local_variables_binary_offset() != 0);
   }
 
-  RawLocalVarDescriptors* var_descriptors() const {
+  LocalVarDescriptorsPtr var_descriptors() const {
 #if defined(PRODUCT)
     UNREACHABLE();
     return nullptr;
@@ -6564,7 +6567,7 @@
   }
 
   // Will compute local var descriptors if necessary.
-  RawLocalVarDescriptors* GetLocalVarDescriptors() const;
+  LocalVarDescriptorsPtr GetLocalVarDescriptors() const;
 
   const char* Name() const;
   const char* QualifiedName() const;
@@ -6576,7 +6579,7 @@
     virtual ~SlowFindRawBytecodeVisitor() {}
 
     // Check if object matches find condition.
-    virtual bool FindObject(RawObject* obj) const;
+    virtual bool FindObject(ObjectPtr obj) const;
 
    private:
     const uword pc_;
@@ -6584,7 +6587,7 @@
     DISALLOW_COPY_AND_ASSIGN(SlowFindRawBytecodeVisitor);
   };
 
-  static RawBytecode* FindCode(uword pc);
+  static BytecodePtr FindCode(uword pc);
 
  private:
   void set_instructions(uword instructions) const {
@@ -6598,8 +6601,8 @@
   }
 
   friend class BytecodeDeserializationCluster;
-  friend class RawObject;  // For RawObject::SizeFromClass().
-  friend class RawBytecode;
+  friend class ObjectLayout;  // For ObjectLayout::SizeFromClass().
+  friend class BytecodeLayout;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Bytecode, Object);
   friend class Class;
@@ -6608,21 +6611,21 @@
 
 class Context : public Object {
  public:
-  RawContext* parent() const { return raw_ptr()->parent_; }
+  ContextPtr parent() const { return raw_ptr()->parent_; }
   void set_parent(const Context& parent) const {
     StorePointer(&raw_ptr()->parent_, parent.raw());
   }
-  static intptr_t parent_offset() { return OFFSET_OF(RawContext, parent_); }
+  static intptr_t parent_offset() { return OFFSET_OF(ContextLayout, parent_); }
 
   intptr_t num_variables() const { return raw_ptr()->num_variables_; }
   static intptr_t num_variables_offset() {
-    return OFFSET_OF(RawContext, num_variables_);
+    return OFFSET_OF(ContextLayout, num_variables_);
   }
-  static intptr_t NumVariables(const RawContext* context) {
+  static intptr_t NumVariables(const ContextPtr context) {
     return context->ptr()->num_variables_;
   }
 
-  RawObject* At(intptr_t context_index) const {
+  ObjectPtr At(intptr_t context_index) const {
     return *ObjectAddr(context_index);
   }
   inline void SetAt(intptr_t context_index, const Object& value) const;
@@ -6639,7 +6642,7 @@
   static const intptr_t kControllerIndex = 1;
 
   static intptr_t variable_offset(intptr_t context_index) {
-    return OFFSET_OF_RETURNED_VALUE(RawContext, data) +
+    return OFFSET_OF_RETURNED_VALUE(ContextLayout, data) +
            (kWordSize * context_index);
   }
 
@@ -6648,20 +6651,21 @@
   }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawContext) == OFFSET_OF_RETURNED_VALUE(RawContext, data));
+    ASSERT(sizeof(ContextLayout) ==
+           OFFSET_OF_RETURNED_VALUE(ContextLayout, data));
     return 0;
   }
 
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(IsValidLength(len));
-    return RoundedAllocationSize(sizeof(RawContext) + (len * kBytesPerElement));
+    return RoundedAllocationSize(sizeof(ContextLayout) +
+                                 (len * kBytesPerElement));
   }
 
-  static RawContext* New(intptr_t num_variables,
-                         Heap::Space space = Heap::kNew);
+  static ContextPtr New(intptr_t num_variables, Heap::Space space = Heap::kNew);
 
  private:
-  RawObject* const* ObjectAddr(intptr_t context_index) const {
+  ObjectPtr const* ObjectAddr(intptr_t context_index) const {
     ASSERT((context_index >= 0) && (context_index < num_variables()));
     return &raw_ptr()->data()[context_index];
   }
@@ -6696,7 +6700,7 @@
   void SetDeclarationTokenIndexAt(intptr_t scope_index,
                                   TokenPosition declaration_token_pos) const;
 
-  RawString* NameAt(intptr_t scope_index) const;
+  StringPtr NameAt(intptr_t scope_index) const;
   void SetNameAt(intptr_t scope_index, const String& name) const;
 
   void ClearFlagsAt(intptr_t scope_index) const;
@@ -6714,10 +6718,10 @@
   bool IsConstAt(intptr_t scope_index) const;
   void SetIsConstAt(intptr_t scope_index, bool is_const) const;
 
-  RawAbstractType* TypeAt(intptr_t scope_index) const;
+  AbstractTypePtr TypeAt(intptr_t scope_index) const;
   void SetTypeAt(intptr_t scope_index, const AbstractType& type) const;
 
-  RawInstance* ConstValueAt(intptr_t scope_index) const;
+  InstancePtr ConstValueAt(intptr_t scope_index) const;
   void SetConstValueAt(intptr_t scope_index, const Instance& value) const;
 
   intptr_t ContextIndexAt(intptr_t scope_index) const;
@@ -6727,22 +6731,22 @@
   void SetContextLevelAt(intptr_t scope_index, intptr_t context_level) const;
 
   static const intptr_t kBytesPerElement =
-      sizeof(RawContextScope::VariableDesc);
+      sizeof(ContextScopeLayout::VariableDesc);
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawContextScope) ==
-           OFFSET_OF_RETURNED_VALUE(RawContextScope, data));
+    ASSERT(sizeof(ContextScopeLayout) ==
+           OFFSET_OF_RETURNED_VALUE(ContextScopeLayout, data));
     return 0;
   }
 
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(sizeof(RawContextScope) +
+    return RoundedAllocationSize(sizeof(ContextScopeLayout) +
                                  (len * kBytesPerElement));
   }
 
-  static RawContextScope* New(intptr_t num_variables, bool is_implicit);
+  static ContextScopePtr New(intptr_t num_variables, bool is_implicit);
 
  private:
   void set_num_variables(intptr_t num_variables) const {
@@ -6753,7 +6757,8 @@
     StoreNonPointer(&raw_ptr()->is_implicit_, is_implicit);
   }
 
-  const RawContextScope::VariableDesc* VariableDescAddr(intptr_t index) const {
+  const ContextScopeLayout::VariableDesc* VariableDescAddr(
+      intptr_t index) const {
     ASSERT((index >= 0) && (index < num_variables()));
     return raw_ptr()->VariableDescAddr(index);
   }
@@ -6778,7 +6783,7 @@
     kEntryLength,
   };
 
-  RawArray* buckets() const;
+  ArrayPtr buckets() const;
   void set_buckets(const Array& buckets) const;
 
   intptr_t mask() const;
@@ -6788,34 +6793,34 @@
   void set_filled_entry_count(intptr_t num) const;
 
   static intptr_t buckets_offset() {
-    return OFFSET_OF(RawMegamorphicCache, buckets_);
+    return OFFSET_OF(MegamorphicCacheLayout, buckets_);
   }
   static intptr_t mask_offset() {
-    return OFFSET_OF(RawMegamorphicCache, mask_);
+    return OFFSET_OF(MegamorphicCacheLayout, mask_);
   }
   static intptr_t arguments_descriptor_offset() {
-    return OFFSET_OF(RawMegamorphicCache, args_descriptor_);
+    return OFFSET_OF(MegamorphicCacheLayout, args_descriptor_);
   }
 
-  static RawMegamorphicCache* New(const String& target_name,
-                                  const Array& arguments_descriptor);
+  static MegamorphicCachePtr New(const String& target_name,
+                                 const Array& arguments_descriptor);
 
   void Insert(const Smi& class_id, const Object& target) const;
 
   void SwitchToBareInstructions();
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawMegamorphicCache));
+    return RoundedAllocationSize(sizeof(MegamorphicCacheLayout));
   }
 
-  static RawMegamorphicCache* Clone(const MegamorphicCache& from);
+  static MegamorphicCachePtr Clone(const MegamorphicCache& from);
 
  private:
   friend class Class;
   friend class MegamorphicCacheTable;
   friend class ProgramVisitor;
 
-  static RawMegamorphicCache* New();
+  static MegamorphicCachePtr New();
 
   // The caller must hold Isolate::megamorphic_mutex().
   void EnsureCapacityLocked() const;
@@ -6826,9 +6831,8 @@
                               const Smi& class_id,
                               const Object& target);
 
-  static inline RawObject* GetClassId(const Array& array, intptr_t index);
-  static inline RawObject* GetTargetFunction(const Array& array,
-                                             intptr_t index);
+  static inline ObjectPtr GetClassId(const Array& array, intptr_t index);
+  static inline ObjectPtr GetTargetFunction(const Array& array, intptr_t index);
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache, CallSiteData);
 };
@@ -6864,24 +6868,24 @@
                 Bool* test_result) const;
   void Reset() const;
 
-  static RawSubtypeTestCache* New();
+  static SubtypeTestCachePtr New();
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawSubtypeTestCache));
+    return RoundedAllocationSize(sizeof(SubtypeTestCacheLayout));
   }
 
   static intptr_t cache_offset() {
-    return OFFSET_OF(RawSubtypeTestCache, cache_);
+    return OFFSET_OF(SubtypeTestCacheLayout, cache_);
   }
 
   static void Init();
   static void Cleanup();
 
-  RawArray* cache() const { return raw_ptr()->cache_; }
+  ArrayPtr cache() const { return raw_ptr()->cache_; }
 
  private:
   // A VM heap allocated preinitialized empty subtype entry array.
-  static RawArray* cached_array_;
+  static ArrayPtr cached_array_;
 
   void set_cache(const Array& value) const;
 
@@ -6903,21 +6907,20 @@
 
 class ApiError : public Error {
  public:
-  RawString* message() const { return raw_ptr()->message_; }
+  StringPtr message() const { return raw_ptr()->message_; }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawApiError));
+    return RoundedAllocationSize(sizeof(ApiErrorLayout));
   }
 
-  static RawApiError* New(const String& message,
-                          Heap::Space space = Heap::kNew);
+  static ApiErrorPtr New(const String& message, Heap::Space space = Heap::kNew);
 
   virtual const char* ToErrorCString() const;
 
  private:
   void set_message(const String& message) const;
 
-  static RawApiError* New();
+  static ApiErrorPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ApiError, Error);
   friend class Class;
@@ -6930,44 +6933,44 @@
   }
 
   // Build, cache, and return formatted message.
-  RawString* FormatMessage() const;
+  StringPtr FormatMessage() const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawLanguageError));
+    return RoundedAllocationSize(sizeof(LanguageErrorLayout));
   }
 
   // A null script means no source and a negative token_pos means no position.
-  static RawLanguageError* NewFormatted(const Error& prev_error,
+  static LanguageErrorPtr NewFormatted(const Error& prev_error,
+                                       const Script& script,
+                                       TokenPosition token_pos,
+                                       bool report_after_token,
+                                       Report::Kind kind,
+                                       Heap::Space space,
+                                       const char* format,
+                                       ...) PRINTF_ATTRIBUTE(7, 8);
+
+  static LanguageErrorPtr NewFormattedV(const Error& prev_error,
                                         const Script& script,
                                         TokenPosition token_pos,
                                         bool report_after_token,
                                         Report::Kind kind,
                                         Heap::Space space,
                                         const char* format,
-                                        ...) PRINTF_ATTRIBUTE(7, 8);
+                                        va_list args);
 
-  static RawLanguageError* NewFormattedV(const Error& prev_error,
-                                         const Script& script,
-                                         TokenPosition token_pos,
-                                         bool report_after_token,
-                                         Report::Kind kind,
-                                         Heap::Space space,
-                                         const char* format,
-                                         va_list args);
-
-  static RawLanguageError* New(const String& formatted_message,
-                               Report::Kind kind = Report::kError,
-                               Heap::Space space = Heap::kNew);
+  static LanguageErrorPtr New(const String& formatted_message,
+                              Report::Kind kind = Report::kError,
+                              Heap::Space space = Heap::kNew);
 
   virtual const char* ToErrorCString() const;
 
   TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
 
  private:
-  RawError* previous_error() const { return raw_ptr()->previous_error_; }
+  ErrorPtr previous_error() const { return raw_ptr()->previous_error_; }
   void set_previous_error(const Error& value) const;
 
-  RawScript* script() const { return raw_ptr()->script_; }
+  ScriptPtr script() const { return raw_ptr()->script_; }
   void set_script(const Script& value) const;
 
   void set_token_pos(TokenPosition value) const;
@@ -6977,13 +6980,13 @@
 
   void set_kind(uint8_t value) const;
 
-  RawString* message() const { return raw_ptr()->message_; }
+  StringPtr message() const { return raw_ptr()->message_; }
   void set_message(const String& value) const;
 
-  RawString* formatted_message() const { return raw_ptr()->formatted_message_; }
+  StringPtr formatted_message() const { return raw_ptr()->formatted_message_; }
   void set_formatted_message(const String& value) const;
 
-  static RawLanguageError* New();
+  static LanguageErrorPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(LanguageError, Error);
   friend class Class;
@@ -6991,28 +6994,28 @@
 
 class UnhandledException : public Error {
  public:
-  RawInstance* exception() const { return raw_ptr()->exception_; }
+  InstancePtr exception() const { return raw_ptr()->exception_; }
   static intptr_t exception_offset() {
-    return OFFSET_OF(RawUnhandledException, exception_);
+    return OFFSET_OF(UnhandledExceptionLayout, exception_);
   }
 
-  RawInstance* stacktrace() const { return raw_ptr()->stacktrace_; }
+  InstancePtr stacktrace() const { return raw_ptr()->stacktrace_; }
   static intptr_t stacktrace_offset() {
-    return OFFSET_OF(RawUnhandledException, stacktrace_);
+    return OFFSET_OF(UnhandledExceptionLayout, stacktrace_);
   }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawUnhandledException));
+    return RoundedAllocationSize(sizeof(UnhandledExceptionLayout));
   }
 
-  static RawUnhandledException* New(const Instance& exception,
-                                    const Instance& stacktrace,
-                                    Heap::Space space = Heap::kNew);
+  static UnhandledExceptionPtr New(const Instance& exception,
+                                   const Instance& stacktrace,
+                                   Heap::Space space = Heap::kNew);
 
   virtual const char* ToErrorCString() const;
 
  private:
-  static RawUnhandledException* New(Heap::Space space = Heap::kNew);
+  static UnhandledExceptionPtr New(Heap::Space space = Heap::kNew);
 
   void set_exception(const Instance& exception) const;
   void set_stacktrace(const Instance& stacktrace) const;
@@ -7027,14 +7030,14 @@
   bool is_user_initiated() const { return raw_ptr()->is_user_initiated_; }
   void set_is_user_initiated(bool value) const;
 
-  RawString* message() const { return raw_ptr()->message_; }
+  StringPtr message() const { return raw_ptr()->message_; }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawUnwindError));
+    return RoundedAllocationSize(sizeof(UnwindErrorLayout));
   }
 
-  static RawUnwindError* New(const String& message,
-                             Heap::Space space = Heap::kNew);
+  static UnwindErrorPtr New(const String& message,
+                            Heap::Space space = Heap::kNew);
 
   virtual const char* ToErrorCString() const;
 
@@ -7074,30 +7077,30 @@
   // An instance cannot be canonicalized if it still contains non-canonical
   // instances in its fields.
   // Returns error in error_str, pass NULL if an error cannot occur.
-  virtual RawInstance* CheckAndCanonicalize(Thread* thread,
-                                            const char** error_str) const;
+  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
+                                           const char** error_str) const;
 
   // Returns true if all fields are OK for canonicalization.
   virtual bool CheckAndCanonicalizeFields(Thread* thread,
                                           const char** error_str) const;
 
-  RawInstance* CopyShallowToOldSpace(Thread* thread) const;
+  InstancePtr CopyShallowToOldSpace(Thread* thread) const;
 
 #if defined(DEBUG)
   // Check if instance is canonical.
   virtual bool CheckIsCanonical(Thread* thread) const;
 #endif  // DEBUG
 
-  RawObject* GetField(const Field& field) const;
+  ObjectPtr GetField(const Field& field) const;
 
   void SetField(const Field& field, const Object& value) const;
 
-  RawAbstractType* GetType(Heap::Space space) const;
+  AbstractTypePtr GetType(Heap::Space space) const;
 
   // Access the arguments of the [Type] of this [Instance].
   // Note: for [Type]s instead of [Instance]s with a [Type] attached, use
   // [arguments()] and [set_arguments()]
-  virtual RawTypeArguments* GetTypeArguments() const;
+  virtual TypeArgumentsPtr GetTypeArguments() const;
   virtual void SetTypeArguments(const TypeArguments& value) const;
 
   // Check if the type of this instance is a subtype of the given other type.
@@ -7144,25 +7147,25 @@
   // (if not NULL) to call.
   bool IsCallable(Function* function) const;
 
-  RawObject* Invoke(const String& selector,
-                    const Array& arguments,
-                    const Array& argument_names,
-                    bool respect_reflectable = true,
-                    bool check_is_entrypoint = false) const;
-  RawObject* InvokeGetter(const String& selector,
-                          bool respect_reflectable = true,
-                          bool check_is_entrypoint = false) const;
-  RawObject* InvokeSetter(const String& selector,
-                          const Instance& argument,
-                          bool respect_reflectable = true,
-                          bool check_is_entrypoint = false) const;
+  ObjectPtr Invoke(const String& selector,
+                   const Array& arguments,
+                   const Array& argument_names,
+                   bool respect_reflectable = true,
+                   bool check_is_entrypoint = false) const;
+  ObjectPtr InvokeGetter(const String& selector,
+                         bool respect_reflectable = true,
+                         bool check_is_entrypoint = false) const;
+  ObjectPtr InvokeSetter(const String& selector,
+                         const Instance& argument,
+                         bool respect_reflectable = true,
+                         bool check_is_entrypoint = false) const;
 
   // Evaluate the given expression as if it appeared in an instance method of
   // this instance and return the resulting value, or an error object if
   // evaluating the expression fails. The method has the formal (type)
   // parameters given in (type_)param_names, and is invoked with the (type)
   // argument values given in (type_)param_values.
-  RawObject* EvaluateCompiledExpression(
+  ObjectPtr EvaluateCompiledExpression(
       const Class& method_cls,
       const ExternalTypedData& kernel_buffer,
       const Array& type_definitions,
@@ -7170,16 +7173,16 @@
       const TypeArguments& type_param_values) const;
 
   // Equivalent to invoking hashCode on this instance.
-  virtual RawObject* HashCode() const;
+  virtual ObjectPtr HashCode() const;
 
   // Equivalent to invoking identityHashCode with this instance.
-  RawObject* IdentityHashCode() const;
+  ObjectPtr IdentityHashCode() const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawInstance));
+    return RoundedAllocationSize(sizeof(InstanceLayout));
   }
 
-  static RawInstance* New(const Class& cls, Heap::Space space = Heap::kNew);
+  static InstancePtr New(const Class& cls, Heap::Space space = Heap::kNew);
 
   // Array/list element address computations.
   static intptr_t DataOffsetFor(intptr_t cid);
@@ -7191,7 +7194,7 @@
   // Pointer handles.
   virtual bool IsPointer() const;
 
-  static intptr_t NextFieldOffset() { return sizeof(RawInstance); }
+  static intptr_t NextFieldOffset() { return sizeof(InstanceLayout); }
 
  protected:
 #ifndef PRODUCT
@@ -7211,15 +7214,15 @@
       const TypeArguments& other_instantiator_type_arguments,
       const TypeArguments& other_function_type_arguments);
 
-  RawObject** FieldAddrAtOffset(intptr_t offset) const {
+  ObjectPtr* FieldAddrAtOffset(intptr_t offset) const {
     ASSERT(IsValidFieldOffset(offset));
-    return reinterpret_cast<RawObject**>(raw_value() - kHeapObjectTag + offset);
+    return reinterpret_cast<ObjectPtr*>(raw_value() - kHeapObjectTag + offset);
   }
-  RawObject** FieldAddr(const Field& field) const {
+  ObjectPtr* FieldAddr(const Field& field) const {
     return FieldAddrAtOffset(field.HostOffset());
   }
-  RawObject** NativeFieldsAddr() const {
-    return FieldAddrAtOffset(sizeof(RawObject));
+  ObjectPtr* NativeFieldsAddr() const {
+    return FieldAddrAtOffset(sizeof(ObjectLayout));
   }
   void SetFieldAtOffset(intptr_t offset, const Object& value) const {
     StorePointer(FieldAddrAtOffset(offset), value.raw());
@@ -7228,19 +7231,19 @@
 
   // The following raw methods are used for morphing.
   // They are needed due to the extraction of the class in IsValidFieldOffset.
-  RawObject** RawFieldAddrAtOffset(intptr_t offset) const {
-    return reinterpret_cast<RawObject**>(raw_value() - kHeapObjectTag + offset);
+  ObjectPtr* RawFieldAddrAtOffset(intptr_t offset) const {
+    return reinterpret_cast<ObjectPtr*>(raw_value() - kHeapObjectTag + offset);
   }
-  RawObject* RawGetFieldAtOffset(intptr_t offset) const {
+  ObjectPtr RawGetFieldAtOffset(intptr_t offset) const {
     return *RawFieldAddrAtOffset(offset);
   }
   void RawSetFieldAtOffset(intptr_t offset, const Object& value) const {
     StorePointer(RawFieldAddrAtOffset(offset), value.raw());
   }
 
-  static RawInstance* NewFromCidAndSize(SharedClassTable* shared_class_table,
-                                        classid_t cid,
-                                        Heap::Space heap = Heap::kNew);
+  static InstancePtr NewFromCidAndSize(SharedClassTable* shared_class_table,
+                                       classid_t cid,
+                                       Heap::Space heap = Heap::kNew);
 
   // TODO(iposva): Determine if this gets in the way of Smi.
   HEAP_OBJECT_IMPLEMENTATION(Instance, Object);
@@ -7262,26 +7265,26 @@
 
 class LibraryPrefix : public Instance {
  public:
-  RawString* name() const { return raw_ptr()->name_; }
-  virtual RawString* DictionaryName() const { return name(); }
+  StringPtr name() const { return raw_ptr()->name_; }
+  virtual StringPtr DictionaryName() const { return name(); }
 
-  RawArray* imports() const { return raw_ptr()->imports_; }
+  ArrayPtr imports() const { return raw_ptr()->imports_; }
   intptr_t num_imports() const { return raw_ptr()->num_imports_; }
-  RawLibrary* importer() const { return raw_ptr()->importer_; }
+  LibraryPtr importer() const { return raw_ptr()->importer_; }
 
-  RawLibrary* GetLibrary(int index) const;
+  LibraryPtr GetLibrary(int index) const;
   void AddImport(const Namespace& import) const;
 
   bool is_deferred_load() const { return raw_ptr()->is_deferred_load_; }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawLibraryPrefix));
+    return RoundedAllocationSize(sizeof(LibraryPrefixLayout));
   }
 
-  static RawLibraryPrefix* New(const String& name,
-                               const Namespace& import,
-                               bool deferred_load,
-                               const Library& importer);
+  static LibraryPrefixPtr New(const String& name,
+                              const Namespace& import,
+                              bool deferred_load,
+                              const Library& importer);
 
  private:
   static const int kInitialSize = 2;
@@ -7292,7 +7295,7 @@
   void set_num_imports(intptr_t value) const;
   void set_importer(const Library& value) const;
 
-  static RawLibraryPrefix* New();
+  static LibraryPrefixPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix, Instance);
   friend class Class;
@@ -7307,15 +7310,15 @@
   static const intptr_t kHashBits = 30;
 
   intptr_t Length() const;
-  RawAbstractType* TypeAt(intptr_t index) const;
-  RawAbstractType* TypeAtNullSafe(intptr_t index) const;
+  AbstractTypePtr TypeAt(intptr_t index) const;
+  AbstractTypePtr TypeAtNullSafe(intptr_t index) const;
   static intptr_t type_at_offset(intptr_t index) {
-    return OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types) +
+    return OFFSET_OF_RETURNED_VALUE(TypeArgumentsLayout, types) +
            index * kWordSize;
   }
   void SetTypeAt(intptr_t index, const AbstractType& value) const;
 
-  struct ArrayLayout {
+  struct ArrayTraits {
     static intptr_t elements_start_offset() {
       return TypeArguments::type_at_offset(0);
     }
@@ -7345,15 +7348,15 @@
   static const intptr_t kLegacyBits = 2;
   intptr_t nullability() const;
   static intptr_t nullability_offset() {
-    return OFFSET_OF(RawTypeArguments, nullability_);
+    return OFFSET_OF(TypeArgumentsLayout, nullability_);
   }
 
   // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>".
-  RawString* Name() const;
+  StringPtr Name() const;
 
   // The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>".
   // Names of internal classes are mapped to their public interfaces.
-  RawString* UserVisibleName() const;
+  StringPtr UserVisibleName() const;
 
   // Print the internal or public name of a subvector of this type argument
   // vector, e.g. "<T, dynamic, List<T>, int>".
@@ -7378,14 +7381,14 @@
     return IsDynamicTypes(true, 0, len);
   }
 
-  RawTypeArguments* Prepend(Zone* zone,
-                            const TypeArguments& other,
-                            intptr_t other_length,
-                            intptr_t total_length) const;
+  TypeArgumentsPtr Prepend(Zone* zone,
+                           const TypeArguments& other,
+                           intptr_t other_length,
+                           intptr_t total_length) const;
 
   // Concatenate [this] and [other] vectors of type parameters.
-  RawTypeArguments* ConcatenateTypeParameters(Zone* zone,
-                                              const TypeArguments& other) const;
+  TypeArgumentsPtr ConcatenateTypeParameters(Zone* zone,
+                                             const TypeArguments& other) const;
 
   // Check if the subvector of length 'len' starting at 'from_index' of this
   // type argument vector consists solely of DynamicType, (nullable) ObjectType,
@@ -7450,13 +7453,13 @@
   // Return true if this vector contains a recursive type argument.
   bool IsRecursive() const;
 
-  virtual RawInstance* CheckAndCanonicalize(Thread* thread,
-                                            const char** error_str) const {
+  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
+                                           const char** error_str) const {
     return Canonicalize();
   }
 
   // Canonicalize only if instantiated, otherwise returns 'this'.
-  RawTypeArguments* Canonicalize(TrailPtr trail = NULL) const;
+  TypeArgumentsPtr Canonicalize(TrailPtr trail = NULL) const;
 
   // Add the class name and URI of each type argument of this vector to the uris
   // list and mark ambiguous triplets to be printed.
@@ -7467,7 +7470,7 @@
   // where each reference to a type parameter is replaced with the corresponding
   // type from the various type argument vectors (class instantiator, function,
   // or parent functions via the current context).
-  RawTypeArguments* InstantiateFrom(
+  TypeArgumentsPtr InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
@@ -7476,7 +7479,7 @@
 
   // Runtime instantiation with canonicalization. Not to be used during type
   // finalization at compile time.
-  RawTypeArguments* InstantiateAndCanonicalizeFrom(
+  TypeArgumentsPtr InstantiateAndCanonicalizeFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments) const;
 
@@ -7503,25 +7506,25 @@
   intptr_t NumInstantiations() const;
 
   static intptr_t instantiations_offset() {
-    return OFFSET_OF(RawTypeArguments, instantiations_);
+    return OFFSET_OF(TypeArgumentsLayout, instantiations_);
   }
 
   static const intptr_t kBytesPerElement = kWordSize;
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawTypeArguments) ==
-           OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types));
+    ASSERT(sizeof(TypeArgumentsLayout) ==
+           OFFSET_OF_RETURNED_VALUE(TypeArgumentsLayout, types));
     return 0;
   }
 
   static intptr_t InstanceSize(intptr_t len) {
     // Ensure that the types() is not adding to the object size, which includes
     // 4 fields: instantiations_, length_, hash_, and nullability_.
-    ASSERT(sizeof(RawTypeArguments) ==
-           (sizeof(RawObject) + (kNumFields * kWordSize)));
+    ASSERT(sizeof(TypeArgumentsLayout) ==
+           (sizeof(ObjectLayout) + (kNumFields * kWordSize)));
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(sizeof(RawTypeArguments) +
+    return RoundedAllocationSize(sizeof(TypeArgumentsLayout) +
                                  (len * kBytesPerElement));
   }
 
@@ -7531,7 +7534,7 @@
   }
   intptr_t Hash() const;
 
-  static RawTypeArguments* New(intptr_t len, Heap::Space space = Heap::kOld);
+  static TypeArgumentsPtr New(intptr_t len, Heap::Space space = Heap::kOld);
 
  private:
   intptr_t ComputeNullability() const;
@@ -7548,9 +7551,9 @@
                       intptr_t from_index,
                       intptr_t len) const;
 
-  RawArray* instantiations() const;
+  ArrayPtr instantiations() const;
   void set_instantiations(const Array& value) const;
-  RawAbstractType* const* TypeAddr(intptr_t index) const;
+  AbstractTypePtr const* TypeAddr(intptr_t index) const;
   void SetLength(intptr_t value) const;
   // Number of fields in the raw object is 4:
   // instantiations_, length_, hash_ and nullability_.
@@ -7595,15 +7598,15 @@
   // assigned to this type.
   bool IsStrictlyNonNullable() const;
 
-  virtual RawAbstractType* SetInstantiatedNullability(
+  virtual AbstractTypePtr SetInstantiatedNullability(
       const TypeParameter& type_param,
       Heap::Space space) const;
-  virtual RawAbstractType* NormalizeFutureOrType(Heap::Space space) const;
+  virtual AbstractTypePtr NormalizeFutureOrType(Heap::Space space) const;
 
   virtual bool HasTypeClass() const { return type_class_id() != kIllegalCid; }
   virtual classid_t type_class_id() const;
-  virtual RawClass* type_class() const;
-  virtual RawTypeArguments* arguments() const;
+  virtual ClassPtr type_class() const;
+  virtual TypeArgumentsPtr arguments() const;
   virtual void set_arguments(const TypeArguments& value) const;
   virtual TokenPosition token_pos() const;
   virtual bool IsInstantiated(Genericity genericity = kAny,
@@ -7635,20 +7638,20 @@
   // must remain uninstantiated, because only T is a free variable in this type.
   //
   // Return a new type, or return 'this' if it is already instantiated.
-  virtual RawAbstractType* InstantiateFrom(
+  virtual AbstractTypePtr InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
       TrailPtr instantiation_trail,
       Heap::Space space) const;
 
-  virtual RawInstance* CheckAndCanonicalize(Thread* thread,
-                                            const char** error_str) const {
+  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
+                                           const char** error_str) const {
     return Canonicalize();
   }
 
   // Return the canonical version of this type.
-  virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
+  virtual AbstractTypePtr Canonicalize(TrailPtr trail = NULL) const;
 
 #if defined(DEBUG)
   // Check if abstract type is canonical.
@@ -7660,7 +7663,7 @@
 
   // Return the object associated with the receiver in the trail or
   // AbstractType::null() if the receiver is not contained in the trail.
-  RawAbstractType* OnlyBuddyInTrail(TrailPtr trail) const;
+  AbstractTypePtr OnlyBuddyInTrail(TrailPtr trail) const;
 
   // If the trail is null, allocate a trail, add the pair <receiver, buddy> to
   // the trail. The receiver may only be added once with its only buddy.
@@ -7681,18 +7684,18 @@
   static void AddURI(URIs* uris, const String& name, const String& uri);
 
   // Return a formatted string of the uris.
-  static RawString* PrintURIs(URIs* uris);
+  static StringPtr PrintURIs(URIs* uris);
 
   // Returns a C-String (possibly "") representing the nullability of this type.
   // Legacy and undetermined suffixes are only displayed with kInternalName.
   virtual const char* NullabilitySuffix(NameVisibility name_visibility) const;
 
   // The name of this type, including the names of its type arguments, if any.
-  virtual RawString* Name() const;
+  virtual StringPtr Name() const;
 
   // The name of this type, including the names of its type arguments, if any.
   // Names of internal classes are mapped to their public interfaces.
-  virtual RawString* UserVisibleName() const;
+  virtual StringPtr UserVisibleName() const;
 
   // Return the internal or public name of this type, including the names of its
   // type arguments, if any.
@@ -7706,7 +7709,7 @@
 
   // The name of this type's class, i.e. without the type argument names of this
   // type.
-  RawString* ClassName() const;
+  StringPtr ClassName() const;
 
   // Check if this type is a still uninitialized TypeRef.
   bool IsNullTypeRef() const;
@@ -7777,7 +7780,7 @@
 
   // Returns the type argument of this (possibly nested) 'FutureOr' type.
   // Returns unmodified type if this type is not a 'FutureOr' type.
-  RawAbstractType* UnwrapFutureOr() const;
+  AbstractTypePtr UnwrapFutureOr() const;
 
   // Check the subtype relationship.
   bool IsSubtypeOf(const AbstractType& other, Heap::Space space) const;
@@ -7791,13 +7794,13 @@
       const TypeArguments& function_type_args);
 
   static intptr_t type_test_stub_entry_point_offset() {
-    return OFFSET_OF(RawAbstractType, type_test_stub_entry_point_);
+    return OFFSET_OF(AbstractTypeLayout, type_test_stub_entry_point_);
   }
 
   uword type_test_stub_entry_point() const {
     return raw_ptr()->type_test_stub_entry_point_;
   }
-  RawCode* type_test_stub() const { return raw_ptr()->type_test_stub_; }
+  CodePtr type_test_stub() const { return raw_ptr()->type_test_stub_; }
 
   void SetTypeTestingStub(const Code& stub) const;
 
@@ -7818,30 +7821,32 @@
 // A Type consists of a class, possibly parameterized with type
 // arguments. Example: C<T1, T2>.
 //
-// Caution: 'RawType*' denotes a 'raw' pointer to a VM object of class Type, as
+// Caution: 'TypePtr' denotes a 'raw' pointer to a VM object of class Type, as
 // opposed to 'Type' denoting a 'handle' to the same object. 'RawType' does not
 // relate to a 'raw type', as opposed to a 'cooked type' or 'rare type'.
 class Type : public AbstractType {
  public:
   static intptr_t type_class_id_offset() {
-    return OFFSET_OF(RawType, type_class_id_);
+    return OFFSET_OF(TypeLayout, type_class_id_);
   }
-  static intptr_t arguments_offset() { return OFFSET_OF(RawType, arguments_); }
+  static intptr_t arguments_offset() {
+    return OFFSET_OF(TypeLayout, arguments_);
+  }
   static intptr_t type_state_offset() {
-    return OFFSET_OF(RawType, type_state_);
+    return OFFSET_OF(TypeLayout, type_state_);
   }
-  static intptr_t hash_offset() { return OFFSET_OF(RawType, hash_); }
+  static intptr_t hash_offset() { return OFFSET_OF(TypeLayout, hash_); }
   static intptr_t nullability_offset() {
-    return OFFSET_OF(RawType, nullability_);
+    return OFFSET_OF(TypeLayout, nullability_);
   }
   virtual bool IsFinalized() const {
-    return (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) ||
-           (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated);
+    return (raw_ptr()->type_state_ == TypeLayout::kFinalizedInstantiated) ||
+           (raw_ptr()->type_state_ == TypeLayout::kFinalizedUninstantiated);
   }
   virtual void SetIsFinalized() const;
   void ResetIsFinalized() const;  // Ignore current state and set again.
   virtual bool IsBeingFinalized() const {
-    return raw_ptr()->type_state_ == RawType::kBeingFinalized;
+    return raw_ptr()->type_state_ == TypeLayout::kBeingFinalized;
   }
   virtual void SetIsBeingFinalized() const;
   virtual bool HasTypeClass() const {
@@ -7851,11 +7856,11 @@
   virtual Nullability nullability() const {
     return static_cast<Nullability>(raw_ptr()->nullability_);
   }
-  RawType* ToNullability(Nullability value, Heap::Space space) const;
+  TypePtr ToNullability(Nullability value, Heap::Space space) const;
   virtual classid_t type_class_id() const;
-  virtual RawClass* type_class() const;
+  virtual ClassPtr type_class() const;
   void set_type_class(const Class& value) const;
-  virtual RawTypeArguments* arguments() const { return raw_ptr()->arguments_; }
+  virtual TypeArgumentsPtr arguments() const { return raw_ptr()->arguments_; }
   virtual void set_arguments(const TypeArguments& value) const;
   virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
   virtual bool IsInstantiated(Genericity genericity = kAny,
@@ -7874,20 +7879,22 @@
   // the signature fully represents the type and type arguments can be ignored.
   // However, in case of a generic typedef, they document how the typedef class
   // was parameterized to obtain the actual signature.
-  RawFunction* signature() const;
+  FunctionPtr signature() const;
   void set_signature(const Function& value) const;
-  static intptr_t signature_offset() { return OFFSET_OF(RawType, signature_); }
+  static intptr_t signature_offset() {
+    return OFFSET_OF(TypeLayout, signature_);
+  }
 
   virtual bool IsFunctionType() const {
     return signature() != Function::null();
   }
-  virtual RawAbstractType* InstantiateFrom(
+  virtual AbstractTypePtr InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
       TrailPtr instantiation_trail,
       Heap::Space space) const;
-  virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
+  virtual AbstractTypePtr Canonicalize(TrailPtr trail = NULL) const;
 #if defined(DEBUG)
   // Check if type is canonical.
   virtual bool CheckIsCanonical(Thread* thread) const;
@@ -7898,77 +7905,77 @@
   intptr_t ComputeHash() const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawType));
+    return RoundedAllocationSize(sizeof(TypeLayout));
   }
 
   // The type of the literal 'null'.
-  static RawType* NullType();
+  static TypePtr NullType();
 
   // The 'dynamic' type.
-  static RawType* DynamicType();
+  static TypePtr DynamicType();
 
   // The 'void' type.
-  static RawType* VoidType();
+  static TypePtr VoidType();
 
   // The 'Never' type.
-  static RawType* NeverType();
+  static TypePtr NeverType();
 
   // The 'Object' type.
-  static RawType* ObjectType();
+  static TypePtr ObjectType();
 
   // The 'bool' type.
-  static RawType* BoolType();
+  static TypePtr BoolType();
 
   // The 'int' type.
-  static RawType* IntType();
+  static TypePtr IntType();
 
   // The 'int?' type.
-  static RawType* NullableIntType();
+  static TypePtr NullableIntType();
 
   // The 'Smi' type.
-  static RawType* SmiType();
+  static TypePtr SmiType();
 
   // The 'Mint' type.
-  static RawType* MintType();
+  static TypePtr MintType();
 
   // The 'double' type.
-  static RawType* Double();
+  static TypePtr Double();
 
   // The 'double?' type.
-  static RawType* NullableDouble();
+  static TypePtr NullableDouble();
 
   // The 'Float32x4' type.
-  static RawType* Float32x4();
+  static TypePtr Float32x4();
 
   // The 'Float64x2' type.
-  static RawType* Float64x2();
+  static TypePtr Float64x2();
 
   // The 'Int32x4' type.
-  static RawType* Int32x4();
+  static TypePtr Int32x4();
 
   // The 'num' type.
-  static RawType* Number();
+  static TypePtr Number();
 
   // The 'String' type.
-  static RawType* StringType();
+  static TypePtr StringType();
 
   // The 'Array' type.
-  static RawType* ArrayType();
+  static TypePtr ArrayType();
 
   // The 'Function' type.
-  static RawType* DartFunctionType();
+  static TypePtr DartFunctionType();
 
   // The 'Type' type.
-  static RawType* DartTypeType();
+  static TypePtr DartTypeType();
 
   // The finalized type of the given non-parameterized class.
-  static RawType* NewNonParameterizedType(const Class& type_class);
+  static TypePtr NewNonParameterizedType(const Class& type_class);
 
-  static RawType* New(const Class& clazz,
-                      const TypeArguments& arguments,
-                      TokenPosition token_pos,
-                      Nullability nullability = Nullability::kLegacy,
-                      Heap::Space space = Heap::kOld);
+  static TypePtr New(const Class& clazz,
+                     const TypeArguments& arguments,
+                     TokenPosition token_pos,
+                     Nullability nullability = Nullability::kLegacy,
+                     Heap::Space space = Heap::kOld);
 
  private:
   void SetHash(intptr_t value) const;
@@ -7980,7 +7987,7 @@
     StoreNonPointer(&raw_ptr()->nullability_, static_cast<int8_t>(value));
   }
 
-  static RawType* New(Heap::Space space = Heap::kOld);
+  static TypePtr New(Heap::Space space = Heap::kOld);
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Type, AbstractType);
   friend class Class;
@@ -7994,7 +8001,7 @@
 // Note that the cycle always involves type arguments.
 class TypeRef : public AbstractType {
  public:
-  static intptr_t type_offset() { return OFFSET_OF(RawTypeRef, type_); }
+  static intptr_t type_offset() { return OFFSET_OF(TypeRefLayout, type_); }
 
   virtual bool IsFinalized() const {
     const AbstractType& ref_type = AbstractType::Handle(type());
@@ -8013,15 +8020,15 @@
     return (type() != AbstractType::null()) &&
            AbstractType::Handle(type()).HasTypeClass();
   }
-  RawAbstractType* type() const { return raw_ptr()->type_; }
+  AbstractTypePtr type() const { return raw_ptr()->type_; }
   void set_type(const AbstractType& value) const;
   virtual classid_t type_class_id() const {
     return AbstractType::Handle(type()).type_class_id();
   }
-  virtual RawClass* type_class() const {
+  virtual ClassPtr type_class() const {
     return AbstractType::Handle(type()).type_class();
   }
-  virtual RawTypeArguments* arguments() const {
+  virtual TypeArgumentsPtr arguments() const {
     return AbstractType::Handle(type()).arguments();
   }
   virtual TokenPosition token_pos() const {
@@ -8038,13 +8045,13 @@
     const AbstractType& ref_type = AbstractType::Handle(type());
     return !ref_type.IsNull() && ref_type.IsFunctionType();
   }
-  virtual RawTypeRef* InstantiateFrom(
+  virtual AbstractTypePtr InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
       TrailPtr instantiation_trail,
       Heap::Space space) const;
-  virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
+  virtual AbstractTypePtr Canonicalize(TrailPtr trail = NULL) const;
 #if defined(DEBUG)
   // Check if typeref is canonical.
   virtual bool CheckIsCanonical(Thread* thread) const;
@@ -8054,13 +8061,13 @@
   virtual intptr_t Hash() const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawTypeRef));
+    return RoundedAllocationSize(sizeof(TypeRefLayout));
   }
 
-  static RawTypeRef* New(const AbstractType& type);
+  static TypeRefPtr New(const AbstractType& type);
 
  private:
-  static RawTypeRef* New();
+  static TypeRefPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeRef, AbstractType);
   friend class Class;
@@ -8079,23 +8086,24 @@
 class TypeParameter : public AbstractType {
  public:
   virtual bool IsFinalized() const {
-    return RawTypeParameter::FinalizedBit::decode(raw_ptr()->flags_);
+    return TypeParameterLayout::FinalizedBit::decode(raw_ptr()->flags_);
   }
   virtual void SetIsFinalized() const;
   virtual bool IsBeingFinalized() const { return false; }
   bool IsGenericCovariantImpl() const {
-    return RawTypeParameter::GenericCovariantImplBit::decode(raw_ptr()->flags_);
+    return TypeParameterLayout::GenericCovariantImplBit::decode(
+        raw_ptr()->flags_);
   }
   void SetGenericCovariantImpl(bool value) const;
   virtual Nullability nullability() const {
     return static_cast<Nullability>(raw_ptr()->nullability_);
   }
-  RawTypeParameter* ToNullability(Nullability value, Heap::Space space) const;
+  TypeParameterPtr ToNullability(Nullability value, Heap::Space space) const;
   virtual bool HasTypeClass() const { return false; }
   virtual classid_t type_class_id() const { return kIllegalCid; }
   classid_t parameterized_class_id() const;
-  RawClass* parameterized_class() const;
-  RawFunction* parameterized_function() const {
+  ClassPtr parameterized_class() const;
+  FunctionPtr parameterized_function() const {
     return raw_ptr()->parameterized_function_;
   }
   bool IsClassTypeParameter() const {
@@ -8104,10 +8112,10 @@
   bool IsFunctionTypeParameter() const {
     return parameterized_function() != Function::null();
   }
-  RawString* name() const { return raw_ptr()->name_; }
+  StringPtr name() const { return raw_ptr()->name_; }
   intptr_t index() const { return raw_ptr()->index_; }
   void set_index(intptr_t value) const;
-  RawAbstractType* bound() const { return raw_ptr()->bound_; }
+  AbstractTypePtr bound() const { return raw_ptr()->bound_; }
   void set_bound(const AbstractType& value) const;
   virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
   virtual bool IsInstantiated(Genericity genericity = kAny,
@@ -8117,13 +8125,13 @@
                             TypeEquality kind,
                             TrailPtr trail = NULL) const;
   virtual bool IsRecursive() const { return false; }
-  virtual RawAbstractType* InstantiateFrom(
+  virtual AbstractTypePtr InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
       TrailPtr instantiation_trail,
       Heap::Space space) const;
-  virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const {
+  virtual AbstractTypePtr Canonicalize(TrailPtr trail = NULL) const {
     return raw();
   }
 #if defined(DEBUG)
@@ -8138,23 +8146,23 @@
   // given [instantiator_type_arguments] and [function_type_arguments].
   // Unlike InstantiateFrom, nullability of type parameter is not applied to
   // the result.
-  RawAbstractType* GetFromTypeArguments(
+  AbstractTypePtr GetFromTypeArguments(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawTypeParameter));
+    return RoundedAllocationSize(sizeof(TypeParameterLayout));
   }
 
   // Only one of parameterized_class and parameterized_function is non-null.
-  static RawTypeParameter* New(const Class& parameterized_class,
-                               const Function& parameterized_function,
-                               intptr_t index,
-                               const String& name,
-                               const AbstractType& bound,
-                               bool is_generic_covariant_impl,
-                               Nullability nullability,
-                               TokenPosition token_pos);
+  static TypeParameterPtr New(const Class& parameterized_class,
+                              const Function& parameterized_function,
+                              intptr_t index,
+                              const String& name,
+                              const AbstractType& bound,
+                              bool is_generic_covariant_impl,
+                              Nullability nullability,
+                              TokenPosition token_pos);
 
  private:
   intptr_t ComputeHash() const;
@@ -8167,7 +8175,7 @@
   void set_flags(uint8_t flags) const;
   void set_nullability(Nullability value) const;
 
-  static RawTypeParameter* New();
+  static TypeParameterPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeParameter, AbstractType);
   friend class Class;
@@ -8177,11 +8185,11 @@
 class Number : public Instance {
  public:
   // TODO(iposva): Add more useful Number methods.
-  RawString* ToString(Heap::Space space) const;
+  StringPtr ToString(Heap::Space space) const;
 
   // Numbers are canonicalized differently from other instances/strings.
-  virtual RawInstance* CheckAndCanonicalize(Thread* thread,
-                                            const char** error_str) const;
+  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
+                                           const char** error_str) const;
 
 #if defined(DEBUG)
   // Check if number is canonical.
@@ -8196,20 +8204,20 @@
 
 class Integer : public Number {
  public:
-  static RawInteger* New(const String& str, Heap::Space space = Heap::kNew);
+  static IntegerPtr New(const String& str, Heap::Space space = Heap::kNew);
 
   // Creates a new Integer by given uint64_t value.
   // Silently casts value to int64_t with wrap-around if it is greater
   // than kMaxInt64.
-  static RawInteger* NewFromUint64(uint64_t value,
-                                   Heap::Space space = Heap::kNew);
+  static IntegerPtr NewFromUint64(uint64_t value,
+                                  Heap::Space space = Heap::kNew);
 
   // Returns a canonical Integer object allocated in the old gen space.
   // Returns null if integer is out of range.
-  static RawInteger* NewCanonical(const String& str);
-  static RawInteger* NewCanonical(int64_t value);
+  static IntegerPtr NewCanonical(const String& str);
+  static IntegerPtr NewCanonical(int64_t value);
 
-  static RawInteger* New(int64_t value, Heap::Space space = Heap::kNew);
+  static IntegerPtr New(int64_t value, Heap::Space space = Heap::kNew);
 
   // Returns true iff the given uint64_t value is representable as Dart integer.
   static bool IsValueInRange(uint64_t value);
@@ -8223,7 +8231,7 @@
   virtual uint32_t CanonicalizeHash() const { return AsTruncatedUint32Value(); }
   virtual bool Equals(const Instance& other) const;
 
-  virtual RawObject* HashCode() const { return raw(); }
+  virtual ObjectPtr HashCode() const { return raw(); }
 
   virtual bool IsZero() const;
   virtual bool IsNegative() const;
@@ -8242,26 +8250,26 @@
   const char* ToHexCString(Zone* zone) const;
 
   // Return the most compact presentation of an integer.
-  RawInteger* AsValidInteger() const;
+  IntegerPtr AsValidInteger() const;
 
   // Returns null to indicate that a bigint operation is required.
-  RawInteger* ArithmeticOp(Token::Kind operation,
-                           const Integer& other,
-                           Heap::Space space = Heap::kNew) const;
-  RawInteger* BitOp(Token::Kind operation,
-                    const Integer& other,
-                    Heap::Space space = Heap::kNew) const;
-  RawInteger* ShiftOp(Token::Kind operation,
-                      const Integer& other,
-                      Heap::Space space = Heap::kNew) const;
+  IntegerPtr ArithmeticOp(Token::Kind operation,
+                          const Integer& other,
+                          Heap::Space space = Heap::kNew) const;
+  IntegerPtr BitOp(Token::Kind operation,
+                   const Integer& other,
+                   Heap::Space space = Heap::kNew) const;
+  IntegerPtr ShiftOp(Token::Kind operation,
+                     const Integer& other,
+                     Heap::Space space = Heap::kNew) const;
 
-  static int64_t GetInt64Value(const RawInteger* obj) {
-    intptr_t raw_value = reinterpret_cast<intptr_t>(obj);
+  static int64_t GetInt64Value(const IntegerPtr obj) {
+    intptr_t raw_value = static_cast<intptr_t>(obj);
     if ((raw_value & kSmiTagMask) == kSmiTag) {
       return (raw_value >> kSmiTagShift);
     } else {
       ASSERT(obj->IsMint());
-      return reinterpret_cast<const RawMint*>(obj)->ptr()->value_;
+      return static_cast<const MintPtr>(obj)->ptr()->value_;
     }
   }
 
@@ -8276,7 +8284,7 @@
   static const intptr_t kMaxValue = kSmiMax;
   static const intptr_t kMinValue = kSmiMin;
 
-  intptr_t Value() const { return ValueFromRawSmi(raw()); }
+  intptr_t Value() const { return RawSmiValue(raw()); }
 
   virtual bool Equals(const Instance& other) const;
   virtual bool IsZero() const { return Value() == 0; }
@@ -8292,35 +8300,33 @@
 
   static intptr_t InstanceSize() { return 0; }
 
-  static RawSmi* New(intptr_t value) {
-    RawSmi* raw_smi = reinterpret_cast<RawSmi*>(
+  static SmiPtr New(intptr_t value) {
+    SmiPtr raw_smi = static_cast<SmiPtr>(
         (static_cast<uintptr_t>(value) << kSmiTagShift) | kSmiTag);
-    ASSERT(ValueFromRawSmi(raw_smi) == value);
+    ASSERT(RawSmiValue(raw_smi) == value);
     return raw_smi;
   }
 
-  static RawSmi* FromAlignedAddress(uword address) {
+  static SmiPtr FromAlignedAddress(uword address) {
     ASSERT((address & kSmiTagMask) == kSmiTag);
-    return reinterpret_cast<RawSmi*>(address);
+    return static_cast<SmiPtr>(address);
   }
 
-  static RawClass* Class();
+  static ClassPtr Class();
 
-  static intptr_t Value(const RawSmi* raw_smi) {
-    return ValueFromRawSmi(raw_smi);
-  }
+  static intptr_t Value(const SmiPtr raw_smi) { return RawSmiValue(raw_smi); }
 
   static intptr_t RawValue(intptr_t value) {
-    return reinterpret_cast<intptr_t>(New(value));
+    return static_cast<intptr_t>(New(value));
   }
 
   static bool IsValid(int64_t value) { return compiler::target::IsSmi(value); }
 
-  void operator=(RawSmi* value) {
+  void operator=(SmiPtr value) {
     raw_ = value;
     CHECK_HANDLE();
   }
-  void operator^=(RawObject* value) {
+  void operator^=(ObjectPtr value) {
     raw_ = value;
     CHECK_HANDLE();
   }
@@ -8362,7 +8368,7 @@
       static_cast<int64_t>(DART_2PART_UINT64_C(0x80000000, 00000000));
 
   int64_t value() const { return raw_ptr()->value_; }
-  static intptr_t value_offset() { return OFFSET_OF(RawMint, value_); }
+  static intptr_t value_offset() { return OFFSET_OF(MintLayout, value_); }
 
   virtual bool IsZero() const { return value() == 0; }
   virtual bool IsNegative() const { return value() < 0; }
@@ -8378,16 +8384,16 @@
   virtual int CompareWith(const Integer& other) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawMint));
+    return RoundedAllocationSize(sizeof(MintLayout));
   }
 
  protected:
   // Only Integer::NewXXX is allowed to call Mint::NewXXX directly.
   friend class Integer;
 
-  static RawMint* New(int64_t value, Heap::Space space = Heap::kNew);
+  static MintPtr New(int64_t value, Heap::Space space = Heap::kNew);
 
-  static RawMint* NewCanonical(int64_t value);
+  static MintPtr NewCanonical(int64_t value);
 
  private:
   void set_value(int64_t value) const;
@@ -8408,23 +8414,23 @@
   virtual bool CanonicalizeEquals(const Instance& other) const;
   virtual uint32_t CanonicalizeHash() const;
 
-  static RawDouble* New(double d, Heap::Space space = Heap::kNew);
+  static DoublePtr New(double d, Heap::Space space = Heap::kNew);
 
-  static RawDouble* New(const String& str, Heap::Space space = Heap::kNew);
+  static DoublePtr New(const String& str, Heap::Space space = Heap::kNew);
 
   // Returns a canonical double object allocated in the old gen space.
-  static RawDouble* NewCanonical(double d);
+  static DoublePtr NewCanonical(double d);
 
   // Returns a canonical double object (allocated in the old gen space) or
   // Double::null() if str points to a string that does not convert to a
   // double value.
-  static RawDouble* NewCanonical(const String& str);
+  static DoublePtr NewCanonical(const String& str);
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawDouble));
+    return RoundedAllocationSize(sizeof(DoubleLayout));
   }
 
-  static intptr_t value_offset() { return OFFSET_OF(RawDouble, value_); }
+  static intptr_t value_offset() { return OFFSET_OF(DoubleLayout, value_); }
 
  private:
   void set_value(double value) const;
@@ -8449,9 +8455,10 @@
 // simple.  We choose a value that will prevent integer overflow for
 // 2 byte strings, since it is the worst case.
 #if defined(HASH_IN_OBJECT_HEADER)
-  static const intptr_t kSizeofRawString = sizeof(RawInstance) + kWordSize;
+  static const intptr_t kSizeofRawString = sizeof(InstanceLayout) + kWordSize;
 #else
-  static const intptr_t kSizeofRawString = sizeof(RawInstance) + 2 * kWordSize;
+  static const intptr_t kSizeofRawString =
+      sizeof(InstanceLayout) + 2 * kWordSize;
 #endif
   static const intptr_t kMaxElements = kSmiMax / kTwoByteChar;
 
@@ -8485,7 +8492,7 @@
   };
 
   intptr_t Length() const { return Smi::Value(raw_ptr()->length_); }
-  static intptr_t length_offset() { return OFFSET_OF(RawString, length_); }
+  static intptr_t length_offset() { return OFFSET_OF(StringLayout, length_); }
 
   intptr_t Hash() const {
     intptr_t result = GetCachedHash(raw());
@@ -8497,20 +8504,20 @@
     return result;
   }
 
-  static intptr_t Hash(RawString* raw);
+  static intptr_t Hash(StringPtr raw);
 
   bool HasHash() const {
-    ASSERT(Smi::New(0) == NULL);
+    ASSERT(Smi::New(0) == nullptr);
     return GetCachedHash(raw()) != 0;
   }
 
-  static intptr_t hash_offset() { return OFFSET_OF(RawString, hash_); }
+  static intptr_t hash_offset() { return OFFSET_OF(StringLayout, hash_); }
   static intptr_t Hash(const String& str, intptr_t begin_index, intptr_t len);
   static intptr_t Hash(const char* characters, intptr_t len);
   static intptr_t Hash(const uint16_t* characters, intptr_t len);
   static intptr_t Hash(const int32_t* characters, intptr_t len);
-  static intptr_t HashRawSymbol(const RawString* symbol) {
-    ASSERT(symbol->IsCanonical());
+  static intptr_t HashRawSymbol(const StringPtr symbol) {
+    ASSERT(symbol->ptr()->IsCanonical());
     intptr_t result = GetCachedHash(symbol);
     ASSERT(result != 0);
     return result;
@@ -8519,7 +8526,7 @@
   // Returns the hash of str1 + str2.
   static intptr_t HashConcat(const String& str1, const String& str2);
 
-  virtual RawObject* HashCode() const { return Integer::New(Hash()); }
+  virtual ObjectPtr HashCode() const { return Integer::New(Hash()); }
 
   uint16_t CharAt(intptr_t index) const;
 
@@ -8563,15 +8570,15 @@
   bool EndsWith(const String& other) const;
 
   // Strings are canonicalized using the symbol table.
-  virtual RawInstance* CheckAndCanonicalize(Thread* thread,
-                                            const char** error_str) const;
+  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
+                                           const char** error_str) const;
 
 #if defined(DEBUG)
   // Check if string is canonical.
   virtual bool CheckIsCanonical(Thread* thread) const;
 #endif  // DEBUG
 
-  bool IsSymbol() const { return raw()->IsCanonical(); }
+  bool IsSymbol() const { return raw()->ptr()->IsCanonical(); }
 
   bool IsOneByteString() const {
     return raw()->GetClassId() == kOneByteStringCid;
@@ -8601,48 +8608,48 @@
   // Creates a new String object from a C string that is assumed to contain
   // UTF-8 encoded characters and '\0' is considered a termination character.
   // TODO(7123) - Rename this to FromCString(....).
-  static RawString* New(const char* cstr, Heap::Space space = Heap::kNew);
+  static StringPtr New(const char* cstr, Heap::Space space = Heap::kNew);
 
   // Creates a new String object from an array of UTF-8 encoded characters.
-  static RawString* FromUTF8(const uint8_t* utf8_array,
+  static StringPtr FromUTF8(const uint8_t* utf8_array,
+                            intptr_t array_len,
+                            Heap::Space space = Heap::kNew);
+
+  // Creates a new String object from an array of Latin-1 encoded characters.
+  static StringPtr FromLatin1(const uint8_t* latin1_array,
+                              intptr_t array_len,
+                              Heap::Space space = Heap::kNew);
+
+  // Creates a new String object from an array of UTF-16 encoded characters.
+  static StringPtr FromUTF16(const uint16_t* utf16_array,
                              intptr_t array_len,
                              Heap::Space space = Heap::kNew);
 
-  // Creates a new String object from an array of Latin-1 encoded characters.
-  static RawString* FromLatin1(const uint8_t* latin1_array,
-                               intptr_t array_len,
-                               Heap::Space space = Heap::kNew);
-
-  // Creates a new String object from an array of UTF-16 encoded characters.
-  static RawString* FromUTF16(const uint16_t* utf16_array,
-                              intptr_t array_len,
-                              Heap::Space space = Heap::kNew);
-
   // Creates a new String object from an array of UTF-32 encoded characters.
-  static RawString* FromUTF32(const int32_t* utf32_array,
-                              intptr_t array_len,
-                              Heap::Space space = Heap::kNew);
+  static StringPtr FromUTF32(const int32_t* utf32_array,
+                             intptr_t array_len,
+                             Heap::Space space = Heap::kNew);
 
   // Create a new String object from another Dart String instance.
-  static RawString* New(const String& str, Heap::Space space = Heap::kNew);
+  static StringPtr New(const String& str, Heap::Space space = Heap::kNew);
 
   // Creates a new External String object using the specified array of
   // UTF-8 encoded characters as the external reference.
-  static RawString* NewExternal(const uint8_t* utf8_array,
-                                intptr_t array_len,
-                                void* peer,
-                                intptr_t external_allocation_size,
-                                Dart_WeakPersistentHandleFinalizer callback,
-                                Heap::Space = Heap::kNew);
+  static StringPtr NewExternal(const uint8_t* utf8_array,
+                               intptr_t array_len,
+                               void* peer,
+                               intptr_t external_allocation_size,
+                               Dart_WeakPersistentHandleFinalizer callback,
+                               Heap::Space = Heap::kNew);
 
   // Creates a new External String object using the specified array of
   // UTF-16 encoded characters as the external reference.
-  static RawString* NewExternal(const uint16_t* utf16_array,
-                                intptr_t array_len,
-                                void* peer,
-                                intptr_t external_allocation_size,
-                                Dart_WeakPersistentHandleFinalizer callback,
-                                Heap::Space = Heap::kNew);
+  static StringPtr NewExternal(const uint16_t* utf16_array,
+                               intptr_t array_len,
+                               void* peer,
+                               intptr_t external_allocation_size,
+                               Dart_WeakPersistentHandleFinalizer callback,
+                               Heap::Space = Heap::kNew);
 
   static void Copy(const String& dst,
                    intptr_t dst_offset,
@@ -8658,62 +8665,61 @@
                    intptr_t src_offset,
                    intptr_t len);
 
-  static RawString* EscapeSpecialCharacters(const String& str);
+  static StringPtr EscapeSpecialCharacters(const String& str);
   // Encodes 'str' for use in an Internationalized Resource Identifier (IRI),
   // a generalization of URI (percent-encoding). See RFC 3987.
   static const char* EncodeIRI(const String& str);
   // Returns null if 'str' is not a valid encoding.
-  static RawString* DecodeIRI(const String& str);
-  static RawString* Concat(const String& str1,
-                           const String& str2,
-                           Heap::Space space = Heap::kNew);
-  static RawString* ConcatAll(const Array& strings,
-                              Heap::Space space = Heap::kNew);
+  static StringPtr DecodeIRI(const String& str);
+  static StringPtr Concat(const String& str1,
+                          const String& str2,
+                          Heap::Space space = Heap::kNew);
+  static StringPtr ConcatAll(const Array& strings,
+                             Heap::Space space = Heap::kNew);
   // Concat all strings in 'strings' from 'start' to 'end' (excluding).
-  static RawString* ConcatAllRange(const Array& strings,
-                                   intptr_t start,
-                                   intptr_t end,
-                                   Heap::Space space = Heap::kNew);
+  static StringPtr ConcatAllRange(const Array& strings,
+                                  intptr_t start,
+                                  intptr_t end,
+                                  Heap::Space space = Heap::kNew);
 
-  static RawString* SubString(const String& str,
-                              intptr_t begin_index,
-                              Heap::Space space = Heap::kNew);
-  static RawString* SubString(const String& str,
-                              intptr_t begin_index,
-                              intptr_t length,
-                              Heap::Space space = Heap::kNew) {
+  static StringPtr SubString(const String& str,
+                             intptr_t begin_index,
+                             Heap::Space space = Heap::kNew);
+  static StringPtr SubString(const String& str,
+                             intptr_t begin_index,
+                             intptr_t length,
+                             Heap::Space space = Heap::kNew) {
     return SubString(Thread::Current(), str, begin_index, length, space);
   }
-  static RawString* SubString(Thread* thread,
-                              const String& str,
-                              intptr_t begin_index,
-                              intptr_t length,
-                              Heap::Space space = Heap::kNew);
+  static StringPtr SubString(Thread* thread,
+                             const String& str,
+                             intptr_t begin_index,
+                             intptr_t length,
+                             Heap::Space space = Heap::kNew);
 
-  static RawString* Transform(int32_t (*mapping)(int32_t ch),
-                              const String& str,
-                              Heap::Space space = Heap::kNew);
+  static StringPtr Transform(int32_t (*mapping)(int32_t ch),
+                             const String& str,
+                             Heap::Space space = Heap::kNew);
 
-  static RawString* ToUpperCase(const String& str,
-                                Heap::Space space = Heap::kNew);
-  static RawString* ToLowerCase(const String& str,
-                                Heap::Space space = Heap::kNew);
+  static StringPtr ToUpperCase(const String& str,
+                               Heap::Space space = Heap::kNew);
+  static StringPtr ToLowerCase(const String& str,
+                               Heap::Space space = Heap::kNew);
 
-  static RawString* RemovePrivateKey(const String& name);
+  static StringPtr RemovePrivateKey(const String& name);
 
   static const char* ScrubName(const String& name, bool is_extension = false);
-  static RawString* ScrubNameRetainPrivate(const String& name,
-                                           bool is_extension = false);
+  static StringPtr ScrubNameRetainPrivate(const String& name,
+                                          bool is_extension = false);
 
   static bool EqualsIgnoringPrivateKey(const String& str1, const String& str2);
 
-  static RawString* NewFormatted(const char* format, ...)
-      PRINTF_ATTRIBUTE(1, 2);
-  static RawString* NewFormatted(Heap::Space space, const char* format, ...)
+  static StringPtr NewFormatted(const char* format, ...) PRINTF_ATTRIBUTE(1, 2);
+  static StringPtr NewFormatted(Heap::Space space, const char* format, ...)
       PRINTF_ATTRIBUTE(2, 3);
-  static RawString* NewFormattedV(const char* format,
-                                  va_list args,
-                                  Heap::Space space = Heap::kNew);
+  static StringPtr NewFormattedV(const char* format,
+                                 va_list args,
+                                 Heap::Space space = Heap::kNew);
 
   static bool ParseDouble(const String& str,
                           intptr_t start,
@@ -8721,11 +8727,11 @@
                           double* result);
 
 #if !defined(HASH_IN_OBJECT_HEADER)
-  static uint32_t GetCachedHash(const RawString* obj) {
+  static uint32_t GetCachedHash(const StringPtr obj) {
     return Smi::Value(obj->ptr()->hash_);
   }
 
-  static void SetCachedHash(RawString* obj, uintptr_t hash) {
+  static void SetCachedHash(StringPtr obj, uintptr_t hash) {
     obj->ptr()->hash_ = Smi::New(hash);
   }
 #endif
@@ -8765,7 +8771,7 @@
   friend class TwoByteString;
   friend class ExternalOneByteString;
   friend class ExternalTwoByteString;
-  friend class RawOneByteString;
+  friend class OneByteStringLayout;
   friend class RODataSerializationCluster;  // SetHash
   friend class Pass2Visitor;                // Stack "handle"
 };
@@ -8782,28 +8788,28 @@
     NoSafepointScope no_safepoint;
     *CharAddr(str, index) = code_unit;
   }
-  static RawOneByteString* EscapeSpecialCharacters(const String& str);
+  static OneByteStringPtr EscapeSpecialCharacters(const String& str);
   // We use the same maximum elements for all strings.
   static const intptr_t kBytesPerElement = 1;
   static const intptr_t kMaxElements = String::kMaxElements;
 
   static intptr_t data_offset() {
-    return OFFSET_OF_RETURNED_VALUE(RawOneByteString, data);
+    return OFFSET_OF_RETURNED_VALUE(OneByteStringLayout, data);
   }
 
-  static intptr_t UnroundedSize(RawOneByteString* str) {
+  static intptr_t UnroundedSize(OneByteStringPtr str) {
     return UnroundedSize(Smi::Value(str->ptr()->length_));
   }
   static intptr_t UnroundedSize(intptr_t len) {
-    return sizeof(RawOneByteString) + (len * kBytesPerElement);
+    return sizeof(OneByteStringLayout) + (len * kBytesPerElement);
   }
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawOneByteString) ==
-           OFFSET_OF_RETURNED_VALUE(RawOneByteString, data));
+    ASSERT(sizeof(OneByteStringLayout) ==
+           OFFSET_OF_RETURNED_VALUE(OneByteStringLayout, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
-    ASSERT(sizeof(RawOneByteString) == String::kSizeofRawString);
+    ASSERT(sizeof(OneByteStringLayout) == String::kSizeofRawString);
     ASSERT(0 <= len && len <= kMaxElements);
 #if defined(HASH_IN_OBJECT_HEADER)
     // We have to pad zero-length raw strings so that they can be externalized.
@@ -8814,57 +8820,57 @@
     return String::RoundedAllocationSize(UnroundedSize(len));
   }
 
-  static RawOneByteString* New(intptr_t len, Heap::Space space);
-  static RawOneByteString* New(const char* c_string,
-                               Heap::Space space = Heap::kNew) {
+  static OneByteStringPtr New(intptr_t len, Heap::Space space);
+  static OneByteStringPtr New(const char* c_string,
+                              Heap::Space space = Heap::kNew) {
     return New(reinterpret_cast<const uint8_t*>(c_string), strlen(c_string),
                space);
   }
-  static RawOneByteString* New(const uint8_t* characters,
-                               intptr_t len,
-                               Heap::Space space);
-  static RawOneByteString* New(const uint16_t* characters,
-                               intptr_t len,
-                               Heap::Space space);
-  static RawOneByteString* New(const int32_t* characters,
-                               intptr_t len,
-                               Heap::Space space);
-  static RawOneByteString* New(const String& str, Heap::Space space);
+  static OneByteStringPtr New(const uint8_t* characters,
+                              intptr_t len,
+                              Heap::Space space);
+  static OneByteStringPtr New(const uint16_t* characters,
+                              intptr_t len,
+                              Heap::Space space);
+  static OneByteStringPtr New(const int32_t* characters,
+                              intptr_t len,
+                              Heap::Space space);
+  static OneByteStringPtr New(const String& str, Heap::Space space);
   // 'other' must be OneByteString.
-  static RawOneByteString* New(const String& other_one_byte_string,
-                               intptr_t other_start_index,
-                               intptr_t other_len,
-                               Heap::Space space);
+  static OneByteStringPtr New(const String& other_one_byte_string,
+                              intptr_t other_start_index,
+                              intptr_t other_len,
+                              Heap::Space space);
 
-  static RawOneByteString* New(const TypedData& other_typed_data,
-                               intptr_t other_start_index,
-                               intptr_t other_len,
-                               Heap::Space space = Heap::kNew);
+  static OneByteStringPtr New(const TypedData& other_typed_data,
+                              intptr_t other_start_index,
+                              intptr_t other_len,
+                              Heap::Space space = Heap::kNew);
 
-  static RawOneByteString* New(const ExternalTypedData& other_typed_data,
-                               intptr_t other_start_index,
-                               intptr_t other_len,
-                               Heap::Space space = Heap::kNew);
+  static OneByteStringPtr New(const ExternalTypedData& other_typed_data,
+                              intptr_t other_start_index,
+                              intptr_t other_len,
+                              Heap::Space space = Heap::kNew);
 
-  static RawOneByteString* Concat(const String& str1,
-                                  const String& str2,
-                                  Heap::Space space);
-  static RawOneByteString* ConcatAll(const Array& strings,
-                                     intptr_t start,
-                                     intptr_t end,
-                                     intptr_t len,
-                                     Heap::Space space);
+  static OneByteStringPtr Concat(const String& str1,
+                                 const String& str2,
+                                 Heap::Space space);
+  static OneByteStringPtr ConcatAll(const Array& strings,
+                                    intptr_t start,
+                                    intptr_t end,
+                                    intptr_t len,
+                                    Heap::Space space);
 
-  static RawOneByteString* Transform(int32_t (*mapping)(int32_t ch),
-                                     const String& str,
-                                     Heap::Space space);
+  static OneByteStringPtr Transform(int32_t (*mapping)(int32_t ch),
+                                    const String& str,
+                                    Heap::Space space);
 
   // High performance version of substring for one-byte strings.
   // "str" must be OneByteString.
-  static RawOneByteString* SubStringUnchecked(const String& str,
-                                              intptr_t begin_index,
-                                              intptr_t length,
-                                              Heap::Space space);
+  static OneByteStringPtr SubStringUnchecked(const String& str,
+                                             intptr_t begin_index,
+                                             intptr_t length,
+                                             Heap::Space space);
 
   static void SetPeer(const String& str,
                       void* peer,
@@ -8873,17 +8879,17 @@
 
   static const ClassId kClassId = kOneByteStringCid;
 
-  static RawOneByteString* null() {
-    return reinterpret_cast<RawOneByteString*>(Object::null());
+  static OneByteStringPtr null() {
+    return static_cast<OneByteStringPtr>(Object::null());
   }
 
  private:
-  static RawOneByteString* raw(const String& str) {
-    return reinterpret_cast<RawOneByteString*>(str.raw());
+  static OneByteStringPtr raw(const String& str) {
+    return static_cast<OneByteStringPtr>(str.raw());
   }
 
-  static const RawOneByteString* raw_ptr(const String& str) {
-    return reinterpret_cast<const RawOneByteString*>(str.raw_ptr());
+  static const OneByteStringLayout* raw_ptr(const String& str) {
+    return reinterpret_cast<const OneByteStringLayout*>(str.raw_ptr());
   }
 
   static uint8_t* CharAddr(const String& str, intptr_t index) {
@@ -8897,11 +8903,11 @@
     return &str.UnsafeMutableNonPointer(raw_ptr(str)->data())[0];
   }
 
-  static RawOneByteString* ReadFrom(SnapshotReader* reader,
-                                    intptr_t object_id,
-                                    intptr_t tags,
-                                    Snapshot::Kind kind,
-                                    bool as_reference);
+  static OneByteStringPtr ReadFrom(SnapshotReader* reader,
+                                   intptr_t object_id,
+                                   intptr_t tags,
+                                   Snapshot::Kind kind,
+                                   bool as_reference);
 
   friend class Class;
   friend class String;
@@ -8925,29 +8931,29 @@
     *CharAddr(str, index) = ch;
   }
 
-  static RawTwoByteString* EscapeSpecialCharacters(const String& str);
+  static TwoByteStringPtr EscapeSpecialCharacters(const String& str);
 
   // We use the same maximum elements for all strings.
   static const intptr_t kBytesPerElement = 2;
   static const intptr_t kMaxElements = String::kMaxElements;
 
   static intptr_t data_offset() {
-    return OFFSET_OF_RETURNED_VALUE(RawTwoByteString, data);
+    return OFFSET_OF_RETURNED_VALUE(TwoByteStringLayout, data);
   }
 
-  static intptr_t UnroundedSize(RawTwoByteString* str) {
+  static intptr_t UnroundedSize(TwoByteStringPtr str) {
     return UnroundedSize(Smi::Value(str->ptr()->length_));
   }
   static intptr_t UnroundedSize(intptr_t len) {
-    return sizeof(RawTwoByteString) + (len * kBytesPerElement);
+    return sizeof(TwoByteStringLayout) + (len * kBytesPerElement);
   }
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawTwoByteString) ==
-           OFFSET_OF_RETURNED_VALUE(RawTwoByteString, data));
+    ASSERT(sizeof(TwoByteStringLayout) ==
+           OFFSET_OF_RETURNED_VALUE(TwoByteStringLayout, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
-    ASSERT(sizeof(RawTwoByteString) == String::kSizeofRawString);
+    ASSERT(sizeof(TwoByteStringLayout) == String::kSizeofRawString);
     ASSERT(0 <= len && len <= kMaxElements);
     // We have to pad zero-length raw strings so that they can be externalized.
     // If we don't pad, then the external string object does not fit in the
@@ -8956,57 +8962,57 @@
     return String::RoundedAllocationSize(UnroundedSize(len));
   }
 
-  static RawTwoByteString* New(intptr_t len, Heap::Space space);
-  static RawTwoByteString* New(const uint16_t* characters,
-                               intptr_t len,
-                               Heap::Space space);
-  static RawTwoByteString* New(intptr_t utf16_len,
-                               const int32_t* characters,
-                               intptr_t len,
-                               Heap::Space space);
-  static RawTwoByteString* New(const String& str, Heap::Space space);
+  static TwoByteStringPtr New(intptr_t len, Heap::Space space);
+  static TwoByteStringPtr New(const uint16_t* characters,
+                              intptr_t len,
+                              Heap::Space space);
+  static TwoByteStringPtr New(intptr_t utf16_len,
+                              const int32_t* characters,
+                              intptr_t len,
+                              Heap::Space space);
+  static TwoByteStringPtr New(const String& str, Heap::Space space);
 
-  static RawTwoByteString* New(const TypedData& other_typed_data,
-                               intptr_t other_start_index,
-                               intptr_t other_len,
-                               Heap::Space space = Heap::kNew);
+  static TwoByteStringPtr New(const TypedData& other_typed_data,
+                              intptr_t other_start_index,
+                              intptr_t other_len,
+                              Heap::Space space = Heap::kNew);
 
-  static RawTwoByteString* New(const ExternalTypedData& other_typed_data,
-                               intptr_t other_start_index,
-                               intptr_t other_len,
-                               Heap::Space space = Heap::kNew);
+  static TwoByteStringPtr New(const ExternalTypedData& other_typed_data,
+                              intptr_t other_start_index,
+                              intptr_t other_len,
+                              Heap::Space space = Heap::kNew);
 
-  static RawTwoByteString* Concat(const String& str1,
-                                  const String& str2,
-                                  Heap::Space space);
-  static RawTwoByteString* ConcatAll(const Array& strings,
-                                     intptr_t start,
-                                     intptr_t end,
-                                     intptr_t len,
-                                     Heap::Space space);
+  static TwoByteStringPtr Concat(const String& str1,
+                                 const String& str2,
+                                 Heap::Space space);
+  static TwoByteStringPtr ConcatAll(const Array& strings,
+                                    intptr_t start,
+                                    intptr_t end,
+                                    intptr_t len,
+                                    Heap::Space space);
 
-  static RawTwoByteString* Transform(int32_t (*mapping)(int32_t ch),
-                                     const String& str,
-                                     Heap::Space space);
+  static TwoByteStringPtr Transform(int32_t (*mapping)(int32_t ch),
+                                    const String& str,
+                                    Heap::Space space);
 
   static void SetPeer(const String& str,
                       void* peer,
                       intptr_t external_allocation_size,
                       Dart_WeakPersistentHandleFinalizer callback);
 
-  static RawTwoByteString* null() {
-    return reinterpret_cast<RawTwoByteString*>(Object::null());
+  static TwoByteStringPtr null() {
+    return static_cast<TwoByteStringPtr>(Object::null());
   }
 
   static const ClassId kClassId = kTwoByteStringCid;
 
  private:
-  static RawTwoByteString* raw(const String& str) {
-    return reinterpret_cast<RawTwoByteString*>(str.raw());
+  static TwoByteStringPtr raw(const String& str) {
+    return static_cast<TwoByteStringPtr>(str.raw());
   }
 
-  static const RawTwoByteString* raw_ptr(const String& str) {
-    return reinterpret_cast<const RawTwoByteString*>(str.raw_ptr());
+  static const TwoByteStringLayout* raw_ptr(const String& str) {
+    return reinterpret_cast<const TwoByteStringLayout*>(str.raw_ptr());
   }
 
   static uint16_t* CharAddr(const String& str, intptr_t index) {
@@ -9022,11 +9028,11 @@
     return &str.UnsafeMutableNonPointer(raw_ptr(str)->data())[0];
   }
 
-  static RawTwoByteString* ReadFrom(SnapshotReader* reader,
-                                    intptr_t object_id,
-                                    intptr_t tags,
-                                    Snapshot::Kind kind,
-                                    bool as_reference);
+  static TwoByteStringPtr ReadFrom(SnapshotReader* reader,
+                                   intptr_t object_id,
+                                   intptr_t tags,
+                                   Snapshot::Kind kind,
+                                   bool as_reference);
 
   friend class Class;
   friend class String;
@@ -9044,7 +9050,7 @@
   static void* GetPeer(const String& str) { return raw_ptr(str)->peer_; }
 
   static intptr_t external_data_offset() {
-    return OFFSET_OF(RawExternalOneByteString, external_data_);
+    return OFFSET_OF(ExternalOneByteStringLayout, external_data_);
   }
 
   // We use the same maximum elements for all strings.
@@ -9052,10 +9058,10 @@
   static const intptr_t kMaxElements = String::kMaxElements;
 
   static intptr_t InstanceSize() {
-    return String::RoundedAllocationSize(sizeof(RawExternalOneByteString));
+    return String::RoundedAllocationSize(sizeof(ExternalOneByteStringLayout));
   }
 
-  static RawExternalOneByteString* New(
+  static ExternalOneByteStringPtr New(
       const uint8_t* characters,
       intptr_t len,
       void* peer,
@@ -9063,23 +9069,23 @@
       Dart_WeakPersistentHandleFinalizer callback,
       Heap::Space space);
 
-  static RawExternalOneByteString* null() {
-    return reinterpret_cast<RawExternalOneByteString*>(Object::null());
+  static ExternalOneByteStringPtr null() {
+    return static_cast<ExternalOneByteStringPtr>(Object::null());
   }
 
-  static RawOneByteString* EscapeSpecialCharacters(const String& str);
-  static RawOneByteString* EncodeIRI(const String& str);
-  static RawOneByteString* DecodeIRI(const String& str);
+  static OneByteStringPtr EscapeSpecialCharacters(const String& str);
+  static OneByteStringPtr EncodeIRI(const String& str);
+  static OneByteStringPtr DecodeIRI(const String& str);
 
   static const ClassId kClassId = kExternalOneByteStringCid;
 
  private:
-  static RawExternalOneByteString* raw(const String& str) {
-    return reinterpret_cast<RawExternalOneByteString*>(str.raw());
+  static ExternalOneByteStringPtr raw(const String& str) {
+    return static_cast<ExternalOneByteStringPtr>(str.raw());
   }
 
-  static const RawExternalOneByteString* raw_ptr(const String& str) {
-    return reinterpret_cast<const RawExternalOneByteString*>(str.raw_ptr());
+  static const ExternalOneByteStringLayout* raw_ptr(const String& str) {
+    return reinterpret_cast<const ExternalOneByteStringLayout*>(str.raw_ptr());
   }
 
   static const uint8_t* CharAddr(const String& str, intptr_t index) {
@@ -9107,11 +9113,11 @@
                        Dart_WeakPersistentHandle handle,
                        void* peer);
 
-  static RawExternalOneByteString* ReadFrom(SnapshotReader* reader,
-                                            intptr_t object_id,
-                                            intptr_t tags,
-                                            Snapshot::Kind kind,
-                                            bool as_reference);
+  static ExternalOneByteStringPtr ReadFrom(SnapshotReader* reader,
+                                           intptr_t object_id,
+                                           intptr_t tags,
+                                           Snapshot::Kind kind,
+                                           bool as_reference);
 
   static intptr_t NextFieldOffset() {
     // Indicates this class cannot be extended by dart code.
@@ -9135,7 +9141,7 @@
   static void* GetPeer(const String& str) { return raw_ptr(str)->peer_; }
 
   static intptr_t external_data_offset() {
-    return OFFSET_OF(RawExternalTwoByteString, external_data_);
+    return OFFSET_OF(ExternalTwoByteStringLayout, external_data_);
   }
 
   // We use the same maximum elements for all strings.
@@ -9143,10 +9149,10 @@
   static const intptr_t kMaxElements = String::kMaxElements;
 
   static intptr_t InstanceSize() {
-    return String::RoundedAllocationSize(sizeof(RawExternalTwoByteString));
+    return String::RoundedAllocationSize(sizeof(ExternalTwoByteStringLayout));
   }
 
-  static RawExternalTwoByteString* New(
+  static ExternalTwoByteStringPtr New(
       const uint16_t* characters,
       intptr_t len,
       void* peer,
@@ -9154,19 +9160,19 @@
       Dart_WeakPersistentHandleFinalizer callback,
       Heap::Space space = Heap::kNew);
 
-  static RawExternalTwoByteString* null() {
-    return reinterpret_cast<RawExternalTwoByteString*>(Object::null());
+  static ExternalTwoByteStringPtr null() {
+    return static_cast<ExternalTwoByteStringPtr>(Object::null());
   }
 
   static const ClassId kClassId = kExternalTwoByteStringCid;
 
  private:
-  static RawExternalTwoByteString* raw(const String& str) {
-    return reinterpret_cast<RawExternalTwoByteString*>(str.raw());
+  static ExternalTwoByteStringPtr raw(const String& str) {
+    return static_cast<ExternalTwoByteStringPtr>(str.raw());
   }
 
-  static const RawExternalTwoByteString* raw_ptr(const String& str) {
-    return reinterpret_cast<const RawExternalTwoByteString*>(str.raw_ptr());
+  static const ExternalTwoByteStringLayout* raw_ptr(const String& str) {
+    return reinterpret_cast<const ExternalTwoByteStringLayout*>(str.raw_ptr());
   }
 
   static const uint16_t* CharAddr(const String& str, intptr_t index) {
@@ -9194,11 +9200,11 @@
                        Dart_WeakPersistentHandle handle,
                        void* peer);
 
-  static RawExternalTwoByteString* ReadFrom(SnapshotReader* reader,
-                                            intptr_t object_id,
-                                            intptr_t tags,
-                                            Snapshot::Kind kind,
-                                            bool as_reference);
+  static ExternalTwoByteStringPtr ReadFrom(SnapshotReader* reader,
+                                           intptr_t object_id,
+                                           intptr_t tags,
+                                           Snapshot::Kind kind,
+                                           bool as_reference);
 
   static intptr_t NextFieldOffset() {
     // Indicates this class cannot be extended by dart code.
@@ -9217,7 +9223,7 @@
   bool value() const { return raw_ptr()->value_; }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawBool));
+    return RoundedAllocationSize(sizeof(BoolLayout));
   }
 
   static const Bool& True() { return Object::bool_true(); }
@@ -9238,7 +9244,7 @@
   }
 
   // New should only be called to initialize the two legal bool values.
-  static RawBool* New(bool value);
+  static BoolPtr New(bool value);
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Bool, Instance);
   friend class Class;
@@ -9258,25 +9264,25 @@
   }
 
   intptr_t Length() const { return LengthOf(raw()); }
-  static intptr_t LengthOf(const RawArray* array) {
+  static intptr_t LengthOf(const ArrayPtr array) {
     return Smi::Value(array->ptr()->length_);
   }
 
-  static intptr_t length_offset() { return OFFSET_OF(RawArray, length_); }
+  static intptr_t length_offset() { return OFFSET_OF(ArrayLayout, length_); }
   static intptr_t data_offset() {
-    return OFFSET_OF_RETURNED_VALUE(RawArray, data);
+    return OFFSET_OF_RETURNED_VALUE(ArrayLayout, data);
   }
   static intptr_t element_offset(intptr_t index) {
-    return OFFSET_OF_RETURNED_VALUE(RawArray, data) + kWordSize * index;
+    return OFFSET_OF_RETURNED_VALUE(ArrayLayout, data) + kWordSize * index;
   }
 
-  struct ArrayLayout {
+  struct ArrayTraits {
     static intptr_t elements_start_offset() { return Array::data_offset(); }
 
     static constexpr intptr_t kElementSize = kWordSize;
   };
 
-  static bool Equals(RawArray* a, RawArray* b) {
+  static bool Equals(ArrayPtr a, ArrayPtr b) {
     if (a == b) return true;
     if (a->IsRawNull() || b->IsRawNull()) return false;
     if (a->ptr()->length_ != b->ptr()->length_) return false;
@@ -9285,28 +9291,27 @@
     return memcmp(a->ptr()->data(), b->ptr()->data(), kWordSize * length) == 0;
   }
 
-  static RawObject** DataOf(RawArray* array) { return array->ptr()->data(); }
+  static ObjectPtr* DataOf(ArrayPtr array) { return array->ptr()->data(); }
 
-  RawObject* At(intptr_t index) const { return *ObjectAddr(index); }
+  ObjectPtr At(intptr_t index) const { return *ObjectAddr(index); }
   void SetAt(intptr_t index, const Object& value) const {
     // TODO(iposva): Add storing NoSafepointScope.
     StoreArrayPointer(ObjectAddr(index), value.raw());
   }
 
   // Access to the array with acquire release semantics.
-  RawObject* AtAcquire(intptr_t index) const {
-    return LoadPointer<RawObject*, std::memory_order_acquire>(
-        ObjectAddr(index));
+  ObjectPtr AtAcquire(intptr_t index) const {
+    return LoadPointer<ObjectPtr, std::memory_order_acquire>(ObjectAddr(index));
   }
   void SetAtRelease(intptr_t index, const Object& value) const {
     // TODO(iposva): Add storing NoSafepointScope.
-    StoreArrayPointer<RawObject*, std::memory_order_release>(ObjectAddr(index),
-                                                             value.raw());
+    StoreArrayPointer<ObjectPtr, std::memory_order_release>(ObjectAddr(index),
+                                                            value.raw());
   }
 
   bool IsImmutable() const { return raw()->GetClassId() == kImmutableArrayCid; }
 
-  virtual RawTypeArguments* GetTypeArguments() const {
+  virtual TypeArgumentsPtr GetTypeArguments() const {
     return raw_ptr()->type_arguments_;
   }
   virtual void SetTypeArguments(const TypeArguments& value) const {
@@ -9327,10 +9332,10 @@
   static const intptr_t kBytesPerElement = kWordSize;
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
   static const intptr_t kMaxNewSpaceElements =
-      (Heap::kNewAllocatableSize - sizeof(RawArray)) / kBytesPerElement;
+      (Heap::kNewAllocatableSize - sizeof(ArrayLayout)) / kBytesPerElement;
 
   static intptr_t type_arguments_offset() {
-    return OFFSET_OF(RawArray, type_arguments_);
+    return OFFSET_OF(ArrayLayout, type_arguments_);
   }
 
   static bool IsValidLength(intptr_t len) {
@@ -9338,15 +9343,16 @@
   }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawArray) == OFFSET_OF_RETURNED_VALUE(RawArray, data));
+    ASSERT(sizeof(ArrayLayout) == OFFSET_OF_RETURNED_VALUE(ArrayLayout, data));
     return 0;
   }
 
   static intptr_t InstanceSize(intptr_t len) {
     // Ensure that variable length data is not adding to the object length.
-    ASSERT(sizeof(RawArray) == (sizeof(RawInstance) + (2 * kWordSize)));
+    ASSERT(sizeof(ArrayLayout) == (sizeof(InstanceLayout) + (2 * kWordSize)));
     ASSERT(IsValidLength(len));
-    return RoundedAllocationSize(sizeof(RawArray) + (len * kBytesPerElement));
+    return RoundedAllocationSize(sizeof(ArrayLayout) +
+                                 (len * kBytesPerElement));
   }
 
   // Returns true if all elements are OK for canonicalization.
@@ -9357,17 +9363,17 @@
   // to ImmutableArray.
   void MakeImmutable() const;
 
-  static RawArray* New(intptr_t len, Heap::Space space = Heap::kNew);
-  static RawArray* New(intptr_t len,
-                       const AbstractType& element_type,
-                       Heap::Space space = Heap::kNew);
+  static ArrayPtr New(intptr_t len, Heap::Space space = Heap::kNew);
+  static ArrayPtr New(intptr_t len,
+                      const AbstractType& element_type,
+                      Heap::Space space = Heap::kNew);
 
   // Creates and returns a new array with 'new_length'. Copies all elements from
   // 'source' to the new array. 'new_length' must be greater than or equal to
   // 'source.Length()'. 'source' can be null.
-  static RawArray* Grow(const Array& source,
-                        intptr_t new_length,
-                        Heap::Space space = Heap::kNew);
+  static ArrayPtr Grow(const Array& source,
+                       intptr_t new_length,
+                       Heap::Space space = Heap::kNew);
 
   // Truncates the array to a given length. 'new_length' must be less than
   // or equal to 'source.Length()'. The remaining unused part of the array is
@@ -9383,20 +9389,18 @@
   // set to an empty array.
   // If the unique parameter is false, the function is allowed to return
   // a shared Array instance.
-  static RawArray* MakeFixedLength(const GrowableObjectArray& growable_array,
-                                   bool unique = false);
+  static ArrayPtr MakeFixedLength(const GrowableObjectArray& growable_array,
+                                  bool unique = false);
 
-  RawArray* Slice(intptr_t start,
-                  intptr_t count,
-                  bool with_type_argument) const;
+  ArrayPtr Slice(intptr_t start, intptr_t count, bool with_type_argument) const;
 
  protected:
-  static RawArray* New(intptr_t class_id,
-                       intptr_t len,
-                       Heap::Space space = Heap::kNew);
+  static ArrayPtr New(intptr_t class_id,
+                      intptr_t len,
+                      Heap::Space space = Heap::kNew);
 
  private:
-  RawObject* const* ObjectAddr(intptr_t index) const {
+  ObjectPtr const* ObjectAddr(intptr_t index) const {
     // TODO(iposva): Determine if we should throw an exception here.
     ASSERT((index >= 0) && (index < Length()));
     return &raw_ptr()->data()[index];
@@ -9411,17 +9415,17 @@
 
   template <typename type, std::memory_order order = std::memory_order_relaxed>
   void StoreArrayPointer(type const* addr, type value) const {
-    raw()->StoreArrayPointer<type, order>(addr, value);
+    raw()->ptr()->StoreArrayPointer<type, order>(addr, value);
   }
 
   // Store a range of pointers [from, from + count) into [to, to + count).
   // TODO(koda): Use this to fix Object::Clone's broken store buffer logic.
-  void StoreArrayPointers(RawObject* const* to,
-                          RawObject* const* from,
+  void StoreArrayPointers(ObjectPtr const* to,
+                          ObjectPtr const* from,
                           intptr_t count) {
     ASSERT(Contains(reinterpret_cast<uword>(to)));
     if (raw()->IsNewObject()) {
-      memmove(const_cast<RawObject**>(to), from, count * kWordSize);
+      memmove(const_cast<ObjectPtr*>(to), from, count * kWordSize);
     } else {
       for (intptr_t i = 0; i < count; ++i) {
         StoreArrayPointer(&to[i], from[i]);
@@ -9439,13 +9443,13 @@
 
 class ImmutableArray : public AllStatic {
  public:
-  static RawImmutableArray* New(intptr_t len, Heap::Space space = Heap::kNew);
+  static ImmutableArrayPtr New(intptr_t len, Heap::Space space = Heap::kNew);
 
-  static RawImmutableArray* ReadFrom(SnapshotReader* reader,
-                                     intptr_t object_id,
-                                     intptr_t tags,
-                                     Snapshot::Kind kind,
-                                     bool as_reference);
+  static ImmutableArrayPtr ReadFrom(SnapshotReader* reader,
+                                    intptr_t object_id,
+                                    intptr_t tags,
+                                    Snapshot::Kind kind,
+                                    bool as_reference);
 
   static const ClassId kClassId = kImmutableArrayCid;
 
@@ -9461,8 +9465,8 @@
     return -kWordSize;
   }
 
-  static RawImmutableArray* raw(const Array& array) {
-    return reinterpret_cast<RawImmutableArray*>(array.raw());
+  static ImmutableArrayPtr raw(const Array& array) {
+    return static_cast<ImmutableArrayPtr>(array.raw());
   }
 
   friend class Class;
@@ -9485,12 +9489,12 @@
     StoreSmi(&raw_ptr()->length_, Smi::New(value));
   }
 
-  RawArray* data() const { return raw_ptr()->data_; }
+  ArrayPtr data() const { return raw_ptr()->data_; }
   void SetData(const Array& value) const {
     StorePointer(&raw_ptr()->data_, value.raw());
   }
 
-  RawObject* At(intptr_t index) const {
+  ObjectPtr At(intptr_t index) const {
     NoSafepointScope no_safepoint;
     ASSERT(!IsNull());
     ASSERT(index < Length());
@@ -9501,15 +9505,15 @@
     ASSERT(index < Length());
 
     // TODO(iposva): Add storing NoSafepointScope.
-    data()->StoreArrayPointer(ObjectAddr(index), value.raw());
+    data()->ptr()->StoreArrayPointer(ObjectAddr(index), value.raw());
   }
 
   void Add(const Object& value, Heap::Space space = Heap::kNew) const;
 
   void Grow(intptr_t new_capacity, Heap::Space space = Heap::kNew) const;
-  RawObject* RemoveLast() const;
+  ObjectPtr RemoveLast() const;
 
-  virtual RawTypeArguments* GetTypeArguments() const {
+  virtual TypeArgumentsPtr GetTypeArguments() const {
     return raw_ptr()->type_arguments_;
   }
   virtual void SetTypeArguments(const TypeArguments& value) const {
@@ -9528,46 +9532,46 @@
   }
 
   // We don't expect a growable object array to be canonicalized.
-  virtual RawInstance* CheckAndCanonicalize(Thread* thread,
-                                            const char** error_str) const {
+  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
+                                           const char** error_str) const {
     UNREACHABLE();
     return Instance::null();
   }
 
   static intptr_t type_arguments_offset() {
-    return OFFSET_OF(RawGrowableObjectArray, type_arguments_);
+    return OFFSET_OF(GrowableObjectArrayLayout, type_arguments_);
   }
 
   static intptr_t length_offset() {
-    return OFFSET_OF(RawGrowableObjectArray, length_);
+    return OFFSET_OF(GrowableObjectArrayLayout, length_);
   }
   static intptr_t data_offset() {
-    return OFFSET_OF(RawGrowableObjectArray, data_);
+    return OFFSET_OF(GrowableObjectArrayLayout, data_);
   }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawGrowableObjectArray));
+    return RoundedAllocationSize(sizeof(GrowableObjectArrayLayout));
   }
 
-  static RawGrowableObjectArray* New(Heap::Space space = Heap::kNew) {
+  static GrowableObjectArrayPtr New(Heap::Space space = Heap::kNew) {
     return New(kDefaultInitialCapacity, space);
   }
-  static RawGrowableObjectArray* New(intptr_t capacity,
-                                     Heap::Space space = Heap::kNew);
-  static RawGrowableObjectArray* New(const Array& array,
-                                     Heap::Space space = Heap::kNew);
+  static GrowableObjectArrayPtr New(intptr_t capacity,
+                                    Heap::Space space = Heap::kNew);
+  static GrowableObjectArrayPtr New(const Array& array,
+                                    Heap::Space space = Heap::kNew);
 
-  static RawSmi* NoSafepointLength(const RawGrowableObjectArray* array) {
+  static SmiPtr NoSafepointLength(const GrowableObjectArrayPtr array) {
     return array->ptr()->length_;
   }
 
-  static RawArray* NoSafepointData(const RawGrowableObjectArray* array) {
+  static ArrayPtr NoSafepointData(const GrowableObjectArrayPtr array) {
     return array->ptr()->data_;
   }
 
  private:
-  RawArray* DataArray() const { return data()->ptr(); }
-  RawObject** ObjectAddr(intptr_t index) const {
+  ArrayLayout* DataArray() const { return data()->ptr(); }
+  ObjectPtr* ObjectAddr(intptr_t index) const {
     ASSERT((index >= 0) && (index < Length()));
     return &(DataArray()->data()[index]);
   }
@@ -9581,13 +9585,13 @@
 
 class Float32x4 : public Instance {
  public:
-  static RawFloat32x4* New(float value0,
-                           float value1,
-                           float value2,
-                           float value3,
-                           Heap::Space space = Heap::kNew);
-  static RawFloat32x4* New(simd128_value_t value,
-                           Heap::Space space = Heap::kNew);
+  static Float32x4Ptr New(float value0,
+                          float value1,
+                          float value2,
+                          float value3,
+                          Heap::Space space = Heap::kNew);
+  static Float32x4Ptr New(simd128_value_t value,
+                          Heap::Space space = Heap::kNew);
 
   float x() const;
   float y() const;
@@ -9603,10 +9607,10 @@
   void set_value(simd128_value_t value) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawFloat32x4));
+    return RoundedAllocationSize(sizeof(Float32x4Layout));
   }
 
-  static intptr_t value_offset() { return OFFSET_OF(RawFloat32x4, value_); }
+  static intptr_t value_offset() { return OFFSET_OF(Float32x4Layout, value_); }
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance);
@@ -9615,12 +9619,12 @@
 
 class Int32x4 : public Instance {
  public:
-  static RawInt32x4* New(int32_t value0,
-                         int32_t value1,
-                         int32_t value2,
-                         int32_t value3,
-                         Heap::Space space = Heap::kNew);
-  static RawInt32x4* New(simd128_value_t value, Heap::Space space = Heap::kNew);
+  static Int32x4Ptr New(int32_t value0,
+                        int32_t value1,
+                        int32_t value2,
+                        int32_t value3,
+                        Heap::Space space = Heap::kNew);
+  static Int32x4Ptr New(simd128_value_t value, Heap::Space space = Heap::kNew);
 
   int32_t x() const;
   int32_t y() const;
@@ -9636,10 +9640,10 @@
   void set_value(simd128_value_t value) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawInt32x4));
+    return RoundedAllocationSize(sizeof(Int32x4Layout));
   }
 
-  static intptr_t value_offset() { return OFFSET_OF(RawInt32x4, value_); }
+  static intptr_t value_offset() { return OFFSET_OF(Int32x4Layout, value_); }
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Int32x4, Instance);
@@ -9648,11 +9652,11 @@
 
 class Float64x2 : public Instance {
  public:
-  static RawFloat64x2* New(double value0,
-                           double value1,
-                           Heap::Space space = Heap::kNew);
-  static RawFloat64x2* New(simd128_value_t value,
-                           Heap::Space space = Heap::kNew);
+  static Float64x2Ptr New(double value0,
+                          double value1,
+                          Heap::Space space = Heap::kNew);
+  static Float64x2Ptr New(simd128_value_t value,
+                          Heap::Space space = Heap::kNew);
 
   double x() const;
   double y() const;
@@ -9664,10 +9668,10 @@
   void set_value(simd128_value_t value) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawFloat64x2));
+    return RoundedAllocationSize(sizeof(Float64x2Layout));
   }
 
-  static intptr_t value_offset() { return OFFSET_OF(RawFloat64x2, value_); }
+  static intptr_t value_offset() { return OFFSET_OF(Float64x2Layout, value_); }
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Float64x2, Instance);
@@ -9677,17 +9681,17 @@
 class PointerBase : public Instance {
  public:
   static intptr_t data_field_offset() {
-    return OFFSET_OF(RawPointerBase, data_);
+    return OFFSET_OF(PointerBaseLayout, data_);
   }
 };
 
 class TypedDataBase : public PointerBase {
  public:
   static intptr_t length_offset() {
-    return OFFSET_OF(RawTypedDataBase, length_);
+    return OFFSET_OF(TypedDataBaseLayout, length_);
   }
 
-  RawSmi* length() const { return raw_ptr()->length_; }
+  SmiPtr length() const { return raw_ptr()->length_; }
 
   intptr_t Length() const {
     ASSERT(!IsNull());
@@ -9799,17 +9803,17 @@
 
 #undef TYPED_GETTER_SETTER
 
-  static intptr_t data_offset() { return RawTypedData::payload_offset(); }
+  static intptr_t data_offset() { return TypedDataLayout::payload_offset(); }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawTypedData) ==
-           OFFSET_OF_RETURNED_VALUE(RawTypedData, internal_data));
+    ASSERT(sizeof(TypedDataLayout) ==
+           OFFSET_OF_RETURNED_VALUE(TypedDataLayout, internal_data));
     return 0;
   }
 
   static intptr_t InstanceSize(intptr_t lengthInBytes) {
     ASSERT(0 <= lengthInBytes && lengthInBytes <= kSmiMax);
-    return RoundedAllocationSize(sizeof(RawTypedData) + lengthInBytes);
+    return RoundedAllocationSize(sizeof(TypedDataLayout) + lengthInBytes);
   }
 
   static intptr_t MaxElements(intptr_t class_id) {
@@ -9819,13 +9823,13 @@
 
   static intptr_t MaxNewSpaceElements(intptr_t class_id) {
     ASSERT(IsTypedDataClassId(class_id));
-    return (Heap::kNewAllocatableSize - sizeof(RawTypedData)) /
+    return (Heap::kNewAllocatableSize - sizeof(TypedDataLayout)) /
            ElementSizeInBytes(class_id);
   }
 
-  static RawTypedData* New(intptr_t class_id,
-                           intptr_t len,
-                           Heap::Space space = Heap::kNew);
+  static TypedDataPtr New(intptr_t class_id,
+                          intptr_t len,
+                          Heap::Space space = Heap::kNew);
 
   template <typename DstType, typename SrcType>
   static void Copy(const DstType& dst,
@@ -9881,7 +9885,7 @@
   }
 
  protected:
-  void RecomputeDataField() { raw()->RecomputeDataField(); }
+  void RecomputeDataField() { raw()->ptr()->RecomputeDataField(); }
 
  private:
   // Provides const access to non-pointer, non-aligned data within the object.
@@ -9938,11 +9942,11 @@
       intptr_t external_size) const;
 
   static intptr_t data_offset() {
-    return OFFSET_OF(RawExternalTypedData, data_);
+    return OFFSET_OF(ExternalTypedDataLayout, data_);
   }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawExternalTypedData));
+    return RoundedAllocationSize(sizeof(ExternalTypedDataLayout));
   }
 
   static intptr_t MaxElements(intptr_t class_id) {
@@ -9950,14 +9954,14 @@
     return (kSmiMax / ElementSizeInBytes(class_id));
   }
 
-  static RawExternalTypedData* New(
+  static ExternalTypedDataPtr New(
       intptr_t class_id,
       uint8_t* data,
       intptr_t len,
       Heap::Space space = Heap::kNew,
       bool perform_eager_msan_initialization_check = true);
 
-  static RawExternalTypedData* NewFinalizeWithFree(uint8_t* data, intptr_t len);
+  static ExternalTypedDataPtr NewFinalizeWithFree(uint8_t* data, intptr_t len);
 
   static bool IsExternalTypedData(const Instance& obj) {
     ASSERT(!obj.IsNull());
@@ -9986,23 +9990,23 @@
 
 class TypedDataView : public TypedDataBase {
  public:
-  static RawTypedDataView* New(intptr_t class_id,
-                               Heap::Space space = Heap::kNew);
-  static RawTypedDataView* New(intptr_t class_id,
-                               const TypedDataBase& typed_data,
-                               intptr_t offset_in_bytes,
-                               intptr_t length,
-                               Heap::Space space = Heap::kNew);
+  static TypedDataViewPtr New(intptr_t class_id,
+                              Heap::Space space = Heap::kNew);
+  static TypedDataViewPtr New(intptr_t class_id,
+                              const TypedDataBase& typed_data,
+                              intptr_t offset_in_bytes,
+                              intptr_t length,
+                              Heap::Space space = Heap::kNew);
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawTypedDataView));
+    return RoundedAllocationSize(sizeof(TypedDataViewLayout));
   }
 
-  static RawInstance* Data(const TypedDataView& view) {
+  static InstancePtr Data(const TypedDataView& view) {
     return view.typed_data();
   }
 
-  static RawSmi* OffsetInBytes(const TypedDataView& view) {
+  static SmiPtr OffsetInBytes(const TypedDataView& view) {
     return view.offset_in_bytes();
   }
 
@@ -10014,14 +10018,14 @@
   }
 
   static intptr_t data_offset() {
-    return OFFSET_OF(RawTypedDataView, typed_data_);
+    return OFFSET_OF(TypedDataViewLayout, typed_data_);
   }
 
   static intptr_t offset_in_bytes_offset() {
-    return OFFSET_OF(RawTypedDataView, offset_in_bytes_);
+    return OFFSET_OF(TypedDataViewLayout, offset_in_bytes_);
   }
 
-  RawInstance* typed_data() const { return raw_ptr()->typed_data_; }
+  InstancePtr typed_data() const { return raw_ptr()->typed_data_; }
 
   void InitializeWith(const TypedDataBase& typed_data,
                       intptr_t offset_in_bytes,
@@ -10036,13 +10040,13 @@
     RecomputeDataField();
   }
 
-  RawSmi* offset_in_bytes() const { return raw_ptr()->offset_in_bytes_; }
+  SmiPtr offset_in_bytes() const { return raw_ptr()->offset_in_bytes_; }
 
  protected:
   virtual uint8_t* Validate(uint8_t* data) const { return data; }
 
  private:
-  void RecomputeDataField() { raw()->RecomputeDataField(); }
+  void RecomputeDataField() { raw()->ptr()->RecomputeDataField(); }
 
   void Clear() {
     StoreSmi(&raw_ptr()->length_, Smi::New(0));
@@ -10060,10 +10064,10 @@
 
 class ByteBuffer : public AllStatic {
  public:
-  static RawInstance* Data(const Instance& view_obj) {
+  static InstancePtr Data(const Instance& view_obj) {
     ASSERT(!view_obj.IsNull());
-    return *reinterpret_cast<RawInstance* const*>(view_obj.raw_ptr() +
-                                                  kDataOffset);
+    return *reinterpret_cast<InstancePtr const*>(view_obj.raw_ptr() +
+                                                 kDataOffset);
   }
 
   static intptr_t NumberOfFields() { return kDataOffset; }
@@ -10078,12 +10082,12 @@
 
 class Pointer : public Instance {
  public:
-  static RawPointer* New(const AbstractType& type_arg,
-                         uword native_address,
-                         Heap::Space space = Heap::kNew);
+  static PointerPtr New(const AbstractType& type_arg,
+                        uword native_address,
+                        Heap::Space space = Heap::kNew);
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawPointer));
+    return RoundedAllocationSize(sizeof(PointerLayout));
   }
 
   static bool IsPointer(const Instance& obj);
@@ -10098,15 +10102,15 @@
   }
 
   static intptr_t type_arguments_offset() {
-    return OFFSET_OF(RawPointer, type_arguments_);
+    return OFFSET_OF(PointerLayout, type_arguments_);
   }
 
-  static intptr_t NextFieldOffset() { return sizeof(RawPointer); }
+  static intptr_t NextFieldOffset() { return sizeof(PointerLayout); }
 
   static const intptr_t kNativeTypeArgPos = 0;
 
   // Fetches the NativeType type argument.
-  RawAbstractType* type_argument() const {
+  AbstractTypePtr type_argument() const {
     TypeArguments& type_args = TypeArguments::Handle(GetTypeArguments());
     return type_args.TypeAtNullSafe(Pointer::kNativeTypeArgPos);
   }
@@ -10119,10 +10123,10 @@
 
 class DynamicLibrary : public Instance {
  public:
-  static RawDynamicLibrary* New(void* handle, Heap::Space space = Heap::kNew);
+  static DynamicLibraryPtr New(void* handle, Heap::Space space = Heap::kNew);
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawDynamicLibrary));
+    return RoundedAllocationSize(sizeof(DynamicLibraryLayout));
   }
 
   static bool IsDynamicLibrary(const Instance& obj) {
@@ -10153,19 +10157,19 @@
 class LinkedHashMap : public Instance {
  public:
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawLinkedHashMap));
+    return RoundedAllocationSize(sizeof(LinkedHashMapLayout));
   }
 
   // Allocates a map with some default capacity, just like "new Map()".
-  static RawLinkedHashMap* NewDefault(Heap::Space space = Heap::kNew);
-  static RawLinkedHashMap* New(const Array& data,
-                               const TypedData& index,
-                               intptr_t hash_mask,
-                               intptr_t used_data,
-                               intptr_t deleted_keys,
-                               Heap::Space space = Heap::kNew);
+  static LinkedHashMapPtr NewDefault(Heap::Space space = Heap::kNew);
+  static LinkedHashMapPtr New(const Array& data,
+                              const TypedData& index,
+                              intptr_t hash_mask,
+                              intptr_t used_data,
+                              intptr_t deleted_keys,
+                              Heap::Space space = Heap::kNew);
 
-  virtual RawTypeArguments* GetTypeArguments() const {
+  virtual TypeArgumentsPtr GetTypeArguments() const {
     return raw_ptr()->type_arguments_;
   }
   virtual void SetTypeArguments(const TypeArguments& value) const {
@@ -10177,44 +10181,48 @@
     StorePointer(&raw_ptr()->type_arguments_, value.raw());
   }
   static intptr_t type_arguments_offset() {
-    return OFFSET_OF(RawLinkedHashMap, type_arguments_);
+    return OFFSET_OF(LinkedHashMapLayout, type_arguments_);
   }
 
-  RawTypedData* index() const { return raw_ptr()->index_; }
+  TypedDataPtr index() const { return raw_ptr()->index_; }
   void SetIndex(const TypedData& value) const {
     ASSERT(!value.IsNull());
     StorePointer(&raw_ptr()->index_, value.raw());
   }
-  static intptr_t index_offset() { return OFFSET_OF(RawLinkedHashMap, index_); }
+  static intptr_t index_offset() {
+    return OFFSET_OF(LinkedHashMapLayout, index_);
+  }
 
-  RawArray* data() const { return raw_ptr()->data_; }
+  ArrayPtr data() const { return raw_ptr()->data_; }
   void SetData(const Array& value) const {
     StorePointer(&raw_ptr()->data_, value.raw());
   }
-  static intptr_t data_offset() { return OFFSET_OF(RawLinkedHashMap, data_); }
+  static intptr_t data_offset() {
+    return OFFSET_OF(LinkedHashMapLayout, data_);
+  }
 
-  RawSmi* hash_mask() const { return raw_ptr()->hash_mask_; }
+  SmiPtr hash_mask() const { return raw_ptr()->hash_mask_; }
   void SetHashMask(intptr_t value) const {
     StoreSmi(&raw_ptr()->hash_mask_, Smi::New(value));
   }
   static intptr_t hash_mask_offset() {
-    return OFFSET_OF(RawLinkedHashMap, hash_mask_);
+    return OFFSET_OF(LinkedHashMapLayout, hash_mask_);
   }
 
-  RawSmi* used_data() const { return raw_ptr()->used_data_; }
+  SmiPtr used_data() const { return raw_ptr()->used_data_; }
   void SetUsedData(intptr_t value) const {
     StoreSmi(&raw_ptr()->used_data_, Smi::New(value));
   }
   static intptr_t used_data_offset() {
-    return OFFSET_OF(RawLinkedHashMap, used_data_);
+    return OFFSET_OF(LinkedHashMapLayout, used_data_);
   }
 
-  RawSmi* deleted_keys() const { return raw_ptr()->deleted_keys_; }
+  SmiPtr deleted_keys() const { return raw_ptr()->deleted_keys_; }
   void SetDeletedKeys(intptr_t value) const {
     StoreSmi(&raw_ptr()->deleted_keys_, Smi::New(value));
   }
   static intptr_t deleted_keys_offset() {
-    return OFFSET_OF(RawLinkedHashMap, deleted_keys_);
+    return OFFSET_OF(LinkedHashMapLayout, deleted_keys_);
   }
 
   intptr_t Length() const {
@@ -10254,9 +10262,9 @@
       }
     }
 
-    RawObject* CurrentKey() const { return data_.At(offset_); }
+    ObjectPtr CurrentKey() const { return data_.At(offset_); }
 
-    RawObject* CurrentValue() const { return data_.At(offset_ + 1); }
+    ObjectPtr CurrentValue() const { return data_.At(offset_ + 1); }
 
    private:
     const Array& data_;
@@ -10274,7 +10282,7 @@
 
   // Allocate a map, but leave all fields set to null.
   // Used during deserialization (since map might contain itself as key/value).
-  static RawLinkedHashMap* NewUninitialized(Heap::Space space = Heap::kNew);
+  static LinkedHashMapPtr NewUninitialized(Heap::Space space = Heap::kNew);
 
   friend class Class;
   friend class LinkedHashMapDeserializationCluster;
@@ -10282,38 +10290,42 @@
 
 class Closure : public Instance {
  public:
-  RawTypeArguments* instantiator_type_arguments() const {
+  TypeArgumentsPtr instantiator_type_arguments() const {
     return raw_ptr()->instantiator_type_arguments_;
   }
   static intptr_t instantiator_type_arguments_offset() {
-    return OFFSET_OF(RawClosure, instantiator_type_arguments_);
+    return OFFSET_OF(ClosureLayout, instantiator_type_arguments_);
   }
 
-  RawTypeArguments* function_type_arguments() const {
+  TypeArgumentsPtr function_type_arguments() const {
     return raw_ptr()->function_type_arguments_;
   }
   static intptr_t function_type_arguments_offset() {
-    return OFFSET_OF(RawClosure, function_type_arguments_);
+    return OFFSET_OF(ClosureLayout, function_type_arguments_);
   }
 
-  RawTypeArguments* delayed_type_arguments() const {
+  TypeArgumentsPtr delayed_type_arguments() const {
     return raw_ptr()->delayed_type_arguments_;
   }
   static intptr_t delayed_type_arguments_offset() {
-    return OFFSET_OF(RawClosure, delayed_type_arguments_);
+    return OFFSET_OF(ClosureLayout, delayed_type_arguments_);
   }
 
-  RawFunction* function() const { return raw_ptr()->function_; }
-  static intptr_t function_offset() { return OFFSET_OF(RawClosure, function_); }
+  FunctionPtr function() const { return raw_ptr()->function_; }
+  static intptr_t function_offset() {
+    return OFFSET_OF(ClosureLayout, function_);
+  }
 
-  RawContext* context() const { return raw_ptr()->context_; }
-  static intptr_t context_offset() { return OFFSET_OF(RawClosure, context_); }
+  ContextPtr context() const { return raw_ptr()->context_; }
+  static intptr_t context_offset() {
+    return OFFSET_OF(ClosureLayout, context_);
+  }
 
-  RawSmi* hash() const { return raw_ptr()->hash_; }
-  static intptr_t hash_offset() { return OFFSET_OF(RawClosure, hash_); }
+  SmiPtr hash() const { return raw_ptr()->hash_; }
+  static intptr_t hash_offset() { return OFFSET_OF(ClosureLayout, hash_); }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawClosure));
+    return RoundedAllocationSize(sizeof(ClosureLayout));
   }
 
   // Returns true if all elements are OK for canonicalization.
@@ -10327,23 +10339,23 @@
   }
   int64_t ComputeHash() const;
 
-  static RawClosure* New(const TypeArguments& instantiator_type_arguments,
-                         const TypeArguments& function_type_arguments,
-                         const Function& function,
-                         const Context& context,
-                         Heap::Space space = Heap::kNew);
+  static ClosurePtr New(const TypeArguments& instantiator_type_arguments,
+                        const TypeArguments& function_type_arguments,
+                        const Function& function,
+                        const Context& context,
+                        Heap::Space space = Heap::kNew);
 
-  static RawClosure* New(const TypeArguments& instantiator_type_arguments,
-                         const TypeArguments& function_type_arguments,
-                         const TypeArguments& delayed_type_arguments,
-                         const Function& function,
-                         const Context& context,
-                         Heap::Space space = Heap::kNew);
+  static ClosurePtr New(const TypeArguments& instantiator_type_arguments,
+                        const TypeArguments& function_type_arguments,
+                        const TypeArguments& delayed_type_arguments,
+                        const Function& function,
+                        const Context& context,
+                        Heap::Space space = Heap::kNew);
 
-  RawFunction* GetInstantiatedSignature(Zone* zone) const;
+  FunctionPtr GetInstantiatedSignature(Zone* zone) const;
 
  private:
-  static RawClosure* New();
+  static ClosurePtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Closure, Instance);
   friend class Class;
@@ -10354,9 +10366,9 @@
   uint64_t Id() const { return raw_ptr()->id_; }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawCapability));
+    return RoundedAllocationSize(sizeof(CapabilityLayout));
   }
-  static RawCapability* New(uint64_t id, Heap::Space space = Heap::kNew);
+  static CapabilityPtr New(uint64_t id, Heap::Space space = Heap::kNew);
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Capability, Instance);
@@ -10365,18 +10377,18 @@
 
 class ReceivePort : public Instance {
  public:
-  RawSendPort* send_port() const { return raw_ptr()->send_port_; }
+  SendPortPtr send_port() const { return raw_ptr()->send_port_; }
   Dart_Port Id() const { return send_port()->ptr()->id_; }
 
-  RawInstance* handler() const { return raw_ptr()->handler_; }
+  InstancePtr handler() const { return raw_ptr()->handler_; }
   void set_handler(const Instance& value) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawReceivePort));
+    return RoundedAllocationSize(sizeof(ReceivePortLayout));
   }
-  static RawReceivePort* New(Dart_Port id,
-                             bool is_control_port,
-                             Heap::Space space = Heap::kNew);
+  static ReceivePortPtr New(Dart_Port id,
+                            bool is_control_port,
+                            Heap::Space space = Heap::kNew);
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ReceivePort, Instance);
@@ -10394,12 +10406,12 @@
   }
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawSendPort));
+    return RoundedAllocationSize(sizeof(SendPortLayout));
   }
-  static RawSendPort* New(Dart_Port id, Heap::Space space = Heap::kNew);
-  static RawSendPort* New(Dart_Port id,
-                          Dart_Port origin_id,
-                          Heap::Space space = Heap::kNew);
+  static SendPortPtr New(Dart_Port id, Heap::Space space = Heap::kNew);
+  static SendPortPtr New(Dart_Port id,
+                         Dart_Port origin_id,
+                         Heap::Space space = Heap::kNew);
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(SendPort, Instance);
@@ -10437,12 +10449,12 @@
 
 class TransferableTypedData : public Instance {
  public:
-  static RawTransferableTypedData* New(uint8_t* data,
-                                       intptr_t len,
-                                       Heap::Space space = Heap::kNew);
+  static TransferableTypedDataPtr New(uint8_t* data,
+                                      intptr_t len,
+                                      Heap::Space space = Heap::kNew);
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawTransferableTypedData));
+    return RoundedAllocationSize(sizeof(TransferableTypedDataLayout));
   }
 
  private:
@@ -10457,16 +10469,16 @@
 
   intptr_t Length() const;
 
-  RawStackTrace* async_link() const { return raw_ptr()->async_link_; }
+  StackTracePtr async_link() const { return raw_ptr()->async_link_; }
   void set_async_link(const StackTrace& async_link) const;
   void set_expand_inlined(bool value) const;
 
-  RawArray* code_array() const { return raw_ptr()->code_array_; }
-  RawObject* CodeAtFrame(intptr_t frame_index) const;
+  ArrayPtr code_array() const { return raw_ptr()->code_array_; }
+  ObjectPtr CodeAtFrame(intptr_t frame_index) const;
   void SetCodeAtFrame(intptr_t frame_index, const Object& code) const;
 
-  RawArray* pc_offset_array() const { return raw_ptr()->pc_offset_array_; }
-  RawSmi* PcOffsetAtFrame(intptr_t frame_index) const;
+  ArrayPtr pc_offset_array() const { return raw_ptr()->pc_offset_array_; }
+  SmiPtr PcOffsetAtFrame(intptr_t frame_index) const;
   void SetPcOffsetAtFrame(intptr_t frame_index, const Smi& pc_offset) const;
 
   bool skip_sync_start_in_parent_stack() const;
@@ -10487,22 +10499,19 @@
   static constexpr intptr_t kSyncAsyncCroppedFrames = 2;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawStackTrace));
+    return RoundedAllocationSize(sizeof(StackTraceLayout));
   }
-  static RawStackTrace* New(const Array& code_array,
-                            const Array& pc_offset_array,
-                            Heap::Space space = Heap::kNew);
+  static StackTracePtr New(const Array& code_array,
+                           const Array& pc_offset_array,
+                           Heap::Space space = Heap::kNew);
 
-  static RawStackTrace* New(const Array& code_array,
-                            const Array& pc_offset_array,
-                            const StackTrace& async_link,
-                            bool skip_sync_start_in_parent_stack,
-                            Heap::Space space = Heap::kNew);
+  static StackTracePtr New(const Array& code_array,
+                           const Array& pc_offset_array,
+                           const StackTrace& async_link,
+                           bool skip_sync_start_in_parent_stack,
+                           Heap::Space space = Heap::kNew);
 
  private:
-  static const char* ToDartCString(const StackTrace& stack_trace_in);
-  static const char* ToDwarfCString(const StackTrace& stack_trace_in);
-
   void set_code_array(const Array& code_array) const;
   void set_pc_offset_array(const Array& pc_offset_array) const;
   bool expand_inlined() const;
@@ -10593,13 +10602,13 @@
                        : raw_ptr()->num_two_byte_registers_;
   }
 
-  RawString* pattern() const { return raw_ptr()->pattern_; }
-  RawSmi* num_bracket_expressions() const {
+  StringPtr pattern() const { return raw_ptr()->pattern_; }
+  SmiPtr num_bracket_expressions() const {
     return raw_ptr()->num_bracket_expressions_;
   }
-  RawArray* capture_name_map() const { return raw_ptr()->capture_name_map_; }
+  ArrayPtr capture_name_map() const { return raw_ptr()->capture_name_map_; }
 
-  RawTypedData* bytecode(bool is_one_byte, bool sticky) const {
+  TypedDataPtr bytecode(bool is_one_byte, bool sticky) const {
     if (sticky) {
       return is_one_byte ? raw_ptr()->one_byte_sticky_.bytecode_
                          : raw_ptr()->two_byte_sticky_.bytecode_;
@@ -10613,24 +10622,24 @@
     if (sticky) {
       switch (cid) {
         case kOneByteStringCid:
-          return OFFSET_OF(RawRegExp, one_byte_sticky_.function_);
+          return OFFSET_OF(RegExpLayout, one_byte_sticky_.function_);
         case kTwoByteStringCid:
-          return OFFSET_OF(RawRegExp, two_byte_sticky_.function_);
+          return OFFSET_OF(RegExpLayout, two_byte_sticky_.function_);
         case kExternalOneByteStringCid:
-          return OFFSET_OF(RawRegExp, external_one_byte_sticky_function_);
+          return OFFSET_OF(RegExpLayout, external_one_byte_sticky_function_);
         case kExternalTwoByteStringCid:
-          return OFFSET_OF(RawRegExp, external_two_byte_sticky_function_);
+          return OFFSET_OF(RegExpLayout, external_two_byte_sticky_function_);
       }
     } else {
       switch (cid) {
         case kOneByteStringCid:
-          return OFFSET_OF(RawRegExp, one_byte_.function_);
+          return OFFSET_OF(RegExpLayout, one_byte_.function_);
         case kTwoByteStringCid:
-          return OFFSET_OF(RawRegExp, two_byte_.function_);
+          return OFFSET_OF(RegExpLayout, two_byte_.function_);
         case kExternalOneByteStringCid:
-          return OFFSET_OF(RawRegExp, external_one_byte_function_);
+          return OFFSET_OF(RegExpLayout, external_one_byte_function_);
         case kExternalTwoByteStringCid:
-          return OFFSET_OF(RawRegExp, external_two_byte_function_);
+          return OFFSET_OF(RegExpLayout, external_two_byte_function_);
       }
     }
 
@@ -10638,12 +10647,12 @@
     return -1;
   }
 
-  RawFunction** FunctionAddr(intptr_t cid, bool sticky) const {
-    return reinterpret_cast<RawFunction**>(
+  FunctionPtr* FunctionAddr(intptr_t cid, bool sticky) const {
+    return reinterpret_cast<FunctionPtr*>(
         FieldAddrAtOffset(function_offset(cid, sticky)));
   }
 
-  RawFunction* function(intptr_t cid, bool sticky) const {
+  FunctionPtr function(intptr_t cid, bool sticky) const {
     return *FunctionAddr(cid, sticky);
   }
 
@@ -10702,10 +10711,10 @@
   virtual bool CanonicalizeEquals(const Instance& other) const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawRegExp));
+    return RoundedAllocationSize(sizeof(RegExpLayout));
   }
 
-  static RawRegExp* New(Heap::Space space = Heap::kNew);
+  static RegExpPtr New(Heap::Space space = Heap::kNew);
 
  private:
   void set_type(RegExType type) const {
@@ -10721,25 +10730,25 @@
 
 class WeakProperty : public Instance {
  public:
-  RawObject* key() const { return raw_ptr()->key_; }
+  ObjectPtr key() const { return raw_ptr()->key_; }
 
   void set_key(const Object& key) const {
     StorePointer(&raw_ptr()->key_, key.raw());
   }
 
-  RawObject* value() const { return raw_ptr()->value_; }
+  ObjectPtr value() const { return raw_ptr()->value_; }
 
   void set_value(const Object& value) const {
     StorePointer(&raw_ptr()->value_, value.raw());
   }
 
-  static RawWeakProperty* New(Heap::Space space = Heap::kNew);
+  static WeakPropertyPtr New(Heap::Space space = Heap::kNew);
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawWeakProperty));
+    return RoundedAllocationSize(sizeof(WeakPropertyLayout));
   }
 
-  static void Clear(RawWeakProperty* raw_weak) {
+  static void Clear(WeakPropertyPtr raw_weak) {
     ASSERT(raw_weak->ptr()->next_ == 0);
     // This action is performed by the GC. No barrier.
     raw_weak->ptr()->key_ = Object::null();
@@ -10753,29 +10762,29 @@
 
 class MirrorReference : public Instance {
  public:
-  RawObject* referent() const { return raw_ptr()->referent_; }
+  ObjectPtr referent() const { return raw_ptr()->referent_; }
 
   void set_referent(const Object& referent) const {
     StorePointer(&raw_ptr()->referent_, referent.raw());
   }
 
-  RawAbstractType* GetAbstractTypeReferent() const;
+  AbstractTypePtr GetAbstractTypeReferent() const;
 
-  RawClass* GetClassReferent() const;
+  ClassPtr GetClassReferent() const;
 
-  RawField* GetFieldReferent() const;
+  FieldPtr GetFieldReferent() const;
 
-  RawFunction* GetFunctionReferent() const;
+  FunctionPtr GetFunctionReferent() const;
 
-  RawLibrary* GetLibraryReferent() const;
+  LibraryPtr GetLibraryReferent() const;
 
-  RawTypeParameter* GetTypeParameterReferent() const;
+  TypeParameterPtr GetTypeParameterReferent() const;
 
-  static RawMirrorReference* New(const Object& referent,
-                                 Heap::Space space = Heap::kNew);
+  static MirrorReferencePtr New(const Object& referent,
+                                Heap::Space space = Heap::kNew);
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawMirrorReference));
+    return RoundedAllocationSize(sizeof(MirrorReferenceLayout));
   }
 
  private:
@@ -10791,24 +10800,24 @@
     ASSERT(t < UserTags::kUserTagIdOffset + UserTags::kMaxUserTags);
     StoreNonPointer(&raw_ptr()->tag_, t);
   }
-  static intptr_t tag_offset() { return OFFSET_OF(RawUserTag, tag_); }
+  static intptr_t tag_offset() { return OFFSET_OF(UserTagLayout, tag_); }
 
-  RawString* label() const { return raw_ptr()->label_; }
+  StringPtr label() const { return raw_ptr()->label_; }
 
   void MakeActive() const;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawUserTag));
+    return RoundedAllocationSize(sizeof(UserTagLayout));
   }
 
-  static RawUserTag* New(const String& label, Heap::Space space = Heap::kOld);
-  static RawUserTag* DefaultTag();
+  static UserTagPtr New(const String& label, Heap::Space space = Heap::kOld);
+  static UserTagPtr DefaultTag();
 
   static bool TagTableIsFull(Thread* thread);
-  static RawUserTag* FindTagById(uword tag_id);
+  static UserTagPtr FindTagById(uword tag_id);
 
  private:
-  static RawUserTag* FindTagInIsolate(Thread* thread, const String& label);
+  static UserTagPtr FindTagInIsolate(Thread* thread, const String& label);
   static void AddTagToIsolate(Thread* thread, const UserTag& tag);
 
   void set_label(const String& tag_label) const {
@@ -10823,14 +10832,14 @@
 class FutureOr : public Instance {
  public:
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawFutureOr));
+    return RoundedAllocationSize(sizeof(FutureOrLayout));
   }
 
-  virtual RawTypeArguments* GetTypeArguments() const {
+  virtual TypeArgumentsPtr GetTypeArguments() const {
     return raw_ptr()->type_arguments_;
   }
   static intptr_t type_arguments_offset() {
-    return OFFSET_OF(RawFutureOr, type_arguments_);
+    return OFFSET_OF(FutureOrLayout, type_arguments_);
   }
 
  private:
@@ -10840,8 +10849,8 @@
 };
 
 // Breaking cycles and loops.
-RawClass* Object::clazz() const {
-  uword raw_value = reinterpret_cast<uword>(raw_);
+ClassPtr Object::clazz() const {
+  uword raw_value = static_cast<uword>(raw_);
   if ((raw_value & kSmiTagMask) == kSmiTag) {
     return Smi::Class();
   }
@@ -10850,7 +10859,7 @@
 }
 
 DART_FORCE_INLINE
-void Object::SetRaw(RawObject* value) {
+void Object::SetRaw(ObjectPtr value) {
   NoSafepointScope no_safepoint_scope;
   raw_ = value;
   intptr_t cid = value->GetClassIdMayBeSmi();
@@ -10869,10 +10878,10 @@
     // to not use handles.
     if (!isolate_heap->new_space()->scavenging()) {
       Heap* vm_isolate_heap = Dart::vm_isolate()->heap();
-      uword addr = RawObject::ToAddr(raw_);
+      uword addr = ObjectLayout::ToAddr(raw_);
       if (!isolate_heap->Contains(addr) && !vm_isolate_heap->Contains(addr)) {
         ASSERT(FLAG_write_protect_code);
-        addr = RawObject::ToAddr(HeapPage::ToWritable(raw_));
+        addr = ObjectLayout::ToAddr(HeapPage::ToWritable(raw_));
         ASSERT(isolate_heap->Contains(addr) || vm_isolate_heap->Contains(addr));
       }
     }
@@ -10885,7 +10894,7 @@
   return raw_ptr()->bytecode_ != Bytecode::null();
 }
 
-bool Function::HasBytecode(RawFunction* function) {
+bool Function::HasBytecode(FunctionPtr function) {
   return function->ptr()->bytecode_ != Bytecode::null();
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -10919,7 +10928,7 @@
 #endif  //  !defined(DART_PRECOMPILED_RUNTIME)
 }
 
-RawInstance* Field::StaticValue() const {
+InstancePtr Field::StaticValue() const {
   ASSERT(is_static());  // Valid only for static dart fields.
   return Isolate::Current()->field_table()->At(
       raw_ptr()->host_offset_or_field_id_);
@@ -10944,8 +10953,7 @@
 intptr_t Instance::GetNativeField(int index) const {
   ASSERT(IsValidNativeIndex(index));
   NoSafepointScope no_safepoint;
-  RawTypedData* native_fields =
-      reinterpret_cast<RawTypedData*>(*NativeFieldsAddr());
+  TypedDataPtr native_fields = static_cast<TypedDataPtr>(*NativeFieldsAddr());
   if (native_fields == TypedData::null()) {
     return 0;
   }
@@ -10957,8 +10965,7 @@
   NoSafepointScope no_safepoint;
   ASSERT(num_fields == NumNativeFields());
   ASSERT(field_values != NULL);
-  RawTypedData* native_fields =
-      reinterpret_cast<RawTypedData*>(*NativeFieldsAddr());
+  TypedDataPtr native_fields = static_cast<TypedDataPtr>(*NativeFieldsAddr());
   if (native_fields == TypedData::null()) {
     for (intptr_t i = 0; i < num_fields; i++) {
       field_values[i] = 0;
@@ -11012,12 +11019,12 @@
   array.SetAt((index * kEntryLength) + kTargetFunctionIndex, target);
 }
 
-RawObject* MegamorphicCache::GetClassId(const Array& array, intptr_t index) {
+ObjectPtr MegamorphicCache::GetClassId(const Array& array, intptr_t index) {
   return array.At((index * kEntryLength) + kClassIdIndex);
 }
 
-RawObject* MegamorphicCache::GetTargetFunction(const Array& array,
-                                               intptr_t index) {
+ObjectPtr MegamorphicCache::GetTargetFunction(const Array& array,
+                                              intptr_t index) {
   return array.At((index * kEntryLength) + kTargetFunctionIndex);
 }
 
@@ -11117,7 +11124,7 @@
         : array_(array), index_(index) {}
 
     template <EnumType kElement>
-    typename std::tuple_element<kElement, TupleT>::type::RawObjectType* Get()
+    typename std::tuple_element<kElement, TupleT>::type::ObjectPtrType Get()
         const {
       using object_type = typename std::tuple_element<kElement, TupleT>::type;
       return object_type::RawCast(array_.At(index_ + kElement));
@@ -11217,7 +11224,7 @@
                                       Object* reusable_object_handle);
 
 DART_WARN_UNUSED_RESULT
-RawError* EntryPointFieldInvocationError(const String& getter_name);
+ErrorPtr EntryPointFieldInvocationError(const String& getter_name);
 
 }  // namespace dart
 
diff --git a/runtime/vm/object_arm64_test.cc b/runtime/vm/object_arm64_test.cc
index c71002b..640c91b 100644
--- a/runtime/vm/object_arm64_test.cc
+++ b/runtime/vm/object_arm64_test.cc
@@ -46,7 +46,7 @@
 // This is used to test Embedded Smi objects in the instructions.
 void GenerateEmbedSmiInCode(compiler::Assembler* assembler, intptr_t value) {
   const Smi& smi_object = Smi::ZoneHandle(Smi::New(value));
-  const int64_t val = reinterpret_cast<int64_t>(smi_object.raw());
+  const int64_t val = static_cast<int64_t>(smi_object.raw());
   __ LoadImmediate(R0, val);
   __ ret();
 }
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index ff147cb..6f028d9 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -51,9 +51,9 @@
   // Marks and pushes. Used to initialize this stack with roots.
   // We can use ObjectIdTable normally used by serializers because it
   // won't be in use while handling a service request (ObjectGraph's only use).
-  virtual void VisitPointers(RawObject** first, RawObject** last) {
-    for (RawObject** current = first; current <= last; ++current) {
-      if ((*current)->IsHeapObject() && !(*current)->InVMIsolateHeap() &&
+  virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+    for (ObjectPtr* current = first; current <= last; ++current) {
+      if ((*current)->IsHeapObject() && !(*current)->ptr()->InVMIsolateHeap() &&
           object_ids_->GetValueExclusive(*current) == 0) {  // not visited yet
         if (!include_vm_objects_ && !IsUserClass((*current)->GetClassId())) {
           continue;
@@ -78,7 +78,7 @@
         data_.RemoveLast();
         continue;
       }
-      RawObject* obj = node.obj;
+      ObjectPtr obj = node.obj;
       ASSERT(obj->IsHeapObject());
       Node sentinel;
       sentinel.ptr = kSentinel;
@@ -91,7 +91,7 @@
       }
       if (direction == ObjectGraph::Visitor::kProceed) {
         set_gc_root_type(node.gc_root_type);
-        obj->VisitPointers(this);
+        obj->ptr()->VisitPointers(this);
         clear_gc_root_type();
       }
     }
@@ -109,13 +109,13 @@
 
  private:
   struct Node {
-    RawObject** ptr;  // kSentinel for the sentinel node.
-    RawObject* obj;
+    ObjectPtr* ptr;  // kSentinel for the sentinel node.
+    ObjectPtr obj;
     const char* gc_root_type;
   };
 
   bool visit_weak_persistent_handles_ = false;
-  static RawObject** const kSentinel;
+  static ObjectPtr* const kSentinel;
   static const intptr_t kInitialCapacity = 1024;
   static const intptr_t kNoParent = -1;
 
@@ -138,9 +138,9 @@
   DISALLOW_COPY_AND_ASSIGN(Stack);
 };
 
-RawObject** const ObjectGraph::Stack::kSentinel = NULL;
+ObjectPtr* const ObjectGraph::Stack::kSentinel = NULL;
 
-RawObject* ObjectGraph::StackIterator::Get() const {
+ObjectPtr ObjectGraph::StackIterator::Get() const {
   return stack_->data_[index_].obj;
 }
 
@@ -160,17 +160,18 @@
     return -1;
   }
   Stack::Node parent = stack_->data_[parent_index];
-  uword parent_start = RawObject::ToAddr(parent.obj);
+  uword parent_start = ObjectLayout::ToAddr(parent.obj);
   Stack::Node child = stack_->data_[index_];
   ASSERT(child.obj == *child.ptr);
   uword child_ptr_addr = reinterpret_cast<uword>(child.ptr);
   intptr_t offset = child_ptr_addr - parent_start;
-  if (offset > 0 && offset < parent.obj->HeapSize()) {
+  if (offset > 0 && offset < parent.obj->ptr()->HeapSize()) {
     ASSERT(Utils::IsAligned(offset, kWordSize));
     return offset >> kWordSizeLog2;
   } else {
     // Some internal VM objects visit pointers not contained within the parent.
-    // For instance, RawCode::VisitCodePointers visits pointers in instructions.
+    // For instance, CodeLayout::VisitCodePointers visits pointers in
+    // instructions.
     ASSERT(!parent.obj->IsDartInstance());
     return -1;
   }
@@ -199,12 +200,12 @@
         fields = cls.fields();
         for (intptr_t j = 0; j < fields.Length(); j++) {
           field ^= fields.At(j);
-          RawObject* ptr = field.raw();
+          ObjectPtr ptr = field.raw();
           visitor->VisitPointer(&ptr);
         }
       } else if (entry.IsField()) {
         field ^= entry.raw();
-        RawObject* ptr = field.raw();
+        ObjectPtr ptr = field.raw();
         visitor->VisitPointer(&ptr);
       }
     }
@@ -243,7 +244,7 @@
   Stack stack(isolate_group());
   stack.set_visit_weak_persistent_handles(
       visitor->visit_weak_persistent_handles());
-  RawObject* root_raw = root.raw();
+  ObjectPtr root_raw = root.raw();
   stack.VisitPointer(&root_raw);
   stack.TraverseGraph(visitor);
 }
@@ -253,9 +254,9 @@
   InstanceAccumulator(ObjectGraph::Stack* stack, intptr_t class_id)
       : stack_(stack), class_id_(class_id) {}
 
-  void VisitObject(RawObject* obj) {
+  void VisitObject(ObjectPtr obj) {
     if (obj->GetClassId() == class_id_) {
-      RawObject* rawobj = obj;
+      ObjectPtr rawobj = obj;
       stack_->VisitPointer(&rawobj);
     }
   }
@@ -282,13 +283,13 @@
  public:
   SizeVisitor() : size_(0) {}
   intptr_t size() const { return size_; }
-  virtual bool ShouldSkip(RawObject* obj) const { return false; }
+  virtual bool ShouldSkip(ObjectPtr obj) const { return false; }
   virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
-    RawObject* obj = it->Get();
+    ObjectPtr obj = it->Get();
     if (ShouldSkip(obj)) {
       return kBacktrack;
     }
-    size_ += obj->HeapSize();
+    size_ += obj->ptr()->HeapSize();
     return kProceed;
   }
 
@@ -299,7 +300,7 @@
 class SizeExcludingObjectVisitor : public SizeVisitor {
  public:
   explicit SizeExcludingObjectVisitor(const Object& skip) : skip_(skip) {}
-  virtual bool ShouldSkip(RawObject* obj) const { return obj == skip_.raw(); }
+  virtual bool ShouldSkip(ObjectPtr obj) const { return obj == skip_.raw(); }
 
  private:
   const Object& skip_;
@@ -308,7 +309,7 @@
 class SizeExcludingClassVisitor : public SizeVisitor {
  public:
   explicit SizeExcludingClassVisitor(intptr_t skip) : skip_(skip) {}
-  virtual bool ShouldSkip(RawObject* obj) const {
+  virtual bool ShouldSkip(ObjectPtr obj) const {
     return obj->GetClassId() == skip_;
   }
 
@@ -355,14 +356,13 @@
 class RetainingPathVisitor : public ObjectGraph::Visitor {
  public:
   // We cannot use a GrowableObjectArray, since we must not trigger GC.
-  RetainingPathVisitor(RawObject* obj, const Array& path)
-      : thread_(Thread::Current()), obj_(obj), path_(path), length_(0) {
-  }
+  RetainingPathVisitor(ObjectPtr obj, const Array& path)
+      : thread_(Thread::Current()), obj_(obj), path_(path), length_(0) {}
 
   intptr_t length() const { return length_; }
   virtual bool visit_weak_persistent_handles() const { return true; }
 
-  bool ShouldSkip(RawObject* obj) {
+  bool ShouldSkip(ObjectPtr obj) {
     // A retaining path through ICData is never the only retaining path,
     // and it is less informative than its alternatives.
     intptr_t cid = obj->GetClassId();
@@ -374,10 +374,10 @@
     }
   }
 
-  bool ShouldStop(RawObject* obj) {
+  bool ShouldStop(ObjectPtr obj) {
     // A static field is considered a root from a language point of view.
     if (obj->IsField()) {
-      const Field& field = Field::Handle(static_cast<RawField*>(obj));
+      const Field& field = Field::Handle(static_cast<FieldPtr>(obj));
       return field.is_static();
     }
     return false;
@@ -385,7 +385,7 @@
 
   void StartList() { was_last_array_ = false; }
 
-  intptr_t HideNDescendant(RawObject* obj) {
+  intptr_t HideNDescendant(ObjectPtr obj) {
     // A GrowableObjectArray overwrites its internal storage.
     // Keeping both of them in the list is redundant.
     if (was_last_array_ && obj->IsGrowableObjectArray()) {
@@ -433,7 +433,7 @@
 
  private:
   Thread* thread_;
-  RawObject* obj_;
+  ObjectPtr obj_;
   const Array& path_;
   intptr_t length_;
   bool was_last_array_;
@@ -444,7 +444,7 @@
   HeapIterationScope iteration_scope(Thread::Current(), true);
   // To break the trivial path, the handle 'obj' is temporarily cleared during
   // the search, but restored before returning.
-  RawObject* raw = obj->raw();
+  ObjectPtr raw = obj->raw();
   *obj = Object::null();
   RetainingPathVisitor visitor(raw, path);
   IterateUserObjects(&visitor);
@@ -460,11 +460,11 @@
  public:
   // We cannot use a GrowableObjectArray, since we must not trigger GC.
   InboundReferencesVisitor(Isolate* isolate,
-                           RawObject* target,
+                           ObjectPtr target,
                            const Array& references,
                            Object* scratch)
       : ObjectPointerVisitor(isolate->group()),
-        source_(NULL),
+        source_(nullptr),
         target_(target),
         references_(references),
         scratch_(scratch),
@@ -474,14 +474,14 @@
 
   intptr_t length() const { return length_; }
 
-  virtual void VisitObject(RawObject* raw_obj) {
+  virtual void VisitObject(ObjectPtr raw_obj) {
     source_ = raw_obj;
-    raw_obj->VisitPointers(this);
+    raw_obj->ptr()->VisitPointers(this);
   }
 
-  virtual void VisitPointers(RawObject** first, RawObject** last) {
-    for (RawObject** current_ptr = first; current_ptr <= last; current_ptr++) {
-      RawObject* current_obj = *current_ptr;
+  virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+    for (ObjectPtr* current_ptr = first; current_ptr <= last; current_ptr++) {
+      ObjectPtr current_obj = *current_ptr;
       if (current_obj == target_) {
         intptr_t obj_index = length_ * 2;
         intptr_t offset_index = obj_index + 1;
@@ -490,16 +490,16 @@
           references_.SetAt(obj_index, *scratch_);
 
           *scratch_ = Smi::New(0);
-          uword source_start = RawObject::ToAddr(source_);
+          uword source_start = ObjectLayout::ToAddr(source_);
           uword current_ptr_addr = reinterpret_cast<uword>(current_ptr);
           intptr_t offset = current_ptr_addr - source_start;
-          if (offset > 0 && offset < source_->HeapSize()) {
+          if (offset > 0 && offset < source_->ptr()->HeapSize()) {
             ASSERT(Utils::IsAligned(offset, kWordSize));
             *scratch_ = Smi::New(offset >> kWordSizeLog2);
           } else {
             // Some internal VM objects visit pointers not contained within the
-            // parent. For instance, RawCode::VisitCodePointers visits pointers
-            // in instructions.
+            // parent. For instance, CodeLayout::VisitCodePointers visits
+            // pointers in instructions.
             ASSERT(!source_->IsDartInstance());
             *scratch_ = Smi::New(-1);
           }
@@ -511,8 +511,8 @@
   }
 
  private:
-  RawObject* source_;
-  RawObject* target_;
+  ObjectPtr source_;
+  ObjectPtr target_;
   const Array& references_;
   Object* scratch_;
   intptr_t length_;
@@ -686,8 +686,8 @@
   }
 }
 
-bool HeapSnapshotWriter::OnImagePage(RawObject* obj) const {
-  const uword addr = RawObject::ToAddr(obj);
+bool HeapSnapshotWriter::OnImagePage(ObjectPtr obj) const {
+  const uword addr = ObjectLayout::ToAddr(obj);
   for (intptr_t i = 0; i < kMaxImagePages; i++) {
     if ((addr - image_page_ranges_[i].base) < image_page_ranges_[i].size) {
       return true;
@@ -696,7 +696,7 @@
   return false;
 }
 
-CountingPage* HeapSnapshotWriter::FindCountingPage(RawObject* obj) const {
+CountingPage* HeapSnapshotWriter::FindCountingPage(ObjectPtr obj) const {
   if (obj->IsOldObject() && !OnImagePage(obj)) {
     // On a regular or large page.
     HeapPage* page = HeapPage::Of(obj);
@@ -707,20 +707,20 @@
   return nullptr;
 }
 
-void HeapSnapshotWriter::AssignObjectId(RawObject* obj) {
+void HeapSnapshotWriter::AssignObjectId(ObjectPtr obj) {
   ASSERT(obj->IsHeapObject());
 
   CountingPage* counting_page = FindCountingPage(obj);
   if (counting_page != nullptr) {
     // Likely: object on an ordinary page.
-    counting_page->Record(RawObject::ToAddr(obj), ++object_count_);
+    counting_page->Record(ObjectLayout::ToAddr(obj), ++object_count_);
   } else {
     // Unlikely: new space object, or object on a large or image page.
     thread()->heap()->SetObjectId(obj, ++object_count_);
   }
 }
 
-intptr_t HeapSnapshotWriter::GetObjectId(RawObject* obj) const {
+intptr_t HeapSnapshotWriter::GetObjectId(ObjectPtr obj) const {
   if (!obj->IsHeapObject()) {
     return 0;
   }
@@ -734,7 +734,7 @@
   intptr_t id;
   if (counting_page != nullptr) {
     // Likely: object on an ordinary page.
-    id = counting_page->Lookup(RawObject::ToAddr(obj));
+    id = counting_page->Lookup(ObjectLayout::ToAddr(obj));
   } else {
     // Unlikely: new space object, or object on a large or image page.
     id = thread()->heap()->GetObjectId(obj);
@@ -765,14 +765,14 @@
         HandleVisitor(Thread::Current()),
         writer_(writer) {}
 
-  void VisitObject(RawObject* obj) {
+  void VisitObject(ObjectPtr obj) {
     if (obj->IsPseudoObject()) return;
 
     writer_->AssignObjectId(obj);
-    obj->VisitPointers(this);
+    obj->ptr()->VisitPointers(this);
   }
 
-  void VisitPointers(RawObject** from, RawObject** to) {
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
     intptr_t count = to - from + 1;
     ASSERT(count >= 0);
     writer_->CountReferences(count);
@@ -819,30 +819,30 @@
         isolate_(thread()->isolate()),
         writer_(writer) {}
 
-  void VisitObject(RawObject* obj) {
+  void VisitObject(ObjectPtr obj) {
     if (obj->IsPseudoObject()) return;
 
     intptr_t cid = obj->GetClassId();
     writer_->WriteUnsigned(cid);
-    writer_->WriteUnsigned(discount_sizes_ ? 0 : obj->HeapSize());
+    writer_->WriteUnsigned(discount_sizes_ ? 0 : obj->ptr()->HeapSize());
 
     if (cid == kNullCid) {
       writer_->WriteUnsigned(kNullData);
     } else if (cid == kBoolCid) {
       writer_->WriteUnsigned(kBoolData);
       writer_->WriteUnsigned(
-          static_cast<uintptr_t>(static_cast<RawBool*>(obj)->ptr()->value_));
+          static_cast<uintptr_t>(static_cast<BoolPtr>(obj)->ptr()->value_));
     } else if (cid == kSmiCid) {
       UNREACHABLE();
     } else if (cid == kMintCid) {
       writer_->WriteUnsigned(kIntData);
-      writer_->WriteSigned(static_cast<RawMint*>(obj)->ptr()->value_);
+      writer_->WriteSigned(static_cast<MintPtr>(obj)->ptr()->value_);
     } else if (cid == kDoubleCid) {
       writer_->WriteUnsigned(kDoubleData);
-      writer_->WriteBytes(&(static_cast<RawDouble*>(obj)->ptr()->value_),
+      writer_->WriteBytes(&(static_cast<DoublePtr>(obj)->ptr()->value_),
                           sizeof(double));
     } else if (cid == kOneByteStringCid) {
-      RawOneByteString* str = static_cast<RawOneByteString*>(obj);
+      OneByteStringPtr str = static_cast<OneByteStringPtr>(obj);
       intptr_t len = Smi::Value(str->ptr()->length_);
       intptr_t trunc_len = Utils::Minimum(len, kMaxStringElements);
       writer_->WriteUnsigned(kLatin1Data);
@@ -850,8 +850,7 @@
       writer_->WriteUnsigned(trunc_len);
       writer_->WriteBytes(&str->ptr()->data()[0], trunc_len);
     } else if (cid == kExternalOneByteStringCid) {
-      RawExternalOneByteString* str =
-          static_cast<RawExternalOneByteString*>(obj);
+      ExternalOneByteStringPtr str = static_cast<ExternalOneByteStringPtr>(obj);
       intptr_t len = Smi::Value(str->ptr()->length_);
       intptr_t trunc_len = Utils::Minimum(len, kMaxStringElements);
       writer_->WriteUnsigned(kLatin1Data);
@@ -859,7 +858,7 @@
       writer_->WriteUnsigned(trunc_len);
       writer_->WriteBytes(&str->ptr()->external_data_[0], trunc_len);
     } else if (cid == kTwoByteStringCid) {
-      RawTwoByteString* str = static_cast<RawTwoByteString*>(obj);
+      TwoByteStringPtr str = static_cast<TwoByteStringPtr>(obj);
       intptr_t len = Smi::Value(str->ptr()->length_);
       intptr_t trunc_len = Utils::Minimum(len, kMaxStringElements);
       writer_->WriteUnsigned(kUTF16Data);
@@ -867,8 +866,7 @@
       writer_->WriteUnsigned(trunc_len);
       writer_->WriteBytes(&str->ptr()->data()[0], trunc_len * 2);
     } else if (cid == kExternalTwoByteStringCid) {
-      RawExternalTwoByteString* str =
-          static_cast<RawExternalTwoByteString*>(obj);
+      ExternalTwoByteStringPtr str = static_cast<ExternalTwoByteStringPtr>(obj);
       intptr_t len = Smi::Value(str->ptr()->length_);
       intptr_t trunc_len = Utils::Minimum(len, kMaxStringElements);
       writer_->WriteUnsigned(kUTF16Data);
@@ -878,63 +876,63 @@
     } else if (cid == kArrayCid || cid == kImmutableArrayCid) {
       writer_->WriteUnsigned(kLengthData);
       writer_->WriteUnsigned(
-          Smi::Value(static_cast<RawArray*>(obj)->ptr()->length_));
+          Smi::Value(static_cast<ArrayPtr>(obj)->ptr()->length_));
     } else if (cid == kGrowableObjectArrayCid) {
       writer_->WriteUnsigned(kLengthData);
-      writer_->WriteUnsigned(Smi::Value(
-          static_cast<RawGrowableObjectArray*>(obj)->ptr()->length_));
+      writer_->WriteUnsigned(
+          Smi::Value(static_cast<GrowableObjectArrayPtr>(obj)->ptr()->length_));
     } else if (cid == kLinkedHashMapCid) {
       writer_->WriteUnsigned(kLengthData);
       writer_->WriteUnsigned(
-          Smi::Value(static_cast<RawLinkedHashMap*>(obj)->ptr()->used_data_));
+          Smi::Value(static_cast<LinkedHashMapPtr>(obj)->ptr()->used_data_));
     } else if (cid == kObjectPoolCid) {
       writer_->WriteUnsigned(kLengthData);
-      writer_->WriteUnsigned(static_cast<RawObjectPool*>(obj)->ptr()->length_);
+      writer_->WriteUnsigned(static_cast<ObjectPoolPtr>(obj)->ptr()->length_);
     } else if (IsTypedDataClassId(cid)) {
       writer_->WriteUnsigned(kLengthData);
       writer_->WriteUnsigned(
-          Smi::Value(static_cast<RawTypedData*>(obj)->ptr()->length_));
+          Smi::Value(static_cast<TypedDataPtr>(obj)->ptr()->length_));
     } else if (IsExternalTypedDataClassId(cid)) {
       writer_->WriteUnsigned(kLengthData);
       writer_->WriteUnsigned(
-          Smi::Value(static_cast<RawExternalTypedData*>(obj)->ptr()->length_));
+          Smi::Value(static_cast<ExternalTypedDataPtr>(obj)->ptr()->length_));
     } else if (cid == kFunctionCid) {
       writer_->WriteUnsigned(kNameData);
-      ScrubAndWriteUtf8(static_cast<RawFunction*>(obj)->ptr()->name_);
+      ScrubAndWriteUtf8(static_cast<FunctionPtr>(obj)->ptr()->name_);
     } else if (cid == kCodeCid) {
-      RawObject* owner = static_cast<RawCode*>(obj)->ptr()->owner_;
+      ObjectPtr owner = static_cast<CodePtr>(obj)->ptr()->owner_;
       if (owner->IsFunction()) {
         writer_->WriteUnsigned(kNameData);
-        ScrubAndWriteUtf8(static_cast<RawFunction*>(owner)->ptr()->name_);
+        ScrubAndWriteUtf8(static_cast<FunctionPtr>(owner)->ptr()->name_);
       } else if (owner->IsClass()) {
         writer_->WriteUnsigned(kNameData);
-        ScrubAndWriteUtf8(static_cast<RawClass*>(owner)->ptr()->name_);
+        ScrubAndWriteUtf8(static_cast<ClassPtr>(owner)->ptr()->name_);
       } else {
         writer_->WriteUnsigned(kNoData);
       }
     } else if (cid == kFieldCid) {
       writer_->WriteUnsigned(kNameData);
-      ScrubAndWriteUtf8(static_cast<RawField*>(obj)->ptr()->name_);
+      ScrubAndWriteUtf8(static_cast<FieldPtr>(obj)->ptr()->name_);
     } else if (cid == kClassCid) {
       writer_->WriteUnsigned(kNameData);
-      ScrubAndWriteUtf8(static_cast<RawClass*>(obj)->ptr()->name_);
+      ScrubAndWriteUtf8(static_cast<ClassPtr>(obj)->ptr()->name_);
     } else if (cid == kLibraryCid) {
       writer_->WriteUnsigned(kNameData);
-      ScrubAndWriteUtf8(static_cast<RawLibrary*>(obj)->ptr()->url_);
+      ScrubAndWriteUtf8(static_cast<LibraryPtr>(obj)->ptr()->url_);
     } else if (cid == kScriptCid) {
       writer_->WriteUnsigned(kNameData);
-      ScrubAndWriteUtf8(static_cast<RawScript*>(obj)->ptr()->url_);
+      ScrubAndWriteUtf8(static_cast<ScriptPtr>(obj)->ptr()->url_);
     } else {
       writer_->WriteUnsigned(kNoData);
     }
 
     DoCount();
-    obj->VisitPointersPrecise(isolate_, this);
+    obj->ptr()->VisitPointersPrecise(isolate_, this);
     DoWrite();
-    obj->VisitPointersPrecise(isolate_, this);
+    obj->ptr()->VisitPointersPrecise(isolate_, this);
   }
 
-  void ScrubAndWriteUtf8(RawString* str) {
+  void ScrubAndWriteUtf8(StringPtr str) {
     if (str == String::null()) {
       writer_->WriteUtf8("null");
     } else {
@@ -958,10 +956,10 @@
     writer_->WriteUnsigned(counted_);
   }
 
-  void VisitPointers(RawObject** from, RawObject** to) {
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
     if (writing_) {
-      for (RawObject** ptr = from; ptr <= to; ptr++) {
-        RawObject* target = *ptr;
+      for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
+        ObjectPtr target = *ptr;
         written_++;
         total_++;
         writer_->WriteUnsigned(writer_->GetObjectId(target));
@@ -1223,9 +1221,9 @@
   memset(old_external_size_.get(), 0, class_count * sizeof(intptr_t));
 }
 
-void CountObjectsVisitor::VisitObject(RawObject* obj) {
+void CountObjectsVisitor::VisitObject(ObjectPtr obj) {
   intptr_t cid = obj->GetClassId();
-  intptr_t size = obj->HeapSize();
+  intptr_t size = obj->ptr()->HeapSize();
   if (obj->IsNewObject()) {
     new_count_[cid] += 1;
     new_size_[cid] += size;
@@ -1238,7 +1236,7 @@
 void CountObjectsVisitor::VisitHandle(uword addr) {
   FinalizablePersistentHandle* handle =
       reinterpret_cast<FinalizablePersistentHandle*>(addr);
-  RawObject* obj = handle->raw();
+  ObjectPtr obj = handle->raw();
   if (!obj->IsHeapObject()) {
     return;
   }
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index f05af3d..9ce858e 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -15,7 +15,6 @@
 
 class Array;
 class Object;
-class RawObject;
 class CountingPage;
 
 #if !defined(PRODUCT)
@@ -32,7 +31,7 @@
   class StackIterator {
    public:
     // The object this iterator currently points to.
-    RawObject* Get() const;
+    ObjectPtr Get() const;
     // Returns false if there is no parent.
     bool MoveToParent();
     // Offset into parent for the pointer to current object. -1 if no parent.
@@ -177,8 +176,8 @@
     WriteBytes(value, len);
   }
 
-  void AssignObjectId(RawObject* obj);
-  intptr_t GetObjectId(RawObject* obj) const;
+  void AssignObjectId(ObjectPtr obj);
+  intptr_t GetObjectId(ObjectPtr obj) const;
   void ClearObjectIds();
   void CountReferences(intptr_t count);
   void CountExternalProperty();
@@ -190,8 +189,8 @@
   static const intptr_t kPreferredChunkSize = MB;
 
   void SetupCountingPages();
-  bool OnImagePage(RawObject* obj) const;
-  CountingPage* FindCountingPage(RawObject* obj) const;
+  bool OnImagePage(ObjectPtr obj) const;
+  CountingPage* FindCountingPage(ObjectPtr obj) const;
 
   void EnsureAvailable(intptr_t needed);
   void Flush(bool last = false);
@@ -222,7 +221,7 @@
   CountObjectsVisitor(Thread* thread, intptr_t class_count);
   ~CountObjectsVisitor() {}
 
-  void VisitObject(RawObject* obj);
+  void VisitObject(ObjectPtr obj);
   void VisitHandle(uword addr);
 
   std::unique_ptr<intptr_t[]> new_count_;
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
index b371eb6..a072650 100644
--- a/runtime/vm/object_graph_test.cc
+++ b/runtime/vm/object_graph_test.cc
@@ -14,18 +14,18 @@
  public:
   // Records the number of objects and total size visited, excluding 'skip'
   // and any objects only reachable through 'skip'.
-  CounterVisitor(RawObject* skip, RawObject* expected_parent)
+  CounterVisitor(ObjectPtr skip, ObjectPtr expected_parent)
       : count_(0), size_(0), skip_(skip), expected_parent_(expected_parent) {}
 
   virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
-    RawObject* obj = it->Get();
+    ObjectPtr obj = it->Get();
     if (obj == skip_) {
       EXPECT(it->MoveToParent());
       EXPECT_EQ(expected_parent_, it->Get());
       return kBacktrack;
     }
     ++count_;
-    size_ += obj->HeapSize();
+    size_ += obj->ptr()->HeapSize();
     return kProceed;
   }
 
@@ -35,8 +35,8 @@
  private:
   int count_;
   intptr_t size_;
-  RawObject* skip_;
-  RawObject* expected_parent_;
+  ObjectPtr skip_;
+  ObjectPtr expected_parent_;
 };
 
 ISOLATE_UNIT_TEST_CASE(ObjectGraph) {
@@ -54,14 +54,14 @@
   b.SetAt(0, c);
   b.SetAt(1, d);
   a.SetAt(11, d);
-  intptr_t a_size = a.raw()->HeapSize();
-  intptr_t b_size = b.raw()->HeapSize();
-  intptr_t c_size = c.raw()->HeapSize();
-  intptr_t d_size = d.raw()->HeapSize();
+  intptr_t a_size = a.raw()->ptr()->HeapSize();
+  intptr_t b_size = b.raw()->ptr()->HeapSize();
+  intptr_t c_size = c.raw()->ptr()->HeapSize();
+  intptr_t d_size = d.raw()->ptr()->HeapSize();
   {
     // No more allocation; raw pointers ahead.
     SafepointOperationScope safepoint(thread);
-    RawObject* b_raw = b.raw();
+    ObjectPtr b_raw = b.raw();
     // Clear handles to cut unintended retained paths.
     b = Array::null();
     c = Array::null();
diff --git a/runtime/vm/object_id_ring.cc b/runtime/vm/object_id_ring.cc
index 2652db3..1de2e54 100644
--- a/runtime/vm/object_id_ring.cc
+++ b/runtime/vm/object_id_ring.cc
@@ -18,7 +18,7 @@
   table_ = NULL;
 }
 
-int32_t ObjectIdRing::GetIdForObject(RawObject* object, IdPolicy policy) {
+int32_t ObjectIdRing::GetIdForObject(ObjectPtr object, IdPolicy policy) {
   // We do not allow inserting null because null is how we detect as entry was
   // reclaimed by the GC.
   ASSERT(object != Object::null());
@@ -34,7 +34,7 @@
   return AllocateNewId(object);
 }
 
-int32_t ObjectIdRing::FindExistingIdForObject(RawObject* raw_obj) {
+int32_t ObjectIdRing::FindExistingIdForObject(ObjectPtr raw_obj) {
   for (int32_t i = 0; i < capacity_; i++) {
     if (table_[i] == raw_obj) {
       return IdOfIndex(i);
@@ -43,7 +43,7 @@
   return kInvalidId;
 }
 
-RawObject* ObjectIdRing::GetObjectForId(int32_t id, LookupResult* kind) {
+ObjectPtr ObjectIdRing::GetObjectForId(int32_t id, LookupResult* kind) {
   int32_t index = IndexOfId(id);
   if (index == kInvalidId) {
     *kind = kExpired;
@@ -101,7 +101,7 @@
   if (table_ != NULL) {
     free(table_);
   }
-  table_ = reinterpret_cast<RawObject**>(calloc(capacity_, kWordSize));
+  table_ = reinterpret_cast<ObjectPtr*>(calloc(capacity_, kWordSize));
   for (int32_t i = 0; i < capacity_; i++) {
     table_[i] = Object::null();
   }
@@ -120,7 +120,7 @@
   return r;
 }
 
-int32_t ObjectIdRing::AllocateNewId(RawObject* raw_obj) {
+int32_t ObjectIdRing::AllocateNewId(ObjectPtr raw_obj) {
   ASSERT(raw_obj->IsHeapObject());
   int32_t id = NextSerial();
   ASSERT(id != kInvalidId);
diff --git a/runtime/vm/object_id_ring.h b/runtime/vm/object_id_ring.h
index 2fe8090..63fe1a7 100644
--- a/runtime/vm/object_id_ring.h
+++ b/runtime/vm/object_id_ring.h
@@ -6,11 +6,11 @@
 #define RUNTIME_VM_OBJECT_ID_RING_H_
 
 #include "platform/globals.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
 // Forward declarations.
-class RawObject;
 class ObjectPointerVisitor;
 class JSONStream;
 
@@ -44,10 +44,10 @@
 
   // Adds the argument to the ring and returns its id. Note we do not allow
   // adding Object::null().
-  int32_t GetIdForObject(RawObject* raw_obj, IdPolicy policy = kAllocateId);
+  int32_t GetIdForObject(ObjectPtr raw_obj, IdPolicy policy = kAllocateId);
 
   // Returns Object::null() when the result is not kValid.
-  RawObject* GetObjectForId(int32_t id, LookupResult* kind);
+  ObjectPtr GetObjectForId(int32_t id, LookupResult* kind);
 
   void VisitPointers(ObjectPointerVisitor* visitor);
 
@@ -57,19 +57,19 @@
   friend class ObjectIdRingTestHelper;
 
   void SetCapacityAndMaxSerial(int32_t capacity, int32_t max_serial);
-  int32_t FindExistingIdForObject(RawObject* raw_obj);
+  int32_t FindExistingIdForObject(ObjectPtr raw_obj);
 
-  RawObject** table_;
+  ObjectPtr* table_;
   int32_t max_serial_;
   int32_t capacity_;
   int32_t serial_num_;
   bool wrapped_;
 
-  RawObject** table() { return table_; }
+  ObjectPtr* table() { return table_; }
   int32_t table_size() { return capacity_; }
 
   int32_t NextSerial();
-  int32_t AllocateNewId(RawObject* object);
+  int32_t AllocateNewId(ObjectPtr object);
   int32_t IndexOfId(int32_t id);
   int32_t IdOfIndex(int32_t index);
   bool IsValidContiguous(int32_t id);
diff --git a/runtime/vm/object_id_ring_test.cc b/runtime/vm/object_id_ring_test.cc
index 1b70a92..07fa8ea 100644
--- a/runtime/vm/object_id_ring_test.cc
+++ b/runtime/vm/object_id_ring_test.cc
@@ -38,11 +38,11 @@
     EXPECT_EQ(-1, ring->IdOfIndex(index));
   }
 
-  static RawObject* MakeString(const char* s) {
+  static ObjectPtr MakeString(const char* s) {
     return Symbols::New(Thread::Current(), s);
   }
 
-  static void ExpectString(RawObject* obj, const char* s) {
+  static void ExpectString(ObjectPtr obj, const char* s) {
     String& str = String::Handle();
     str ^= obj;
     EXPECT(str.Equals(s));
@@ -142,7 +142,7 @@
 
   {
     TransitionNativeToVM to_vm(thread);
-    RawObject* raw_obj = Api::UnwrapHandle(result);
+    ObjectPtr raw_obj = Api::UnwrapHandle(result);
     // Located in new heap.
     EXPECT(raw_obj->IsNewObject());
     EXPECT_NE(Object::null(), raw_obj);
@@ -157,29 +157,29 @@
     // Get id 0 again.
     EXPECT_EQ(raw_obj_id1,
               ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId));
-    RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
+    ObjectPtr raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
     EXPECT_EQ(ObjectIdRing::kValid, kind);
-    RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
+    ObjectPtr raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
     EXPECT_EQ(ObjectIdRing::kValid, kind);
     EXPECT_NE(Object::null(), raw_obj1);
     EXPECT_NE(Object::null(), raw_obj2);
-    EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1));
-    EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2));
+    EXPECT_EQ(ObjectLayout::ToAddr(raw_obj), ObjectLayout::ToAddr(raw_obj1));
+    EXPECT_EQ(ObjectLayout::ToAddr(raw_obj), ObjectLayout::ToAddr(raw_obj2));
     // Force a scavenge.
     GCTestHelper::CollectNewSpace();
-    RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind);
+    ObjectPtr raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind);
     EXPECT_EQ(ObjectIdRing::kValid, kind);
-    RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind);
+    ObjectPtr raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind);
     EXPECT_EQ(ObjectIdRing::kValid, kind);
     EXPECT_NE(Object::null(), raw_object_moved1);
     EXPECT_NE(Object::null(), raw_object_moved2);
-    EXPECT_EQ(RawObject::ToAddr(raw_object_moved1),
-              RawObject::ToAddr(raw_object_moved2));
+    EXPECT_EQ(ObjectLayout::ToAddr(raw_object_moved1),
+              ObjectLayout::ToAddr(raw_object_moved2));
     // Test that objects have moved.
-    EXPECT_NE(RawObject::ToAddr(raw_obj1),
-              RawObject::ToAddr(raw_object_moved1));
-    EXPECT_NE(RawObject::ToAddr(raw_obj2),
-              RawObject::ToAddr(raw_object_moved2));
+    EXPECT_NE(ObjectLayout::ToAddr(raw_obj1),
+              ObjectLayout::ToAddr(raw_object_moved1));
+    EXPECT_NE(ObjectLayout::ToAddr(raw_obj2),
+              ObjectLayout::ToAddr(raw_object_moved2));
     // Test that we still point at the same list.
     moved_handle = Api::NewHandle(thread, raw_object_moved1);
     // Test id reuse.
@@ -207,7 +207,7 @@
     EXPECT(!str.IsNull());
     EXPECT_EQ(3, str.Length());
 
-    RawObject* raw_obj = Object::RawCast(str.raw());
+    ObjectPtr raw_obj = Object::RawCast(str.raw());
     // Verify that it is located in old heap.
     EXPECT(raw_obj->IsOldObject());
     EXPECT_NE(Object::null(), raw_obj);
@@ -215,24 +215,24 @@
     EXPECT_EQ(0, raw_obj_id1);
     raw_obj_id2 = ring->GetIdForObject(raw_obj);
     EXPECT_EQ(1, raw_obj_id2);
-    RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
+    ObjectPtr raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
     EXPECT_EQ(ObjectIdRing::kValid, kind);
-    RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
+    ObjectPtr raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
     EXPECT_EQ(ObjectIdRing::kValid, kind);
     EXPECT_NE(Object::null(), raw_obj1);
     EXPECT_NE(Object::null(), raw_obj2);
-    EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1));
-    EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2));
+    EXPECT_EQ(ObjectLayout::ToAddr(raw_obj), ObjectLayout::ToAddr(raw_obj1));
+    EXPECT_EQ(ObjectLayout::ToAddr(raw_obj), ObjectLayout::ToAddr(raw_obj2));
     // Exit scope. Freeing String handle.
   }
   // Force a GC. No reference exist to the old string anymore. It should be
   // collected and the object id ring will now return the null object for
   // those ids.
   GCTestHelper::CollectOldSpace();
-  RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind);
+  ObjectPtr raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind);
   EXPECT_EQ(ObjectIdRing::kCollected, kind);
   EXPECT_EQ(Object::null(), raw_object_moved1);
-  RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind);
+  ObjectPtr raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind);
   EXPECT_EQ(ObjectIdRing::kCollected, kind);
   EXPECT_EQ(Object::null(), raw_object_moved2);
 }
@@ -247,7 +247,7 @@
   String& obj = String::Handle(String::New("I will expire"));
   intptr_t obj_id = ring->GetIdForObject(obj.raw());
   ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid;
-  RawObject* obj_lookup = ring->GetObjectForId(obj_id, &kind);
+  ObjectPtr obj_lookup = ring->GetObjectForId(obj_id, &kind);
   EXPECT_EQ(ObjectIdRing::kValid, kind);
   EXPECT_EQ(obj.raw(), obj_lookup);
 
@@ -257,7 +257,7 @@
     new_obj = String::New("Bump");
     intptr_t new_obj_id = ring->GetIdForObject(new_obj.raw());
     ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid;
-    RawObject* new_obj_lookup = ring->GetObjectForId(new_obj_id, &kind);
+    ObjectPtr new_obj_lookup = ring->GetObjectForId(new_obj_id, &kind);
     EXPECT_EQ(ObjectIdRing::kValid, kind);
     EXPECT_EQ(new_obj.raw(), new_obj_lookup);
   }
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 9bbb011..669e441 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -73,9 +73,8 @@
   const int32_t* offsets = code.raw_ptr()->data();
   for (intptr_t i = 0; i < offsets_length; i++) {
     int32_t offset = offsets[i];
-    RawObject** object_ptr =
-        reinterpret_cast<RawObject**>(base_address + offset);
-    RawObject* raw_object = *object_ptr;
+    ObjectPtr* object_ptr = reinterpret_cast<ObjectPtr*>(base_address + offset);
+    ObjectPtr raw_object = *object_ptr;
     if (!raw_object->IsHeapObject()) {
       continue;
     }
@@ -127,7 +126,7 @@
   }
   const Function& function = Function::Cast(object_);
 
-  if (function.kind() == RawFunction::kIrregexpFunction) {
+  if (function.kind() == FunctionLayout::kIrregexpFunction) {
     // Regex matchers do not support breakpoints or stepping, and they only call
     // core library functions that cannot change due to reload. As a performance
     // optimization, avoid this matching of ICData to PCs for these functions'
@@ -143,7 +142,7 @@
     // calls.
 #if defined(DEBUG)
     descriptors_ = code.pc_descriptors();
-    PcDescriptors::Iterator iter(descriptors_, RawPcDescriptors::kIcCall);
+    PcDescriptors::Iterator iter(descriptors_, PcDescriptorsLayout::kIcCall);
     while (iter.MoveNext()) {
       FATAL1("%s has IC calls but no ic_data_array\n", object_.ToCString());
     }
@@ -152,7 +151,7 @@
   }
 
   descriptors_ = code.pc_descriptors();
-  PcDescriptors::Iterator iter(descriptors_, RawPcDescriptors::kIcCall);
+  PcDescriptors::Iterator iter(descriptors_, PcDescriptorsLayout::kIcCall);
   while (iter.MoveNext()) {
     uword pc = code.PayloadStart() + iter.PcOffset();
     CodePatcher::GetInstanceCallAt(pc, code, &object_);
@@ -567,7 +566,7 @@
   EnumClassConflict(Zone* zone, const Class& from, const Class& to)
       : ClassReasonForCancelling(zone, from, to) {}
 
-  RawString* ToString() {
+  StringPtr ToString() {
     return String::NewFormatted(
         from_.is_enum_class()
             ? "Enum class cannot be redefined to be a non-enum class: %s"
@@ -581,7 +580,7 @@
   TypedefClassConflict(Zone* zone, const Class& from, const Class& to)
       : ClassReasonForCancelling(zone, from, to) {}
 
-  RawString* ToString() {
+  StringPtr ToString() {
     return String::NewFormatted(
         from_.IsTypedefClass()
             ? "Typedef class cannot be redefined to be a non-typedef class: %s"
@@ -601,9 +600,9 @@
  private:
   const Error& error_;
 
-  RawError* ToError() { return error_.raw(); }
+  ErrorPtr ToError() { return error_.raw(); }
 
-  RawString* ToString() { return String::New(error_.ToErrorCString()); }
+  StringPtr ToString() { return String::New(error_.ToErrorCString()); }
 };
 
 class ConstToNonConstClass : public ClassReasonForCancelling {
@@ -612,7 +611,7 @@
       : ClassReasonForCancelling(zone, from, to) {}
 
  private:
-  RawString* ToString() {
+  StringPtr ToString() {
     return String::NewFormatted("Const class cannot become non-const: %s",
                                 from_.ToCString());
   }
@@ -624,7 +623,7 @@
       : ClassReasonForCancelling(zone, from, to) {}
 
  private:
-  RawString* ToString() {
+  StringPtr ToString() {
     return String::NewFormatted("Const class cannot remove fields: %s",
                                 from_.ToCString());
   }
@@ -636,7 +635,7 @@
       : ClassReasonForCancelling(zone, from, to) {}
 
  private:
-  RawString* ToString() {
+  StringPtr ToString() {
     return String::NewFormatted("Number of native fields changed in %s",
                                 from_.ToCString());
   }
@@ -647,7 +646,7 @@
   TypeParametersChanged(Zone* zone, const Class& from, const Class& to)
       : ClassReasonForCancelling(zone, from, to) {}
 
-  RawString* ToString() {
+  StringPtr ToString() {
     return String::NewFormatted(
         "Limitation: type parameters have changed for %s", from_.ToCString());
   }
@@ -669,7 +668,7 @@
       : ClassReasonForCancelling(zone, from, to) {}
 
  private:
-  RawString* ToString() {
+  StringPtr ToString() {
     return String::NewFormatted(
         "Original class ('%s') is prefinalized and replacement class "
         "('%s') is not ",
@@ -683,7 +682,7 @@
       : ClassReasonForCancelling(zone, from, to) {}
 
  private:
-  RawString* ToString() {
+  StringPtr ToString() {
     return String::NewFormatted("Instance size mismatch between '%s' (%" Pd
                                 ") and replacement "
                                 "'%s' ( %" Pd ")",
@@ -940,7 +939,7 @@
 
     if (rule == ICData::kStatic) {
       ASSERT(old_target_.is_static() ||
-             old_target_.kind() == RawFunction::kConstructor);
+             old_target_.kind() == FunctionLayout::kConstructor);
       // This can be incorrect if the call site was an unqualified invocation.
       new_cls_ = old_target_.Owner();
       new_target_ = new_cls_.LookupFunction(name_);
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 3cf2741..5b261ca 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -43,7 +43,7 @@
   }
   if (!ref) {
     if (raw()->IsHeapObject()) {
-      jsobj->AddProperty("size", raw()->HeapSize());
+      jsobj->AddProperty("size", raw()->ptr()->HeapSize());
     } else {
       jsobj->AddProperty("size", (intptr_t)0);
     }
@@ -326,10 +326,10 @@
   jsobj.AddProperty("_optimizedCallSiteCount", optimized_call_site_count());
   jsobj.AddProperty("_deoptimizations",
                     static_cast<intptr_t>(deoptimization_counter()));
-  if ((kind() == RawFunction::kImplicitGetter) ||
-      (kind() == RawFunction::kImplicitSetter) ||
-      (kind() == RawFunction::kImplicitStaticGetter) ||
-      (kind() == RawFunction::kFieldInitializer)) {
+  if ((kind() == FunctionLayout::kImplicitGetter) ||
+      (kind() == FunctionLayout::kImplicitSetter) ||
+      (kind() == FunctionLayout::kImplicitStaticGetter) ||
+      (kind() == FunctionLayout::kFieldInitializer)) {
     const Field& field = Field::Handle(accessor_field());
     if (!field.IsNull()) {
       jsobj.AddProperty("_field", field);
@@ -619,9 +619,9 @@
       entry = entries.GetNext();
       if (entry.IsFunction()) {
         const Function& func = Function::Cast(entry);
-        if (func.kind() == RawFunction::kRegularFunction ||
-            func.kind() == RawFunction::kGetterFunction ||
-            func.kind() == RawFunction::kSetterFunction) {
+        if (func.kind() == FunctionLayout::kRegularFunction ||
+            func.kind() == FunctionLayout::kGetterFunction ||
+            func.kind() == FunctionLayout::kSetterFunction) {
           jsarr.AddValue(func);
         }
       }
@@ -731,7 +731,7 @@
     return;
   }
   JSONArray members(jsobj, "members");
-  Iterator iter(*this, RawPcDescriptors::kAnyKind);
+  Iterator iter(*this, PcDescriptorsLayout::kAnyKind);
   while (iter.MoveNext()) {
     JSONObject descriptor(&members);
     descriptor.AddPropertyF("pcOffset", "%" Px "", iter.PcOffset());
@@ -768,7 +768,7 @@
   JSONArray members(&jsobj, "members");
   String& var_name = String::Handle();
   for (intptr_t i = 0; i < Length(); i++) {
-    RawLocalVarDescriptors::VarInfo info;
+    LocalVarDescriptorsLayout::VarInfo info;
     var_name = GetName(i);
     GetInfo(i, &info);
     JSONObject var(&members);
diff --git a/runtime/vm/object_set.h b/runtime/vm/object_set.h
index f4f0254..6d8e1ff 100644
--- a/runtime/vm/object_set.h
+++ b/runtime/vm/object_set.h
@@ -63,8 +63,8 @@
     sorted_ = true;
   }
 
-  bool Contains(RawObject* raw_obj) const {
-    uword raw_addr = RawObject::ToAddr(raw_obj);
+  bool Contains(ObjectPtr raw_obj) const {
+    uword raw_addr = ObjectLayout::ToAddr(raw_obj);
     ObjectSetRegion* region;
     if (FindRegion(raw_addr, &region)) {
       return region->ContainsObject(raw_addr);
@@ -72,8 +72,8 @@
     return false;
   }
 
-  void Add(RawObject* raw_obj) {
-    uword raw_addr = RawObject::ToAddr(raw_obj);
+  void Add(ObjectPtr raw_obj) {
+    uword raw_addr = ObjectLayout::ToAddr(raw_obj);
     ObjectSetRegion* region;
     if (FindRegion(raw_addr, &region)) {
       return region->AddObject(raw_addr);
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 595a724..c14a52a 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -33,7 +33,7 @@
   ISOLATE_OBJECT_STORE_FIELD_LIST(INIT_FIELD, INIT_FIELD)
 #undef INIT_FIELD
 
-  for (RawObject** current = from(); current <= to(); current++) {
+  for (ObjectPtr* current = from(); current <= to(); current++) {
     ASSERT(*current == Object::null());
   }
 }
@@ -55,7 +55,7 @@
 }
 #endif  // !PRODUCT
 
-static RawUnhandledException* CreatePreallocatedUnandledException(
+static UnhandledExceptionPtr CreatePreallocatedUnandledException(
     Zone* zone,
     const Object& out_of_memory) {
   // Allocate pre-allocated unhandled exception object initialized with the
@@ -66,7 +66,7 @@
   return unhandled_exception.raw();
 }
 
-static RawStackTrace* CreatePreallocatedStackTrace(Zone* zone) {
+static StackTracePtr CreatePreallocatedStackTrace(Zone* zone) {
   const Array& code_array = Array::Handle(
       zone, Array::New(StackTrace::kPreallocatedStackdepth, Heap::kOld));
   const Array& pc_offset_array = Array::Handle(
@@ -79,7 +79,7 @@
   return stack_trace.raw();
 }
 
-RawError* IsolateObjectStore::PreallocateObjects() {
+ErrorPtr IsolateObjectStore::PreallocateObjects() {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   Zone* zone = thread->zone();
@@ -106,7 +106,7 @@
   OBJECT_STORE_FIELD_LIST(INIT_FIELD, INIT_FIELD)
 #undef INIT_FIELD
 
-  for (RawObject** current = from(); current <= to(); current++) {
+  for (ObjectPtr* current = from(); current <= to(); current++) {
     ASSERT(*current == Object::null());
   }
 }
@@ -142,14 +142,14 @@
 }
 #endif  // !PRODUCT
 
-static RawInstance* AllocateObjectByClassName(const Library& library,
-                                              const String& class_name) {
+static InstancePtr AllocateObjectByClassName(const Library& library,
+                                             const String& class_name) {
   const Class& cls = Class::Handle(library.LookupClassAllowPrivate(class_name));
   ASSERT(!cls.IsNull());
   return Instance::New(cls);
 }
 
-RawError* ObjectStore::PreallocateObjects() {
+ErrorPtr ObjectStore::PreallocateObjects() {
   Thread* thread = Thread::Current();
   IsolateGroup* isolate_group = thread->isolate_group();
   Isolate* isolate = thread->isolate();
@@ -186,7 +186,7 @@
   return Error::null();
 }
 
-RawFunction* ObjectStore::PrivateObjectLookup(const String& name) {
+FunctionPtr ObjectStore::PrivateObjectLookup(const String& name) {
   const Library& core_lib = Library::Handle(core_library());
   const String& mangled = String::ZoneHandle(core_lib.PrivateName(name));
   const Class& cls = Class::Handle(object_class());
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 102581e..dae1ce7 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -45,6 +45,8 @@
   RW(Type, nullable_object_type)                                               \
   RW(Class, null_class)                                                        \
   RW(Type, null_type)                                                          \
+  RW(Class, never_class)                                                       \
+  RW(Type, never_type)                                                         \
   RW(Type, function_type)                                                      \
   RW(Type, legacy_function_type)                                               \
   RW(Type, non_nullable_function_type)                                         \
@@ -262,7 +264,7 @@
   ~IsolateObjectStore();
 
 #define DECLARE_GETTER(Type, name)                                             \
-  Raw##Type* name() const { return name##_; }                                  \
+  Type##Ptr name() const { return name##_; }                                   \
   static intptr_t name##_offset() {                                            \
     return OFFSET_OF(IsolateObjectStore, name##_);                             \
   }
@@ -280,7 +282,7 @@
   // Called to initialize objects required by the vm but which invoke
   // dart code.  If an error occurs the error object is returned otherwise
   // a null object is returned.
-  RawError* PreallocateObjects();
+  ErrorPtr PreallocateObjects();
 
   void Init();
   void PostLoad();
@@ -301,16 +303,16 @@
 
  private:
   // Finds a core library private method in Object.
-  RawFunction* PrivateObjectLookup(const String& name);
+  FunctionPtr PrivateObjectLookup(const String& name);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&preallocated_unhandled_exception_);
+  ObjectPtr* from() {
+    return reinterpret_cast<ObjectPtr*>(&preallocated_unhandled_exception_);
   }
-#define DECLARE_OBJECT_STORE_FIELD(type, name) Raw##type* name##_;
+#define DECLARE_OBJECT_STORE_FIELD(type, name) type##Ptr name##_;
   ISOLATE_OBJECT_STORE_FIELD_LIST(DECLARE_OBJECT_STORE_FIELD,
                                   DECLARE_OBJECT_STORE_FIELD)
 #undef DECLARE_OBJECT_STORE_FIELD
-  RawObject** to() { return reinterpret_cast<RawObject**>(&error_listeners_); }
+  ObjectPtr* to() { return reinterpret_cast<ObjectPtr*>(&error_listeners_); }
 
   ObjectStore* object_store_;
 
@@ -335,7 +337,7 @@
   ~ObjectStore();
 
 #define DECLARE_GETTER(Type, name)                                             \
-  Raw##Type* name() const { return name##_; }                                  \
+  Type##Ptr name() const { return name##_; }                                   \
   static intptr_t name##_offset() { return OFFSET_OF(ObjectStore, name##_); }
 #define DECLARE_GETTER_AND_SETTER(Type, name)                                  \
   DECLARE_GETTER(Type, name)                                                   \
@@ -344,7 +346,7 @@
 #undef DECLARE_GETTER
 #undef DECLARE_GETTER_AND_SETTER
 
-  RawLibrary* bootstrap_library(BootstrapLibraryId index) {
+  LibraryPtr bootstrap_library(BootstrapLibraryId index) {
     switch (index) {
 #define MAKE_CASE(CamelName, name)                                             \
   case k##CamelName:                                                           \
@@ -385,7 +387,7 @@
   // Called to initialize objects required by the vm but which invoke
   // dart code.  If an error occurs the error object is returned otherwise
   // a null object is returned.
-  RawError* PreallocateObjects();
+  ErrorPtr PreallocateObjects();
 
   void InitKnownObjects();
 
@@ -397,23 +399,23 @@
 
  private:
   // Finds a core library private method in Object.
-  RawFunction* PrivateObjectLookup(const String& name);
+  FunctionPtr PrivateObjectLookup(const String& name);
 
-  RawObject** from() { return reinterpret_cast<RawObject**>(&object_class_); }
-#define DECLARE_OBJECT_STORE_FIELD(type, name) Raw##type* name##_;
+  ObjectPtr* from() { return reinterpret_cast<ObjectPtr*>(&object_class_); }
+#define DECLARE_OBJECT_STORE_FIELD(type, name) type##Ptr name##_;
   OBJECT_STORE_FIELD_LIST(DECLARE_OBJECT_STORE_FIELD,
                           DECLARE_OBJECT_STORE_FIELD)
 #undef DECLARE_OBJECT_STORE_FIELD
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ffi_as_function_internal_);
+  ObjectPtr* to() {
+    return reinterpret_cast<ObjectPtr*>(&ffi_as_function_internal_);
   }
-  RawObject** to_snapshot(Snapshot::Kind kind) {
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFull:
-        return reinterpret_cast<RawObject**>(&global_object_pool_);
+        return reinterpret_cast<ObjectPtr*>(&global_object_pool_);
       case Snapshot::kFullJIT:
       case Snapshot::kFullAOT:
-        return reinterpret_cast<RawObject**>(&megamorphic_call_miss_function_);
+        return reinterpret_cast<ObjectPtr*>(&megamorphic_call_miss_function_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index eeb5264..67fa779 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -30,8 +30,8 @@
 DECLARE_FLAG(bool, dual_map_code);
 DECLARE_FLAG(bool, write_protect_code);
 
-static RawClass* CreateDummyClass(const String& class_name,
-                                  const Script& script) {
+static ClassPtr CreateDummyClass(const String& class_name,
+                                 const Script& script) {
   const Class& cls = Class::Handle(Class::New(
       Library::Handle(), class_name, script, TokenPosition::kNoSource));
   cls.set_is_synthesized_class();  // Dummy class for testing.
@@ -76,13 +76,13 @@
   String& function_name = String::Handle();
   function_name = Symbols::New(thread, "foo");
   function =
-      Function::New(function_name, RawFunction::kRegularFunction, false, false,
-                    false, false, false, cls, TokenPosition::kMinSource);
+      Function::New(function_name, FunctionLayout::kRegularFunction, false,
+                    false, false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, function);
   function_name = Symbols::New(thread, "bar");
   function =
-      Function::New(function_name, RawFunction::kRegularFunction, false, false,
-                    false, false, false, cls, TokenPosition::kMinSource);
+      Function::New(function_name, FunctionLayout::kRegularFunction, false,
+                    false, false, false, false, cls, TokenPosition::kMinSource);
 
   const int kNumFixedParameters = 2;
   const int kNumOptionalParameters = 3;
@@ -94,25 +94,25 @@
 
   function_name = Symbols::New(thread, "baz");
   function =
-      Function::New(function_name, RawFunction::kRegularFunction, false, false,
-                    false, false, false, cls, TokenPosition::kMinSource);
+      Function::New(function_name, FunctionLayout::kRegularFunction, false,
+                    false, false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(2, function);
 
   function_name = Symbols::New(thread, "Foo");
   function =
-      Function::New(function_name, RawFunction::kRegularFunction, true, false,
-                    false, false, false, cls, TokenPosition::kMinSource);
+      Function::New(function_name, FunctionLayout::kRegularFunction, true,
+                    false, false, false, false, cls, TokenPosition::kMinSource);
 
   functions.SetAt(3, function);
   function_name = Symbols::New(thread, "Bar");
   function =
-      Function::New(function_name, RawFunction::kRegularFunction, true, false,
-                    false, false, false, cls, TokenPosition::kMinSource);
+      Function::New(function_name, FunctionLayout::kRegularFunction, true,
+                    false, false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(4, function);
   function_name = Symbols::New(thread, "BaZ");
   function =
-      Function::New(function_name, RawFunction::kRegularFunction, true, false,
-                    false, false, false, cls, TokenPosition::kMinSource);
+      Function::New(function_name, FunctionLayout::kRegularFunction, true,
+                    false, false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(5, function);
 
   // Setup the functions in the class.
@@ -240,7 +240,7 @@
   one_fields.SetAt(0, field);
   one_field_class.SetFields(one_fields);
   one_field_class.Finalize();
-  intptr_t header_size = sizeof(RawObject);
+  intptr_t header_size = sizeof(ObjectLayout);
   EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment),
             one_field_class.host_instance_size());
   EXPECT_EQ(header_size, field.HostOffset());
@@ -2060,13 +2060,13 @@
   }
   used_size = Array::InstanceSize(array.Length());
   new_array = Array::MakeFixedLength(array);
-  addr = RawObject::ToAddr(new_array.raw());
-  obj = RawObject::FromAddr(addr);
+  addr = ObjectLayout::ToAddr(new_array.raw());
+  obj = ObjectLayout::FromAddr(addr);
   EXPECT(obj.IsArray());
   new_array ^= obj.raw();
   EXPECT_EQ(2, new_array.Length());
   addr += used_size;
-  obj = RawObject::FromAddr(addr);
+  obj = ObjectLayout::FromAddr(addr);
   EXPECT(obj.IsTypedData());
   left_over_array ^= obj.raw();
   EXPECT_EQ(4 * kWordSize - TypedData::InstanceSize(0),
@@ -2083,13 +2083,13 @@
   }
   used_size = Array::InstanceSize(array.Length());
   new_array = Array::MakeFixedLength(array);
-  addr = RawObject::ToAddr(new_array.raw());
-  obj = RawObject::FromAddr(addr);
+  addr = ObjectLayout::ToAddr(new_array.raw());
+  obj = ObjectLayout::FromAddr(addr);
   EXPECT(obj.IsArray());
   new_array ^= obj.raw();
   EXPECT_EQ(3, new_array.Length());
   addr += used_size;
-  obj = RawObject::FromAddr(addr);
+  obj = ObjectLayout::FromAddr(addr);
   if (TypedData::InstanceSize(0) <= 2 * kWordSize) {
     EXPECT(obj.IsTypedData());
     left_over_array ^= obj.raw();
@@ -2109,13 +2109,13 @@
   }
   used_size = Array::InstanceSize(array.Length());
   new_array = Array::MakeFixedLength(array);
-  addr = RawObject::ToAddr(new_array.raw());
-  obj = RawObject::FromAddr(addr);
+  addr = ObjectLayout::ToAddr(new_array.raw());
+  obj = ObjectLayout::FromAddr(addr);
   EXPECT(obj.IsArray());
   new_array ^= obj.raw();
   EXPECT_EQ(1, new_array.Length());
   addr += used_size;
-  obj = RawObject::FromAddr(addr);
+  obj = ObjectLayout::FromAddr(addr);
   EXPECT(obj.IsTypedData());
   left_over_array ^= obj.raw();
   EXPECT_EQ(8 * kWordSize - TypedData::InstanceSize(0),
@@ -2424,7 +2424,7 @@
   Function& parent = Function::Handle();
   const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
   parent =
-      Function::New(parent_name, RawFunction::kRegularFunction, false, false,
+      Function::New(parent_name, FunctionLayout::kRegularFunction, false, false,
                     false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, parent);
   cls.SetFunctions(functions);
@@ -2483,11 +2483,11 @@
   EXPECT(!str3.IsOneByteString());
 }
 
-static RawLibrary* CreateDummyLibrary(const String& library_name) {
+static LibraryPtr CreateDummyLibrary(const String& library_name) {
   return Library::New(library_name);
 }
 
-static RawFunction* CreateFunction(const char* name) {
+static FunctionPtr CreateFunction(const char* name) {
   Thread* thread = Thread::Current();
   const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
   const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary"));
@@ -2497,7 +2497,7 @@
   const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name));
   owner_class.set_library(owner_library);
   const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
-  return Function::New(function_name, RawFunction::kRegularFunction, true,
+  return Function::New(function_name, FunctionLayout::kRegularFunction, true,
                        false, false, false, false, owner_class,
                        TokenPosition::kMinSource);
 }
@@ -2705,18 +2705,18 @@
   DescriptorList* builder = new DescriptorList(0);
 
   // kind, pc_offset, deopt_id, token_pos, try_index, yield_index
-  builder->AddDescriptor(RawPcDescriptors::kOther, 10, 1, TokenPosition(20), 1,
-                         1);
-  builder->AddDescriptor(RawPcDescriptors::kDeopt, 20, 2, TokenPosition(30), 0,
-                         -1);
-  builder->AddDescriptor(RawPcDescriptors::kOther, 30, 3, TokenPosition(40), 1,
-                         10);
-  builder->AddDescriptor(RawPcDescriptors::kOther, 10, 4, TokenPosition(40), 2,
-                         20);
-  builder->AddDescriptor(RawPcDescriptors::kOther, 10, 5, TokenPosition(80), 3,
-                         30);
-  builder->AddDescriptor(RawPcDescriptors::kOther, 80, 6, TokenPosition(150), 3,
-                         30);
+  builder->AddDescriptor(PcDescriptorsLayout::kOther, 10, 1, TokenPosition(20),
+                         1, 1);
+  builder->AddDescriptor(PcDescriptorsLayout::kDeopt, 20, 2, TokenPosition(30),
+                         0, -1);
+  builder->AddDescriptor(PcDescriptorsLayout::kOther, 30, 3, TokenPosition(40),
+                         1, 10);
+  builder->AddDescriptor(PcDescriptorsLayout::kOther, 10, 4, TokenPosition(40),
+                         2, 20);
+  builder->AddDescriptor(PcDescriptorsLayout::kOther, 10, 5, TokenPosition(80),
+                         3, 30);
+  builder->AddDescriptor(PcDescriptorsLayout::kOther, 80, 6, TokenPosition(150),
+                         3, 30);
 
   PcDescriptors& descriptors = PcDescriptors::Handle();
   descriptors ^= builder->FinalizePcDescriptors(0);
@@ -2732,7 +2732,7 @@
 
   // Verify the PcDescriptor entries by accessing them.
   const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors());
-  PcDescriptors::Iterator iter(pc_descs, RawPcDescriptors::kAnyKind);
+  PcDescriptors::Iterator iter(pc_descs, PcDescriptorsLayout::kAnyKind);
 
   EXPECT_EQ(true, iter.MoveNext());
   EXPECT_EQ(1, iter.YieldIndex());
@@ -2740,12 +2740,12 @@
   EXPECT_EQ(1, iter.TryIndex());
   EXPECT_EQ(static_cast<uword>(10), iter.PcOffset());
   EXPECT_EQ(1, iter.DeoptId());
-  EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind());
+  EXPECT_EQ(PcDescriptorsLayout::kOther, iter.Kind());
 
   EXPECT_EQ(true, iter.MoveNext());
   EXPECT_EQ(-1, iter.YieldIndex());
   EXPECT_EQ(30, iter.TokenPos().value());
-  EXPECT_EQ(RawPcDescriptors::kDeopt, iter.Kind());
+  EXPECT_EQ(PcDescriptorsLayout::kDeopt, iter.Kind());
 
   EXPECT_EQ(true, iter.MoveNext());
   EXPECT_EQ(10, iter.YieldIndex());
@@ -2766,7 +2766,7 @@
   EXPECT_EQ(3, iter.TryIndex());
   EXPECT_EQ(static_cast<uword>(80), iter.PcOffset());
   EXPECT_EQ(150, iter.TokenPos().value());
-  EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind());
+  EXPECT_EQ(PcDescriptorsLayout::kOther, iter.Kind());
 
   EXPECT_EQ(false, iter.MoveNext());
 }
@@ -2775,18 +2775,18 @@
   DescriptorList* builder = new DescriptorList(0);
 
   // kind, pc_offset, deopt_id, token_pos, try_index
-  builder->AddDescriptor(RawPcDescriptors::kOther, 100, 1, TokenPosition(200),
-                         1, 10);
-  builder->AddDescriptor(RawPcDescriptors::kDeopt, 200, 2, TokenPosition(300),
-                         0, -1);
-  builder->AddDescriptor(RawPcDescriptors::kOther, 300, 3, TokenPosition(400),
-                         1, 10);
-  builder->AddDescriptor(RawPcDescriptors::kOther, 100, 4, TokenPosition(0), 2,
-                         20);
-  builder->AddDescriptor(RawPcDescriptors::kOther, 100, 5, TokenPosition(800),
-                         3, 30);
-  builder->AddDescriptor(RawPcDescriptors::kOther, 800, 6, TokenPosition(150),
-                         3, 30);
+  builder->AddDescriptor(PcDescriptorsLayout::kOther, 100, 1,
+                         TokenPosition(200), 1, 10);
+  builder->AddDescriptor(PcDescriptorsLayout::kDeopt, 200, 2,
+                         TokenPosition(300), 0, -1);
+  builder->AddDescriptor(PcDescriptorsLayout::kOther, 300, 3,
+                         TokenPosition(400), 1, 10);
+  builder->AddDescriptor(PcDescriptorsLayout::kOther, 100, 4, TokenPosition(0),
+                         2, 20);
+  builder->AddDescriptor(PcDescriptorsLayout::kOther, 100, 5,
+                         TokenPosition(800), 3, 30);
+  builder->AddDescriptor(PcDescriptorsLayout::kOther, 800, 6,
+                         TokenPosition(150), 3, 30);
 
   PcDescriptors& descriptors = PcDescriptors::Handle();
   descriptors ^= builder->FinalizePcDescriptors(0);
@@ -2802,7 +2802,7 @@
 
   // Verify the PcDescriptor entries by accessing them.
   const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors());
-  PcDescriptors::Iterator iter(pc_descs, RawPcDescriptors::kAnyKind);
+  PcDescriptors::Iterator iter(pc_descs, PcDescriptorsLayout::kAnyKind);
 
   EXPECT_EQ(true, iter.MoveNext());
   EXPECT_EQ(10, iter.YieldIndex());
@@ -2810,12 +2810,12 @@
   EXPECT_EQ(1, iter.TryIndex());
   EXPECT_EQ(static_cast<uword>(100), iter.PcOffset());
   EXPECT_EQ(1, iter.DeoptId());
-  EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind());
+  EXPECT_EQ(PcDescriptorsLayout::kOther, iter.Kind());
 
   EXPECT_EQ(true, iter.MoveNext());
   EXPECT_EQ(-1, iter.YieldIndex());
   EXPECT_EQ(300, iter.TokenPos().value());
-  EXPECT_EQ(RawPcDescriptors::kDeopt, iter.Kind());
+  EXPECT_EQ(PcDescriptorsLayout::kDeopt, iter.Kind());
 
   EXPECT_EQ(true, iter.MoveNext());
   EXPECT_EQ(10, iter.YieldIndex());
@@ -2836,12 +2836,12 @@
   EXPECT_EQ(3, iter.TryIndex());
   EXPECT_EQ(static_cast<uword>(800), iter.PcOffset());
   EXPECT_EQ(150, iter.TokenPos().value());
-  EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind());
+  EXPECT_EQ(PcDescriptorsLayout::kOther, iter.Kind());
 
   EXPECT_EQ(false, iter.MoveNext());
 }
 
-static RawClass* CreateTestClass(const char* name) {
+static ClassPtr CreateTestClass(const char* name) {
   const String& class_name =
       String::Handle(Symbols::New(Thread::Current(), name));
   const Class& cls =
@@ -2849,7 +2849,7 @@
   return cls.raw();
 }
 
-static RawField* CreateTestField(const char* name) {
+static FieldPtr CreateTestField(const char* name) {
   const Class& cls = Class::Handle(CreateTestClass("global:"));
   const String& field_name =
       String::Handle(Symbols::New(Thread::Current(), name));
@@ -2881,7 +2881,7 @@
   EXPECT(count == 2);
 }
 
-static RawFunction* GetDummyTarget(const char* name) {
+static FunctionPtr GetDummyTarget(const char* name) {
   const String& function_name =
       String::Handle(Symbols::New(Thread::Current(), name));
   const Class& cls =
@@ -2891,9 +2891,9 @@
   const bool is_abstract = false;
   const bool is_external = false;
   const bool is_native = false;
-  return Function::New(function_name, RawFunction::kRegularFunction, is_static,
-                       is_const, is_abstract, is_external, is_native, cls,
-                       TokenPosition::kMinSource);
+  return Function::New(function_name, FunctionLayout::kRegularFunction,
+                       is_static, is_const, is_abstract, is_external, is_native,
+                       cls, TokenPosition::kMinSource);
 }
 
 ISOLATE_UNIT_TEST_CASE(ICData) {
@@ -3622,28 +3622,28 @@
   EXPECT(obj.IsMirrorReference());
 }
 
-static RawFunction* GetFunction(const Class& cls, const char* name) {
+static FunctionPtr GetFunction(const Class& cls, const char* name) {
   const Function& result = Function::Handle(
       cls.LookupDynamicFunction(String::Handle(String::New(name))));
   EXPECT(!result.IsNull());
   return result.raw();
 }
 
-static RawFunction* GetStaticFunction(const Class& cls, const char* name) {
+static FunctionPtr GetStaticFunction(const Class& cls, const char* name) {
   const Function& result = Function::Handle(
       cls.LookupStaticFunction(String::Handle(String::New(name))));
   EXPECT(!result.IsNull());
   return result.raw();
 }
 
-static RawField* GetField(const Class& cls, const char* name) {
+static FieldPtr GetField(const Class& cls, const char* name) {
   const Field& field =
       Field::Handle(cls.LookupField(String::Handle(String::New(name))));
   EXPECT(!field.IsNull());
   return field.raw();
 }
 
-static RawClass* GetClass(const Library& lib, const char* name) {
+static ClassPtr GetClass(const Library& lib, const char* name) {
   const Class& cls = Class::Handle(
       lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name))));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
@@ -3661,7 +3661,7 @@
   Function& parent = Function::Handle();
   const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
   parent =
-      Function::New(parent_name, RawFunction::kRegularFunction, false, false,
+      Function::New(parent_name, FunctionLayout::kRegularFunction, false, false,
                     false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, parent);
   cls.SetFunctions(functions);
@@ -3697,7 +3697,7 @@
   Function& parent = Function::Handle();
   const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
   parent =
-      Function::New(parent_name, RawFunction::kRegularFunction, false, false,
+      Function::New(parent_name, FunctionLayout::kRegularFunction, false, false,
                     false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, parent);
   cls.SetFunctions(functions);
@@ -3710,7 +3710,7 @@
   Function& invocation_dispatcher = Function::Handle();
   invocation_dispatcher ^= cls.GetInvocationDispatcher(
       invocation_dispatcher_name, args_desc,
-      RawFunction::kNoSuchMethodDispatcher, true /* create_if_absent */);
+      FunctionLayout::kNoSuchMethodDispatcher, true /* create_if_absent */);
   EXPECT(!invocation_dispatcher.IsNull());
   // Get index to function.
   intptr_t invocation_dispatcher_index =
@@ -3987,7 +3987,7 @@
   explicit ObjectAccumulator(GrowableArray<Object*>* objects)
       : objects_(objects) {}
   virtual ~ObjectAccumulator() {}
-  virtual void VisitObject(RawObject* obj) {
+  virtual void VisitObject(ObjectPtr obj) {
     if (obj->IsPseudoObject()) {
       return;  // Cannot be wrapped in handles.
     }
diff --git a/runtime/vm/object_x64_test.cc b/runtime/vm/object_x64_test.cc
index 259305c..e8913ce 100644
--- a/runtime/vm/object_x64_test.cc
+++ b/runtime/vm/object_x64_test.cc
@@ -43,8 +43,7 @@
 // This is used to test Embedded Smi objects in the instructions.
 void GenerateEmbedSmiInCode(compiler::Assembler* assembler, intptr_t value) {
   const Smi& smi_object = Smi::ZoneHandle(Smi::New(value));
-  __ movq(RAX,
-          compiler::Immediate(reinterpret_cast<int64_t>(smi_object.raw())));
+  __ movq(RAX, compiler::Immediate(static_cast<int64_t>(smi_object.raw())));
   __ ret();
 }
 
diff --git a/runtime/vm/pointer_tagging.h b/runtime/vm/pointer_tagging.h
index 70fd9d7..587bffa 100644
--- a/runtime/vm/pointer_tagging.h
+++ b/runtime/vm/pointer_tagging.h
@@ -17,8 +17,6 @@
 
 namespace dart {
 
-class RawSmi;
-
 // Dart VM aligns all objects by 2 words in in the old space and misaligns them
 // in new space. This allows to distinguish new and old pointers by their bits.
 //
@@ -86,12 +84,6 @@
   kSmiTagShift = 1,
 };
 
-inline intptr_t ValueFromRawSmi(const RawSmi* raw_value) {
-  const intptr_t value = reinterpret_cast<intptr_t>(raw_value);
-  ASSERT((value & kSmiTagMask) == kSmiTag);
-  return (value >> kSmiTagShift);
-}
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_POINTER_TAGGING_H_
diff --git a/runtime/vm/port.cc b/runtime/vm/port.cc
index 140121d..9d5c331 100644
--- a/runtime/vm/port.cc
+++ b/runtime/vm/port.cc
@@ -56,7 +56,7 @@
       continue;
     }
 
-    ASSERT(!reinterpret_cast<RawObject*>(result)->IsWellFormed());
+    ASSERT(!static_cast<ObjectPtr>(static_cast<uword>(result))->IsWellFormed());
   } while (ports_->Contains(result));
 
   ASSERT(result != 0);
@@ -223,6 +223,14 @@
   return handler->isolate();
 }
 
+bool PortMap::IsReceiverInThisIsolateGroup(Dart_Port receiver,
+                                           IsolateGroup* group) {
+  MutexLocker ml(mutex_);
+  auto it = ports_->TryLookup(receiver);
+  if (it == ports_->end()) return false;
+  return (*it).handler->isolate()->group() == group;
+}
+
 void PortMap::Init() {
   // TODO(bkonyi): don't keep ports_ after Dart_Cleanup.
   if (mutex_ == NULL) {
diff --git a/runtime/vm/port.h b/runtime/vm/port.h
index 1d9c88e..0297f1d 100644
--- a/runtime/vm/port.h
+++ b/runtime/vm/port.h
@@ -58,6 +58,9 @@
   // Returns the owning Isolate for port 'id'.
   static Isolate* GetIsolate(Dart_Port id);
 
+  static bool IsReceiverInThisIsolateGroup(Dart_Port receiver,
+                                           IsolateGroup* group);
+
   static void Init();
   static void Cleanup();
 
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 69eaf42..43cd2d0 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -1451,7 +1451,7 @@
 
   ~CodeLookupTableBuilder() {}
 
-  void VisitObject(RawObject* raw_obj) {
+  void VisitObject(ObjectPtr raw_obj) {
     if (raw_obj->IsCode()) {
       table_->Add(Code::Handle(Code::RawCast(raw_obj)));
     } else if (raw_obj->IsBytecode()) {
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 49d6814..d63175b 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -456,11 +456,11 @@
 
 class AbstractCode {
  public:
-  explicit AbstractCode(RawObject* code) : code_(Object::Handle(code)) {
+  explicit AbstractCode(ObjectPtr code) : code_(Object::Handle(code)) {
     ASSERT(code_.IsNull() || code_.IsCode() || code_.IsBytecode());
   }
 
-  RawObject* raw() const { return code_.raw(); }
+  ObjectPtr raw() const { return code_.raw(); }
   const Object* handle() const { return &code_; }
 
   uword PayloadStart() const {
@@ -533,7 +533,7 @@
     }
   }
 
-  RawObject* owner() const {
+  ObjectPtr owner() const {
     if (code_.IsCode()) {
       return Code::Cast(code_).owner();
     } else if (code_.IsBytecode()) {
diff --git a/runtime/vm/profiler_service.h b/runtime/vm/profiler_service.h
index f34c24c..0ad1e7f 100644
--- a/runtime/vm/profiler_service.h
+++ b/runtime/vm/profiler_service.h
@@ -28,8 +28,6 @@
 class JSONStream;
 class ProfileFunctionTable;
 class ProfileCodeTable;
-class RawCode;
-class RawFunction;
 class SampleFilter;
 class ProcessedSample;
 class ProcessedSampleBuffer;
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index fdc4c54..fd6751e 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -155,7 +155,7 @@
   delete sample_buffer;
 }
 
-static RawLibrary* LoadTestScript(const char* script) {
+static LibraryPtr LoadTestScript(const char* script) {
   Dart_Handle api_lib;
   {
     TransitionVMToNative transition(Thread::Current());
@@ -167,7 +167,7 @@
   return lib.raw();
 }
 
-static RawClass* GetClass(const Library& lib, const char* name) {
+static ClassPtr GetClass(const Library& lib, const char* name) {
   Thread* thread = Thread::Current();
   const Class& cls = Class::Handle(
       lib.LookupClassAllowPrivate(String::Handle(Symbols::New(thread, name))));
@@ -175,7 +175,7 @@
   return cls.raw();
 }
 
-static RawFunction* GetFunction(const Library& lib, const char* name) {
+static FunctionPtr GetFunction(const Library& lib, const char* name) {
   Thread* thread = Thread::Current();
   const Function& func = Function::Handle(lib.LookupFunctionAllowPrivate(
       String::Handle(Symbols::New(thread, name))));
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 1080e7d..7085853 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -18,7 +18,7 @@
   WorklistElement(Zone* zone, const Object& object)
       : object_(Object::Handle(zone, object.raw())), next_(nullptr) {}
 
-  RawObject* value() const { return object_.raw(); }
+  ObjectPtr value() const { return object_.raw(); }
 
   void set_next(WorklistElement* elem) { next_ = elem; }
   WorklistElement* next() const { return next_; }
@@ -51,7 +51,7 @@
     ASSERT(first_ != nullptr && last_ != nullptr);
   }
 
-  RawObject* Remove() {
+  ObjectPtr Remove() {
     ASSERT(first_ != nullptr);
     WorklistElement* result = first_;
     first_ = first_->next();
@@ -174,15 +174,21 @@
     ASSERT(visitor_->IsCodeVisitor());
     visitor_->AsCodeVisitor()->VisitCode(code);
 
-    // If the precompiler can drop function objects not needed at runtime,
-    // then some entries in the static calls table may need to be visited.
+    // In the precompiler, some entries in the static calls table may need
+    // to be visited as they may not be reachable from other sources.
+    //
+    // TODO(dartbug.com/41636): Figure out why walking the static calls table
+    // in JIT mode with the DedupInstructions visitor fails, so we can remove
+    // the check for AOT mode.
     static_calls_array_ = code.static_calls_target_table();
-    if (static_calls_array_.IsNull()) return;
-    StaticCallsTable static_calls(static_calls_array_);
-    for (auto& view : static_calls) {
-      static_calls_table_entry_ = view.Get<Code::kSCallTableCodeOrTypeTarget>();
-      if (static_calls_table_entry_.IsCode()) {
-        AddToWorklist(Code::Cast(static_calls_table_entry_));
+    if (FLAG_precompiled_mode && !static_calls_array_.IsNull()) {
+      StaticCallsTable static_calls(static_calls_array_);
+      for (auto& view : static_calls) {
+        static_calls_table_entry_ =
+            view.Get<Code::kSCallTableCodeOrTypeTarget>();
+        if (static_calls_table_entry_.IsCode()) {
+          AddToWorklist(Code::Cast(static_calls_table_entry_));
+        }
       }
     }
   }
@@ -316,7 +322,7 @@
     }
   }
 
-  typename T::RawObjectType* Dedup(const T& obj) {
+  typename T::ObjectPtrType Dedup(const T& obj) {
     if (ShouldAdd(obj)) {
       if (auto const canonical = canonical_objects_.LookupValue(&obj)) {
         return canonical->raw();
@@ -577,7 +583,7 @@
     // Creates a new global table of stack map information. Also adds the
     // offsets of encoded StackMapEntry objects to entry_offsets for use
     // when normalizing CompressedStackMaps.
-    RawCompressedStackMaps* CreateGlobalTable(
+    CompressedStackMapsPtr CreateGlobalTable(
         StackMapEntryIntMap* entry_offsets) {
       ASSERT(entry_offsets->IsEmpty());
       if (collected_entries_.length() == 0) return CompressedStackMaps::null();
@@ -671,7 +677,7 @@
 
    private:
     // Creates a normalized CSM from the given non-normalized CSM.
-    RawCompressedStackMaps* NormalizeEntries(const CompressedStackMaps& maps) {
+    CompressedStackMapsPtr NormalizeEntries(const CompressedStackMaps& maps) {
       GrowableArray<uint8_t> new_payload;
       CompressedStackMapsIterator it(maps, old_global_table_);
       intptr_t last_offset = 0;
@@ -1027,7 +1033,7 @@
    private:
     bool IsCorrectType(const Object& obj) const { return obj.IsArray(); }
 
-    RawArray* PrepareParameterTypes(const Function& function) {
+    ArrayPtr PrepareParameterTypes(const Function& function) {
       list_ = function.parameter_types();
       // Preserve parameter types in the JIT. Needed in case of recompilation
       // in checked mode, or if available to mirrors, or for copied types to
@@ -1045,7 +1051,7 @@
       return list_.raw();
     }
 
-    RawArray* PrepareParameterNames(const Function& function) {
+    ArrayPtr PrepareParameterNames(const Function& function) {
       list_ = function.parameter_names();
       // Preserve parameter names in case of recompilation for the JIT. Also
       // avoid attempting to change read-only VM objects for de-duplication.
@@ -1158,7 +1164,7 @@
    public:
     explicit DedupInstructionsVisitor(Zone* zone)
         : Dedupper(zone),
-          function_(Function::Handle(zone)),
+          code_(Code::Handle(zone)),
           instructions_(Instructions::Handle(zone)) {
       if (Snapshot::IncludesCode(Dart::vm_snapshot_kind())) {
         // Prefer existing objects in the VM isolate.
@@ -1166,12 +1172,22 @@
       }
     }
 
-    void VisitObject(RawObject* obj) {
+    void VisitObject(ObjectPtr obj) {
       if (!obj->IsInstructions()) return;
       instructions_ = Instructions::RawCast(obj);
       AddCanonical(instructions_);
     }
 
+    void VisitFunction(const Function& function) {
+      if (!function.HasCode()) return;
+      code_ = function.CurrentCode();
+      // This causes the code to be visited once here and once directly in the
+      // ProgramWalker, but as long as the deduplication process is idempotent,
+      // the cached entry points won't change during the second visit.
+      VisitCode(code_);
+      function.SetInstructions(code_);  // Update cached entry point.
+    }
+
     void VisitCode(const Code& code) {
       instructions_ = code.instructions();
       instructions_ = Dedup(instructions_);
@@ -1182,33 +1198,32 @@
       }
       code.SetActiveInstructions(instructions_,
                                  code.UncheckedEntryPointOffset());
-      if (!code.IsFunctionCode()) return;
-      function_ = code.function();
-      if (function_.IsNull()) return;
-      function_.SetInstructions(code);  // Update cached entry point.
     }
 
    private:
-    Function& function_;
+    Code& code_;
     Instructions& instructions_;
   };
 
 #if defined(DART_PRECOMPILER)
   class DedupInstructionsWithSameMetadataVisitor
       : public CodeVisitor,
-        public Dedupper<Code, CodeKeyValueTrait>,
-        public ObjectVisitor {
+        public Dedupper<Code, CodeKeyValueTrait> {
    public:
     explicit DedupInstructionsWithSameMetadataVisitor(Zone* zone)
         : Dedupper(zone),
           canonical_(Code::Handle(zone)),
-          function_(Function::Handle(zone)),
+          code_(Code::Handle(zone)),
           instructions_(Instructions::Handle(zone)) {}
 
-    void VisitObject(RawObject* obj) {
-      if (!obj->IsCode()) return;
-      canonical_ = Code::RawCast(obj);
-      AddCanonical(canonical_);
+    void VisitFunction(const Function& function) {
+      if (!function.HasCode()) return;
+      code_ = function.CurrentCode();
+      // This causes the code to be visited once here and once directly in the
+      // ProgramWalker, but as long as the deduplication process is idempotent,
+      // the cached entry points won't change during the second visit.
+      VisitCode(code_);
+      function.SetInstructions(code_);  // Update cached entry point.
     }
 
     void VisitCode(const Code& code) {
@@ -1218,17 +1233,13 @@
       code.SetActiveInstructions(instructions_,
                                  code.UncheckedEntryPointOffset());
       code.set_instructions(instructions_);
-      if (!code.IsFunctionCode()) return;
-      function_ = code.function();
-      if (function_.IsNull()) return;
-      function_.SetInstructions(code);  // Update cached entry point.
     }
 
    private:
     bool CanCanonicalize(const Code& code) const { return !code.IsDisabled(); }
 
     Code& canonical_;
-    Function& function_;
+    Code& code_;
     Instructions& instructions_;
   };
 
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index c2270e0..ada6634 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -16,7 +16,7 @@
 
 namespace dart {
 
-bool RawObject::InVMIsolateHeap() const {
+bool ObjectLayout::InVMIsolateHeap() const {
   // All "vm-isolate" objects are pre-marked and in old space
   // (see [Object::FinalizeVMIsolate]).
   if (!IsOldObject() || !IsMarked()) return false;
@@ -26,20 +26,24 @@
   return heap->old_space()->ContainsUnsafe(ToAddr(this));
 }
 
-void RawObject::Validate(IsolateGroup* isolate_group) const {
-  if (Object::void_class_ == reinterpret_cast<RawClass*>(kHeapObjectTag)) {
-    // Validation relies on properly initialized class classes. Skip if the
-    // VM is still being initialized.
-    return;
-  }
+void ObjectPtr::Validate(IsolateGroup* isolate_group) const {
   // All Smi values are valid.
   if (!IsHeapObject()) {
     return;
   }
   // Slightly more readable than a segfault.
-  if (this == reinterpret_cast<RawObject*>(kHeapObjectTag)) {
+  if (tagged_pointer_ == kHeapObjectTag) {
     FATAL("RAW_NULL encountered");
   }
+  ptr()->Validate(isolate_group);
+}
+
+void ObjectLayout::Validate(IsolateGroup* isolate_group) const {
+  if (static_cast<uword>(Object::void_class_) == kHeapObjectTag) {
+    // Validation relies on properly initialized class classes. Skip if the
+    // VM is still being initialized.
+    return;
+  }
   // Validate that the tags_ field is sensible.
   uint32_t tags = ptr()->tags_;
   if (IsNewObject()) {
@@ -86,79 +90,75 @@
 // compaction when the class objects are moving. Can use the class
 // id in the header and the sizes in the Class Table.
 // Cannot deference ptr()->tags_. May dereference other parts of the object.
-intptr_t RawObject::HeapSizeFromClass(uint32_t tags) const {
-  // Only reasonable to be called on heap objects.
-  ASSERT(IsHeapObject());
-
+intptr_t ObjectLayout::HeapSizeFromClass(uint32_t tags) const {
   intptr_t class_id = ClassIdTag::decode(tags);
   intptr_t instance_size = 0;
   switch (class_id) {
     case kCodeCid: {
-      const RawCode* raw_code = reinterpret_cast<const RawCode*>(this);
+      const CodePtr raw_code = static_cast<const CodePtr>(this);
       intptr_t pointer_offsets_length =
           Code::PtrOffBits::decode(raw_code->ptr()->state_bits_);
       instance_size = Code::InstanceSize(pointer_offsets_length);
       break;
     }
     case kInstructionsCid: {
-      const RawInstructions* raw_instructions =
-          reinterpret_cast<const RawInstructions*>(this);
+      const InstructionsPtr raw_instructions =
+          static_cast<const InstructionsPtr>(this);
       intptr_t instructions_size = Instructions::Size(raw_instructions);
       instance_size = Instructions::InstanceSize(instructions_size);
       break;
     }
     case kInstructionsSectionCid: {
-      const RawInstructionsSection* raw_section =
-          reinterpret_cast<const RawInstructionsSection*>(this);
+      const InstructionsSectionPtr raw_section =
+          static_cast<const InstructionsSectionPtr>(this);
       intptr_t section_size = InstructionsSection::Size(raw_section);
       instance_size = InstructionsSection::InstanceSize(section_size);
       break;
     }
     case kContextCid: {
-      const RawContext* raw_context = reinterpret_cast<const RawContext*>(this);
+      const ContextPtr raw_context = static_cast<const ContextPtr>(this);
       intptr_t num_variables = raw_context->ptr()->num_variables_;
       instance_size = Context::InstanceSize(num_variables);
       break;
     }
     case kContextScopeCid: {
-      const RawContextScope* raw_context_scope =
-          reinterpret_cast<const RawContextScope*>(this);
+      const ContextScopePtr raw_context_scope =
+          static_cast<const ContextScopePtr>(this);
       intptr_t num_variables = raw_context_scope->ptr()->num_variables_;
       instance_size = ContextScope::InstanceSize(num_variables);
       break;
     }
     case kOneByteStringCid: {
-      const RawOneByteString* raw_string =
-          reinterpret_cast<const RawOneByteString*>(this);
+      const OneByteStringPtr raw_string =
+          static_cast<const OneByteStringPtr>(this);
       intptr_t string_length = Smi::Value(raw_string->ptr()->length_);
       instance_size = OneByteString::InstanceSize(string_length);
       break;
     }
     case kTwoByteStringCid: {
-      const RawTwoByteString* raw_string =
-          reinterpret_cast<const RawTwoByteString*>(this);
+      const TwoByteStringPtr raw_string =
+          static_cast<const TwoByteStringPtr>(this);
       intptr_t string_length = Smi::Value(raw_string->ptr()->length_);
       instance_size = TwoByteString::InstanceSize(string_length);
       break;
     }
     case kArrayCid:
     case kImmutableArrayCid: {
-      const RawArray* raw_array = reinterpret_cast<const RawArray*>(this);
+      const ArrayPtr raw_array = static_cast<const ArrayPtr>(this);
       intptr_t array_length = Smi::Value(raw_array->ptr()->length_);
       instance_size = Array::InstanceSize(array_length);
       break;
     }
     case kObjectPoolCid: {
-      const RawObjectPool* raw_object_pool =
-          reinterpret_cast<const RawObjectPool*>(this);
+      const ObjectPoolPtr raw_object_pool =
+          static_cast<const ObjectPoolPtr>(this);
       intptr_t len = raw_object_pool->ptr()->length_;
       instance_size = ObjectPool::InstanceSize(len);
       break;
     }
 #define SIZE_FROM_CLASS(clazz) case kTypedData##clazz##Cid:
       CLASS_LIST_TYPED_DATA(SIZE_FROM_CLASS) {
-        const RawTypedData* raw_obj =
-            reinterpret_cast<const RawTypedData*>(this);
+        const TypedDataPtr raw_obj = static_cast<const TypedDataPtr>(this);
         intptr_t array_len = Smi::Value(raw_obj->ptr()->length_);
         intptr_t lengthInBytes =
             array_len * TypedData::ElementSizeInBytes(class_id);
@@ -170,55 +170,55 @@
       instance_size = Pointer::InstanceSize();
       break;
     case kTypeArgumentsCid: {
-      const RawTypeArguments* raw_array =
-          reinterpret_cast<const RawTypeArguments*>(this);
+      const TypeArgumentsPtr raw_array =
+          static_cast<const TypeArgumentsPtr>(this);
       intptr_t array_length = Smi::Value(raw_array->ptr()->length_);
       instance_size = TypeArguments::InstanceSize(array_length);
       break;
     }
     case kPcDescriptorsCid: {
-      const RawPcDescriptors* raw_descriptors =
-          reinterpret_cast<const RawPcDescriptors*>(this);
+      const PcDescriptorsPtr raw_descriptors =
+          static_cast<const PcDescriptorsPtr>(this);
       intptr_t length = raw_descriptors->ptr()->length_;
       instance_size = PcDescriptors::InstanceSize(length);
       break;
     }
     case kCodeSourceMapCid: {
-      const RawCodeSourceMap* raw_code_source_map =
-          reinterpret_cast<const RawCodeSourceMap*>(this);
+      const CodeSourceMapPtr raw_code_source_map =
+          static_cast<const CodeSourceMapPtr>(this);
       intptr_t length = raw_code_source_map->ptr()->length_;
       instance_size = CodeSourceMap::InstanceSize(length);
       break;
     }
     case kCompressedStackMapsCid: {
-      const RawCompressedStackMaps* maps =
-          reinterpret_cast<const RawCompressedStackMaps*>(this);
+      const CompressedStackMapsPtr maps =
+          static_cast<const CompressedStackMapsPtr>(this);
       intptr_t length = CompressedStackMaps::PayloadSizeOf(maps);
       instance_size = CompressedStackMaps::InstanceSize(length);
       break;
     }
     case kLocalVarDescriptorsCid: {
-      const RawLocalVarDescriptors* raw_descriptors =
-          reinterpret_cast<const RawLocalVarDescriptors*>(this);
+      const LocalVarDescriptorsPtr raw_descriptors =
+          static_cast<const LocalVarDescriptorsPtr>(this);
       intptr_t num_descriptors = raw_descriptors->ptr()->num_entries_;
       instance_size = LocalVarDescriptors::InstanceSize(num_descriptors);
       break;
     }
     case kExceptionHandlersCid: {
-      const RawExceptionHandlers* raw_handlers =
-          reinterpret_cast<const RawExceptionHandlers*>(this);
+      const ExceptionHandlersPtr raw_handlers =
+          static_cast<const ExceptionHandlersPtr>(this);
       intptr_t num_handlers = raw_handlers->ptr()->num_entries_;
       instance_size = ExceptionHandlers::InstanceSize(num_handlers);
       break;
     }
     case kFreeListElement: {
-      uword addr = RawObject::ToAddr(this);
+      uword addr = ObjectLayout::ToAddr(this);
       FreeListElement* element = reinterpret_cast<FreeListElement*>(addr);
       instance_size = element->HeapSize();
       break;
     }
     case kForwardingCorpse: {
-      uword addr = RawObject::ToAddr(this);
+      uword addr = ObjectLayout::ToAddr(this);
       ForwardingCorpse* element = reinterpret_cast<ForwardingCorpse*>(addr);
       instance_size = element->HeapSize();
       break;
@@ -262,7 +262,7 @@
     int retries_remaining = 1000;  // ... but not forever.
     do {
       OS::Sleep(1);
-      const RawArray* raw_array = reinterpret_cast<const RawArray*>(this);
+      const ArrayPtr raw_array = static_cast<const ArrayPtr>(this);
       intptr_t array_length = Smi::Value(raw_array->ptr()->length_);
       instance_size = Array::InstanceSize(array_length);
     } while ((instance_size > tags_size) && (--retries_remaining > 0));
@@ -275,60 +275,59 @@
   return instance_size;
 }
 
-intptr_t RawObject::VisitPointersPredefined(ObjectPointerVisitor* visitor,
-                                            intptr_t class_id) {
+intptr_t ObjectLayout::VisitPointersPredefined(ObjectPointerVisitor* visitor,
+                                               intptr_t class_id) {
   ASSERT(class_id < kNumPredefinedCids);
 
   intptr_t size = 0;
 
-  // Only reasonable to be called on heap objects.
-  ASSERT(IsHeapObject());
-
   switch (class_id) {
 #define RAW_VISITPOINTERS(clazz)                                               \
   case k##clazz##Cid: {                                                        \
-    Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(this);                 \
-    size = Raw##clazz::Visit##clazz##Pointers(raw_obj, visitor);               \
+    clazz##Ptr raw_obj = static_cast<clazz##Ptr>(this);                        \
+    size = clazz##Layout::Visit##clazz##Pointers(raw_obj, visitor);            \
     break;                                                                     \
   }
     CLASS_LIST_NO_OBJECT(RAW_VISITPOINTERS)
 #undef RAW_VISITPOINTERS
 #define RAW_VISITPOINTERS(clazz) case kTypedData##clazz##Cid:
     CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS) {
-      RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(this);
-      size = RawTypedData::VisitTypedDataPointers(raw_obj, visitor);
+      TypedDataPtr raw_obj = static_cast<TypedDataPtr>(this);
+      size = TypedDataLayout::VisitTypedDataPointers(raw_obj, visitor);
       break;
     }
 #undef RAW_VISITPOINTERS
 #define RAW_VISITPOINTERS(clazz) case kExternalTypedData##clazz##Cid:
     CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS) {
-      auto raw_obj = reinterpret_cast<RawExternalTypedData*>(this);
-      size = RawExternalTypedData::VisitExternalTypedDataPointers(raw_obj,
-                                                                  visitor);
+      auto raw_obj = static_cast<ExternalTypedDataPtr>(this);
+      size = ExternalTypedDataLayout::VisitExternalTypedDataPointers(raw_obj,
+                                                                     visitor);
       break;
     }
 #undef RAW_VISITPOINTERS
     case kByteDataViewCid:
 #define RAW_VISITPOINTERS(clazz) case kTypedData##clazz##ViewCid:
       CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS) {
-        auto raw_obj = reinterpret_cast<RawTypedDataView*>(this);
-        size = RawTypedDataView::VisitTypedDataViewPointers(raw_obj, visitor);
+        auto raw_obj = static_cast<TypedDataViewPtr>(this);
+        size =
+            TypedDataViewLayout::VisitTypedDataViewPointers(raw_obj, visitor);
         break;
       }
 #undef RAW_VISITPOINTERS
     case kByteBufferCid: {
-      RawInstance* raw_obj = reinterpret_cast<RawInstance*>(this);
-      size = RawInstance::VisitInstancePointers(raw_obj, visitor);
+      InstancePtr raw_obj = static_cast<InstancePtr>(this);
+      size = InstanceLayout::VisitInstancePointers(raw_obj, visitor);
       break;
     }
     case kFfiPointerCid: {
-      RawPointer* raw_obj = reinterpret_cast<RawPointer*>(this);
-      size = RawPointer::VisitPointerPointers(raw_obj, visitor);
+      PointerPtr raw_obj = static_cast<PointerPtr>(this);
+      size = PointerLayout::VisitPointerPointers(raw_obj, visitor);
       break;
     }
     case kFfiDynamicLibraryCid: {
-      RawDynamicLibrary* raw_obj = reinterpret_cast<RawDynamicLibrary*>(this);
-      size = RawDynamicLibrary::VisitDynamicLibraryPointers(raw_obj, visitor);
+      DynamicLibraryPtr raw_obj = static_cast<DynamicLibraryPtr>(this);
+      size =
+          DynamicLibraryLayout::VisitDynamicLibraryPointers(raw_obj, visitor);
       break;
     }
 #define RAW_VISITPOINTERS(clazz) case kFfi##clazz##Cid:
@@ -346,13 +345,13 @@
       }
 #undef RAW_VISITPOINTERS
     case kFreeListElement: {
-      uword addr = RawObject::ToAddr(this);
+      uword addr = ObjectLayout::ToAddr(this);
       FreeListElement* element = reinterpret_cast<FreeListElement*>(addr);
       size = element->HeapSize();
       break;
     }
     case kForwardingCorpse: {
-      uword addr = RawObject::ToAddr(this);
+      uword addr = ObjectLayout::ToAddr(this);
       ForwardingCorpse* forwarder = reinterpret_cast<ForwardingCorpse*>(addr);
       size = forwarder->HeapSize();
       break;
@@ -384,8 +383,8 @@
 #endif
 }
 
-void RawObject::VisitPointersPrecise(Isolate* isolate,
-                                     ObjectPointerVisitor* visitor) {
+void ObjectLayout::VisitPointersPrecise(Isolate* isolate,
+                                        ObjectPointerVisitor* visitor) {
   intptr_t class_id = GetClassId();
   if (class_id < kNumPredefinedCids) {
     VisitPointersPredefined(visitor, class_id);
@@ -398,19 +397,19 @@
                                 ->host_next_field_offset_in_words_
                             << kWordSizeLog2;
   ASSERT(next_field_offset > 0);
-  uword obj_addr = RawObject::ToAddr(this);
-  uword from = obj_addr + sizeof(RawObject);
+  uword obj_addr = ObjectLayout::ToAddr(this);
+  uword from = obj_addr + sizeof(ObjectLayout);
   uword to = obj_addr + next_field_offset - kWordSize;
-  const auto first = reinterpret_cast<RawObject**>(from);
-  const auto last = reinterpret_cast<RawObject**>(to);
+  const auto first = reinterpret_cast<ObjectPtr*>(from);
+  const auto last = reinterpret_cast<ObjectPtr*>(to);
 
 #if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
   const auto unboxed_fields_bitmap =
       visitor->shared_class_table()->GetUnboxedFieldsMapAt(class_id);
 
   if (!unboxed_fields_bitmap.IsEmpty()) {
-    intptr_t bit = sizeof(RawObject) / kWordSize;
-    for (RawObject** current = first; current <= last; current++) {
+    intptr_t bit = sizeof(ObjectLayout) / kWordSize;
+    for (ObjectPtr* current = first; current <= last; current++) {
       if (!unboxed_fields_bitmap.Get(bit++)) {
         visitor->VisitPointer(current);
       }
@@ -423,21 +422,21 @@
 #endif  // defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
 }
 
-bool RawObject::FindObject(FindObjectVisitor* visitor) {
+bool ObjectLayout::FindObject(FindObjectVisitor* visitor) {
   ASSERT(visitor != NULL);
-  return visitor->FindObject(this);
+  return visitor->FindObject(static_cast<ObjectPtr>(this));
 }
 
 // Most objects are visited with this function. It calls the from() and to()
 // methods on the raw object to get the first and last cells that need
 // visiting.
 #define REGULAR_VISITOR(Type)                                                  \
-  intptr_t Raw##Type::Visit##Type##Pointers(Raw##Type* raw_obj,                \
-                                            ObjectPointerVisitor* visitor) {   \
+  intptr_t Type##Layout::Visit##Type##Pointers(                                \
+      Type##Ptr raw_obj, ObjectPointerVisitor* visitor) {                      \
     /* Make sure that we got here with the tagged pointer as this. */          \
     ASSERT(raw_obj->IsHeapObject());                                           \
     ASSERT_UNCOMPRESSED(Type);                                                 \
-    visitor->VisitPointers(raw_obj->from(), raw_obj->to());                    \
+    visitor->VisitPointers(raw_obj->ptr()->from(), raw_obj->ptr()->to());      \
     return Type::InstanceSize();                                               \
   }
 
@@ -447,25 +446,26 @@
 // Though as opposed to Similar to [REGULAR_VISITOR] this visitor will call the
 // specializd VisitTypedDataViewPointers
 #define TYPED_DATA_VIEW_VISITOR(Type)                                          \
-  intptr_t Raw##Type::Visit##Type##Pointers(Raw##Type* raw_obj,                \
-                                            ObjectPointerVisitor* visitor) {   \
+  intptr_t Type##Layout::Visit##Type##Pointers(                                \
+      Type##Ptr raw_obj, ObjectPointerVisitor* visitor) {                      \
     /* Make sure that we got here with the tagged pointer as this. */          \
     ASSERT(raw_obj->IsHeapObject());                                           \
     ASSERT_UNCOMPRESSED(Type);                                                 \
-    visitor->VisitTypedDataViewPointers(raw_obj, raw_obj->from(),              \
-                                        raw_obj->to());                        \
+    visitor->VisitTypedDataViewPointers(raw_obj, raw_obj->ptr()->from(),       \
+                                        raw_obj->ptr()->to());                 \
     return Type::InstanceSize();                                               \
   }
 
 // For variable length objects. get_length is a code snippet that gets the
 // length of the object, which is passed to InstanceSize and the to() method.
 #define VARIABLE_VISITOR(Type, get_length)                                     \
-  intptr_t Raw##Type::Visit##Type##Pointers(Raw##Type* raw_obj,                \
-                                            ObjectPointerVisitor* visitor) {   \
+  intptr_t Type##Layout::Visit##Type##Pointers(                                \
+      Type##Ptr raw_obj, ObjectPointerVisitor* visitor) {                      \
     /* Make sure that we got here with the tagged pointer as this. */          \
     ASSERT(raw_obj->IsHeapObject());                                           \
     intptr_t length = get_length;                                              \
-    visitor->VisitPointers(raw_obj->from(), raw_obj->to(length));              \
+    visitor->VisitPointers(raw_obj->ptr()->from(),                             \
+                           raw_obj->ptr()->to(length));                        \
     return Type::InstanceSize(length);                                         \
   }
 
@@ -476,8 +476,8 @@
 
 // For fixed-length objects that don't have any pointers that need visiting.
 #define NULL_VISITOR(Type)                                                     \
-  intptr_t Raw##Type::Visit##Type##Pointers(Raw##Type* raw_obj,                \
-                                            ObjectPointerVisitor* visitor) {   \
+  intptr_t Type##Layout::Visit##Type##Pointers(                                \
+      Type##Ptr raw_obj, ObjectPointerVisitor* visitor) {                      \
     /* Make sure that we got here with the tagged pointer as this. */          \
     ASSERT(raw_obj->IsHeapObject());                                           \
     ASSERT_NOTHING_TO_VISIT(Type);                                             \
@@ -487,8 +487,8 @@
 // For objects that don't have any pointers that need visiting, but have a
 // variable length.
 #define VARIABLE_NULL_VISITOR(Type, get_length)                                \
-  intptr_t Raw##Type::Visit##Type##Pointers(Raw##Type* raw_obj,                \
-                                            ObjectPointerVisitor* visitor) {   \
+  intptr_t Type##Layout::Visit##Type##Pointers(                                \
+      Type##Ptr raw_obj, ObjectPointerVisitor* visitor) {                      \
     /* Make sure that we got here with the tagged pointer as this. */          \
     ASSERT(raw_obj->IsHeapObject());                                           \
     ASSERT_NOTHING_TO_VISIT(Type);                                             \
@@ -498,8 +498,8 @@
 
 // For objects that are never instantiated on the heap.
 #define UNREACHABLE_VISITOR(Type)                                              \
-  intptr_t Raw##Type::Visit##Type##Pointers(Raw##Type* raw_obj,                \
-                                            ObjectPointerVisitor* visitor) {   \
+  intptr_t Type##Layout::Visit##Type##Pointers(                                \
+      Type##Ptr raw_obj, ObjectPointerVisitor* visitor) {                      \
     UNREACHABLE();                                                             \
     return 0;                                                                  \
   }
@@ -591,19 +591,19 @@
 REGULAR_VISITOR(WeakSerializationReference)
 #endif
 
-bool RawCode::ContainsPC(const RawObject* raw_obj, uword pc) {
+bool CodeLayout::ContainsPC(const ObjectPtr raw_obj, uword pc) {
   if (!raw_obj->IsCode()) return false;
-  auto const raw_code = static_cast<const RawCode*>(raw_obj);
+  auto const raw_code = static_cast<const CodePtr>(raw_obj);
   const uword start = Code::PayloadStartOf(raw_code);
   const uword size = Code::PayloadSizeOf(raw_code);
   return (pc - start) <= size;  // pc may point just past last instruction.
 }
 
-intptr_t RawCode::VisitCodePointers(RawCode* raw_obj,
-                                    ObjectPointerVisitor* visitor) {
-  visitor->VisitPointers(raw_obj->from(), raw_obj->to());
+intptr_t CodeLayout::VisitCodePointers(CodePtr raw_obj,
+                                       ObjectPointerVisitor* visitor) {
+  visitor->VisitPointers(raw_obj->ptr()->from(), raw_obj->ptr()->to());
 
-  RawCode* obj = raw_obj->ptr();
+  CodeLayout* obj = raw_obj->ptr();
   intptr_t length = Code::PtrOffBits::decode(obj->state_bits_);
 #if defined(TARGET_ARCH_IA32)
   // On IA32 only we embed pointers to objects directly in the generated
@@ -613,8 +613,7 @@
     uword entry_point = Code::PayloadStartOf(raw_obj);
     for (intptr_t i = 0; i < length; i++) {
       int32_t offset = obj->data()[i];
-      visitor->VisitPointer(
-          reinterpret_cast<RawObject**>(entry_point + offset));
+      visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(entry_point + offset));
     }
   }
   return Code::InstanceSize(length);
@@ -626,9 +625,9 @@
 #endif
 }
 
-bool RawBytecode::ContainsPC(RawObject* raw_obj, uword pc) {
+bool BytecodeLayout::ContainsPC(ObjectPtr raw_obj, uword pc) {
   if (raw_obj->IsBytecode()) {
-    RawBytecode* raw_bytecode = static_cast<RawBytecode*>(raw_obj);
+    BytecodePtr raw_bytecode = static_cast<BytecodePtr>(raw_obj);
     uword start = raw_bytecode->ptr()->instructions_;
     uword size = raw_bytecode->ptr()->instructions_size_;
     return (pc - start) <= size;  // pc may point past last instruction.
@@ -636,10 +635,11 @@
   return false;
 }
 
-intptr_t RawObjectPool::VisitObjectPoolPointers(RawObjectPool* raw_obj,
-                                                ObjectPointerVisitor* visitor) {
+intptr_t ObjectPoolLayout::VisitObjectPoolPointers(
+    ObjectPoolPtr raw_obj,
+    ObjectPointerVisitor* visitor) {
   const intptr_t length = raw_obj->ptr()->length_;
-  RawObjectPool::Entry* entries = raw_obj->ptr()->data();
+  ObjectPoolLayout::Entry* entries = raw_obj->ptr()->data();
   uint8_t* entry_bits = raw_obj->ptr()->entry_bits();
   for (intptr_t i = 0; i < length; ++i) {
     ObjectPool::EntryType entry_type =
@@ -652,7 +652,7 @@
   return ObjectPool::InstanceSize(length);
 }
 
-bool RawInstructions::ContainsPC(const RawInstructions* raw_instr, uword pc) {
+bool InstructionsLayout::ContainsPC(const InstructionsPtr raw_instr, uword pc) {
   const uword start = Instructions::PayloadStart(raw_instr);
   const uword size = Instructions::Size(raw_instr);
   // We use <= instead of < here because the saved-pc can be outside the
@@ -661,8 +661,8 @@
   return (pc - start) <= size;
 }
 
-intptr_t RawInstance::VisitInstancePointers(RawInstance* raw_obj,
-                                            ObjectPointerVisitor* visitor) {
+intptr_t InstanceLayout::VisitInstancePointers(InstancePtr raw_obj,
+                                               ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
   ASSERT(raw_obj->IsHeapObject());
   uint32_t tags = raw_obj->ptr()->tags_;
@@ -673,36 +673,37 @@
   }
 
   // Calculate the first and last raw object pointer fields.
-  uword obj_addr = RawObject::ToAddr(raw_obj);
-  uword from = obj_addr + sizeof(RawObject);
+  uword obj_addr = ObjectLayout::ToAddr(raw_obj);
+  uword from = obj_addr + sizeof(ObjectLayout);
   uword to = obj_addr + instance_size - kWordSize;
-  visitor->VisitPointers(reinterpret_cast<RawObject**>(from),
-                         reinterpret_cast<RawObject**>(to));
+  visitor->VisitPointers(reinterpret_cast<ObjectPtr*>(from),
+                         reinterpret_cast<ObjectPtr*>(to));
   return instance_size;
 }
 
-intptr_t RawImmutableArray::VisitImmutableArrayPointers(
-    RawImmutableArray* raw_obj,
+intptr_t ImmutableArrayLayout::VisitImmutableArrayPointers(
+    ImmutableArrayPtr raw_obj,
     ObjectPointerVisitor* visitor) {
-  return RawArray::VisitArrayPointers(raw_obj, visitor);
+  return ArrayLayout::VisitArrayPointers(raw_obj, visitor);
 }
 
-void RawObject::RememberCard(RawObject* const* slot) {
-  HeapPage::Of(this)->RememberCard(slot);
+void ObjectLayout::RememberCard(ObjectPtr const* slot) {
+  HeapPage::Of(static_cast<ObjectPtr>(this))->RememberCard(slot);
 }
 
 DEFINE_LEAF_RUNTIME_ENTRY(void,
                           RememberCard,
                           2,
-                          RawObject* object,
-                          RawObject** slot) {
+                          uword /*ObjectPtr*/ object_in,
+                          ObjectPtr* slot) {
+  ObjectPtr object = static_cast<ObjectPtr>(object_in);
   ASSERT(object->IsOldObject());
-  ASSERT(object->IsCardRemembered());
+  ASSERT(object->ptr()->IsCardRemembered());
   HeapPage::Of(object)->RememberCard(slot);
 }
 END_LEAF_RUNTIME_ENTRY
 
-const char* RawPcDescriptors::KindToCString(Kind k) {
+const char* PcDescriptorsLayout::KindToCString(Kind k) {
   switch (k) {
 #define ENUM_CASE(name, init)                                                  \
   case Kind::k##name:                                                          \
@@ -714,7 +715,7 @@
   }
 }
 
-bool RawPcDescriptors::ParseKind(const char* cstr, Kind* out) {
+bool PcDescriptorsLayout::ParseKind(const char* cstr, Kind* out) {
   ASSERT(cstr != nullptr && out != nullptr);
 #define ENUM_CASE(name, init)                                                  \
   if (strcmp(#name, cstr) == 0) {                                              \
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 0b6e0e4..576d992 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -19,18 +19,19 @@
 #include "vm/globals.h"
 #include "vm/pointer_tagging.h"
 #include "vm/snapshot.h"
+#include "vm/tagged_pointer.h"
 #include "vm/token.h"
 #include "vm/token_position.h"
 
 namespace dart {
 
 // For now there are no compressed pointers.
-typedef RawObject* RawCompressed;
+typedef ObjectPtr RawCompressed;
 
 // Forward declarations.
 class Isolate;
 class IsolateGroup;
-#define DEFINE_FORWARD_DECLARATION(clazz) class Raw##clazz;
+#define DEFINE_FORWARD_DECLARATION(clazz) class clazz##Layout;
 CLASS_LIST(DEFINE_FORWARD_DECLARATION)
 #undef DEFINE_FORWARD_DECLARATION
 class CodeStatistics;
@@ -47,15 +48,15 @@
 #define VISIT_NOTHING() int NothingToVisit();
 
 #define ASSERT_UNCOMPRESSED(Type)                                              \
-  ASSERT(SIZE_OF_DEREFERENCED_RETURNED_VALUE(Raw##Type, from) == kWordSize)
+  ASSERT(SIZE_OF_DEREFERENCED_RETURNED_VALUE(Type##Layout, from) == kWordSize)
 
 // For now there are no compressed pointers, so this assert is the same as
 // the above.
 #define ASSERT_COMPRESSED(Type)                                                \
-  ASSERT(SIZE_OF_DEREFERENCED_RETURNED_VALUE(Raw##Type, from) == kWordSize)
+  ASSERT(SIZE_OF_DEREFERENCED_RETURNED_VALUE(Type##Layout, from) == kWordSize)
 
 #define ASSERT_NOTHING_TO_VISIT(Type)                                          \
-  ASSERT(SIZE_OF_RETURNED_VALUE(Raw##Type, NothingToVisit) == sizeof(int))
+  ASSERT(SIZE_OF_RETURNED_VALUE(Type##Layout, NothingToVisit) == sizeof(int))
 
 enum TypedDataElementType {
 #define V(name) k##name##Element,
@@ -69,7 +70,7 @@
   friend class SnapshotWriter;
 
 #define VISITOR_SUPPORT(object)                                                \
-  static intptr_t Visit##object##Pointers(Raw##object* raw_obj,                \
+  static intptr_t Visit##object##Pointers(object##Ptr raw_obj,                 \
                                           ObjectPointerVisitor* visitor);
 
 #define HEAP_PROFILER_SUPPORT() friend class HeapProfiler;
@@ -78,7 +79,7 @@
  private: /* NOLINT */                                                         \
   VISITOR_SUPPORT(object)                                                      \
   friend class object;                                                         \
-  friend class RawObject;                                                      \
+  friend class ObjectLayout;                                                   \
   friend class Heap;                                                           \
   friend class Interpreter;                                                    \
   friend class InterpreterHelpers;                                             \
@@ -86,17 +87,13 @@
   friend class SimulatorHelpers;                                               \
   friend class OffsetsTable;                                                   \
   DISALLOW_ALLOCATION();                                                       \
-  DISALLOW_IMPLICIT_CONSTRUCTORS(Raw##object)
+  DISALLOW_IMPLICIT_CONSTRUCTORS(object##Layout)
 
 // TODO(koda): Make ptr() return const*, like Object::raw_ptr().
 #define RAW_HEAP_OBJECT_IMPLEMENTATION(object)                                 \
  private:                                                                      \
   RAW_OBJECT_IMPLEMENTATION(object);                                           \
-  Raw##object* ptr() const {                                                   \
-    ASSERT(IsHeapObject());                                                    \
-    return reinterpret_cast<Raw##object*>(reinterpret_cast<uword>(this) -      \
-                                          kHeapObjectTag);                     \
-  }                                                                            \
+  object##Layout* ptr() const { return const_cast<object##Layout*>(this); }    \
   SNAPSHOT_WRITER_SUPPORT()                                                    \
   HEAP_PROFILER_SUPPORT()                                                      \
   friend class object##SerializationCluster;                                   \
@@ -108,7 +105,7 @@
 // RawObject is the base class of all raw objects; even though it carries the
 // tags_ field not all raw objects are allocated in the heap and thus cannot
 // be dereferenced (e.g. RawSmi).
-class RawObject {
+class ObjectLayout {
  public:
   // The tags field which is a part of the object header uses the following
   // bit fields for storing tags.
@@ -151,7 +148,7 @@
     typedef intptr_t Type;
 
     static constexpr intptr_t kMaxSizeTagInUnitsOfAlignment =
-        ((1 << RawObject::kSizeTagSize) - 1);
+        ((1 << ObjectLayout::kSizeTagSize) - 1);
     static constexpr intptr_t kMaxSizeTag =
         kMaxSizeTagInUnitsOfAlignment * kObjectAlignment;
 
@@ -274,51 +271,15 @@
     COMPILE_ASSERT(sizeof(std::atomic<uint32_t>) == sizeof(uint32_t));
   };
 
-  bool IsWellFormed() const {
-    uword value = reinterpret_cast<uword>(this);
-    return (value & kSmiTagMask) == 0 ||
-           Utils::IsAligned(value - kHeapObjectTag, kWordSize);
-  }
-  bool IsHeapObject() const {
-    ASSERT(IsWellFormed());
-    uword value = reinterpret_cast<uword>(this);
-    return (value & kSmiTagMask) == kHeapObjectTag;
-  }
   // Assumes this is a heap object.
   bool IsNewObject() const {
-    ASSERT(IsHeapObject());
     uword addr = reinterpret_cast<uword>(this);
-    return (addr & kNewObjectAlignmentOffset) == kNewObjectAlignmentOffset;
-  }
-  bool IsNewObjectMayBeSmi() const {
-    static const uword kNewObjectBits =
-        (kNewObjectAlignmentOffset | kHeapObjectTag);
-    const uword addr = reinterpret_cast<uword>(this);
-    return (addr & kObjectAlignmentMask) == kNewObjectBits;
+    return (addr & kObjectAlignmentMask) == kNewObjectAlignmentOffset;
   }
   // Assumes this is a heap object.
   bool IsOldObject() const {
-    ASSERT(IsHeapObject());
     uword addr = reinterpret_cast<uword>(this);
-    return (addr & kNewObjectAlignmentOffset) == kOldObjectAlignmentOffset;
-  }
-
-  // Like !IsHeapObject() || IsOldObject(), but compiles to a single branch.
-  bool IsSmiOrOldObject() const {
-    ASSERT(IsWellFormed());
-    static const uword kNewObjectBits =
-        (kNewObjectAlignmentOffset | kHeapObjectTag);
-    const uword addr = reinterpret_cast<uword>(this);
-    return (addr & kObjectAlignmentMask) != kNewObjectBits;
-  }
-
-  // Like !IsHeapObject() || IsNewObject(), but compiles to a single branch.
-  bool IsSmiOrNewObject() const {
-    ASSERT(IsWellFormed());
-    static const uword kOldObjectBits =
-        (kOldObjectAlignmentOffset | kHeapObjectTag);
-    const uword addr = reinterpret_cast<uword>(this);
-    return (addr & kObjectAlignmentMask) != kOldObjectBits;
+    return (addr & kObjectAlignmentMask) == kOldObjectAlignmentOffset;
   }
 
   // Support for GC marking bit. Marked objects are either grey (not yet
@@ -376,7 +337,7 @@
   void AddToRememberedSet(Thread* thread) {
     ASSERT(!this->IsRemembered());
     this->SetRememberedBit();
-    thread->StoreBufferAddObject(this);
+    thread->StoreBufferAddObject(ObjectPtr(this));
   }
 
   bool IsCardRemembered() const {
@@ -388,51 +349,9 @@
     ptr()->tags_.UpdateUnsynchronized<CardRememberedBit>(true);
   }
 
-#define DEFINE_IS_CID(clazz)                                                   \
-  bool Is##clazz() const { return ((GetClassId() == k##clazz##Cid)); }
-  CLASS_LIST(DEFINE_IS_CID)
-#undef DEFINE_IS_CID
-
-#define DEFINE_IS_CID(clazz)                                                   \
-  bool IsTypedData##clazz() const {                                            \
-    return ((GetClassId() == kTypedData##clazz##Cid));                         \
-  }                                                                            \
-  bool IsTypedDataView##clazz() const {                                        \
-    return ((GetClassId() == kTypedData##clazz##ViewCid));                     \
-  }                                                                            \
-  bool IsExternalTypedData##clazz() const {                                    \
-    return ((GetClassId() == kExternalTypedData##clazz##Cid));                 \
-  }
-  CLASS_LIST_TYPED_DATA(DEFINE_IS_CID)
-#undef DEFINE_IS_CID
-
-#define DEFINE_IS_CID(clazz)                                                   \
-  bool IsFfi##clazz() const { return ((GetClassId() == kFfi##clazz##Cid)); }
-  CLASS_LIST_FFI(DEFINE_IS_CID)
-#undef DEFINE_IS_CID
-
-  bool IsStringInstance() const { return IsStringClassId(GetClassId()); }
-  bool IsRawNull() const { return GetClassId() == kNullCid; }
-  bool IsDartInstance() const {
-    return (!IsHeapObject() || (GetClassId() >= kInstanceCid));
-  }
-  bool IsFreeListElement() const {
-    return ((GetClassId() == kFreeListElement));
-  }
-  bool IsForwardingCorpse() const {
-    return ((GetClassId() == kForwardingCorpse));
-  }
-  bool IsPseudoObject() const {
-    return IsFreeListElement() || IsForwardingCorpse();
-  }
-
   intptr_t GetClassId() const { return ptr()->tags_.Read<ClassIdTag>(); }
-  intptr_t GetClassIdMayBeSmi() const {
-    return IsHeapObject() ? GetClassId() : static_cast<intptr_t>(kSmiCid);
-  }
 
   intptr_t HeapSize() const {
-    ASSERT(IsHeapObject());
     uint32_t tags = ptr()->tags_;
     intptr_t result = SizeTag::decode(tags);
     if (result != 0) {
@@ -458,7 +377,6 @@
 
   // This variant must not deference ptr()->tags_.
   intptr_t HeapSize(uint32_t tags) const {
-    ASSERT(IsHeapObject());
     intptr_t result = SizeTag::decode(tags);
     if (result != 0) {
       return result;
@@ -470,7 +388,7 @@
 
   bool Contains(uword addr) const {
     intptr_t this_size = HeapSize();
-    uword this_addr = RawObject::ToAddr(this);
+    uword this_addr = ObjectLayout::ToAddr(this);
     return (addr >= this_addr) && (addr < (this_addr + this_size));
   }
 
@@ -490,18 +408,18 @@
     // Calculate the first and last raw object pointer fields.
     intptr_t instance_size = HeapSize();
     uword obj_addr = ToAddr(this);
-    uword from = obj_addr + sizeof(RawObject);
+    uword from = obj_addr + sizeof(ObjectLayout);
     uword to = obj_addr + instance_size - kWordSize;
-    const auto first = reinterpret_cast<RawObject**>(from);
-    const auto last = reinterpret_cast<RawObject**>(to);
+    const auto first = reinterpret_cast<ObjectPtr*>(from);
+    const auto last = reinterpret_cast<ObjectPtr*>(to);
 
 #if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
     const auto unboxed_fields_bitmap =
         visitor->shared_class_table()->GetUnboxedFieldsMapAt(class_id);
 
     if (!unboxed_fields_bitmap.IsEmpty()) {
-      intptr_t bit = sizeof(RawObject) / kWordSize;
-      for (RawObject** current = first; current <= last; current++) {
+      intptr_t bit = sizeof(ObjectLayout) / kWordSize;
+      for (ObjectPtr* current = first; current <= last; current++) {
         if (!unboxed_fields_bitmap.Get(bit++)) {
           visitor->VisitPointer(current);
         }
@@ -528,18 +446,18 @@
     // Calculate the first and last raw object pointer fields.
     intptr_t instance_size = HeapSize();
     uword obj_addr = ToAddr(this);
-    uword from = obj_addr + sizeof(RawObject);
+    uword from = obj_addr + sizeof(ObjectLayout);
     uword to = obj_addr + instance_size - kWordSize;
-    const auto first = reinterpret_cast<RawObject**>(from);
-    const auto last = reinterpret_cast<RawObject**>(to);
+    const auto first = reinterpret_cast<ObjectPtr*>(from);
+    const auto last = reinterpret_cast<ObjectPtr*>(to);
 
 #if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
     const auto unboxed_fields_bitmap =
         visitor->shared_class_table()->GetUnboxedFieldsMapAt(class_id);
 
     if (!unboxed_fields_bitmap.IsEmpty()) {
-      intptr_t bit = sizeof(RawObject) / kWordSize;
-      for (RawObject** current = first; current <= last; current++) {
+      intptr_t bit = sizeof(ObjectLayout) / kWordSize;
+      for (ObjectPtr* current = first; current <= last; current++) {
         if (!unboxed_fields_bitmap.Get(bit++)) {
           visitor->V::VisitPointers(current, current);
         }
@@ -559,14 +477,17 @@
   // rounding up instance sizes up to the allocation unit.
   void VisitPointersPrecise(Isolate* isolate, ObjectPointerVisitor* visitor);
 
-  static RawObject* FromAddr(uword addr) {
+  static ObjectPtr FromAddr(uword addr) {
     // We expect the untagged address here.
     ASSERT((addr & kSmiTagMask) != kHeapObjectTag);
-    return reinterpret_cast<RawObject*>(addr + kHeapObjectTag);
+    return static_cast<ObjectPtr>(addr + kHeapObjectTag);
   }
 
-  static uword ToAddr(const RawObject* raw_obj) {
-    return reinterpret_cast<uword>(raw_obj->ptr());
+  static uword ToAddr(const ObjectLayout* raw_obj) {
+    return reinterpret_cast<uword>(raw_obj);
+  }
+  static uword ToAddr(const ObjectPtr raw_obj) {
+    return static_cast<uword>(raw_obj) - kHeapObjectTag;
   }
 
   static bool IsCanonical(intptr_t value) {
@@ -585,11 +506,7 @@
 #endif
 
   // TODO(koda): After handling tags_, return const*, like Object::raw_ptr().
-  RawObject* ptr() const {
-    ASSERT(IsHeapObject());
-    return reinterpret_cast<RawObject*>(reinterpret_cast<uword>(this) -
-                                        kHeapObjectTag);
-  }
+  ObjectLayout* ptr() const { return const_cast<ObjectLayout*>(this); }
 
   intptr_t VisitPointersPredefined(ObjectPointerVisitor* visitor,
                                    intptr_t class_id);
@@ -628,7 +545,7 @@
   }
 
   DART_FORCE_INLINE
-  void CheckHeapPointerStore(RawObject* value, Thread* thread) {
+  void CheckHeapPointerStore(ObjectPtr value, Thread* thread) {
     uint32_t source_tags = this->ptr()->tags_;
     uint32_t target_tags = value->ptr()->tags_;
     if (((source_tags >> kBarrierOverlapShift) & target_tags &
@@ -648,7 +565,7 @@
           return;
         }
 #endif
-        if (value->TryAcquireMarkBit()) {
+        if (value->ptr()->TryAcquireMarkBit()) {
           thread->MarkingStackAddObject(value);
         }
       }
@@ -674,7 +591,7 @@
 
   template <typename type>
   DART_FORCE_INLINE void CheckArrayPointerStore(type const* addr,
-                                                RawObject* value,
+                                                ObjectPtr value,
                                                 Thread* thread) {
     uint32_t source_tags = this->ptr()->tags_;
     uint32_t target_tags = value->ptr()->tags_;
@@ -685,10 +602,10 @@
         // old-and-not-remembered -> new reference.
         ASSERT(!this->IsRemembered());
         if (this->IsCardRemembered()) {
-          RememberCard(reinterpret_cast<RawObject* const*>(addr));
+          RememberCard(reinterpret_cast<ObjectPtr const*>(addr));
         } else {
           this->SetRememberedBit();
-          thread->StoreBufferAddObject(this);
+          thread->StoreBufferAddObject(static_cast<ObjectPtr>(this));
         }
       } else {
         // Incremental barrier: record when a store creates an
@@ -701,7 +618,7 @@
           return;
         }
 #endif
-        if (value->TryAcquireMarkBit()) {
+        if (value->ptr()->TryAcquireMarkBit()) {
           thread->MarkingStackAddObject(value);
         }
       }
@@ -710,21 +627,21 @@
 
   // Use for storing into an explicitly Smi-typed field of an object
   // (i.e., both the previous and new value are Smis).
-  void StoreSmi(RawSmi* const* addr, RawSmi* value) {
+  void StoreSmi(SmiPtr const* addr, SmiPtr value) {
     // Can't use Contains, as array length is initialized through this method.
-    ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(this));
-    *const_cast<RawSmi**>(addr) = value;
+    ASSERT(reinterpret_cast<uword>(addr) >= ObjectLayout::ToAddr(this));
+    *const_cast<SmiPtr*>(addr) = value;
   }
   NO_SANITIZE_THREAD
-  void StoreSmiIgnoreRace(RawSmi* const* addr, RawSmi* value) {
+  void StoreSmiIgnoreRace(SmiPtr const* addr, SmiPtr value) {
     // Can't use Contains, as array length is initialized through this method.
-    ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(this));
-    *const_cast<RawSmi**>(addr) = value;
+    ASSERT(reinterpret_cast<uword>(addr) >= ObjectLayout::ToAddr(this));
+    *const_cast<SmiPtr*>(addr) = value;
   }
 
  protected:
   friend class StoreBufferUpdateVisitor;  // RememberCard
-  void RememberCard(RawObject* const* slot);
+  void RememberCard(ObjectPtr const* slot);
 
   friend class Array;
   friend class ByteBuffer;
@@ -748,7 +665,7 @@
   friend class Mint;
   friend class Object;
   friend class OneByteString;  // StoreSmi
-  friend class RawInstance;
+  friend class InstanceLayout;
   friend class Scavenger;
   template <bool>
   friend class ScavengerVisitorBase;
@@ -774,10 +691,14 @@
   friend class Object;
 
   DISALLOW_ALLOCATION();
-  DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject);
+  DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectLayout);
 };
 
-class RawClass : public RawObject {
+inline intptr_t ObjectPtr::GetClassId() const {
+  return ptr()->GetClassId();
+}
+
+class ClassLayout : public ObjectLayout {
  public:
   enum ClassFinalizedState {
     kAllocated = 0,  // Initial state.
@@ -801,35 +722,35 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Class);
 
-  VISIT_FROM(RawObject*, name_);
-  RawString* name_;
-  RawString* user_name_;
-  RawArray* functions_;
-  RawArray* functions_hash_table_;
-  RawArray* fields_;
-  RawArray* offset_in_words_to_field_;
-  RawArray* interfaces_;  // Array of AbstractType.
-  RawScript* script_;
-  RawLibrary* library_;
-  RawTypeArguments* type_parameters_;  // Array of TypeParameter.
-  RawAbstractType* super_type_;
-  RawFunction* signature_function_;  // Associated function for typedef class.
-  RawArray* constants_;        // Canonicalized const instances of this class.
-  RawType* declaration_type_;  // Declaration type for this class.
-  RawArray* invocation_dispatcher_cache_;  // Cache for dispatcher functions.
-  RawCode* allocation_stub_;  // Stub code for allocation of instances.
-  RawGrowableObjectArray* direct_implementors_;  // Array of Class.
-  RawGrowableObjectArray* direct_subclasses_;    // Array of Class.
-  RawArray* dependent_code_;                     // CHA optimized codes.
-  VISIT_TO(RawObject*, dependent_code_);
-  RawObject** to_snapshot(Snapshot::Kind kind) {
+  VISIT_FROM(ObjectPtr, name_);
+  StringPtr name_;
+  StringPtr user_name_;
+  ArrayPtr functions_;
+  ArrayPtr functions_hash_table_;
+  ArrayPtr fields_;
+  ArrayPtr offset_in_words_to_field_;
+  ArrayPtr interfaces_;  // Array of AbstractType.
+  ScriptPtr script_;
+  LibraryPtr library_;
+  TypeArgumentsPtr type_parameters_;  // Array of TypeParameter.
+  AbstractTypePtr super_type_;
+  FunctionPtr signature_function_;  // Associated function for typedef class.
+  ArrayPtr constants_;        // Canonicalized const instances of this class.
+  TypePtr declaration_type_;  // Declaration type for this class.
+  ArrayPtr invocation_dispatcher_cache_;  // Cache for dispatcher functions.
+  CodePtr allocation_stub_;  // Stub code for allocation of instances.
+  GrowableObjectArrayPtr direct_implementors_;  // Array of Class.
+  GrowableObjectArrayPtr direct_subclasses_;    // Array of Class.
+  ArrayPtr dependent_code_;                     // CHA optimized codes.
+  VISIT_TO(ObjectPtr, dependent_code_);
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
-        return reinterpret_cast<RawObject**>(&ptr()->allocation_stub_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->allocation_stub_);
       case Snapshot::kFull:
-        return reinterpret_cast<RawObject**>(&ptr()->direct_subclasses_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->direct_subclasses_);
       case Snapshot::kFullJIT:
-        return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->dependent_code_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
@@ -876,32 +797,32 @@
   friend class Instance;
   friend class Isolate;
   friend class Object;
-  friend class RawInstance;
-  friend class RawInstructions;
-  friend class RawTypeArguments;
+  friend class InstanceLayout;
+  friend class InstructionsLayout;
+  friend class TypeArgumentsLayout;
   friend class SnapshotReader;
   friend class InstanceSerializationCluster;
   friend class CidRewriteVisitor;
 };
 
-class RawPatchClass : public RawObject {
+class PatchClassLayout : public ObjectLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass);
 
-  VISIT_FROM(RawObject*, patched_class_);
-  RawClass* patched_class_;
-  RawClass* origin_class_;
-  RawScript* script_;
-  RawExternalTypedData* library_kernel_data_;
-  VISIT_TO(RawObject*, library_kernel_data_);
+  VISIT_FROM(ObjectPtr, patched_class_);
+  ClassPtr patched_class_;
+  ClassPtr origin_class_;
+  ScriptPtr script_;
+  ExternalTypedDataPtr library_kernel_data_;
+  VISIT_TO(ObjectPtr, library_kernel_data_);
 
-  RawObject** to_snapshot(Snapshot::Kind kind) {
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
-        return reinterpret_cast<RawObject**>(&ptr()->script_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->script_);
       case Snapshot::kFull:
       case Snapshot::kFullJIT:
-        return reinterpret_cast<RawObject**>(&ptr()->library_kernel_data_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->library_kernel_data_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
@@ -916,7 +837,7 @@
   friend class Function;
 };
 
-class RawFunction : public RawObject {
+class FunctionLayout : public ObjectLayout {
  public:
   // When you add a new kind, please also update the observatory to account
   // for the new string returned by KindToCString().
@@ -1067,22 +988,22 @@
   uword entry_point_;            // Accessed from generated code.
   uword unchecked_entry_point_;  // Accessed from generated code.
 
-  VISIT_FROM(RawObject*, name_);
-  RawString* name_;
-  RawObject* owner_;  // Class or patch class or mixin class
-                      // where this function is defined.
-  RawAbstractType* result_type_;
-  RawArray* parameter_types_;
-  RawArray* parameter_names_;
-  RawTypeArguments* type_parameters_;  // Array of TypeParameter.
-  RawObject* data_;  // Additional data specific to the function kind. See
-                     // Function::set_data() for details.
-  RawObject** to_snapshot(Snapshot::Kind kind) {
+  VISIT_FROM(ObjectPtr, name_);
+  StringPtr name_;
+  ObjectPtr owner_;  // Class or patch class or mixin class
+                     // where this function is defined.
+  AbstractTypePtr result_type_;
+  ArrayPtr parameter_types_;
+  ArrayPtr parameter_names_;
+  TypeArgumentsPtr type_parameters_;  // Array of TypeParameter.
+  ObjectPtr data_;  // Additional data specific to the function kind. See
+                    // Function::set_data() for details.
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
       case Snapshot::kFull:
       case Snapshot::kFullJIT:
-        return reinterpret_cast<RawObject**>(&ptr()->data_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->data_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
@@ -1091,18 +1012,18 @@
     UNREACHABLE();
     return NULL;
   }
-  RawArray* ic_data_array_;  // ICData of unoptimized code.
-  RawObject** to_no_code() {
-    return reinterpret_cast<RawObject**>(&ptr()->ic_data_array_);
+  ArrayPtr ic_data_array_;  // ICData of unoptimized code.
+  ObjectPtr* to_no_code() {
+    return reinterpret_cast<ObjectPtr*>(&ptr()->ic_data_array_);
   }
-  RawCode* code_;  // Currently active code. Accessed from generated code.
-  NOT_IN_PRECOMPILED(RawBytecode* bytecode_);
-  NOT_IN_PRECOMPILED(RawCode* unoptimized_code_);  // Unoptimized code, keep it
-                                                   // after optimization.
+  CodePtr code_;  // Currently active code. Accessed from generated code.
+  NOT_IN_PRECOMPILED(BytecodePtr bytecode_);
+  NOT_IN_PRECOMPILED(CodePtr unoptimized_code_);  // Unoptimized code, keep it
+                                                  // after optimization.
 #if defined(DART_PRECOMPILED_RUNTIME)
-  VISIT_TO(RawObject*, code_);
+  VISIT_TO(ObjectPtr, code_);
 #else
-  VISIT_TO(RawObject*, unoptimized_code_);
+  VISIT_TO(ObjectPtr, unoptimized_code_);
 #endif
 
   NOT_IN_PRECOMPILED(TokenPosition token_pos_);
@@ -1130,7 +1051,7 @@
       PackedNumOptionalParameters;
   static_assert(PackedNumOptionalParameters::kNextBit <=
                     kBitsPerWord * sizeof(decltype(packed_fields_)),
-                "RawFunction::packed_fields_ bitfields don't align.");
+                "FunctionLayout::packed_fields_ bitfields don't align.");
 
 #define JIT_FUNCTION_COUNTERS(F)                                               \
   F(intptr_t, int32_t, usage_counter)                                          \
@@ -1154,61 +1075,61 @@
   NOT_IN_PRECOMPILED(UnboxedParameterBitmap unboxed_parameters_info_);
 };
 
-class RawClosureData : public RawObject {
+class ClosureDataLayout : public ObjectLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(ClosureData);
 
-  VISIT_FROM(RawObject*, context_scope_);
-  RawContextScope* context_scope_;
-  RawFunction* parent_function_;  // Enclosing function of this local function.
-  RawType* signature_type_;
-  RawInstance* closure_;  // Closure object for static implicit closures.
-  VISIT_TO(RawObject*, closure_);
+  VISIT_FROM(ObjectPtr, context_scope_);
+  ContextScopePtr context_scope_;
+  FunctionPtr parent_function_;  // Enclosing function of this local function.
+  TypePtr signature_type_;
+  InstancePtr closure_;  // Closure object for static implicit closures.
+  VISIT_TO(ObjectPtr, closure_);
 
   friend class Function;
 };
 
-class RawSignatureData : public RawObject {
+class SignatureDataLayout : public ObjectLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(SignatureData);
 
-  VISIT_FROM(RawObject*, parent_function_);
-  RawFunction* parent_function_;  // Enclosing function of this sig. function.
-  RawType* signature_type_;
-  VISIT_TO(RawObject*, signature_type_);
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(ObjectPtr, parent_function_);
+  FunctionPtr parent_function_;  // Enclosing function of this sig. function.
+  TypePtr signature_type_;
+  VISIT_TO(ObjectPtr, signature_type_);
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class Function;
 };
 
-class RawRedirectionData : public RawObject {
+class RedirectionDataLayout : public ObjectLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(RedirectionData);
 
-  VISIT_FROM(RawObject*, type_);
-  RawType* type_;
-  RawString* identifier_;
-  RawFunction* target_;
-  VISIT_TO(RawObject*, target_);
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(ObjectPtr, type_);
+  TypePtr type_;
+  StringPtr identifier_;
+  FunctionPtr target_;
+  VISIT_TO(ObjectPtr, target_);
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
-class RawFfiTrampolineData : public RawObject {
+class FfiTrampolineDataLayout : public ObjectLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(FfiTrampolineData);
 
-  VISIT_FROM(RawObject*, signature_type_);
-  RawType* signature_type_;
-  RawFunction* c_signature_;
+  VISIT_FROM(ObjectPtr, signature_type_);
+  TypePtr signature_type_;
+  FunctionPtr c_signature_;
 
   // Target Dart method for callbacks, otherwise null.
-  RawFunction* callback_target_;
+  FunctionPtr callback_target_;
 
   // For callbacks, value to return if Dart target throws an exception.
-  RawInstance* callback_exceptional_return_;
+  InstancePtr callback_exceptional_return_;
 
-  VISIT_TO(RawObject*, callback_exceptional_return_);
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_TO(ObjectPtr, callback_exceptional_return_);
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // Callback id for callbacks.
   //
@@ -1222,29 +1143,29 @@
   uint32_t callback_id_;
 };
 
-class RawField : public RawObject {
+class FieldLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Field);
 
-  VISIT_FROM(RawObject*, name_);
-  RawString* name_;
-  RawObject* owner_;  // Class or patch class or mixin class
-                      // where this field is defined or original field.
-  RawAbstractType* type_;
-  RawFunction* initializer_function_;  // Static initializer function.
+  VISIT_FROM(ObjectPtr, name_);
+  StringPtr name_;
+  ObjectPtr owner_;  // Class or patch class or mixin class
+                     // where this field is defined or original field.
+  AbstractTypePtr type_;
+  FunctionPtr initializer_function_;  // Static initializer function.
   // When generating APPJIT snapshots after running the application it is
   // necessary to save the initial value of static fields so that we can
   // restore the value back to the original initial value.
-  NOT_IN_PRECOMPILED(RawInstance* saved_initial_value_);  // Saved initial value
-  RawSmi* guarded_list_length_;
-  RawArray* dependent_code_;
-  RawObject** to_snapshot(Snapshot::Kind kind) {
+  NOT_IN_PRECOMPILED(InstancePtr saved_initial_value_);  // Saved initial value
+  SmiPtr guarded_list_length_;
+  ArrayPtr dependent_code_;
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFull:
-        return reinterpret_cast<RawObject**>(&ptr()->guarded_list_length_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->guarded_list_length_);
       case Snapshot::kFullJIT:
-        return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->dependent_code_);
       case Snapshot::kFullAOT:
-        return reinterpret_cast<RawObject**>(&ptr()->initializer_function_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->initializer_function_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
@@ -1254,10 +1175,10 @@
     return NULL;
   }
 #if defined(DART_PRECOMPILED_RUNTIME)
-  VISIT_TO(RawObject*, dependent_code_);
+  VISIT_TO(ObjectPtr, dependent_code_);
 #else
-  RawSubtypeTestCache* type_test_cache_;  // For type test in implicit setter.
-  VISIT_TO(RawObject*, type_test_cache_);
+  SubtypeTestCachePtr type_test_cache_;  // For type test in implicit setter.
+  VISIT_TO(ObjectPtr, type_test_cache_);
 #endif
   TokenPosition token_pos_;
   TokenPosition end_token_pos_;
@@ -1295,7 +1216,7 @@
   friend class CidRewriteVisitor;
 };
 
-class RawScript : public RawObject {
+class ScriptLayout : public ObjectLayout {
  public:
   enum {
     kLazyLookupSourceAndLineStartsPos = 0,
@@ -1305,22 +1226,22 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Script);
 
-  VISIT_FROM(RawObject*, url_);
-  RawString* url_;
-  RawString* resolved_url_;
-  RawArray* compile_time_constants_;
-  RawTypedData* line_starts_;
-  RawArray* debug_positions_;
-  RawKernelProgramInfo* kernel_program_info_;
-  RawString* source_;
-  VISIT_TO(RawObject*, source_);
-  RawObject** to_snapshot(Snapshot::Kind kind) {
+  VISIT_FROM(ObjectPtr, url_);
+  StringPtr url_;
+  StringPtr resolved_url_;
+  ArrayPtr compile_time_constants_;
+  TypedDataPtr line_starts_;
+  ArrayPtr debug_positions_;
+  KernelProgramInfoPtr kernel_program_info_;
+  StringPtr source_;
+  VISIT_TO(ObjectPtr, source_);
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
-        return reinterpret_cast<RawObject**>(&ptr()->url_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->url_);
       case Snapshot::kFull:
       case Snapshot::kFullJIT:
-        return reinterpret_cast<RawObject**>(&ptr()->kernel_program_info_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->kernel_program_info_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
@@ -1344,7 +1265,7 @@
   int64_t load_timestamp_;
 };
 
-class RawLibrary : public RawObject {
+class LibraryLayout : public ObjectLayout {
   enum LibraryState {
     kAllocated,       // Initial state.
     kLoadRequested,   // Compiler or script requested load of library.
@@ -1374,24 +1295,24 @@
 
   RAW_HEAP_OBJECT_IMPLEMENTATION(Library);
 
-  VISIT_FROM(RawObject*, name_);
-  RawString* name_;
-  RawString* url_;
-  RawString* private_key_;
-  RawArray* dictionary_;              // Top-level names in this library.
-  RawGrowableObjectArray* metadata_;  // Metadata on classes, methods etc.
-  RawClass* toplevel_class_;          // Class containing top-level elements.
-  RawGrowableObjectArray* used_scripts_;
-  RawArray* imports_;        // List of Namespaces imported without prefix.
-  RawArray* exports_;        // List of re-exported Namespaces.
-  RawExternalTypedData* kernel_data_;
-  RawObject** to_snapshot(Snapshot::Kind kind) {
+  VISIT_FROM(ObjectPtr, name_);
+  StringPtr name_;
+  StringPtr url_;
+  StringPtr private_key_;
+  ArrayPtr dictionary_;              // Top-level names in this library.
+  GrowableObjectArrayPtr metadata_;  // Metadata on classes, methods etc.
+  ClassPtr toplevel_class_;          // Class containing top-level elements.
+  GrowableObjectArrayPtr used_scripts_;
+  ArrayPtr imports_;  // List of Namespaces imported without prefix.
+  ArrayPtr exports_;  // List of re-exported Namespaces.
+  ExternalTypedDataPtr kernel_data_;
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
-        return reinterpret_cast<RawObject**>(&ptr()->exports_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->exports_);
       case Snapshot::kFull:
       case Snapshot::kFullJIT:
-        return reinterpret_cast<RawObject**>(&ptr()->kernel_data_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->kernel_data_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
@@ -1400,10 +1321,10 @@
     UNREACHABLE();
     return NULL;
   }
-  RawArray* resolved_names_;  // Cache of resolved names in library scope.
-  RawArray* exported_names_;  // Cache of exported names by library.
-  RawArray* loaded_scripts_;  // Array of scripts loaded in this library.
-  VISIT_TO(RawObject*, loaded_scripts_);
+  ArrayPtr resolved_names_;  // Cache of resolved names in library scope.
+  ArrayPtr exported_names_;  // Cache of exported names by library.
+  ArrayPtr loaded_scripts_;  // Array of scripts loaded in this library.
+  VISIT_TO(ObjectPtr, loaded_scripts_);
 
   Dart_NativeEntryResolver native_entry_resolver_;  // Resolves natives.
   Dart_NativeEntrySymbol native_entry_symbol_resolver_;
@@ -1422,60 +1343,60 @@
   friend class Isolate;
 };
 
-class RawNamespace : public RawObject {
+class NamespaceLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Namespace);
 
-  VISIT_FROM(RawObject*, library_);
-  RawLibrary* library_;       // library with name dictionary.
-  RawArray* show_names_;      // list of names that are exported.
-  RawArray* hide_names_;      // blacklist of names that are not exported.
-  RawField* metadata_field_;  // remembers the token pos of metadata if any,
-                              // and the metadata values if computed.
-  VISIT_TO(RawObject*, metadata_field_);
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(ObjectPtr, library_);
+  LibraryPtr library_;       // library with name dictionary.
+  ArrayPtr show_names_;      // list of names that are exported.
+  ArrayPtr hide_names_;      // blacklist of names that are not exported.
+  FieldPtr metadata_field_;  // remembers the token pos of metadata if any,
+                             // and the metadata values if computed.
+  VISIT_TO(ObjectPtr, metadata_field_);
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
-class RawKernelProgramInfo : public RawObject {
+class KernelProgramInfoLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(KernelProgramInfo);
 
-  VISIT_FROM(RawObject*, string_offsets_);
-  RawTypedData* string_offsets_;
-  RawExternalTypedData* string_data_;
-  RawTypedData* canonical_names_;
-  RawExternalTypedData* metadata_payloads_;
-  RawExternalTypedData* metadata_mappings_;
-  RawArray* scripts_;
-  RawArray* constants_;
-  RawArray* bytecode_component_;
-  RawGrowableObjectArray* potential_natives_;
-  RawGrowableObjectArray* potential_pragma_functions_;
-  RawExternalTypedData* constants_table_;
-  RawArray* libraries_cache_;
-  RawArray* classes_cache_;
-  RawObject* retained_kernel_blob_;
-  VISIT_TO(RawObject*, retained_kernel_blob_);
+  VISIT_FROM(ObjectPtr, string_offsets_);
+  TypedDataPtr string_offsets_;
+  ExternalTypedDataPtr string_data_;
+  TypedDataPtr canonical_names_;
+  ExternalTypedDataPtr metadata_payloads_;
+  ExternalTypedDataPtr metadata_mappings_;
+  ArrayPtr scripts_;
+  ArrayPtr constants_;
+  ArrayPtr bytecode_component_;
+  GrowableObjectArrayPtr potential_natives_;
+  GrowableObjectArrayPtr potential_pragma_functions_;
+  ExternalTypedDataPtr constants_table_;
+  ArrayPtr libraries_cache_;
+  ArrayPtr classes_cache_;
+  ObjectPtr retained_kernel_blob_;
+  VISIT_TO(ObjectPtr, retained_kernel_blob_);
 
   uint32_t kernel_binary_version_;
 
-  RawObject** to_snapshot(Snapshot::Kind kind) {
-    return reinterpret_cast<RawObject**>(&ptr()->constants_table_);
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
+    return reinterpret_cast<ObjectPtr*>(&ptr()->constants_table_);
   }
 };
 
-class RawWeakSerializationReference : public RawObject {
+class WeakSerializationReferenceLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakSerializationReference);
 
 #if defined(DART_PRECOMPILED_RUNTIME)
   VISIT_NOTHING();
   classid_t cid_;
 #else
-  VISIT_FROM(RawObject*, target_);
-  RawObject* target_;
-  VISIT_TO(RawObject*, target_);
+  VISIT_FROM(ObjectPtr, target_);
+  ObjectPtr target_;
+  VISIT_TO(ObjectPtr, target_);
 #endif
 };
 
-class RawCode : public RawObject {
+class CodeLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Code);
 
   // When in the precompiled runtime, there is no disabling of Code objects
@@ -1524,39 +1445,39 @@
   uword unchecked_entry_point_;              // Accessed from generated code.
   uword monomorphic_unchecked_entry_point_;  // Accessed from generated code.
 
-  VISIT_FROM(RawObject*, object_pool_);
-  RawObjectPool* object_pool_;     // Accessed from generated code.
-  RawInstructions* instructions_;  // Accessed from generated code.
+  VISIT_FROM(ObjectPtr, object_pool_);
+  ObjectPoolPtr object_pool_;     // Accessed from generated code.
+  InstructionsPtr instructions_;  // Accessed from generated code.
   // If owner_ is Function::null() the owner is a regular stub.
   // If owner_ is a Class the owner is the allocation stub for that class.
   // Else, owner_ is a regular Dart Function.
-  RawObject* owner_;  // Function, Null, or a Class.
-  RawExceptionHandlers* exception_handlers_;
-  RawPcDescriptors* pc_descriptors_;
+  ObjectPtr owner_;  // Function, Null, or a Class.
+  ExceptionHandlersPtr exception_handlers_;
+  PcDescriptorsPtr pc_descriptors_;
   // If FLAG_precompiled_mode, then this field contains
-  //   RawTypedData* catch_entry_moves_maps
+  //   TypedDataPtr catch_entry_moves_maps
   // Otherwise, it is
-  //   RawSmi* num_variables
-  RawObject* catch_entry_;
-  RawCompressedStackMaps* compressed_stackmaps_;
-  RawArray* inlined_id_to_function_;
-  RawCodeSourceMap* code_source_map_;
-  NOT_IN_PRECOMPILED(RawInstructions* active_instructions_);
-  NOT_IN_PRECOMPILED(RawArray* deopt_info_array_);
+  //   SmiPtr num_variables
+  ObjectPtr catch_entry_;
+  CompressedStackMapsPtr compressed_stackmaps_;
+  ArrayPtr inlined_id_to_function_;
+  CodeSourceMapPtr code_source_map_;
+  NOT_IN_PRECOMPILED(InstructionsPtr active_instructions_);
+  NOT_IN_PRECOMPILED(ArrayPtr deopt_info_array_);
   // (code-offset, function, code) triples.
-  NOT_IN_PRECOMPILED(RawArray* static_calls_target_table_);
+  NOT_IN_PRECOMPILED(ArrayPtr static_calls_target_table_);
   // If return_address_metadata_ is a Smi, it is the offset to the prologue.
   // Else, return_address_metadata_ is null.
-  NOT_IN_PRODUCT(RawObject* return_address_metadata_);
-  NOT_IN_PRODUCT(RawLocalVarDescriptors* var_descriptors_);
-  NOT_IN_PRODUCT(RawArray* comments_);
+  NOT_IN_PRODUCT(ObjectPtr return_address_metadata_);
+  NOT_IN_PRODUCT(LocalVarDescriptorsPtr var_descriptors_);
+  NOT_IN_PRODUCT(ArrayPtr comments_);
 
 #if !defined(PRODUCT)
-  VISIT_TO(RawObject*, comments_);
+  VISIT_TO(ObjectPtr, comments_);
 #elif defined(DART_PRECOMPILED_RUNTIME)
-  VISIT_TO(RawObject*, code_source_map_);
+  VISIT_TO(ObjectPtr, code_source_map_);
 #else
-  VISIT_TO(RawObject*, static_calls_target_table_);
+  VISIT_TO(ObjectPtr, static_calls_target_table_);
 #endif
 
   // Compilation timestamp.
@@ -1577,7 +1498,7 @@
   int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); }
   const int32_t* data() const { OPEN_ARRAY_START(int32_t, int32_t); }
 
-  static bool ContainsPC(const RawObject* raw_obj, uword pc);
+  static bool ContainsPC(const ObjectPtr raw_obj, uword pc);
 
   friend class Function;
   template <bool>
@@ -1588,47 +1509,47 @@
   friend class CallSiteResetter;
 };
 
-class RawBytecode : public RawObject {
+class BytecodeLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Bytecode);
 
   uword instructions_;
   intptr_t instructions_size_;
 
-  VISIT_FROM(RawObject*, object_pool_);
-  RawObjectPool* object_pool_;
-  RawFunction* function_;
-  RawArray* closures_;
-  RawExceptionHandlers* exception_handlers_;
-  RawPcDescriptors* pc_descriptors_;
-  NOT_IN_PRODUCT(RawLocalVarDescriptors* var_descriptors_);
+  VISIT_FROM(ObjectPtr, object_pool_);
+  ObjectPoolPtr object_pool_;
+  FunctionPtr function_;
+  ArrayPtr closures_;
+  ExceptionHandlersPtr exception_handlers_;
+  PcDescriptorsPtr pc_descriptors_;
+  NOT_IN_PRODUCT(LocalVarDescriptorsPtr var_descriptors_);
 #if defined(PRODUCT)
-  VISIT_TO(RawObject*, pc_descriptors_);
+  VISIT_TO(ObjectPtr, pc_descriptors_);
 #else
-  VISIT_TO(RawObject*, var_descriptors_);
+  VISIT_TO(ObjectPtr, var_descriptors_);
 #endif
 
-  RawObject** to_snapshot(Snapshot::Kind kind) {
-    return reinterpret_cast<RawObject**>(&ptr()->pc_descriptors_);
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
+    return reinterpret_cast<ObjectPtr*>(&ptr()->pc_descriptors_);
   }
 
   int32_t instructions_binary_offset_;
   int32_t source_positions_binary_offset_;
   int32_t local_variables_binary_offset_;
 
-  static bool ContainsPC(RawObject* raw_obj, uword pc);
+  static bool ContainsPC(ObjectPtr raw_obj, uword pc);
 
   friend class Function;
   friend class StackFrame;
 };
 
-class RawObjectPool : public RawObject {
+class ObjectPoolLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ObjectPool);
 
   intptr_t length_;
 
   struct Entry {
     union {
-      RawObject* raw_obj_;
+      ObjectPtr raw_obj_;
       uword raw_value_;
     };
   };
@@ -1646,7 +1567,7 @@
   friend class CodeSerializationCluster;
 };
 
-class RawInstructions : public RawObject {
+class InstructionsLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions);
   VISIT_NOTHING();
 
@@ -1660,10 +1581,10 @@
   // Private helper function used while visiting stack frames. The
   // code which iterates over dart frames is also called during GC and
   // is not allowed to create handles.
-  static bool ContainsPC(const RawInstructions* raw_instr, uword pc);
+  static bool ContainsPC(const InstructionsPtr raw_instr, uword pc);
 
-  friend class RawCode;
-  friend class RawFunction;
+  friend class CodeLayout;
+  friend class FunctionLayout;
   friend class Code;
   friend class StackFrame;
   template <bool>
@@ -1677,7 +1598,7 @@
 
 // Used only to provide memory accounting for the bare instruction payloads
 // we serialize, since they are no longer part of RawInstructions objects.
-class RawInstructionsSection : public RawObject {
+class InstructionsSectionLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(InstructionsSection);
   VISIT_NOTHING();
 
@@ -1688,7 +1609,7 @@
   uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 };
 
-class RawPcDescriptors : public RawObject {
+class PcDescriptorsLayout : public ObjectLayout {
  public:
 // The macro argument V is passed two arguments, the raw name of the enum value
 // and the initialization expression used within the enum definition.  The uses
@@ -1795,7 +1716,7 @@
 
 // CodeSourceMap encodes a mapping from code PC ranges to source token
 // positions and the stack of inlined functions.
-class RawCodeSourceMap : public RawObject {
+class CodeSourceMapLayout : public ObjectLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(CodeSourceMap);
   VISIT_NOTHING();
@@ -1815,7 +1736,7 @@
 // RawCompressedStackMaps is a compressed representation of the stack maps
 // for certain PC offsets into a set of instructions, where a stack map is a bit
 // map that marks each live object index starting from the base of the frame.
-class RawCompressedStackMaps : public RawObject {
+class CompressedStackMapsLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(CompressedStackMaps);
   VISIT_NOTHING();
 
@@ -1886,7 +1807,7 @@
   friend class ImageWriter;
 };
 
-class RawLocalVarDescriptors : public RawObject {
+class LocalVarDescriptorsLayout : public ObjectLayout {
  public:
   enum VarInfoKind {
     kStackVar = 1,
@@ -1937,13 +1858,13 @@
   // platforms.
   uword num_entries_;
 
-  VISIT_FROM(RawObject*, names()[0]);
-  RawString** names() {
+  VISIT_FROM(ObjectPtr, names()[0]);
+  StringPtr* names() {
     // Array of [num_entries_] variable names.
-    OPEN_ARRAY_START(RawString*, RawString*);
+    OPEN_ARRAY_START(StringPtr, StringPtr);
   }
-  RawString** nameAddrAt(intptr_t i) { return &(ptr()->names()[i]); }
-  VISIT_TO_LENGTH(RawObject*, nameAddrAt(length - 1));
+  StringPtr* nameAddrAt(intptr_t i) { return &(ptr()->names()[i]); }
+  VISIT_TO_LENGTH(ObjectPtr, nameAddrAt(length - 1));
 
   // Variable info with [num_entries_] entries.
   VarInfo* data() {
@@ -1953,7 +1874,7 @@
   friend class Object;
 };
 
-class RawExceptionHandlers : public RawObject {
+class ExceptionHandlersLayout : public ObjectLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
 
@@ -1962,9 +1883,9 @@
 
   // Array with [num_entries_] entries. Each entry is an array of all handled
   // exception types.
-  VISIT_FROM(RawObject*, handled_types_data_)
-  RawArray* handled_types_data_;
-  VISIT_TO_LENGTH(RawObject*, &ptr()->handled_types_data_);
+  VISIT_FROM(ObjectPtr, handled_types_data_)
+  ArrayPtr handled_types_data_;
+  VISIT_TO_LENGTH(ObjectPtr, &ptr()->handled_types_data_);
 
   // Exception handler info of length [num_entries_].
   const ExceptionHandlerInfo* data() const {
@@ -1977,138 +1898,138 @@
   friend class Object;
 };
 
-class RawContext : public RawObject {
+class ContextLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Context);
 
   int32_t num_variables_;
 
-  VISIT_FROM(RawObject*, parent_);
-  RawContext* parent_;
+  VISIT_FROM(ObjectPtr, parent_);
+  ContextPtr parent_;
 
   // Variable length data follows here.
-  RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
-  RawObject* const* data() const { OPEN_ARRAY_START(RawObject*, RawObject*); }
-  VISIT_TO_LENGTH(RawObject*, &ptr()->data()[length - 1]);
+  ObjectPtr* data() { OPEN_ARRAY_START(ObjectPtr, ObjectPtr); }
+  ObjectPtr const* data() const { OPEN_ARRAY_START(ObjectPtr, ObjectPtr); }
+  VISIT_TO_LENGTH(ObjectPtr, &ptr()->data()[length - 1]);
 
   friend class Object;
   friend class SnapshotReader;
 };
 
-class RawContextScope : public RawObject {
+class ContextScopeLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope);
 
   // TODO(iposva): Switch to conventional enum offset based structure to avoid
   // alignment mishaps.
   struct VariableDesc {
-    RawSmi* declaration_token_pos;
-    RawSmi* token_pos;
-    RawString* name;
-    RawSmi* flags;
+    SmiPtr declaration_token_pos;
+    SmiPtr token_pos;
+    StringPtr name;
+    SmiPtr flags;
     static constexpr intptr_t kIsFinal = 0x1;
     static constexpr intptr_t kIsConst = 0x2;
     static constexpr intptr_t kIsLate = 0x4;
-    RawSmi* late_init_offset;
+    SmiPtr late_init_offset;
     union {
-      RawAbstractType* type;
-      RawInstance* value;  // iff is_const is true
+      AbstractTypePtr type;
+      InstancePtr value;  // iff is_const is true
     };
-    RawSmi* context_index;
-    RawSmi* context_level;
+    SmiPtr context_index;
+    SmiPtr context_level;
   };
 
   int32_t num_variables_;
   bool is_implicit_;  // true, if this context scope is for an implicit closure.
 
-  RawObject** from() {
+  ObjectPtr* from() {
     VariableDesc* begin = const_cast<VariableDesc*>(ptr()->VariableDescAddr(0));
-    return reinterpret_cast<RawObject**>(begin);
+    return reinterpret_cast<ObjectPtr*>(begin);
   }
   // Variable length data follows here.
-  RawObject* const* data() const { OPEN_ARRAY_START(RawObject*, RawObject*); }
+  ObjectPtr const* data() const { OPEN_ARRAY_START(ObjectPtr, ObjectPtr); }
   const VariableDesc* VariableDescAddr(intptr_t index) const {
     ASSERT((index >= 0) && (index < num_variables_ + 1));
     // data() points to the first component of the first descriptor.
     return &(reinterpret_cast<const VariableDesc*>(data())[index]);
   }
-  RawObject** to(intptr_t num_vars) {
+  ObjectPtr* to(intptr_t num_vars) {
     uword end = reinterpret_cast<uword>(ptr()->VariableDescAddr(num_vars));
     // 'end' is the address just beyond the last descriptor, so step back.
-    return reinterpret_cast<RawObject**>(end - kWordSize);
+    return reinterpret_cast<ObjectPtr*>(end - kWordSize);
   }
-  RawObject** to_snapshot(Snapshot::Kind kind, intptr_t num_vars) {
+  ObjectPtr* to_snapshot(Snapshot::Kind kind, intptr_t num_vars) {
     return to(num_vars);
   }
 
   friend class Object;
-  friend class RawClosureData;
+  friend class ClosureDataLayout;
   friend class SnapshotReader;
 };
 
-class RawParameterTypeCheck : public RawObject {
+class ParameterTypeCheckLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ParameterTypeCheck);
   intptr_t index_;
-  VISIT_FROM(RawObject*, param_);
-  RawAbstractType* param_;
-  RawAbstractType* type_or_bound_;
-  RawString* name_;
-  RawSubtypeTestCache* cache_;
-  VISIT_TO(RawObject*, cache_);
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(ObjectPtr, param_);
+  AbstractTypePtr param_;
+  AbstractTypePtr type_or_bound_;
+  StringPtr name_;
+  SubtypeTestCachePtr cache_;
+  VISIT_TO(ObjectPtr, cache_);
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
-class RawSingleTargetCache : public RawObject {
+class SingleTargetCacheLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache);
-  VISIT_FROM(RawObject*, target_);
-  RawCode* target_;
-  VISIT_TO(RawObject*, target_);
+  VISIT_FROM(ObjectPtr, target_);
+  CodePtr target_;
+  VISIT_TO(ObjectPtr, target_);
   uword entry_point_;
   classid_t lower_limit_;
   classid_t upper_limit_;
 };
 
-class RawUnlinkedCall : public RawObject {
+class UnlinkedCallLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UnlinkedCall);
-  VISIT_FROM(RawObject*, target_name_);
-  RawString* target_name_;
-  RawArray* args_descriptor_;
-  VISIT_TO(RawObject*, args_descriptor_);
+  VISIT_FROM(ObjectPtr, target_name_);
+  StringPtr target_name_;
+  ArrayPtr args_descriptor_;
+  VISIT_TO(ObjectPtr, args_descriptor_);
   bool can_patch_to_monomorphic_;
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
-class RawMonomorphicSmiableCall : public RawObject {
+class MonomorphicSmiableCallLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MonomorphicSmiableCall);
-  VISIT_FROM(RawObject*, target_);
-  RawCode* target_;  // Entrypoint PC in bare mode, Code in non-bare mode.
-  VISIT_TO(RawObject*, target_);
+  VISIT_FROM(ObjectPtr, target_);
+  CodePtr target_;  // Entrypoint PC in bare mode, Code in non-bare mode.
+  VISIT_TO(ObjectPtr, target_);
   uword expected_cid_;
   uword entrypoint_;
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 // Abstract base class for RawICData/RawMegamorphicCache
-class RawCallSiteData : public RawObject {
+class CallSiteDataLayout : public ObjectLayout {
  protected:
-  RawString* target_name_;     // Name of target function.
+  StringPtr target_name_;  // Name of target function.
   // arg_descriptor in RawICData and in RawMegamorphicCache should be
   // in the same position so that NoSuchMethod can access it.
-  RawArray* args_descriptor_;  // Arguments descriptor.
+  ArrayPtr args_descriptor_;  // Arguments descriptor.
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(CallSiteData)
 };
 
-class RawICData : public RawCallSiteData {
+class ICDataLayout : public CallSiteDataLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ICData);
-  VISIT_FROM(RawObject*, target_name_);
-  RawArray* entries_;  // Contains class-ids, target and count.
+  VISIT_FROM(ObjectPtr, target_name_);
+  ArrayPtr entries_;  // Contains class-ids, target and count.
   // Static type of the receiver, if instance call and available.
-  NOT_IN_PRECOMPILED(RawAbstractType* receivers_static_type_);
-  RawObject* owner_;  // Parent/calling function or original IC of cloned IC.
-  VISIT_TO(RawObject*, owner_);
-  RawObject** to_snapshot(Snapshot::Kind kind) {
+  NOT_IN_PRECOMPILED(AbstractTypePtr receivers_static_type_);
+  ObjectPtr owner_;  // Parent/calling function or original IC of cloned IC.
+  VISIT_TO(ObjectPtr, owner_);
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
-        return reinterpret_cast<RawObject**>(&ptr()->entries_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->entries_);
       case Snapshot::kFull:
       case Snapshot::kFullJIT:
         return to();
@@ -2124,90 +2045,90 @@
   uint32_t state_bits_;  // Number of arguments tested in IC, deopt reasons.
 };
 
-class RawMegamorphicCache : public RawCallSiteData {
+class MegamorphicCacheLayout : public CallSiteDataLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache);
-  VISIT_FROM(RawObject*, target_name_)
-  RawArray* buckets_;
-  RawSmi* mask_;
-  VISIT_TO(RawObject*, mask_)
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(ObjectPtr, target_name_)
+  ArrayPtr buckets_;
+  SmiPtr mask_;
+  VISIT_TO(ObjectPtr, mask_)
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   int32_t filled_entry_count_;
 };
 
-class RawSubtypeTestCache : public RawObject {
+class SubtypeTestCacheLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache);
-  VISIT_FROM(RawObject*, cache_);
-  RawArray* cache_;
-  VISIT_TO(RawObject*, cache_);
+  VISIT_FROM(ObjectPtr, cache_);
+  ArrayPtr cache_;
+  VISIT_TO(ObjectPtr, cache_);
 };
 
-class RawError : public RawObject {
+class ErrorLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Error);
 };
 
-class RawApiError : public RawError {
+class ApiErrorLayout : public ErrorLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ApiError);
 
-  VISIT_FROM(RawObject*, message_)
-  RawString* message_;
-  VISIT_TO(RawObject*, message_)
+  VISIT_FROM(ObjectPtr, message_)
+  StringPtr message_;
+  VISIT_TO(ObjectPtr, message_)
 };
 
-class RawLanguageError : public RawError {
+class LanguageErrorLayout : public ErrorLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LanguageError);
 
-  VISIT_FROM(RawObject*, previous_error_)
-  RawError* previous_error_;  // May be null.
-  RawScript* script_;
-  RawString* message_;
-  RawString* formatted_message_;  // Incl. previous error's formatted message.
-  VISIT_TO(RawObject*, formatted_message_)
+  VISIT_FROM(ObjectPtr, previous_error_)
+  ErrorPtr previous_error_;  // May be null.
+  ScriptPtr script_;
+  StringPtr message_;
+  StringPtr formatted_message_;  // Incl. previous error's formatted message.
+  VISIT_TO(ObjectPtr, formatted_message_)
   TokenPosition token_pos_;  // Source position in script_.
   bool report_after_token_;  // Report message at or after the token.
   int8_t kind_;              // Of type Report::Kind.
 
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
-class RawUnhandledException : public RawError {
+class UnhandledExceptionLayout : public ErrorLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UnhandledException);
 
-  VISIT_FROM(RawObject*, exception_)
-  RawInstance* exception_;
-  RawInstance* stacktrace_;
-  VISIT_TO(RawObject*, stacktrace_)
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(ObjectPtr, exception_)
+  InstancePtr exception_;
+  InstancePtr stacktrace_;
+  VISIT_TO(ObjectPtr, stacktrace_)
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
-class RawUnwindError : public RawError {
+class UnwindErrorLayout : public ErrorLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UnwindError);
 
-  VISIT_FROM(RawObject*, message_)
-  RawString* message_;
-  VISIT_TO(RawObject*, message_)
+  VISIT_FROM(ObjectPtr, message_)
+  StringPtr message_;
+  VISIT_TO(ObjectPtr, message_)
   bool is_user_initiated_;
 };
 
-class RawInstance : public RawObject {
+class InstanceLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Instance);
 };
 
-class RawLibraryPrefix : public RawInstance {
+class LibraryPrefixLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix);
 
-  VISIT_FROM(RawObject*, name_)
-  RawString* name_;           // Library prefix name.
-  RawLibrary* importer_;      // Library which declares this prefix.
-  RawArray* imports_;         // Libraries imported with this prefix.
-  VISIT_TO(RawObject*, imports_)
-  RawObject** to_snapshot(Snapshot::Kind kind) {
+  VISIT_FROM(ObjectPtr, name_)
+  StringPtr name_;       // Library prefix name.
+  LibraryPtr importer_;  // Library which declares this prefix.
+  ArrayPtr imports_;     // Libraries imported with this prefix.
+  VISIT_TO(ObjectPtr, imports_)
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFull:
       case Snapshot::kFullJIT:
-        return reinterpret_cast<RawObject**>(&ptr()->imports_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->imports_);
       case Snapshot::kFullAOT:
-        return reinterpret_cast<RawObject**>(&ptr()->importer_);
+        return reinterpret_cast<ObjectPtr*>(&ptr()->importer_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
@@ -2220,33 +2141,33 @@
   bool is_deferred_load_;
 };
 
-class RawTypeArguments : public RawInstance {
+class TypeArgumentsLayout : public InstanceLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments);
 
-  VISIT_FROM(RawObject*, instantiations_)
+  VISIT_FROM(ObjectPtr, instantiations_)
   // The instantiations_ array remains empty for instantiated type arguments.
-  RawArray* instantiations_;  // Of 3-tuple: 2 instantiators, result.
-  RawSmi* length_;
-  RawSmi* hash_;
-  RawSmi* nullability_;
+  ArrayPtr instantiations_;  // Of 3-tuple: 2 instantiators, result.
+  SmiPtr length_;
+  SmiPtr hash_;
+  SmiPtr nullability_;
 
   // Variable length data follows here.
-  RawAbstractType* const* types() const {
-    OPEN_ARRAY_START(RawAbstractType*, RawAbstractType*);
+  AbstractTypePtr const* types() const {
+    OPEN_ARRAY_START(AbstractTypePtr, AbstractTypePtr);
   }
-  RawAbstractType** types() {
-    OPEN_ARRAY_START(RawAbstractType*, RawAbstractType*);
+  AbstractTypePtr* types() {
+    OPEN_ARRAY_START(AbstractTypePtr, AbstractTypePtr);
   }
-  RawObject** to(intptr_t length) {
-    return reinterpret_cast<RawObject**>(&ptr()->types()[length - 1]);
+  ObjectPtr* to(intptr_t length) {
+    return reinterpret_cast<ObjectPtr*>(&ptr()->types()[length - 1]);
   }
 
   friend class Object;
   friend class SnapshotReader;
 };
 
-class RawAbstractType : public RawInstance {
+class AbstractTypeLayout : public InstanceLayout {
  public:
   enum TypeState {
     kAllocated,                // Initial state.
@@ -2257,8 +2178,8 @@
 
  protected:
   uword type_test_stub_entry_point_;  // Accessed from generated code.
-  RawCode* type_test_stub_;  // Must be the last field, since subclasses use it
-                             // in their VISIT_FROM.
+  CodePtr type_test_stub_;  // Must be the last field, since subclasses use it
+                            // in their VISIT_FROM.
 
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(AbstractType);
@@ -2267,39 +2188,39 @@
   friend class StubCode;
 };
 
-class RawType : public RawAbstractType {
+class TypeLayout : public AbstractTypeLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Type);
 
-  VISIT_FROM(RawObject*, type_test_stub_)
-  RawSmi* type_class_id_;
-  RawTypeArguments* arguments_;
-  RawSmi* hash_;
+  VISIT_FROM(ObjectPtr, type_test_stub_)
+  SmiPtr type_class_id_;
+  TypeArgumentsPtr arguments_;
+  SmiPtr hash_;
   // This type object represents a function type if its signature field is a
   // non-null function object.
-  RawFunction* signature_;  // If not null, this type is a function type.
-  VISIT_TO(RawObject*, signature_)
+  FunctionPtr signature_;  // If not null, this type is a function type.
+  VISIT_TO(ObjectPtr, signature_)
   TokenPosition token_pos_;
   int8_t type_state_;
   int8_t nullability_;
 
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class CidRewriteVisitor;
-  friend class RawTypeArguments;
+  friend class TypeArgumentsLayout;
 };
 
-class RawTypeRef : public RawAbstractType {
+class TypeRefLayout : public AbstractTypeLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef);
 
-  VISIT_FROM(RawObject*, type_test_stub_)
-  RawAbstractType* type_;  // The referenced type.
-  VISIT_TO(RawObject*, type_)
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(ObjectPtr, type_test_stub_)
+  AbstractTypePtr type_;  // The referenced type.
+  VISIT_TO(ObjectPtr, type_)
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
-class RawTypeParameter : public RawAbstractType {
+class TypeParameterLayout : public AbstractTypeLayout {
  public:
   enum {
     kFinalizedBit = 0,
@@ -2312,24 +2233,24 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter);
 
-  VISIT_FROM(RawObject*, type_test_stub_)
-  RawString* name_;
-  RawSmi* hash_;
-  RawAbstractType* bound_;  // ObjectType if no explicit bound specified.
-  RawFunction* parameterized_function_;
-  VISIT_TO(RawObject*, parameterized_function_)
+  VISIT_FROM(ObjectPtr, type_test_stub_)
+  StringPtr name_;
+  SmiPtr hash_;
+  AbstractTypePtr bound_;  // ObjectType if no explicit bound specified.
+  FunctionPtr parameterized_function_;
+  VISIT_TO(ObjectPtr, parameterized_function_)
   classid_t parameterized_class_id_;
   TokenPosition token_pos_;
   int16_t index_;
   uint8_t flags_;
   int8_t nullability_;
 
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class CidRewriteVisitor;
 };
 
-class RawClosure : public RawInstance {
+class ClosureLayout : public InstanceLayout {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Closure);
 
@@ -2339,16 +2260,16 @@
   // The following fields are also declared in the Dart source of class
   // _Closure.
   VISIT_FROM(RawCompressed, instantiator_type_arguments_)
-  RawTypeArguments* instantiator_type_arguments_;
-  RawTypeArguments* function_type_arguments_;
-  RawTypeArguments* delayed_type_arguments_;
-  RawFunction* function_;
-  RawContext* context_;
-  RawSmi* hash_;
+  TypeArgumentsPtr instantiator_type_arguments_;
+  TypeArgumentsPtr function_type_arguments_;
+  TypeArgumentsPtr delayed_type_arguments_;
+  FunctionPtr function_;
+  ContextPtr context_;
+  SmiPtr hash_;
 
   VISIT_TO(RawCompressed, hash_)
 
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // Note that instantiator_type_arguments_, function_type_arguments_ and
   // delayed_type_arguments_ are used to instantiate the signature of function_
@@ -2374,19 +2295,19 @@
   // any type arguments passed directly (or NSM will be invoked instead).
 };
 
-class RawNumber : public RawInstance {
+class NumberLayout : public InstanceLayout {
   RAW_OBJECT_IMPLEMENTATION(Number);
 };
 
-class RawInteger : public RawNumber {
+class IntegerLayout : public NumberLayout {
   RAW_OBJECT_IMPLEMENTATION(Integer);
 };
 
-class RawSmi : public RawInteger {
+class SmiLayout : public IntegerLayout {
   RAW_OBJECT_IMPLEMENTATION(Smi);
 };
 
-class RawMint : public RawInteger {
+class MintLayout : public IntegerLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Mint);
   VISIT_NOTHING();
 
@@ -2397,9 +2318,9 @@
   friend class Integer;
   friend class SnapshotReader;
 };
-COMPILE_ASSERT(sizeof(RawMint) == 16);
+COMPILE_ASSERT(sizeof(MintLayout) == 16);
 
-class RawDouble : public RawNumber {
+class DoubleLayout : public NumberLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Double);
   VISIT_NOTHING();
 
@@ -2409,19 +2330,19 @@
   friend class SnapshotReader;
   friend class Class;
 };
-COMPILE_ASSERT(sizeof(RawDouble) == 16);
+COMPILE_ASSERT(sizeof(DoubleLayout) == 16);
 
-class RawString : public RawInstance {
+class StringLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(String);
 
  protected:
-  VISIT_FROM(RawObject*, length_)
-  RawSmi* length_;
+  VISIT_FROM(ObjectPtr, length_)
+  SmiPtr length_;
 #if !defined(HASH_IN_OBJECT_HEADER)
-  RawSmi* hash_;
-  VISIT_TO(RawObject*, hash_)
+  SmiPtr hash_;
+  VISIT_TO(ObjectPtr, hash_)
 #else
-  VISIT_TO(RawObject*, length_)
+  VISIT_TO(ObjectPtr, length_)
 #endif
 
  private:
@@ -2434,7 +2355,7 @@
   friend class ImageWriter;
 };
 
-class RawOneByteString : public RawString {
+class OneByteStringLayout : public StringLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(OneByteString);
   VISIT_NOTHING();
 
@@ -2448,7 +2369,7 @@
   friend class String;
 };
 
-class RawTwoByteString : public RawString {
+class TwoByteStringLayout : public StringLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(TwoByteString);
   VISIT_NOTHING();
 
@@ -2466,7 +2387,7 @@
 //
 // TypedData extends this with a length field, while Pointer extends this with
 // TypeArguments field.
-class RawPointerBase : public RawInstance {
+class PointerBaseLayout : public InstanceLayout {
  protected:
   // The contents of [data_] depends on what concrete subclass is used:
   //
@@ -2486,23 +2407,23 @@
 };
 
 // Abstract base class for RawTypedData/RawExternalTypedData/RawTypedDataView.
-class RawTypedDataBase : public RawPointerBase {
+class TypedDataBaseLayout : public PointerBaseLayout {
  protected:
   // The length of the view in element sizes (obtainable via
   // [TypedDataBase::ElementSizeInBytes]).
-  RawSmi* length_;
+  SmiPtr length_;
 
  private:
-  friend class RawTypedDataView;
+  friend class TypedDataViewLayout;
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypedDataBase);
 };
 
-class RawTypedData : public RawTypedDataBase {
+class TypedDataLayout : public TypedDataBaseLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypedData);
 
  public:
   static intptr_t payload_offset() {
-    return OFFSET_OF_RETURNED_VALUE(RawTypedData, internal_data);
+    return OFFSET_OF_RETURNED_VALUE(TypedDataLayout, internal_data);
   }
 
   // Recompute [data_] pointer to internal data.
@@ -2533,18 +2454,18 @@
   friend class ObjectPool;
   friend class ObjectPoolDeserializationCluster;
   friend class ObjectPoolSerializationCluster;
-  friend class RawObjectPool;
+  friend class ObjectPoolLayout;
   friend class SnapshotReader;
 };
 
 // All _*ArrayView/_ByteDataView classes share the same layout.
-class RawTypedDataView : public RawTypedDataBase {
+class TypedDataViewLayout : public TypedDataBaseLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypedDataView);
 
  public:
   // Recompute [data_] based on internal/external [typed_data_].
   void RecomputeDataField() {
-    const intptr_t offset_in_bytes = ValueFromRawSmi(ptr()->offset_in_bytes_);
+    const intptr_t offset_in_bytes = RawSmiValue(ptr()->offset_in_bytes_);
     uint8_t* payload = ptr()->typed_data_->ptr()->data_;
     ptr()->data_ = payload + offset_in_bytes;
   }
@@ -2556,22 +2477,23 @@
   // [typed_data_] pointer points to the new backing store. The backing store's
   // fields don't need to be valid - only it's address.
   void RecomputeDataFieldForInternalTypedData() {
-    const intptr_t offset_in_bytes = ValueFromRawSmi(ptr()->offset_in_bytes_);
-    uint8_t* payload = reinterpret_cast<uint8_t*>(
-        RawObject::ToAddr(ptr()->typed_data_) + RawTypedData::payload_offset());
+    const intptr_t offset_in_bytes = RawSmiValue(ptr()->offset_in_bytes_);
+    uint8_t* payload =
+        reinterpret_cast<uint8_t*>(ObjectLayout::ToAddr(ptr()->typed_data_) +
+                                   TypedDataLayout::payload_offset());
     ptr()->data_ = payload + offset_in_bytes;
   }
 
   void ValidateInnerPointer() {
-    if (ptr()->typed_data_->GetClassId() == kNullCid) {
+    if (ptr()->typed_data_->ptr()->GetClassId() == kNullCid) {
       // The view object must have gotten just initialized.
       if (ptr()->data_ != nullptr ||
-          ValueFromRawSmi(ptr()->offset_in_bytes_) != 0 ||
-          ValueFromRawSmi(ptr()->length_) != 0) {
+          RawSmiValue(ptr()->offset_in_bytes_) != 0 ||
+          RawSmiValue(ptr()->length_) != 0) {
         FATAL("RawTypedDataView has invalid inner pointer.");
       }
     } else {
-      const intptr_t offset_in_bytes = ValueFromRawSmi(ptr()->offset_in_bytes_);
+      const intptr_t offset_in_bytes = RawSmiValue(ptr()->offset_in_bytes_);
       uint8_t* payload = ptr()->typed_data_->ptr()->data_;
       if ((payload + offset_in_bytes) != ptr()->data_) {
         FATAL("RawTypedDataView has invalid inner pointer.");
@@ -2580,24 +2502,24 @@
   }
 
  protected:
-  VISIT_FROM(RawObject*, length_)
-  RawTypedDataBase* typed_data_;
-  RawSmi* offset_in_bytes_;
-  VISIT_TO(RawObject*, offset_in_bytes_)
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(ObjectPtr, length_)
+  TypedDataBasePtr typed_data_;
+  SmiPtr offset_in_bytes_;
+  VISIT_TO(ObjectPtr, offset_in_bytes_)
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class Api;
   friend class Object;
   friend class ObjectPoolDeserializationCluster;
   friend class ObjectPoolSerializationCluster;
-  friend class RawObjectPool;
+  friend class ObjectPoolLayout;
   friend class GCCompactor;
   template <bool>
   friend class ScavengerVisitorBase;
   friend class SnapshotReader;
 };
 
-class RawExternalOneByteString : public RawString {
+class ExternalOneByteStringLayout : public StringLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalOneByteString);
 
   const uint8_t* external_data_;
@@ -2606,7 +2528,7 @@
   friend class String;
 };
 
-class RawExternalTwoByteString : public RawString {
+class ExternalTwoByteStringLayout : public StringLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString);
 
   const uint16_t* external_data_;
@@ -2615,7 +2537,7 @@
   friend class String;
 };
 
-class RawBool : public RawInstance {
+class BoolLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Bool);
   VISIT_NOTHING();
 
@@ -2624,15 +2546,15 @@
   friend class Object;
 };
 
-class RawArray : public RawInstance {
+class ArrayLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Array);
 
   VISIT_FROM(RawCompressed, type_arguments_)
-  RawTypeArguments* type_arguments_;
-  RawSmi* length_;
+  TypeArgumentsPtr type_arguments_;
+  SmiPtr length_;
   // Variable length data follows here.
-  RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
-  RawObject* const* data() const { OPEN_ARRAY_START(RawObject*, RawObject*); }
+  ObjectPtr* data() { OPEN_ARRAY_START(ObjectPtr, ObjectPtr); }
+  ObjectPtr const* data() const { OPEN_ARRAY_START(ObjectPtr, ObjectPtr); }
   VISIT_TO_LENGTH(RawCompressed, &ptr()->data()[length - 1])
 
   friend class LinkedHashMapSerializationCluster;
@@ -2640,12 +2562,12 @@
   friend class CodeSerializationCluster;
   friend class CodeDeserializationCluster;
   friend class Deserializer;
-  friend class RawCode;
-  friend class RawImmutableArray;
+  friend class CodeLayout;
+  friend class ImmutableArrayLayout;
   friend class SnapshotReader;
   friend class GrowableObjectArray;
   friend class LinkedHashMap;
-  friend class RawLinkedHashMap;
+  friend class LinkedHashMapLayout;
   friend class Object;
   friend class ICData;            // For high performance access.
   friend class SubtypeTestCache;  // For high performance access.
@@ -2653,41 +2575,41 @@
   friend class HeapPage;
 };
 
-class RawImmutableArray : public RawArray {
+class ImmutableArrayLayout : public ArrayLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ImmutableArray);
 
   friend class SnapshotReader;
 };
 
-class RawGrowableObjectArray : public RawInstance {
+class GrowableObjectArrayLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray);
 
   VISIT_FROM(RawCompressed, type_arguments_)
-  RawTypeArguments* type_arguments_;
-  RawSmi* length_;
-  RawArray* data_;
+  TypeArgumentsPtr type_arguments_;
+  SmiPtr length_;
+  ArrayPtr data_;
   VISIT_TO(RawCompressed, data_)
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class SnapshotReader;
 };
 
-class RawLinkedHashMap : public RawInstance {
+class LinkedHashMapLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LinkedHashMap);
 
   VISIT_FROM(RawCompressed, type_arguments_)
-  RawTypeArguments* type_arguments_;
-  RawTypedData* index_;
-  RawSmi* hash_mask_;
-  RawArray* data_;
-  RawSmi* used_data_;
-  RawSmi* deleted_keys_;
+  TypeArgumentsPtr type_arguments_;
+  TypedDataPtr index_;
+  SmiPtr hash_mask_;
+  ArrayPtr data_;
+  SmiPtr used_data_;
+  SmiPtr deleted_keys_;
   VISIT_TO(RawCompressed, deleted_keys_)
 
   friend class SnapshotReader;
 };
 
-class RawFloat32x4 : public RawInstance {
+class Float32x4Layout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Float32x4);
   VISIT_NOTHING();
 
@@ -2702,9 +2624,9 @@
   float z() const { return value_[2]; }
   float w() const { return value_[3]; }
 };
-COMPILE_ASSERT(sizeof(RawFloat32x4) == 24);
+COMPILE_ASSERT(sizeof(Float32x4Layout) == 24);
 
-class RawInt32x4 : public RawInstance {
+class Int32x4Layout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Int32x4);
   VISIT_NOTHING();
 
@@ -2718,9 +2640,9 @@
   int32_t z() const { return value_[2]; }
   int32_t w() const { return value_[3]; }
 };
-COMPILE_ASSERT(sizeof(RawInt32x4) == 24);
+COMPILE_ASSERT(sizeof(Int32x4Layout) == 24);
 
-class RawFloat64x2 : public RawInstance {
+class Float64x2Layout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Float64x2);
   VISIT_NOTHING();
 
@@ -2733,7 +2655,7 @@
   double x() const { return value_[0]; }
   double y() const { return value_[1]; }
 };
-COMPILE_ASSERT(sizeof(RawFloat64x2) == 24);
+COMPILE_ASSERT(sizeof(Float64x2Layout) == 24);
 
 // Define an aliases for intptr_t.
 #if defined(ARCH_IS_32_BIT)
@@ -2746,27 +2668,27 @@
 #error Architecture is not 32-bit or 64-bit.
 #endif  // ARCH_IS_32_BIT
 
-class RawExternalTypedData : public RawTypedDataBase {
+class ExternalTypedDataLayout : public TypedDataBaseLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData);
 
  protected:
   VISIT_FROM(RawCompressed, length_)
   VISIT_TO(RawCompressed, length_)
 
-  friend class RawBytecode;
+  friend class BytecodeLayout;
 };
 
-class RawPointer : public RawPointerBase {
+class PointerLayout : public PointerBaseLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Pointer);
 
   VISIT_FROM(RawCompressed, type_arguments_)
-  RawTypeArguments* type_arguments_;
+  TypeArgumentsPtr type_arguments_;
   VISIT_TO(RawCompressed, type_arguments_)
 
   friend class Pointer;
 };
 
-class RawDynamicLibrary : public RawInstance {
+class DynamicLibraryLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(DynamicLibrary);
   VISIT_NOTHING();
   void* handle_;
@@ -2775,13 +2697,13 @@
 };
 
 // VM implementations of the basic types in the isolate.
-class alignas(8) RawCapability : public RawInstance {
+class alignas(8) CapabilityLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Capability);
   VISIT_NOTHING();
   uint64_t id_;
 };
 
-class alignas(8) RawSendPort : public RawInstance {
+class alignas(8) SendPortLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SendPort);
   VISIT_NOTHING();
   Dart_Port id_;
@@ -2790,16 +2712,16 @@
   friend class ReceivePort;
 };
 
-class RawReceivePort : public RawInstance {
+class ReceivePortLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ReceivePort);
 
-  VISIT_FROM(RawObject*, send_port_)
-  RawSendPort* send_port_;
-  RawInstance* handler_;
-  VISIT_TO(RawObject*, handler_)
+  VISIT_FROM(ObjectPtr, send_port_)
+  SendPortPtr send_port_;
+  InstancePtr handler_;
+  VISIT_TO(ObjectPtr, handler_)
 };
 
-class RawTransferableTypedData : public RawInstance {
+class TransferableTypedDataLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(TransferableTypedData);
   VISIT_NOTHING();
 };
@@ -2808,15 +2730,15 @@
 // Currently we don't have any interface that this object is supposed
 // to implement so we just support the 'toString' method which
 // converts the stack trace into a string.
-class RawStackTrace : public RawInstance {
+class StackTraceLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(StackTrace);
 
-  VISIT_FROM(RawObject*, async_link_)
-  RawStackTrace* async_link_;  // Link to parent async stack trace.
-  RawArray* code_array_;       // Code object for each frame in the stack trace.
-  RawArray* pc_offset_array_;  // Offset of PC for each frame.
-  VISIT_TO(RawObject*, pc_offset_array_)
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(ObjectPtr, async_link_)
+  StackTracePtr async_link_;  // Link to parent async stack trace.
+  ArrayPtr code_array_;       // Code object for each frame in the stack trace.
+  ArrayPtr pc_offset_array_;  // Offset of PC for each frame.
+  VISIT_TO(ObjectPtr, pc_offset_array_)
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // False for pre-allocated stack trace (used in OOM and Stack overflow).
   bool expand_inlined_;
@@ -2827,35 +2749,35 @@
 };
 
 // VM type for capturing JS regular expressions.
-class RawRegExp : public RawInstance {
+class RegExpLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(RegExp);
 
-  VISIT_FROM(RawObject*, num_bracket_expressions_)
-  RawSmi* num_bracket_expressions_;
-  RawArray* capture_name_map_;
-  RawString* pattern_;  // Pattern to be used for matching.
+  VISIT_FROM(ObjectPtr, num_bracket_expressions_)
+  SmiPtr num_bracket_expressions_;
+  ArrayPtr capture_name_map_;
+  StringPtr pattern_;  // Pattern to be used for matching.
   union {
-    RawFunction* function_;
-    RawTypedData* bytecode_;
+    FunctionPtr function_;
+    TypedDataPtr bytecode_;
   } one_byte_;
   union {
-    RawFunction* function_;
-    RawTypedData* bytecode_;
+    FunctionPtr function_;
+    TypedDataPtr bytecode_;
   } two_byte_;
-  RawFunction* external_one_byte_function_;
-  RawFunction* external_two_byte_function_;
+  FunctionPtr external_one_byte_function_;
+  FunctionPtr external_two_byte_function_;
   union {
-    RawFunction* function_;
-    RawTypedData* bytecode_;
+    FunctionPtr function_;
+    TypedDataPtr bytecode_;
   } one_byte_sticky_;
   union {
-    RawFunction* function_;
-    RawTypedData* bytecode_;
+    FunctionPtr function_;
+    TypedDataPtr bytecode_;
   } two_byte_sticky_;
-  RawFunction* external_one_byte_sticky_function_;
-  RawFunction* external_two_byte_sticky_function_;
-  VISIT_TO(RawObject*, external_two_byte_sticky_function_)
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  FunctionPtr external_one_byte_sticky_function_;
+  FunctionPtr external_two_byte_sticky_function_;
+  VISIT_TO(ObjectPtr, external_two_byte_sticky_function_)
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // The same pattern may use different amount of registers if compiled
   // for a one-byte target than a two-byte target. For example, we do not
@@ -2871,14 +2793,14 @@
   int8_t type_flags_;
 };
 
-class RawWeakProperty : public RawInstance {
+class WeakPropertyLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty);
 
-  VISIT_FROM(RawObject*, key_)
-  RawObject* key_;
-  RawObject* value_;
-  VISIT_TO(RawObject*, value_)
-  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+  VISIT_FROM(ObjectPtr, key_)
+  ObjectPtr key_;
+  ObjectPtr value_;
+  VISIT_TO(ObjectPtr, value_)
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // Linked list is chaining all pending weak properties.
   // Untyped to make it clear that it is not to be visited by GC.
@@ -2894,21 +2816,21 @@
 
 // MirrorReferences are used by mirrors to hold reflectees that are VM
 // internal objects, such as libraries, classes, functions or types.
-class RawMirrorReference : public RawInstance {
+class MirrorReferenceLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MirrorReference);
 
-  VISIT_FROM(RawObject*, referent_)
-  RawObject* referent_;
-  VISIT_TO(RawObject*, referent_)
+  VISIT_FROM(ObjectPtr, referent_)
+  ObjectPtr referent_;
+  VISIT_TO(ObjectPtr, referent_)
 };
 
 // UserTag are used by the profiler to track Dart script state.
-class RawUserTag : public RawInstance {
+class UserTagLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UserTag);
 
-  VISIT_FROM(RawObject*, label_)
-  RawString* label_;
-  VISIT_TO(RawObject*, label_)
+  VISIT_FROM(ObjectPtr, label_)
+  StringPtr label_;
+  VISIT_TO(ObjectPtr, label_)
 
   // Isolate unique tag.
   uword tag_;
@@ -2920,11 +2842,11 @@
   uword tag() const { return tag_; }
 };
 
-class RawFutureOr : public RawInstance {
+class FutureOrLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(FutureOr);
 
   VISIT_FROM(RawCompressed, type_arguments_)
-  RawTypeArguments* type_arguments_;
+  TypeArgumentsPtr type_arguments_;
   VISIT_TO(RawCompressed, type_arguments_)
 
   friend class SnapshotReader;
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 88c11a5..c594b92 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -230,7 +230,8 @@
 }
 
 #define DEFINE_OFFSETS_TABLE_ENTRY(class_name, field_name)                     \
-  {class_name::kClassId, #field_name, OFFSET_OF(Raw##class_name, field_name)},
+  {class_name::kClassId, #field_name,                                          \
+   OFFSET_OF(class_name##Layout, field_name)},
 
 // clang-format off
 OffsetsTable::OffsetsTableEntry OffsetsTable::offsets_table[] = {
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 4fce40c..487ae69 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -24,7 +24,7 @@
     " port after it exceeds certain size in bytes.");
 
 #define OFFSET_OF_FROM(obj)                                                    \
-  obj.raw()->from() - reinterpret_cast<RawObject**>(obj.raw()->ptr())
+  obj.raw()->from() - reinterpret_cast<ObjectPtr*>(obj.raw()->ptr())
 
 // TODO(18854): Need to assert No GC can happen here, even though
 // allocations may happen.
@@ -35,11 +35,11 @@
     object.StorePointer(((from) + i), reader->PassiveObjectHandle()->raw());   \
   }
 
-RawClass* Class::ReadFrom(SnapshotReader* reader,
-                          intptr_t object_id,
-                          intptr_t tags,
-                          Snapshot::Kind kind,
-                          bool as_reference) {
+ClassPtr Class::ReadFrom(SnapshotReader* reader,
+                         intptr_t object_id,
+                         intptr_t tags,
+                         Snapshot::Kind kind,
+                         bool as_reference) {
   ASSERT(reader != NULL);
 
   Class& cls = Class::ZoneHandle(reader->zone(), Class::null());
@@ -47,10 +47,10 @@
   return cls.raw();
 }
 
-void RawClass::WriteTo(SnapshotWriter* writer,
-                       intptr_t object_id,
-                       Snapshot::Kind kind,
-                       bool as_reference) {
+void ClassLayout::WriteTo(SnapshotWriter* writer,
+                          intptr_t object_id,
+                          Snapshot::Kind kind,
+                          bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -71,11 +71,11 @@
   }
 }
 
-RawType* Type::ReadFrom(SnapshotReader* reader,
-                        intptr_t object_id,
-                        intptr_t tags,
-                        Snapshot::Kind kind,
-                        bool as_reference) {
+TypePtr Type::ReadFrom(SnapshotReader* reader,
+                       intptr_t object_id,
+                       intptr_t tags,
+                       Snapshot::Kind kind,
+                       bool as_reference) {
   ASSERT(reader != NULL);
 
   // Determine if the type class of this type is in the full snapshot.
@@ -83,7 +83,7 @@
 
   // Allocate type object.
   Type& type = Type::ZoneHandle(reader->zone(), Type::New());
-  bool is_canonical = RawObject::IsCanonical(tags);
+  bool is_canonical = ObjectLayout::IsCanonical(tags);
   reader->AddBackRef(object_id, &type, kIsDeserialized);
 
   // Set all non object fields.
@@ -96,7 +96,8 @@
   reader->EnqueueTypePostprocessing(type);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(type, type.raw()->from(), type.raw()->to(), as_reference);
+  READ_OBJECT_FIELDS(type, type.raw()->ptr()->from(), type.raw()->ptr()->to(),
+                     as_reference);
 
   // Read in the type class.
   (*reader->ClassHandle()) =
@@ -115,10 +116,10 @@
   return type.raw();
 }
 
-void RawType::WriteTo(SnapshotWriter* writer,
-                      intptr_t object_id,
-                      Snapshot::Kind kind,
-                      bool as_reference) {
+void TypeLayout::WriteTo(SnapshotWriter* writer,
+                         intptr_t object_id,
+                         Snapshot::Kind kind,
+                         bool as_reference) {
   ASSERT(writer != NULL);
 
   if (ptr()->signature_ != Function::null()) {
@@ -129,8 +130,8 @@
   }
 
   // Only resolved and finalized types should be written to a snapshot.
-  ASSERT((ptr()->type_state_ == RawType::kFinalizedInstantiated) ||
-         (ptr()->type_state_ == RawType::kFinalizedUninstantiated));
+  ASSERT((ptr()->type_state_ == TypeLayout::kFinalizedInstantiated) ||
+         (ptr()->type_state_ == TypeLayout::kFinalizedUninstantiated));
   ASSERT(ptr()->type_class_id_ != Object::null());
 
   // Write out the serialization header value for this object.
@@ -146,8 +147,8 @@
   }
 
   // Lookup the type class.
-  RawSmi* raw_type_class_id = Smi::RawCast(ptr()->type_class_id_);
-  RawClass* type_class =
+  SmiPtr raw_type_class_id = Smi::RawCast(ptr()->type_class_id_);
+  ClassPtr type_class =
       writer->isolate()->class_table()->At(Smi::Value(raw_type_class_id));
 
   // Write out typeclass_is_in_fullsnapshot first as this will
@@ -155,7 +156,7 @@
   intptr_t tags = writer->GetObjectTags(type_class);
   bool typeclass_is_in_fullsnapshot =
       (ClassIdTag::decode(tags) == kClassCid) &&
-      Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(type_class));
+      Class::IsInFullSnapshot(static_cast<ClassPtr>(type_class));
   writer->Write<bool>(typeclass_is_in_fullsnapshot);
 
   // Write out all the non object pointer fields.
@@ -174,11 +175,11 @@
   writer->WriteObjectImpl(type_class, as_reference);
 }
 
-RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader,
-                              intptr_t object_id,
-                              intptr_t tags,
-                              Snapshot::Kind kind,
-                              bool as_reference) {
+TypeRefPtr TypeRef::ReadFrom(SnapshotReader* reader,
+                             intptr_t object_id,
+                             intptr_t tags,
+                             Snapshot::Kind kind,
+                             bool as_reference) {
   ASSERT(reader != NULL);
 
   // Allocate type ref object.
@@ -189,8 +190,8 @@
   reader->EnqueueTypePostprocessing(type_ref);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(type_ref, type_ref.raw()->from(), type_ref.raw()->to(),
-                     kAsReference);
+  READ_OBJECT_FIELDS(type_ref, type_ref.raw()->ptr()->from(),
+                     type_ref.raw()->ptr()->to(), kAsReference);
 
   // Fill in the type testing stub.
   Code& code = *reader->CodeHandle();
@@ -200,10 +201,10 @@
   return type_ref.raw();
 }
 
-void RawTypeRef::WriteTo(SnapshotWriter* writer,
-                         intptr_t object_id,
-                         Snapshot::Kind kind,
-                         bool as_reference) {
+void TypeRefLayout::WriteTo(SnapshotWriter* writer,
+                            intptr_t object_id,
+                            Snapshot::Kind kind,
+                            bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -218,11 +219,11 @@
   visitor.VisitPointers(from(), to());
 }
 
-RawTypeParameter* TypeParameter::ReadFrom(SnapshotReader* reader,
-                                          intptr_t object_id,
-                                          intptr_t tags,
-                                          Snapshot::Kind kind,
-                                          bool as_reference) {
+TypeParameterPtr TypeParameter::ReadFrom(SnapshotReader* reader,
+                                         intptr_t object_id,
+                                         intptr_t tags,
+                                         Snapshot::Kind kind,
+                                         bool as_reference) {
   ASSERT(reader != NULL);
 
   // Allocate type parameter object.
@@ -242,8 +243,8 @@
   reader->EnqueueTypePostprocessing(type_parameter);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(type_parameter, type_parameter.raw()->from(),
-                     type_parameter.raw()->to(), kAsReference);
+  READ_OBJECT_FIELDS(type_parameter, type_parameter.raw()->ptr()->from(),
+                     type_parameter.raw()->ptr()->to(), kAsReference);
 
   // Read in the parameterized class.
   (*reader->ClassHandle()) =
@@ -258,10 +259,10 @@
   return type_parameter.raw();
 }
 
-void RawTypeParameter::WriteTo(SnapshotWriter* writer,
-                               intptr_t object_id,
-                               Snapshot::Kind kind,
-                               bool as_reference) {
+void TypeParameterLayout::WriteTo(SnapshotWriter* writer,
+                                  intptr_t object_id,
+                                  Snapshot::Kind kind,
+                                  bool as_reference) {
   ASSERT(writer != NULL);
 
   // Only finalized type parameters should be written to a snapshot.
@@ -287,16 +288,16 @@
   visitor.VisitPointers(from(), to());
 
   // Write out the parameterized class.
-  RawClass* param_class =
+  ClassPtr param_class =
       writer->isolate()->class_table()->At(ptr()->parameterized_class_id_);
   writer->WriteObjectImpl(param_class, kAsReference);
 }
 
-RawTypeArguments* TypeArguments::ReadFrom(SnapshotReader* reader,
-                                          intptr_t object_id,
-                                          intptr_t tags,
-                                          Snapshot::Kind kind,
-                                          bool as_reference) {
+TypeArgumentsPtr TypeArguments::ReadFrom(SnapshotReader* reader,
+                                         intptr_t object_id,
+                                         intptr_t tags,
+                                         Snapshot::Kind kind,
+                                         bool as_reference) {
   ASSERT(reader != NULL);
 
   // Read the length so that we can determine instance size to allocate.
@@ -304,7 +305,7 @@
 
   TypeArguments& type_arguments =
       TypeArguments::ZoneHandle(reader->zone(), TypeArguments::New(len));
-  bool is_canonical = RawObject::IsCanonical(tags);
+  bool is_canonical = ObjectLayout::IsCanonical(tags);
   reader->AddBackRef(object_id, &type_arguments, kIsDeserialized);
 
   // Set the instantiations field, which is only read from a full snapshot.
@@ -324,10 +325,10 @@
   return type_arguments.raw();
 }
 
-void RawTypeArguments::WriteTo(SnapshotWriter* writer,
-                               intptr_t object_id,
-                               Snapshot::Kind kind,
-                               bool as_reference) {
+void TypeArgumentsLayout::WriteTo(SnapshotWriter* writer,
+                                  intptr_t object_id,
+                                  Snapshot::Kind kind,
+                                  bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -338,7 +339,7 @@
   writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the length field.
-  writer->Write<RawObject*>(ptr()->length_);
+  writer->Write<ObjectPtr>(ptr()->length_);
 
   // Write out the individual types.
   intptr_t len = Smi::Value(ptr()->length_);
@@ -350,9 +351,9 @@
     // across (isolates spawned using spawnURI) we send them as dynamic.
     if (!writer->can_send_any_object()) {
       // Lookup the type class.
-      RawType* raw_type = Type::RawCast(ptr()->types()[i]);
-      RawSmi* raw_type_class_id = Smi::RawCast(raw_type->ptr()->type_class_id_);
-      RawClass* type_class =
+      TypePtr raw_type = Type::RawCast(ptr()->types()[i]);
+      SmiPtr raw_type_class_id = Smi::RawCast(raw_type->ptr()->type_class_id_);
+      ClassPtr type_class =
           writer->isolate()->class_table()->At(Smi::Value(raw_type_class_id));
       if (!writer->AllowObjectsInDartLibrary(type_class->ptr()->library_)) {
         writer->WriteVMIsolateObject(kDynamicType);
@@ -365,24 +366,24 @@
   }
 }
 
-RawClosure* Closure::ReadFrom(SnapshotReader* reader,
-                              intptr_t object_id,
-                              intptr_t tags,
-                              Snapshot::Kind kind,
-                              bool as_reference) {
+ClosurePtr Closure::ReadFrom(SnapshotReader* reader,
+                             intptr_t object_id,
+                             intptr_t tags,
+                             Snapshot::Kind kind,
+                             bool as_reference) {
   UNREACHABLE();
   return Closure::null();
 }
 
-void RawClosure::WriteTo(SnapshotWriter* writer,
-                         intptr_t object_id,
-                         Snapshot::Kind kind,
-                         bool as_reference) {
+void ClosureLayout::WriteTo(SnapshotWriter* writer,
+                            intptr_t object_id,
+                            Snapshot::Kind kind,
+                            bool as_reference) {
   ASSERT(writer != NULL);
   ASSERT(kind == Snapshot::kMessage);
 
   // Check if closure is serializable, throw an exception otherwise.
-  RawFunction* func = writer->IsSerializableClosure(this);
+  FunctionPtr func = writer->IsSerializableClosure(ClosurePtr(this));
   if (func != Function::null()) {
     writer->WriteStaticImplicitClosure(object_id, func,
                                        writer->GetObjectTags(this));
@@ -392,11 +393,11 @@
   UNREACHABLE();
 }
 
-RawContext* Context::ReadFrom(SnapshotReader* reader,
-                              intptr_t object_id,
-                              intptr_t tags,
-                              Snapshot::Kind kind,
-                              bool as_reference) {
+ContextPtr Context::ReadFrom(SnapshotReader* reader,
+                             intptr_t object_id,
+                             intptr_t tags,
+                             Snapshot::Kind kind,
+                             bool as_reference) {
   ASSERT(reader != NULL);
 
   // Allocate context object.
@@ -409,20 +410,21 @@
     // Set all the object fields.
     // TODO(5411462): Need to assert No GC can happen here, even though
     // allocations may happen.
-    intptr_t num_flds = (context.raw()->to(num_vars) - context.raw()->from());
+    intptr_t num_flds =
+        (context.raw()->ptr()->to(num_vars) - context.raw()->ptr()->from());
     for (intptr_t i = 0; i <= num_flds; i++) {
       (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
-      context.StorePointer((context.raw()->from() + i),
+      context.StorePointer((context.raw()->ptr()->from() + i),
                            reader->PassiveObjectHandle()->raw());
     }
   }
   return context.raw();
 }
 
-void RawContext::WriteTo(SnapshotWriter* writer,
-                         intptr_t object_id,
-                         Snapshot::Kind kind,
-                         bool as_reference) {
+void ContextLayout::WriteTo(SnapshotWriter* writer,
+                            intptr_t object_id,
+                            Snapshot::Kind kind,
+                            bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -442,11 +444,11 @@
   }
 }
 
-RawContextScope* ContextScope::ReadFrom(SnapshotReader* reader,
-                                        intptr_t object_id,
-                                        intptr_t tags,
-                                        Snapshot::Kind kind,
-                                        bool as_reference) {
+ContextScopePtr ContextScope::ReadFrom(SnapshotReader* reader,
+                                       intptr_t object_id,
+                                       intptr_t tags,
+                                       Snapshot::Kind kind,
+                                       bool as_reference) {
   ASSERT(reader != NULL);
 
   // Allocate context object.
@@ -473,10 +475,10 @@
   return NULL;
 }
 
-void RawContextScope::WriteTo(SnapshotWriter* writer,
-                              intptr_t object_id,
-                              Snapshot::Kind kind,
-                              bool as_reference) {
+void ContextScopeLayout::WriteTo(SnapshotWriter* writer,
+                                 intptr_t object_id,
+                                 Snapshot::Kind kind,
+                                 bool as_reference) {
   ASSERT(writer != NULL);
 
   if (ptr()->is_implicit_) {
@@ -502,26 +504,26 @@
 }
 
 #define MESSAGE_SNAPSHOT_UNREACHABLE(type)                                     \
-  Raw##type* type::ReadFrom(SnapshotReader* reader, intptr_t object_id,        \
-                            intptr_t tags, Snapshot::Kind kind,                \
-                            bool as_reference) {                               \
+  type##Ptr type::ReadFrom(SnapshotReader* reader, intptr_t object_id,         \
+                           intptr_t tags, Snapshot::Kind kind,                 \
+                           bool as_reference) {                                \
     UNREACHABLE();                                                             \
     return type::null();                                                       \
   }                                                                            \
-  void Raw##type::WriteTo(SnapshotWriter* writer, intptr_t object_id,          \
-                          Snapshot::Kind kind, bool as_reference) {            \
+  void type##Layout::WriteTo(SnapshotWriter* writer, intptr_t object_id,       \
+                             Snapshot::Kind kind, bool as_reference) {         \
     UNREACHABLE();                                                             \
   }
 
 #define MESSAGE_SNAPSHOT_ILLEGAL(type)                                         \
-  Raw##type* type::ReadFrom(SnapshotReader* reader, intptr_t object_id,        \
-                            intptr_t tags, Snapshot::Kind kind,                \
-                            bool as_reference) {                               \
+  type##Ptr type::ReadFrom(SnapshotReader* reader, intptr_t object_id,         \
+                           intptr_t tags, Snapshot::Kind kind,                 \
+                           bool as_reference) {                                \
     UNREACHABLE();                                                             \
     return type::null();                                                       \
   }                                                                            \
-  void Raw##type::WriteTo(SnapshotWriter* writer, intptr_t object_id,          \
-                          Snapshot::Kind kind, bool as_reference) {            \
+  void type##Layout::WriteTo(SnapshotWriter* writer, intptr_t object_id,       \
+                             Snapshot::Kind kind, bool as_reference) {         \
     writer->SetWriteException(Exceptions::kArgument,                           \
                               "Illegal argument in isolate message"            \
                               " : (object is a " #type ")");                   \
@@ -573,11 +575,11 @@
 MESSAGE_SNAPSHOT_ILLEGAL(StackTrace);
 MESSAGE_SNAPSHOT_ILLEGAL(UserTag);
 
-RawApiError* ApiError::ReadFrom(SnapshotReader* reader,
-                                intptr_t object_id,
-                                intptr_t tags,
-                                Snapshot::Kind kind,
-                                bool as_reference) {
+ApiErrorPtr ApiError::ReadFrom(SnapshotReader* reader,
+                               intptr_t object_id,
+                               intptr_t tags,
+                               Snapshot::Kind kind,
+                               bool as_reference) {
   ASSERT(reader != NULL);
 
   // Allocate ApiError object.
@@ -585,16 +587,16 @@
   reader->AddBackRef(object_id, &api_error, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(api_error, api_error.raw()->from(), api_error.raw()->to(),
-                     kAsReference);
+  READ_OBJECT_FIELDS(api_error, api_error.raw()->ptr()->from(),
+                     api_error.raw()->ptr()->to(), kAsReference);
 
   return api_error.raw();
 }
 
-void RawApiError::WriteTo(SnapshotWriter* writer,
-                          intptr_t object_id,
-                          Snapshot::Kind kind,
-                          bool as_reference) {
+void ApiErrorLayout::WriteTo(SnapshotWriter* writer,
+                             intptr_t object_id,
+                             Snapshot::Kind kind,
+                             bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -609,11 +611,11 @@
   visitor.VisitPointers(from(), to());
 }
 
-RawLanguageError* LanguageError::ReadFrom(SnapshotReader* reader,
-                                          intptr_t object_id,
-                                          intptr_t tags,
-                                          Snapshot::Kind kind,
-                                          bool as_reference) {
+LanguageErrorPtr LanguageError::ReadFrom(SnapshotReader* reader,
+                                         intptr_t object_id,
+                                         intptr_t tags,
+                                         Snapshot::Kind kind,
+                                         bool as_reference) {
   ASSERT(reader != NULL);
 
   // Allocate LanguageError object.
@@ -628,16 +630,16 @@
   language_error.set_kind(reader->Read<uint8_t>());
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(language_error, language_error.raw()->from(),
-                     language_error.raw()->to(), kAsReference);
+  READ_OBJECT_FIELDS(language_error, language_error.raw()->ptr()->from(),
+                     language_error.raw()->ptr()->to(), kAsReference);
 
   return language_error.raw();
 }
 
-void RawLanguageError::WriteTo(SnapshotWriter* writer,
-                               intptr_t object_id,
-                               Snapshot::Kind kind,
-                               bool as_reference) {
+void LanguageErrorLayout::WriteTo(SnapshotWriter* writer,
+                                  intptr_t object_id,
+                                  Snapshot::Kind kind,
+                                  bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -657,26 +659,26 @@
   visitor.VisitPointers(from(), to());
 }
 
-RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader,
-                                                    intptr_t object_id,
-                                                    intptr_t tags,
-                                                    Snapshot::Kind kind,
-                                                    bool as_reference) {
+UnhandledExceptionPtr UnhandledException::ReadFrom(SnapshotReader* reader,
+                                                   intptr_t object_id,
+                                                   intptr_t tags,
+                                                   Snapshot::Kind kind,
+                                                   bool as_reference) {
   UnhandledException& result =
       UnhandledException::ZoneHandle(reader->zone(), UnhandledException::New());
   reader->AddBackRef(object_id, &result, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(result, result.raw()->from(), result.raw()->to(),
-                     kAsReference);
+  READ_OBJECT_FIELDS(result, result.raw()->ptr()->from(),
+                     result.raw()->ptr()->to(), kAsReference);
 
   return result.raw();
 }
 
-void RawUnhandledException::WriteTo(SnapshotWriter* writer,
-                                    intptr_t object_id,
-                                    Snapshot::Kind kind,
-                                    bool as_reference) {
+void UnhandledExceptionLayout::WriteTo(SnapshotWriter* writer,
+                                       intptr_t object_id,
+                                       Snapshot::Kind kind,
+                                       bool as_reference) {
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
 
@@ -688,18 +690,18 @@
   visitor.VisitPointers(from(), to());
 }
 
-RawInstance* Instance::ReadFrom(SnapshotReader* reader,
-                                intptr_t object_id,
-                                intptr_t tags,
-                                Snapshot::Kind kind,
-                                bool as_reference) {
+InstancePtr Instance::ReadFrom(SnapshotReader* reader,
+                               intptr_t object_id,
+                               intptr_t tags,
+                               Snapshot::Kind kind,
+                               bool as_reference) {
   ASSERT(reader != NULL);
 
   // Create an Instance object or get canonical one if it is a canonical
   // constant.
   Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null());
   obj ^= Object::Allocate(kInstanceCid, Instance::InstanceSize(), Heap::kNew);
-  if (RawObject::IsCanonical(tags)) {
+  if (ObjectLayout::IsCanonical(tags)) {
     const char* error_str = NULL;
     obj = obj.CheckAndCanonicalize(reader->thread(), &error_str);
     if (error_str != NULL) {
@@ -711,10 +713,10 @@
   return obj.raw();
 }
 
-void RawInstance::WriteTo(SnapshotWriter* writer,
-                          intptr_t object_id,
-                          Snapshot::Kind kind,
-                          bool as_reference) {
+void InstanceLayout::WriteTo(SnapshotWriter* writer,
+                             intptr_t object_id,
+                             Snapshot::Kind kind,
+                             bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -725,11 +727,11 @@
   writer->WriteTags(writer->GetObjectTags(this));
 }
 
-RawInteger* Mint::ReadFrom(SnapshotReader* reader,
-                           intptr_t object_id,
-                           intptr_t tags,
-                           Snapshot::Kind kind,
-                           bool as_reference) {
+IntegerPtr Mint::ReadFrom(SnapshotReader* reader,
+                          intptr_t object_id,
+                          intptr_t tags,
+                          Snapshot::Kind kind,
+                          bool as_reference) {
   ASSERT(reader != NULL);
 
   // Read the 64 bit value for the object.
@@ -751,7 +753,7 @@
   // full snapshot). Objects that are only in the script need not be
   // canonicalized as they are already canonical.
   // When reading a message snapshot we always have to canonicalize.
-  if (RawObject::IsCanonical(tags)) {
+  if (ObjectLayout::IsCanonical(tags)) {
     mint = Mint::NewCanonical(value);
     ASSERT(mint.IsCanonical());
   } else {
@@ -761,10 +763,10 @@
   return mint.raw();
 }
 
-void RawMint::WriteTo(SnapshotWriter* writer,
-                      intptr_t object_id,
-                      Snapshot::Kind kind,
-                      bool as_reference) {
+void MintLayout::WriteTo(SnapshotWriter* writer,
+                         intptr_t object_id,
+                         Snapshot::Kind kind,
+                         bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -778,11 +780,11 @@
   writer->Write<int64_t>(ptr()->value_);
 }
 
-RawDouble* Double::ReadFrom(SnapshotReader* reader,
-                            intptr_t object_id,
-                            intptr_t tags,
-                            Snapshot::Kind kind,
-                            bool as_reference) {
+DoublePtr Double::ReadFrom(SnapshotReader* reader,
+                           intptr_t object_id,
+                           intptr_t tags,
+                           Snapshot::Kind kind,
+                           bool as_reference) {
   ASSERT(reader != NULL);
   ASSERT(kind != Snapshot::kMessage);
   // Read the double value for the object.
@@ -794,7 +796,7 @@
   // references that are objects from the core library (loaded from a
   // full snapshot). Objects that are only in the script need not be
   // canonicalized as they are already canonical.
-  if (RawObject::IsCanonical(tags)) {
+  if (ObjectLayout::IsCanonical(tags)) {
     dbl = Double::NewCanonical(value);
     ASSERT(dbl.IsCanonical());
   } else {
@@ -804,10 +806,10 @@
   return dbl.raw();
 }
 
-void RawDouble::WriteTo(SnapshotWriter* writer,
-                        intptr_t object_id,
-                        Snapshot::Kind kind,
-                        bool as_reference) {
+void DoubleLayout::WriteTo(SnapshotWriter* writer,
+                           intptr_t object_id,
+                           Snapshot::Kind kind,
+                           bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -829,7 +831,7 @@
                           CallbackType new_symbol,
                           Snapshot::Kind kind) {
   ASSERT(reader != NULL);
-  if (RawObject::IsCanonical(tags)) {
+  if (ObjectLayout::IsCanonical(tags)) {
     // Set up canonical string object.
     ASSERT(reader != NULL);
     CharacterType* ptr = reader->zone()->Alloc<CharacterType>(len);
@@ -853,11 +855,11 @@
   }
 }
 
-RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader,
-                                          intptr_t object_id,
-                                          intptr_t tags,
-                                          Snapshot::Kind kind,
-                                          bool as_reference) {
+OneByteStringPtr OneByteString::ReadFrom(SnapshotReader* reader,
+                                         intptr_t object_id,
+                                         intptr_t tags,
+                                         Snapshot::Kind kind,
+                                         bool as_reference) {
   // Read the length so that we can determine instance size to allocate.
   ASSERT(reader != NULL);
   intptr_t len = reader->ReadSmiValue();
@@ -869,11 +871,11 @@
   return raw(str_obj);
 }
 
-RawTwoByteString* TwoByteString::ReadFrom(SnapshotReader* reader,
-                                          intptr_t object_id,
-                                          intptr_t tags,
-                                          Snapshot::Kind kind,
-                                          bool as_reference) {
+TwoByteStringPtr TwoByteString::ReadFrom(SnapshotReader* reader,
+                                         intptr_t object_id,
+                                         intptr_t tags,
+                                         Snapshot::Kind kind,
+                                         bool as_reference) {
   // Read the length so that we can determine instance size to allocate.
   ASSERT(reader != NULL);
   intptr_t len = reader->ReadSmiValue();
@@ -891,7 +893,7 @@
                           Snapshot::Kind kind,
                           intptr_t class_id,
                           intptr_t tags,
-                          RawSmi* length,
+                          SmiPtr length,
                           T* data) {
   ASSERT(writer != NULL);
   intptr_t len = Smi::Value(length);
@@ -904,7 +906,7 @@
   writer->WriteTags(tags);
 
   // Write out the length field.
-  writer->Write<RawObject*>(length);
+  writer->Write<ObjectPtr>(length);
 
   // Write out the string.
   if (len > 0) {
@@ -918,67 +920,65 @@
   }
 }
 
-void RawOneByteString::WriteTo(SnapshotWriter* writer,
-                               intptr_t object_id,
-                               Snapshot::Kind kind,
-                               bool as_reference) {
+void OneByteStringLayout::WriteTo(SnapshotWriter* writer,
+                                  intptr_t object_id,
+                                  Snapshot::Kind kind,
+                                  bool as_reference) {
   StringWriteTo(writer, object_id, kind, kOneByteStringCid,
                 writer->GetObjectTags(this), ptr()->length_, ptr()->data());
 }
 
-void RawTwoByteString::WriteTo(SnapshotWriter* writer,
-                               intptr_t object_id,
-                               Snapshot::Kind kind,
-                               bool as_reference) {
+void TwoByteStringLayout::WriteTo(SnapshotWriter* writer,
+                                  intptr_t object_id,
+                                  Snapshot::Kind kind,
+                                  bool as_reference) {
   StringWriteTo(writer, object_id, kind, kTwoByteStringCid,
                 writer->GetObjectTags(this), ptr()->length_, ptr()->data());
 }
 
-RawExternalOneByteString* ExternalOneByteString::ReadFrom(
-    SnapshotReader* reader,
-    intptr_t object_id,
-    intptr_t tags,
-    Snapshot::Kind kind,
-    bool as_reference) {
+ExternalOneByteStringPtr ExternalOneByteString::ReadFrom(SnapshotReader* reader,
+                                                         intptr_t object_id,
+                                                         intptr_t tags,
+                                                         Snapshot::Kind kind,
+                                                         bool as_reference) {
   UNREACHABLE();
   return ExternalOneByteString::null();
 }
 
-RawExternalTwoByteString* ExternalTwoByteString::ReadFrom(
-    SnapshotReader* reader,
-    intptr_t object_id,
-    intptr_t tags,
-    Snapshot::Kind kind,
-    bool as_reference) {
+ExternalTwoByteStringPtr ExternalTwoByteString::ReadFrom(SnapshotReader* reader,
+                                                         intptr_t object_id,
+                                                         intptr_t tags,
+                                                         Snapshot::Kind kind,
+                                                         bool as_reference) {
   UNREACHABLE();
   return ExternalTwoByteString::null();
 }
 
-void RawExternalOneByteString::WriteTo(SnapshotWriter* writer,
-                                       intptr_t object_id,
-                                       Snapshot::Kind kind,
-                                       bool as_reference) {
+void ExternalOneByteStringLayout::WriteTo(SnapshotWriter* writer,
+                                          intptr_t object_id,
+                                          Snapshot::Kind kind,
+                                          bool as_reference) {
   // Serialize as a non-external one byte string.
   StringWriteTo(writer, object_id, kind, kOneByteStringCid,
                 writer->GetObjectTags(this), ptr()->length_,
                 ptr()->external_data_);
 }
 
-void RawExternalTwoByteString::WriteTo(SnapshotWriter* writer,
-                                       intptr_t object_id,
-                                       Snapshot::Kind kind,
-                                       bool as_reference) {
+void ExternalTwoByteStringLayout::WriteTo(SnapshotWriter* writer,
+                                          intptr_t object_id,
+                                          Snapshot::Kind kind,
+                                          bool as_reference) {
   // Serialize as a non-external two byte string.
   StringWriteTo(writer, object_id, kind, kTwoByteStringCid,
                 writer->GetObjectTags(this), ptr()->length_,
                 ptr()->external_data_);
 }
 
-RawArray* Array::ReadFrom(SnapshotReader* reader,
-                          intptr_t object_id,
-                          intptr_t tags,
-                          Snapshot::Kind kind,
-                          bool as_reference) {
+ArrayPtr Array::ReadFrom(SnapshotReader* reader,
+                         intptr_t object_id,
+                         intptr_t tags,
+                         Snapshot::Kind kind,
+                         bool as_reference) {
   ASSERT(reader != NULL);
 
   // Read the length so that we can determine instance size to allocate.
@@ -997,17 +997,17 @@
   }
   if (!as_reference) {
     // Read all the individual elements for inlined objects.
-    ASSERT(!RawObject::IsCanonical(tags));
+    ASSERT(!ObjectLayout::IsCanonical(tags));
     reader->ArrayReadFrom(object_id, *array, len, tags);
   }
   return array->raw();
 }
 
-RawImmutableArray* ImmutableArray::ReadFrom(SnapshotReader* reader,
-                                            intptr_t object_id,
-                                            intptr_t tags,
-                                            Snapshot::Kind kind,
-                                            bool as_reference) {
+ImmutableArrayPtr ImmutableArray::ReadFrom(SnapshotReader* reader,
+                                           intptr_t object_id,
+                                           intptr_t tags,
+                                           Snapshot::Kind kind,
+                                           bool as_reference) {
   ASSERT(reader != NULL);
 
   // Read the length so that we can determine instance size to allocate.
@@ -1027,7 +1027,7 @@
   if (!as_reference) {
     // Read all the individual elements for inlined objects.
     reader->ArrayReadFrom(object_id, *array, len, tags);
-    if (RawObject::IsCanonical(tags)) {
+    if (ObjectLayout::IsCanonical(tags)) {
       const char* error_str = NULL;
       *array ^= array->CheckAndCanonicalize(reader->thread(), &error_str);
       if (error_str != NULL) {
@@ -1038,30 +1038,30 @@
   return raw(*array);
 }
 
-void RawArray::WriteTo(SnapshotWriter* writer,
-                       intptr_t object_id,
-                       Snapshot::Kind kind,
-                       bool as_reference) {
+void ArrayLayout::WriteTo(SnapshotWriter* writer,
+                          intptr_t object_id,
+                          Snapshot::Kind kind,
+                          bool as_reference) {
   ASSERT(!this->IsCanonical());
   writer->ArrayWriteTo(object_id, kArrayCid, writer->GetObjectTags(this),
                        ptr()->length_, ptr()->type_arguments_, ptr()->data(),
                        as_reference);
 }
 
-void RawImmutableArray::WriteTo(SnapshotWriter* writer,
-                                intptr_t object_id,
-                                Snapshot::Kind kind,
-                                bool as_reference) {
+void ImmutableArrayLayout::WriteTo(SnapshotWriter* writer,
+                                   intptr_t object_id,
+                                   Snapshot::Kind kind,
+                                   bool as_reference) {
   writer->ArrayWriteTo(object_id, kImmutableArrayCid,
                        writer->GetObjectTags(this), ptr()->length_,
                        ptr()->type_arguments_, ptr()->data(), as_reference);
 }
 
-RawGrowableObjectArray* GrowableObjectArray::ReadFrom(SnapshotReader* reader,
-                                                      intptr_t object_id,
-                                                      intptr_t tags,
-                                                      Snapshot::Kind kind,
-                                                      bool as_reference) {
+GrowableObjectArrayPtr GrowableObjectArray::ReadFrom(SnapshotReader* reader,
+                                                     intptr_t object_id,
+                                                     intptr_t tags,
+                                                     Snapshot::Kind kind,
+                                                     bool as_reference) {
   ASSERT(reader != NULL);
 
   // Read the length so that we can determine instance size to allocate.
@@ -1085,10 +1085,10 @@
   return array.raw();
 }
 
-void RawGrowableObjectArray::WriteTo(SnapshotWriter* writer,
-                                     intptr_t object_id,
-                                     Snapshot::Kind kind,
-                                     bool as_reference) {
+void GrowableObjectArrayLayout::WriteTo(SnapshotWriter* writer,
+                                        intptr_t object_id,
+                                        Snapshot::Kind kind,
+                                        bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -1102,17 +1102,17 @@
   writer->WriteObjectImpl(ptr()->type_arguments_, kAsInlinedObject);
 
   // Write out the used length field.
-  writer->Write<RawObject*>(ptr()->length_);
+  writer->Write<ObjectPtr>(ptr()->length_);
 
   // Write out the Array object.
   writer->WriteObjectImpl(ptr()->data_, kAsReference);
 }
 
-RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader,
-                                          intptr_t object_id,
-                                          intptr_t tags,
-                                          Snapshot::Kind kind,
-                                          bool as_reference) {
+LinkedHashMapPtr LinkedHashMap::ReadFrom(SnapshotReader* reader,
+                                         intptr_t object_id,
+                                         intptr_t tags,
+                                         Snapshot::Kind kind,
+                                         bool as_reference) {
   ASSERT(reader != NULL);
 
   LinkedHashMap& map =
@@ -1148,7 +1148,7 @@
   reader->EnqueueRehashingOfMap(map);
 
   // Read the keys and values.
-  bool read_as_reference = RawObject::IsCanonical(tags) ? false : true;
+  bool read_as_reference = ObjectLayout::IsCanonical(tags) ? false : true;
   for (intptr_t i = 0; i < used_data; i++) {
     *reader->PassiveObjectHandle() = reader->ReadObjectImpl(read_as_reference);
     data.SetAt(i, *reader->PassiveObjectHandle());
@@ -1156,10 +1156,10 @@
   return map.raw();
 }
 
-void RawLinkedHashMap::WriteTo(SnapshotWriter* writer,
-                               intptr_t object_id,
-                               Snapshot::Kind kind,
-                               bool as_reference) {
+void LinkedHashMapLayout::WriteTo(SnapshotWriter* writer,
+                                  intptr_t object_id,
+                                  Snapshot::Kind kind,
+                                  bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -1177,36 +1177,36 @@
   const intptr_t deleted_keys = Smi::Value(ptr()->deleted_keys_);
 
   // Write out the number of (not deleted) key/value pairs that will follow.
-  writer->Write<RawObject*>(Smi::New((used_data >> 1) - deleted_keys));
+  writer->Write<ObjectPtr>(Smi::New((used_data >> 1) - deleted_keys));
 
   // Write out the keys and values.
   const bool write_as_reference = this->IsCanonical() ? false : true;
-  RawArray* data_array = ptr()->data_;
-  RawObject** data_elements = data_array->ptr()->data();
+  ArrayPtr data_array = ptr()->data_;
+  ObjectPtr* data_elements = data_array->ptr()->data();
   ASSERT(used_data <= Smi::Value(data_array->ptr()->length_));
 #if defined(DEBUG)
   intptr_t deleted_keys_found = 0;
 #endif  // DEBUG
   for (intptr_t i = 0; i < used_data; i += 2) {
-    RawObject* key = data_elements[i];
+    ObjectPtr key = data_elements[i];
     if (key == data_array) {
 #if defined(DEBUG)
       ++deleted_keys_found;
 #endif  // DEBUG
       continue;
     }
-    RawObject* value = data_elements[i + 1];
+    ObjectPtr value = data_elements[i + 1];
     writer->WriteObjectImpl(key, write_as_reference);
     writer->WriteObjectImpl(value, write_as_reference);
   }
   DEBUG_ASSERT(deleted_keys_found == deleted_keys);
 }
 
-RawFloat32x4* Float32x4::ReadFrom(SnapshotReader* reader,
-                                  intptr_t object_id,
-                                  intptr_t tags,
-                                  Snapshot::Kind kind,
-                                  bool as_reference) {
+Float32x4Ptr Float32x4::ReadFrom(SnapshotReader* reader,
+                                 intptr_t object_id,
+                                 intptr_t tags,
+                                 Snapshot::Kind kind,
+                                 bool as_reference) {
   ASSERT(reader != NULL);
   // Read the values.
   float value0 = reader->Read<float>();
@@ -1221,10 +1221,10 @@
   return simd.raw();
 }
 
-void RawFloat32x4::WriteTo(SnapshotWriter* writer,
-                           intptr_t object_id,
-                           Snapshot::Kind kind,
-                           bool as_reference) {
+void Float32x4Layout::WriteTo(SnapshotWriter* writer,
+                              intptr_t object_id,
+                              Snapshot::Kind kind,
+                              bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -1241,11 +1241,11 @@
   writer->Write<float>(ptr()->value_[3]);
 }
 
-RawInt32x4* Int32x4::ReadFrom(SnapshotReader* reader,
-                              intptr_t object_id,
-                              intptr_t tags,
-                              Snapshot::Kind kind,
-                              bool as_reference) {
+Int32x4Ptr Int32x4::ReadFrom(SnapshotReader* reader,
+                             intptr_t object_id,
+                             intptr_t tags,
+                             Snapshot::Kind kind,
+                             bool as_reference) {
   ASSERT(reader != NULL);
   // Read the values.
   uint32_t value0 = reader->Read<uint32_t>();
@@ -1260,10 +1260,10 @@
   return simd.raw();
 }
 
-void RawInt32x4::WriteTo(SnapshotWriter* writer,
-                         intptr_t object_id,
-                         Snapshot::Kind kind,
-                         bool as_reference) {
+void Int32x4Layout::WriteTo(SnapshotWriter* writer,
+                            intptr_t object_id,
+                            Snapshot::Kind kind,
+                            bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -1280,11 +1280,11 @@
   writer->Write<uint32_t>(ptr()->value_[3]);
 }
 
-RawFloat64x2* Float64x2::ReadFrom(SnapshotReader* reader,
-                                  intptr_t object_id,
-                                  intptr_t tags,
-                                  Snapshot::Kind kind,
-                                  bool as_reference) {
+Float64x2Ptr Float64x2::ReadFrom(SnapshotReader* reader,
+                                 intptr_t object_id,
+                                 intptr_t tags,
+                                 Snapshot::Kind kind,
+                                 bool as_reference) {
   ASSERT(reader != NULL);
   // Read the values.
   double value0 = reader->Read<double>();
@@ -1297,10 +1297,10 @@
   return simd.raw();
 }
 
-void RawFloat64x2::WriteTo(SnapshotWriter* writer,
-                           intptr_t object_id,
-                           Snapshot::Kind kind,
-                           bool as_reference) {
+void Float64x2Layout::WriteTo(SnapshotWriter* writer,
+                              intptr_t object_id,
+                              Snapshot::Kind kind,
+                              bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -1315,14 +1315,14 @@
   writer->Write<double>(ptr()->value_[1]);
 }
 
-RawTypedData* TypedData::ReadFrom(SnapshotReader* reader,
-                                  intptr_t object_id,
-                                  intptr_t tags,
-                                  Snapshot::Kind kind,
-                                  bool as_reference) {
+TypedDataPtr TypedData::ReadFrom(SnapshotReader* reader,
+                                 intptr_t object_id,
+                                 intptr_t tags,
+                                 Snapshot::Kind kind,
+                                 bool as_reference) {
   ASSERT(reader != NULL);
 
-  intptr_t cid = RawObject::ClassIdTag::decode(tags);
+  intptr_t cid = ObjectLayout::ClassIdTag::decode(tags);
   intptr_t len = reader->ReadSmiValue();
   TypedData& result =
       TypedData::ZoneHandle(reader->zone(), TypedData::New(cid, len));
@@ -1341,7 +1341,7 @@
   // as it would already be a canonical object.
   // When reading a script snapshot or a message snapshot we always have
   // to canonicalize the object.
-  if (RawObject::IsCanonical(tags)) {
+  if (ObjectLayout::IsCanonical(tags)) {
     const char* error_str = NULL;
     result ^= result.CheckAndCanonicalize(reader->thread(), &error_str);
     if (error_str != NULL) {
@@ -1353,13 +1353,13 @@
   return result.raw();
 }
 
-RawExternalTypedData* ExternalTypedData::ReadFrom(SnapshotReader* reader,
-                                                  intptr_t object_id,
-                                                  intptr_t tags,
-                                                  Snapshot::Kind kind,
-                                                  bool as_reference) {
+ExternalTypedDataPtr ExternalTypedData::ReadFrom(SnapshotReader* reader,
+                                                 intptr_t object_id,
+                                                 intptr_t tags,
+                                                 Snapshot::Kind kind,
+                                                 bool as_reference) {
   ASSERT(!Snapshot::IsFull(kind));
-  intptr_t cid = RawObject::ClassIdTag::decode(tags);
+  intptr_t cid = ObjectLayout::ClassIdTag::decode(tags);
   intptr_t length = reader->ReadSmiValue();
 
   FinalizableData finalizable_data =
@@ -1381,10 +1381,10 @@
   free(buffer);
 }
 
-void RawTypedData::WriteTo(SnapshotWriter* writer,
-                           intptr_t object_id,
-                           Snapshot::Kind kind,
-                           bool as_reference) {
+void TypedDataLayout::WriteTo(SnapshotWriter* writer,
+                              intptr_t object_id,
+                              Snapshot::Kind kind,
+                              bool as_reference) {
   ASSERT(writer != NULL);
   intptr_t cid = this->GetClassId();
   intptr_t length = Smi::Value(ptr()->length_);  // In elements.
@@ -1461,7 +1461,7 @@
     // Write as external.
     writer->WriteIndexedObject(external_cid);
     writer->WriteTags(writer->GetObjectTags(this));
-    writer->Write<RawObject*>(ptr()->length_);
+    writer->Write<ObjectPtr>(ptr()->length_);
     uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
     void* passed_data = malloc(bytes);
     if (passed_data == NULL) {
@@ -1477,17 +1477,17 @@
     // Write as internal.
     writer->WriteIndexedObject(cid);
     writer->WriteTags(writer->GetObjectTags(this));
-    writer->Write<RawObject*>(ptr()->length_);
+    writer->Write<ObjectPtr>(ptr()->length_);
     uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
     writer->Align(Zone::kAlignment);
     writer->WriteBytes(data, bytes);
   }
 }
 
-void RawExternalTypedData::WriteTo(SnapshotWriter* writer,
-                                   intptr_t object_id,
-                                   Snapshot::Kind kind,
-                                   bool as_reference) {
+void ExternalTypedDataLayout::WriteTo(SnapshotWriter* writer,
+                                      intptr_t object_id,
+                                      Snapshot::Kind kind,
+                                      bool as_reference) {
   ASSERT(writer != NULL);
   intptr_t cid = this->GetClassId();
   intptr_t length = Smi::Value(ptr()->length_);  // In elements.
@@ -1546,7 +1546,7 @@
   // Write as external.
   writer->WriteIndexedObject(cid);
   writer->WriteTags(writer->GetObjectTags(this));
-  writer->Write<RawObject*>(ptr()->length_);
+  writer->Write<ObjectPtr>(ptr()->length_);
   uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data_);
   void* passed_data = malloc(bytes);
   if (passed_data == NULL) {
@@ -1560,10 +1560,10 @@
       IsolateMessageTypedDataFinalizer);
 }
 
-void RawTypedDataView::WriteTo(SnapshotWriter* writer,
-                               intptr_t object_id,
-                               Snapshot::Kind kind,
-                               bool as_reference) {
+void TypedDataViewLayout::WriteTo(SnapshotWriter* writer,
+                                  intptr_t object_id,
+                                  Snapshot::Kind kind,
+                                  bool as_reference) {
   // Views have always a backing store.
   ASSERT(ptr()->typed_data_ != Object::null());
 
@@ -1575,18 +1575,18 @@
   writer->WriteTags(writer->GetObjectTags(this));
 
   // Write members.
-  writer->Write<RawObject*>(ptr()->offset_in_bytes_);
-  writer->Write<RawObject*>(ptr()->length_);
+  writer->Write<ObjectPtr>(ptr()->offset_in_bytes_);
+  writer->Write<ObjectPtr>(ptr()->length_);
   writer->WriteObjectImpl(ptr()->typed_data_, as_reference);
 }
 
-RawTypedDataView* TypedDataView::ReadFrom(SnapshotReader* reader,
-                                          intptr_t object_id,
-                                          intptr_t tags,
-                                          Snapshot::Kind kind,
-                                          bool as_reference) {
+TypedDataViewPtr TypedDataView::ReadFrom(SnapshotReader* reader,
+                                         intptr_t object_id,
+                                         intptr_t tags,
+                                         Snapshot::Kind kind,
+                                         bool as_reference) {
   auto& typed_data = *reader->TypedDataBaseHandle();
-  const classid_t cid = RawObject::ClassIdTag::decode(tags);
+  const classid_t cid = ObjectLayout::ClassIdTag::decode(tags);
 
   auto& view = *reader->TypedDataViewHandle();
   view = TypedDataView::New(cid);
@@ -1600,11 +1600,11 @@
   return view.raw();
 }
 
-RawCapability* Capability::ReadFrom(SnapshotReader* reader,
-                                    intptr_t object_id,
-                                    intptr_t tags,
-                                    Snapshot::Kind kind,
-                                    bool as_reference) {
+CapabilityPtr Capability::ReadFrom(SnapshotReader* reader,
+                                   intptr_t object_id,
+                                   intptr_t tags,
+                                   Snapshot::Kind kind,
+                                   bool as_reference) {
   uint64_t id = reader->Read<uint64_t>();
 
   Capability& result =
@@ -1613,10 +1613,10 @@
   return result.raw();
 }
 
-void RawCapability::WriteTo(SnapshotWriter* writer,
-                            intptr_t object_id,
-                            Snapshot::Kind kind,
-                            bool as_reference) {
+void CapabilityLayout::WriteTo(SnapshotWriter* writer,
+                               intptr_t object_id,
+                               Snapshot::Kind kind,
+                               bool as_reference) {
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
 
@@ -1627,11 +1627,11 @@
   writer->Write<uint64_t>(ptr()->id_);
 }
 
-RawSendPort* SendPort::ReadFrom(SnapshotReader* reader,
-                                intptr_t object_id,
-                                intptr_t tags,
-                                Snapshot::Kind kind,
-                                bool as_reference) {
+SendPortPtr SendPort::ReadFrom(SnapshotReader* reader,
+                               intptr_t object_id,
+                               intptr_t tags,
+                               Snapshot::Kind kind,
+                               bool as_reference) {
   ASSERT(kind == Snapshot::kMessage);
 
   uint64_t id = reader->Read<uint64_t>();
@@ -1643,10 +1643,10 @@
   return result.raw();
 }
 
-void RawSendPort::WriteTo(SnapshotWriter* writer,
-                          intptr_t object_id,
-                          Snapshot::Kind kind,
-                          bool as_reference) {
+void SendPortLayout::WriteTo(SnapshotWriter* writer,
+                             intptr_t object_id,
+                             Snapshot::Kind kind,
+                             bool as_reference) {
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
 
@@ -1658,12 +1658,11 @@
   writer->Write<uint64_t>(ptr()->origin_id_);
 }
 
-RawTransferableTypedData* TransferableTypedData::ReadFrom(
-    SnapshotReader* reader,
-    intptr_t object_id,
-    intptr_t tags,
-    Snapshot::Kind kind,
-    bool as_reference) {
+TransferableTypedDataPtr TransferableTypedData::ReadFrom(SnapshotReader* reader,
+                                                         intptr_t object_id,
+                                                         intptr_t tags,
+                                                         Snapshot::Kind kind,
+                                                         bool as_reference) {
   ASSERT(reader != nullptr);
 
   ASSERT(!Snapshot::IsFull(kind));
@@ -1678,13 +1677,13 @@
   return transferableTypedData.raw();
 }
 
-void RawTransferableTypedData::WriteTo(SnapshotWriter* writer,
-                                       intptr_t object_id,
-                                       Snapshot::Kind kind,
-                                       bool as_reference) {
+void TransferableTypedDataLayout::WriteTo(SnapshotWriter* writer,
+                                          intptr_t object_id,
+                                          Snapshot::Kind kind,
+                                          bool as_reference) {
   ASSERT(writer != nullptr);
   ASSERT(GetClassId() == kTransferableTypedDataCid);
-  void* peer = writer->thread()->heap()->GetPeer(this);
+  void* peer = writer->thread()->heap()->GetPeer(ObjectPtr(this));
   // Assume that object's Peer is only used to track transferrability state.
   ASSERT(peer != nullptr);
   TransferableTypedDataPeer* tpeer =
@@ -1720,11 +1719,11 @@
       });
 }
 
-RawRegExp* RegExp::ReadFrom(SnapshotReader* reader,
-                            intptr_t object_id,
-                            intptr_t tags,
-                            Snapshot::Kind kind,
-                            bool as_reference) {
+RegExpPtr RegExp::ReadFrom(SnapshotReader* reader,
+                           intptr_t object_id,
+                           intptr_t tags,
+                           Snapshot::Kind kind,
+                           bool as_reference) {
   ASSERT(reader != NULL);
 
   // Allocate RegExp object.
@@ -1756,10 +1755,10 @@
   return regex.raw();
 }
 
-void RawRegExp::WriteTo(SnapshotWriter* writer,
-                        intptr_t object_id,
-                        Snapshot::Kind kind,
-                        bool as_reference) {
+void RegExpLayout::WriteTo(SnapshotWriter* writer,
+                           intptr_t object_id,
+                           Snapshot::Kind kind,
+                           bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -1770,18 +1769,18 @@
   writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the other fields.
-  writer->Write<RawObject*>(ptr()->num_bracket_expressions_);
+  writer->Write<ObjectPtr>(ptr()->num_bracket_expressions_);
   writer->WriteObjectImpl(ptr()->pattern_, kAsInlinedObject);
   writer->Write<int32_t>(ptr()->num_one_byte_registers_);
   writer->Write<int32_t>(ptr()->num_two_byte_registers_);
   writer->Write<int8_t>(ptr()->type_flags_);
 }
 
-RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader,
-                                        intptr_t object_id,
-                                        intptr_t tags,
-                                        Snapshot::Kind kind,
-                                        bool as_reference) {
+WeakPropertyPtr WeakProperty::ReadFrom(SnapshotReader* reader,
+                                       intptr_t object_id,
+                                       intptr_t tags,
+                                       Snapshot::Kind kind,
+                                       bool as_reference) {
   ASSERT(reader != NULL);
 
   // Allocate the weak property object.
@@ -1790,16 +1789,16 @@
   reader->AddBackRef(object_id, &weak_property, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(weak_property, weak_property.raw()->from(),
-                     weak_property.raw()->to(), kAsReference);
+  READ_OBJECT_FIELDS(weak_property, weak_property.raw()->ptr()->from(),
+                     weak_property.raw()->ptr()->to(), kAsReference);
 
   return weak_property.raw();
 }
 
-void RawWeakProperty::WriteTo(SnapshotWriter* writer,
-                              intptr_t object_id,
-                              Snapshot::Kind kind,
-                              bool as_reference) {
+void WeakPropertyLayout::WriteTo(SnapshotWriter* writer,
+                                 intptr_t object_id,
+                                 Snapshot::Kind kind,
+                                 bool as_reference) {
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
diff --git a/runtime/vm/regexp.cc b/runtime/vm/regexp.cc
index 08384be..8b3e30f 100644
--- a/runtime/vm/regexp.cc
+++ b/runtime/vm/regexp.cc
@@ -5515,7 +5515,7 @@
 
   Function& fn =
       Function::Handle(zone, Function::New(Symbols::ColonMatcher(),
-                                           RawFunction::kIrregexpFunction,
+                                           FunctionLayout::kIrregexpFunction,
                                            true,   // Static.
                                            false,  // Not const.
                                            false,  // Not abstract.
@@ -5552,9 +5552,9 @@
   // The function is compiled lazily during the first call.
 }
 
-RawRegExp* RegExpEngine::CreateRegExp(Thread* thread,
-                                      const String& pattern,
-                                      RegExpFlags flags) {
+RegExpPtr RegExpEngine::CreateRegExp(Thread* thread,
+                                     const String& pattern,
+                                     RegExpFlags flags) {
   Zone* zone = thread->zone();
   const RegExp& regexp = RegExp::Handle(RegExp::New());
 
diff --git a/runtime/vm/regexp.h b/runtime/vm/regexp.h
index 7cefc38..3fed61b 100644
--- a/runtime/vm/regexp.h
+++ b/runtime/vm/regexp.h
@@ -1510,9 +1510,9 @@
                                            bool sticky,
                                            Zone* zone);
 
-  static RawRegExp* CreateRegExp(Thread* thread,
-                                 const String& pattern,
-                                 RegExpFlags flags);
+  static RegExpPtr CreateRegExp(Thread* thread,
+                                const String& pattern,
+                                RegExpFlags flags);
 
   static void DotPrint(const char* label, RegExpNode* node, bool ignore_case);
 };
diff --git a/runtime/vm/regexp_assembler.cc b/runtime/vm/regexp_assembler.cc
index 8fa69ac..3c2e119 100644
--- a/runtime/vm/regexp_assembler.cc
+++ b/runtime/vm/regexp_assembler.cc
@@ -21,14 +21,14 @@
   OS::PrintErr(format, c);
 }
 
-RawBool* CaseInsensitiveCompareUCS2(RawString* str_raw,
-                                    RawSmi* lhs_index_raw,
-                                    RawSmi* rhs_index_raw,
-                                    RawSmi* length_raw) {
-  const String& str = String::Handle(str_raw);
-  const Smi& lhs_index = Smi::Handle(lhs_index_raw);
-  const Smi& rhs_index = Smi::Handle(rhs_index_raw);
-  const Smi& length = Smi::Handle(length_raw);
+uword /*BoolPtr*/ CaseInsensitiveCompareUCS2(uword /*StringPtr*/ str_raw,
+                                             uword /*SmiPtr*/ lhs_index_raw,
+                                             uword /*SmiPtr*/ rhs_index_raw,
+                                             uword /*SmiPtr*/ length_raw) {
+  const String& str = String::Handle(static_cast<StringPtr>(str_raw));
+  const Smi& lhs_index = Smi::Handle(static_cast<SmiPtr>(lhs_index_raw));
+  const Smi& rhs_index = Smi::Handle(static_cast<SmiPtr>(rhs_index_raw));
+  const Smi& length = Smi::Handle(static_cast<SmiPtr>(length_raw));
 
   // TODO(zerny): Optimize as single instance. V8 has this as an
   // isolate member.
@@ -44,22 +44,22 @@
         int32_t s2[1] = {c2};
         canonicalize.get(c2, '\0', s2);
         if (s1[0] != s2[0]) {
-          return Bool::False().raw();
+          return static_cast<uword>(Bool::False().raw());
         }
       }
     }
   }
-  return Bool::True().raw();
+  return static_cast<uword>(Bool::True().raw());
 }
 
-RawBool* CaseInsensitiveCompareUTF16(RawString* str_raw,
-                                     RawSmi* lhs_index_raw,
-                                     RawSmi* rhs_index_raw,
-                                     RawSmi* length_raw) {
-  const String& str = String::Handle(str_raw);
-  const Smi& lhs_index = Smi::Handle(lhs_index_raw);
-  const Smi& rhs_index = Smi::Handle(rhs_index_raw);
-  const Smi& length = Smi::Handle(length_raw);
+uword /*BoolPtr*/ CaseInsensitiveCompareUTF16(uword /*StringPtr*/ str_raw,
+                                              uword /*SmiPtr*/ lhs_index_raw,
+                                              uword /*SmiPtr*/ rhs_index_raw,
+                                              uword /*SmiPtr*/ length_raw) {
+  const String& str = String::Handle(static_cast<StringPtr>(str_raw));
+  const Smi& lhs_index = Smi::Handle(static_cast<SmiPtr>(lhs_index_raw));
+  const Smi& rhs_index = Smi::Handle(static_cast<SmiPtr>(rhs_index_raw));
+  const Smi& length = Smi::Handle(static_cast<SmiPtr>(length_raw));
 
   for (intptr_t i = 0; i < length.Value(); i++) {
     int32_t c1 = str.CharAt(lhs_index.Value() + i);
@@ -67,7 +67,8 @@
     if (Utf16::IsLeadSurrogate(c1)) {
       // Non-BMP characters do not have case-equivalents in the BMP.
       // Both have to be non-BMP for them to be able to match.
-      if (!Utf16::IsLeadSurrogate(c2)) return Bool::False().raw();
+      if (!Utf16::IsLeadSurrogate(c2))
+        return static_cast<uword>(Bool::False().raw());
       if (i + 1 < length.Value()) {
         uint16_t c1t = str.CharAt(lhs_index.Value() + i + 1);
         uint16_t c2t = str.CharAt(rhs_index.Value() + i + 1);
@@ -80,9 +81,9 @@
     }
     c1 = u_foldCase(c1, U_FOLD_CASE_DEFAULT);
     c2 = u_foldCase(c2, U_FOLD_CASE_DEFAULT);
-    if (c1 != c2) return Bool::False().raw();
+    if (c1 != c2) return static_cast<uword>(Bool::False().raw());
   }
-  return Bool::True().raw();
+  return static_cast<uword>(Bool::True().raw());
 }
 
 DEFINE_RAW_LEAF_RUNTIME_ENTRY(
diff --git a/runtime/vm/regexp_assembler.h b/runtime/vm/regexp_assembler.h
index d7a460b..d858c48 100644
--- a/runtime/vm/regexp_assembler.h
+++ b/runtime/vm/regexp_assembler.h
@@ -16,19 +16,22 @@
 
 // Utility function for the DotPrinter
 void PrintUtf16(uint16_t c);
+
+extern "C" {
 // Compares two-byte strings case insensitively as UCS2.
 // Called from generated RegExp code.
-RawBool* CaseInsensitiveCompareUCS2(RawString* str_raw,
-                                    RawSmi* lhs_index_raw,
-                                    RawSmi* rhs_index_raw,
-                                    RawSmi* length_raw);
+uword /*BoolPtr*/ CaseInsensitiveCompareUCS2(uword /*StringPtr*/ str_raw,
+                                             uword /*SmiPtr*/ lhs_index_raw,
+                                             uword /*SmiPtr*/ rhs_index_raw,
+                                             uword /*SmiPtr*/ length_raw);
 
 // Compares two-byte strings case insensitively as UTF16.
 // Called from generated RegExp code.
-RawBool* CaseInsensitiveCompareUTF16(RawString* str_raw,
-                                     RawSmi* lhs_index_raw,
-                                     RawSmi* rhs_index_raw,
-                                     RawSmi* length_raw);
+uword /*BoolPtr*/ CaseInsensitiveCompareUTF16(uword /*StringPtr*/ str_raw,
+                                              uword /*SmiPtr*/ lhs_index_raw,
+                                              uword /*SmiPtr*/ rhs_index_raw,
+                                              uword /*SmiPtr*/ length_raw);
+}
 
 /// Convenience wrapper around a BlockEntryInstr pointer.
 class BlockLabel : public ValueObject {
diff --git a/runtime/vm/regexp_assembler_bytecode.cc b/runtime/vm/regexp_assembler_bytecode.cc
index 4118969..a7e2ff3 100644
--- a/runtime/vm/regexp_assembler_bytecode.cc
+++ b/runtime/vm/regexp_assembler_bytecode.cc
@@ -390,7 +390,7 @@
   EmitOrLink(on_eq);
 }
 
-RawTypedData* BytecodeRegExpMacroAssembler::GetBytecode() {
+TypedDataPtr BytecodeRegExpMacroAssembler::GetBytecode() {
   BindBlock(&backtrack_);
   Emit(BC_POP_BT, 0);
 
@@ -511,11 +511,11 @@
   return result;
 }
 
-RawInstance* BytecodeRegExpMacroAssembler::Interpret(const RegExp& regexp,
-                                                     const String& subject,
-                                                     const Smi& start_index,
-                                                     bool sticky,
-                                                     Zone* zone) {
+InstancePtr BytecodeRegExpMacroAssembler::Interpret(const RegExp& regexp,
+                                                    const String& subject,
+                                                    const Smi& start_index,
+                                                    bool sticky,
+                                                    Zone* zone) {
   intptr_t required_registers = Prepare(regexp, subject, sticky, zone);
   if (required_registers < 0) {
     // Compiling failed with an exception.
diff --git a/runtime/vm/regexp_assembler_bytecode.h b/runtime/vm/regexp_assembler_bytecode.h
index 59cf68f..cdedaa1 100644
--- a/runtime/vm/regexp_assembler_bytecode.h
+++ b/runtime/vm/regexp_assembler_bytecode.h
@@ -95,7 +95,7 @@
 
   virtual IrregexpImplementation Implementation();
   // virtual Handle<HeapObject> GetCode(Handle<String> source);
-  RawTypedData* GetBytecode();
+  TypedDataPtr GetBytecode();
 
   // New
   virtual bool IsClosed() const {
@@ -107,11 +107,11 @@
   virtual void PrintBlocks() { UNIMPLEMENTED(); }
   /////
 
-  static RawInstance* Interpret(const RegExp& regexp,
-                                const String& str,
-                                const Smi& start_index,
-                                bool is_sticky,
-                                Zone* zone);
+  static InstancePtr Interpret(const RegExp& regexp,
+                               const String& str,
+                               const Smi& start_index,
+                               bool is_sticky,
+                               Zone* zone);
 
  private:
   void Expand();
diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
index 9183c9a..116ff0c 100644
--- a/runtime/vm/regexp_assembler_ir.cc
+++ b/runtime/vm/regexp_assembler_ir.cc
@@ -299,11 +299,11 @@
   return kEnableUnalignedAccesses && !slow_safe();
 }
 
-RawArray* IRRegExpMacroAssembler::Execute(const RegExp& regexp,
-                                          const String& input,
-                                          const Smi& start_offset,
-                                          bool sticky,
-                                          Zone* zone) {
+ArrayPtr IRRegExpMacroAssembler::Execute(const RegExp& regexp,
+                                         const String& input,
+                                         const Smi& start_offset,
+                                         bool sticky,
+                                         Zone* zone) {
   const intptr_t cid = input.GetClassId();
   const Function& fun = Function::Handle(regexp.function(cid, sticky));
   ASSERT(!fun.IsNull());
diff --git a/runtime/vm/regexp_assembler_ir.h b/runtime/vm/regexp_assembler_ir.h
index fb92f1b..d52128d 100644
--- a/runtime/vm/regexp_assembler_ir.h
+++ b/runtime/vm/regexp_assembler_ir.h
@@ -38,11 +38,11 @@
 
   virtual bool CanReadUnaligned();
 
-  static RawArray* Execute(const RegExp& regexp,
-                           const String& input,
-                           const Smi& start_offset,
-                           bool sticky,
-                           Zone* zone);
+  static ArrayPtr Execute(const RegExp& regexp,
+                          const String& input,
+                          const Smi& start_offset,
+                          bool sticky,
+                          Zone* zone);
 
   virtual bool IsClosed() const { return (current_instruction_ == NULL); }
 
diff --git a/runtime/vm/regexp_interpreter.cc b/runtime/vm/regexp_interpreter.cc
index 2921e3e..111c7fe 100644
--- a/runtime/vm/regexp_interpreter.cc
+++ b/runtime/vm/regexp_interpreter.cc
@@ -36,11 +36,15 @@
                                     bool unicode) {
   Bool& ret = Bool::Handle();
   if (unicode) {
-    ret = CaseInsensitiveCompareUTF16(subject.raw(), Smi::New(from),
-                                      Smi::New(current), Smi::New(len));
+    ret = static_cast<BoolPtr>(CaseInsensitiveCompareUTF16(
+        static_cast<uword>(subject.raw()), static_cast<uword>(Smi::New(from)),
+        static_cast<uword>(Smi::New(current)),
+        static_cast<uword>(Smi::New(len))));
   } else {
-    ret = CaseInsensitiveCompareUCS2(subject.raw(), Smi::New(from),
-                                     Smi::New(current), Smi::New(len));
+    ret = static_cast<BoolPtr>(CaseInsensitiveCompareUCS2(
+        static_cast<uword>(subject.raw()), static_cast<uword>(Smi::New(from)),
+        static_cast<uword>(Smi::New(current)),
+        static_cast<uword>(Smi::New(len))));
   }
   return ret.value();
 }
diff --git a/runtime/vm/regexp_parser.cc b/runtime/vm/regexp_parser.cc
index c9987e3..d7f4235 100644
--- a/runtime/vm/regexp_parser.cc
+++ b/runtime/vm/regexp_parser.cc
@@ -1242,7 +1242,7 @@
   return captures_->At(index - 1);
 }
 
-RawArray* RegExpParser::CreateCaptureNameMap() {
+ArrayPtr RegExpParser::CreateCaptureNameMap() {
   if (named_captures_ == nullptr || named_captures_->is_empty()) {
     return Array::null();
   }
diff --git a/runtime/vm/regexp_parser.h b/runtime/vm/regexp_parser.h
index 63c237a..fd456ba 100644
--- a/runtime/vm/regexp_parser.h
+++ b/runtime/vm/regexp_parser.h
@@ -228,7 +228,7 @@
   // to avoid complicating cases in which references come before the capture.
   void PatchNamedBackReferences();
 
-  RawArray* CreateCaptureNameMap();
+  ArrayPtr CreateCaptureNameMap();
 
   // Returns true iff the pattern contains named captures. May call
   // ScanForCaptures to look ahead at the remaining pattern.
diff --git a/runtime/vm/regexp_test.cc b/runtime/vm/regexp_test.cc
index 5ba4056..01eca0e 100644
--- a/runtime/vm/regexp_test.cc
+++ b/runtime/vm/regexp_test.cc
@@ -12,7 +12,7 @@
 
 namespace dart {
 
-static RawArray* Match(const String& pat, const String& str) {
+static ArrayPtr Match(const String& pat, const String& str) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const RegExp& regexp =
diff --git a/runtime/vm/report.cc b/runtime/vm/report.cc
index 5d0c407..ded367d6 100644
--- a/runtime/vm/report.cc
+++ b/runtime/vm/report.cc
@@ -17,11 +17,11 @@
 DEFINE_FLAG(bool, silent_warnings, false, "Silence warnings.");
 DEFINE_FLAG(bool, warning_as_error, false, "Treat warnings as errors.");
 
-RawString* Report::PrependSnippet(Kind kind,
-                                  const Script& script,
-                                  TokenPosition token_pos,
-                                  bool report_after_token,
-                                  const String& message) {
+StringPtr Report::PrependSnippet(Kind kind,
+                                 const Script& script,
+                                 TokenPosition token_pos,
+                                 bool report_after_token,
+                                 const String& message) {
   const char* message_header;
   switch (kind) {
     case kWarning:
diff --git a/runtime/vm/report.h b/runtime/vm/report.h
index 30aaf5c..3af8573 100644
--- a/runtime/vm/report.h
+++ b/runtime/vm/report.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_REPORT_H_
 
 #include "vm/allocation.h"
+#include "vm/tagged_pointer.h"
 #include "vm/token_position.h"
 
 namespace dart {
@@ -13,7 +14,6 @@
 // Forward declarations.
 class Error;
 class ICData;
-class RawString;
 class Script;
 class StackFrame;
 class String;
@@ -60,11 +60,11 @@
 
   // Prepend a source snippet to the message.
   // A null script means no source and a negative token_pos means no position.
-  static RawString* PrependSnippet(Kind kind,
-                                   const Script& script,
-                                   TokenPosition token_pos,
-                                   bool report_after_token,
-                                   const String& message);
+  static StringPtr PrependSnippet(Kind kind,
+                                  const Script& script,
+                                  TokenPosition token_pos,
+                                  bool report_after_token,
+                                  const String& message);
 
  private:
   DISALLOW_COPY_AND_ASSIGN(Report);
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index 2dd5129..d05a03d 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -22,15 +22,15 @@
 // them, since the entry code of such a method does not check for named
 // arguments. The dynamic resolver actually checks that a valid number of named
 // arguments is passed in.
-RawFunction* Resolver::ResolveDynamic(const Instance& receiver,
-                                      const String& function_name,
-                                      const ArgumentsDescriptor& args_desc) {
+FunctionPtr Resolver::ResolveDynamic(const Instance& receiver,
+                                     const String& function_name,
+                                     const ArgumentsDescriptor& args_desc) {
   // Figure out type of receiver first.
   const Class& cls = Class::Handle(receiver.clazz());
   return ResolveDynamicForReceiverClass(cls, function_name, args_desc);
 }
 
-RawFunction* Resolver::ResolveDynamicForReceiverClass(
+FunctionPtr Resolver::ResolveDynamicForReceiverClass(
     const Class& receiver_class,
     const String& function_name,
     const ArgumentsDescriptor& args_desc,
@@ -60,10 +60,10 @@
   return function.raw();
 }
 
-RawFunction* Resolver::ResolveDynamicAnyArgs(Zone* zone,
-                                             const Class& receiver_class,
-                                             const String& function_name,
-                                             bool allow_add) {
+FunctionPtr Resolver::ResolveDynamicAnyArgs(Zone* zone,
+                                            const Class& receiver_class,
+                                            const String& function_name,
+                                            bool allow_add) {
   Class& cls = Class::Handle(zone, receiver_class.raw());
   if (FLAG_trace_resolving) {
     THR_Print("ResolveDynamic '%s' for class %s\n", function_name.ToCString(),
@@ -86,7 +86,8 @@
     while (!cls.IsNull()) {
       function = cls.GetInvocationDispatcher(
           function_name, Array::null_array(),
-          RawFunction::kDynamicInvocationForwarder, /*create_if_absent=*/false);
+          FunctionLayout::kDynamicInvocationForwarder,
+          /*create_if_absent=*/false);
       if (!function.IsNull()) break;
       cls = cls.SuperClass();
     }
@@ -136,12 +137,12 @@
   return function.raw();
 }
 
-RawFunction* Resolver::ResolveStatic(const Library& library,
-                                     const String& class_name,
-                                     const String& function_name,
-                                     intptr_t type_args_len,
-                                     intptr_t num_arguments,
-                                     const Array& argument_names) {
+FunctionPtr Resolver::ResolveStatic(const Library& library,
+                                    const String& class_name,
+                                    const String& function_name,
+                                    intptr_t type_args_len,
+                                    intptr_t num_arguments,
+                                    const Array& argument_names) {
   ASSERT(!library.IsNull());
   Function& function = Function::Handle();
   if (class_name.IsNull() || (class_name.Length() == 0)) {
@@ -184,11 +185,11 @@
   return function.raw();
 }
 
-RawFunction* Resolver::ResolveStatic(const Class& cls,
-                                     const String& function_name,
-                                     intptr_t type_args_len,
-                                     intptr_t num_arguments,
-                                     const Array& argument_names) {
+FunctionPtr Resolver::ResolveStatic(const Class& cls,
+                                    const String& function_name,
+                                    intptr_t type_args_len,
+                                    intptr_t num_arguments,
+                                    const Array& argument_names) {
   ASSERT(!cls.IsNull());
   if (FLAG_trace_resolving) {
     THR_Print("ResolveStatic '%s'\n", function_name.ToCString());
diff --git a/runtime/vm/resolver.h b/runtime/vm/resolver.h
index b96f581..0d9f8a9 100644
--- a/runtime/vm/resolver.h
+++ b/runtime/vm/resolver.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_RESOLVER_H_
 
 #include "vm/allocation.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
@@ -14,7 +15,6 @@
 class Class;
 class Instance;
 class Library;
-class RawFunction;
 class String;
 class ArgumentsDescriptor;
 
@@ -23,22 +23,22 @@
 class Resolver : public AllStatic {
  public:
   // Resolve specified dart instance function.
-  static RawFunction* ResolveDynamic(const Instance& receiver,
-                                     const String& function_name,
-                                     const ArgumentsDescriptor& args_desc);
+  static FunctionPtr ResolveDynamic(const Instance& receiver,
+                                    const String& function_name,
+                                    const ArgumentsDescriptor& args_desc);
 
   // If 'allow_add' is true we may add a function to the class during lookup.
-  static RawFunction* ResolveDynamicForReceiverClass(
+  static FunctionPtr ResolveDynamicForReceiverClass(
       const Class& receiver_class,
       const String& function_name,
       const ArgumentsDescriptor& args_desc,
       bool allow_add = true);
 
   // If 'allow_add' is true we may add a function to the class during lookup.
-  static RawFunction* ResolveDynamicAnyArgs(Zone* zone,
-                                            const Class& receiver_class,
-                                            const String& function_name,
-                                            bool allow_add = true);
+  static FunctionPtr ResolveDynamicAnyArgs(Zone* zone,
+                                           const Class& receiver_class,
+                                           const String& function_name,
+                                           bool allow_add = true);
 
   // Resolve specified dart static function. If library.IsNull, use
   // either application library or core library if no application library
@@ -46,20 +46,20 @@
   // will be resolved by name only.
   // Otherwise null is returned if the number or names of arguments are not
   // valid for the resolved function.
-  static RawFunction* ResolveStatic(const Library& library,
-                                    const String& cls_name,
-                                    const String& function_name,
-                                    intptr_t type_args_len,
-                                    intptr_t num_arguments,
-                                    const Array& argument_names);
+  static FunctionPtr ResolveStatic(const Library& library,
+                                   const String& cls_name,
+                                   const String& function_name,
+                                   intptr_t type_args_len,
+                                   intptr_t num_arguments,
+                                   const Array& argument_names);
 
   // Resolve specified dart static function with specified arity. Only resolves
   // public functions.
-  static RawFunction* ResolveStatic(const Class& cls,
-                                    const String& function_name,
-                                    intptr_t type_args_len,
-                                    intptr_t num_arguments,
-                                    const Array& argument_names);
+  static FunctionPtr ResolveStatic(const Class& cls,
+                                   const String& function_name,
+                                   intptr_t type_args_len,
+                                   intptr_t num_arguments,
+                                   const Array& argument_names);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/reverse_pc_lookup_cache.cc b/runtime/vm/reverse_pc_lookup_cache.cc
index 4757d24..e3d45ae 100644
--- a/runtime/vm/reverse_pc_lookup_cache.cc
+++ b/runtime/vm/reverse_pc_lookup_cache.cc
@@ -10,31 +10,33 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
 
-static uword BeginPcFromCode(const RawCode* code) {
+static uword BeginPcFromCode(const CodePtr code) {
   return Code::PayloadStartOf(code);
 }
 
-static uword EndPcFromCode(const RawCode* code) {
+static uword EndPcFromCode(const CodePtr code) {
   return Code::PayloadStartOf(code) + Code::PayloadSizeOf(code);
 }
 
-void ReversePcLookupCache::BuildAndAttachToIsolate(Isolate* isolate) {
-  auto object_store = isolate->object_store();
+void ReversePcLookupCache::BuildAndAttachToIsolateGroup(
+    IsolateGroup* isolate_group) {
+  // This should be called once when the isolate group is created.
+  ASSERT(isolate_group->reverse_pc_lookup_cache() == nullptr);
+
+  auto object_store = isolate_group->object_store();
   auto& array = Array::Handle(object_store->code_order_table());
   if (!array.IsNull()) {
     const intptr_t length = array.Length();
     {
       NoSafepointScope no_safepoint_scope;
 
-      const uword begin =
-          BeginPcFromCode(reinterpret_cast<RawCode*>(array.At(0)));
+      const uword begin = BeginPcFromCode(static_cast<CodePtr>(array.At(0)));
       const uword end =
-          EndPcFromCode(reinterpret_cast<RawCode*>(array.At(length - 1)));
+          EndPcFromCode(static_cast<CodePtr>(array.At(length - 1)));
 
       auto pc_array = new uint32_t[length];
       for (intptr_t i = 0; i < length; i++) {
-        const auto end_pc =
-            EndPcFromCode(reinterpret_cast<RawCode*>(array.At(i)));
+        const auto end_pc = EndPcFromCode(static_cast<CodePtr>(array.At(i)));
         pc_array[i] = end_pc - begin;
       }
 #if defined(DEBUG)
@@ -43,8 +45,8 @@
       }
 #endif  // defined(DEBUG)
       auto cache =
-          new ReversePcLookupCache(isolate, pc_array, length, begin, end);
-      isolate->set_reverse_pc_lookup_cache(cache);
+          new ReversePcLookupCache(isolate_group, pc_array, length, begin, end);
+      isolate_group->set_reverse_pc_lookup_cache(cache);
     }
   }
 }
diff --git a/runtime/vm/reverse_pc_lookup_cache.h b/runtime/vm/reverse_pc_lookup_cache.h
index 7de0bff..d819956 100644
--- a/runtime/vm/reverse_pc_lookup_cache.h
+++ b/runtime/vm/reverse_pc_lookup_cache.h
@@ -43,21 +43,21 @@
 // WARNING: This class cannot do memory allocation or handle allocation!
 class ReversePcLookupCache {
  public:
-  ReversePcLookupCache(Isolate* isolate,
+  ReversePcLookupCache(IsolateGroup* isolate_group,
                        uint32_t* pc_array,
                        intptr_t length,
                        uword first_absolute_pc,
                        uword last_absolute_pc)
-      : isolate_(isolate),
+      : isolate_group_(isolate_group),
         pc_array_(pc_array),
         length_(length),
         first_absolute_pc_(first_absolute_pc),
         last_absolute_pc_(last_absolute_pc) {}
   ~ReversePcLookupCache() { delete[] pc_array_; }
 
-  // Builds a [ReversePcLookupCache] and attaches it to the isolate (if
+  // Builds a [ReversePcLookupCache] and attaches it to the isolate group (if
   // `code_order_table` is non-`null`).
-  static void BuildAndAttachToIsolate(Isolate* isolate);
+  static void BuildAndAttachToIsolateGroup(IsolateGroup* isolate_group);
 
   // Returns `true` if the given [pc] contains can be mapped to a [Code] object
   // using this cache.
@@ -70,7 +70,7 @@
   // If [is_return_address] is true, then the PC may be immediately after the
   // payload, if the last instruction is a call that is guaranteed not to
   // return. Otherwise, the PC must be within the payload.
-  inline RawCode* Lookup(uword pc, bool is_return_address = false) {
+  inline CodePtr Lookup(uword pc, bool is_return_address = false) {
     NoSafepointScope no_safepoint_scope;
 
     intptr_t left = 0;
@@ -98,8 +98,8 @@
       }
     }
 
-    auto code_array = isolate_->object_store()->code_order_table();
-    auto raw_code = reinterpret_cast<RawCode*>(Array::DataOf(code_array)[left]);
+    auto code_array = isolate_group_->object_store()->code_order_table();
+    auto raw_code = static_cast<CodePtr>(Array::DataOf(code_array)[left]);
 
 #if defined(DEBUG)
     ASSERT(raw_code->GetClassIdMayBeSmi() == kCodeCid);
@@ -110,7 +110,7 @@
   }
 
  private:
-  Isolate* isolate_;
+  IsolateGroup* isolate_group_;
   uint32_t* pc_array_;
   intptr_t length_;
   uword first_absolute_pc_;
@@ -124,11 +124,11 @@
   ReversePcLookupCache() {}
   ~ReversePcLookupCache() {}
 
-  static void BuildAndAttachToIsolate(Isolate* isolate) {}
+  static void BuildAndAttachToIsolateGroup(IsolateGroup* isolate_group) {}
 
   inline bool Contains(uword pc) { return false; }
 
-  inline RawCode* Lookup(uword pc, bool is_return_address = false) {
+  inline CodePtr Lookup(uword pc, bool is_return_address = false) {
     UNREACHABLE();
   }
 };
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index ccf5867..46484be 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -115,8 +115,8 @@
       Class::New(lib, class_name, script, TokenPosition::kNoSource));
   const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
   const Function& function = Function::ZoneHandle(Function::New(
-      function_name, RawFunction::kRegularFunction, true, false, false, false,
-      false, owner_class, TokenPosition::kMinSource));
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kMinSource));
   const Array& functions = Array::Handle(Array::New(1));
   functions.SetAt(0, function);
   owner_class.SetFunctions(functions);
@@ -323,14 +323,15 @@
   }
 }
 
-DEFINE_LEAF_RUNTIME_ENTRY(RawObject*,
+DEFINE_LEAF_RUNTIME_ENTRY(uword /*ObjectPtr*/,
                           AddAllocatedObjectToRememberedSet,
                           2,
-                          RawObject* object,
+                          uword /*ObjectPtr*/ object_in,
                           Thread* thread) {
+  ObjectPtr object = static_cast<ObjectPtr>(object_in);
   // The allocation stubs in will call this leaf method for newly allocated
   // old space objects.
-  RELEASE_ASSERT(object->IsOldObject() && !object->IsRemembered());
+  RELEASE_ASSERT(object->IsOldObject() && !object->ptr()->IsRemembered());
 
   // If we eliminate a generational write barriers on allocations of an object
   // we need to ensure it's either a new-space object or it has been added to
@@ -343,20 +344,19 @@
   // in a long time).
   bool add_to_remembered_set = true;
   if (object->IsArray()) {
-    const intptr_t length =
-        Array::LengthOf(reinterpret_cast<RawArray*>(object));
+    const intptr_t length = Array::LengthOf(static_cast<ArrayPtr>(object));
     add_to_remembered_set =
         compiler::target::WillAllocateNewOrRememberedArray(length);
   } else if (object->IsContext()) {
     const intptr_t num_context_variables =
-        Context::NumVariables(reinterpret_cast<RawContext*>(object));
+        Context::NumVariables(static_cast<ContextPtr>(object));
     add_to_remembered_set =
         compiler::target::WillAllocateNewOrRememberedContext(
             num_context_variables);
   }
 
   if (add_to_remembered_set) {
-    object->AddToRememberedSet(thread);
+    object->ptr()->AddToRememberedSet(thread);
   }
 
   // For incremental write barrier elimination, we need to ensure that the
@@ -366,7 +366,7 @@
     thread->DeferredMarkingStackAddObject(object);
   }
 
-  return object;
+  return static_cast<uword>(object);
 }
 END_LEAF_RUNTIME_ENTRY
 
@@ -718,27 +718,36 @@
           const auto& instance_class_name =
               String::Handle(zone, instance_class.Name());
           OS::PrintErr(
-              "  Updated test cache %p ix: %" Pd
-              " with "
-              "(cid-or-fun: %p, type-args: %p, i-type-args: %p, f-type-args: "
-              "%p, "
-              "p-type-args: %p, d-type-args: %p, result: %s)\n"
-              "    instance  [class: (%p '%s' cid: %" Pd
-              "),    type-args: %p %s]\n"
-              "    test-type [class: (%p '%s' cid: %" Pd
-              "), i-type-args: %p %s, f-type-args: %p %s]\n",
-              new_cache.raw(), len, instance_class_id_or_function.raw(),
-              instance_type_arguments.raw(), instantiator_type_arguments.raw(),
-              function_type_arguments.raw(),
-              instance_parent_function_type_arguments.raw(),
-              instance_delayed_type_arguments.raw(), result.ToCString(),
-              instance_class.raw(), instance_class_name.ToCString(),
-              instance_class.id(), instance_type_arguments.raw(),
-              instance_type_arguments.ToCString(), type_class.raw(),
+              "  Updated test cache %#" Px " ix: %" Pd
+              " with (cid-or-fun:"
+              " %#" Px ", type-args: %#" Px ", i-type-args: %#" Px
+              ", "
+              "f-type-args: %#" Px ", p-type-args: %#" Px
+              ", "
+              "d-type-args: %#" Px
+              ", result: %s)\n"
+              "    instance  [class: (%#" Px " '%s' cid: %" Pd
+              "),    type-args: %#" Px
+              " %s]\n"
+              "    test-type [class: (%#" Px " '%s' cid: %" Pd
+              "), i-type-args: %#" Px " %s, f-type-args: %#" Px " %s]\n",
+              static_cast<uword>(new_cache.raw()), len,
+              static_cast<uword>(instance_class_id_or_function.raw()),
+              static_cast<uword>(instance_type_arguments.raw()),
+              static_cast<uword>(instantiator_type_arguments.raw()),
+              static_cast<uword>(function_type_arguments.raw()),
+              static_cast<uword>(instance_parent_function_type_arguments.raw()),
+              static_cast<uword>(instance_delayed_type_arguments.raw()),
+              result.ToCString(), static_cast<uword>(instance_class.raw()),
+              instance_class_name.ToCString(), instance_class.id(),
+              static_cast<uword>(instance_type_arguments.raw()),
+              instance_type_arguments.ToCString(),
+              static_cast<uword>(type_class.raw()),
               String::Handle(zone, type_class.Name()).ToCString(),
-              type_class.id(), instantiator_type_arguments.raw(),
+              type_class.id(),
+              static_cast<uword>(instantiator_type_arguments.raw()),
               instantiator_type_arguments.ToCString(),
-              function_type_arguments.raw(),
+              static_cast<uword>(function_type_arguments.raw()),
               function_type_arguments.ToCString());
         }
       },
@@ -1102,7 +1111,7 @@
   const Function& target_function =
       Function::Handle(receiver_class.GetInvocationDispatcher(
           target_name, arguments_descriptor,
-          RawFunction::kInvokeFieldDispatcher, FLAG_lazy_dispatchers));
+          FunctionLayout::kInvokeFieldDispatcher, FLAG_lazy_dispatchers));
   ASSERT(!target_function.IsNull() || !FLAG_lazy_dispatchers);
   if (FLAG_trace_ic) {
     OS::PrintErr(
@@ -1115,9 +1124,9 @@
 }
 
 // Handle other invocations (implicit closures, noSuchMethod).
-RawFunction* InlineCacheMissHelper(const Class& receiver_class,
-                                   const Array& args_descriptor,
-                                   const String& target_name) {
+FunctionPtr InlineCacheMissHelper(const Class& receiver_class,
+                                  const Array& args_descriptor,
+                                  const String& target_name) {
   // Handle noSuchMethod for dyn:methodName by getting a noSuchMethod dispatcher
   // (or a call-through getter for methodName).
   if (Function::IsDynamicInvocationForwarderName(target_name)) {
@@ -1132,8 +1141,8 @@
     ArgumentsDescriptor desc(args_descriptor);
     const Function& target_function =
         Function::Handle(receiver_class.GetInvocationDispatcher(
-            target_name, args_descriptor, RawFunction::kNoSuchMethodDispatcher,
-            FLAG_lazy_dispatchers));
+            target_name, args_descriptor,
+            FunctionLayout::kNoSuchMethodDispatcher, FLAG_lazy_dispatchers));
     if (FLAG_trace_ic) {
       OS::PrintErr(
           "NoSuchMethod IC miss: adding <%s> id:%" Pd " -> <%s>\n",
@@ -1245,9 +1254,9 @@
 }
 
 // Perform the subtype and return constant function based on the result.
-static RawFunction* ComputeTypeCheckTarget(const Instance& receiver,
-                                           const AbstractType& type,
-                                           const ArgumentsDescriptor& desc) {
+static FunctionPtr ComputeTypeCheckTarget(const Instance& receiver,
+                                          const AbstractType& type,
+                                          const ArgumentsDescriptor& desc) {
   const bool result = receiver.IsInstanceOf(type, Object::null_type_arguments(),
                                             Object::null_type_arguments());
   const ObjectStore* store = Isolate::Current()->object_store();
@@ -1258,7 +1267,7 @@
   return target.raw();
 }
 
-static RawFunction* InlineCacheMissHandler(
+static FunctionPtr InlineCacheMissHandler(
     const GrowableArray<const Instance*>& args,  // Checked arguments only.
     const ICData& ic_data,
     intptr_t count = 1) {
@@ -1502,10 +1511,10 @@
 }
 
 #if defined(DART_PRECOMPILED_RUNTIME)
-static RawUnlinkedCall* LoadUnlinkedCall(Zone* zone,
-                                         Isolate* isolate,
-                                         uword pc,
-                                         bool is_monomorphic_hit) {
+static UnlinkedCallPtr LoadUnlinkedCall(Zone* zone,
+                                        Isolate* isolate,
+                                        uword pc,
+                                        bool is_monomorphic_hit) {
   IsolateGroup* isolate_group = isolate->group();
   ASSERT(isolate_group->saved_unlinked_calls() != Array::null());
 
@@ -1546,9 +1555,9 @@
   void HandleMiss(const Object& old_data, const Code& old_target);
 
  private:
-  RawFunction* ResolveAndAddReceiverCheck(const String& name,
-                                          const Array& descriptor,
-                                          const ICData& ic_data);
+  FunctionPtr ResolveAndAddReceiverCheck(const String& name,
+                                         const Array& descriptor,
+                                         const ICData& ic_data);
   void DoUnlinkedCall(const UnlinkedCall& unlinked);
   bool CanExtendSingleTargetRange(const String& name,
                                   const Function& old_target,
@@ -1570,7 +1579,7 @@
   const Function& caller_function_;
 };
 
-RawFunction* SwitchableCallHandler::ResolveAndAddReceiverCheck(
+FunctionPtr SwitchableCallHandler::ResolveAndAddReceiverCheck(
     const String& name,
     const Array& descriptor,
     const ICData& ic_data) {
@@ -1691,13 +1700,13 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-static RawICData* FindICDataForInstanceCall(Zone* zone,
-                                            const Code& code,
-                                            uword pc) {
+static ICDataPtr FindICDataForInstanceCall(Zone* zone,
+                                           const Code& code,
+                                           uword pc) {
   uword pc_offset = pc - code.PayloadStart();
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(zone, code.pc_descriptors());
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kIcCall);
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kIcCall);
   intptr_t deopt_id = -1;
   while (iter.MoveNext()) {
     if (iter.PcOffset() == pc_offset) {
@@ -2235,8 +2244,8 @@
   const Array& orig_arguments = Array::CheckedHandle(zone, arguments.ArgAt(3));
 
   String& orig_function_name = String::Handle(zone);
-  if ((function.kind() == RawFunction::kClosureFunction) ||
-      (function.kind() == RawFunction::kImplicitClosureFunction)) {
+  if ((function.kind() == FunctionLayout::kClosureFunction) ||
+      (function.kind() == FunctionLayout::kImplicitClosureFunction)) {
     // For closure the function name is always 'call'. Replace it with the
     // name of the closurized function so that exception contains more
     // relevant information.
@@ -2600,10 +2609,10 @@
                              StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
   ASSERT(frame != NULL);
-  OS::PrintErr("IC call @%#" Px ": ICData: %p cnt:%" Pd " nchecks: %" Pd
-               " %s\n",
-               frame->pc(), ic_data.raw(), function.usage_counter(),
-               ic_data.NumberOfChecks(), function.ToFullyQualifiedCString());
+  OS::PrintErr(
+      "IC call @%#" Px ": ICData: %#" Px " cnt:%" Pd " nchecks: %" Pd " %s\n",
+      frame->pc(), static_cast<uword>(ic_data.raw()), function.usage_counter(),
+      ic_data.NumberOfChecks(), function.ToFullyQualifiedCString());
 }
 
 // This is called from interpreter when function usage counter reached
@@ -3247,27 +3256,20 @@
     true /* is_float */,
     reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&atan)));
 
-uword RuntimeEntry::InterpretCallEntry() {
-  uword entry = reinterpret_cast<uword>(RuntimeEntry::InterpretCall);
-#if defined(USING_SIMULATOR)
-  entry = Simulator::RedirectExternalReference(entry,
-                                               Simulator::kLeafRuntimeCall, 5);
-#endif
-  return entry;
-}
-
 // Interpret a function call. Should be called only for non-jitted functions.
 // argc indicates the number of arguments, including the type arguments.
 // argv points to the first argument.
 // If argc < 0, arguments are passed at decreasing memory addresses from argv.
-RawObject* RuntimeEntry::InterpretCall(RawFunction* function,
-                                       RawArray* argdesc,
-                                       intptr_t argc,
-                                       RawObject** argv,
-                                       Thread* thread) {
+extern "C" uword /*ObjectPtr*/ InterpretCall(uword /*FunctionPtr*/ function_in,
+                                             uword /*ArrayPtr*/ argdesc_in,
+                                             intptr_t argc,
+                                             ObjectPtr* argv,
+                                             Thread* thread) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
+  FunctionPtr function = static_cast<FunctionPtr>(function_in);
+  ArrayPtr argdesc = static_cast<ArrayPtr>(argdesc_in);
   ASSERT(FLAG_enable_interpreter);
   Interpreter* interpreter = Interpreter::Current();
 #if defined(DEBUG)
@@ -3283,11 +3285,11 @@
 #endif
   // Tell MemorySanitizer 'argv' is initialized by generated code.
   if (argc < 0) {
-    MSAN_UNPOISON(argv - argc, -argc * sizeof(RawObject*));
+    MSAN_UNPOISON(argv - argc, -argc * sizeof(ObjectPtr));
   } else {
-    MSAN_UNPOISON(argv, argc * sizeof(RawObject*));
+    MSAN_UNPOISON(argv, argc * sizeof(ObjectPtr));
   }
-  RawObject* result = interpreter->Call(function, argdesc, argc, argv, thread);
+  ObjectPtr result = interpreter->Call(function, argdesc, argc, argv, thread);
   DEBUG_ASSERT(thread->top_exit_frame_info() == exit_fp);
   if (IsErrorClassId(result->GetClassIdMayBeSmi())) {
     // Must not leak handles in the caller's zone.
@@ -3300,10 +3302,19 @@
     TransitionGeneratedToVM transition(thread);
     Exceptions::PropagateError(error);
   }
-  return result;
+  return static_cast<uword>(result);
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
+uword RuntimeEntry::InterpretCallEntry() {
+  uword entry = reinterpret_cast<uword>(InterpretCall);
+#if defined(USING_SIMULATOR)
+  entry = Simulator::RedirectExternalReference(entry,
+                                               Simulator::kLeafRuntimeCall, 5);
+#endif
+  return entry;
+}
+
 extern "C" void DFLRT_EnterSafepoint(NativeArguments __unusable_) {
   CHECK_STACK_ALIGNMENT;
   Thread* thread = Thread::Current();
diff --git a/runtime/vm/runtime_entry.h b/runtime/vm/runtime_entry.h
index 83d8a63..639cc8e 100644
--- a/runtime/vm/runtime_entry.h
+++ b/runtime/vm/runtime_entry.h
@@ -58,11 +58,6 @@
                                intptr_t argument_count) const);
 
   static uword InterpretCallEntry();
-  static RawObject* InterpretCall(RawFunction* function,
-                                  RawArray* argdesc,
-                                  intptr_t argc,
-                                  RawObject** argv,
-                                  Thread* thread);
 
  protected:
   NOT_IN_PRECOMPILED(static void CallInternal(const RuntimeEntry* runtime_entry,
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index e2773db..cf5ce11 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -57,15 +57,18 @@
   V(CompileInterpretedFunction)                                                \
   V(SwitchableCallMiss)
 
+// Note: Leaf runtime function have C linkage, so they cannot pass C++ struct
+// values like ObjectPtr.
+
 #define LEAF_RUNTIME_ENTRY_LIST(V)                                             \
   V(void, PrintStopMessage, const char*)                                       \
   V(intptr_t, DeoptimizeCopyFrame, uword, uword)                               \
   V(void, DeoptimizeFillFrame, uword)                                          \
   V(void, StoreBufferBlockProcess, Thread*)                                    \
   V(void, MarkingStackBlockProcess, Thread*)                                   \
-  V(void, RememberCard, RawObject*, RawObject**)                               \
-  V(RawObject*, AddAllocatedObjectToRememberedSet, RawObject* object,          \
-    Thread* thread)                                                            \
+  V(void, RememberCard, uword /*ObjectPtr*/, ObjectPtr*)                       \
+  V(uword /*ObjectPtr*/, AddAllocatedObjectToRememberedSet,                    \
+    uword /*ObjectPtr*/ object, Thread* thread)                                \
   V(double, LibcPow, double, double)                                           \
   V(double, DartModulo, double, double)                                        \
   V(double, LibcFloor, double)                                                 \
@@ -79,12 +82,12 @@
   V(double, LibcAsin, double)                                                  \
   V(double, LibcAtan, double)                                                  \
   V(double, LibcAtan2, double, double)                                         \
-  V(RawBool*, CaseInsensitiveCompareUCS2, RawString*, RawSmi*, RawSmi*,        \
-    RawSmi*)                                                                   \
-  V(RawBool*, CaseInsensitiveCompareUTF16, RawString*, RawSmi*, RawSmi*,       \
-    RawSmi*)                                                                   \
+  V(uword /*BoolPtr*/, CaseInsensitiveCompareUCS2, uword /*StringPtr*/,        \
+    uword /*SmiPtr*/, uword /*SmiPtr*/, uword /*SmiPtr*/)                      \
+  V(uword /*BoolPtr*/, CaseInsensitiveCompareUTF16, uword /*StringPtr*/,       \
+    uword /*SmiPtr*/, uword /*SmiPtr*/, uword /*SmiPtr*/)                      \
   V(void, EnterSafepoint)                                                      \
-  V(void, ExitSafepoint)                                                       \
+  V(void, ExitSafepoint)
 
 }  // namespace dart
 
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index 99273cb..ca297b7 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -334,7 +334,7 @@
   return str.CharAt(0) == ':';
 }
 
-RawLocalVarDescriptors* LocalScope::GetVarDescriptors(
+LocalVarDescriptorsPtr LocalScope::GetVarDescriptors(
     const Function& func,
     ZoneGrowableArray<intptr_t>* context_level_array) {
   LocalVarDescriptorsBuilder vars;
@@ -347,9 +347,9 @@
     ASSERT(func.IsLocalFunction());
     for (int i = 0; i < context_scope.num_variables(); i++) {
       String& name = String::Handle(context_scope.NameAt(i));
-      RawLocalVarDescriptors::VarInfoKind kind;
+      LocalVarDescriptorsLayout::VarInfoKind kind;
       if (!IsFilteredIdentifier(name)) {
-        kind = RawLocalVarDescriptors::kContextVar;
+        kind = LocalVarDescriptorsLayout::kContextVar;
       } else {
         continue;
       }
@@ -386,7 +386,7 @@
         // own context before calling a closure function.
         LocalVarDescriptorsBuilder::VarDesc desc;
         desc.name = &var->name();
-        desc.info.set_kind(RawLocalVarDescriptors::kSavedCurrentContext);
+        desc.info.set_kind(LocalVarDescriptorsLayout::kSavedCurrentContext);
         desc.info.scope_id = 0;
         desc.info.declaration_pos = TokenPosition::kMinSource;
         desc.info.begin_pos = TokenPosition::kMinSource;
@@ -398,12 +398,12 @@
         LocalVarDescriptorsBuilder::VarDesc desc;
         desc.name = &var->name();
         if (var->is_captured()) {
-          desc.info.set_kind(RawLocalVarDescriptors::kContextVar);
+          desc.info.set_kind(LocalVarDescriptorsLayout::kContextVar);
           ASSERT(var->owner() != NULL);
           ASSERT(var->owner()->context_level() >= 0);
           desc.info.scope_id = var->owner()->context_level();
         } else {
-          desc.info.set_kind(RawLocalVarDescriptors::kStackVar);
+          desc.info.set_kind(LocalVarDescriptorsLayout::kStackVar);
           desc.info.scope_id = *scope_id;
         }
         desc.info.set_index(var->index().value());
@@ -575,7 +575,7 @@
   return num_captured;
 }
 
-RawContextScope* LocalScope::PreserveOuterScope(
+ContextScopePtr LocalScope::PreserveOuterScope(
     int current_context_level) const {
   // Since code generation for nested functions is postponed until first
   // invocation, the function level of the closure scope can only be 1.
@@ -691,7 +691,7 @@
   }
 }
 
-RawContextScope* LocalScope::CreateImplicitClosureScope(const Function& func) {
+ContextScopePtr LocalScope::CreateImplicitClosureScope(const Function& func) {
   static const intptr_t kNumCapturedVars = 1;
 
   // Create a ContextScope with space for kNumCapturedVars descriptors.
@@ -760,7 +760,7 @@
 
     VarDesc desc;
     desc.name = &Symbols::Empty();  // No name.
-    desc.info.set_kind(RawLocalVarDescriptors::kContextLevel);
+    desc.info.set_kind(LocalVarDescriptorsLayout::kContextLevel);
     desc.info.scope_id = 0;
     desc.info.begin_pos = TokenPosition(start_deopt_id);
     desc.info.end_pos = TokenPosition(end_deopt_id);
@@ -771,7 +771,7 @@
   }
 }
 
-RawLocalVarDescriptors* LocalVarDescriptorsBuilder::Done() {
+LocalVarDescriptorsPtr LocalVarDescriptorsBuilder::Done() {
   if (vars_.is_empty()) {
     return Object::empty_var_descriptors().raw();
   }
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index a592cd6..6d6166f 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -237,7 +237,7 @@
  public:
   struct VarDesc {
     const String* name;
-    RawLocalVarDescriptors::VarInfo info;
+    LocalVarDescriptorsLayout::VarInfo info;
   };
 
   LocalVarDescriptorsBuilder() : vars_(8) {}
@@ -255,7 +255,7 @@
       ZoneGrowableArray<intptr_t>* context_level_array);
 
   // Finish building LocalVarDescriptor object.
-  RawLocalVarDescriptors* Done();
+  LocalVarDescriptorsPtr Done();
 
  private:
   GrowableArray<VarDesc> vars_;
@@ -462,13 +462,13 @@
 
   // Creates variable info for the scope and all its nested scopes.
   // Must be called after AllocateVariables() has been called.
-  RawLocalVarDescriptors* GetVarDescriptors(
+  LocalVarDescriptorsPtr GetVarDescriptors(
       const Function& func,
       ZoneGrowableArray<intptr_t>* context_level_array);
 
   // Create a ContextScope object describing all captured variables referenced
   // from this scope and belonging to outer scopes.
-  RawContextScope* PreserveOuterScope(int current_context_level) const;
+  ContextScopePtr PreserveOuterScope(int current_context_level) const;
 
   // Mark all local variables that are accessible from this scope up to
   // top_scope (included) as captured unless they are marked as forced to stack.
@@ -482,7 +482,7 @@
 
   // Create a ContextScope object which will capture "this" for an implicit
   // closure object.
-  static RawContextScope* CreateImplicitClosureScope(const Function& func);
+  static ContextScopePtr CreateImplicitClosureScope(const Function& func);
 
  private:
   // Allocate the variable in the current context, possibly updating the current
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 4abd3ec..fafe51d 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -172,7 +172,7 @@
   }
 }
 
-RawObject* Service::RequestAssets() {
+ObjectPtr Service::RequestAssets() {
   Thread* T = Thread::Current();
   Object& object = Object::Handle();
   {
@@ -223,11 +223,6 @@
                  param, js->LookupParam(param));
 }
 
-static void PrintIllegalParamError(JSONStream* js, const char* param) {
-  js->PrintError(kInvalidParams, "%s: illegal '%s' parameter: %s", js->method(),
-                 param, js->LookupParam(param));
-}
-
 static void PrintUnrecognizedMethodError(JSONStream* js) {
   js->PrintError(kMethodNotFound, NULL);
 }
@@ -420,7 +415,7 @@
   return class_table->IsValidIndex(cid) && class_table->HasValidClassAt(cid);
 }
 
-static RawClass* GetClassForId(Isolate* isolate, intptr_t cid) {
+static ClassPtr GetClassForId(Isolate* isolate, intptr_t cid) {
   ASSERT(isolate == Isolate::Current());
   ASSERT(isolate != NULL);
   ClassTable* class_table = isolate->class_table();
@@ -851,9 +846,9 @@
   js.PostReply();
 }
 
-RawError* Service::InvokeMethod(Isolate* I,
-                                const Array& msg,
-                                bool parameters_are_dart_objects) {
+ErrorPtr Service::InvokeMethod(Isolate* I,
+                               const Array& msg,
+                               bool parameters_are_dart_objects) {
   Thread* T = Thread::Current();
   ASSERT(I == T->isolate());
   ASSERT(I != NULL);
@@ -962,17 +957,17 @@
   }
 }
 
-RawError* Service::HandleRootMessage(const Array& msg_instance) {
+ErrorPtr Service::HandleRootMessage(const Array& msg_instance) {
   Isolate* isolate = Isolate::Current();
   return InvokeMethod(isolate, msg_instance);
 }
 
-RawError* Service::HandleObjectRootMessage(const Array& msg_instance) {
+ErrorPtr Service::HandleObjectRootMessage(const Array& msg_instance) {
   Isolate* isolate = Isolate::Current();
   return InvokeMethod(isolate, msg_instance, true);
 }
 
-RawError* Service::HandleIsolateMessage(Isolate* isolate, const Array& msg) {
+ErrorPtr Service::HandleIsolateMessage(Isolate* isolate, const Array& msg) {
   ASSERT(isolate != NULL);
   const Error& error = Error::Handle(InvokeMethod(isolate, msg));
   return MaybePause(isolate, error);
@@ -1668,9 +1663,9 @@
   }
 }
 
-static RawObject* LookupObjectId(Thread* thread,
-                                 const char* arg,
-                                 ObjectIdRing::LookupResult* kind) {
+static ObjectPtr LookupObjectId(Thread* thread,
+                                const char* arg,
+                                ObjectIdRing::LookupResult* kind) {
   *kind = ObjectIdRing::kValid;
   if (strncmp(arg, "int-", 4) == 0) {
     arg += 4;
@@ -1700,9 +1695,9 @@
   return ring->GetObjectForId(id, kind);
 }
 
-static RawObject* LookupHeapObjectLibraries(Isolate* isolate,
-                                            char** parts,
-                                            int num_parts) {
+static ObjectPtr LookupHeapObjectLibraries(Isolate* isolate,
+                                           char** parts,
+                                           int num_parts) {
   // Library ids look like "libraries/35"
   if (num_parts < 2) {
     return Object::sentinel().raw();
@@ -1766,9 +1761,9 @@
   return Object::sentinel().raw();
 }
 
-static RawObject* LookupHeapObjectClasses(Thread* thread,
-                                          char** parts,
-                                          int num_parts) {
+static ObjectPtr LookupHeapObjectClasses(Thread* thread,
+                                         char** parts,
+                                         int num_parts) {
   // Class ids look like: "classes/17"
   if (num_parts < 2) {
     return Object::sentinel().raw();
@@ -1888,9 +1883,9 @@
   return Object::sentinel().raw();
 }
 
-static RawObject* LookupHeapObjectTypeArguments(Thread* thread,
-                                                char** parts,
-                                                int num_parts) {
+static ObjectPtr LookupHeapObjectTypeArguments(Thread* thread,
+                                               char** parts,
+                                               int num_parts) {
   Isolate* isolate = thread->isolate();
   // TypeArguments ids look like: "typearguments/17"
   if (num_parts < 2) {
@@ -1911,9 +1906,9 @@
   return table.At(id);
 }
 
-static RawObject* LookupHeapObjectCode(Isolate* isolate,
-                                       char** parts,
-                                       int num_parts) {
+static ObjectPtr LookupHeapObjectCode(Isolate* isolate,
+                                      char** parts,
+                                      int num_parts) {
   if (num_parts != 2) {
     return Object::sentinel().raw();
   }
@@ -1963,9 +1958,9 @@
   return Object::sentinel().raw();
 }
 
-static RawObject* LookupHeapObjectMessage(Thread* thread,
-                                          char** parts,
-                                          int num_parts) {
+static ObjectPtr LookupHeapObjectMessage(Thread* thread,
+                                         char** parts,
+                                         int num_parts) {
   if (num_parts != 2) {
     return Object::sentinel().raw();
   }
@@ -1987,9 +1982,9 @@
   }
 }
 
-static RawObject* LookupHeapObject(Thread* thread,
-                                   const char* id_original,
-                                   ObjectIdRing::LookupResult* result) {
+static ObjectPtr LookupHeapObject(Thread* thread,
+                                  const char* id_original,
+                                  ObjectIdRing::LookupResult* result) {
   char* id = thread->zone()->MakeCopyOfString(id_original);
 
   // Parse the id by splitting at each '/'.
@@ -2202,7 +2197,7 @@
             slot_offset.Value() - (Array::element_offset(0) >> kWordSizeLog2);
         jselement.AddProperty("parentListIndex", element_index);
       } else if (element.IsLinkedHashMap()) {
-        map = static_cast<RawLinkedHashMap*>(path.At(i * 2));
+        map = static_cast<LinkedHashMapPtr>(path.At(i * 2));
         map_data = map.data();
         intptr_t element_index =
             slot_offset.Value() - (Array::element_offset(0) >> kWordSizeLog2);
@@ -2875,7 +2870,7 @@
     NULL,
 };
 
-RawExternalTypedData* DecodeKernelBuffer(const char* kernel_buffer_base64) {
+ExternalTypedDataPtr DecodeKernelBuffer(const char* kernel_buffer_base64) {
   intptr_t kernel_length;
   uint8_t* kernel_buffer = DecodeBase64(kernel_buffer_base64, &kernel_length);
   return ExternalTypedData::NewFinalizeWithFree(kernel_buffer, kernel_length);
@@ -3026,7 +3021,7 @@
       : cls_(cls), storage_(storage), limit_(limit), count_(0) {}
 
   virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
-    RawObject* raw_obj = it->Get();
+    ObjectPtr raw_obj = it->Get();
     if (raw_obj->IsPseudoObject()) {
       return kProceed;
     }
@@ -3254,7 +3249,7 @@
       BoolParameter::Parse(stream->LookupParam("pause"), false));
 }
 
-RawError* Service::MaybePause(Isolate* isolate, const Error& error) {
+ErrorPtr Service::MaybePause(Isolate* isolate, const Error& error) {
   // Don't pause twice.
   if (!isolate->IsPaused()) {
     if (isolate->should_pause_post_service_request()) {
@@ -3429,7 +3424,7 @@
   return true;
 }
 
-static RawClass* GetMetricsClass(Thread* thread) {
+static ClassPtr GetMetricsClass(Thread* thread) {
   Zone* zone = thread->zone();
   const Library& prof_lib = Library::Handle(zone, Library::DeveloperLibrary());
   ASSERT(!prof_lib.IsNull());
@@ -4625,13 +4620,6 @@
       BoolParameter::Parse(js->LookupParam("isDebuggable"), false);
   if (obj.IsLibrary()) {
     const Library& lib = Library::Cast(obj);
-    if (lib.is_dart_scheme()) {
-      const String& url = String::Handle(lib.url());
-      if (url.StartsWith(Symbols::DartSchemePrivate())) {
-        PrintIllegalParamError(js, "libraryId");
-        return true;
-      }
-    }
     lib.set_debuggable(is_debuggable);
     PrintSuccess(js);
     return true;
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index fdf87a4..4eedb96 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -10,11 +10,12 @@
 #include "vm/allocation.h"
 #include "vm/object_id_ring.h"
 #include "vm/os_thread.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 30
+#define SERVICE_PROTOCOL_MINOR_VERSION 32
 
 class Array;
 class EmbedderServiceHandler;
@@ -27,8 +28,6 @@
 class JSONStream;
 class JSONObject;
 class Object;
-class RawInstance;
-class RawError;
 class ServiceEvent;
 class String;
 
@@ -90,14 +89,14 @@
 class Service : public AllStatic {
  public:
   // Handles a message which is not directed to an isolate.
-  static RawError* HandleRootMessage(const Array& message);
+  static ErrorPtr HandleRootMessage(const Array& message);
 
   // Handles a message which is not directed to an isolate and also
   // expects the parameter keys and values to be actual dart objects.
-  static RawError* HandleObjectRootMessage(const Array& message);
+  static ErrorPtr HandleObjectRootMessage(const Array& message);
 
   // Handles a message which is directed to a particular isolate.
-  static RawError* HandleIsolateMessage(Isolate* isolate, const Array& message);
+  static ErrorPtr HandleIsolateMessage(Isolate* isolate, const Array& message);
 
   static void HandleEvent(ServiceEvent* event);
 
@@ -176,7 +175,7 @@
   static bool ListenStream(const char* stream_id);
   static void CancelStream(const char* stream_id);
 
-  static RawObject* RequestAssets();
+  static ObjectPtr RequestAssets();
 
   static Dart_ServiceStreamListenCallback stream_listen_callback() {
     return stream_listen_callback_;
@@ -206,9 +205,9 @@
   }
 
  private:
-  static RawError* InvokeMethod(Isolate* isolate,
-                                const Array& message,
-                                bool parameters_are_dart_objects = false);
+  static ErrorPtr InvokeMethod(Isolate* isolate,
+                               const Array& message,
+                               bool parameters_are_dart_objects = false);
 
   static void EmbedderHandleMessage(EmbedderServiceHandler* handler,
                                     JSONStream* js);
@@ -233,7 +232,7 @@
                         const char* kind,
                         JSONStream* event);
 
-  static RawError* MaybePause(Isolate* isolate, const Error& error);
+  static ErrorPtr MaybePause(Isolate* isolate, const Error& error);
 
   static EmbedderServiceHandler* isolate_service_handler_head_;
   static EmbedderServiceHandler* root_service_handler_head_;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 06bec8d..4f6fcb0 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.30
+# Dart VM Service Protocol 3.32
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.30_ of the Dart VM Service Protocol. This
+This document describes of _version 3.32_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -27,6 +27,7 @@
 - [IDs and Names](#ids-and-names)
 - [Versioning](#versioning)
 - [Private RPCs, Types, and Properties](#private-rpcs-types-and-properties)
+- [Single Client Mode](#single-client-mode)
 - [Public RPCs](#public-rpcs)
   - [addBreakpoint](#addbreakpoint)
   - [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
@@ -405,6 +406,17 @@
 implementation state and will never be appropriate to add to
 the public api.
 
+## Single Client Mode
+
+The VM service allows for an extended feature set via the Dart Development
+Service (DDS) that forward all core VM service RPCs described in this
+document to the true VM service.
+
+When DDS connects to the VM service, the VM service enters single client
+mode and will no longer accept incoming web socket connections. If DDS
+disconnects from the VM service, the VM service will once again start accepting
+incoming web socket connections.
+
 ## Public RPCs
 
 The following is a list of all public RPCs supported by the Service Protocol.
@@ -698,6 +710,20 @@
 If _isolateId_ refers to an isolate which has exited, then the
 _Collected_ [Sentinel](#sentinel) is returned.
 
+### getClassList
+
+```
+ClassList|Sentinel getClassList(string isolateId)
+```
+
+The _getClassList_ RPC is used to retrieve a _ClassList_ containing all
+classes for an isolate based on the isolate's _isolateId_.
+
+If _isolateId_ refers to an isolate which has exited, then the
+_Collected_ [Sentinel](#sentinel) is returned.
+
+See [ClassList](#classlist).
+
 ### getClientName
 
 ```
@@ -2135,18 +2161,18 @@
   Inspect,
 
   // Event from dart:developer.postEvent.
-  Extension
+  Extension,
 
   // Event from dart:developer.log.
-  Logging
+  Logging,
 
-   // Notification that a Service has been registered into the Service Protocol
+  // Notification that a Service has been registered into the Service Protocol
   // from another client.
   ServiceRegistered,
 
   // Notification that a Service has been removed from the Service Protocol
   // from another client.
-  ServiceUnregistered
+  ServiceUnregistered,
 }
 ```
 
@@ -3727,5 +3753,8 @@
 3.28 | TODO(aam): document changes from 3.28
 3.29 | Add `getClientName`, `setClientName`, `requireResumeApproval`
 3.30 | Updated return types of RPCs which require an `isolateId` to allow for `Sentinel` results if the target isolate has shutdown.
+3.31 | Added single client mode, which allows for the Dart Development Service (DDS) to become the sole client of
+the VM service.
+3.32 | Added `getClassList` RPC and `ClassList` object.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index 59aaf47..8b6e61a 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -48,9 +48,9 @@
 
 #define VM_SERVICE_METHOD_CALL_FROM_NATIVE 5
 
-static RawArray* MakeServiceControlMessage(Dart_Port port_id,
-                                           intptr_t code,
-                                           const String& name) {
+static ArrayPtr MakeServiceControlMessage(Dart_Port port_id,
+                                          intptr_t code,
+                                          const String& name) {
   const Array& list = Array::Handle(Array::New(4));
   ASSERT(!list.IsNull());
   const Integer& code_int = Integer::Handle(Integer::New(code));
@@ -63,9 +63,9 @@
   return list.raw();
 }
 
-static RawArray* MakeServerControlMessage(const SendPort& sp,
-                                          intptr_t code,
-                                          bool enable = false) {
+static ArrayPtr MakeServerControlMessage(const SendPort& sp,
+                                         intptr_t code,
+                                         bool enable = false) {
   const Array& list = Array::Handle(Array::New(3));
   ASSERT(!list.IsNull());
   list.SetAt(0, Integer::Handle(Integer::New(code)));
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 47f6060..11fb555 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -77,7 +77,7 @@
   char* _msg;
 };
 
-static RawArray* Eval(Dart_Handle lib, const char* expr) {
+static ArrayPtr Eval(Dart_Handle lib, const char* expr) {
   const String& dummy_isolate_id = String::Handle(String::New("isolateId"));
   Dart_Handle expr_val;
   {
@@ -103,7 +103,7 @@
   return result.raw();
 }
 
-static RawArray* EvalF(Dart_Handle lib, const char* fmt, ...) {
+static ArrayPtr EvalF(Dart_Handle lib, const char* fmt, ...) {
   va_list args;
   va_start(args, fmt);
   intptr_t len = Utils::VSNPrint(NULL, 0, fmt, args);
@@ -118,14 +118,14 @@
   return Eval(lib, buffer);
 }
 
-static RawFunction* GetFunction(const Class& cls, const char* name) {
+static FunctionPtr GetFunction(const Class& cls, const char* name) {
   const Function& result = Function::Handle(
       cls.LookupDynamicFunction(String::Handle(String::New(name))));
   EXPECT(!result.IsNull());
   return result.raw();
 }
 
-static RawClass* GetClass(const Library& lib, const char* name) {
+static ClassPtr GetClass(const Library& lib, const char* name) {
   const Class& cls = Class::Handle(
       lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name))));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 4410cfb..5ceb7e4 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -230,7 +230,7 @@
   uword pc_offset = pc - code.PayloadStart();
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
   while (iter.MoveNext()) {
     if (iter.PcOffset() == pc_offset) {
       return iter.TokenPos();
@@ -480,8 +480,7 @@
             if (Isolate::Current()->heap()->Contains(value)) {
               OS::PrintErr("%s: \n", arg1);
 #if defined(DEBUG)
-              const Object& obj =
-                  Object::Handle(reinterpret_cast<RawObject*>(value));
+              const Object& obj = Object::Handle(static_cast<ObjectPtr>(value));
               obj.Print();
 #endif  // defined(DEBUG)
             } else {
@@ -1394,8 +1393,8 @@
           ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
           arguments.thread_ = reinterpret_cast<Thread*>(get_register(R0));
           arguments.argc_tag_ = get_register(R1);
-          arguments.argv_ = reinterpret_cast<RawObject**>(get_register(R2));
-          arguments.retval_ = reinterpret_cast<RawObject**>(get_register(R3));
+          arguments.argv_ = reinterpret_cast<ObjectPtr*>(get_register(R2));
+          arguments.retval_ = reinterpret_cast<ObjectPtr*>(get_register(R3));
           SimulatorRuntimeCall target =
               reinterpret_cast<SimulatorRuntimeCall>(external);
           target(arguments);
@@ -3646,7 +3645,7 @@
   int32_t code =
       *reinterpret_cast<int32_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
   int32_t pp = (FLAG_precompiled_mode && FLAG_use_bare_instructions)
-                   ? reinterpret_cast<int32_t>(thread->global_object_pool())
+                   ? static_cast<int32_t>(thread->global_object_pool())
                    : *reinterpret_cast<int32_t*>(
                          (code + Code::object_pool_offset() - kHeapObjectTag));
 
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 8f269b2..a682fb7 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -22,7 +22,6 @@
 
 class Isolate;
 class Mutex;
-class RawObject;
 class SimulatorSetjmpBuffer;
 class Thread;
 
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 3ab2750..312c12f 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -258,7 +258,7 @@
   uword pc_offset = pc - code.PayloadStart();
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
   while (iter.MoveNext()) {
     if (iter.PcOffset() == pc_offset) {
       return iter.TokenPos();
@@ -538,8 +538,7 @@
             if (Isolate::Current()->heap()->Contains(value)) {
               OS::PrintErr("%s: \n", arg1);
 #if defined(DEBUG)
-              const Object& obj =
-                  Object::Handle(reinterpret_cast<RawObject*>(value));
+              const Object& obj = Object::Handle(static_cast<ObjectPtr>(value));
               obj.Print();
 #endif  // defined(DEBUG)
             } else {
@@ -3585,7 +3584,7 @@
   int64_t code =
       *reinterpret_cast<int64_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
   int64_t pp = (FLAG_precompiled_mode && FLAG_use_bare_instructions)
-                   ? reinterpret_cast<int64_t>(thread->global_object_pool())
+                   ? static_cast<int64_t>(thread->global_object_pool())
                    : *reinterpret_cast<int64_t*>(
                          code + Code::object_pool_offset() - kHeapObjectTag);
   pp -= kHeapObjectTag;  // In the PP register, the pool pointer is untagged.
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index 6663e32..3d00d23 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -22,7 +22,6 @@
 
 class Isolate;
 class Mutex;
-class RawObject;
 class SimulatorSetjmpBuffer;
 class Thread;
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index a8dbaee..7f100bb 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -34,7 +34,7 @@
   // Check if this is a singleton object class which is shared by all isolates.
   return ((class_id >= kClassCid && class_id <= kUnwindErrorCid) ||
           (class_id == kTypeArgumentsCid) ||
-          (class_id >= kNullCid && class_id <= kNeverCid));
+          (class_id >= kNullCid && class_id <= kVoidCid));
 }
 
 static bool IsBootstrapedClassId(intptr_t class_id) {
@@ -45,7 +45,7 @@
           IsStringClassId(class_id) || IsTypedDataClassId(class_id) ||
           IsExternalTypedDataClassId(class_id) ||
           IsTypedDataViewClassId(class_id) || class_id == kNullCid ||
-          class_id == kTransferableTypedDataCid);
+          class_id == kNeverCid || class_id == kTransferableTypedDataCid);
 }
 
 static bool IsObjectStoreTypeId(intptr_t index) {
@@ -75,7 +75,7 @@
   return (class_id + kClassIdsOffset);
 }
 
-static RawObject* GetType(ObjectStore* object_store, intptr_t index) {
+static ObjectPtr GetType(ObjectStore* object_store, intptr_t index) {
   switch (index) {
     case kLegacyObjectType:
       return object_store->legacy_object_type();
@@ -83,6 +83,8 @@
       return object_store->nullable_object_type();
     case kNullType:
       return object_store->null_type();
+    case kNeverType:
+      return object_store->never_type();
     case kLegacyFunctionType:
       return object_store->legacy_function_type();
     case kLegacyNumberType:
@@ -150,11 +152,13 @@
 }
 
 static intptr_t GetTypeIndex(ObjectStore* object_store,
-                             const RawObject* raw_type) {
+                             const ObjectPtr raw_type) {
   if (raw_type == object_store->legacy_object_type()) {
     return kLegacyObjectType;
   } else if (raw_type == object_store->null_type()) {
     return kNullType;
+  } else if (raw_type == object_store->never_type()) {
+    return kNeverType;
   } else if (raw_type == object_store->legacy_function_type()) {
     return kLegacyFunctionType;
   } else if (raw_type == object_store->legacy_number_type()) {
@@ -254,9 +258,9 @@
   return snapshot;
 }
 
-RawSmi* BaseReader::ReadAsSmi() {
-  RawSmi* value = Read<RawSmi*>();
-  ASSERT((reinterpret_cast<uword>(value) & kSmiTagMask) == kSmiTag);
+SmiPtr BaseReader::ReadAsSmi() {
+  SmiPtr value = Read<SmiPtr>();
+  ASSERT((static_cast<uword>(value) & kSmiTagMask) == kSmiTag);
   return value;
 }
 
@@ -305,7 +309,7 @@
       types_to_postprocess_(GrowableObjectArray::Handle(zone_)),
       objects_to_rehash_(GrowableObjectArray::Handle(zone_)) {}
 
-RawObject* SnapshotReader::ReadObject() {
+ObjectPtr SnapshotReader::ReadObject() {
   // Setup for long jump in case there is an exception while reading.
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
@@ -361,7 +365,7 @@
   objects_to_rehash_.Add(map);
 }
 
-RawObject* SnapshotReader::RunDelayedRehashingOfMaps() {
+ObjectPtr SnapshotReader::RunDelayedRehashingOfMaps() {
   if (objects_to_rehash_.Length() > 0) {
     const Library& collections_lib =
         Library::Handle(zone_, Library::CollectionLibrary());
@@ -378,7 +382,7 @@
   return Object::null();
 }
 
-RawClass* SnapshotReader::ReadClassId(intptr_t object_id) {
+ClassPtr SnapshotReader::ReadClassId(intptr_t object_id) {
   ASSERT(!Snapshot::IsFull(kind_));
   // Read the class header information and lookup the class.
   intptr_t class_header = Read<int32_t>();
@@ -410,8 +414,8 @@
   return cls.raw();
 }
 
-RawObject* SnapshotReader::ReadStaticImplicitClosure(intptr_t object_id,
-                                                     intptr_t class_header) {
+ObjectPtr SnapshotReader::ReadStaticImplicitClosure(intptr_t object_id,
+                                                    intptr_t class_header) {
   ASSERT(!Snapshot::IsFull(kind_));
 
   // First create a function object and associate it with the specified
@@ -478,7 +482,7 @@
   thread()->long_jump_base()->Jump(1, error);
 }
 
-RawObject* SnapshotReader::VmIsolateSnapshotObject(intptr_t index) const {
+ObjectPtr SnapshotReader::VmIsolateSnapshotObject(intptr_t index) const {
   return Object::vm_isolate_snapshot_object_table().At(index);
 }
 
@@ -486,7 +490,7 @@
   return isolate() == Dart::vm_isolate();
 }
 
-RawObject* SnapshotReader::ReadObjectImpl(bool as_reference) {
+ObjectPtr SnapshotReader::ReadObjectImpl(bool as_reference) {
   int64_t header_value = Read<int64_t>();
   if ((header_value & kSmiTagMask) == kSmiTag) {
     return NewInteger(header_value);
@@ -495,8 +499,8 @@
   return ReadObjectImpl(static_cast<intptr_t>(header_value), as_reference);
 }
 
-RawObject* SnapshotReader::ReadObjectImpl(intptr_t header_value,
-                                          bool as_reference) {
+ObjectPtr SnapshotReader::ReadObjectImpl(intptr_t header_value,
+                                         bool as_reference) {
   if (IsVMIsolateObject(header_value)) {
     return ReadVMIsolateObject(header_value);
   }
@@ -512,7 +516,7 @@
   // Read the class header information.
   intptr_t class_header = Read<int32_t>();
   intptr_t tags = ReadTags();
-  bool read_as_reference = as_reference && !RawObject::IsCanonical(tags);
+  bool read_as_reference = as_reference && !ObjectLayout::IsCanonical(tags);
   intptr_t header_id = SerializedHeaderData::decode(class_header);
   if (header_id == kInstanceObjectId) {
     return ReadInstance(object_id, tags, read_as_reference);
@@ -536,7 +540,7 @@
 #define SNAPSHOT_READ(clazz) case kTypedData##clazz##Cid:
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
-      tags = RawObject::ClassIdTag::update(class_id, tags);
+      tags = ObjectLayout::ClassIdTag::update(class_id, tags);
       pobj_ =
           TypedData::ReadFrom(this, object_id, tags, kind_, read_as_reference);
       break;
@@ -545,7 +549,7 @@
 #define SNAPSHOT_READ(clazz) case kExternalTypedData##clazz##Cid:
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
-      tags = RawObject::ClassIdTag::update(class_id, tags);
+      tags = ObjectLayout::ClassIdTag::update(class_id, tags);
       pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_, true);
       break;
     }
@@ -554,7 +558,7 @@
 
     case kByteDataViewCid:
       CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
-        tags = RawObject::ClassIdTag::update(class_id, tags);
+        tags = ObjectLayout::ClassIdTag::update(class_id, tags);
         pobj_ = TypedDataView::ReadFrom(this, object_id, tags, kind_, true);
         break;
       }
@@ -574,9 +578,9 @@
   objects_to_rehash_.Add(set);
 }
 
-RawObject* SnapshotReader::ReadInstance(intptr_t object_id,
-                                        intptr_t tags,
-                                        bool as_reference) {
+ObjectPtr SnapshotReader::ReadInstance(intptr_t object_id,
+                                       intptr_t tags,
+                                       bool as_reference) {
   // Object is regular dart instance.
   intptr_t instance_size = 0;
   Instance* result = NULL;
@@ -615,7 +619,7 @@
     ASSERT(next_field_offset > 0);
     // Instance::NextFieldOffset() returns the offset of the first field in
     // a Dart object.
-    bool read_as_reference = RawObject::IsCanonical(tags) ? false : true;
+    bool read_as_reference = ObjectLayout::IsCanonical(tags) ? false : true;
     intptr_t offset = Instance::NextFieldOffset();
     intptr_t result_cid = result->GetClassId();
 
@@ -651,7 +655,7 @@
       }
       offset += kWordSize;
     }
-    if (RawObject::IsCanonical(tags)) {
+    if (ObjectLayout::IsCanonical(tags)) {
       const char* error_str = NULL;
       *result = result->CheckAndCanonicalize(thread(), &error_str);
       if (error_str != NULL) {
@@ -685,7 +689,7 @@
   return NULL;
 }
 
-RawApiError* SnapshotReader::VerifyVersionAndFeatures(Isolate* isolate) {
+ApiErrorPtr SnapshotReader::VerifyVersionAndFeatures(Isolate* isolate) {
   // If the version string doesn't match, return an error.
   // Note: New things are allocated only if we're going to return an error.
 
@@ -751,7 +755,7 @@
   return ApiError::null();
 }
 
-RawObject* SnapshotReader::NewInteger(int64_t value) {
+ObjectPtr SnapshotReader::NewInteger(int64_t value) {
   ASSERT((value & kSmiTagMask) == kSmiTag);
   value = value >> kSmiTagShift;
   if (Smi::IsValid(value)) {
@@ -779,7 +783,7 @@
     return obj;                                                                \
   }
 
-RawObject* SnapshotReader::ReadVMIsolateObject(intptr_t header_value) {
+ObjectPtr SnapshotReader::ReadVMIsolateObject(intptr_t header_value) {
   intptr_t object_id = GetVMIsolateObjectId(header_value);
 
   // First check if it is one of the singleton objects.
@@ -791,7 +795,6 @@
   READ_VM_SINGLETON_OBJ(kZeroArrayObject, Object::zero_array().raw());
   READ_VM_SINGLETON_OBJ(kDynamicType, Object::dynamic_type().raw());
   READ_VM_SINGLETON_OBJ(kVoidType, Object::void_type().raw());
-  READ_VM_SINGLETON_OBJ(kNeverType, Object::never_type().raw());
   READ_VM_SINGLETON_OBJ(kEmptyTypeArguments,
                         Object::empty_type_arguments().raw());
   READ_VM_SINGLETON_OBJ(kTrueValue, Bool::True().raw());
@@ -839,7 +842,7 @@
   return Symbols::GetPredefinedSymbol(object_id);  // return VM symbol.
 }
 
-RawObject* SnapshotReader::ReadIndexedObject(intptr_t object_id) {
+ObjectPtr SnapshotReader::ReadIndexedObject(intptr_t object_id) {
   intptr_t class_id = ClassIdFromObjectId(object_id);
   if (IsBootstrapedClassId(class_id)) {
     return isolate()->class_table()->At(class_id);  // get singleton class.
@@ -863,7 +866,7 @@
   *TypeArgumentsHandle() ^= ReadObjectImpl(kAsInlinedObject);
   result.SetTypeArguments(*TypeArgumentsHandle());
 
-  bool as_reference = RawObject::IsCanonical(tags) ? false : true;
+  bool as_reference = ObjectLayout::IsCanonical(tags) ? false : true;
   for (intptr_t i = 0; i < len; i++) {
     *PassiveObjectHandle() = ReadObjectImpl(as_reference);
     result.SetAt(i, *PassiveObjectHandle());
@@ -901,16 +904,20 @@
   ASSERT(forward_list_ != NULL);
 }
 
-void SnapshotWriter::WriteObject(RawObject* rawobj) {
+void SnapshotWriter::WriteObject(ObjectPtr rawobj) {
   WriteObjectImpl(rawobj, kAsInlinedObject);
   WriteForwardedObjects();
 }
 
-uint32_t SnapshotWriter::GetObjectTags(RawObject* raw) {
+uint32_t SnapshotWriter::GetObjectTags(ObjectPtr raw) {
   return raw->ptr()->tags_;
 }
 
-uword SnapshotWriter::GetObjectTagsAndHash(RawObject* raw) {
+uint32_t SnapshotWriter::GetObjectTags(ObjectLayout* raw) {
+  return raw->tags_;
+}
+
+uword SnapshotWriter::GetObjectTagsAndHash(ObjectPtr raw) {
   uword result = raw->ptr()->tags_;
 #if defined(HASH_IN_OBJECT_HEADER)
   result |= static_cast<uword>(raw->ptr()->hash_) << 32;
@@ -928,8 +935,8 @@
 #define VM_OBJECT_WRITE(clazz)                                                 \
   case clazz::kClassId: {                                                      \
     object_id = forward_list_->AddObject(zone(), rawobj, kIsSerialized);       \
-    Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(rawobj);               \
-    raw_obj->WriteTo(this, object_id, kind(), false);                          \
+    clazz##Ptr raw_obj = static_cast<clazz##Ptr>(rawobj);                      \
+    raw_obj->ptr()->WriteTo(this, object_id, kind(), false);                   \
     return true;                                                               \
   }
 
@@ -939,7 +946,7 @@
     return true;                                                               \
   }
 
-bool SnapshotWriter::HandleVMIsolateObject(RawObject* rawobj) {
+bool SnapshotWriter::HandleVMIsolateObject(ObjectPtr rawobj) {
   // Check if it is one of the singleton VM objects.
   WRITE_VM_SINGLETON_OBJ(Object::null(), kNullObject);
   WRITE_VM_SINGLETON_OBJ(Object::sentinel().raw(), kSentinelObject);
@@ -949,7 +956,6 @@
   WRITE_VM_SINGLETON_OBJ(Object::zero_array().raw(), kZeroArrayObject);
   WRITE_VM_SINGLETON_OBJ(Object::dynamic_type().raw(), kDynamicType);
   WRITE_VM_SINGLETON_OBJ(Object::void_type().raw(), kVoidType);
-  WRITE_VM_SINGLETON_OBJ(Object::never_type().raw(), kNeverType);
   WRITE_VM_SINGLETON_OBJ(Object::empty_type_arguments().raw(),
                          kEmptyTypeArguments);
   WRITE_VM_SINGLETON_OBJ(Bool::True().raw(), kTrueValue);
@@ -971,7 +977,7 @@
   // all isolates.
   intptr_t id = rawobj->GetClassId();
   if (id == kClassCid) {
-    RawClass* raw_class = reinterpret_cast<RawClass*>(rawobj);
+    ClassPtr raw_class = static_cast<ClassPtr>(rawobj);
     intptr_t class_id = raw_class->ptr()->id_;
     if (IsSingletonClassId(class_id)) {
       intptr_t object_id = ObjectIdFromClassId(class_id);
@@ -1005,7 +1011,7 @@
     return true;
   } else {
     // We do this check down here, because it's quite expensive.
-    if (!rawobj->InVMIsolateHeap()) {
+    if (!rawobj->ptr()->InVMIsolateHeap()) {
       return false;
     }
 
@@ -1013,8 +1019,8 @@
       VM_OBJECT_CLASS_LIST(VM_OBJECT_WRITE)
       case kTypedDataUint32ArrayCid: {
         object_id = forward_list_->AddObject(zone(), rawobj, kIsSerialized);
-        RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(rawobj);
-        raw_obj->WriteTo(this, object_id, kind(), false);
+        TypedDataPtr raw_obj = static_cast<TypedDataPtr>(rawobj);
+        raw_obj->ptr()->WriteTo(this, object_id, kind(), false);
         return true;
       }
       default:
@@ -1046,7 +1052,7 @@
 }
 
 intptr_t ForwardList::AddObject(Zone* zone,
-                                RawObject* raw,
+                                ObjectPtr raw,
                                 SerializeState state) {
   NoSafepointScope no_safepoint;
   intptr_t object_id = next_object_id();
@@ -1060,14 +1066,14 @@
   return object_id;
 }
 
-intptr_t ForwardList::FindObject(RawObject* raw) {
+intptr_t ForwardList::FindObject(ObjectPtr raw) {
   NoSafepointScope no_safepoint;
   intptr_t id = GetObjectId(raw);
   ASSERT(id == 0 || NodeForObjectId(id)->obj()->raw() == raw);
   return (id == 0) ? static_cast<intptr_t>(kInvalidIndex) : id;
 }
 
-void ForwardList::SetObjectId(RawObject* object, intptr_t id) {
+void ForwardList::SetObjectId(ObjectPtr object, intptr_t id) {
   if (object->IsNewObject()) {
     isolate()->forward_table_new()->SetValueExclusive(object, id);
   } else {
@@ -1075,7 +1081,7 @@
   }
 }
 
-intptr_t ForwardList::GetObjectId(RawObject* object) {
+intptr_t ForwardList::GetObjectId(ObjectPtr object) {
   if (object->IsNewObject()) {
     return isolate()->forward_table_new()->GetValueExclusive(object);
   } else {
@@ -1083,7 +1089,7 @@
   }
 }
 
-bool SnapshotWriter::CheckAndWritePredefinedObject(RawObject* rawobj) {
+bool SnapshotWriter::CheckAndWritePredefinedObject(ObjectPtr rawobj) {
   // Check if object can be written in one of the following ways:
   // - Smi: the Smi value is written as is (last bit is not tagged).
   // - VM internal class (from VM isolate): (index of class in vm isolate | 0x3)
@@ -1093,7 +1099,7 @@
 
   // First check if it is a Smi (i.e not a heap object).
   if (!rawobj->IsHeapObject()) {
-    Write<int64_t>(reinterpret_cast<intptr_t>(rawobj));
+    Write<int64_t>(static_cast<intptr_t>(rawobj));
     return true;
   }
 
@@ -1101,7 +1107,7 @@
 
   if ((kind_ == Snapshot::kMessage) && (cid == kDoubleCid)) {
     WriteVMIsolateObject(kDoubleObject);
-    RawDouble* rd = reinterpret_cast<RawDouble*>(rawobj);
+    DoublePtr rd = static_cast<DoublePtr>(rawobj);
     WriteDouble(rd->ptr()->value_);
     return true;
   }
@@ -1131,7 +1137,7 @@
   // or a predefined internal VM class in the object store.
   // Check if it is an internal VM class which is in the object store.
   if (cid == kClassCid) {
-    RawClass* raw_class = reinterpret_cast<RawClass*>(rawobj);
+    ClassPtr raw_class = static_cast<ClassPtr>(rawobj);
     intptr_t class_id = raw_class->ptr()->id_;
     if (IsBootstrapedClassId(class_id)) {
       intptr_t object_id = ObjectIdFromClassId(class_id);
@@ -1150,7 +1156,7 @@
   return false;
 }
 
-void SnapshotWriter::WriteObjectImpl(RawObject* raw, bool as_reference) {
+void SnapshotWriter::WriteObjectImpl(ObjectPtr raw, bool as_reference) {
   // First check if object can be written as a simple predefined type.
   if (CheckAndWritePredefinedObject(raw)) {
     return;
@@ -1158,7 +1164,7 @@
 
   // When we know that we are dealing with leaf or shallow objects we write
   // these objects inline even when 'as_reference' is true.
-  const bool write_as_reference = as_reference && !raw->IsCanonical();
+  const bool write_as_reference = as_reference && !raw->ptr()->IsCanonical();
   uintptr_t tags = GetObjectTagsAndHash(raw);
 
   // Add object to the forward ref list and mark it so that future references
@@ -1178,14 +1184,14 @@
   WriteMarkedObjectImpl(raw, tags, object_id, write_as_reference);
 }
 
-void SnapshotWriter::WriteMarkedObjectImpl(RawObject* raw,
+void SnapshotWriter::WriteMarkedObjectImpl(ObjectPtr raw,
                                            intptr_t tags,
                                            intptr_t object_id,
                                            bool as_reference) {
   NoSafepointScope no_safepoint;
-  RawClass* cls = class_table_->At(RawObject::ClassIdTag::decode(tags));
+  ClassPtr cls = class_table_->At(ObjectLayout::ClassIdTag::decode(tags));
   intptr_t class_id = cls->ptr()->id_;
-  ASSERT(class_id == RawObject::ClassIdTag::decode(tags));
+  ASSERT(class_id == ObjectLayout::ClassIdTag::decode(tags));
   if (class_id >= kNumPredefinedCids || IsImplicitFieldClassId(class_id)) {
     WriteInstance(raw, cls, tags, object_id, as_reference);
     return;
@@ -1193,8 +1199,8 @@
   switch (class_id) {
 #define SNAPSHOT_WRITE(clazz)                                                  \
   case clazz::kClassId: {                                                      \
-    Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(raw);                  \
-    raw_obj->WriteTo(this, object_id, kind_, as_reference);                    \
+    clazz##Ptr raw_obj = static_cast<clazz##Ptr>(raw);                         \
+    raw_obj->ptr()->WriteTo(this, object_id, kind_, as_reference);             \
     return;                                                                    \
   }
 
@@ -1203,17 +1209,16 @@
 #define SNAPSHOT_WRITE(clazz) case kTypedData##clazz##Cid:
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) {
-      RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(raw);
-      raw_obj->WriteTo(this, object_id, kind_, as_reference);
+      TypedDataPtr raw_obj = static_cast<TypedDataPtr>(raw);
+      raw_obj->ptr()->WriteTo(this, object_id, kind_, as_reference);
       return;
     }
 #undef SNAPSHOT_WRITE
 #define SNAPSHOT_WRITE(clazz) case kExternalTypedData##clazz##Cid:
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) {
-      RawExternalTypedData* raw_obj =
-          reinterpret_cast<RawExternalTypedData*>(raw);
-      raw_obj->WriteTo(this, object_id, kind_, as_reference);
+      ExternalTypedDataPtr raw_obj = static_cast<ExternalTypedDataPtr>(raw);
+      raw_obj->ptr()->WriteTo(this, object_id, kind_, as_reference);
       return;
     }
 #undef SNAPSHOT_WRITE
@@ -1221,8 +1226,8 @@
 
     case kByteDataViewCid:
       CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) {
-        auto* raw_obj = reinterpret_cast<RawTypedDataView*>(raw);
-        raw_obj->WriteTo(this, object_id, kind_, as_reference);
+        auto raw_obj = static_cast<TypedDataViewPtr>(raw);
+        raw_obj->ptr()->WriteTo(this, object_id, kind_, as_reference);
         return;
       }
 #undef SNAPSHOT_WRITE
@@ -1249,10 +1254,10 @@
   explicit WriteInlinedObjectVisitor(SnapshotWriter* writer)
       : writer_(writer) {}
 
-  virtual void VisitObject(RawObject* obj) {
+  virtual void VisitObject(ObjectPtr obj) {
     intptr_t object_id = writer_->forward_list_->FindObject(obj);
     ASSERT(object_id != kInvalidIndex);
-    intptr_t tags = MessageWriter::GetObjectTagsAndHash(obj);
+    intptr_t tags = MessageWriter::GetObjectTagsAndHash(ObjectPtr(obj));
     writer_->WriteMarkedObjectImpl(obj, tags, object_id, kAsInlinedObject);
   }
 
@@ -1280,7 +1285,7 @@
        ++id) {
     if (!NodeForObjectId(id)->is_serialized()) {
       // Write the object out in the stream.
-      RawObject* raw = NodeForObjectId(id)->obj()->raw();
+      ObjectPtr raw = NodeForObjectId(id)->obj()->raw();
       writer->VisitObject(raw);
 
       // Mark object as serialized.
@@ -1290,20 +1295,20 @@
   first_unprocessed_object_id_ = next_object_id();
 }
 
-void SnapshotWriter::WriteClassId(RawClass* cls) {
+void SnapshotWriter::WriteClassId(ClassLayout* cls) {
   ASSERT(!Snapshot::IsFull(kind_));
   int class_id = cls->ptr()->id_;
   ASSERT(!IsSingletonClassId(class_id) && !IsBootstrapedClassId(class_id));
 
   // Write out the library url and class name.
-  RawLibrary* library = cls->ptr()->library_;
+  LibraryPtr library = cls->ptr()->library_;
   ASSERT(library != Library::null());
   WriteObjectImpl(library->ptr()->url_, kAsInlinedObject);
   WriteObjectImpl(cls->ptr()->name_, kAsInlinedObject);
 }
 
 void SnapshotWriter::WriteStaticImplicitClosure(intptr_t object_id,
-                                                RawFunction* func,
+                                                FunctionPtr func,
                                                 intptr_t tags) {
   // Write out the serialization header value for this object.
   WriteInlinedObjectHeader(object_id);
@@ -1315,9 +1320,9 @@
   WriteTags(tags);
 
   // Write out the library url, class name and signature function name.
-  RawClass* cls = GetFunctionOwner(func);
+  ClassPtr cls = GetFunctionOwner(func);
   ASSERT(cls != Class::null());
-  RawLibrary* library = cls->ptr()->library_;
+  LibraryPtr library = cls->ptr()->library_;
   ASSERT(library != Library::null());
   WriteObjectImpl(library->ptr()->url_, kAsInlinedObject);
   WriteObjectImpl(cls->ptr()->name_, kAsInlinedObject);
@@ -1327,9 +1332,9 @@
 void SnapshotWriter::ArrayWriteTo(intptr_t object_id,
                                   intptr_t array_kind,
                                   intptr_t tags,
-                                  RawSmi* length,
-                                  RawTypeArguments* type_arguments,
-                                  RawObject* data[],
+                                  SmiPtr length,
+                                  TypeArgumentsPtr type_arguments,
+                                  ObjectPtr data[],
                                   bool as_reference) {
   if (as_reference) {
     // Write out the serialization header value for this object.
@@ -1340,7 +1345,7 @@
     WriteTags(tags);
 
     // Write out the length field.
-    Write<RawObject*>(length);
+    Write<ObjectPtr>(length);
   } else {
     intptr_t len = Smi::Value(length);
 
@@ -1352,23 +1357,23 @@
     WriteTags(tags);
 
     // Write out the length field.
-    Write<RawObject*>(length);
+    Write<ObjectPtr>(length);
 
     // Write out the type arguments.
     WriteObjectImpl(type_arguments, kAsInlinedObject);
 
     // Write out the individual object ids.
-    bool write_as_reference = RawObject::IsCanonical(tags) ? false : true;
+    bool write_as_reference = ObjectLayout::IsCanonical(tags) ? false : true;
     for (intptr_t i = 0; i < len; i++) {
       WriteObjectImpl(data[i], write_as_reference);
     }
   }
 }
 
-RawFunction* SnapshotWriter::IsSerializableClosure(RawClosure* closure) {
+FunctionPtr SnapshotWriter::IsSerializableClosure(ClosurePtr closure) {
   // Extract the function object to check if this closure
   // can be sent in an isolate message.
-  RawFunction* func = closure->ptr()->function_;
+  FunctionPtr func = closure->ptr()->function_;
   // We only allow closure of top level methods or static functions in a
   // class to be sent in isolate messages.
   if (can_send_any_object() &&
@@ -1391,18 +1396,18 @@
   return Function::null();
 }
 
-RawClass* SnapshotWriter::GetFunctionOwner(RawFunction* func) {
-  RawObject* owner = func->ptr()->owner_;
+ClassPtr SnapshotWriter::GetFunctionOwner(FunctionPtr func) {
+  ObjectPtr owner = func->ptr()->owner_;
   uint32_t tags = GetObjectTags(owner);
-  intptr_t class_id = RawObject::ClassIdTag::decode(tags);
+  intptr_t class_id = ObjectLayout::ClassIdTag::decode(tags);
   if (class_id == kClassCid) {
-    return reinterpret_cast<RawClass*>(owner);
+    return static_cast<ClassPtr>(owner);
   }
   ASSERT(class_id == kPatchClassCid);
-  return reinterpret_cast<RawPatchClass*>(owner)->ptr()->patched_class_;
+  return static_cast<PatchClassPtr>(owner)->ptr()->patched_class_;
 }
 
-void SnapshotWriter::CheckForNativeFields(RawClass* cls) {
+void SnapshotWriter::CheckForNativeFields(ClassPtr cls) {
   if (cls->ptr()->num_native_fields_ != 0) {
     // We do not allow objects with native fields in an isolate message.
     HANDLESCOPE(thread());
@@ -1423,12 +1428,12 @@
   thread()->long_jump_base()->Jump(1, Object::snapshot_writer_error());
 }
 
-void SnapshotWriter::WriteInstance(RawObject* raw,
-                                   RawClass* cls,
+void SnapshotWriter::WriteInstance(ObjectPtr raw,
+                                   ClassPtr cls,
                                    intptr_t tags,
                                    intptr_t object_id,
                                    bool as_reference) {
-  // Closure instances are handled by RawClosure::WriteTo().
+  // Closure instances are handled by ClosureLayout::WriteTo().
   ASSERT(!Class::IsClosureClass(cls));
 
   // Check if the instance has native fields and throw an exception if it does.
@@ -1469,7 +1474,7 @@
     // Write out all the fields for the object.
     // Instance::NextFieldOffset() returns the offset of the first field in
     // a Dart object.
-    bool write_as_reference = RawObject::IsCanonical(tags) ? false : true;
+    bool write_as_reference = ObjectLayout::IsCanonical(tags) ? false : true;
 
     intptr_t offset = Instance::NextFieldOffset();
     while (offset < next_field_offset) {
@@ -1479,7 +1484,7 @@
             reinterpret_cast<uword>(raw->ptr()) + offset);
         WriteWordWith32BitWrites(value);
       } else {
-        RawObject* raw_obj = *reinterpret_cast<RawObject**>(
+        ObjectPtr raw_obj = *reinterpret_cast<ObjectPtr*>(
             reinterpret_cast<uword>(raw->ptr()) + offset);
         WriteObjectImpl(raw_obj, write_as_reference);
       }
@@ -1489,13 +1494,13 @@
   return;
 }
 
-bool SnapshotWriter::AllowObjectsInDartLibrary(RawLibrary* library) {
+bool SnapshotWriter::AllowObjectsInDartLibrary(LibraryPtr library) {
   return (library == object_store()->collection_library() ||
           library == object_store()->core_library() ||
           library == object_store()->typed_data_library());
 }
 
-intptr_t SnapshotWriter::FindVmSnapshotObject(RawObject* rawobj) {
+intptr_t SnapshotWriter::FindVmSnapshotObject(ObjectPtr rawobj) {
   intptr_t length = Object::vm_isolate_snapshot_object_table().Length();
   for (intptr_t i = 0; i < length; i++) {
     if (Object::vm_isolate_snapshot_object_table().At(i) == rawobj) {
@@ -1509,7 +1514,7 @@
                                     const char* msg) {
   {
     NoSafepointScope no_safepoint;
-    RawError* error = thread()->StealStickyError();
+    ErrorPtr error = thread()->StealStickyError();
     ASSERT(error == Object::snapshot_writer_error().raw());
   }
 
@@ -1539,11 +1544,11 @@
   free(const_cast<char*>(expected_features));
 }
 
-void SnapshotWriterVisitor::VisitPointers(RawObject** first, RawObject** last) {
+void SnapshotWriterVisitor::VisitPointers(ObjectPtr* first, ObjectPtr* last) {
   ASSERT(Utils::IsAligned(first, sizeof(*first)));
   ASSERT(Utils::IsAligned(last, sizeof(*last)));
-  for (RawObject** current = first; current <= last; current++) {
-    RawObject* raw_obj = *current;
+  for (ObjectPtr* current = first; current <= last; current++) {
+    ObjectPtr raw_obj = *current;
     writer_->WriteObjectImpl(raw_obj, as_references_);
   }
 }
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index ba40148..cb43fc2 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -43,61 +43,6 @@
 class MegamorphicCache;
 class PageSpace;
 class TypedDataView;
-class RawApiError;
-class RawArray;
-class RawCapability;
-class RawClass;
-class RawClosure;
-class RawClosureData;
-class RawCodeSourceMap;
-class RawCompressedStackMaps;
-class RawContext;
-class RawContextScope;
-class RawDouble;
-class RawExceptionHandlers;
-class RawFfiTrampolineData;
-class RawField;
-class RawFloat32x4;
-class RawFloat64x2;
-class RawFunction;
-class RawGrowableObjectArray;
-class RawCallSiteData;
-class RawICData;
-class RawImmutableArray;
-class RawInstructions;
-class RawInt32x4;
-class RawRegExp;
-class RawLanguageError;
-class RawLibrary;
-class RawLibraryPrefix;
-class RawLinkedHashMap;
-class RawLocalVarDescriptors;
-class RawMegamorphicCache;
-class RawMint;
-class RawNamespace;
-class RawObject;
-class RawObjectPool;
-class RawOneByteString;
-class RawPatchClass;
-class RawPcDescriptors;
-class RawReceivePort;
-class RawRedirectionData;
-class RawNativeEntryData;
-class RawScript;
-class RawSignatureData;
-class RawSendPort;
-class RawSmi;
-class RawStackTrace;
-class RawSubtypeTestCache;
-class RawTwoByteString;
-class RawType;
-class RawTypeArguments;
-class RawTypedData;
-class RawTypedDataView;
-class RawTypeParameter;
-class RawTypeRef;
-class RawUnhandledException;
-class RawWeakProperty;
 class String;
 class TypeArguments;
 class TypedData;
@@ -261,7 +206,7 @@
 
   intptr_t PendingBytes() const { return stream_.PendingBytes(); }
 
-  RawSmi* ReadAsSmi();
+  SmiPtr ReadAsSmi();
   intptr_t ReadSmiValue();
 
   // Negative header value indicates VM isolate object id.
@@ -325,7 +270,7 @@
   Snapshot::Kind kind() const { return kind_; }
 
   // Reads an object.
-  RawObject* ReadObject();
+  ObjectPtr ReadObject();
 
   // Add object to backward references.
   void AddBackRef(intptr_t id, Object* obj, DeserializeState state);
@@ -334,9 +279,9 @@
   Object* GetBackRef(intptr_t id);
 
   // Read version number of snapshot and verify.
-  RawApiError* VerifyVersionAndFeatures(Isolate* isolate);
+  ApiErrorPtr VerifyVersionAndFeatures(Isolate* isolate);
 
-  RawObject* NewInteger(int64_t value);
+  ObjectPtr NewInteger(int64_t value);
 
  protected:
   SnapshotReader(const uint8_t* buffer,
@@ -358,24 +303,24 @@
 
   void EnqueueRehashingOfMap(const LinkedHashMap& map);
   void EnqueueRehashingOfSet(const Object& set);
-  RawObject* RunDelayedRehashingOfMaps();
+  ObjectPtr RunDelayedRehashingOfMaps();
 
-  RawClass* ReadClassId(intptr_t object_id);
-  RawObject* ReadStaticImplicitClosure(intptr_t object_id, intptr_t cls_header);
+  ClassPtr ReadClassId(intptr_t object_id);
+  ObjectPtr ReadStaticImplicitClosure(intptr_t object_id, intptr_t cls_header);
 
   // Implementation to read an object.
-  RawObject* ReadObjectImpl(bool as_reference);
-  RawObject* ReadObjectImpl(intptr_t header, bool as_reference);
+  ObjectPtr ReadObjectImpl(bool as_reference);
+  ObjectPtr ReadObjectImpl(intptr_t header, bool as_reference);
 
   // Read a Dart Instance object.
-  RawObject* ReadInstance(intptr_t object_id, intptr_t tags, bool as_reference);
+  ObjectPtr ReadInstance(intptr_t object_id, intptr_t tags, bool as_reference);
 
   // Read a VM isolate object that was serialized as an Id.
-  RawObject* ReadVMIsolateObject(intptr_t object_id);
+  ObjectPtr ReadVMIsolateObject(intptr_t object_id);
 
   // Read an object that was serialized as an Id (singleton in object store,
   // or an object that was already serialized before).
-  RawObject* ReadIndexedObject(intptr_t object_id);
+  ObjectPtr ReadIndexedObject(intptr_t object_id);
 
   // Decode class id from the header field.
   intptr_t LookupInternalClass(intptr_t class_header);
@@ -389,7 +334,7 @@
 
   void SetReadException(const char* msg);
 
-  RawObject* VmIsolateSnapshotObject(intptr_t index) const;
+  ObjectPtr VmIsolateSnapshotObject(intptr_t index) const;
 
   bool is_vm_isolate() const;
 
@@ -599,10 +544,10 @@
   }
 
   // Returns the id for the added object.
-  intptr_t AddObject(Zone* zone, RawObject* raw, SerializeState state);
+  intptr_t AddObject(Zone* zone, ObjectPtr raw, SerializeState state);
 
   // Returns the id for the object it it exists in the list.
-  intptr_t FindObject(RawObject* raw);
+  intptr_t FindObject(ObjectPtr raw);
 
   // Exhaustively processes all unserialized objects in this list. 'writer' may
   // concurrently add more objects.
@@ -623,8 +568,8 @@
   GrowableArray<Node*> nodes_;
   intptr_t first_unprocessed_object_id_;
 
-  void SetObjectId(RawObject* object, intptr_t id);
-  intptr_t GetObjectId(RawObject* object);
+  void SetObjectId(ObjectPtr object, intptr_t id);
+  intptr_t GetObjectId(ObjectPtr object);
 
   DISALLOW_COPY_AND_ASSIGN(ForwardList);
 };
@@ -648,10 +593,11 @@
   Heap* heap() const { return isolate()->heap(); }
 
   // Serialize an object into the buffer.
-  void WriteObject(RawObject* raw);
+  void WriteObject(ObjectPtr raw);
 
-  static uint32_t GetObjectTags(RawObject* raw);
-  static uword GetObjectTagsAndHash(RawObject* raw);
+  static uint32_t GetObjectTags(ObjectPtr raw);
+  static uint32_t GetObjectTags(ObjectLayout* raw);
+  static uword GetObjectTagsAndHash(ObjectPtr raw);
 
   Exceptions::ExceptionType exception_type() const { return exception_type_; }
   void set_exception_type(Exceptions::ExceptionType type) {
@@ -665,19 +611,19 @@
   // Write a version string for the snapshot.
   void WriteVersionAndFeatures();
 
-  RawFunction* IsSerializableClosure(RawClosure* closure);
+  FunctionPtr IsSerializableClosure(ClosurePtr closure);
 
   void WriteStaticImplicitClosure(intptr_t object_id,
-                                  RawFunction* func,
+                                  FunctionPtr func,
                                   intptr_t tags);
 
  protected:
-  bool CheckAndWritePredefinedObject(RawObject* raw);
-  bool HandleVMIsolateObject(RawObject* raw);
+  bool CheckAndWritePredefinedObject(ObjectPtr raw);
+  bool HandleVMIsolateObject(ObjectPtr raw);
 
-  void WriteClassId(RawClass* cls);
-  void WriteObjectImpl(RawObject* raw, bool as_reference);
-  void WriteMarkedObjectImpl(RawObject* raw,
+  void WriteClassId(ClassLayout* cls);
+  void WriteObjectImpl(ObjectPtr raw, bool as_reference);
+  void WriteMarkedObjectImpl(ObjectPtr raw,
                              intptr_t tags,
                              intptr_t object_id,
                              bool as_reference);
@@ -685,20 +631,20 @@
   void ArrayWriteTo(intptr_t object_id,
                     intptr_t array_kind,
                     intptr_t tags,
-                    RawSmi* length,
-                    RawTypeArguments* type_arguments,
-                    RawObject* data[],
+                    SmiPtr length,
+                    TypeArgumentsPtr type_arguments,
+                    ObjectPtr data[],
                     bool as_reference);
-  RawClass* GetFunctionOwner(RawFunction* func);
-  void CheckForNativeFields(RawClass* cls);
+  ClassPtr GetFunctionOwner(FunctionPtr func);
+  void CheckForNativeFields(ClassPtr cls);
   void SetWriteException(Exceptions::ExceptionType type, const char* msg);
-  void WriteInstance(RawObject* raw,
-                     RawClass* cls,
+  void WriteInstance(ObjectPtr raw,
+                     ClassPtr cls,
                      intptr_t tags,
                      intptr_t object_id,
                      bool as_reference);
-  bool AllowObjectsInDartLibrary(RawLibrary* library);
-  intptr_t FindVmSnapshotObject(RawObject* rawobj);
+  bool AllowObjectsInDartLibrary(LibraryPtr library);
+  intptr_t FindVmSnapshotObject(ObjectPtr rawobj);
 
   ObjectStore* object_store() const { return object_store_; }
 
@@ -712,37 +658,37 @@
   const char* exception_msg_;  // Message associated with exception.
   bool can_send_any_object_;   // True if any Dart instance can be sent.
 
-  friend class RawArray;
-  friend class RawClass;
-  friend class RawClosureData;
-  friend class RawCode;
-  friend class RawContextScope;
-  friend class RawDynamicLibrary;
-  friend class RawExceptionHandlers;
-  friend class RawField;
-  friend class RawFunction;
-  friend class RawGrowableObjectArray;
-  friend class RawImmutableArray;
-  friend class RawInstructions;
-  friend class RawLibrary;
-  friend class RawLinkedHashMap;
-  friend class RawLocalVarDescriptors;
-  friend class RawMirrorReference;
-  friend class RawObjectPool;
-  friend class RawPointer;
-  friend class RawReceivePort;
-  friend class RawRegExp;
-  friend class RawScript;
-  friend class RawStackTrace;
-  friend class RawSubtypeTestCache;
-  friend class RawTransferableTypedData;
-  friend class RawType;
-  friend class RawTypeArguments;
-  friend class RawTypeParameter;
-  friend class RawTypeRef;
-  friend class RawTypedDataView;
-  friend class RawUserTag;
-  friend class RawWeakSerializationReference;
+  friend class ArrayLayout;
+  friend class ClassLayout;
+  friend class ClosureDataLayout;
+  friend class CodeLayout;
+  friend class ContextScopeLayout;
+  friend class DynamicLibraryLayout;
+  friend class ExceptionHandlersLayout;
+  friend class FieldLayout;
+  friend class FunctionLayout;
+  friend class GrowableObjectArrayLayout;
+  friend class ImmutableArrayLayout;
+  friend class InstructionsLayout;
+  friend class LibraryLayout;
+  friend class LinkedHashMapLayout;
+  friend class LocalVarDescriptorsLayout;
+  friend class MirrorReferenceLayout;
+  friend class ObjectPoolLayout;
+  friend class PointerLayout;
+  friend class ReceivePortLayout;
+  friend class RegExpLayout;
+  friend class ScriptLayout;
+  friend class StackTraceLayout;
+  friend class SubtypeTestCacheLayout;
+  friend class TransferableTypedDataLayout;
+  friend class TypeLayout;
+  friend class TypeArgumentsLayout;
+  friend class TypeParameterLayout;
+  friend class TypeRefLayout;
+  friend class TypedDataViewLayout;
+  friend class UserTagLayout;
+  friend class WeakSerializationReferenceLayout;
   friend class SnapshotWriterVisitor;
   friend class WriteInlinedObjectVisitor;
   DISALLOW_COPY_AND_ASSIGN(SnapshotWriter);
@@ -791,7 +737,7 @@
         writer_(writer),
         as_references_(as_references) {}
 
-  virtual void VisitPointers(RawObject** first, RawObject** last);
+  virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last);
 
  private:
   SnapshotWriter* writer_;
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index 61505e1..4f5dcec 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -92,14 +92,14 @@
   if (func.ForceOptimize()) return true;
 
   switch (func.kind()) {
-    case RawFunction::kRegularFunction:
-    case RawFunction::kClosureFunction:
-    case RawFunction::kImplicitClosureFunction:
-    case RawFunction::kImplicitStaticGetter:
-    case RawFunction::kFieldInitializer:
-    case RawFunction::kGetterFunction:
-    case RawFunction::kSetterFunction:
-    case RawFunction::kConstructor:
+    case FunctionLayout::kRegularFunction:
+    case FunctionLayout::kClosureFunction:
+    case FunctionLayout::kImplicitClosureFunction:
+    case FunctionLayout::kImplicitStaticGetter:
+    case FunctionLayout::kFieldInitializer:
+    case FunctionLayout::kGetterFunction:
+    case FunctionLayout::kSetterFunction:
+    case FunctionLayout::kConstructor:
       break;
     default:
       return true;
@@ -215,7 +215,7 @@
 
   PcDescriptors::Iterator iter(
       descriptors,
-      RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall);
+      PcDescriptorsLayout::kIcCall | PcDescriptorsLayout::kUnoptStaticCall);
   while (iter.MoveNext()) {
     HANDLESCOPE(thread());
     ASSERT(iter.DeoptId() < ic_data_array->length());
@@ -266,7 +266,7 @@
 
   PcDescriptors::Iterator iter(
       descriptors,
-      RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall);
+      PcDescriptorsLayout::kIcCall | PcDescriptorsLayout::kUnoptStaticCall);
   while (iter.MoveNext()) {
     HANDLESCOPE(thread());
     ASSERT(iter.DeoptId() < ic_data_array->length());
@@ -360,8 +360,8 @@
     }
   } else {
     const uint8_t kSafepointKind =
-        (RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall |
-         RawPcDescriptors::kRuntimeCall);
+        (PcDescriptorsLayout::kIcCall | PcDescriptorsLayout::kUnoptStaticCall |
+         PcDescriptorsLayout::kRuntimeCall);
 
     const PcDescriptors& descriptors =
         PcDescriptors::Handle(zone(), code.pc_descriptors());
@@ -572,7 +572,7 @@
     for (int i = 0; i < functions.Length(); i++) {
       func ^= functions.At(i);
       // Skip getter functions of static const field.
-      if (func.kind() == RawFunction::kImplicitStaticGetter) {
+      if (func.kind() == FunctionLayout::kImplicitStaticGetter) {
         field ^= func.accessor_field();
         if (field.is_const() && field.is_static()) {
           continue;
diff --git a/runtime/vm/source_report_test.cc b/runtime/vm/source_report_test.cc
index 0187da5..44ae5e1 100644
--- a/runtime/vm/source_report_test.cc
+++ b/runtime/vm/source_report_test.cc
@@ -10,7 +10,7 @@
 
 #ifndef PRODUCT
 
-static RawObject* ExecuteScript(const char* script, bool allow_errors = false) {
+static ObjectPtr ExecuteScript(const char* script, bool allow_errors = false) {
   Dart_Handle lib;
   {
     TransitionVMToNative transition(Thread::Current());
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 04309fe..a073259 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -106,28 +106,17 @@
 #endif
 }
 
-Isolate* StackFrame::IsolateOfBareInstructionsFrame(bool needed_for_gc) const {
-  Isolate* isolate = Dart::vm_isolate();
-  if (isolate->object_store()->code_order_table() != Object::null()) {
-    auto rct = isolate->reverse_pc_lookup_cache();
-    if (rct->Contains(pc())) return isolate;
+IsolateGroup* StackFrame::IsolateGroupOfBareInstructionsFrame() const {
+  IsolateGroup* isolate_group = Dart::vm_isolate()->group();
+  if (isolate_group->object_store()->code_order_table() != Object::null()) {
+    auto rct = isolate_group->reverse_pc_lookup_cache();
+    if (rct->Contains(pc())) return isolate_group;
   }
 
-  isolate = this->isolate();
-  // The active isolate is null only during GC, in which case it does not matter
-  // which isolate we use for the reverse-pc lookup table, since the metadata
-  // is the same across all isolates.
-  // TODO(dartbug.com/36097): Avoid having the [ReversePcLookupTable]
-  // per-isolate.  Right now we still need it per-isolate for non-GC cases, e.g.
-  // for stack walking code which relies on finding owner functions of code
-  // objects.
-  if (isolate == nullptr) {
-    ASSERT(needed_for_gc);
-    isolate = isolate_group()->isolates_.First();
-  }
-  if (isolate->object_store()->code_order_table() != Object::null()) {
-    auto rct = isolate->reverse_pc_lookup_cache();
-    if (rct->Contains(pc())) return isolate;
+  isolate_group = this->isolate_group();
+  if (isolate_group->object_store()->code_order_table() != Object::null()) {
+    auto rct = isolate_group->reverse_pc_lookup_cache();
+    if (rct->Contains(pc())) return isolate_group;
   }
 
   return nullptr;
@@ -136,9 +125,9 @@
 bool StackFrame::IsBareInstructionsDartFrame() const {
   NoSafepointScope no_safepoint;
 
-  if (auto isolate = IsolateOfBareInstructionsFrame(/*needed_for_gc=*/true)) {
+  if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
     Code code;
-    auto rct = isolate->reverse_pc_lookup_cache();
+    auto rct = isolate_group->reverse_pc_lookup_cache();
     code = rct->Lookup(pc(), /*is_return_address=*/true);
 
     auto const cid = code.OwnerClassId();
@@ -151,9 +140,9 @@
 bool StackFrame::IsBareInstructionsStubFrame() const {
   NoSafepointScope no_safepoint;
 
-  if (auto isolate = IsolateOfBareInstructionsFrame(/*needed_for_gc=*/true)) {
+  if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
     Code code;
-    auto rct = isolate->reverse_pc_lookup_cache();
+    auto rct = isolate_group->reverse_pc_lookup_cache();
     code = rct->Lookup(pc(), /*is_return_address=*/true);
 
     auto const cid = code.OwnerClassId();
@@ -163,7 +152,7 @@
   return false;
 }
 
-bool StackFrame::IsStubFrame(bool needed_for_gc) const {
+bool StackFrame::IsStubFrame() const {
   if (is_interpreted()) {
     return false;
   }
@@ -179,7 +168,7 @@
   NoSafepointScope no_safepoint;
 #endif
 
-  RawCode* code = GetCodeObject(needed_for_gc);
+  CodePtr code = GetCodeObject();
   ASSERT(code != Object::null());
   auto const cid = Code::OwnerClassIdOf(code);
   ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
@@ -222,12 +211,12 @@
   ASSERT(visitor != NULL);
   // Visit pc marker and saved pool pointer, or, for interpreted frame, code
   // object and function object.
-  RawObject** last_fixed =
-      reinterpret_cast<RawObject**>(fp()) +
+  ObjectPtr* last_fixed =
+      reinterpret_cast<ObjectPtr*>(fp()) +
       (is_interpreted() ? kKBCLastFixedObjectSlotFromFp
                         : runtime_frame_layout.first_object_from_fp);
-  RawObject** first_fixed =
-      reinterpret_cast<RawObject**>(fp()) +
+  ObjectPtr* first_fixed =
+      reinterpret_cast<ObjectPtr*>(fp()) +
       (is_interpreted() ? kKBCFirstObjectSlotFromFp
                         : runtime_frame_layout.last_fixed_object_from_fp);
   if (first_fixed <= last_fixed) {
@@ -241,12 +230,12 @@
 void EntryFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
   // Visit objects between SP and (FP - callee_save_area).
-  RawObject** first = is_interpreted() ? reinterpret_cast<RawObject**>(fp()) +
-                                             kKBCSavedArgDescSlotFromEntryFp
-                                       : reinterpret_cast<RawObject**>(sp());
-  RawObject** last = is_interpreted() ? reinterpret_cast<RawObject**>(sp())
-                                      : reinterpret_cast<RawObject**>(fp()) +
-                                            kExitLinkSlotFromEntryFp - 1;
+  ObjectPtr* first = is_interpreted() ? reinterpret_cast<ObjectPtr*>(fp()) +
+                                            kKBCSavedArgDescSlotFromEntryFp
+                                      : reinterpret_cast<ObjectPtr*>(sp());
+  ObjectPtr* last = is_interpreted() ? reinterpret_cast<ObjectPtr*>(sp())
+                                     : reinterpret_cast<ObjectPtr*>(fp()) +
+                                           kExitLinkSlotFromEntryFp - 1;
   // There may not be any pointer to visit; in this case, first > last.
   visitor->VisitPointers(first, last);
 }
@@ -262,11 +251,11 @@
   NoSafepointScope no_safepoint;
   Code code;
 
-  if (auto isolate = IsolateOfBareInstructionsFrame(/*needed_for_gc=*/true)) {
-    auto const rct = isolate->reverse_pc_lookup_cache();
+  if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
+    auto const rct = isolate_group->reverse_pc_lookup_cache();
     code = rct->Lookup(pc(), /*is_return_address=*/true);
   } else {
-    RawObject* pc_marker = *(reinterpret_cast<RawObject**>(
+    ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
         fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
                                   : runtime_frame_layout.code_from_fp) *
                 kWordSize)));
@@ -305,8 +294,8 @@
       if (is_interpreted()) {
         UNIMPLEMENTED();
       }
-      RawObject** first = reinterpret_cast<RawObject**>(sp());
-      RawObject** last = reinterpret_cast<RawObject**>(
+      ObjectPtr* first = reinterpret_cast<ObjectPtr*>(sp());
+      ObjectPtr* last = reinterpret_cast<ObjectPtr*>(
           fp() + (runtime_frame_layout.first_local_from_fp * kWordSize));
 
       // A stack map is present in the code object, use the stack map to
@@ -344,9 +333,9 @@
       visitor->VisitPointers(first, last);
 
       // Now visit other slots which might be part of the calling convention.
-      first = reinterpret_cast<RawObject**>(
+      first = reinterpret_cast<ObjectPtr*>(
           fp() + ((runtime_frame_layout.first_local_from_fp + 1) * kWordSize));
-      last = reinterpret_cast<RawObject**>(
+      last = reinterpret_cast<ObjectPtr*>(
           fp() + (runtime_frame_layout.first_object_from_fp * kWordSize));
       visitor->VisitPointers(first, last);
       return;
@@ -364,16 +353,16 @@
   // between the first and last included are tagged objects.
   if (is_interpreted()) {
     // Do not visit caller's pc or caller's fp.
-    RawObject** first =
-        reinterpret_cast<RawObject**>(fp()) + kKBCFirstObjectSlotFromFp;
-    RawObject** last =
-        reinterpret_cast<RawObject**>(fp()) + kKBCLastFixedObjectSlotFromFp;
+    ObjectPtr* first =
+        reinterpret_cast<ObjectPtr*>(fp()) + kKBCFirstObjectSlotFromFp;
+    ObjectPtr* last =
+        reinterpret_cast<ObjectPtr*>(fp()) + kKBCLastFixedObjectSlotFromFp;
 
     visitor->VisitPointers(first, last);
   }
-  RawObject** first =
-      reinterpret_cast<RawObject**>(is_interpreted() ? fp() : sp());
-  RawObject** last = reinterpret_cast<RawObject**>(
+  ObjectPtr* first =
+      reinterpret_cast<ObjectPtr*>(is_interpreted() ? fp() : sp());
+  ObjectPtr* last = reinterpret_cast<ObjectPtr*>(
       is_interpreted()
           ? sp()
           : fp() + (runtime_frame_layout.first_object_from_fp * kWordSize));
@@ -381,13 +370,13 @@
   visitor->VisitPointers(first, last);
 }
 
-RawFunction* StackFrame::LookupDartFunction() const {
+FunctionPtr StackFrame::LookupDartFunction() const {
   if (is_interpreted()) {
-    RawObject* result = *(reinterpret_cast<RawFunction**>(
+    ObjectPtr result = *(reinterpret_cast<FunctionPtr*>(
         fp() + kKBCFunctionSlotFromFp * kWordSize));
     ASSERT((result == Object::null()) ||
            (result->GetClassId() == kFunctionCid));
-    return reinterpret_cast<RawFunction*>(result);
+    return static_cast<FunctionPtr>(result);
   }
   const Code& code = Code::Handle(LookupDartCode());
   if (!code.IsNull()) {
@@ -396,7 +385,7 @@
   return Function::null();
 }
 
-RawCode* StackFrame::LookupDartCode() const {
+CodePtr StackFrame::LookupDartCode() const {
 // We add a no gc scope to ensure that the code below does not trigger
 // a GC as we are handling raw object references here. It is possible
 // that the code is called while a GC is in progress, that is ok.
@@ -405,33 +394,33 @@
   // where Thread::Current() is NULL, so we cannot create a NoSafepointScope.
   NoSafepointScope no_safepoint;
 #endif
-  if (auto isolate = IsolateOfBareInstructionsFrame(/*needed_for_gc=*/false)) {
-    auto const rct = isolate->reverse_pc_lookup_cache();
+  if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
+    auto const rct = isolate_group->reverse_pc_lookup_cache();
     return rct->Lookup(pc(), /*is_return_address=*/true);
   }
 
-  RawCode* code = GetCodeObject();
+  CodePtr code = GetCodeObject();
   if ((code != Code::null()) && Code::OwnerClassIdOf(code) == kFunctionCid) {
     return code;
   }
   return Code::null();
 }
 
-RawCode* StackFrame::GetCodeObject(bool needed_for_gc) const {
+CodePtr StackFrame::GetCodeObject() const {
   ASSERT(!is_interpreted());
-  if (auto isolate = IsolateOfBareInstructionsFrame(needed_for_gc)) {
-    auto const rct = isolate->reverse_pc_lookup_cache();
+  if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
+    auto const rct = isolate_group->reverse_pc_lookup_cache();
     return rct->Lookup(pc(), /*is_return_address=*/true);
   } else {
-    RawObject* pc_marker = *(reinterpret_cast<RawObject**>(
+    ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
         fp() + runtime_frame_layout.code_from_fp * kWordSize));
     ASSERT((pc_marker == Object::null()) ||
            (pc_marker->GetClassId() == kCodeCid));
-    return reinterpret_cast<RawCode*>(pc_marker);
+    return static_cast<CodePtr>(pc_marker);
   }
 }
 
-RawBytecode* StackFrame::LookupDartBytecode() const {
+BytecodePtr StackFrame::LookupDartBytecode() const {
 // We add a no gc scope to ensure that the code below does not trigger
 // a GC as we are handling raw object references here. It is possible
 // that the code is called while a GC is in progress, that is ok.
@@ -443,13 +432,13 @@
   return GetBytecodeObject();
 }
 
-RawBytecode* StackFrame::GetBytecodeObject() const {
+BytecodePtr StackFrame::GetBytecodeObject() const {
   ASSERT(is_interpreted());
-  RawObject* pc_marker = *(
-      reinterpret_cast<RawObject**>(fp() + kKBCPcMarkerSlotFromFp * kWordSize));
+  ObjectPtr pc_marker = *(
+      reinterpret_cast<ObjectPtr*>(fp() + kKBCPcMarkerSlotFromFp * kWordSize));
   ASSERT((pc_marker == Object::null()) ||
          (pc_marker->GetClassId() == kBytecodeCid));
-  return reinterpret_cast<RawBytecode*>(pc_marker);
+  return static_cast<BytecodePtr>(pc_marker);
 }
 
 bool StackFrame::FindExceptionHandler(Thread* thread,
@@ -499,7 +488,7 @@
     try_index = bytecode.GetTryIndexAtPc(pc());
   } else {
     uword pc_offset = pc() - code.PayloadStart();
-    PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
+    PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
     while (iter.MoveNext()) {
       const intptr_t current_try_index = iter.TryIndex();
       if ((iter.PcOffset() == pc_offset) && (current_try_index != -1)) {
@@ -536,7 +525,7 @@
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   ASSERT(!descriptors.IsNull());
-  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
   while (iter.MoveNext()) {
     if (iter.PcOffset() == pc_offset) {
       return TokenPosition(iter.TokenPos());
@@ -545,8 +534,8 @@
   return TokenPosition::kNoSource;
 }
 
-bool StackFrame::IsValid(bool needed_for_gc) const {
-  if (IsEntryFrame() || IsExitFrame() || IsStubFrame(needed_for_gc)) {
+bool StackFrame::IsValid() const {
+  if (IsEntryFrame() || IsExitFrame() || IsStubFrame()) {
     return true;
   }
   if (is_interpreted()) {
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 70fe3ed..1aeaa66 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -28,7 +28,6 @@
 
 // Forward declarations.
 class ObjectPointerVisitor;
-class RawContext;
 class LocalVariable;
 
 extern FrameLayout runtime_frame_layout;
@@ -81,8 +80,8 @@
     pc_ = value;
   }
 
-  void set_pc_marker(RawCode* code) {
-    *reinterpret_cast<RawCode**>(
+  void set_pc_marker(CodePtr code) {
+    *reinterpret_cast<CodePtr*>(
         fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
                                   : runtime_frame_layout.code_from_fp) *
                 kWordSize)) = code;
@@ -94,16 +93,14 @@
   const char* ToCString() const;
 
   // Check validity of a frame, used for assertion purposes.
-  virtual bool IsValid(bool needed_for_gc = false) const;
+  virtual bool IsValid() const;
 
-  // Returns the isolate containing the bare instructions of the current frame.
+  // Returns the isolate group containing the bare instructions of the
+  // current frame.
   //
   // If the frame does not belong to a bare instructions snapshot, it will
   // return nullptr.
-  //
-  // [needed_for_gc] has to be set to `true` if the caller needs only GC
-  // relevant information.
-  Isolate* IsolateOfBareInstructionsFrame(bool needed_for_gc) const;
+  IsolateGroup* IsolateGroupOfBareInstructionsFrame() const;
 
   // Returns true iff the current frame is a bare instructions dart frame.
   bool IsBareInstructionsDartFrame() const;
@@ -112,20 +109,19 @@
   bool IsBareInstructionsStubFrame() const;
 
   // Frame type.
-  virtual bool IsDartFrame(bool validate = true,
-                           bool needed_for_gc = false) const {
-    ASSERT(!validate || IsValid(needed_for_gc));
-    return !(IsEntryFrame() || IsExitFrame() || IsStubFrame(needed_for_gc));
+  virtual bool IsDartFrame(bool validate = true) const {
+    ASSERT(!validate || IsValid());
+    return !(IsEntryFrame() || IsExitFrame() || IsStubFrame());
   }
-  virtual bool IsStubFrame(bool neede_for_gc = false) const;
+  virtual bool IsStubFrame() const;
   virtual bool IsEntryFrame() const { return false; }
   virtual bool IsExitFrame() const { return false; }
 
   virtual bool is_interpreted() const { return is_interpreted_; }
 
-  RawFunction* LookupDartFunction() const;
-  RawCode* LookupDartCode() const;
-  RawBytecode* LookupDartBytecode() const;
+  FunctionPtr LookupDartFunction() const;
+  CodePtr LookupDartCode() const;
+  BytecodePtr LookupDartBytecode() const;
   bool FindExceptionHandler(Thread* thread,
                             uword* handler_pc,
                             bool* needs_stacktrace,
@@ -159,9 +155,8 @@
   Thread* thread() const { return thread_; }
 
  private:
-  RawCode* GetCodeObject(bool needed_for_gc = false) const;
-  RawBytecode* GetBytecodeObject() const;
-
+  CodePtr GetCodeObject() const;
+  BytecodePtr GetBytecodeObject() const;
 
   uword GetCallerFp() const {
     return *(reinterpret_cast<uword*>(
@@ -200,11 +195,9 @@
 // runtime code.
 class ExitFrame : public StackFrame {
  public:
-  bool IsValid(bool needed_for_gc = false) const { return sp() == 0; }
-  bool IsDartFrame(bool validate = true, bool needed_for_gc = false) const {
-    return false;
-  }
-  bool IsStubFrame(bool needed_for_gc = false) const { return false; }
+  bool IsValid() const { return sp() == 0; }
+  bool IsDartFrame(bool validate = true) const { return false; }
+  bool IsStubFrame() const { return false; }
   bool IsExitFrame() const { return true; }
 
   // Visit objects in the frame.
@@ -224,13 +217,11 @@
 // dart code.
 class EntryFrame : public StackFrame {
  public:
-  bool IsValid(bool needed_for_gc = false) const {
+  bool IsValid() const {
     return StubCode::InInvocationStub(pc(), is_interpreted());
   }
-  bool IsDartFrame(bool validate = true, bool needed_for_gc = false) const {
-    return false;
-  }
-  bool IsStubFrame(bool needed_for_gc = false) const { return false; }
+  bool IsDartFrame(bool validate = true) const { return false; }
+  bool IsStubFrame() const { return false; }
   bool IsEntryFrame() const { return true; }
 
   // Visit objects in the frame.
@@ -416,7 +407,7 @@
   bool Done() const { return index_ == -1; }
   void Advance();
 
-  RawFunction* function() const {
+  FunctionPtr function() const {
     ASSERT(!Done());
     return function_.raw();
   }
@@ -426,7 +417,7 @@
     return pc_;
   }
 
-  RawCode* code() const {
+  CodePtr code() const {
     ASSERT(!Done());
     return code_.raw();
   }
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index c0d55b8..a9df9e1 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -18,9 +18,9 @@
 // sdk/lib/async/stream_controller.dart:_StreamController._STATE_SUBSCRIBED.
 const intptr_t kStreamController_StateSubscribed = 1;
 
-RawClosure* FindClosureInFrame(RawObject** last_object_in_caller,
-                               const Function& function,
-                               bool is_interpreted) {
+ClosurePtr FindClosureInFrame(ObjectPtr* last_object_in_caller,
+                              const Function& function,
+                              bool is_interpreted) {
   NoSafepointScope nsp;
 
   // The callee has function signature
@@ -32,7 +32,7 @@
   auto& closure = Closure::Handle();
   for (intptr_t i = 0; i < 4; i++) {
     // KBC builds the stack upwards instead of the usual downwards stack.
-    RawObject* arg = last_object_in_caller[(is_interpreted ? -i : i)];
+    ObjectPtr arg = last_object_in_caller[(is_interpreted ? -i : i)];
     if (arg->IsHeapObject() && arg->GetClassId() == kClosureCid) {
       closure = Closure::RawCast(arg);
       if (closure.function() == function.raw()) {
@@ -49,7 +49,7 @@
 intptr_t GetYieldIndex(const Closure& receiver_closure) {
   const auto& function = Function::Handle(receiver_closure.function());
   if (!function.IsAsyncClosure() && !function.IsAsyncGenClosure()) {
-    return RawPcDescriptors::kInvalidYieldIndex;
+    return PcDescriptorsLayout::kInvalidYieldIndex;
   }
   const auto& await_jump_var =
       Object::Handle(Context::Handle(receiver_closure.context())
@@ -59,10 +59,10 @@
 }
 
 intptr_t FindPcOffset(const PcDescriptors& pc_descs, intptr_t yield_index) {
-  if (yield_index == RawPcDescriptors::kInvalidYieldIndex) {
+  if (yield_index == PcDescriptorsLayout::kInvalidYieldIndex) {
     return 0;
   }
-  PcDescriptors::Iterator iter(pc_descs, RawPcDescriptors::kAnyKind);
+  PcDescriptors::Iterator iter(pc_descs, PcDescriptorsLayout::kAnyKind);
   while (iter.MoveNext()) {
     if (iter.YieldIndex() == yield_index) {
       return iter.PcOffset();
@@ -73,7 +73,7 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 intptr_t FindPcOffset(const Bytecode& bytecode, intptr_t yield_index) {
-  if (yield_index == RawPcDescriptors::kInvalidYieldIndex) {
+  if (yield_index == PcDescriptorsLayout::kInvalidYieldIndex) {
     return 0;
   }
   if (!bytecode.HasSourcePositions()) {
@@ -197,7 +197,7 @@
     ASSERT(!state_data_field.IsNull());
   }
 
-  RawClosure* GetCallerInFutureImpl(const Object& future_) {
+  ClosurePtr GetCallerInFutureImpl(const Object& future_) {
     ASSERT(!future_.IsNull());
     ASSERT(future_.GetClassId() == future_impl_class.id());
 
@@ -217,7 +217,7 @@
     return Closure::Cast(callback_).raw();
   }
 
-  RawClosure* FindCallerInAsyncClosure(const Context& receiver_context) {
+  ClosurePtr FindCallerInAsyncClosure(const Context& receiver_context) {
     context_entry_ = receiver_context.At(Context::kAsyncCompleterIndex);
     ASSERT(context_entry_.IsInstance());
     ASSERT(context_entry_.GetClassId() == async_await_completer_class.id());
@@ -227,7 +227,7 @@
     return GetCallerInFutureImpl(future_);
   }
 
-  RawClosure* FindCallerInAsyncGenClosure(const Context& receiver_context) {
+  ClosurePtr FindCallerInAsyncGenClosure(const Context& receiver_context) {
     context_entry_ = receiver_context.At(Context::kControllerIndex);
     ASSERT(context_entry_.IsInstance());
     ASSERT(context_entry_.GetClassId() ==
@@ -277,7 +277,7 @@
     UNREACHABLE();  // If no onData is found we have a bug.
   }
 
-  RawClosure* FindCaller(const Closure& receiver_closure) {
+  ClosurePtr FindCaller(const Closure& receiver_closure) {
     receiver_function_ = receiver_closure.function();
     receiver_context_ = receiver_closure.context();
 
@@ -401,13 +401,15 @@
     if (frame->is_interpreted()) {
       code_array.Add(bytecode);
       const intptr_t pc_offset = frame->pc() - bytecode.PayloadStart();
-      ASSERT(pc_offset >= 0 && pc_offset <= bytecode.Size());
+      ASSERT(pc_offset > 0 && pc_offset <= bytecode.Size());
       offset = Smi::New(pc_offset);
     } else {
       code = frame->LookupDartCode();
       ASSERT(function.raw() == code.function());
       code_array.Add(code);
-      offset = Smi::New(frame->pc() - code.PayloadStart());
+      const intptr_t pc_offset = frame->pc() - code.PayloadStart();
+      ASSERT(pc_offset > 0 && pc_offset <= code.Size());
+      offset = Smi::New(pc_offset);
     }
     pc_offset_array.Add(offset);
     if (on_sync_frames != nullptr) {
@@ -424,8 +426,8 @@
 
       // Next, look up caller's closure on the stack and walk backwards through
       // the yields.
-      RawObject** last_caller_obj = reinterpret_cast<RawObject**>(
-          frame->GetCallerSp());
+      ObjectPtr* last_caller_obj =
+          reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
       closure = FindClosureInFrame(last_caller_obj, function,
                                    frame->is_interpreted());
 
@@ -466,6 +468,8 @@
         } else {
           UNREACHABLE();
         }
+        // Unlike other sources of PC offsets, the offset may be 0 here if we
+        // reach a non-async closure receiving the yielded value.
         ASSERT(offset.Value() >= 0);
         pc_offset_array.Add(offset);
 
@@ -513,12 +517,13 @@
     if (frame->is_interpreted()) {
       bytecode = frame->LookupDartBytecode();
       function = bytecode.function();
+      if (function.IsNull()) continue;
     } else {
       code = frame->LookupDartCode();
       function = code.function();
     }
-    if (function.IsNull()) continue;
-    if (sync_async_gap_frames > 0) {
+    const bool function_is_null = function.IsNull();
+    if (!function_is_null && sync_async_gap_frames > 0) {
       function_name = function.QualifiedScrubbedName();
       if (!CheckAndSkipAsync(&sync_async_gap_frames, function_name)) {
         *sync_async_end = false;
@@ -527,7 +532,7 @@
     } else {
       frame_count++;
     }
-    if (!async_function_is_null &&
+    if (!async_function_is_null && !function_is_null &&
         (async_function.raw() == function.parent_function())) {
       sync_async_gap_frames = kSyncAsyncFrameGap;
     }
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 8f84851..bfe56d2 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -68,7 +68,7 @@
 #undef STUB_CODE_GENERATE
 #undef STUB_CODE_SET_OBJECT_POOL
 
-RawCode* StubCode::Generate(
+CodePtr StubCode::Generate(
     const char* name,
     compiler::ObjectPoolBuilder* object_pool_builder,
     void (*GenerateStub)(compiler::Assembler* assembler)) {
@@ -128,7 +128,7 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-RawArray* compiler::StubCodeCompiler::BuildStaticCallsTable(
+ArrayPtr compiler::StubCodeCompiler::BuildStaticCallsTable(
     Zone* zone,
     compiler::UnresolvedPcRelativeCalls* unresolved_calls) {
   if (unresolved_calls->length() == 0) {
@@ -156,7 +156,7 @@
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-RawCode* StubCode::GetAllocationStubForClass(const Class& cls) {
+CodePtr StubCode::GetAllocationStubForClass(const Class& cls) {
   Thread* thread = Thread::Current();
   auto object_store = thread->isolate()->object_store();
   Zone* zone = thread->zone();
@@ -258,7 +258,7 @@
 }
 
 #if !defined(TARGET_ARCH_IA32)
-RawCode* StubCode::GetBuildMethodExtractorStub(
+CodePtr StubCode::GetBuildMethodExtractorStub(
     compiler::ObjectPoolBuilder* pool) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
   auto thread = Thread::Current();
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index cffe96a..19fd413 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -21,7 +21,6 @@
 class Code;
 class Isolate;
 class ObjectPointerVisitor;
-class RawCode;
 class SnapshotReader;
 class SnapshotWriter;
 
@@ -62,20 +61,18 @@
   VM_STUB_CODE_LIST(STUB_CODE_ACCESSOR);
 #undef STUB_CODE_ACCESSOR
 
-  static RawCode* GetAllocationStubForClass(const Class& cls);
+  static CodePtr GetAllocationStubForClass(const Class& cls);
 
 #if !defined(TARGET_ARCH_IA32)
-  static RawCode* GetBuildMethodExtractorStub(
-      compiler::ObjectPoolBuilder* pool);
+  static CodePtr GetBuildMethodExtractorStub(compiler::ObjectPoolBuilder* pool);
 #endif
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // Generate the stub and finalize the generated code into the stub
   // code executable area.
-  static RawCode* Generate(
-      const char* name,
-      compiler::ObjectPoolBuilder* object_pool_builder,
-      void (*GenerateStub)(compiler::Assembler* assembler));
+  static CodePtr Generate(const char* name,
+                          compiler::ObjectPoolBuilder* object_pool_builder,
+                          void (*GenerateStub)(compiler::Assembler* assembler));
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   static const Code& UnoptimizedStaticCallEntry(intptr_t num_args_tested);
@@ -92,7 +89,7 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 #define GENERATE_STUB(name)                                                    \
-  static RawCode* BuildIsolateSpecific##name##Stub(                            \
+  static CodePtr BuildIsolateSpecific##name##Stub(                             \
       compiler::ObjectPoolBuilder* opw) {                                      \
     return StubCode::Generate(                                                 \
         "_iso_stub_" #name, opw,                                               \
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index 76c37f0..0939ef2 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -29,8 +29,8 @@
   const String& function_name =
       String::ZoneHandle(Symbols::New(Thread::Current(), name));
   Function& function = Function::ZoneHandle(Function::New(
-      function_name, RawFunction::kRegularFunction, true, false, false, false,
-      false, owner_class, TokenPosition::kNoSource));
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kNoSource));
   return &function;
 }
 
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index 6c1fcae..ea6a6bc 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -29,8 +29,8 @@
   const String& function_name =
       String::ZoneHandle(Symbols::New(Thread::Current(), name));
   Function& function = Function::ZoneHandle(Function::New(
-      function_name, RawFunction::kRegularFunction, true, false, false, false,
-      false, owner_class, TokenPosition::kNoSource));
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kNoSource));
   return &function;
 }
 
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index e8f412d..b5c4388 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -29,8 +29,8 @@
   const String& function_name =
       String::ZoneHandle(Symbols::New(Thread::Current(), name));
   Function& function = Function::ZoneHandle(Function::New(
-      function_name, RawFunction::kRegularFunction, true, false, false, false,
-      false, owner_class, TokenPosition::kMinSource));
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kMinSource));
   return &function;
 }
 
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index 39836c8..b41ec88 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -29,8 +29,8 @@
   const String& function_name =
       String::ZoneHandle(Symbols::New(Thread::Current(), name));
   Function& function = Function::ZoneHandle(Function::New(
-      function_name, RawFunction::kRegularFunction, true, false, false, false,
-      false, owner_class, TokenPosition::kNoSource));
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kNoSource));
   return &function;
 }
 
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index bf4e645..04339dd 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -18,7 +18,7 @@
 
 namespace dart {
 
-RawString* Symbols::predefined_[Symbols::kNumberOfOneCharCodeSymbols];
+StringPtr Symbols::predefined_[Symbols::kNumberOfOneCharCodeSymbols];
 String* Symbols::symbol_handles_[Symbols::kMaxPredefinedId];
 
 static const char* names[] = {
@@ -35,15 +35,15 @@
     // clang-format on
 };
 
-RawString* StringFrom(const uint8_t* data, intptr_t len, Heap::Space space) {
+StringPtr StringFrom(const uint8_t* data, intptr_t len, Heap::Space space) {
   return String::FromLatin1(data, len, space);
 }
 
-RawString* StringFrom(const uint16_t* data, intptr_t len, Heap::Space space) {
+StringPtr StringFrom(const uint16_t* data, intptr_t len, Heap::Space space) {
   return String::FromUTF16(data, len, space);
 }
 
-RawString* StringFrom(const int32_t* data, intptr_t len, Heap::Space space) {
+StringPtr StringFrom(const int32_t* data, intptr_t len, Heap::Space space) {
   return String::FromUTF32(data, len, space);
 }
 
@@ -53,7 +53,7 @@
   CharArray(const CharType* data, intptr_t len) : data_(data), len_(len) {
     hash_ = String::Hash(data, len);
   }
-  RawString* ToSymbol() const {
+  StringPtr ToSymbol() const {
     String& result = String::Handle(StringFrom(data_, len_, Heap::kOld));
     result.SetCanonical();
     result.SetHash(hash_);
@@ -83,7 +83,7 @@
       : str_(str), begin_index_(begin_index), len_(length) {
     hash_ = is_all() ? str.Hash() : String::Hash(str, begin_index, length);
   }
-  RawString* ToSymbol() const;
+  StringPtr ToSymbol() const;
   bool Equals(const String& other) const {
     ASSERT(other.HasHash());
     if (other.Hash() != hash_) {
@@ -101,7 +101,7 @@
   intptr_t hash_;
 };
 
-RawString* StringSlice::ToSymbol() const {
+StringPtr StringSlice::ToSymbol() const {
   if (is_all() && str_.IsOld()) {
     str_.SetCanonical();
     return str_.raw();
@@ -118,7 +118,7 @@
  public:
   ConcatString(const String& str1, const String& str2)
       : str1_(str1), str2_(str2), hash_(String::HashConcat(str1, str2)) {}
-  RawString* ToSymbol() const;
+  StringPtr ToSymbol() const;
   bool Equals(const String& other) const {
     ASSERT(other.HasHash());
     if (other.Hash() != hash_) {
@@ -134,7 +134,7 @@
   intptr_t hash_;
 };
 
-RawString* ConcatString::ToSymbol() const {
+StringPtr ConcatString::ToSymbol() const {
   String& result = String::Handle(String::Concat(str1_, str2_, Heap::kOld));
   result.SetCanonical();
   result.SetHash(hash_);
@@ -179,13 +179,11 @@
   static uword Hash(const StringSlice& slice) { return slice.Hash(); }
   static uword Hash(const ConcatString& concat) { return concat.Hash(); }
   template <typename CharType>
-  static RawObject* NewKey(const CharArray<CharType>& array) {
+  static ObjectPtr NewKey(const CharArray<CharType>& array) {
     return array.ToSymbol();
   }
-  static RawObject* NewKey(const StringSlice& slice) {
-    return slice.ToSymbol();
-  }
-  static RawObject* NewKey(const ConcatString& concat) {
+  static ObjectPtr NewKey(const StringSlice& slice) { return slice.ToSymbol(); }
+  static ObjectPtr NewKey(const ConcatString& concat) {
     return concat.ToSymbol();
   }
 };
@@ -242,7 +240,7 @@
     *str = OneByteString::New(&ch, 1, Heap::kOld);
     str->Hash();
     *str ^= table.InsertOrGet(*str);
-    ASSERT(predefined_[c] == NULL);
+    ASSERT(predefined_[c] == nullptr);
     str->SetCanonical();  // Make canonical once entered.
     predefined_[c] = str->raw();
     symbol_handles_[idx] = str;
@@ -331,8 +329,8 @@
           type_args_(type_args),
           zone_(thread->zone()) {}
 
-    void VisitObject(RawObject* obj) {
-      if (obj->IsCanonical()) {
+    void VisitObject(ObjectPtr obj) {
+      if (obj->ptr()->IsCanonical()) {
         if (obj->IsStringInstance()) {
           symbols_->Add(&String::Handle(zone_, String::RawCast(obj)));
         } else if (obj->IsType()) {
@@ -413,15 +411,15 @@
   table.Release();
 }
 
-RawString* Symbols::New(Thread* thread, const char* cstr, intptr_t len) {
+StringPtr Symbols::New(Thread* thread, const char* cstr, intptr_t len) {
   ASSERT((cstr != NULL) && (len >= 0));
   const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(cstr);
   return Symbols::FromUTF8(thread, utf8_array, len);
 }
 
-RawString* Symbols::FromUTF8(Thread* thread,
-                             const uint8_t* utf8_array,
-                             intptr_t array_len) {
+StringPtr Symbols::FromUTF8(Thread* thread,
+                            const uint8_t* utf8_array,
+                            intptr_t array_len) {
   if (array_len == 0 || utf8_array == NULL) {
     return FromLatin1(thread, reinterpret_cast<uint8_t*>(NULL), 0);
   }
@@ -446,27 +444,27 @@
   return FromUTF16(thread, characters, len);
 }
 
-RawString* Symbols::FromLatin1(Thread* thread,
-                               const uint8_t* latin1_array,
-                               intptr_t len) {
+StringPtr Symbols::FromLatin1(Thread* thread,
+                              const uint8_t* latin1_array,
+                              intptr_t len) {
   return NewSymbol(thread, Latin1Array(latin1_array, len));
 }
 
-RawString* Symbols::FromUTF16(Thread* thread,
-                              const uint16_t* utf16_array,
-                              intptr_t len) {
+StringPtr Symbols::FromUTF16(Thread* thread,
+                             const uint16_t* utf16_array,
+                             intptr_t len) {
   return NewSymbol(thread, UTF16Array(utf16_array, len));
 }
 
-RawString* Symbols::FromUTF32(Thread* thread,
-                              const int32_t* utf32_array,
-                              intptr_t len) {
+StringPtr Symbols::FromUTF32(Thread* thread,
+                             const int32_t* utf32_array,
+                             intptr_t len) {
   return NewSymbol(thread, UTF32Array(utf32_array, len));
 }
 
-RawString* Symbols::FromConcat(Thread* thread,
-                               const String& str1,
-                               const String& str2) {
+StringPtr Symbols::FromConcat(Thread* thread,
+                              const String& str1,
+                              const String& str2) {
   if (str1.Length() == 0) {
     return New(thread, str2);
   } else if (str2.Length() == 0) {
@@ -476,22 +474,22 @@
   }
 }
 
-RawString* Symbols::FromGet(Thread* thread, const String& str) {
+StringPtr Symbols::FromGet(Thread* thread, const String& str) {
   return FromConcat(thread, GetterPrefix(), str);
 }
 
-RawString* Symbols::FromSet(Thread* thread, const String& str) {
+StringPtr Symbols::FromSet(Thread* thread, const String& str) {
   return FromConcat(thread, SetterPrefix(), str);
 }
 
-RawString* Symbols::FromDot(Thread* thread, const String& str) {
+StringPtr Symbols::FromDot(Thread* thread, const String& str) {
   return FromConcat(thread, str, Dot());
 }
 
 // TODO(srdjan): If this becomes performance critical code, consider looking
 // up symbol from hash of pieces instead of concatenating them first into
 // a string.
-RawString* Symbols::FromConcatAll(
+StringPtr Symbols::FromConcatAll(
     Thread* thread,
     const GrowableHandlePtrArray<const String>& strs) {
   const intptr_t strs_length = strs.length();
@@ -565,7 +563,7 @@
 
 // StringType can be StringSlice, ConcatString, or {Latin1,UTF16,UTF32}Array.
 template <typename StringType>
-RawString* Symbols::NewSymbol(Thread* thread, const StringType& str) {
+StringPtr Symbols::NewSymbol(Thread* thread, const StringType& str) {
   REUSABLE_OBJECT_HANDLESCOPE(thread);
   REUSABLE_SMI_HANDLESCOPE(thread);
   REUSABLE_ARRAY_HANDLESCOPE(thread);
@@ -613,7 +611,7 @@
 }
 
 template <typename StringType>
-RawString* Symbols::Lookup(Thread* thread, const StringType& str) {
+StringPtr Symbols::Lookup(Thread* thread, const StringType& str) {
   REUSABLE_OBJECT_HANDLESCOPE(thread);
   REUSABLE_SMI_HANDLESCOPE(thread);
   REUSABLE_ARRAY_HANDLESCOPE(thread);
@@ -653,9 +651,9 @@
   return symbol.raw();
 }
 
-RawString* Symbols::LookupFromConcat(Thread* thread,
-                                     const String& str1,
-                                     const String& str2) {
+StringPtr Symbols::LookupFromConcat(Thread* thread,
+                                    const String& str1,
+                                    const String& str2) {
   if (str1.Length() == 0) {
     return Lookup(thread, str2);
   } else if (str2.Length() == 0) {
@@ -665,44 +663,44 @@
   }
 }
 
-RawString* Symbols::LookupFromGet(Thread* thread, const String& str) {
+StringPtr Symbols::LookupFromGet(Thread* thread, const String& str) {
   return LookupFromConcat(thread, GetterPrefix(), str);
 }
 
-RawString* Symbols::LookupFromSet(Thread* thread, const String& str) {
+StringPtr Symbols::LookupFromSet(Thread* thread, const String& str) {
   return LookupFromConcat(thread, SetterPrefix(), str);
 }
 
-RawString* Symbols::LookupFromDot(Thread* thread, const String& str) {
+StringPtr Symbols::LookupFromDot(Thread* thread, const String& str) {
   return LookupFromConcat(thread, str, Dot());
 }
 
-RawString* Symbols::New(Thread* thread, const String& str) {
+StringPtr Symbols::New(Thread* thread, const String& str) {
   if (str.IsSymbol()) {
     return str.raw();
   }
   return New(thread, str, 0, str.Length());
 }
 
-RawString* Symbols::New(Thread* thread,
-                        const String& str,
-                        intptr_t begin_index,
-                        intptr_t len) {
+StringPtr Symbols::New(Thread* thread,
+                       const String& str,
+                       intptr_t begin_index,
+                       intptr_t len) {
   return NewSymbol(thread, StringSlice(str, begin_index, len));
 }
 
-RawString* Symbols::NewFormatted(Thread* thread, const char* format, ...) {
+StringPtr Symbols::NewFormatted(Thread* thread, const char* format, ...) {
   va_list args;
   va_start(args, format);
-  RawString* result = NewFormattedV(thread, format, args);
+  StringPtr result = NewFormattedV(thread, format, args);
   NoSafepointScope no_safepoint;
   va_end(args);
   return result;
 }
 
-RawString* Symbols::NewFormattedV(Thread* thread,
-                                  const char* format,
-                                  va_list args) {
+StringPtr Symbols::NewFormattedV(Thread* thread,
+                                 const char* format,
+                                 va_list args) {
   va_list args_copy;
   va_copy(args_copy, args);
   intptr_t len = Utils::VSNPrint(NULL, 0, format, args_copy);
@@ -715,7 +713,7 @@
   return Symbols::New(thread, buffer);
 }
 
-RawString* Symbols::FromCharCode(Thread* thread, int32_t char_code) {
+StringPtr Symbols::FromCharCode(Thread* thread, int32_t char_code) {
   if (char_code > kMaxOneCharCodeSymbol) {
     return FromUTF32(thread, &char_code, 1);
   }
@@ -744,7 +742,7 @@
   table.Release();
 }
 
-intptr_t Symbols::LookupPredefinedSymbol(RawObject* obj) {
+intptr_t Symbols::LookupPredefinedSymbol(ObjectPtr obj) {
   for (intptr_t i = 1; i < Symbols::kMaxPredefinedId; i++) {
     if (symbol_handles_[i]->raw() == obj) {
       return (i + kMaxPredefinedObjectIds);
@@ -753,7 +751,7 @@
   return kInvalidIndex;
 }
 
-RawObject* Symbols::GetPredefinedSymbol(intptr_t object_id) {
+ObjectPtr Symbols::GetPredefinedSymbol(intptr_t object_id) {
   ASSERT(IsPredefinedSymbolId(object_id));
   intptr_t i = (object_id - kMaxPredefinedObjectIds);
   if ((i > kIllegal) && (i < Symbols::kMaxPredefinedId)) {
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 73ecaaa..df9470a 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -645,62 +645,62 @@
   // Creates a Symbol given a C string that is assumed to contain
   // UTF-8 encoded characters and '\0' is considered a termination character.
   // TODO(7123) - Rename this to FromCString(....).
-  static RawString* New(Thread* thread, const char* cstr) {
+  static StringPtr New(Thread* thread, const char* cstr) {
     return New(thread, cstr, strlen(cstr));
   }
-  static RawString* New(Thread* thread, const char* cstr, intptr_t length);
+  static StringPtr New(Thread* thread, const char* cstr, intptr_t length);
 
   // Creates a new Symbol from an array of UTF-8 encoded characters.
-  static RawString* FromUTF8(Thread* thread,
-                             const uint8_t* utf8_array,
-                             intptr_t len);
+  static StringPtr FromUTF8(Thread* thread,
+                            const uint8_t* utf8_array,
+                            intptr_t len);
 
   // Creates a new Symbol from an array of Latin-1 encoded characters.
-  static RawString* FromLatin1(Thread* thread,
-                               const uint8_t* latin1_array,
-                               intptr_t len);
+  static StringPtr FromLatin1(Thread* thread,
+                              const uint8_t* latin1_array,
+                              intptr_t len);
 
   // Creates a new Symbol from an array of UTF-16 encoded characters.
-  static RawString* FromUTF16(Thread* thread,
-                              const uint16_t* utf16_array,
-                              intptr_t len);
+  static StringPtr FromUTF16(Thread* thread,
+                             const uint16_t* utf16_array,
+                             intptr_t len);
 
   // Creates a new Symbol from an array of UTF-32 encoded characters.
-  static RawString* FromUTF32(Thread* thread,
-                              const int32_t* utf32_array,
-                              intptr_t len);
+  static StringPtr FromUTF32(Thread* thread,
+                             const int32_t* utf32_array,
+                             intptr_t len);
 
-  static RawString* New(Thread* thread, const String& str);
-  static RawString* New(Thread* thread,
-                        const String& str,
-                        intptr_t begin_index,
-                        intptr_t length);
+  static StringPtr New(Thread* thread, const String& str);
+  static StringPtr New(Thread* thread,
+                       const String& str,
+                       intptr_t begin_index,
+                       intptr_t length);
 
-  static RawString* NewFormatted(Thread* thread, const char* format, ...)
+  static StringPtr NewFormatted(Thread* thread, const char* format, ...)
       PRINTF_ATTRIBUTE(2, 3);
-  static RawString* NewFormattedV(Thread* thread,
-                                  const char* format,
-                                  va_list args);
+  static StringPtr NewFormattedV(Thread* thread,
+                                 const char* format,
+                                 va_list args);
 
-  static RawString* FromConcat(Thread* thread,
-                               const String& str1,
-                               const String& str2);
+  static StringPtr FromConcat(Thread* thread,
+                              const String& str1,
+                              const String& str2);
 
-  static RawString* FromConcatAll(
+  static StringPtr FromConcatAll(
       Thread* thread,
       const GrowableHandlePtrArray<const String>& strs);
 
-  static RawString* FromGet(Thread* thread, const String& str);
-  static RawString* FromSet(Thread* thread, const String& str);
-  static RawString* FromDot(Thread* thread, const String& str);
+  static StringPtr FromGet(Thread* thread, const String& str);
+  static StringPtr FromSet(Thread* thread, const String& str);
+  static StringPtr FromDot(Thread* thread, const String& str);
 
   // Returns char* of predefined symbol.
   static const char* Name(SymbolId symbol);
 
-  static RawString* FromCharCode(Thread* thread, int32_t char_code);
+  static StringPtr FromCharCode(Thread* thread, int32_t char_code);
 
-  static RawString** PredefinedAddress() {
-    return reinterpret_cast<RawString**>(&predefined_);
+  static StringPtr* PredefinedAddress() {
+    return reinterpret_cast<StringPtr*>(&predefined_);
   }
 
   static void DumpStats(Isolate* isolate);
@@ -708,16 +708,16 @@
 
   // Returns Symbol::Null if no symbol is found.
   template <typename StringType>
-  static RawString* Lookup(Thread* thread, const StringType& str);
+  static StringPtr Lookup(Thread* thread, const StringType& str);
 
   // Returns Symbol::Null if no symbol is found.
-  static RawString* LookupFromConcat(Thread* thread,
-                                     const String& str1,
-                                     const String& str2);
+  static StringPtr LookupFromConcat(Thread* thread,
+                                    const String& str1,
+                                    const String& str2);
 
-  static RawString* LookupFromGet(Thread* thread, const String& str);
-  static RawString* LookupFromSet(Thread* thread, const String& str);
-  static RawString* LookupFromDot(Thread* thread, const String& str);
+  static StringPtr LookupFromGet(Thread* thread, const String& str);
+  static StringPtr LookupFromSet(Thread* thread, const String& str);
+  static StringPtr LookupFromDot(Thread* thread, const String& str);
 
   static void GetStats(Isolate* isolate, intptr_t* size, intptr_t* capacity);
 
@@ -725,10 +725,10 @@
   enum { kInitialVMIsolateSymtabSize = 1024, kInitialSymtabSize = 2048 };
 
   template <typename StringType>
-  static RawString* NewSymbol(Thread* thread, const StringType& str);
+  static StringPtr NewSymbol(Thread* thread, const StringType& str);
 
-  static intptr_t LookupPredefinedSymbol(RawObject* obj);
-  static RawObject* GetPredefinedSymbol(intptr_t object_id);
+  static intptr_t LookupPredefinedSymbol(ObjectPtr obj);
+  static ObjectPtr GetPredefinedSymbol(intptr_t object_id);
   static bool IsPredefinedSymbolId(intptr_t object_id) {
     return (object_id >= kMaxPredefinedObjectIds &&
             object_id < (kMaxPredefinedObjectIds + kMaxPredefinedId));
@@ -737,7 +737,7 @@
   // List of Latin1 characters stored in the vm isolate as symbols
   // in order to make Symbols::FromCharCode fast. This structure is
   // used in generated dart code for direct access to these objects.
-  static RawString* predefined_[kNumberOfOneCharCodeSymbols];
+  static StringPtr predefined_[kNumberOfOneCharCodeSymbols];
 
   // List of handles for predefined symbols.
   static String* symbol_handles_[kMaxPredefinedId];
diff --git a/runtime/vm/tagged_pointer.h b/runtime/vm/tagged_pointer.h
new file mode 100644
index 0000000..9b92514
--- /dev/null
+++ b/runtime/vm/tagged_pointer.h
@@ -0,0 +1,324 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_VM_TAGGED_POINTER_H_
+#define RUNTIME_VM_TAGGED_POINTER_H_
+
+#include "platform/assert.h"
+#include "platform/utils.h"
+#include "vm/class_id.h"
+#include "vm/pointer_tagging.h"
+
+namespace dart {
+
+class IsolateGroup;
+class ObjectLayout;
+
+class ObjectPtr {
+ public:
+  ObjectPtr* operator->() { return this; }
+  const ObjectPtr* operator->() const { return this; }
+  ObjectLayout* ptr() const {
+    return reinterpret_cast<ObjectLayout*>(UntaggedPointer());
+  }
+
+  bool IsWellFormed() const {
+    uword value = tagged_pointer_;
+    return (value & kSmiTagMask) == 0 ||
+           Utils::IsAligned(value - kHeapObjectTag, kWordSize);
+  }
+  bool IsHeapObject() const {
+    ASSERT(IsWellFormed());
+    uword value = tagged_pointer_;
+    return (value & kSmiTagMask) == kHeapObjectTag;
+  }
+  // Assumes this is a heap object.
+  bool IsNewObject() const {
+    ASSERT(IsHeapObject());
+    uword addr = tagged_pointer_;
+    return (addr & kNewObjectAlignmentOffset) == kNewObjectAlignmentOffset;
+  }
+  bool IsNewObjectMayBeSmi() const {
+    static const uword kNewObjectBits =
+        (kNewObjectAlignmentOffset | kHeapObjectTag);
+    const uword addr = tagged_pointer_;
+    return (addr & kObjectAlignmentMask) == kNewObjectBits;
+  }
+  // Assumes this is a heap object.
+  bool IsOldObject() const {
+    ASSERT(IsHeapObject());
+    uword addr = tagged_pointer_;
+    return (addr & kNewObjectAlignmentOffset) == kOldObjectAlignmentOffset;
+  }
+
+  // Like !IsHeapObject() || IsOldObject(), but compiles to a single branch.
+  bool IsSmiOrOldObject() const {
+    ASSERT(IsWellFormed());
+    static const uword kNewObjectBits =
+        (kNewObjectAlignmentOffset | kHeapObjectTag);
+    const uword addr = tagged_pointer_;
+    return (addr & kObjectAlignmentMask) != kNewObjectBits;
+  }
+
+  // Like !IsHeapObject() || IsNewObject(), but compiles to a single branch.
+  bool IsSmiOrNewObject() const {
+    ASSERT(IsWellFormed());
+    static const uword kOldObjectBits =
+        (kOldObjectAlignmentOffset | kHeapObjectTag);
+    const uword addr = tagged_pointer_;
+    return (addr & kObjectAlignmentMask) != kOldObjectBits;
+  }
+
+#define DEFINE_IS_CID(clazz)                                                   \
+  bool Is##clazz() const { return ((GetClassId() == k##clazz##Cid)); }
+  CLASS_LIST(DEFINE_IS_CID)
+#undef DEFINE_IS_CID
+
+#define DEFINE_IS_CID(clazz)                                                   \
+  bool IsTypedData##clazz() const {                                            \
+    return ((GetClassId() == kTypedData##clazz##Cid));                         \
+  }                                                                            \
+  bool IsTypedDataView##clazz() const {                                        \
+    return ((GetClassId() == kTypedData##clazz##ViewCid));                     \
+  }                                                                            \
+  bool IsExternalTypedData##clazz() const {                                    \
+    return ((GetClassId() == kExternalTypedData##clazz##Cid));                 \
+  }
+  CLASS_LIST_TYPED_DATA(DEFINE_IS_CID)
+#undef DEFINE_IS_CID
+
+#define DEFINE_IS_CID(clazz)                                                   \
+  bool IsFfi##clazz() const { return ((GetClassId() == kFfi##clazz##Cid)); }
+  CLASS_LIST_FFI(DEFINE_IS_CID)
+#undef DEFINE_IS_CID
+
+  bool IsStringInstance() const { return IsStringClassId(GetClassId()); }
+  bool IsRawNull() const { return GetClassId() == kNullCid; }
+  bool IsDartInstance() const {
+    return (!IsHeapObject() || (GetClassId() >= kInstanceCid));
+  }
+  bool IsFreeListElement() const {
+    return ((GetClassId() == kFreeListElement));
+  }
+  bool IsForwardingCorpse() const {
+    return ((GetClassId() == kForwardingCorpse));
+  }
+  bool IsPseudoObject() const {
+    return IsFreeListElement() || IsForwardingCorpse();
+  }
+
+  intptr_t GetClassId() const;
+  intptr_t GetClassIdMayBeSmi() const {
+    return IsHeapObject() ? GetClassId() : static_cast<intptr_t>(kSmiCid);
+  }
+
+  void Validate(IsolateGroup* isolate_group) const;
+
+  bool operator==(const ObjectPtr& other) {
+    return tagged_pointer_ == other.tagged_pointer_;
+  }
+  bool operator!=(const ObjectPtr& other) {
+    return tagged_pointer_ != other.tagged_pointer_;
+  }
+  constexpr bool operator==(const ObjectPtr& other) const {
+    return tagged_pointer_ == other.tagged_pointer_;
+  }
+  constexpr bool operator!=(const ObjectPtr& other) const {
+    return tagged_pointer_ != other.tagged_pointer_;
+  }
+  bool operator==(const nullptr_t& other) { return tagged_pointer_ == 0; }
+  bool operator!=(const nullptr_t& other) { return tagged_pointer_ != 0; }
+  constexpr bool operator==(const nullptr_t& other) const {
+    return tagged_pointer_ == 0;
+  }
+  constexpr bool operator!=(const nullptr_t& other) const {
+    return tagged_pointer_ != 0;
+  }
+
+  // Use explicit null comparisons instead.
+  operator bool() const = delete;
+
+  // The underlying types of int32_t/int64_t and intptr_t are sometimes
+  // different and sometimes the same, depending on the platform. With
+  // only a conversion operator for intptr_t, on 64-bit Mac a static_cast
+  // to int64_t fails because it tries conversion to bool (!) rather than
+  // intptr_t. So we exhaustive define all the valid conversions based on
+  // the underlying types.
+#if INT_MAX == INTPTR_MAX
+  explicit operator int() const {              // NOLINT
+    return static_cast<int>(tagged_pointer_);  // NOLINT
+  }
+#endif
+#if LONG_MAX == INTPTR_MAX
+  explicit operator long() const {              // NOLINT
+    return static_cast<long>(tagged_pointer_);  // NOLINT
+  }
+#endif
+#if LLONG_MAX == INTPTR_MAX
+  explicit operator long long() const {              // NOLINT
+    return static_cast<long long>(tagged_pointer_);  // NOLINT
+  }
+#endif
+#if UINT_MAX == UINTPTR_MAX
+  explicit operator unsigned int() const {              // NOLINT
+    return static_cast<unsigned int>(tagged_pointer_);  // NOLINT
+  }
+#endif
+#if ULONG_MAX == UINTPTR_MAX
+  explicit operator unsigned long() const {              // NOLINT
+    return static_cast<unsigned long>(tagged_pointer_);  // NOLINT
+  }
+#endif
+#if ULLONG_MAX == UINTPTR_MAX
+  explicit operator unsigned long long() const {              // NOLINT
+    return static_cast<unsigned long long>(tagged_pointer_);  // NOLINT
+  }
+#endif
+
+  // Must be trivially copyable for std::atomic.
+  ObjectPtr& operator=(const ObjectPtr& other) = default;
+  constexpr ObjectPtr(const ObjectPtr& other) = default;
+
+  ObjectPtr() : tagged_pointer_(0) {}
+  explicit constexpr ObjectPtr(uword tagged) : tagged_pointer_(tagged) {}
+  explicit constexpr ObjectPtr(intptr_t tagged) : tagged_pointer_(tagged) {}
+  constexpr ObjectPtr(nullptr_t) : tagged_pointer_(0) {}  // NOLINT
+  explicit ObjectPtr(ObjectLayout* heap_object)
+      : tagged_pointer_(reinterpret_cast<uword>(heap_object) + kHeapObjectTag) {
+  }
+
+ protected:
+  uword UntaggedPointer() const {
+    ASSERT(IsHeapObject());
+    return tagged_pointer_ - kHeapObjectTag;
+  }
+
+  uword tagged_pointer_;
+};
+
+// Needed by the printing in the EXPECT macros.
+#if defined(DEBUG) || defined(TESTING)
+inline std::ostream& operator<<(std::ostream& os, const ObjectPtr& obj) {
+  os << reinterpret_cast<void*>(static_cast<uword>(obj));
+  return os;
+}
+#endif
+
+#define DEFINE_TAGGED_POINTER(klass, base)                                     \
+  class klass##Layout;                                                         \
+  class klass##Ptr : public base##Ptr {                                        \
+   public:                                                                     \
+    klass##Ptr* operator->() { return this; }                                  \
+    const klass##Ptr* operator->() const { return this; }                      \
+    klass##Layout* ptr() {                                                     \
+      return reinterpret_cast<klass##Layout*>(UntaggedPointer());              \
+    }                                                                          \
+    /* TODO: Return const pointer */                                           \
+    klass##Layout* ptr() const {                                               \
+      return reinterpret_cast<klass##Layout*>(UntaggedPointer());              \
+    }                                                                          \
+    klass##Ptr& operator=(const klass##Ptr& other) = default;                  \
+    constexpr klass##Ptr(const klass##Ptr& other) = default;                   \
+    explicit constexpr klass##Ptr(const ObjectPtr& other)                      \
+        : base##Ptr(other) {}                                                  \
+    klass##Ptr() : base##Ptr() {}                                              \
+    explicit constexpr klass##Ptr(uword tagged) : base##Ptr(tagged) {}         \
+    explicit constexpr klass##Ptr(intptr_t tagged) : base##Ptr(tagged) {}      \
+    constexpr klass##Ptr(nullptr_t) : base##Ptr(nullptr) {} /* NOLINT */       \
+    explicit klass##Ptr(const ObjectLayout* untagged)                          \
+        : base##Ptr(reinterpret_cast<uword>(untagged) + kHeapObjectTag) {}     \
+  };
+
+DEFINE_TAGGED_POINTER(Class, Object)
+DEFINE_TAGGED_POINTER(PatchClass, Object)
+DEFINE_TAGGED_POINTER(Function, Object)
+DEFINE_TAGGED_POINTER(ClosureData, Object)
+DEFINE_TAGGED_POINTER(SignatureData, Object)
+DEFINE_TAGGED_POINTER(RedirectionData, Object)
+DEFINE_TAGGED_POINTER(FfiTrampolineData, Object)
+DEFINE_TAGGED_POINTER(Field, Object)
+DEFINE_TAGGED_POINTER(Script, Object)
+DEFINE_TAGGED_POINTER(Library, Object)
+DEFINE_TAGGED_POINTER(Namespace, Object)
+DEFINE_TAGGED_POINTER(KernelProgramInfo, Object)
+DEFINE_TAGGED_POINTER(WeakSerializationReference, Object)
+DEFINE_TAGGED_POINTER(Code, Object)
+DEFINE_TAGGED_POINTER(Bytecode, Object)
+DEFINE_TAGGED_POINTER(ObjectPool, Object)
+DEFINE_TAGGED_POINTER(Instructions, Object)
+DEFINE_TAGGED_POINTER(InstructionsSection, Object)
+DEFINE_TAGGED_POINTER(PcDescriptors, Object)
+DEFINE_TAGGED_POINTER(CodeSourceMap, Object)
+DEFINE_TAGGED_POINTER(CompressedStackMaps, Object)
+DEFINE_TAGGED_POINTER(LocalVarDescriptors, Object)
+DEFINE_TAGGED_POINTER(ExceptionHandlers, Object)
+DEFINE_TAGGED_POINTER(Context, Object)
+DEFINE_TAGGED_POINTER(ContextScope, Object)
+DEFINE_TAGGED_POINTER(ParameterTypeCheck, Object)
+DEFINE_TAGGED_POINTER(SingleTargetCache, Object)
+DEFINE_TAGGED_POINTER(UnlinkedCall, Object)
+DEFINE_TAGGED_POINTER(MonomorphicSmiableCall, Object)
+DEFINE_TAGGED_POINTER(CallSiteData, Object)
+DEFINE_TAGGED_POINTER(ICData, CallSiteData)
+DEFINE_TAGGED_POINTER(MegamorphicCache, CallSiteData)
+DEFINE_TAGGED_POINTER(SubtypeTestCache, Object)
+DEFINE_TAGGED_POINTER(Error, Object)
+DEFINE_TAGGED_POINTER(ApiError, Error)
+DEFINE_TAGGED_POINTER(LanguageError, Error)
+DEFINE_TAGGED_POINTER(UnhandledException, Error)
+DEFINE_TAGGED_POINTER(UnwindError, Error)
+DEFINE_TAGGED_POINTER(Instance, Object)
+DEFINE_TAGGED_POINTER(LibraryPrefix, Instance)
+DEFINE_TAGGED_POINTER(TypeArguments, Instance)
+DEFINE_TAGGED_POINTER(AbstractType, Instance)
+DEFINE_TAGGED_POINTER(Type, AbstractType)
+DEFINE_TAGGED_POINTER(TypeRef, AbstractType)
+DEFINE_TAGGED_POINTER(TypeParameter, AbstractType)
+DEFINE_TAGGED_POINTER(Closure, Instance)
+DEFINE_TAGGED_POINTER(Number, Instance)
+DEFINE_TAGGED_POINTER(Integer, Number)
+DEFINE_TAGGED_POINTER(Smi, Integer)
+DEFINE_TAGGED_POINTER(Mint, Integer)
+DEFINE_TAGGED_POINTER(Double, Number)
+DEFINE_TAGGED_POINTER(String, Instance)
+DEFINE_TAGGED_POINTER(OneByteString, String)
+DEFINE_TAGGED_POINTER(TwoByteString, String)
+DEFINE_TAGGED_POINTER(PointerBase, Instance)
+DEFINE_TAGGED_POINTER(TypedDataBase, PointerBase)
+DEFINE_TAGGED_POINTER(TypedData, TypedDataBase)
+DEFINE_TAGGED_POINTER(TypedDataView, TypedDataBase)
+DEFINE_TAGGED_POINTER(ExternalOneByteString, String)
+DEFINE_TAGGED_POINTER(ExternalTwoByteString, String)
+DEFINE_TAGGED_POINTER(Bool, Instance)
+DEFINE_TAGGED_POINTER(Array, Instance)
+DEFINE_TAGGED_POINTER(ImmutableArray, Array)
+DEFINE_TAGGED_POINTER(GrowableObjectArray, Instance)
+DEFINE_TAGGED_POINTER(LinkedHashMap, Instance)
+DEFINE_TAGGED_POINTER(Float32x4, Instance)
+DEFINE_TAGGED_POINTER(Int32x4, Instance)
+DEFINE_TAGGED_POINTER(Float64x2, Instance)
+DEFINE_TAGGED_POINTER(ExternalTypedData, TypedDataBase)
+DEFINE_TAGGED_POINTER(Pointer, PointerBase)
+DEFINE_TAGGED_POINTER(DynamicLibrary, Instance)
+DEFINE_TAGGED_POINTER(Capability, Instance)
+DEFINE_TAGGED_POINTER(SendPort, Instance)
+DEFINE_TAGGED_POINTER(ReceivePort, Instance)
+DEFINE_TAGGED_POINTER(TransferableTypedData, Instance)
+DEFINE_TAGGED_POINTER(StackTrace, Instance)
+DEFINE_TAGGED_POINTER(RegExp, Instance)
+DEFINE_TAGGED_POINTER(WeakProperty, Instance)
+DEFINE_TAGGED_POINTER(MirrorReference, Instance)
+DEFINE_TAGGED_POINTER(UserTag, Instance)
+DEFINE_TAGGED_POINTER(FutureOr, Instance)
+#undef DEFINE_TAGGED_POINTER
+
+inline intptr_t RawSmiValue(const SmiPtr raw_value) {
+  const intptr_t value = static_cast<intptr_t>(raw_value);
+  ASSERT((value & kSmiTagMask) == kSmiTag);
+  return (value >> kSmiTagShift);
+}
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_TAGGED_POINTER_H_
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index d96d81d..42c751c 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -65,7 +65,7 @@
 Thread::Thread(bool is_vm_isolate)
     : ThreadState(false),
       stack_limit_(0),
-      write_barrier_mask_(RawObject::kGenerationalBarrierMask),
+      write_barrier_mask_(ObjectLayout::kGenerationalBarrierMask),
       isolate_(NULL),
       dispatch_table_array_(NULL),
       saved_stack_limit_(0),
@@ -235,7 +235,7 @@
 }
 #endif
 
-RawGrowableObjectArray* Thread::pending_functions() {
+GrowableObjectArrayPtr Thread::pending_functions() {
   if (pending_functions_ == GrowableObjectArray::null()) {
     pending_functions_ = GrowableObjectArray::New(Heap::kOld);
   }
@@ -254,7 +254,7 @@
   active_stacktrace_ = value.raw();
 }
 
-RawError* Thread::sticky_error() const {
+ErrorPtr Thread::sticky_error() const {
   return sticky_error_;
 }
 
@@ -267,9 +267,9 @@
   sticky_error_ = Error::null();
 }
 
-RawError* Thread::StealStickyError() {
+ErrorPtr Thread::StealStickyError() {
   NoSafepointScope no_safepoint;
-  RawError* return_value = sticky_error_;
+  ErrorPtr return_value = sticky_error_;
   sticky_error_ = Error::null();
   return return_value;
 }
@@ -292,7 +292,7 @@
   }
 }
 
-RawStackTrace* Thread::async_stack_trace() const {
+StackTracePtr Thread::async_stack_trace() const {
   return async_stack_trace_;
 }
 
@@ -301,7 +301,7 @@
   async_stack_trace_ = stack_trace.raw();
 }
 
-void Thread::set_raw_async_stack_trace(RawStackTrace* raw_stack_trace) {
+void Thread::set_raw_async_stack_trace(StackTracePtr raw_stack_trace) {
   async_stack_trace_ = raw_stack_trace;
 }
 
@@ -515,7 +515,7 @@
 #endif  // !defined(PRODUCT)
 }
 
-RawError* Thread::HandleInterrupts() {
+ErrorPtr Thread::HandleInterrupts() {
   uword interrupt_bits = GetAndClearInterrupts();
   if ((interrupt_bits & kVMInterrupt) != 0) {
     CheckForSafepoint();
@@ -539,7 +539,7 @@
             isolate()->name());
       }
       NoSafepointScope no_safepoint;
-      RawError* error = Thread::Current()->StealStickyError();
+      ErrorPtr error = Thread::Current()->StealStickyError();
       ASSERT(error->IsUnwindError());
       return error;
     }
@@ -558,7 +558,7 @@
   StoreBufferAcquire();
 }
 
-void Thread::StoreBufferAddObject(RawObject* obj) {
+void Thread::StoreBufferAddObject(ObjectPtr obj) {
   ASSERT(this == Thread::Current());
   store_buffer_block_->Push(obj);
   if (store_buffer_block_->IsFull()) {
@@ -566,7 +566,7 @@
   }
 }
 
-void Thread::StoreBufferAddObjectGC(RawObject* obj) {
+void Thread::StoreBufferAddObjectGC(ObjectPtr obj) {
   store_buffer_block_->Push(obj);
   if (store_buffer_block_->IsFull()) {
     StoreBufferBlockProcess(StoreBuffer::kIgnoreThreshold);
@@ -593,14 +593,14 @@
   DeferredMarkingStackAcquire();
 }
 
-void Thread::MarkingStackAddObject(RawObject* obj) {
+void Thread::MarkingStackAddObject(ObjectPtr obj) {
   marking_stack_block_->Push(obj);
   if (marking_stack_block_->IsFull()) {
     MarkingStackBlockProcess();
   }
 }
 
-void Thread::DeferredMarkingStackAddObject(RawObject* obj) {
+void Thread::DeferredMarkingStackAddObject(ObjectPtr obj) {
   deferred_marking_stack_block_->Push(obj);
   if (deferred_marking_stack_block_->IsFull()) {
     DeferredMarkingStackBlockProcess();
@@ -610,14 +610,14 @@
 void Thread::MarkingStackRelease() {
   MarkingStackBlock* block = marking_stack_block_;
   marking_stack_block_ = NULL;
-  write_barrier_mask_ = RawObject::kGenerationalBarrierMask;
+  write_barrier_mask_ = ObjectLayout::kGenerationalBarrierMask;
   isolate_group()->marking_stack()->PushBlock(block);
 }
 
 void Thread::MarkingStackAcquire() {
   marking_stack_block_ = isolate_group()->marking_stack()->PopEmptyBlock();
-  write_barrier_mask_ =
-      RawObject::kGenerationalBarrierMask | RawObject::kIncrementalBarrierMask;
+  write_barrier_mask_ = ObjectLayout::kGenerationalBarrierMask |
+                        ObjectLayout::kIncrementalBarrierMask;
 }
 
 void Thread::DeferredMarkingStackRelease() {
@@ -680,13 +680,13 @@
   // Visit objects in thread specific handles area.
   reusable_handles_.VisitObjectPointers(visitor);
 
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&pending_functions_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&global_object_pool_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&active_exception_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&active_stacktrace_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&sticky_error_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&async_stack_trace_));
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&ffi_callback_code_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&pending_functions_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&global_object_pool_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&active_exception_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&active_stacktrace_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&sticky_error_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&async_stack_trace_));
+  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&ffi_callback_code_));
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if (interpreter() != NULL) {
@@ -740,9 +740,9 @@
         current_(Thread::Current()),
         op_(op) {}
 
-  void VisitPointers(RawObject** first, RawObject** last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
     for (; first != last + 1; first++) {
-      RawObject* obj = *first;
+      ObjectPtr obj = *first;
       // Stores into new-space objects don't need a write barrier.
       if (obj->IsSmiOrNewObject()) continue;
 
@@ -757,17 +757,17 @@
       if (!obj->IsDartInstance() && !obj->IsContext()) continue;
 
       // Dart code won't store into canonical instances.
-      if (obj->IsCanonical()) continue;
+      if (obj->ptr()->IsCanonical()) continue;
 
       // Objects in the VM isolate heap are immutable and won't be
       // stored into. Check this condition last because there's no bit
       // in the header for it.
-      if (obj->InVMIsolateHeap()) continue;
+      if (obj->ptr()->InVMIsolateHeap()) continue;
 
       switch (op_) {
         case Thread::RestoreWriteBarrierInvariantOp::kAddToRememberedSet:
-          if (!obj->IsRemembered()) {
-            obj->AddToRememberedSet(current_);
+          if (!obj->ptr()->IsRemembered()) {
+            obj->ptr()->AddToRememberedSet(current_);
           }
           if (current_->is_marking()) {
             current_->DeferredMarkingStackAddObject(obj);
@@ -813,7 +813,7 @@
        frame = frames_iterator.NextFrame()) {
     if (frame->IsExitFrame()) {
       scan_next_dart_frame = true;
-    } else if (frame->IsDartFrame(/*validate=*/false, /*needed_for_gc=*/true)) {
+    } else if (frame->IsDartFrame(/*validate=*/false)) {
       if (scan_next_dart_frame) {
         frame->VisitObjectPointers(&visitor);
       }
@@ -862,7 +862,7 @@
   // [object] is in fact a [Code] object.
   if (object.IsCode()) {
 #define COMPUTE_OFFSET(type_name, member_name, expr, default_init_value)       \
-  ASSERT((expr)->InVMIsolateHeap());                                           \
+  ASSERT((expr)->ptr()->InVMIsolateHeap());                                    \
   if (object.raw() == expr) {                                                  \
     return Thread::member_name##offset();                                      \
   }
@@ -1137,13 +1137,12 @@
 void Thread::VerifyCallbackIsolate(int32_t callback_id, uword entry) {
   NoSafepointScope _;
 
-  const RawGrowableObjectArray* const array = ffi_callback_code_;
+  const GrowableObjectArrayPtr array = ffi_callback_code_;
   if (array == GrowableObjectArray::null()) {
     FATAL("Cannot invoke callback on incorrect isolate.");
   }
 
-  const RawSmi* const length_smi =
-      GrowableObjectArray::NoSafepointLength(array);
+  const SmiPtr length_smi = GrowableObjectArray::NoSafepointLength(array);
   const intptr_t length = Smi::Value(length_smi);
 
   if (callback_id < 0 || callback_id >= length) {
@@ -1151,11 +1150,10 @@
   }
 
   if (entry != 0) {
-    RawObject** const code_array =
+    ObjectPtr* const code_array =
         Array::DataOf(GrowableObjectArray::NoSafepointData(array));
     // RawCast allocates handles in ASSERTs.
-    const RawCode* const code =
-        reinterpret_cast<RawCode*>(code_array[callback_id]);
+    const CodePtr code = static_cast<CodePtr>(code_array[callback_id]);
     if (!Code::ContainsInstructionAt(code, entry)) {
       FATAL("Cannot invoke callback on incorrect isolate.");
     }
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 9780e89..708916f 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -52,14 +52,6 @@
 class OSThread;
 class JSONObject;
 class PcDescriptors;
-class RawBool;
-class RawObject;
-class RawCode;
-class RawError;
-class RawGrowableObjectArray;
-class RawObjectPool;
-class RawStackTrace;
-class RawString;
 class RuntimeEntry;
 class Smi;
 class StackResource;
@@ -98,66 +90,66 @@
   V(TypeParameter)
 
 #define CACHED_VM_STUBS_LIST(V)                                                \
-  V(RawCode*, write_barrier_code_, StubCode::WriteBarrier().raw(), NULL)       \
-  V(RawCode*, array_write_barrier_code_, StubCode::ArrayWriteBarrier().raw(),  \
-    NULL)                                                                      \
-  V(RawCode*, fix_callers_target_code_, StubCode::FixCallersTarget().raw(),    \
-    NULL)                                                                      \
-  V(RawCode*, fix_allocation_stub_code_,                                       \
-    StubCode::FixAllocationStubTarget().raw(), NULL)                           \
-  V(RawCode*, invoke_dart_code_stub_, StubCode::InvokeDartCode().raw(), NULL)  \
-  V(RawCode*, invoke_dart_code_from_bytecode_stub_,                            \
-    StubCode::InvokeDartCodeFromBytecode().raw(), NULL)                        \
-  V(RawCode*, call_to_runtime_stub_, StubCode::CallToRuntime().raw(), NULL)    \
-  V(RawCode*, null_error_shared_without_fpu_regs_stub_,                        \
-    StubCode::NullErrorSharedWithoutFPURegs().raw(), NULL)                     \
-  V(RawCode*, null_error_shared_with_fpu_regs_stub_,                           \
-    StubCode::NullErrorSharedWithFPURegs().raw(), NULL)                        \
-  V(RawCode*, null_arg_error_shared_without_fpu_regs_stub_,                    \
-    StubCode::NullArgErrorSharedWithoutFPURegs().raw(), nullptr)               \
-  V(RawCode*, null_arg_error_shared_with_fpu_regs_stub_,                       \
-    StubCode::NullArgErrorSharedWithFPURegs().raw(), nullptr)                  \
-  V(RawCode*, range_error_shared_without_fpu_regs_stub_,                       \
-    StubCode::RangeErrorSharedWithoutFPURegs().raw(), nullptr)                 \
-  V(RawCode*, range_error_shared_with_fpu_regs_stub_,                          \
-    StubCode::RangeErrorSharedWithFPURegs().raw(), nullptr)                    \
-  V(RawCode*, allocate_mint_with_fpu_regs_stub_,                               \
-    StubCode::AllocateMintSharedWithFPURegs().raw(), NULL)                     \
-  V(RawCode*, allocate_mint_without_fpu_regs_stub_,                            \
-    StubCode::AllocateMintSharedWithoutFPURegs().raw(), NULL)                  \
-  V(RawCode*, allocate_object_stub_, StubCode::AllocateObject().raw(),         \
+  V(CodePtr, write_barrier_code_, StubCode::WriteBarrier().raw(), nullptr)     \
+  V(CodePtr, array_write_barrier_code_, StubCode::ArrayWriteBarrier().raw(),   \
     nullptr)                                                                   \
-  V(RawCode*, allocate_object_parameterized_stub_,                             \
+  V(CodePtr, fix_callers_target_code_, StubCode::FixCallersTarget().raw(),     \
+    nullptr)                                                                   \
+  V(CodePtr, fix_allocation_stub_code_,                                        \
+    StubCode::FixAllocationStubTarget().raw(), nullptr)                        \
+  V(CodePtr, invoke_dart_code_stub_, StubCode::InvokeDartCode().raw(),         \
+    nullptr)                                                                   \
+  V(CodePtr, invoke_dart_code_from_bytecode_stub_,                             \
+    StubCode::InvokeDartCodeFromBytecode().raw(), nullptr)                     \
+  V(CodePtr, call_to_runtime_stub_, StubCode::CallToRuntime().raw(), nullptr)  \
+  V(CodePtr, null_error_shared_without_fpu_regs_stub_,                         \
+    StubCode::NullErrorSharedWithoutFPURegs().raw(), nullptr)                  \
+  V(CodePtr, null_error_shared_with_fpu_regs_stub_,                            \
+    StubCode::NullErrorSharedWithFPURegs().raw(), nullptr)                     \
+  V(CodePtr, null_arg_error_shared_without_fpu_regs_stub_,                     \
+    StubCode::NullArgErrorSharedWithoutFPURegs().raw(), nullptr)               \
+  V(CodePtr, null_arg_error_shared_with_fpu_regs_stub_,                        \
+    StubCode::NullArgErrorSharedWithFPURegs().raw(), nullptr)                  \
+  V(CodePtr, range_error_shared_without_fpu_regs_stub_,                        \
+    StubCode::RangeErrorSharedWithoutFPURegs().raw(), nullptr)                 \
+  V(CodePtr, range_error_shared_with_fpu_regs_stub_,                           \
+    StubCode::RangeErrorSharedWithFPURegs().raw(), nullptr)                    \
+  V(CodePtr, allocate_mint_with_fpu_regs_stub_,                                \
+    StubCode::AllocateMintSharedWithFPURegs().raw(), nullptr)                  \
+  V(CodePtr, allocate_mint_without_fpu_regs_stub_,                             \
+    StubCode::AllocateMintSharedWithoutFPURegs().raw(), nullptr)               \
+  V(CodePtr, allocate_object_stub_, StubCode::AllocateObject().raw(), nullptr) \
+  V(CodePtr, allocate_object_parameterized_stub_,                              \
     StubCode::AllocateObjectParameterized().raw(), nullptr)                    \
-  V(RawCode*, allocate_object_slow_stub_,                                      \
-    StubCode::AllocateObjectSlow().raw(), nullptr)                             \
-  V(RawCode*, stack_overflow_shared_without_fpu_regs_stub_,                    \
-    StubCode::StackOverflowSharedWithoutFPURegs().raw(), NULL)                 \
-  V(RawCode*, stack_overflow_shared_with_fpu_regs_stub_,                       \
-    StubCode::StackOverflowSharedWithFPURegs().raw(), NULL)                    \
-  V(RawCode*, switchable_call_miss_stub_,                                      \
-    StubCode::SwitchableCallMiss().raw(), NULL)                                \
-  V(RawCode*, throw_stub_, StubCode::Throw().raw(), NULL)                      \
-  V(RawCode*, re_throw_stub_, StubCode::Throw().raw(), NULL)                   \
-  V(RawCode*, assert_boolean_stub_, StubCode::AssertBoolean().raw(), NULL)     \
-  V(RawCode*, optimize_stub_, StubCode::OptimizeFunction().raw(), NULL)        \
-  V(RawCode*, deoptimize_stub_, StubCode::Deoptimize().raw(), NULL)            \
-  V(RawCode*, lazy_deopt_from_return_stub_,                                    \
-    StubCode::DeoptimizeLazyFromReturn().raw(), NULL)                          \
-  V(RawCode*, lazy_deopt_from_throw_stub_,                                     \
-    StubCode::DeoptimizeLazyFromThrow().raw(), NULL)                           \
-  V(RawCode*, slow_type_test_stub_, StubCode::SlowTypeTest().raw(), NULL)      \
-  V(RawCode*, lazy_specialize_type_test_stub_,                                 \
-    StubCode::LazySpecializeTypeTest().raw(), NULL)                            \
-  V(RawCode*, enter_safepoint_stub_, StubCode::EnterSafepoint().raw(), NULL)   \
-  V(RawCode*, exit_safepoint_stub_, StubCode::ExitSafepoint().raw(), NULL)     \
-  V(RawCode*, call_native_through_safepoint_stub_,                             \
-    StubCode::CallNativeThroughSafepoint().raw(), NULL)
+  V(CodePtr, allocate_object_slow_stub_, StubCode::AllocateObjectSlow().raw(), \
+    nullptr)                                                                   \
+  V(CodePtr, stack_overflow_shared_without_fpu_regs_stub_,                     \
+    StubCode::StackOverflowSharedWithoutFPURegs().raw(), nullptr)              \
+  V(CodePtr, stack_overflow_shared_with_fpu_regs_stub_,                        \
+    StubCode::StackOverflowSharedWithFPURegs().raw(), nullptr)                 \
+  V(CodePtr, switchable_call_miss_stub_, StubCode::SwitchableCallMiss().raw(), \
+    nullptr)                                                                   \
+  V(CodePtr, throw_stub_, StubCode::Throw().raw(), nullptr)                    \
+  V(CodePtr, re_throw_stub_, StubCode::Throw().raw(), nullptr)                 \
+  V(CodePtr, assert_boolean_stub_, StubCode::AssertBoolean().raw(), nullptr)   \
+  V(CodePtr, optimize_stub_, StubCode::OptimizeFunction().raw(), nullptr)      \
+  V(CodePtr, deoptimize_stub_, StubCode::Deoptimize().raw(), nullptr)          \
+  V(CodePtr, lazy_deopt_from_return_stub_,                                     \
+    StubCode::DeoptimizeLazyFromReturn().raw(), nullptr)                       \
+  V(CodePtr, lazy_deopt_from_throw_stub_,                                      \
+    StubCode::DeoptimizeLazyFromThrow().raw(), nullptr)                        \
+  V(CodePtr, slow_type_test_stub_, StubCode::SlowTypeTest().raw(), nullptr)    \
+  V(CodePtr, lazy_specialize_type_test_stub_,                                  \
+    StubCode::LazySpecializeTypeTest().raw(), nullptr)                         \
+  V(CodePtr, enter_safepoint_stub_, StubCode::EnterSafepoint().raw(), nullptr) \
+  V(CodePtr, exit_safepoint_stub_, StubCode::ExitSafepoint().raw(), nullptr)   \
+  V(CodePtr, call_native_through_safepoint_stub_,                              \
+    StubCode::CallNativeThroughSafepoint().raw(), nullptr)
 
 #define CACHED_NON_VM_STUB_LIST(V)                                             \
-  V(RawObject*, object_null_, Object::null(), NULL)                            \
-  V(RawBool*, bool_true_, Object::bool_true().raw(), NULL)                     \
-  V(RawBool*, bool_false_, Object::bool_false().raw(), NULL)
+  V(ObjectPtr, object_null_, Object::null(), nullptr)                          \
+  V(BoolPtr, bool_true_, Object::bool_true().raw(), nullptr)                   \
+  V(BoolPtr, bool_false_, Object::bool_false().raw(), nullptr)
 
 // List of VM-global objects/addresses cached in each Thread object.
 // Important: constant false must immediately follow constant true.
@@ -212,7 +204,7 @@
   V(uword, auto_scope_native_wrapper_entry_point_,                             \
     NativeEntry::AutoScopeNativeCallWrapperEntry(), 0)                         \
   V(uword, interpret_call_entry_point_, RuntimeEntry::InterpretCallEntry(), 0) \
-  V(RawString**, predefined_symbols_address_, Symbols::PredefinedAddress(),    \
+  V(StringPtr*, predefined_symbols_address_, Symbols::PredefinedAddress(),     \
     NULL)                                                                      \
   V(uword, double_nan_address_, reinterpret_cast<uword>(&double_nan_constant), \
     0)                                                                         \
@@ -375,7 +367,7 @@
 
   void ScheduleInterrupts(uword interrupt_bits);
   void ScheduleInterruptsLocked(uword interrupt_bits);
-  RawError* HandleInterrupts();
+  ErrorPtr HandleInterrupts();
   uword GetAndClearInterrupts();
   bool HasScheduledInterrupts() const {
     return (stack_limit_ & kInterruptsMask) != 0;
@@ -470,10 +462,10 @@
     no_callback_scope_depth_ -= 1;
   }
 
-  void StoreBufferAddObject(RawObject* obj);
-  void StoreBufferAddObjectGC(RawObject* obj);
+  void StoreBufferAddObject(ObjectPtr obj);
+  void StoreBufferAddObjectGC(ObjectPtr obj);
 #if defined(TESTING)
-  bool StoreBufferContains(RawObject* obj) const {
+  bool StoreBufferContains(ObjectPtr obj) const {
     return store_buffer_block_->Contains(obj);
   }
 #endif
@@ -483,8 +475,8 @@
   }
 
   bool is_marking() const { return marking_stack_block_ != NULL; }
-  void MarkingStackAddObject(RawObject* obj);
-  void DeferredMarkingStackAddObject(RawObject* obj);
+  void MarkingStackAddObject(ObjectPtr obj);
+  void DeferredMarkingStackAddObject(ObjectPtr obj);
   void MarkingStackBlockProcess();
   void DeferredMarkingStackBlockProcess();
   static intptr_t marking_stack_block_offset() {
@@ -584,8 +576,8 @@
   LEAF_RUNTIME_ENTRY_LIST(DEFINE_OFFSET_METHOD)
 #undef DEFINE_OFFSET_METHOD
 
-  RawObjectPool* global_object_pool() const { return global_object_pool_; }
-  void set_global_object_pool(RawObjectPool* raw_value) {
+  ObjectPoolPtr global_object_pool() const { return global_object_pool_; }
+  void set_global_object_pool(ObjectPoolPtr raw_value) {
     global_object_pool_ = raw_value;
   }
 
@@ -620,7 +612,7 @@
     return OFFSET_OF(Thread, unboxed_int64_runtime_arg_);
   }
 
-  RawGrowableObjectArray* pending_functions();
+  GrowableObjectArrayPtr pending_functions();
   void clear_pending_functions();
 
   static intptr_t global_object_pool_offset() {
@@ -631,13 +623,13 @@
     return OFFSET_OF(Thread, dispatch_table_array_);
   }
 
-  RawObject* active_exception() const { return active_exception_; }
+  ObjectPtr active_exception() const { return active_exception_; }
   void set_active_exception(const Object& value);
   static intptr_t active_exception_offset() {
     return OFFSET_OF(Thread, active_exception_);
   }
 
-  RawObject* active_stacktrace() const { return active_stacktrace_; }
+  ObjectPtr active_stacktrace() const { return active_stacktrace_; }
   void set_active_stacktrace(const Object& value);
   static intptr_t active_stacktrace_offset() {
     return OFFSET_OF(Thread, active_stacktrace_);
@@ -647,14 +639,14 @@
   void set_resume_pc(uword value) { resume_pc_ = value; }
   static uword resume_pc_offset() { return OFFSET_OF(Thread, resume_pc_); }
 
-  RawError* sticky_error() const;
+  ErrorPtr sticky_error() const;
   void set_sticky_error(const Error& value);
   void ClearStickyError();
-  DART_WARN_UNUSED_RESULT RawError* StealStickyError();
+  DART_WARN_UNUSED_RESULT ErrorPtr StealStickyError();
 
-  RawStackTrace* async_stack_trace() const;
+  StackTracePtr async_stack_trace() const;
   void set_async_stack_trace(const StackTrace& stack_trace);
-  void set_raw_async_stack_trace(RawStackTrace* raw_stack_trace);
+  void set_raw_async_stack_trace(StackTracePtr raw_stack_trace);
   void clear_async_stack_trace();
   static intptr_t async_stack_trace_offset() {
     return OFFSET_OF(Thread, async_stack_trace_);
@@ -911,14 +903,14 @@
   // is important for code size (although code size on X64 is not a priority).
   uword saved_stack_limit_;
   uword stack_overflow_flags_;
-  RawInstance** field_table_values_;
+  InstancePtr* field_table_values_;
   Heap* heap_;
   uword volatile top_exit_frame_info_;
   StoreBufferBlock* store_buffer_block_;
   MarkingStackBlock* marking_stack_block_;
   MarkingStackBlock* deferred_marking_stack_block_;
   uword volatile vm_tag_;
-  RawStackTrace* async_stack_trace_;
+  StackTracePtr async_stack_trace_;
   // Memory location dedicated for passing unboxed int64 values from
   // generated code to runtime.
   // TODO(dartbug.com/33549): Clean this up when unboxed values
@@ -945,14 +937,14 @@
 #endif
 
   // JumpToExceptionHandler state:
-  RawObject* active_exception_;
-  RawObject* active_stacktrace_;
-  RawObjectPool* global_object_pool_;
+  ObjectPtr active_exception_;
+  ObjectPtr active_stacktrace_;
+  ObjectPoolPtr global_object_pool_;
   uword resume_pc_;
   uword saved_shadow_call_stack_ = 0;
   uword execution_state_;
   std::atomic<uword> safepoint_state_;
-  RawGrowableObjectArray* ffi_callback_code_;
+  GrowableObjectArrayPtr ffi_callback_code_;
 
   // ---- End accessed from generated code. ----
 
@@ -981,16 +973,16 @@
   CompilerState* compiler_state_ = nullptr;
   HierarchyInfo* hierarchy_info_;
   TypeUsageInfo* type_usage_info_;
-  RawGrowableObjectArray* pending_functions_;
+  GrowableObjectArrayPtr pending_functions_;
 
-  RawError* sticky_error_;
+  ErrorPtr sticky_error_;
 
   Random thread_random_;
 
   intptr_t ffi_marshalled_arguments_size_ = 0;
   uint64_t* ffi_marshalled_arguments_;
 
-  RawInstance** field_table_values() const { return field_table_values_; }
+  InstancePtr* field_table_values() const { return field_table_values_; }
 
 // Reusable handles support.
 #define REUSABLE_HANDLE_FIELDS(object) object* object##_handle_;
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index 70a4da9..3465d48 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -85,8 +85,8 @@
   explicit ObjectCounter(IsolateGroup* isolate_group, const Object* obj)
       : ObjectPointerVisitor(isolate_group), obj_(obj), count_(0) {}
 
-  virtual void VisitPointers(RawObject** first, RawObject** last) {
-    for (RawObject** current = first; current <= last; ++current) {
+  virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+    for (ObjectPtr* current = first; current <= last; ++current) {
       if (*current == obj_->raw()) {
         ++count_;
       }
@@ -465,8 +465,8 @@
   const String& function_name =
       String::ZoneHandle(Symbols::New(Thread::Current(), name));
   Function& function = Function::ZoneHandle(Function::New(
-      function_name, RawFunction::kRegularFunction, true, false, false, false,
-      false, owner_class, TokenPosition::kNoSource));
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kNoSource));
   return &function;
 }
 
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index 8e4199f..e45b144 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -31,7 +31,6 @@
 class Object;
 class ObjectPointerVisitor;
 class Isolate;
-class RawArray;
 class Thread;
 class TimelineEvent;
 class TimelineEventBlock;
diff --git a/runtime/vm/type_table.h b/runtime/vm/type_table.h
index e9c21a2..003e8e8 100644
--- a/runtime/vm/type_table.h
+++ b/runtime/vm/type_table.h
@@ -44,7 +44,7 @@
     return Type::Cast(key).Hash();
   }
   static uword Hash(const CanonicalTypeKey& key) { return key.Hash(); }
-  static RawObject* NewKey(const CanonicalTypeKey& obj) {
+  static ObjectPtr NewKey(const CanonicalTypeKey& obj) {
     return obj.key_.raw();
   }
 };
@@ -85,7 +85,7 @@
     return TypeArguments::Cast(key).Hash();
   }
   static uword Hash(const CanonicalTypeArgumentsKey& key) { return key.Hash(); }
-  static RawObject* NewKey(const CanonicalTypeArgumentsKey& obj) {
+  static ObjectPtr NewKey(const CanonicalTypeArgumentsKey& obj) {
     return obj.key_.raw();
   }
 };
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index ca27574..aac0b9c 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -88,7 +88,7 @@
   return cname;
 }
 
-RawCode* TypeTestingStubGenerator::DefaultCodeForType(
+CodePtr TypeTestingStubGenerator::DefaultCodeForType(
     const AbstractType& type,
     bool lazy_specialize /* = true */) {
   if (type.IsTypeRef()) {
@@ -102,7 +102,7 @@
   if (!StubCode::HasBeenInitialized()) {
     ASSERT(type.IsType());
     const classid_t cid = type.type_class_id();
-    ASSERT(cid == kDynamicCid || cid == kVoidCid || cid == kNeverCid);
+    ASSERT(cid == kDynamicCid || cid == kVoidCid);
     return Code::null();
   }
 
@@ -139,7 +139,7 @@
 TypeTestingStubGenerator::TypeTestingStubGenerator()
     : object_store_(Isolate::Current()->object_store()) {}
 
-RawCode* TypeTestingStubGenerator::OptimizedCodeForType(
+CodePtr TypeTestingStubGenerator::OptimizedCodeForType(
     const AbstractType& type) {
 #if !defined(TARGET_ARCH_IA32)
   ASSERT(StubCode::HasBeenInitialized());
@@ -178,7 +178,7 @@
 #if !defined(TARGET_ARCH_IA32)
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
-RawCode* TypeTestingStubGenerator::BuildCodeForType(const Type& type) {
+CodePtr TypeTestingStubGenerator::BuildCodeForType(const Type& type) {
   auto thread = Thread::Current();
   auto zone = thread->zone();
   HierarchyInfo* hi = thread->hierarchy_info();
@@ -633,7 +633,7 @@
   return *instantiated_type_arguments;
 }
 
-RawAbstractType* TypeArgumentInstantiator::InstantiateType(
+AbstractTypePtr TypeArgumentInstantiator::InstantiateType(
     const AbstractType& type) {
   if (type.IsTypeParameter()) {
     const TypeParameter& parameter = TypeParameter::Cast(type);
@@ -941,7 +941,7 @@
     CollectTypes(GrowableArray<AbstractType*>* types, Zone* zone)
         : types_(types), object_(Object::Handle(zone)), zone_(zone) {}
 
-    void VisitObject(RawObject* object) {
+    void VisitObject(ObjectPtr object) {
       if (object->IsPseudoObject()) {
         // Cannot even be wrapped in handles.
         return;
diff --git a/runtime/vm/type_testing_stubs.h b/runtime/vm/type_testing_stubs.h
index 345ef31..f4a64ff 100644
--- a/runtime/vm/type_testing_stubs.h
+++ b/runtime/vm/type_testing_stubs.h
@@ -41,8 +41,8 @@
   // During bootstrapping it will return `null` for a whitelisted set of types,
   // otherwise it will return a default stub which tail-calls
   // subtypingtest/runtime code.
-  static RawCode* DefaultCodeForType(const AbstractType& type,
-                                     bool lazy_specialize = true);
+  static CodePtr DefaultCodeForType(const AbstractType& type,
+                                    bool lazy_specialize = true);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   static void SpecializeStubFor(Thread* thread, const AbstractType& type);
@@ -52,12 +52,12 @@
 
   // Creates new stub for [type] (and registers the tuple in object store
   // array) or returns default stub.
-  RawCode* OptimizedCodeForType(const AbstractType& type);
+  CodePtr OptimizedCodeForType(const AbstractType& type);
 
  private:
 #if !defined(TARGET_ARCH_IA32)
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  RawCode* BuildCodeForType(const Type& type);
+  CodePtr BuildCodeForType(const Type& type);
   static void BuildOptimizedTypeTestStub(
       compiler::Assembler* assembler,
       compiler::UnresolvedPcRelativeCalls* unresolved_calls,
@@ -247,7 +247,7 @@
         type_arguments_handles_(zone),
         type_handles_(zone) {}
 
-  RawTypeArguments* Instantiate(
+  TypeArgumentsPtr Instantiate(
       const Class& klass,
       const TypeArguments& type_arguments,
       const TypeArguments& instantiator_type_arguments) {
@@ -260,7 +260,7 @@
       const Class& klass,
       const TypeArguments& type_arguments);
 
-  RawAbstractType* InstantiateType(const AbstractType& type);
+  AbstractTypePtr InstantiateType(const AbstractType& type);
 
   Class& klass_;
   AbstractType& type_;
diff --git a/runtime/vm/type_testing_stubs_test.cc b/runtime/vm/type_testing_stubs_test.cc
index fccb41e..57e9459 100644
--- a/runtime/vm/type_testing_stubs_test.cc
+++ b/runtime/vm/type_testing_stubs_test.cc
@@ -47,8 +47,8 @@
   const auto& symbol = String::Handle(
       Symbols::New(thread, OS::SCreate(thread->zone(), "TTSTest")));
   const auto& function = Function::Handle(
-      Function::New(symbol, RawFunction::kRegularFunction, false, false, false,
-                    false, false, klass, TokenPosition::kNoSource));
+      Function::New(symbol, FunctionLayout::kRegularFunction, false, false,
+                    false, false, false, klass, TokenPosition::kNoSource));
   compiler::ObjectPoolBuilder pool_builder;
   const auto& invoke_tts = Code::Handle(
       StubCode::Generate("InvokeTTS", &pool_builder, &GenerateInvokeTTSStub));
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 29c3245..2db8a7b 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -655,9 +655,9 @@
   const Library& lib = Library::Handle(Library::CoreLibrary());
   const Class& cls = Class::ZoneHandle(
       Class::New(lib, function_name, script, TokenPosition::kMinSource));
-  Function& function = Function::ZoneHandle(
-      Function::New(function_name, RawFunction::kRegularFunction, true, false,
-                    false, false, false, cls, TokenPosition::kMinSource));
+  Function& function = Function::ZoneHandle(Function::New(
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, cls, TokenPosition::kMinSource));
   code_ = Code::FinalizeCodeAndNotify(function, nullptr, assembler_,
                                       Code::PoolAttachment::kAttachPool);
   code_.set_owner(function);
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 21fc9cb..f576b71 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -540,8 +540,8 @@
     const bool fp_args = false;
     const bool fp_return = false;
     Simulator::Current()->Call(
-        bit_cast<intptr_t, uword>(entry()), reinterpret_cast<intptr_t>(arg1),
-        reinterpret_cast<intptr_t>(arg2), reinterpret_cast<intptr_t>(arg3), 0,
+        bit_cast<intptr_t, uword>(entry()), static_cast<intptr_t>(arg1),
+        static_cast<intptr_t>(arg2), reinterpret_cast<intptr_t>(arg3), 0,
         fp_return, fp_args);
   }
 #else
diff --git a/runtime/vm/visitor.h b/runtime/vm/visitor.h
index 2dd68f4..93baf0d 100644
--- a/runtime/vm/visitor.h
+++ b/runtime/vm/visitor.h
@@ -15,9 +15,6 @@
 // Forward declarations.
 class Isolate;
 class IsolateGroup;
-class RawObject;
-class RawFunction;
-class RawTypedDataView;
 
 // An object pointer visitor interface.
 class ObjectPointerVisitor {
@@ -30,21 +27,21 @@
   // Visit pointers inside the given typed data [view].
   //
   // Range of pointers to visit 'first' <= pointer <= 'last'.
-  virtual void VisitTypedDataViewPointers(RawTypedDataView* view,
-                                          RawObject** first,
-                                          RawObject** last) {
+  virtual void VisitTypedDataViewPointers(TypedDataViewPtr view,
+                                          ObjectPtr* first,
+                                          ObjectPtr* last) {
     VisitPointers(first, last);
   }
 
   // Range of pointers to visit 'first' <= pointer <= 'last'.
-  virtual void VisitPointers(RawObject** first, RawObject** last) = 0;
+  virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) = 0;
 
   // len argument is the number of pointers to visit starting from 'p'.
-  void VisitPointers(RawObject** p, intptr_t len) {
+  void VisitPointers(ObjectPtr* p, intptr_t len) {
     VisitPointers(p, (p + len - 1));
   }
 
-  void VisitPointer(RawObject** p) { VisitPointers(p, p); }
+  void VisitPointer(ObjectPtr* p) { VisitPointers(p, p); }
 
   const char* gc_root_type() const { return gc_root_type_; }
   void set_gc_root_type(const char* gc_root_type) {
@@ -75,7 +72,7 @@
   virtual ~ObjectVisitor() {}
 
   // Invoked for each object.
-  virtual void VisitObject(RawObject* obj) = 0;
+  virtual void VisitObject(ObjectPtr obj) = 0;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(ObjectVisitor);
@@ -95,7 +92,7 @@
   }
 
   // Check if object matches find condition.
-  virtual bool FindObject(RawObject* obj) const = 0;
+  virtual bool FindObject(ObjectPtr obj) const = 0;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(FindObjectVisitor);
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index b343437..8579a96 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -125,7 +125,7 @@
   ],
   [
     "dartdev",
-    "../utils/dartdev",
+    "../utils/dartdev:generate_dartdev_snapshot",
   ],
   [
     "dartdoc",
@@ -170,7 +170,7 @@
   ],
   [
     "dartdev",
-    "../utils/dartdev",
+    "../utils/dartdev:generate_dartdev_snapshot",
   ],
   [
     "dartdevc",
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 a220dac..dea22f5 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -166,19 +166,20 @@
   static int _keyCount = 0;
 }
 
-Null _kNull(_) => null;
-
 @patch
 class int {
   @patch
   static int parse(String source,
       {int radix, @deprecated int onError(String source)}) {
-    return Primitives.parseInt(source, radix, onError);
+    var value = tryParse(source, radix: radix);
+    if (value != null) return value;
+    if (onError != null) return onError(source);
+    throw new FormatException(source);
   }
 
   @patch
   static int tryParse(String source, {int radix}) {
-    return Primitives.parseInt(source, radix, _kNull);
+    return Primitives.parseInt(source, radix);
   }
 
   @patch
@@ -209,12 +210,15 @@
   @patch
   static double parse(String source,
       [@deprecated double onError(String source)]) {
-    return Primitives.parseDouble(source, onError);
+    var value = tryParse(source);
+    if (value != null) return value;
+    if (onError != null) return onError(source);
+    throw new FormatException('Invalid double', source);
   }
 
   @patch
   static double tryParse(String source) {
-    return Primitives.parseDouble(source, _kNull);
+    return Primitives.parseDouble(source);
   }
 
   @JSExportName('is')
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 22d9d3d..5a95fef 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
@@ -271,7 +271,7 @@
 /// normalization doc:
 /// https://github.com/dart-lang/language/blob/master/resources/type-system/normalization.md
 @notNull
-Object nullable(type) {
+Object nullable(@notNull Object type) {
   // Check if a nullable version of this type has already been created.
   var cached = JS<Object>('', '#[#]', type, _cachedNullable);
   if (JS<bool>('!', '# !== void 0', cached)) {
@@ -284,7 +284,7 @@
   return cachedType;
 }
 
-Object _computeNullable(type) {
+Object _computeNullable(@notNull Object type) {
   // *? normalizes to ?.
   if (_jsInstanceOf(type, LegacyType)) {
     return nullable(JS<Object>('!', '#.type', type));
@@ -309,7 +309,7 @@
 /// normalization doc:
 /// https://github.com/dart-lang/language/blob/master/resources/type-system/normalization.md
 @notNull
-Object legacy(type) {
+Object legacy(@notNull Object type) {
   // Check if a legacy version of this type has already been created.
   var cached = JS<Object>('', '#[#]', type, _cachedLegacy);
   if (JS<bool>('!', '# !== void 0', cached)) {
@@ -322,7 +322,7 @@
   return cachedType;
 }
 
-Object _computeLegacy(type) {
+Object _computeLegacy(@notNull Object type) {
   // Note: ?* normalizes to ?, so we cache type? at type?[_cachedLegacy].
   if (_jsInstanceOf(type, LegacyType) ||
       _jsInstanceOf(type, NullableType) ||
@@ -337,7 +337,7 @@
 class NullableType extends DartType {
   final Type type;
 
-  NullableType(this.type);
+  NullableType(@notNull this.type);
 
   @override
   String get name => '$type?';
@@ -358,7 +358,7 @@
 class LegacyType extends DartType {
   final Type type;
 
-  LegacyType(this.type);
+  LegacyType(@notNull this.type);
 
   @override
   String get name => '$type';
@@ -1140,7 +1140,7 @@
 })()''');
 
 /// Returns true if [ft1] <: [ft2].
-_isFunctionSubtype(ft1, ft2, bool strictMode) => JS('', '''(() => {
+_isFunctionSubtype(ft1, ft2, @notNull bool strictMode) => JS('', '''(() => {
   let ret1 = $ft1.returnType;
   let ret2 = $ft2.returnType;
 
@@ -1233,7 +1233,7 @@
 
 /// Returns true if [t1] <: [t2].
 @notNull
-bool isSubtypeOf(Object t1, Object t2) {
+bool isSubtypeOf(@notNull Object t1, @notNull Object t2) {
   // TODO(jmesserly): we've optimized `is`/`as`/implicit type checks, so they're
   // dispatched on the type. Can we optimize the subtype relation too?
   var map = JS<Object>('!', '#[#]', t1, _subtypeCache);
@@ -1313,7 +1313,7 @@
 }
 
 @notNull
-bool _isSubtype(t1, t2, bool strictMode) => JS<bool>('!', '''(() => {
+bool _isSubtype(t1, t2, @notNull bool strictMode) => JS<bool>('!', '''(() => {
   if (!$strictMode) {
     // Strip nullable types when performing check in weak mode.
     // TODO(nshahan) Investigate stripping off legacy types as well.
@@ -1504,7 +1504,7 @@
   return ${_isFunctionSubtype(t1, t2, strictMode)};
 })()''');
 
-bool _isInterfaceSubtype(t1, t2, strictMode) => JS('', '''(() => {
+bool _isInterfaceSubtype(t1, t2, @notNull bool strictMode) => JS('', '''(() => {
   // If we have lazy JS types, unwrap them.  This will effectively
   // reduce to a prototype check below.
   if (${_jsInstanceOf(t1, LazyJSType)}) $t1 = $t1.rawJSTypeForCheck();
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
index d14d9ed..b7d17d0d 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
@@ -70,14 +70,7 @@
 }
 
 class Primitives {
-  @NoInline()
-  static int _parseIntError(String source, int handleError(String source)) {
-    if (handleError == null) throw FormatException(source);
-    return handleError(source);
-  }
-
-  static int parseInt(
-      @nullCheck String source, int _radix, int handleError(String source)) {
+  static int parseInt(@nullCheck String source, int _radix) {
     var re = JS('', r'/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i');
     // TODO(jmesserly): this isn't reified List<String>, but it's safe to use as
     // long as we use it locally and don't expose it to user code.
@@ -89,7 +82,7 @@
       // TODO(sra): It might be that the match failed due to unrecognized U+0085
       // spaces.  We could replace them with U+0020 spaces and try matching
       // again.
-      return _parseIntError(source, handleError);
+      return null;
     }
     String decimalMatch = match[decimalIndex];
     if (_radix == null) {
@@ -101,7 +94,7 @@
         // Cannot fail because we know that the digits are all hex.
         return JS<int>('!', r'parseInt(#, 16)', source);
       }
-      return _parseIntError(source, handleError);
+      return null;
     }
     @notNull
     var radix = _radix;
@@ -138,7 +131,7 @@
       for (int i = 0; i < digitsPart.length; i++) {
         int characterCode = digitsPart.codeUnitAt(i) | 0x20;
         if (characterCode > maxCharCode) {
-          return _parseIntError(source, handleError);
+          return null;
         }
       }
     }
@@ -147,17 +140,7 @@
     return JS<int>('!', r'parseInt(#, #)', source, radix);
   }
 
-  @NoInline()
-  static double _parseDoubleError(
-      String source, double handleError(String source)) {
-    if (handleError == null) {
-      throw FormatException('Invalid double', source);
-    }
-    return handleError(source);
-  }
-
-  static double parseDouble(
-      @nullCheck String source, double handleError(String source)) {
+  static double parseDouble(@nullCheck String source) {
     // Notice that JS parseFloat accepts garbage at the end of the string.
     // Accept only:
     // - [+/-]NaN
@@ -169,15 +152,15 @@
         r'/^\s*[+-]?(?:Infinity|NaN|'
             r'(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(#)',
         source)) {
-      return _parseDoubleError(source, handleError);
+      return null;
     }
-    num result = JS('!', r'parseFloat(#)', source);
+    var result = JS<double>('!', r'parseFloat(#)', source);
     if (result.isNaN) {
       var trimmed = source.trim();
       if (trimmed == 'NaN' || trimmed == '+NaN' || trimmed == '-NaN') {
         return result;
       }
-      return _parseDoubleError(source, handleError);
+      return null;
     }
     return result;
   }
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 338e8cf..d0e7ee1 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -416,7 +416,6 @@
     int digitsIndex = 1;
     int hexIndex = 2;
     int decimalIndex = 3;
-    int nonDecimalHexIndex = 4;
     if (match == null) {
       // TODO(sra): It might be that the match failed due to unrecognized U+0085
       // spaces.  We could replace them with U+0020 spaces and try matching
diff --git a/sdk/lib/_internal/vm/bin/vmservice_io.dart b/sdk/lib/_internal/vm/bin/vmservice_io.dart
index 7e3146d..06564f5 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_io.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_io.dart
@@ -7,11 +7,8 @@
 library vmservice_io;
 
 import 'dart:async';
-import 'dart:collection';
 import 'dart:convert';
 import 'dart:io';
-import 'dart:isolate';
-import 'dart:typed_data';
 import 'dart:_vmservice';
 
 part 'vmservice_server.dart';
@@ -209,6 +206,11 @@
   }
 }
 
+void webServerAcceptNewWebSocketConnections(bool enable) {
+  _lazyServerBoot();
+  server.acceptNewWebSocketConnections = enable;
+}
+
 Null _clearFuture(_) {
   serverFuture = null;
 }
@@ -254,6 +256,8 @@
   VMServiceEmbedderHooks.listFiles = listFilesCallback;
   VMServiceEmbedderHooks.serverInformation = serverInformationCallback;
   VMServiceEmbedderHooks.webServerControl = webServerControlCallback;
+  VMServiceEmbedderHooks.acceptNewWebSocketConnections =
+      webServerAcceptNewWebSocketConnections;
   // Always instantiate the vmservice object so that the exit message
   // can be delivered and waiting loaders can be cancelled.
   new VMService();
diff --git a/sdk/lib/_internal/vm/bin/vmservice_server.dart b/sdk/lib/_internal/vm/bin/vmservice_server.dart
index 06f39b6..26111d0 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_server.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_server.dart
@@ -153,6 +153,7 @@
   final String _serviceInfoFilename;
   HttpServer _server;
   bool get running => _server != null;
+  bool acceptNewWebSocketConnections = true;
   int _port = -1;
 
   /// Returns the server address including the auth token.
@@ -352,11 +353,19 @@
 
     final String path = result;
     if (path == WEBSOCKET_PATH) {
-      WebSocketTransformer.upgrade(request,
-              compression: CompressionOptions.compressionOff)
-          .then((WebSocket webSocket) {
-        new WebSocketClient(webSocket, _service);
-      });
+      if (acceptNewWebSocketConnections) {
+        WebSocketTransformer.upgrade(request,
+                compression: CompressionOptions.compressionOff)
+            .then((WebSocket webSocket) {
+          new WebSocketClient(webSocket, _service);
+        });
+      } else {
+        request.response.statusCode = HttpStatus.forbidden;
+        request.response.write('Cannot connect directly to the VM service as '
+            'a Dart Development Service (DDS) instance has taken control and '
+            'can be found at ${_service.ddsUri}.');
+        request.response.close();
+      }
       return;
     }
 
diff --git a/sdk/lib/_internal/vm/lib/internal_patch.dart b/sdk/lib/_internal/vm/lib/internal_patch.dart
index 515ad8b..6accfc3 100644
--- a/sdk/lib/_internal/vm/lib/internal_patch.dart
+++ b/sdk/lib/_internal/vm/lib/internal_patch.dart
@@ -11,6 +11,7 @@
 
 import "dart:core" hide Symbol;
 
+import "dart:isolate" show SendPort;
 import "dart:typed_data" show Int32List;
 
 /// These are the additional parts of this patch library:
@@ -130,3 +131,6 @@
 // This is implemented by a recognized method, but in bytecode through a native.
 @pragma('vm:prefer-inline')
 void reachabilityFence(Object object) native "Internal_reachabilityFence";
+
+void sendAndExit(SendPort sendPort, var message)
+    native "SendPortImpl_sendAndExitInternal_";
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index c7cefce..df685d5 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -551,6 +551,10 @@
       _chainFuture(value);
       return;
     }
+    _asyncCompleteWithValue(value);
+  }
+
+  void _asyncCompleteWithValue(T value) {
     _setPendingComplete();
     _zone.scheduleMicrotask(() {
       _completeWithValue(value);
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index 81a2ac7..82ef7c2 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -179,6 +179,10 @@
 /// Called when we want to [enable] or disable the web server.
 typedef Future<Uri> WebServerControlCallback(bool enable);
 
+/// Called when we want to [enable] or disable new websocket connections to the
+/// server.
+typedef void WebServerAcceptNewWebSocketConnectionsCallback(bool enable);
+
 /// Hooks that are setup by the embedder.
 class VMServiceEmbedderHooks {
   static ServerStartCallback serverStart;
@@ -192,6 +196,8 @@
   static ListFilesCallback listFiles;
   static ServerInformationCallback serverInformation;
   static WebServerControlCallback webServerControl;
+  static WebServerAcceptNewWebSocketConnectionsCallback
+      acceptNewWebSocketConnections;
 }
 
 class _ClientResumePermissions {
@@ -224,6 +230,33 @@
 
   final devfs = new DevFS();
 
+  Uri get ddsUri => _ddsUri;
+  Uri _ddsUri;
+
+  Future<String> _yieldControlToDDS(Message message) async {
+    final acceptNewWebSocketConnections =
+        VMServiceEmbedderHooks.acceptNewWebSocketConnections;
+    if (acceptNewWebSocketConnections == null) {
+      return encodeRpcError(message, kFeatureDisabled,
+          details:
+              'Embedder does not support yielding to a VM service intermediary.');
+    }
+    final uri = message.params['uri'];
+    if (uri == null) {
+      return encodeMissingParamError(message, 'uri');
+    }
+    // DDS can only take control if there is no other clients connected
+    // directly to the VM service.
+    if (clients.length > 1) {
+      return encodeRpcError(message, kFeatureDisabled,
+          details:
+              'Existing VM service clients prevent DDS from taking control.');
+    }
+    acceptNewWebSocketConnections(false);
+    _ddsUri = Uri.parse(uri);
+    return encodeSuccess(message);
+  }
+
   void _clearClientName(Client client) {
     final name = client.name;
     client.name = null;
@@ -362,6 +395,16 @@
     for (var handle in client.serviceHandles.values) {
       handle(null);
     }
+    if (clients.isEmpty) {
+      // If DDS was connected, we are in single client mode and need to
+      // allow for new websocket connections.
+      final acceptNewWebSocketConnections =
+          VMServiceEmbedderHooks.acceptNewWebSocketConnections;
+      if (_ddsUri != null && acceptNewWebSocketConnections != null) {
+        acceptNewWebSocketConnections(true);
+        _ddsUri = null;
+      }
+    }
   }
 
   void _eventMessageHandler(String streamId, Response event) {
@@ -725,6 +768,9 @@
       if (message.completed) {
         return await message.response;
       }
+      if (message.method == '_yieldControlToDDS') {
+        return await _yieldControlToDDS(message);
+      }
       if (message.method == 'streamListen') {
         return await _streamListen(message);
       }
diff --git a/sdk_nnbd/BUILD.gn b/sdk_nnbd/BUILD.gn
index b343437..8579a96 100644
--- a/sdk_nnbd/BUILD.gn
+++ b/sdk_nnbd/BUILD.gn
@@ -125,7 +125,7 @@
   ],
   [
     "dartdev",
-    "../utils/dartdev",
+    "../utils/dartdev:generate_dartdev_snapshot",
   ],
   [
     "dartdoc",
@@ -170,7 +170,7 @@
   ],
   [
     "dartdev",
-    "../utils/dartdev",
+    "../utils/dartdev:generate_dartdev_snapshot",
   ],
   [
     "dartdevc",
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 d2c62cf..1d3e398 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
@@ -167,19 +167,20 @@
   static int _keyCount = 0;
 }
 
-Null _kNull(_) => null;
-
 @patch
 class int {
   @patch
   static int parse(String source,
       {int? radix, @deprecated int onError(String source)?}) {
-    return Primitives.parseInt(source, radix, onError)!;
+    var value = tryParse(source, radix: radix);
+    if (value != null) return value;
+    if (onError != null) return onError(source);
+    throw new FormatException(source);
   }
 
   @patch
   static int? tryParse(String source, {int? radix}) {
-    return Primitives.parseInt(source, radix, _kNull);
+    return Primitives.parseInt(source, radix);
   }
 
   @patch
@@ -209,12 +210,15 @@
   @patch
   static double parse(String source,
       [@deprecated double onError(String source)?]) {
-    return Primitives.parseDouble(source, onError)!;
+    var value = tryParse(source);
+    if (value != null) return value;
+    if (onError != null) return onError(source);
+    throw new FormatException('Invalid double', source);
   }
 
   @patch
   static double? tryParse(String source) {
-    return Primitives.parseDouble(source, _kNull);
+    return Primitives.parseDouble(source);
   }
 
   @JSExportName('is')
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/internal_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/internal_patch.dart
index 536b653..4d6a130 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/internal_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/internal_patch.dart
@@ -10,6 +10,14 @@
 import 'dart:_foreign_helper' show JS;
 import 'dart:_runtime' as dart;
 
+// TODO(41657) Make a constant when CFE evaluates in the null safety mode.
+var isLegacySubtyping = const <Null>[] is List<int>;
+
+@patch
+bool typeAcceptsNull<T>() {
+  return isLegacySubtyping || null is T;
+}
+
 @patch
 class Symbol implements core.Symbol {
   @patch
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 e0c6c15..4d404ae 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
@@ -269,7 +269,7 @@
 /// normalization doc:
 /// https://github.com/dart-lang/language/blob/master/resources/type-system/normalization.md
 @notNull
-Object nullable(type) {
+Object nullable(@notNull Object type) {
   // Check if a nullable version of this type has already been created.
   var cached = JS<Object>('', '#[#]', type, _cachedNullable);
   if (JS<bool>('!', '# !== void 0', cached)) {
@@ -282,7 +282,7 @@
   return cachedType;
 }
 
-Object _computeNullable(type) {
+Object _computeNullable(@notNull Object type) {
   // *? normalizes to ?.
   if (_jsInstanceOf(type, LegacyType)) {
     return nullable(JS<Object>('!', '#.type', type));
@@ -307,7 +307,7 @@
 /// normalization doc:
 /// https://github.com/dart-lang/language/blob/master/resources/type-system/normalization.md
 @notNull
-Object legacy(type) {
+Object legacy(@notNull Object type) {
   // Check if a legacy version of this type has already been created.
   var cached = JS<Object>('', '#[#]', type, _cachedLegacy);
   if (JS<bool>('!', '# !== void 0', cached)) {
@@ -320,7 +320,7 @@
   return cachedType;
 }
 
-Object _computeLegacy(type) {
+Object _computeLegacy(@notNull Object type) {
   // Note: ?* normalizes to ?, so we cache type? at type?[_cachedLegacy].
   if (_jsInstanceOf(type, LegacyType) ||
       _jsInstanceOf(type, NullableType) ||
@@ -335,7 +335,7 @@
 class NullableType extends DartType {
   final Type type;
 
-  NullableType(this.type);
+  NullableType(@notNull this.type);
 
   @override
   String get name => '$type?';
@@ -356,7 +356,7 @@
 class LegacyType extends DartType {
   final Type type;
 
-  LegacyType(this.type);
+  LegacyType(@notNull this.type);
 
   @override
   String get name => '$type';
@@ -1138,7 +1138,7 @@
 })()''');
 
 /// Returns true if [ft1] <: [ft2].
-_isFunctionSubtype(ft1, ft2, bool strictMode) => JS('', '''(() => {
+_isFunctionSubtype(ft1, ft2, @notNull bool strictMode) => JS('', '''(() => {
   let ret1 = $ft1.returnType;
   let ret2 = $ft2.returnType;
 
@@ -1231,7 +1231,7 @@
 
 /// Returns true if [t1] <: [t2].
 @notNull
-bool isSubtypeOf(Object t1, Object t2) {
+bool isSubtypeOf(@notNull Object t1, @notNull Object t2) {
   // TODO(jmesserly): we've optimized `is`/`as`/implicit type checks, so they're
   // dispatched on the type. Can we optimize the subtype relation too?
   var map = JS<Object>('!', '#[#]', t1, _subtypeCache);
@@ -1311,7 +1311,7 @@
 }
 
 @notNull
-bool _isSubtype(t1, t2, bool strictMode) => JS<bool>('!', '''(() => {
+bool _isSubtype(t1, t2, @notNull bool strictMode) => JS<bool>('!', '''(() => {
   if (!$strictMode) {
     // Strip nullable types when performing check in weak mode.
     // TODO(nshahan) Investigate stripping off legacy types as well.
@@ -1502,7 +1502,7 @@
   return ${_isFunctionSubtype(t1, t2, strictMode)};
 })()''');
 
-bool _isInterfaceSubtype(t1, t2, strictMode) => JS('', '''(() => {
+bool _isInterfaceSubtype(t1, t2, @notNull bool strictMode) => JS('', '''(() => {
   // If we have lazy JS types, unwrap them.  This will effectively
   // reduce to a prototype check below.
   if (${_jsInstanceOf(t1, LazyJSType)}) $t1 = $t1.rawJSTypeForCheck();
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/js_helper.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/js_helper.dart
index 644dba1..11a3a8e 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/js_helper.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/js_helper.dart
@@ -68,15 +68,7 @@
 }
 
 class Primitives {
-  @NoInline()
-  static int? _parseIntError(
-      String source, int? Function(String)? handleError) {
-    if (handleError == null) throw FormatException(source);
-    return handleError(source);
-  }
-
-  static int? parseInt(@nullCheck String source, int? _radix,
-      int? Function(String)? handleError) {
+  static int? parseInt(@nullCheck String source, int? _radix) {
     var re = JS('', r'/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i');
     // TODO(jmesserly): this isn't reified List<String>, but it's safe to use as
     // long as we use it locally and don't expose it to user code.
@@ -88,7 +80,7 @@
       // TODO(sra): It might be that the match failed due to unrecognized U+0085
       // spaces.  We could replace them with U+0020 spaces and try matching
       // again.
-      return _parseIntError(source, handleError);
+      return null;
     }
     String? decimalMatch = match[decimalIndex];
     if (_radix == null) {
@@ -100,7 +92,7 @@
         // Cannot fail because we know that the digits are all hex.
         return JS<int>('!', r'parseInt(#, 16)', source);
       }
-      return _parseIntError(source, handleError);
+      return null;
     }
     @notNull
     var radix = _radix;
@@ -137,7 +129,7 @@
       for (int i = 0; i < digitsPart.length; i++) {
         int characterCode = digitsPart.codeUnitAt(i) | 0x20;
         if (characterCode > maxCharCode) {
-          return _parseIntError(source, handleError);
+          return null;
         }
       }
     }
@@ -146,17 +138,7 @@
     return JS<int>('!', r'parseInt(#, #)', source, radix);
   }
 
-  @NoInline()
-  static double? _parseDoubleError(
-      String source, double? Function(String)? handleError) {
-    if (handleError == null) {
-      throw FormatException('Invalid double', source);
-    }
-    return handleError(source);
-  }
-
-  static double? parseDouble(
-      @nullCheck String source, double? Function(String)? handleError) {
+  static double? parseDouble(@nullCheck String source) {
     // Notice that JS parseFloat accepts garbage at the end of the string.
     // Accept only:
     // - [+/-]NaN
@@ -168,15 +150,15 @@
         r'/^\s*[+-]?(?:Infinity|NaN|'
             r'(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(#)',
         source)) {
-      return _parseDoubleError(source, handleError);
+      return null;
     }
-    double result = JS('!', r'parseFloat(#)', source);
+    var result = JS<double>('!', r'parseFloat(#)', source);
     if (result.isNaN) {
       var trimmed = source.trim();
       if (trimmed == 'NaN' || trimmed == '+NaN' || trimmed == '-NaN') {
         return result;
       }
-      return _parseDoubleError(source, handleError);
+      return null;
     }
     return result;
   }
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 45c0f03..45ed0c5 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart
@@ -196,10 +196,19 @@
   _AsyncAwaitCompleter() : isSync = false;
 
   void complete([FutureOr<T>? value]) {
-    if (!isSync || value is Future<T>) {
-      _future._asyncComplete(value as FutureOr<T>);
+    // All paths require that if value is null, null as T succeeds.
+    value = (value == null) ? value as T : value;
+    if (!isSync) {
+      _future._asyncComplete(value);
+    } else if (value is Future<T>) {
+      assert(!_future._isComplete);
+      _future._chainFuture(value);
     } else {
-      _future._completeWithValue(value as T);
+      // TODO(40014): Remove cast when type promotion works.
+      // This would normally be `as T` but we use `as dynamic` to make the
+      // unneeded check be implict to match dart2js unsound optimizations in the
+      // user code.
+      _future._completeWithValue(value as dynamic);
     }
   }
 
@@ -566,9 +575,7 @@
   T? _current = null;
 
   // This is the nested iterator when iterating a yield* of a non-sync iterator.
-  // TODO(32956): In strong-mode, yield* takes an Iterable<T> (possibly checked
-  // with an implicit downcast), so change type to Iterator<T>.
-  Iterator? _nestedIterator = null;
+  Iterator<T>? _nestedIterator = null;
 
   // Stack of suspended state machines when iterating a yield* of a sync*
   // iterator.
@@ -578,9 +585,8 @@
 
   T get current {
     var nested = _nestedIterator;
-    if (nested == null) return _current as T;
-    // Don't merge this with above 'as T', the one above can be optimized.
-    return nested.current as T;
+    if (nested == null) return _current as dynamic; // implicit: as T;
+    return nested.current;
   }
 
   _runBody() {
@@ -637,8 +643,12 @@
           JS('', 'throw #', value.value);
         } else {
           assert(state == _IterationMarker.YIELD_STAR);
-          Iterator inner = value.value.iterator;
+          Iterator<T> inner = value.value.iterator;
           if (inner is _SyncStarIterator) {
+            // The test needs to be 'is _SyncStarIterator<T>' for promotion to
+            // work. However, that test is much more expensive, so we use an
+            // unsafe cast.
+            _SyncStarIterator<T> innerSyncStarIterator = JS('', '#', inner);
             // Suspend the current state machine and start acting on behalf of
             // the nested state machine.
             //
@@ -646,7 +656,7 @@
             // suspending the current body when all it will do is step without
             // effect to ITERATION_ENDED.
             (_suspendedBodies ??= []).add(_body);
-            _body = inner._body;
+            _body = innerSyncStarIterator._body;
             continue;
           } else {
             _nestedIterator = inner;
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/collection_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/collection_patch.dart
index 2b8bd25..a1d76bf 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/collection_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/collection_patch.dart
@@ -1324,12 +1324,12 @@
     if (_isStringElement(object)) {
       var strings = _strings;
       if (strings == null) return false;
-      _LinkedHashSetCell cell = _getTableEntry(strings, object);
+      _LinkedHashSetCell? cell = _getTableEntry(strings, object);
       return cell != null;
     } else if (_isNumericElement(object)) {
       var nums = _nums;
       if (nums == null) return false;
-      _LinkedHashSetCell cell = _getTableEntry(nums, object);
+      _LinkedHashSetCell? cell = _getTableEntry(nums, object);
       return cell != null;
     } else {
       return _contains(object);
@@ -1474,7 +1474,7 @@
   }
 
   bool _addHashTableEntry(var table, E element) {
-    _LinkedHashSetCell cell = _getTableEntry(table, element);
+    _LinkedHashSetCell? cell = _getTableEntry(table, element);
     if (cell != null) return false;
     _setTableEntry(table, element, _newLinkedCell(element));
     return true;
@@ -1482,7 +1482,7 @@
 
   bool _removeHashTableEntry(var table, Object? element) {
     if (table == null) return false;
-    _LinkedHashSetCell cell = _getTableEntry(table, element);
+    _LinkedHashSetCell? cell = _getTableEntry(table, element);
     if (cell == null) return false;
     _unlinkCell(cell);
     _deleteTableEntry(table, element);
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/core_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/core_patch.dart
index 9d1a8d6..232cc8d 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/core_patch.dart
@@ -639,7 +639,7 @@
     return string;
   }
 
-  static String _writeOne(String string, Object obj) {
+  static String _writeOne(String string, Object? obj) {
     return Primitives.stringConcatUnchecked(string, '$obj');
   }
 }
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/internal_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/internal_patch.dart
index 8483315..e2922ca 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/internal_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/internal_patch.dart
@@ -10,6 +10,13 @@
 import 'dart:_foreign_helper' show JS, JS_GET_FLAG;
 
 @patch
+@pragma('dart2js:tryInline')
+bool typeAcceptsNull<T>() {
+  bool isLegacySubtyping = JS_GET_FLAG('LEGACY');
+  return isLegacySubtyping || null is T;
+}
+
+@patch
 class Symbol implements core.Symbol {
   @patch
   const Symbol(String name) : this._name = name;
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 994ea2d..9c74300 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
@@ -414,14 +414,13 @@
     int digitsIndex = 1;
     int hexIndex = 2;
     int decimalIndex = 3;
-    int nonDecimalHexIndex = 4;
     if (match == null) {
       // TODO(sra): It might be that the match failed due to unrecognized U+0085
       // spaces.  We could replace them with U+0020 spaces and try matching
       // again.
       return null;
     }
-    String decimalMatch = match[decimalIndex];
+    Object? decimalMatch = match[decimalIndex];
     if (radix == null) {
       if (decimalMatch != null) {
         // Cannot fail because we know that the digits are all decimal.
diff --git a/sdk_nnbd/lib/_internal/vm/bin/vmservice_io.dart b/sdk_nnbd/lib/_internal/vm/bin/vmservice_io.dart
index 2dc17b1..aea026b 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/vmservice_io.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/vmservice_io.dart
@@ -196,6 +196,11 @@
   return _server.serverAddress;
 }
 
+void webServerAcceptNewWebSocketConnections(bool enable) {
+  final _server = _lazyServerBoot();
+  _server.acceptNewWebSocketConnections = enable;
+}
+
 void _clearFuture(_) {
   serverFuture = null;
 }
@@ -241,6 +246,8 @@
   VMServiceEmbedderHooks.listFiles = listFilesCallback;
   VMServiceEmbedderHooks.serverInformation = serverInformationCallback;
   VMServiceEmbedderHooks.webServerControl = webServerControlCallback;
+  VMServiceEmbedderHooks.acceptNewWebSocketConnections =
+      webServerAcceptNewWebSocketConnections;
   // Always instantiate the vmservice object so that the exit message
   // can be delivered and waiting loaders can be cancelled.
   VMService();
diff --git a/sdk_nnbd/lib/_internal/vm/bin/vmservice_server.dart b/sdk_nnbd/lib/_internal/vm/bin/vmservice_server.dart
index ed723fb..d1a5a7c 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/vmservice_server.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/vmservice_server.dart
@@ -153,6 +153,7 @@
   final String? _serviceInfoFilename;
   HttpServer? _server;
   bool get running => _server != null;
+  bool acceptNewWebSocketConnections = true;
   int _port = -1;
 
   /// Returns the server address including the auth token.
@@ -354,11 +355,19 @@
 
     final String path = result;
     if (path == WEBSOCKET_PATH) {
-      WebSocketTransformer.upgrade(request,
-              compression: CompressionOptions.compressionOff)
-          .then((WebSocket webSocket) {
-        WebSocketClient(webSocket, _service);
-      });
+      if (acceptNewWebSocketConnections) {
+        WebSocketTransformer.upgrade(request,
+                compression: CompressionOptions.compressionOff)
+            .then((WebSocket webSocket) {
+          WebSocketClient(webSocket, _service);
+        });
+      } else {
+        request.response.statusCode = HttpStatus.forbidden;
+        request.response.write('Cannot connect directly to the VM service as '
+            'a Dart Development Service (DDS) instance has taken control and '
+            'can be found at ${_service.ddsUri}.');
+        request.response.close();
+      }
       return;
     }
 
diff --git a/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart
index 3020fea..c3201d3 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart
@@ -28,9 +28,15 @@
 
   @pragma("vm:entry-point")
   void complete([FutureOr<T>? value]) {
-    if (!isSync || value is Future<T>) {
-      _future._asyncComplete(value as FutureOr<T>);
+    // All paths require that if value is null, null as T succeeds.
+    value = (value == null) ? value as T : value;
+    if (!isSync) {
+      _future._asyncComplete(value);
+    } else if (value is Future<T>) {
+      assert(!_future._isComplete);
+      _future._chainFuture(value);
     } else {
+      // TODO(40014): Remove cast when type promotion works.
       _future._completeWithValue(value as T);
     }
   }
diff --git a/sdk_nnbd/lib/_internal/vm/lib/internal_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/internal_patch.dart
index ddb3992..b484a2c 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/internal_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/internal_patch.dart
@@ -9,6 +9,7 @@
 
 import "dart:core" hide Symbol;
 
+import "dart:isolate" show SendPort;
 import "dart:typed_data" show Int32List;
 
 /// These are the additional parts of this patch library:
@@ -16,6 +17,12 @@
 // part "print_patch.dart";
 // part "symbol_patch.dart";
 
+// On the VM, we don't make the entire legacy weak mode check
+// const to avoid having a constant in the platform libraries
+// which evaluates differently in weak vs strong mode.
+@patch
+bool typeAcceptsNull<T>() => (const <Null>[]) is List<int> || null is T;
+
 @patch
 List<T> makeListFixedLength<T>(List<T> growableList)
     native "Internal_makeListFixedLength";
@@ -128,3 +135,6 @@
 // This is implemented by a recognized method, but in bytecode through a native.
 @pragma('vm:prefer-inline')
 void reachabilityFence(Object object) native "Internal_reachabilityFence";
+
+void sendAndExit(SendPort sendPort, var message)
+    native "SendPortImpl_sendAndExitInternal_";
diff --git a/sdk_nnbd/lib/async/async.dart b/sdk_nnbd/lib/async/async.dart
index 616375c..8cce959 100644
--- a/sdk_nnbd/lib/async/async.dart
+++ b/sdk_nnbd/lib/async/async.dart
@@ -102,7 +102,8 @@
         IterableElementError,
         printToZone,
         printToConsole,
-        Since;
+        Since,
+        typeAcceptsNull;
 
 part 'async_error.dart';
 part 'broadcast_stream_controller.dart';
diff --git a/sdk_nnbd/lib/async/broadcast_stream_controller.dart b/sdk_nnbd/lib/async/broadcast_stream_controller.dart
index 3684a7c..c362eea 100644
--- a/sdk_nnbd/lib/async/broadcast_stream_controller.dart
+++ b/sdk_nnbd/lib/async/broadcast_stream_controller.dart
@@ -380,7 +380,9 @@
     if (_isEmpty) return;
     if (_hasOneListener) {
       _state |= _BroadcastStreamController._STATE_FIRING;
-      (_firstSubscription as _BroadcastSubscription<T>)._add(data);
+      _BroadcastSubscription<T> firstSubscription =
+          _firstSubscription as dynamic;
+      firstSubscription._add(data);
       _state &= ~_BroadcastStreamController._STATE_FIRING;
       if (_isEmpty) {
         _callOnCancel();
diff --git a/sdk_nnbd/lib/async/future.dart b/sdk_nnbd/lib/async/future.dart
index 3de7374..8a43bce 100644
--- a/sdk_nnbd/lib/async/future.dart
+++ b/sdk_nnbd/lib/async/future.dart
@@ -258,7 +258,7 @@
    */
   @pragma("vm:entry-point")
   factory Future.value([FutureOr<T>? value]) {
-    return new _Future<T>.immediate(value as FutureOr<T>);
+    return new _Future<T>.immediate(value == null ? value as dynamic : value);
   }
 
   /**
@@ -311,7 +311,7 @@
    * later time that isn't necessarily after a known fixed duration.
    */
   factory Future.delayed(Duration duration, [FutureOr<T> computation()?]) {
-    if (computation == null && const <Null>[] is! List<T>) {
+    if (computation == null && !typeAcceptsNull<T>()) {
       throw ArgumentError.value(
           null, "computation", "The type parameter is not nullable");
     }
@@ -368,9 +368,7 @@
     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(Object theError, StackTrace theStackTrace) {
+    void handleError(Object theError, StackTrace theStackTrace) {
       remaining--;
       List<T?>? valueList = values;
       if (valueList != null) {
@@ -411,8 +409,6 @@
               result._completeWithValue(List<T>.from(valueList));
             }
           } else {
-            // 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.
               new Future.sync(() {
@@ -420,6 +416,8 @@
               });
             }
             if (remaining == 0 && !eagerError) {
+              // If eagerError is false, and valueList is null, then
+              // error and stackTrace have been set in handleError above.
               result._completeError(error, stackTrace);
             }
           }
@@ -559,6 +557,7 @@
           result.then(nextIteration, onError: doneSignal._completeError);
           return;
         }
+        // TODO(40014): Remove cast when type promotion works.
         keepGoing = result as bool;
       }
       doneSignal._complete(null);
diff --git a/sdk_nnbd/lib/async/future_impl.dart b/sdk_nnbd/lib/async/future_impl.dart
index 11c8f26..3f33737 100644
--- a/sdk_nnbd/lib/async/future_impl.dart
+++ b/sdk_nnbd/lib/async/future_impl.dart
@@ -41,7 +41,7 @@
 class _AsyncCompleter<T> extends _Completer<T> {
   void complete([FutureOr<T>? value]) {
     if (!future._mayComplete) throw new StateError("Future already completed");
-    future._asyncComplete(value as FutureOr<T>);
+    future._asyncComplete(value == null ? value as dynamic : value);
   }
 
   void _completeError(Object error, StackTrace stackTrace) {
@@ -52,7 +52,7 @@
 class _SyncCompleter<T> extends _Completer<T> {
   void complete([FutureOr<T>? value]) {
     if (!future._mayComplete) throw new StateError("Future already completed");
-    future._complete(value as FutureOr<T>);
+    future._complete(value == null ? value as dynamic : value);
   }
 
   void _completeError(Object error, StackTrace stackTrace) {
@@ -116,19 +116,19 @@
 
   FutureOr<T> Function(S) get _onValue {
     assert(handlesValue);
-    return callback as FutureOr<T> Function(S);
+    return callback as dynamic;
   }
 
   Function? get _onError => errorCallback;
 
   _FutureErrorTest get _errorTest {
     assert(hasErrorTest);
-    return callback as _FutureErrorTest;
+    return callback as dynamic;
   }
 
   _FutureAction get _whenCompleteAction {
     assert(handlesComplete);
-    return callback as _FutureAction;
+    return callback as dynamic;
   }
 
   /// Whether this listener has an error callback.
@@ -158,7 +158,7 @@
           errorCallback, asyncError.error, asyncError.stackTrace);
     } else {
       return _zone.runUnary<dynamic, Object>(
-          errorCallback as dynamic Function(Object), asyncError.error);
+          errorCallback as dynamic, asyncError.error);
     }
   }
 
@@ -554,13 +554,17 @@
       _chainFuture(value);
       return;
     }
+    // TODO(40014): Remove cast when type promotion works.
+    // This would normally be `as T` but we use `as dynamic` to make the
+    // unneeded check be implict to match dart2js unsound optimizations in the
+    // user code.
+    _asyncCompleteWithValue(value as dynamic); // Value promoted to T.
+  }
+
+  void _asyncCompleteWithValue(T value) {
     _setPendingComplete();
     _zone.scheduleMicrotask(() {
-      // TODO(40014): Remove cast when type promotion works.
-      // This would normally be `as T` but we use `as dynamic` to make the
-      // unneeded check be implict to match dart2js unsound optimizations in the
-      // user code.
-      _completeWithValue(value as dynamic); // Value promoted to T.
+      _completeWithValue(value);
     });
   }
 
@@ -669,15 +673,15 @@
             listenerHasError = true;
             return;
           }
-          if (completeResult is Future) {
-            if (completeResult is _Future && completeResult._isComplete) {
-              if (completeResult._hasError) {
-                listenerValueOrError = completeResult._error;
-                listenerHasError = true;
-              }
-              // Otherwise use the existing result of source.
-              return;
+          if (completeResult is _Future && completeResult._isComplete) {
+            if (completeResult._hasError) {
+              listenerValueOrError = completeResult._error;
+              listenerHasError = true;
             }
+            // Otherwise use the existing result of source.
+            return;
+          }
+          if (completeResult is Future) {
             // We have to wait for the completeResult future to complete
             // before knowing if it's an error or we should use the result
             // of source.
diff --git a/sdk_nnbd/lib/async/stream.dart b/sdk_nnbd/lib/async/stream.dart
index 241c706..46ec161 100644
--- a/sdk_nnbd/lib/async/stream.dart
+++ b/sdk_nnbd/lib/async/stream.dart
@@ -263,7 +263,7 @@
    */
   factory Stream.periodic(Duration period,
       [T computation(int computationCount)?]) {
-    if (computation == null && const <Null>[] is! List<T>) {
+    if (computation == null && !typeAcceptsNull<T>()) {
       throw ArgumentError.value(null, "computation",
           "Must not be omitted when the event type is non-nullable");
     }
@@ -1074,7 +1074,9 @@
    * The [futureValue] must not be omitted if `null` is not assignable to [E].
    */
   Future<E> drain<E>([E? futureValue]) {
-    futureValue = futureValue as E;
+    if (futureValue == null) {
+      futureValue = futureValue as E;
+    }
     return listen(null, cancelOnError: true).asFuture<E>(futureValue);
   }
 
diff --git a/sdk_nnbd/lib/async/stream_controller.dart b/sdk_nnbd/lib/async/stream_controller.dart
index 8b7d786..0c0a93a 100644
--- a/sdk_nnbd/lib/async/stream_controller.dart
+++ b/sdk_nnbd/lib/async/stream_controller.dart
@@ -515,9 +515,9 @@
   _PendingEvents<T>? get _pendingEvents {
     assert(_isInitialState);
     if (!_isAddingStream) {
-      return _varData as _PendingEvents<T>?;
+      return _varData as dynamic;
     }
-    var state = _varData as _StreamControllerAddStreamState<T>;
+    _StreamControllerAddStreamState<T> state = _varData as dynamic;
     return state.varData;
   }
 
@@ -526,17 +526,17 @@
     assert(_isInitialState);
     if (!_isAddingStream) {
       Object? events = _varData;
-      if (events is! _StreamImplEvents<T>) {
+      if (events == null) {
         _varData = events = _StreamImplEvents<T>();
       }
-      return events;
+      return events as dynamic;
     }
-    var state = _varData as _StreamControllerAddStreamState<T>;
+    _StreamControllerAddStreamState<T> state = _varData as dynamic;
     Object? events = state.varData;
-    if (events is! _StreamImplEvents<T>) {
+    if (events == null) {
       state.varData = events = _StreamImplEvents<T>();
     }
-    return events;
+    return events as dynamic;
   }
 
   // Get the current subscription.
@@ -546,9 +546,10 @@
     assert(hasListener);
     Object? varData = _varData;
     if (_isAddingStream) {
-      varData = (varData as _StreamControllerAddStreamState<Object?>).varData;
+      _StreamControllerAddStreamState<Object?> streamState = varData as dynamic;
+      varData = streamState.varData;
     }
-    return varData as _ControllerSubscription<T>;
+    return varData as dynamic;
   }
 
   /**
@@ -668,7 +669,7 @@
   void _close() {
     // End of addStream stream.
     assert(_isAddingStream);
-    var addState = _varData as _StreamControllerAddStreamState<T>;
+    _StreamControllerAddStreamState<T> addState = _varData as dynamic;
     _varData = addState.varData;
     _state &= ~_STATE_ADDSTREAM;
     addState.complete();
@@ -687,7 +688,7 @@
     _PendingEvents<T>? pendingEvents = _pendingEvents;
     _state |= _STATE_SUBSCRIBED;
     if (_isAddingStream) {
-      var addState = _varData as _StreamControllerAddStreamState<T>;
+      _StreamControllerAddStreamState<T> addState = _varData as dynamic;
       addState.varData = subscription;
       addState.resume();
     } else {
@@ -712,7 +713,7 @@
     // returned future.
     Future<void>? result;
     if (_isAddingStream) {
-      var addState = _varData as _StreamControllerAddStreamState<T>;
+      _StreamControllerAddStreamState<T> addState = _varData as dynamic;
       result = addState.cancel();
     }
     _varData = null;
@@ -759,7 +760,7 @@
 
   void _recordPause(StreamSubscription<T> subscription) {
     if (_isAddingStream) {
-      var addState = _varData as _StreamControllerAddStreamState<T>;
+      _StreamControllerAddStreamState<T> addState = _varData as dynamic;
       addState.pause();
     }
     _runGuarded(onPause);
@@ -767,7 +768,7 @@
 
   void _recordResume(StreamSubscription<T> subscription) {
     if (_isAddingStream) {
-      var addState = _varData as _StreamControllerAddStreamState<T>;
+      _StreamControllerAddStreamState<T> addState = _varData as dynamic;
       addState.resume();
     }
     _runGuarded(onResume);
diff --git a/sdk_nnbd/lib/async/stream_impl.dart b/sdk_nnbd/lib/async/stream_impl.dart
index 4404d78..1c6fa50 100644
--- a/sdk_nnbd/lib/async/stream_impl.dart
+++ b/sdk_nnbd/lib/async/stream_impl.dart
@@ -213,26 +213,31 @@
   }
 
   Future<E> asFuture<E>([E? futureValue]) {
-    if (futureValue is E) {
-      // Overwrite the onDone and onError handlers.
-      _Future<E> result = new _Future<E>();
-      E resultValue = futureValue;
-      _onDone = () {
-        result._complete(resultValue);
-      };
-      _onError = (Object error, StackTrace stackTrace) {
-        Future cancelFuture = cancel();
-        if (!identical(cancelFuture, Future._nullFuture)) {
-          cancelFuture.whenComplete(() {
-            result._completeError(error, stackTrace);
-          });
-        } else {
-          result._completeError(error, stackTrace);
-        }
-      };
-      return result;
+    E resultValue;
+    if (futureValue == null) {
+      if (!typeAcceptsNull<E>()) {
+        throw ArgumentError.notNull("futureValue");
+      }
+      resultValue = futureValue as dynamic;
+    } else {
+      resultValue = futureValue;
     }
-    throw ArgumentError.notNull("futureValue");
+    // Overwrite the onDone and onError handlers.
+    _Future<E> result = new _Future<E>();
+    _onDone = () {
+      result._complete(resultValue);
+    };
+    _onError = (Object error, StackTrace stackTrace) {
+      Future cancelFuture = cancel();
+      if (!identical(cancelFuture, Future._nullFuture)) {
+        cancelFuture.whenComplete(() {
+          result._completeError(error, stackTrace);
+        });
+      } else {
+        result._completeError(error, stackTrace);
+      }
+    };
+    return result;
   }
 
   // State management.
@@ -329,7 +334,9 @@
    * of pending events later (if necessary).
    */
   void _addPending(_DelayedEvent event) {
-    var pending = (_pending ??= _StreamImplEvents<T>()) as _StreamImplEvents<T>;
+    _StreamImplEvents<T>? pending = _pending as dynamic;
+    pending ??= _StreamImplEvents<T>();
+    _pending = pending;
     pending.add(event);
     if (!_hasPending) {
       _state |= _STATE_HAS_PENDING;
@@ -368,7 +375,7 @@
       if (onError is void Function(Object, StackTrace)) {
         _zone.runBinaryGuarded<Object, StackTrace>(onError, error, stackTrace);
       } else {
-        _zone.runUnaryGuarded<Object>(_onError as void Function(Object), error);
+        _zone.runUnaryGuarded<Object>(_onError as dynamic, error);
       }
       _state &= ~_STATE_IN_CALLBACK;
     }
@@ -780,15 +787,20 @@
   Future cancel() => Future._nullFuture;
 
   Future<E> asFuture<E>([E? futureValue]) {
-    if (futureValue is E) {
-      _Future<E> result = new _Future<E>();
-      E resultValue = futureValue;
-      _onDone = () {
-        result._completeWithValue(resultValue);
-      };
-      return result;
+    E resultValue;
+    if (futureValue == null) {
+      if (!typeAcceptsNull<E>()) {
+        throw ArgumentError.notNull("futureValue");
+      }
+      resultValue = futureValue as dynamic;
+    } else {
+      resultValue = futureValue;
     }
-    throw ArgumentError.notNull("futureValue");
+    _Future<E> result = new _Future<E>();
+    _onDone = () {
+      result._completeWithValue(resultValue);
+    };
+    return result;
   }
 
   void _sendDone() {
@@ -806,7 +818,7 @@
   final _BroadcastCallback<T>? _onCancelHandler;
   final Zone _zone;
 
-  late _AsBroadcastStreamController<T>? _controller;
+  _AsBroadcastStreamController<T>? _controller;
   StreamSubscription<T>? _subscription;
 
   _AsBroadcastStream(
@@ -996,9 +1008,9 @@
 
   T get current {
     if (_subscription != null && _isPaused) {
-      return _stateData as T;
+      return _stateData as dynamic;
     }
-    return null as T;
+    return null as dynamic;
   }
 
   Future<bool> moveNext() {
@@ -1025,7 +1037,7 @@
     assert(_subscription == null);
     var stateData = _stateData;
     if (stateData != null) {
-      var stream = stateData as Stream<T>;
+      Stream<T> stream = stateData as dynamic;
       _subscription = stream.listen(_onData,
           onError: _onError, onDone: _onDone, cancelOnError: true);
       var future = new _Future<bool>();
@@ -1042,7 +1054,7 @@
     if (subscription != null) {
       _subscription = null;
       if (!_isPaused) {
-        var future = stateData as _Future<bool>;
+        _Future<bool> future = stateData as dynamic;
         future._asyncComplete(false);
       }
       return subscription.cancel();
@@ -1052,7 +1064,7 @@
 
   void _onData(T data) {
     assert(_subscription != null && !_isPaused);
-    var moveNextFuture = _stateData as _Future<bool>;
+    _Future<bool> moveNextFuture = _stateData as dynamic;
     _stateData = data;
     _isPaused = true;
     moveNextFuture._complete(true);
@@ -1061,7 +1073,7 @@
 
   void _onError(Object error, StackTrace stackTrace) {
     assert(_subscription != null && !_isPaused);
-    var moveNextFuture = _stateData as _Future<bool>;
+    _Future<bool> moveNextFuture = _stateData as dynamic;
     _subscription = null;
     _stateData = null;
     moveNextFuture._completeError(error, stackTrace);
@@ -1069,7 +1081,7 @@
 
   void _onDone() {
     assert(_subscription != null && !_isPaused);
-    var moveNextFuture = _stateData as _Future<bool>;
+    _Future<bool> moveNextFuture = _stateData as dynamic;
     _subscription = null;
     _stateData = null;
     moveNextFuture._complete(false);
diff --git a/sdk_nnbd/lib/html/dart2js/html_dart2js.dart b/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
index d648c04..7330bc6 100644
--- a/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
+++ b/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
@@ -32714,7 +32714,7 @@
   @Returns('Window|=Object')
   dynamic get _get_top native;
 
-  VisualViewport get visualViewport native;
+  VisualViewport? get visualViewport native;
 
   /**
    * The current window.
diff --git a/sdk_nnbd/lib/internal/internal.dart b/sdk_nnbd/lib/internal/internal.dart
index a18f40d..bec8b0c 100644
--- a/sdk_nnbd/lib/internal/internal.dart
+++ b/sdk_nnbd/lib/internal/internal.dart
@@ -29,6 +29,10 @@
 part 'symbol.dart';
 part 'linked_list.dart';
 
+// Returns true iff `null as T` will succeed based on the
+// execution mode.
+external bool typeAcceptsNull<T>();
+
 // Powers of 10 up to 10^22 are representable as doubles.
 // Powers of 10 above that are only approximate due to lack of precission.
 // Used by double-parsing.
diff --git a/sdk_nnbd/lib/vmservice/vmservice.dart b/sdk_nnbd/lib/vmservice/vmservice.dart
index 807fd00..5b0ad91 100644
--- a/sdk_nnbd/lib/vmservice/vmservice.dart
+++ b/sdk_nnbd/lib/vmservice/vmservice.dart
@@ -169,6 +169,10 @@
 /// Called when we want to [enable] or disable the web server.
 typedef Future<Uri?> WebServerControlCallback(bool enable);
 
+/// Called when we want to [enable] or disable new websocket connections to the
+/// server.
+typedef void WebServerAcceptNewWebSocketConnectionsCallback(bool enable);
+
 /// Hooks that are setup by the embedder.
 class VMServiceEmbedderHooks {
   static ServerStartCallback? serverStart;
@@ -182,6 +186,8 @@
   static ListFilesCallback? listFiles;
   static ServerInformationCallback? serverInformation;
   static WebServerControlCallback? webServerControl;
+  static WebServerAcceptNewWebSocketConnectionsCallback?
+      acceptNewWebSocketConnections;
 }
 
 class _ClientResumePermissions {
@@ -213,6 +219,33 @@
 
   final devfs = DevFS();
 
+  Uri get ddsUri => _ddsUri!;
+  Uri? _ddsUri;
+
+  Future<String> _yieldControlToDDS(Message message) async {
+    final acceptNewWebSocketConnections =
+        VMServiceEmbedderHooks.acceptNewWebSocketConnections;
+    if (acceptNewWebSocketConnections == null) {
+      return encodeRpcError(message, kFeatureDisabled,
+          details:
+              'Embedder does not support yielding to a VM service intermediary.');
+    }
+    final uri = message.params['uri'];
+    if (uri == null) {
+      return encodeMissingParamError(message, 'uri');
+    }
+    // DDS can only take control if there is no other clients connected
+    // directly to the VM service.
+    if (clients.length > 1) {
+      return encodeRpcError(message, kFeatureDisabled,
+          details:
+              'Existing VM service clients prevent DDS from taking control.');
+    }
+    acceptNewWebSocketConnections(false);
+    _ddsUri = Uri.parse(uri);
+    return encodeSuccess(message);
+  }
+
   void _clearClientName(Client client) {
     final name = client.name;
     client.name = null;
@@ -351,6 +384,16 @@
     for (final handle in client.serviceHandles.values) {
       handle(null);
     }
+    if (clients.isEmpty) {
+      // If DDS was connected, we are in single client mode and need to
+      // allow for new websocket connections.
+      final acceptNewWebSocketConnections =
+          VMServiceEmbedderHooks.acceptNewWebSocketConnections;
+      if (_ddsUri != null && acceptNewWebSocketConnections != null) {
+        acceptNewWebSocketConnections(true);
+        _ddsUri = null;
+      }
+    }
   }
 
   void _eventMessageHandler(String streamId, Response event) {
@@ -717,6 +760,9 @@
       if (message.completed) {
         return await message.response;
       }
+      if (message.method == '_yieldControlToDDS') {
+        return await _yieldControlToDDS(message);
+      }
       if (message.method == 'streamListen') {
         return await _streamListen(message);
       }
diff --git a/tests/compiler/dart2js/analyses/api_allowed_nnbd.json b/tests/compiler/dart2js/analyses/api_allowed_nnbd.json
new file mode 100644
index 0000000..6d84ab9
--- /dev/null
+++ b/tests/compiler/dart2js/analyses/api_allowed_nnbd.json
@@ -0,0 +1,212 @@
+{
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/js_number.dart": {
+    "Dynamic invocation of '[]'.": 5,
+    "Dynamic invocation of '<'.": 4,
+    "Dynamic invocation of '>='.": 1,
+    "Dynamic invocation of '<='.": 1,
+    "Dynamic invocation of '>'.": 2
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart": {
+    "Dynamic invocation of '[]'.": 3,
+    "Dynamic access of 'isNaN'.": 3,
+    "Dynamic invocation of '<='.": 2,
+    "Dynamic invocation of '-'.": 3,
+    "Dynamic invocation of '&'.": 1,
+    "Dynamic invocation of '>>'.": 1,
+    "Dynamic invocation of '<'.": 2,
+    "Dynamic invocation of '+'.": 1,
+    "Dynamic invocation of '>'.": 1,
+    "Dynamic access of 'length'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/string_helper.dart": {
+    "Dynamic invocation of '<'.": 1,
+    "Dynamic invocation of '+'.": 1,
+    "Dynamic invocation of '>='.": 1,
+    "Dynamic invocation of 'substring'.": 7,
+    "Dynamic invocation of 'allMatches'.": 3,
+    "Dynamic access of 'isNotEmpty'.": 1,
+    "Dynamic invocation of '_js_helper::_execGlobal'.": 1,
+    "Dynamic access of 'start'.": 1,
+    "Dynamic access of 'end'.": 1,
+    "Dynamic invocation of 'call'.": 13,
+    "Dynamic access of 'length'.": 3,
+    "Dynamic invocation of 'codeUnitAt'.": 2,
+    "Dynamic invocation of '[]'.": 1,
+    "Dynamic access of 'iterator'.": 2,
+    "Dynamic invocation of 'replaceRange'.": 2
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/linked_hash_map.dart": {
+    "Dynamic access of '_js_helper::_length'.": 2,
+    "Dynamic access of '_js_helper::_modifications'.": 4,
+    "Dynamic invocation of 'containsKey'.": 1,
+    "Dynamic access of '_js_helper::_first'.": 2
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/js_rti.dart": {
+    "Dynamic invocation of '<'.": 1,
+    "Dynamic invocation of '-'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/native_helper.dart": {
+    "Dynamic access of 'length'.": 2,
+    "Dynamic invocation of '[]'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/regexp_helper.dart": {
+    "Dynamic access of 'length'.": 1,
+    "Dynamic invocation of '-'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/native_typed_data.dart": {
+    "Dynamic invocation of '>'.": 1,
+    "Dynamic invocation of '|'.": 3,
+    "Dynamic invocation of '>='.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart": {
+    "Dynamic invocation of '-'.": 1,
+    "Dynamic access of 'iterator'.": 1,
+    "Dynamic invocation of 'call'.": 4,
+    "Dynamic invocation of 'then'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/collection_patch.dart": {
+    "Dynamic access of 'dart.collection::_length'.": 2,
+    "Dynamic invocation of 'dart.collection::_computeKeys'.": 2,
+    "Dynamic invocation of 'containsKey'.": 2,
+    "Dynamic access of 'dart.collection::_keys'.": 2,
+    "Dynamic access of 'length'.": 1,
+    "Dynamic access of 'isEmpty'.": 1,
+    "Dynamic access of 'dart.collection::_modifications'.": 5,
+    "Dynamic access of 'dart.collection::_map'.": 4,
+    "Dynamic access of 'dart.collection::_elements'.": 1,
+    "Dynamic access of 'dart.collection::_element'.": 1,
+    "Dynamic access of 'dart.collection::_first'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/html/dart2js/html_dart2js.dart": {
+    "Dynamic access of 'style'.": 1,
+    "Dynamic invocation of 'remove'.": 2,
+    "Dynamic update to 'dart.dom.html::_innerHtml'.": 1,
+    "Dynamic access of 'firstChild'.": 2,
+    "Dynamic invocation of 'append'.": 1,
+    "Dynamic access of 'tagName'.": 2,
+    "Dynamic invocation of 'call'.": 2,
+    "Dynamic invocation of 'dart.dom.html::_initKeyboardEvent'.": 1,
+    "Dynamic access of 'attributes'.": 1,
+    "Dynamic invocation of '[]'.": 1,
+    "Dynamic invocation of 'toLowerCase'.": 1,
+    "Dynamic invocation of 'attached'.": 1,
+    "Dynamic invocation of 'detached'.": 1,
+    "Dynamic invocation of 'attributeChanged'.": 1,
+    "Dynamic invocation of 'createElement'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/html/html_common/conversions.dart": {
+    "Dynamic invocation of '[]='.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/html/html_common/filtered_element_list.dart": {
+    "Dynamic invocation of 'remove'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/indexed_db/dart2js/indexed_db_dart2js.dart": {
+    "Dynamic access of 'onUpgradeNeeded'.": 1,
+    "Dynamic invocation of 'listen'.": 2,
+    "Dynamic access of 'onBlocked'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/io/directory_impl.dart": {
+    "Dynamic invocation of '[]'.": 10
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/io/file_impl.dart": {
+    "Dynamic invocation of '[]'.": 4,
+    "Dynamic access of 'length'.": 2
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/io/file_system_entity.dart": {
+    "Dynamic invocation of '[]'.": 7
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/io/io_resource_info.dart": {
+    "Dynamic invocation of '[]'.": 1,
+    "Dynamic access of 'path'.": 1,
+    "Dynamic access of 'dart.io::_path'.": 1,
+    "Dynamic access of 'pid'.": 1,
+    "Dynamic access of 'dart.io::_arguments'.": 1,
+    "Dynamic access of 'dart.io::_workingDirectory'.": 2,
+    "Dynamic access of 'isListening'.": 3,
+    "Dynamic access of 'address'.": 4,
+    "Dynamic access of 'host'.": 5,
+    "Dynamic access of 'port'.": 3,
+    "Dynamic access of 'remoteAddress'.": 2,
+    "Dynamic access of 'remotePort'.": 2,
+    "Dynamic access of 'isTcp'.": 1,
+    "Dynamic access of 'type'.": 1,
+    "Dynamic access of 'name'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/io/link.dart": {
+    "Dynamic invocation of '[]'.": 3
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/io/platform_impl.dart": {
+    "Dynamic invocation of 'indexOf'.": 1,
+    "Dynamic invocation of '>'.": 1,
+    "Dynamic invocation of 'substring'.": 2,
+    "Dynamic invocation of '+'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/io/secure_server_socket.dart": {
+    "Dynamic update to 'dart.io::_owner'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/io/secure_socket.dart": {
+    "Dynamic invocation of '[]'.": 10,
+    "Dynamic invocation of 'dart.io::_detachRaw'.": 2,
+    "Dynamic access of 'closedReadEventSent'.": 1,
+    "Dynamic update to 'dart.io::_owner'.": 1,
+    "Dynamic access of 'length'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/io/stdio.dart": {
+    "Dynamic invocation of 'writeFromSync'.": 1,
+    "Dynamic invocation of 'cancel'.": 1,
+    "Dynamic invocation of 'closeSync'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/io/common.dart": {
+    "Dynamic invocation of '[]'.": 3
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/js_patch.dart": {
+    "Dynamic invocation of '[]'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/svg/dart2js/svg_dart2js.dart": {
+    "Dynamic invocation of 'createFragment'.": 1,
+    "Dynamic access of 'nodes'.": 1,
+    "Dynamic invocation of 'where'.": 1,
+    "Dynamic access of 'single'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/core/errors.dart": {
+    "Dynamic access of 'length'.": 2
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_internal/js_runtime/lib/convert_patch.dart": {
+    "Dynamic invocation of 'clear'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/convert/json.dart": {
+    "Dynamic invocation of 'toJson'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_http/crypto.dart": {
+    "Dynamic invocation of '+'.": 2,
+    "Dynamic invocation of '&'.": 3,
+    "Dynamic invocation of 'unary-'.": 1,
+    "Dynamic invocation of '-'.": 2
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_http/http_date.dart": {
+    "Dynamic access of 'length'.": 3,
+    "Dynamic invocation of '<'.": 1,
+    "Dynamic invocation of '>='.": 2,
+    "Dynamic invocation of '[]'.": 7
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_http/http_headers.dart": {
+    "Dynamic invocation of 'toLowerCase'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_http/http_impl.dart": {
+    "Dynamic access of 'message'.": 3,
+    "Dynamic invocation of 'call'.": 1,
+    "Dynamic invocation of 'destroy'.": 2,
+    "Dynamic invocation of 'setOption'.": 1,
+    "Dynamic access of 'address'.": 2,
+    "Dynamic access of 'host'.": 2,
+    "Dynamic access of 'port'.": 2,
+    "Dynamic access of 'remoteAddress'.": 1,
+    "Dynamic access of 'remotePort'.": 1,
+    "Dynamic invocation of 'dart._http::_toJSON'.": 3,
+    "Dynamic invocation of 'listen'.": 1,
+    "Dynamic invocation of 'close'.": 1
+  },
+  "org-dartlang-sdk:///sdk_nnbd/lib/_http/websocket_impl.dart": {
+    "Dynamic invocation of 'dart._http::_toJSON'.": 1
+  }
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/analyses/api_dynamic_test.dart b/tests/compiler/dart2js/analyses/api_dynamic_test.dart
index d9a0bf7..59aa11c 100644
--- a/tests/compiler/dart2js/analyses/api_dynamic_test.dart
+++ b/tests/compiler/dart2js/analyses/api_dynamic_test.dart
@@ -5,14 +5,16 @@
 // @dart = 2.7
 
 import 'package:async_helper/async_helper.dart';
+import '../helpers/compiler_helper.dart';
 import 'analysis_helper.dart';
 
 // TODO(johnniwinther): Remove unneeded dynamic accesses from platform source
 // code.
 main(List<String> args) {
+  var goldenFile = isDart2jsNnbd ? 'api_allowed_nnbd.json' : 'api_allowed.json';
   asyncTest(() async {
     await run(Uri.parse('memory:main.dart'),
-        'tests/compiler/dart2js/analyses/api_allowed.json',
+        'tests/compiler/dart2js/analyses/$goldenFile',
         analyzedUrisFilter: (Uri uri) => uri.scheme == 'dart',
         memorySourceFiles: {'main.dart': 'main() {}'},
         verbose: args.contains('-v'),
diff --git a/tests/compiler/dart2js/annotations/annotations_test.dart b/tests/compiler/dart2js/annotations/annotations_test.dart
index 82c35a0..a4424c6 100644
--- a/tests/compiler/dart2js/annotations/annotations_test.dart
+++ b/tests/compiler/dart2js/annotations/annotations_test.dart
@@ -24,7 +24,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, const AnnotationDataComputer(),
-        args: args, testedConfigs: allStrongConfigs);
+        args: args, testedConfigs: allSpecConfigs);
   });
 }
 
diff --git a/tests/compiler/dart2js/annotations/data/marker.options b/tests/compiler/dart2js/annotations/data/marker.options
index 730d5c7..24b51f0 100644
--- a/tests/compiler/dart2js/annotations/data/marker.options
+++ b/tests/compiler/dart2js/annotations/data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/annotations/annotations_test.dart
-omit=tests/compiler/dart2js/annotations/annotations_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/annotations/annotations_test.dart
+prod:nnbd-off=tests/compiler/dart2js/annotations/annotations_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/annotations/annotations_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/annotations/annotations_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/closure/data/generic.dart b/tests/compiler/dart2js/closure/data/generic.dart
index a2f552d..2ceb029 100644
--- a/tests/compiler/dart2js/closure/data/generic.dart
+++ b/tests/compiler/dart2js/closure/data/generic.dart
@@ -58,12 +58,12 @@
     }
 
     var local2 =
-        /*strong.fields=[S,this],free=[S,this],hasThis*/
-        /*omit.hasThis*/
+        /*spec:nnbd-off|spec:nnbd-sdk.fields=[S,this],free=[S,this],hasThis*/
+        /*prod:nnbd-off|prod:nnbd-sdk.hasThis*/
         (o) {
       return
-          /*strong.fields=[S,this],free=[S,this],hasThis*/
-          /*omit.hasThis*/
+          /*spec:nnbd-off|spec:nnbd-sdk.fields=[S,this],free=[S,this],hasThis*/
+          /*prod:nnbd-off|prod:nnbd-sdk.hasThis*/
           () => new Map<T, S>();
     };
     return local2(local<double>());
diff --git a/tests/compiler/dart2js/closure/data/instantiation.dart b/tests/compiler/dart2js/closure/data/instantiation.dart
index 19949ff..17031f5 100644
--- a/tests/compiler/dart2js/closure/data/instantiation.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation.dart
@@ -7,8 +7,8 @@
 T id<T>(T t) => t;
 
 method<S>(S s) {
-  /*strong.fields=[S],free=[S]*/
-  /*omit.*/
+  /*spec:nnbd-off|spec:nnbd-sdk.fields=[S],free=[S]*/
+  /*prod:nnbd-off.*/
   S Function(S) getId() => id;
   return getId();
 }
diff --git a/tests/compiler/dart2js/closure/data/instantiation1.dart b/tests/compiler/dart2js/closure/data/instantiation1.dart
index 3f31e41..0e0d917 100644
--- a/tests/compiler/dart2js/closure/data/instantiation1.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation1.dart
@@ -13,8 +13,8 @@
   /*member: B.method:hasThis*/
   method() {
     return
-        /*strong.fields=[this],free=[this],hasThis*/
-        /*omit.hasThis*/
+        /*spec:nnbd-off|spec:nnbd-sdk.fields=[this],free=[this],hasThis*/
+        /*prod:nnbd-off|prod:nnbd-sdk.hasThis*/
         () {
       F<S> c = f;
       return c;
diff --git a/tests/compiler/dart2js/closure/data/instantiation2.dart b/tests/compiler/dart2js/closure/data/instantiation2.dart
index 8e75f09..b74a15d 100644
--- a/tests/compiler/dart2js/closure/data/instantiation2.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation2.dart
@@ -13,8 +13,7 @@
   /*member: B.method:hasThis*/
   method() {
     return
-        /*strong.fields=[this],free=[this],hasThis*/
-        /*omit.fields=[this],free=[this],hasThis*/
+        /*fields=[this],free=[this],hasThis*/
         () {
       F<S> c = f;
       return c;
diff --git a/tests/compiler/dart2js/closure/data/instantiation3.dart b/tests/compiler/dart2js/closure/data/instantiation3.dart
index 2157d67..c20327b 100644
--- a/tests/compiler/dart2js/closure/data/instantiation3.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation3.dart
@@ -10,8 +10,8 @@
 
 method<S>() {
   return
-      /*strong.fields=[S],free=[S]*/
-      /*omit.*/
+      /*spec:nnbd-off|spec:nnbd-sdk.fields=[S],free=[S]*/
+      /*prod:nnbd-off.*/
       () {
     F<S> c = f;
     return c;
diff --git a/tests/compiler/dart2js/closure/data/instantiation4.dart b/tests/compiler/dart2js/closure/data/instantiation4.dart
index 05b8caf..0da1e4b 100644
--- a/tests/compiler/dart2js/closure/data/instantiation4.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation4.dart
@@ -10,8 +10,7 @@
 
 method<S>() {
   return
-      /*strong.fields=[S],free=[S]*/
-      /*omit.fields=[S],free=[S]*/
+      /*fields=[S],free=[S]*/
       () {
     F<S> c = f;
     return c;
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 516b390..8a7c352 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
@@ -11,8 +11,8 @@
   /*member: A.method:hasThis*/
   @pragma('dart2js:noInline')
   method() {
-    /*omit.hasThis*/
-    /*strong.fields=[this],free=[this],hasThis*/
+    /*prod:nnbd-off|prod:nnbd-sdk.hasThis*/
+    /*spec:nnbd-off|spec:nnbd-sdk.fields=[this],free=[this],hasThis*/
     dynamic local() => <T>[];
     return local;
   }
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 42e8cf2..f389236 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
@@ -8,8 +8,8 @@
 
 @pragma('dart2js:noInline')
 method<T>() {
-  /*omit.*/
-  /*strong.fields=[T],free=[T]*/
+  /*prod:nnbd-off.*/
+  /*spec:nnbd-off|spec:nnbd-sdk.fields=[T],free=[T]*/
   dynamic local() => <T>[];
   return local;
 }
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 6ee00d3..d1b27bd 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
@@ -11,8 +11,8 @@
   /*member: A.method:hasThis*/
   @pragma('dart2js:noInline')
   method() {
-    /*omit.hasThis*/
-    /*strong.fields=[this],free=[this],hasThis*/
+    /*prod:nnbd-off|prod:nnbd-sdk.hasThis*/
+    /*spec:nnbd-off|spec:nnbd-sdk.fields=[this],free=[this],hasThis*/
     dynamic local() => <T, int>{};
     return local;
   }
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 d2adfbb..57a3dfd 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
@@ -8,8 +8,8 @@
 
 @pragma('dart2js:noInline')
 method<T>() {
-  /*omit.*/
-  /*strong.fields=[T],free=[T]*/
+  /*prod:nnbd-off.*/
+  /*spec:nnbd-off|spec:nnbd-sdk.fields=[T],free=[T]*/
   dynamic local() => <T, int>{};
   return local;
 }
diff --git a/tests/compiler/dart2js/closure/data/marker.options b/tests/compiler/dart2js/closure/data/marker.options
index f297827..ba31510 100644
--- a/tests/compiler/dart2js/closure/data/marker.options
+++ b/tests/compiler/dart2js/closure/data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/closure/closure_test.dart
-omit=tests/compiler/dart2js/closure/closure_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/closure/closure_test.dart
+prod:nnbd-off=tests/compiler/dart2js/closure/closure_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/closure/closure_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/closure/closure_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/closure/data/test_type_class.dart b/tests/compiler/dart2js/closure/data/test_type_class.dart
index ead1797..0c92250 100644
--- a/tests/compiler/dart2js/closure/data/test_type_class.dart
+++ b/tests/compiler/dart2js/closure/data/test_type_class.dart
@@ -33,15 +33,15 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-/// Implicit as-cast is only required in strong mode.
+/// Implicit as-cast is only required in spec:nnbd-off mode.
 ////////////////////////////////////////////////////////////////////////////////
 
 /*member: Class3.:hasThis*/
 class Class3<T> {
   /*member: Class3.method3:hasThis*/
   method3(dynamic o) {
-    /*omit.fields=[o],free=[o],hasThis*/
-    /*strong.fields=[o,this],free=[o,this],hasThis*/
+    /*prod:nnbd-off|prod:nnbd-sdk.fields=[o],free=[o],hasThis*/
+    /*spec:nnbd-off|spec:nnbd-sdk.fields=[o,this],free=[o,this],hasThis*/
     T local() => o;
     return local;
   }
diff --git a/tests/compiler/dart2js/closure/data/test_type_method.dart b/tests/compiler/dart2js/closure/data/test_type_method.dart
index faad952..452f6c1 100644
--- a/tests/compiler/dart2js/closure/data/test_type_method.dart
+++ b/tests/compiler/dart2js/closure/data/test_type_method.dart
@@ -27,13 +27,13 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-/// Implicit as-cast is only required in strong mode.
+/// Implicit as-cast is only required in spec:nnbd-off mode.
 ////////////////////////////////////////////////////////////////////////////////
 
 /*member: method3:*/
 method3<T>(dynamic o) {
-  /*strong.fields=[T,o],free=[T,o]*/
-  /*omit.fields=[o],free=[o]*/
+  /*spec:nnbd-off|spec:nnbd-sdk.fields=[T,o],free=[T,o]*/
+  /*prod:nnbd-off|prod:nnbd-sdk.fields=[o],free=[o]*/
   T local() => o;
   return local;
 }
diff --git a/tests/compiler/dart2js/closure/data/type_annotations_class.dart b/tests/compiler/dart2js/closure/data/type_annotations_class.dart
index 1732242..5d1cfdc 100644
--- a/tests/compiler/dart2js/closure/data/type_annotations_class.dart
+++ b/tests/compiler/dart2js/closure/data/type_annotations_class.dart
@@ -43,30 +43,30 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-/// A local function parameter type is only captured in strong mode.
+/// A local function parameter type is only captured in spec:nnbd-off mode.
 ////////////////////////////////////////////////////////////////////////////////
 
 /*member: Class2.:hasThis*/
 class Class2<T> {
   /*member: Class2.method2:hasThis*/
   method2() {
-    /*omit.hasThis*/
-    /*strong.fields=[this],free=[this],hasThis*/
+    /*prod:nnbd-off|prod:nnbd-sdk.hasThis*/
+    /*spec:nnbd-off|spec:nnbd-sdk.fields=[this],free=[this],hasThis*/
     dynamic local(T t) => t;
     return local;
   }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-/// A local function return type is only captured in strong mode.
+/// A local function return type is only captured in spec:nnbd-off mode.
 ////////////////////////////////////////////////////////////////////////////////
 
 /*member: Class3.:hasThis*/
 class Class3<T> {
   /*member: Class3.method3:hasThis*/
   method3(dynamic o) {
-    /*omit.fields=[o],free=[o],hasThis*/
-    /*strong.fields=[o,this],free=[o,this],hasThis*/
+    /*prod:nnbd-off|prod:nnbd-sdk.fields=[o],free=[o],hasThis*/
+    /*spec:nnbd-off|spec:nnbd-sdk.fields=[o,this],free=[o,this],hasThis*/
     T local() => o;
     return local;
   }
@@ -108,8 +108,8 @@
 class Class6<T> {
   /*member: Class6.method6:hasThis*/
   method6() {
-    /*omit.hasThis*/
-    /*strong.fields=[this],free=[this],hasThis*/
+    /*prod:nnbd-off|prod:nnbd-sdk.hasThis*/
+    /*spec:nnbd-off|spec:nnbd-sdk.fields=[this],free=[this],hasThis*/
     dynamic local(T t) {
       /*fields=[t],free=[t],hasThis*/
       dynamic inner() => t;
@@ -128,8 +128,8 @@
 class Class7<T> {
   /*member: Class7.method7:hasThis*/
   method7(dynamic o) {
-    /*omit.fields=[o],free=[o],hasThis*/
-    /*strong.fields=[o,this],free=[o,this],hasThis*/
+    /*prod:nnbd-off|prod:nnbd-sdk.fields=[o],free=[o],hasThis*/
+    /*spec:nnbd-off|spec:nnbd-sdk.fields=[o,this],free=[o,this],hasThis*/
     T local() {
       /*fields=[o],free=[o],hasThis*/
       dynamic inner() => o;
diff --git a/tests/compiler/dart2js/closure/data/type_annotations_method.dart b/tests/compiler/dart2js/closure/data/type_annotations_method.dart
index 4bf4396..a73576f 100644
--- a/tests/compiler/dart2js/closure/data/type_annotations_method.dart
+++ b/tests/compiler/dart2js/closure/data/type_annotations_method.dart
@@ -19,23 +19,23 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-/// A local function parameter type is captured in strong mode.
+/// A local function parameter type is captured in spec:nnbd-off mode.
 ////////////////////////////////////////////////////////////////////////////////
 
 method2<T>() {
-  /*strong.fields=[T],free=[T]*/
-  /*omit.*/
+  /*spec:nnbd-off|spec:nnbd-sdk.fields=[T],free=[T]*/
+  /*prod:nnbd-off.*/
   dynamic local(T t) => t;
   return local;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-/// A local function return type is captured in strong mode.
+/// A local function return type is captured in spec:nnbd-off mode.
 ////////////////////////////////////////////////////////////////////////////////
 
 method3<T>(dynamic o) {
-  /*strong.fields=[T,o],free=[T,o]*/
-  /*omit.fields=[o],free=[o]*/
+  /*spec:nnbd-off|spec:nnbd-sdk.fields=[T,o],free=[T,o]*/
+  /*prod:nnbd-off|prod:nnbd-sdk.fields=[o],free=[o]*/
   T local() => o;
   return local;
 }
@@ -65,8 +65,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 method6<T>() {
-  /*strong.fields=[T],free=[T]*/
-  /*omit.*/
+  /*spec:nnbd-off|spec:nnbd-sdk.fields=[T],free=[T]*/
+  /*prod:nnbd-off.*/
   dynamic local(T t) {
     /*fields=[t],free=[t]*/
     dynamic inner() => t;
@@ -81,8 +81,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 method7<T>(dynamic o) {
-  /*strong.fields=[T,o],free=[T,o]*/
-  /*omit.fields=[o],free=[o]*/
+  /*spec:nnbd-off|spec:nnbd-sdk.fields=[T,o],free=[T,o]*/
+  /*prod:nnbd-off|prod:nnbd-sdk.fields=[o],free=[o]*/
   T local() {
     /*fields=[o],free=[o]*/
     dynamic inner() => o;
diff --git a/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart b/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart
index e5afcba..ae298ae 100644
--- a/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart
@@ -26,27 +26,55 @@
 }
 
 class Class2a<T> {
-  /*strong.member: Class2a.field2:checked,emitted*/
-  /*omit.member: Class2a.field2:emitted*/
+  /*spec:nnbd-sdk.member: Class2a.field2:
+   checked,
+   emitted
+  */
+  /*spec:nnbd-off.member: Class2a.field2:checked,emitted*/
+  /*prod:nnbd-off|prod:nnbd-sdk.member: Class2a.field2:emitted*/
   T field2;
 }
 
-/*strong.member: method2:calls=[set$field2(1)],params=1*/
-/*omit.member: method2:assign=[field2],params=1*/
+/*spec:nnbd-off.member: method2:calls=[set$field2(1)],params=1*/
+/*prod:nnbd-off.member: method2:assign=[field2],params=1*/
 @pragma('dart2js:noInline')
+/*spec:nnbd-sdk.member: method2:
+ calls=[set$field2(1)],
+ params=1
+*/
+/*prod:nnbd-sdk.member: method2:
+ assign=[field2],
+ params=1
+*/
 method2(dynamic c) {
   c.field2 = 42;
 }
 
 class Class3a {
-  /*strong.member: Class3a.field3:checked,emitted*/
-  /*omit.member: Class3a.field3:emitted,set=simple*/
+  /*spec:nnbd-sdk.member: Class3a.field3:
+   checked,
+   emitted
+  */
+  /*prod:nnbd-sdk.member: Class3a.field3:
+   emitted,
+   set=simple
+  */
+  /*spec:nnbd-off.member: Class3a.field3:checked,emitted*/
+  /*prod:nnbd-off.member: Class3a.field3:emitted,set=simple*/
   int field3;
 }
 
 class Class3b {
-  /*strong.member: Class3b.field3:checked,emitted*/
-  /*omit.member: Class3b.field3:emitted,set=simple*/
+  /*spec:nnbd-sdk.member: Class3b.field3:
+   checked,
+   emitted
+  */
+  /*prod:nnbd-sdk.member: Class3b.field3:
+   emitted,
+   set=simple
+  */
+  /*spec:nnbd-off.member: Class3b.field3:checked,emitted*/
+  /*prod:nnbd-off.member: Class3b.field3:emitted,set=simple*/
   int field3;
 }
 
@@ -57,15 +85,31 @@
 }
 
 class Class4a {
-  /*strong.member: Class4a.field4:checked,emitted*/
-  /*omit.member: Class4a.field4:emitted,set=simple*/
+  /*spec:nnbd-sdk.member: Class4a.field4:
+   checked,
+   emitted
+  */
+  /*prod:nnbd-sdk.member: Class4a.field4:
+   emitted,
+   set=simple
+  */
+  /*spec:nnbd-off.member: Class4a.field4:checked,emitted*/
+  /*prod:nnbd-off.member: Class4a.field4:emitted,set=simple*/
   int field4;
 }
 
 class Class4b implements Class4a {
-  /*strong.member: Class4b.field4:checked,emitted*/
-  /*omit.member: Class4b.field4:emitted,set=simple*/
+  /*spec:nnbd-off.member: Class4b.field4:checked,emitted*/
+  /*prod:nnbd-off.member: Class4b.field4:emitted,set=simple*/
   @override
+  /*spec:nnbd-sdk.member: Class4b.field4:
+   checked,
+   emitted
+  */
+  /*prod:nnbd-sdk.member: Class4b.field4:
+   emitted,
+   set=simple
+  */
   int field4;
 }
 
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 053a59c..cef28b2 100644
--- a/tests/compiler/dart2js/codegen/model_data/dynamic_set_unread.dart
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_set_unread.dart
@@ -26,27 +26,51 @@
 }
 
 class Class2a<T> {
-  /*strong.member: Class2a.field2:checked,elided*/
-  /*omit.member: Class2a.field2:elided*/
+  /*spec:nnbd-sdk.member: Class2a.field2:
+   checked,
+   elided
+  */
+  /*spec:nnbd-off.member: Class2a.field2:checked,elided*/
+  /*prod:nnbd-off|prod:nnbd-sdk.member: Class2a.field2:elided*/
   T field2;
 }
 
-/*strong.member: method2:calls=[set$field2(1)],params=1*/
-/*omit.member: method2:params=1*/
+/*spec:nnbd-off.member: method2:calls=[set$field2(1)],params=1*/
+/*prod:nnbd-off|prod:nnbd-sdk.member: method2:params=1*/
 @pragma('dart2js:noInline')
+/*spec:nnbd-sdk.member: method2:
+ calls=[set$field2(1)],
+ params=1
+*/
 method2(dynamic c) {
   c.field2 = 42;
 }
 
 class Class3a {
-  /*strong.member: Class3a.field3:checked,elided*/
-  /*omit.member: Class3a.field3:elided,set=simple*/
+  /*spec:nnbd-sdk.member: Class3a.field3:
+   checked,
+   elided
+  */
+  /*prod:nnbd-sdk.member: Class3a.field3:
+   elided,
+   set=simple
+  */
+  /*spec:nnbd-off.member: Class3a.field3:checked,elided*/
+  /*prod:nnbd-off.member: Class3a.field3:elided,set=simple*/
   int field3;
 }
 
 class Class3b {
-  /*strong.member: Class3b.field3:checked,elided*/
-  /*omit.member: Class3b.field3:elided,set=simple*/
+  /*spec:nnbd-sdk.member: Class3b.field3:
+   checked,
+   elided
+  */
+  /*prod:nnbd-sdk.member: Class3b.field3:
+   elided,
+   set=simple
+  */
+  /*spec:nnbd-off.member: Class3b.field3:checked,elided*/
+  /*prod:nnbd-off.member: Class3b.field3:elided,set=simple*/
   int field3;
 }
 
@@ -57,15 +81,31 @@
 }
 
 class Class4a {
-  /*strong.member: Class4a.field4:checked,elided*/
-  /*omit.member: Class4a.field4:elided,set=simple*/
+  /*spec:nnbd-sdk.member: Class4a.field4:
+   checked,
+   elided
+  */
+  /*prod:nnbd-sdk.member: Class4a.field4:
+   elided,
+   set=simple
+  */
+  /*spec:nnbd-off.member: Class4a.field4:checked,elided*/
+  /*prod:nnbd-off.member: Class4a.field4:elided,set=simple*/
   int field4;
 }
 
 class Class4b implements Class4a {
-  /*strong.member: Class4b.field4:checked,elided*/
-  /*omit.member: Class4b.field4:elided,set=simple*/
+  /*spec:nnbd-off.member: Class4b.field4:checked,elided*/
+  /*prod:nnbd-off.member: Class4b.field4:elided,set=simple*/
   @override
+  /*spec:nnbd-sdk.member: Class4b.field4:
+   checked,
+   elided
+  */
+  /*prod:nnbd-sdk.member: Class4b.field4:
+   elided,
+   set=simple
+  */
   int field4;
 }
 
diff --git a/tests/compiler/dart2js/codegen/model_data/marker.options b/tests/compiler/dart2js/codegen/model_data/marker.options
index f7d45f7..ab72a7b2 100644
--- a/tests/compiler/dart2js/codegen/model_data/marker.options
+++ b/tests/compiler/dart2js/codegen/model_data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/codegen/model_test.dart
-omit=tests/compiler/dart2js/codegen/model_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/codegen/model_test.dart
+prod:nnbd-off=tests/compiler/dart2js/codegen/model_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/codegen/model_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/codegen/model_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart b/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
index e26d48d..654b5bb 100644
--- a/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
+++ b/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
@@ -20,8 +20,15 @@
 @pragma('dart2js:noInline')
 void bar(I2 x) {}
 
-/*strong.member: main:calls=[bar(1),bar(1),foo(1),foo(1)],params=0*/
-/*omit.member: main:calls=[bar(1),bar(1),foo(1),foo(1)],params=0*/
+/*spec:nnbd-off|prod:nnbd-off.member: main:calls=[bar(1),bar(1),foo(1),foo(1)],params=0*/
+/*spec:nnbd-sdk|prod:nnbd-sdk.member: main:
+ calls=[
+  bar(1),
+  bar(1),
+  foo(1),
+  foo(1)],
+ params=0
+*/
 main() {
   dynamic f = bar;
 
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 f31c25c..832e2f2 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
@@ -6,11 +6,12 @@
 
 import 'lib1.dart' deferred as lib;
 
-/*member: main:
+/*spec:nnbd-off.member: main:
  OutputUnit(main, {}),
  constants=[
   MapConstant(<int, dynamic Function({M b})>{IntConstant(1): FunctionConstant(f1), IntConstant(2): FunctionConstant(f2)})=OutputUnit(1, {lib})]
 */
+/*spec:nnbd-sdk.member: main:OutputUnit(main, {}),constants=[MapConstant(<int*, dynamic Function({M* b})*>{IntConstant(1): FunctionConstant(f1), IntConstant(2): FunctionConstant(f2)})=OutputUnit(1, {lib})]*/
 main() async {
   await lib.loadLibrary();
   print(lib.table[1]);
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart
index 6828e57..9521da6 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart
@@ -9,10 +9,11 @@
 
 typedef dynamic G<T>(T v);
 
-/*member: m:
+/*spec:nnbd-off.member: m:
  OutputUnit(1, {b}),
  constants=[InstantiationConstant([int],FunctionConstant(getFoo))=OutputUnit(1, {b})]
 */
+/*spec:nnbd-sdk.member: m:OutputUnit(1, {b}),constants=[InstantiationConstant([int*],FunctionConstant(getFoo))=OutputUnit(1, {b})]*/
 m(int x, {G<int> f: getFoo}) {
   print(f(x));
 }
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart
index 4ca1497..2f185de 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart
@@ -9,11 +9,12 @@
 
 typedef dynamic G<T>(T v);
 
-/*member: m:
+/*spec:nnbd-off.member: m:
  OutputUnit(1, {b}),
  constants=[
   InstantiationConstant([int],FunctionConstant(getFoo))=OutputUnit(1, {b})]
 */
+/*spec:nnbd-sdk.member: m:OutputUnit(1, {b}),constants=[InstantiationConstant([int*],FunctionConstant(getFoo))=OutputUnit(1, {b})]*/
 m(int x, {G<int> f: getFoo}) {
   print(f(x));
 }
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart
index 00caeb1..e49ee5f 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart
@@ -9,11 +9,12 @@
 
 typedef dynamic G<T, S>(T v, S w);
 
-/*member: m:
+/*spec:nnbd-off.member: m:
  OutputUnit(3, {c}),
  constants=[
   InstantiationConstant([int, int],FunctionConstant(getFoo))=OutputUnit(3, {c})]
 */
+/*spec:nnbd-sdk.member: m:OutputUnit(3, {c}),constants=[InstantiationConstant([int*, int*],FunctionConstant(getFoo))=OutputUnit(3, {c})]*/
 m(int x, int y, {G<int, int> f: getFoo}) {
   print(f(x, y));
 }
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart
index 89d5d6d..ecf0bc4 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart
@@ -9,11 +9,12 @@
 
 typedef dynamic G<T>(T v);
 
-/*member: m:
+/*spec:nnbd-off.member: m:
  OutputUnit(2, {b}),
  constants=[
   InstantiationConstant([int],FunctionConstant(getFoo))=OutputUnit(2, {b})]
 */
+/*spec:nnbd-sdk.member: m:OutputUnit(2, {b}),constants=[InstantiationConstant([int*],FunctionConstant(getFoo))=OutputUnit(2, {b})]*/
 m(int x, {G<int> f: getFoo}) {
   print(f(x));
 }
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart
index d7a9c46..714e91f 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart
@@ -9,11 +9,12 @@
 
 typedef dynamic G<T>(T v);
 
-/*member: m:
+/*spec:nnbd-off.member: m:
  OutputUnit(3, {c}),
  constants=[
   InstantiationConstant([int],FunctionConstant(getFoo))=OutputUnit(3, {c})]
 */
+/*spec:nnbd-sdk.member: m:OutputUnit(3, {c}),constants=[InstantiationConstant([int*],FunctionConstant(getFoo))=OutputUnit(3, {c})]*/
 m(int x, {G<int> f: getFoo}) {
   print(f(x));
 }
diff --git a/tests/compiler/dart2js/deferred_loading/data/marker.options b/tests/compiler/dart2js/deferred_loading/data/marker.options
index 94f0636..c970e11 100644
--- a/tests/compiler/dart2js/deferred_loading/data/marker.options
+++ b/tests/compiler/dart2js/deferred_loading/data/marker.options
@@ -1 +1,2 @@
-strong=tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
\ No newline at end of file
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 016ba07..a236b19 100644
--- a/tests/compiler/dart2js/deferred_loading/data/static_separate/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/static_separate/lib2.dart
@@ -9,12 +9,13 @@
 import "package:expect/expect.dart";
 import "lib1.dart";
 
-/*member: foo:
+/*spec:nnbd-off.member: foo:
  OutputUnit(3, {lib2}),
  constants=[
   ListConstant(<Map<int,int>>[MapConstant(<int, int>{IntConstant(1): IntConstant(3)})])=OutputUnit(3, {lib2}),
   MapConstant(<int, int>{IntConstant(1): IntConstant(3)})=OutputUnit(3, {lib2})]
 */
+/*spec:nnbd-sdk.member: foo:OutputUnit(3, {lib2}),constants=[ListConstant(<Map<int*,int*>*>[MapConstant(<int*, int*>{IntConstant(1): IntConstant(3)})])=OutputUnit(3, {lib2}),MapConstant(<int*, int*>{IntConstant(1): IntConstant(3)})=OutputUnit(3, {lib2})]*/
 foo() {
   Expect.equals(1, C.foo());
   Expect.mapEquals({}, C1.foo);
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 d9b4bac..2423196 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_arguments/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_arguments/main.dart
@@ -8,7 +8,7 @@
 import 'lib2.dart' as lib2;
 import 'lib3.dart' deferred as lib3;
 
-/*member: main:
+/*spec:nnbd-off.member: main:
  OutputUnit(main, {}),
  constants=[
   ConstructedConstant(A<B>())=OutputUnit(1, {lib1}),
@@ -16,6 +16,7 @@
   ConstructedConstant(C<D>())=OutputUnit(main, {}),
   ConstructedConstant(E<F>())=OutputUnit(3, {lib3})]
 */
+/*spec:nnbd-sdk.member: main:OutputUnit(main, {}),constants=[ConstructedConstant(A<B*>())=OutputUnit(1, {lib1}),ConstructedConstant(A<F*>())=OutputUnit(1, {lib1}),ConstructedConstant(C<D*>())=OutputUnit(main, {}),ConstructedConstant(E<F*>())=OutputUnit(3, {lib3})]*/
 main() async {
   await lib1.loadLibrary();
   lib1.field1;
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index 96b7600..f25018a 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -34,11 +34,9 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, const OutputUnitDataComputer(),
-        options: compilerOptions,
-        args: args,
-        setUpFunction: () {
+        options: compilerOptions, args: args, setUpFunction: () {
       importPrefixes.clear();
-    }, testedConfigs: allStrongConfigs);
+    }, testedConfigs: allSpecConfigs);
   });
 }
 
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 20e6173..d6da685 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -19,6 +19,7 @@
 import 'package:expect/expect.dart';
 import 'package:kernel/ast.dart' as ir;
 
+import '../helpers/compiler_helper.dart';
 import '../helpers/memory_compiler.dart';
 import '../equivalence/id_equivalence.dart';
 
@@ -26,42 +27,54 @@
     show DataInterpreter, StringDataInterpreter;
 export '../helpers/memory_compiler.dart' show CollectedMessage;
 
-const String strongMarker = 'strong';
-const String omitMarker = 'omit';
+const String specWithNnbdOffMarker = 'spec:nnbd-off';
+const String prodWithNnbdOffMarker = 'prod:nnbd-off';
+const String specWithNnbdSdkMarker = 'spec:nnbd-sdk';
+const String prodWithNnbdSdkMarker = 'prod:nnbd-sdk';
 
-const TestConfig strongConfig =
-    const TestConfig(strongMarker, 'strong mode', []);
+const TestConfig specWithNnbdOffConfig = const TestConfig(
+    specWithNnbdOffMarker, 'compliance mode with nnbd off', []);
 
-const TestConfig omitConfig = const TestConfig(
-    omitMarker,
-    'strong mode without implicit checks',
+const TestConfig prodWithNnbdOffConfig = const TestConfig(
+    prodWithNnbdOffMarker,
+    'production mode with nnbd off',
+    [Flags.omitImplicitChecks, Flags.laxRuntimeTypeToString]);
+
+const TestConfig specWithNnbdSdkConfig = const TestConfig(
+    specWithNnbdSdkMarker, 'compliance mode with nnbd sdk', []);
+
+const TestConfig prodWithNnbdSdkConfig = const TestConfig(
+    prodWithNnbdSdkMarker,
+    'production mode with nnbd sdk',
     [Flags.omitImplicitChecks, Flags.laxRuntimeTypeToString]);
 
 const List<String> allInternalMarkers = const [
-  strongMarker,
-  omitMarker,
+  specWithNnbdOffMarker,
+  prodWithNnbdOffMarker,
+  specWithNnbdSdkMarker,
+  prodWithNnbdSdkMarker
 ];
 
 /// Default internal configurations not including experimental features.
-const List<TestConfig> defaultInternalConfigs = const [
-  strongConfig,
-  omitConfig
-];
+List<TestConfig> defaultInternalConfigs = isDart2jsNnbd
+    ? const [specWithNnbdSdkConfig, prodWithNnbdSdkConfig]
+    : const [specWithNnbdOffConfig, prodWithNnbdOffConfig];
 
 /// All internal configurations including experimental features.
-const List<TestConfig> allInternalConfigs = const [
-  strongConfig,
-  omitConfig,
-];
+List<TestConfig> allInternalConfigs = isDart2jsNnbd
+    ? const [specWithNnbdSdkConfig, prodWithNnbdSdkConfig]
+    : const [specWithNnbdOffConfig, prodWithNnbdOffConfig];
 
 /// Compliance mode configurations (with strong mode checks) including
 /// experimental features.
-const List<TestConfig> allStrongConfigs = const [
-  strongConfig,
-];
+List<TestConfig> allSpecConfigs = isDart2jsNnbd
+    ? const [specWithNnbdSdkConfig]
+    : const [specWithNnbdOffConfig];
 
 /// Test configuration used in tests shared with CFE.
-const TestConfig sharedConfig = const TestConfig(dart2jsMarker, 'dart2js', []);
+TestConfig sharedConfig = isDart2jsNnbd
+    ? const TestConfig(dart2jsWithNnbdSdkMarker, 'dart2js with nnbd sdk', [])
+    : const TestConfig(dart2jsMarker, 'dart2js', []);
 
 abstract class DataComputer<T> {
   const DataComputer();
@@ -400,7 +413,8 @@
     int shards: 1,
     int shardIndex: 0,
     void onTest(Uri uri),
-    List<TestConfig> testedConfigs = defaultInternalConfigs}) async {
+    List<TestConfig> testedConfigs = const []}) async {
+  if (testedConfigs.isEmpty) testedConfigs = defaultInternalConfigs;
   Set<String> testedMarkers =
       testedConfigs.map((config) => config.marker).toSet();
   Expect.isTrue(
diff --git a/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart b/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart
index 4c7031d..bb22f2a 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart
@@ -19,7 +19,8 @@
 }
 
 class Class2 {
-  /*strong.member: Class2.field2:constant=BoolConstant(true)*/
+  /*spec:nnbd-off|spec:nnbd-sdk.member: Class2.field2:constant=BoolConstant(true)*/
+  /*prod:nnbd-off|prod:nnbd-sdk.strong.member: Class2.field2:constant=BoolConstant(true)*/
   final bool field2;
 
   const Class2({this.field2: false});
diff --git a/tests/compiler/dart2js/field_analysis/jdata/marker.options b/tests/compiler/dart2js/field_analysis/jdata/marker.options
index e9de6cf..f333b74 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/marker.options
+++ b/tests/compiler/dart2js/field_analysis/jdata/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
-omit=tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
+prod:nnbd-off=tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
index 63c45ec..b4886b3 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
@@ -178,10 +178,12 @@
   /*member: Class1.field9b:constant=ListConstant([])*/
   var field9b = const [];
 
-  /*member: Class1.field9c:initial=ListConstant(<int>[IntConstant(0), IntConstant(1)])*/
+  /*spec:nnbd-off|prod:nnbd-off|prod:nnbd-sdk.member: Class1.field9c:initial=ListConstant(<int>[IntConstant(0), IntConstant(1)])*/
+  /*spec:nnbd-sdk.member: Class1.field9c:initial=ListConstant(<int*>[IntConstant(0), IntConstant(1)])*/
   var field9c = const [0, 1];
 
-  /*member: Class1.field9d:constant=ListConstant(<int>[IntConstant(0), IntConstant(1), IntConstant(2)])*/
+  /*spec:nnbd-off|prod:nnbd-off|prod:nnbd-sdk.member: Class1.field9d:constant=ListConstant(<int>[IntConstant(0), IntConstant(1), IntConstant(2)])*/
+  /*spec:nnbd-sdk.member: Class1.field9d:constant=ListConstant(<int*>[IntConstant(0), IntConstant(1), IntConstant(2)])*/
   var field9d = const [0, 1, 2];
 
   /*member: Class1.field10a:initial=MapConstant({})*/
@@ -190,10 +192,12 @@
   /*member: Class1.field10b:constant=MapConstant({})*/
   var field10b = const {};
 
-  /*member: Class1.field10c:initial=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3)})*/
+  /*spec:nnbd-off|prod:nnbd-off|prod:nnbd-sdk.member: Class1.field10c:initial=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3)})*/
+  /*spec:nnbd-sdk.member: Class1.field10c:initial=MapConstant(<int*, int*>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3)})*/
   var field10c = const {0: 1, 2: 3};
 
-  /*member: Class1.field10d:constant=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3), IntConstant(4): IntConstant(5)})*/
+  /*spec:nnbd-off|prod:nnbd-off|prod:nnbd-sdk.member: Class1.field10d:constant=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3), IntConstant(4): IntConstant(5)})*/
+  /*spec:nnbd-sdk.member: Class1.field10d:constant=MapConstant(<int*, int*>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3), IntConstant(4): IntConstant(5)})*/
   var field10d = const {0: 1, 2: 3, 4: 5};
 
   /*member: Class1.field11a:initial=ConstructedConstant(Symbol(_name=StringConstant("foo")))*/
@@ -270,10 +274,12 @@
   /*member: Class2.field9b:constant=ListConstant([])*/
   var field9b;
 
-  /*member: Class2.field9c:initial=ListConstant(<int>[IntConstant(0), IntConstant(1)])*/
+  /*spec:nnbd-off|prod:nnbd-off|prod:nnbd-sdk.member: Class2.field9c:initial=ListConstant(<int>[IntConstant(0), IntConstant(1)])*/
+  /*spec:nnbd-sdk.member: Class2.field9c:initial=ListConstant(<int*>[IntConstant(0), IntConstant(1)])*/
   var field9c;
 
-  /*member: Class2.field9d:constant=ListConstant(<int>[IntConstant(0), IntConstant(1), IntConstant(2)])*/
+  /*spec:nnbd-off|prod:nnbd-off|prod:nnbd-sdk.member: Class2.field9d:constant=ListConstant(<int>[IntConstant(0), IntConstant(1), IntConstant(2)])*/
+  /*spec:nnbd-sdk.member: Class2.field9d:constant=ListConstant(<int*>[IntConstant(0), IntConstant(1), IntConstant(2)])*/
   var field9d;
 
   /*member: Class2.field10a:initial=MapConstant({})*/
@@ -282,10 +288,12 @@
   /*member: Class2.field10b:constant=MapConstant({})*/
   var field10b;
 
-  /*member: Class2.field10c:initial=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3)})*/
+  /*spec:nnbd-off|prod:nnbd-off|prod:nnbd-sdk.member: Class2.field10c:initial=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3)})*/
+  /*spec:nnbd-sdk.member: Class2.field10c:initial=MapConstant(<int*, int*>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3)})*/
   var field10c;
 
-  /*member: Class2.field10d:constant=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3), IntConstant(4): IntConstant(5)})*/
+  /*spec:nnbd-off|prod:nnbd-off|prod:nnbd-sdk.member: Class2.field10d:constant=MapConstant(<int, int>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3), IntConstant(4): IntConstant(5)})*/
+  /*spec:nnbd-sdk.member: Class2.field10d:constant=MapConstant(<int*, int*>{IntConstant(0): IntConstant(1), IntConstant(2): IntConstant(3), IntConstant(4): IntConstant(5)})*/
   var field10d;
 
   /*member: Class2.field11a:initial=ConstructedConstant(Symbol(_name=StringConstant("foo")))*/
diff --git a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
index e301643..857f7e8 100644
--- a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
@@ -20,7 +20,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('jdata'));
     await checkTests(dataDir, const JAllocatorAnalysisDataComputer(),
-        args: args, testedConfigs: allStrongConfigs);
+        args: args, testedConfigs: allSpecConfigs);
   });
 }
 
diff --git a/tests/compiler/dart2js/field_analysis/kdata/marker.options b/tests/compiler/dart2js/field_analysis/kdata/marker.options
index 16bd064..19ad6c1 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/marker.options
+++ b/tests/compiler/dart2js/field_analysis/kdata/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
-omit=tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
+prod:nnbd-off=tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
index 3a8f113..22af00e 100644
--- a/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
@@ -20,7 +20,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('kdata'));
     await checkTests(dataDir, const KAllocatorAnalysisDataComputer(),
-        args: args, testedConfigs: allStrongConfigs);
+        args: args, testedConfigs: allSpecConfigs);
   });
 }
 
diff --git a/tests/compiler/dart2js/helpers/compiler_helper.dart b/tests/compiler/dart2js/helpers/compiler_helper.dart
index 9c40a59..8f4caef 100644
--- a/tests/compiler/dart2js/helpers/compiler_helper.dart
+++ b/tests/compiler/dart2js/helpers/compiler_helper.dart
@@ -7,6 +7,7 @@
 library compiler_helper;
 
 import 'dart:async';
+import 'dart:io';
 import 'package:compiler/compiler_new.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
@@ -237,3 +238,6 @@
 RegExp _directivePattern = new RegExp(
     //      \1                     \2        \3
     r'''// *(present|absent): *(?:"([^"]*)"|'([^'']*)')''', multiLine: true);
+
+bool isDart2jsNnbd =
+    Platform.environment['DART_CONFIGURATION'] == 'ReleaseX64NNBD';
diff --git a/tests/compiler/dart2js/impact/data/marker.options b/tests/compiler/dart2js/impact/data/marker.options
index f001ac8..8ea68a6 100644
--- a/tests/compiler/dart2js/impact/data/marker.options
+++ b/tests/compiler/dart2js/impact/data/marker.options
@@ -1 +1,2 @@
-strong=tests/compiler/dart2js/impact/impact_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/impact/impact_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/impact/impact_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/impact/impact_test.dart b/tests/compiler/dart2js/impact/impact_test.dart
index 1ae3981..315b9ac 100644
--- a/tests/compiler/dart2js/impact/impact_test.dart
+++ b/tests/compiler/dart2js/impact/impact_test.dart
@@ -25,15 +25,13 @@
     print('==================================================================');
     useImpactDataForTesting = false;
     await checkTests(dataDir, const ImpactDataComputer(),
-        args: args,
-        testedConfigs: [strongConfig]);
+        args: args, testedConfigs: allSpecConfigs);
 
     print('Testing computation of ResolutionImpact through ImpactData');
     print('==================================================================');
     useImpactDataForTesting = true;
     await checkTests(dataDir, const ImpactDataComputer(),
-        args: args,
-        testedConfigs: [strongConfig]);
+        args: args, testedConfigs: allSpecConfigs);
   });
 }
 
diff --git a/tests/compiler/dart2js/inference/callers/marker.options b/tests/compiler/dart2js/inference/callers/marker.options
index 10b39a7..64dc9c4 100644
--- a/tests/compiler/dart2js/inference/callers/marker.options
+++ b/tests/compiler/dart2js/inference/callers/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/inference/callers_test.dart
-omit=tests/compiler/dart2js/inference/callers_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/inference/callers_test.dart
+prod:nnbd-off=tests/compiler/dart2js/inference/callers_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/inference/callers_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/inference/callers_test.dart
\ No newline at end of file
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 23487e5..48c81d4 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
@@ -11,8 +11,8 @@
 /*member: f:[subclass=JSInt]*/
 int f(
         int
-            /*strong.[null|subclass=Object]*/
-            /*omit.[null|subclass=JSInt]*/
+            /*spec:nnbd-off|spec:nnbd-sdk.[null|subclass=Object]*/
+            /*prod:nnbd-off|prod:nnbd-sdk.[null|subclass=JSInt]*/
             i) =>
     2 /*invoke: [exact=JSUInt31]*/ * i;
 
diff --git a/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart b/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
index b93f472..2f1dcc5 100644
--- a/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
+++ b/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
@@ -57,8 +57,8 @@
       i /*invoke: [subclass=JSPositiveInt]*/ ++) {
     methods. /*invoke: [exact=JSExtendableArray]*/ add(
         /*[null]*/ (int
-            /*strong.[null|subclass=Object]*/
-            /*omit.[null|subclass=JSInt]*/
+            /*spec:nnbd-off.[null|subclass=Object]*/
+            /*prod:nnbd-off.[null|subclass=JSInt]*/
             x) {
       res = x;
       sum = x /*invoke: [null|subclass=JSInt]*/ + i;
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 9624438..a08ef1a 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
@@ -6,7 +6,7 @@
 
 import 'dart:typed_data';
 
-// TODO(johnniwinther): Fix inference for strong mode. List elements should not
+// TODO(johnniwinther): Fix inference for spec:nnbd-off mode. List elements should not
 // be [empty].
 
 /*member: myList:Container([null|exact=NativeFloat32List], element: [subclass=JSNumber], length: 42)*/
diff --git a/tests/compiler/dart2js/inference/data/map_tracer_const.dart b/tests/compiler/dart2js/inference/data/map_tracer_const.dart
index 3ff4fbb..4e4595d 100644
--- a/tests/compiler/dart2js/inference/data/map_tracer_const.dart
+++ b/tests/compiler/dart2js/inference/data/map_tracer_const.dart
@@ -7,8 +7,8 @@
 /*member: closure:[exact=JSUInt31]*/
 int closure(
     int
-        /*strong.Union([exact=JSDouble], [exact=JSUInt31])*/
-        /*omit.[exact=JSUInt31]*/
+        /*spec:nnbd-off|spec:nnbd-sdk.Union([exact=JSDouble], [exact=JSUInt31])*/
+        /*prod:nnbd-off|prod:nnbd-sdk.[exact=JSUInt31]*/
         x) {
   return x;
 }
diff --git a/tests/compiler/dart2js/inference/data/marker.options b/tests/compiler/dart2js/inference/data/marker.options
index ed13f42..46aaaf9 100644
--- a/tests/compiler/dart2js/inference/data/marker.options
+++ b/tests/compiler/dart2js/inference/data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/inference/inference_test_helper.dart
-omit=tests/compiler/dart2js/inference/inference_test_helper.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/inference/inference_test_helper.dart
+prod:nnbd-off=tests/compiler/dart2js/inference/inference_test_helper.dart
+spec:nnbd-sdk=tests/compiler/dart2js/inference/inference_test_helper.dart
+prod:nnbd-sdk=tests/compiler/dart2js/inference/inference_test_helper.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/inference/data/no_such_method.dart b/tests/compiler/dart2js/inference/data/no_such_method.dart
index daa1bdd..792f6eb 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method.dart
@@ -17,8 +17,8 @@
   /*member: Class1.noSuchMethod:[exact=JSUInt31]*/
   noSuchMethod(
           Invocation
-              /*strong.[null|subclass=Object]*/
-              /*omit.[null|exact=JSInvocationMirror]*/
+              /*spec:nnbd-off.[null|subclass=Object]*/
+              /*prod:nnbd-off.[null|exact=JSInvocationMirror]*/
               _) =>
       42;
 
@@ -41,8 +41,8 @@
   /*member: Class2.noSuchMethod:[exact=JSUInt31]*/
   noSuchMethod(
           Invocation
-              /*strong.[null|subclass=Object]*/
-              /*omit.[null|exact=JSInvocationMirror]*/
+              /*spec:nnbd-off.[null|subclass=Object]*/
+              /*prod:nnbd-off.[null|exact=JSInvocationMirror]*/
               _) =>
       42;
 
@@ -65,8 +65,8 @@
   /*member: Class3.noSuchMethod:[null|subclass=Object]*/
   noSuchMethod(
       Invocation
-          /*strong.[null|subclass=Object]*/
-          /*omit.[null|exact=JSInvocationMirror]*/
+          /*spec:nnbd-off.[null|subclass=Object]*/
+          /*prod:nnbd-off.[null|exact=JSInvocationMirror]*/
           invocation) {
     return invocation
         .
@@ -101,8 +101,8 @@
   /*member: Class4.noSuchMethod:[null]*/
   noSuchMethod(
       Invocation
-          /*strong.[null|subclass=Object]*/
-          /*omit.[null|exact=JSInvocationMirror]*/
+          /*spec:nnbd-off.[null|subclass=Object]*/
+          /*prod:nnbd-off.[null|exact=JSInvocationMirror]*/
           invocation) {
     this. /*update: [exact=Class4]*/ field = invocation
         .
diff --git a/tests/compiler/dart2js/inference/data/no_such_method1.dart b/tests/compiler/dart2js/inference/data/no_such_method1.dart
index f2bac32..2c7d7d3 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method1.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method1.dart
@@ -8,8 +8,8 @@
 class A {
   /*member: A.noSuchMethod:[exact=JSUInt31]*/
   noSuchMethod(
-          /*strong.[null|subclass=Object]*/
-          /*omit.[null|exact=JSInvocationMirror]*/
+          /*spec:nnbd-off.[null|subclass=Object]*/
+          /*prod:nnbd-off.[null|exact=JSInvocationMirror]*/
           im) =>
       42;
 }
diff --git a/tests/compiler/dart2js/inference/data/no_such_method2.dart b/tests/compiler/dart2js/inference/data/no_such_method2.dart
index 8f56a10..e50ec96 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method2.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method2.dart
@@ -8,8 +8,8 @@
 abstract class A {
   /*member: A.noSuchMethod:[exact=JSUInt31]*/
   noSuchMethod(
-          /*strong.[null|subclass=Object]*/
-          /*omit.[null|exact=JSInvocationMirror]*/
+          /*spec:nnbd-off.[null|subclass=Object]*/
+          /*prod:nnbd-off.[null|exact=JSInvocationMirror]*/
           im) =>
       42;
 }
@@ -33,8 +33,8 @@
 
   /*member: D.noSuchMethod:[exact=JSDouble]*/
   noSuchMethod(
-          /*omit.[null|exact=JSInvocationMirror]*/
-          /*strong.[null|subclass=Object]*/
+          /*prod:nnbd-off.[null|exact=JSInvocationMirror]*/
+          /*spec:nnbd-off.[null|subclass=Object]*/
           im) =>
       42.5;
 }
diff --git a/tests/compiler/dart2js/inference/data/no_such_method3.dart b/tests/compiler/dart2js/inference/data/no_such_method3.dart
index 06a8679..275d209 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method3.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method3.dart
@@ -10,8 +10,8 @@
   // throws an exception.
   /*member: A.noSuchMethod:[empty]*/
   noSuchMethod(
-          /*strong.[null|subclass=Object]*/
-          /*omit.[null|exact=JSInvocationMirror]*/
+          /*spec:nnbd-off.[null|subclass=Object]*/
+          /*prod:nnbd-off.[null|exact=JSInvocationMirror]*/
           im) =>
       throw 'foo';
 }
diff --git a/tests/compiler/dart2js/inference/data/parameters_trust.dart b/tests/compiler/dart2js/inference/data/parameters_trust.dart
index 3cdb9d4..ddf89ec 100644
--- a/tests/compiler/dart2js/inference/data/parameters_trust.dart
+++ b/tests/compiler/dart2js/inference/data/parameters_trust.dart
@@ -18,8 +18,8 @@
 /*member: _trustParameters:[exact=JSUInt31]*/
 _trustParameters(
     int
-        /*strong.Union([exact=JSString], [exact=JSUInt31])*/
-        /*omit.[exact=JSUInt31]*/
+        /*spec:nnbd-off.Union([exact=JSString], [exact=JSUInt31])*/
+        /*prod:nnbd-off.[exact=JSUInt31]*/
         i) {
   return i;
 }
diff --git a/tests/compiler/dart2js/inference/data/try_catch.dart b/tests/compiler/dart2js/inference/data/try_catch.dart
index 0a41400..0a3d09a 100644
--- a/tests/compiler/dart2js/inference/data/try_catch.dart
+++ b/tests/compiler/dart2js/inference/data/try_catch.dart
@@ -122,7 +122,7 @@
   return a;
 }
 
-/*member: returnInt6:[subclass=JSInt]*/
+/*spec:nnbd-off|prod:nnbd-off.member: returnInt6:[subclass=JSInt]*/
 returnInt6() {
   try {
     throw 42;
diff --git a/tests/compiler/dart2js/inference/inference_data/marker.options b/tests/compiler/dart2js/inference/inference_data/marker.options
index c90afd3..1ac262c 100644
--- a/tests/compiler/dart2js/inference/inference_data/marker.options
+++ b/tests/compiler/dart2js/inference/inference_data/marker.options
@@ -1 +1,2 @@
-strong=tests/compiler/dart2js/inference/inference_data_test.dart
+spec:nnbd-off=tests/compiler/dart2js/inference/inference_data_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/inference/inference_data_test.dart
diff --git a/tests/compiler/dart2js/inference/inference_data_test.dart b/tests/compiler/dart2js/inference/inference_data_test.dart
index 48392cd..1ad073f 100644
--- a/tests/compiler/dart2js/inference/inference_data_test.dart
+++ b/tests/compiler/dart2js/inference/inference_data_test.dart
@@ -25,7 +25,7 @@
         new Directory.fromUri(Platform.script.resolve('inference_data'));
     await checkTests(dataDir, const InferenceDataComputer(),
         args: args,
-        testedConfigs: [strongConfig],
+        testedConfigs: allSpecConfigs,
         options: [stopAfterTypeInference]);
   });
 }
diff --git a/tests/compiler/dart2js/inference/side_effects/marker.options b/tests/compiler/dart2js/inference/side_effects/marker.options
index 03ae8ce..18f405c 100644
--- a/tests/compiler/dart2js/inference/side_effects/marker.options
+++ b/tests/compiler/dart2js/inference/side_effects/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/inference/side_effects_test.dart
-omit=tests/compiler/dart2js/inference/side_effects_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/inference/side_effects_test.dart
+prod:nnbd-off=tests/compiler/dart2js/inference/side_effects_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/inference/side_effects_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/inference/side_effects_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/inlining/data/constructor.dart b/tests/compiler/dart2js/inlining/data/constructor.dart
index f9e0070..5e4b03e 100644
--- a/tests/compiler/dart2js/inlining/data/constructor.dart
+++ b/tests/compiler/dart2js/inlining/data/constructor.dart
@@ -51,7 +51,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class3<T> {
-  /*member: Class3.:[forceInlineGenericConstructor:Class3<int>]*/
+  /*spec:nnbd-off|prod:nnbd-off.member: Class3.:[forceInlineGenericConstructor:Class3<int>]*/
+  /*spec:nnbd-sdk|prod:nnbd-sdk.member: Class3.:[forceInlineGenericConstructor:Class3<int*>]*/
   @pragma('dart2js:tryInline')
   Class3();
 }
@@ -67,13 +68,15 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class4a<T> implements Class4b<T> {
-  /*member: Class4a.:[forceInlineGenericFactory:Class4a<int>]*/
+  /*spec:nnbd-off|prod:nnbd-off.member: Class4a.:[forceInlineGenericFactory:Class4a<int>]*/
+  /*spec:nnbd-sdk|prod:nnbd-sdk.member: Class4a.:[forceInlineGenericFactory:Class4a<int*>]*/
   @pragma('dart2js:tryInline')
   Class4a();
 }
 
 class Class4b<T> {
-  /*member: Class4b.:[forceInlineGenericFactory:Class4b<int>]*/
+  /*spec:nnbd-off|prod:nnbd-off.member: Class4b.:[forceInlineGenericFactory:Class4b<int>]*/
+  /*spec:nnbd-sdk|prod:nnbd-sdk.member: Class4b.:[forceInlineGenericFactory:Class4b<int*>]*/
   @pragma('dart2js:tryInline')
   factory Class4b() => new Class4a<T>();
 }
diff --git a/tests/compiler/dart2js/inlining/data/marker.options b/tests/compiler/dart2js/inlining/data/marker.options
index 4750f8f..2dc3010 100644
--- a/tests/compiler/dart2js/inlining/data/marker.options
+++ b/tests/compiler/dart2js/inlining/data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/inlining/inlining_test.dart
-omit=tests/compiler/dart2js/inlining/inlining_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/inlining/inlining_test.dart
+prod:nnbd-off=tests/compiler/dart2js/inlining/inlining_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/inlining/inlining_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/inlining/inlining_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/inlining/data/nested.dart b/tests/compiler/dart2js/inlining/data/nested.dart
index e735510..f1239aa 100644
--- a/tests/compiler/dart2js/inlining/data/nested.dart
+++ b/tests/compiler/dart2js/inlining/data/nested.dart
@@ -15,7 +15,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class1<T> {
-  /*member: Class1.:[nestedGenericInlining:Class1<int>]*/
+  /*spec:nnbd-off|prod:nnbd-off.member: Class1.:[nestedGenericInlining:Class1<int>]*/
+  /*spec:nnbd-sdk|prod:nnbd-sdk.member: Class1.:[nestedGenericInlining:Class1<int*>]*/
   @pragma('dart2js:tryInline')
   Class1();
 
@@ -29,7 +30,8 @@
 class Class2<T> {
   // TODO(johnniwinther): Should the type have been Class<List<int>>?
   // Similarly below.
-  /*member: Class2.:[nestedGenericInlining:Class2<List<Class1.T>>]*/
+  /*spec:nnbd-off|prod:nnbd-off.member: Class2.:[nestedGenericInlining:Class2<List<Class1.T>>]*/
+  /*spec:nnbd-sdk|prod:nnbd-sdk.member: Class2.:[nestedGenericInlining:Class2<List<Class1.T*>*>]*/
   @pragma('dart2js:tryInline')
   Class2();
 
@@ -49,7 +51,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class3a<T> implements Class3b<T> {
-  /*member: Class3a.:[nestedGenericFactoryInlining:Class3a<int>]*/
+  /*spec:nnbd-off|prod:nnbd-off.member: Class3a.:[nestedGenericFactoryInlining:Class3a<int>]*/
+  /*spec:nnbd-sdk|prod:nnbd-sdk.member: Class3a.:[nestedGenericFactoryInlining:Class3a<int*>]*/
   @pragma('dart2js:tryInline')
   Class3a();
 
@@ -61,7 +64,8 @@
 }
 
 abstract class Class3b<T> {
-  /*member: Class3b.:[nestedGenericFactoryInlining:Class3b<int>]*/
+  /*spec:nnbd-off|prod:nnbd-off.member: Class3b.:[nestedGenericFactoryInlining:Class3b<int>]*/
+  /*spec:nnbd-sdk|prod:nnbd-sdk.member: Class3b.:[nestedGenericFactoryInlining:Class3b<int*>]*/
   @pragma('dart2js:tryInline')
   factory Class3b() => new Class3a<T>();
 
@@ -69,7 +73,8 @@
 }
 
 class Class4a<T> implements Class4b<T> {
-  /*member: Class4a.:[nestedGenericFactoryInlining:Class4a<Class4b.T>]*/
+  /*spec:nnbd-off|prod:nnbd-off.member: Class4a.:[nestedGenericFactoryInlining:Class4a<Class4b.T>]*/
+  /*spec:nnbd-sdk|prod:nnbd-sdk.member: Class4a.:[nestedGenericFactoryInlining:Class4a<Class4b.T*>]*/
   @pragma('dart2js:tryInline')
   Class4a();
 
@@ -79,7 +84,8 @@
 }
 
 abstract class Class4b<T> {
-  /*member: Class4b.:[nestedGenericFactoryInlining:Class4b<List<Class3a.T>>]*/
+  /*spec:nnbd-off|prod:nnbd-off.member: Class4b.:[nestedGenericFactoryInlining:Class4b<List<Class3a.T>>]*/
+  /*spec:nnbd-sdk|prod:nnbd-sdk.member: Class4b.:[nestedGenericFactoryInlining:Class4b<List<Class3a.T*>*>]*/
   @pragma('dart2js:tryInline')
   factory Class4b() => new Class4a<T>();
 
diff --git a/tests/compiler/dart2js/inlining/data/type_variables.dart b/tests/compiler/dart2js/inlining/data/type_variables.dart
index 14a1ce3..40fb3b1 100644
--- a/tests/compiler/dart2js/inlining/data/type_variables.dart
+++ b/tests/compiler/dart2js/inlining/data/type_variables.dart
@@ -9,12 +9,14 @@
   inlineTypeTests();
 }
 
-/*member: Mixin1.:[inlineTypeTests:Mixin1<int>]*/
+/*spec:nnbd-off|prod:nnbd-off.member: Mixin1.:[inlineTypeTests:Mixin1<int>]*/
+/*spec:nnbd-sdk|prod:nnbd-sdk.member: Mixin1.:[inlineTypeTests:Mixin1<int*>]*/
 class Mixin1<S> {
   var field = /*[]*/ (S s) => null;
 }
 
-/*member: Class1.:[inlineTypeTests:Class1<int>]*/
+/*spec:nnbd-off|prod:nnbd-off.member: Class1.:[inlineTypeTests:Class1<int>]*/
+/*spec:nnbd-sdk|prod:nnbd-sdk.member: Class1.:[inlineTypeTests:Class1<int*>]*/
 class Class1<T> extends Object with Mixin1<T> {}
 
 /*member: _inlineTypeTests:[inlineTypeTests]*/
diff --git a/tests/compiler/dart2js/jumps/data/marker.options b/tests/compiler/dart2js/jumps/data/marker.options
index 37aec9d..6c8f0b4 100644
--- a/tests/compiler/dart2js/jumps/data/marker.options
+++ b/tests/compiler/dart2js/jumps/data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/jumps/jump_test.dart
-omit=tests/compiler/dart2js/jumps/jump_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/jumps/jump_test.dart
+prod:nnbd-off=tests/compiler/dart2js/jumps/jump_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/jumps/jump_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/jumps/jump_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/member_usage/data/marker.options b/tests/compiler/dart2js/member_usage/data/marker.options
index 91b789d..31de344 100644
--- a/tests/compiler/dart2js/member_usage/data/marker.options
+++ b/tests/compiler/dart2js/member_usage/data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/member_usage/member_usage_test.dart
-omit=tests/compiler/dart2js/member_usage/member_usage_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/member_usage/member_usage_test.dart
+prod:nnbd-off=tests/compiler/dart2js/member_usage/member_usage_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/member_usage/member_usage_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/member_usage/member_usage_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/member_usage/member_usage_test.dart b/tests/compiler/dart2js/member_usage/member_usage_test.dart
index 834cd14..ff367d6 100644
--- a/tests/compiler/dart2js/member_usage/member_usage_test.dart
+++ b/tests/compiler/dart2js/member_usage/member_usage_test.dart
@@ -25,12 +25,12 @@
     print(' Test with enqueuer checks');
     print('------------------------------------------------------------------');
     await checkTests(dataDir, const ClosedWorldDataComputer(false),
-        args: args, testedConfigs: allStrongConfigs);
+        args: args, testedConfigs: allSpecConfigs);
     print('------------------------------------------------------------------');
     print(' Test without enqueuer checks');
     print('------------------------------------------------------------------');
     await checkTests(dataDir, const ClosedWorldDataComputer(true),
-        args: args, testedConfigs: allStrongConfigs);
+        args: args, testedConfigs: allSpecConfigs);
   });
 }
 
diff --git a/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart b/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart
index 865a2d0..4db1df3 100644
--- a/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart
+++ b/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart
@@ -54,8 +54,8 @@
   }
 }
 
-/*strong.member: main:*/
-/*omit.member: main:FieldSet=[name=AppView.ctx,name=AppView.ctx]*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off|prod:nnbd-sdk.member: main:FieldSet=[name=AppView.ctx,name=AppView.ctx]*/
 main() {
   var c1 = new ViewCardComponent();
   c1.ctx = new CardComponent();
diff --git a/tests/compiler/dart2js/optimization/data/index.dart b/tests/compiler/dart2js/optimization/data/index.dart
index 7b95043..8047545 100644
--- a/tests/compiler/dart2js/optimization/data/index.dart
+++ b/tests/compiler/dart2js/optimization/data/index.dart
@@ -39,8 +39,8 @@
   return list[index]; // CFE inserts an implicit cast of the index.
 }
 
-/*strong.member: mutableDynamicListDynamicIndex:Specializer=[!Index]*/
-/*omit.member: mutableDynamicListDynamicIndex:Specializer=[Index]*/
+/*spec:nnbd-off.member: mutableDynamicListDynamicIndex:Specializer=[!Index]*/
+/*prod:nnbd-off|prod:nnbd-sdk.member: mutableDynamicListDynamicIndex:Specializer=[Index]*/
 @pragma('dart2js:noInline')
 @pragma('dart2js:disableFinal')
 mutableDynamicListDynamicIndex(dynamic index) {
diff --git a/tests/compiler/dart2js/optimization/data/index_assign.dart b/tests/compiler/dart2js/optimization/data/index_assign.dart
index 45a88e4..67d5523 100644
--- a/tests/compiler/dart2js/optimization/data/index_assign.dart
+++ b/tests/compiler/dart2js/optimization/data/index_assign.dart
@@ -10,39 +10,39 @@
   list[0] = 1;
 }
 
-/*strong.member: unknownListIndexAssign:Specializer=[!IndexAssign]*/
-/*omit.member: unknownListIndexAssign:Specializer=[IndexAssign]*/
+/*spec:nnbd-off.member: unknownListIndexAssign:Specializer=[!IndexAssign]*/
+/*prod:nnbd-off|prod:nnbd-sdk.member: unknownListIndexAssign:Specializer=[IndexAssign]*/
 @pragma('dart2js:noInline')
 unknownListIndexAssign(List list) {
   list[0] = 1;
 }
 
-/*strong.member: possiblyNullMutableListIndexAssign:Specializer=[!IndexAssign]*/
-/*omit.member: possiblyNullMutableListIndexAssign:Specializer=[IndexAssign]*/
+/*spec:nnbd-off.member: possiblyNullMutableListIndexAssign:Specializer=[!IndexAssign]*/
+/*prod:nnbd-off|prod:nnbd-sdk.member: possiblyNullMutableListIndexAssign:Specializer=[IndexAssign]*/
 @pragma('dart2js:noInline')
 possiblyNullMutableListIndexAssign(bool b) {
   var list = b ? [0] : null;
   list[0] = 1;
 }
 
-/*strong.member: mutableListIndexAssign:Specializer=[!IndexAssign]*/
-/*omit.member: mutableListIndexAssign:Specializer=[IndexAssign]*/
+/*spec:nnbd-off.member: mutableListIndexAssign:Specializer=[!IndexAssign]*/
+/*prod:nnbd-off|prod:nnbd-sdk.member: mutableListIndexAssign:Specializer=[IndexAssign]*/
 @pragma('dart2js:noInline')
 mutableListIndexAssign() {
   var list = [0];
   list[0] = 1;
 }
 
-/*strong.member: mutableListDynamicIndexAssign:Specializer=[!IndexAssign]*/
-/*omit.member: mutableListDynamicIndexAssign:Specializer=[IndexAssign]*/
+/*spec:nnbd-off.member: mutableListDynamicIndexAssign:Specializer=[!IndexAssign]*/
+/*prod:nnbd-off|prod:nnbd-sdk.member: mutableListDynamicIndexAssign:Specializer=[IndexAssign]*/
 @pragma('dart2js:noInline')
 mutableListDynamicIndexAssign(dynamic index) {
   var list = [0];
   list[index] = 1;
 }
 
-/*strong.member: mutableListDynamicValueIndexAssign:Specializer=[!IndexAssign]*/
-/*omit.member: mutableListDynamicValueIndexAssign:Specializer=[IndexAssign]*/
+/*spec:nnbd-off.member: mutableListDynamicValueIndexAssign:Specializer=[!IndexAssign]*/
+/*prod:nnbd-off|prod:nnbd-sdk.member: mutableListDynamicValueIndexAssign:Specializer=[IndexAssign]*/
 @pragma('dart2js:noInline')
 mutableListDynamicValueIndexAssign(dynamic value) {
   var list = [0];
diff --git a/tests/compiler/dart2js/optimization/data/marker.options b/tests/compiler/dart2js/optimization/data/marker.options
index 3b03def..2c09b09 100644
--- a/tests/compiler/dart2js/optimization/data/marker.options
+++ b/tests/compiler/dart2js/optimization/data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/optimization/optimization_test.dart
-omit=tests/compiler/dart2js/optimization/optimization_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/optimization/optimization_test.dart
+prod:nnbd-off=tests/compiler/dart2js/optimization/optimization_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/optimization/optimization_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/optimization/optimization_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/rti/data/async_foreach.dart b/tests/compiler/dart2js/rti/data/async_foreach.dart
index 22efbe0..16b3479 100644
--- a/tests/compiler/dart2js/rti/data/async_foreach.dart
+++ b/tests/compiler/dart2js/rti/data/async_foreach.dart
@@ -4,8 +4,8 @@
 
 // @dart = 2.7
 
-/*strong.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
-/*omit.class: Class:needsArgs*/
+/*spec:nnbd-off.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
+/*prod:nnbd-off.class: Class:needsArgs*/
 class Class<T> {
   method() {
     var list = <T>[];
@@ -16,8 +16,8 @@
     // This happens because the closure is thought as possibly going to the
     // async.errorHandler callback.
     list.forEach(
-        /*strong.needsSignature*/
-        /*omit.needsSignature*/
+        /*spec:nnbd-off.needsSignature*/
+        /*prod:nnbd-off.needsSignature*/
         (x) => print(x));
   }
 }
diff --git a/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart b/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
index 7c27624..208a51d 100644
--- a/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
+++ b/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
@@ -4,16 +4,16 @@
 
 // @dart = 2.7
 
-/*strong.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
-/*omit.class: Class:*/
+/*spec:nnbd-off.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
+/*prod:nnbd-off.class: Class:*/
 class Class<T> {
   method() {
     var list = <T>[];
     // If any method was `async`, this would have triggered the need for type
     // arguments on `Class`. See the 'async_foreach.dart' test.
     list.forEach(
-        /*strong.needsSignature*/
-        /*omit.*/
+        /*spec:nnbd-off.needsSignature*/
+        /*prod:nnbd-off.*/
         (x) => print(x));
   }
 }
diff --git a/tests/compiler/dart2js/rti/data/async_local.dart b/tests/compiler/dart2js/rti/data/async_local.dart
index 14bd0d2..a402273 100644
--- a/tests/compiler/dart2js/rti/data/async_local.dart
+++ b/tests/compiler/dart2js/rti/data/async_local.dart
@@ -12,8 +12,8 @@
   // This happens because the closure is thought as possibly going to the
   // async.errorHandler callback.
 
-  /*strong.needsSignature*/
-  /*omit.needsSignature*/
+  /*spec:nnbd-off.needsSignature*/
+  /*prod:nnbd-off.needsSignature*/
   local(object, stacktrace) => null;
 
   return local;
diff --git a/tests/compiler/dart2js/rti/data/async_local_nonasync.dart b/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
index e07c33e7..350559d 100644
--- a/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
+++ b/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
@@ -8,8 +8,8 @@
   // If any method was `async`, this would have triggered the need for the
   // signature on this closure. See the 'async_local.dart' test.
 
-  /*strong.*/
-  /*omit.*/
+  /*spec:nnbd-off.*/
+  /*prod:nnbd-off.*/
   local(object, stacktrace) => null;
 
   return local;
diff --git a/tests/compiler/dart2js/rti/data/async_local_typed.dart b/tests/compiler/dart2js/rti/data/async_local_typed.dart
index 5154e91..3ef5a62 100644
--- a/tests/compiler/dart2js/rti/data/async_local_typed.dart
+++ b/tests/compiler/dart2js/rti/data/async_local_typed.dart
@@ -4,8 +4,8 @@
 
 // @dart = 2.7
 
-/*strong.class: Class:explicit=[Class<int>],needsArgs*/
-/*omit.class: Class:*/
+/*spec:nnbd-off.class: Class:explicit=[Class<int>],needsArgs*/
+/*prod:nnbd-off.class: Class:*/
 class Class<T> {}
 
 main() async {
@@ -14,8 +14,8 @@
   // `dynamic Function(dynamic, Class<int>)`, is not a potential subtype and
   // therefore doesn't need its signature.
 
-  /*strong.needsSignature*/
-  /*omit.*/
+  /*spec:nnbd-off.needsSignature*/
+  /*prod:nnbd-off.*/
   local(object, Class<int> stacktrace) => null;
 
   return local;
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic.dart b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
index 3cf8ad8..2dbf94e 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
@@ -6,11 +6,11 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: A:direct,explicit=[A.T],needsArgs*/
-/*omit.class: A:*/
+/*spec:nnbd-off.class: A:direct,explicit=[A.T],needsArgs*/
+/*prod:nnbd-off.class: A:*/
 class A<T> {
-  /*strong.member: A.call:*/
-  /*omit.member: A.call:*/
+  /*spec:nnbd-off.member: A.call:*/
+  /*prod:nnbd-off.member: A.call:*/
   call(T t) {}
 }
 
diff --git a/tests/compiler/dart2js/rti/data/closure.dart b/tests/compiler/dart2js/rti/data/closure.dart
index 4804c14..ab166f5 100644
--- a/tests/compiler/dart2js/rti/data/closure.dart
+++ b/tests/compiler/dart2js/rti/data/closure.dart
@@ -4,8 +4,8 @@
 
 // @dart = 2.7
 
-/*omit.class: A:needsArgs*/
-/*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*prod:nnbd-off.class: A:needsArgs*/
+/*spec:nnbd-off.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   m() {
     return /*needsSignature*/ (T t) {};
@@ -16,8 +16,8 @@
     // TODO(johnniwinther): Optimize local function type signature need.
     return
 
-        /*strong.needsSignature*/
-        /*omit.needsSignature*/
+        /*spec:nnbd-off.needsSignature*/
+        /*prod:nnbd-off.needsSignature*/
         (int t) {};
   }
 }
diff --git a/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
index 6fd577d..229f8f7 100644
--- a/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
@@ -4,8 +4,8 @@
 
 // @dart = 2.7
 
-/*omit.class: A:*/
-/*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*prod:nnbd-off.class: A:*/
+/*spec:nnbd-off.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   @pragma('dart2js:noInline')
   m() {
diff --git a/tests/compiler/dart2js/rti/data/closure_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
index 6fd577d..229f8f7 100644
--- a/tests/compiler/dart2js/rti/data/closure_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
@@ -4,8 +4,8 @@
 
 // @dart = 2.7
 
-/*omit.class: A:*/
-/*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*prod:nnbd-off.class: A:*/
+/*spec:nnbd-off.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   @pragma('dart2js:noInline')
   m() {
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is2.dart b/tests/compiler/dart2js/rti/data/dynamic_is2.dart
index 09f291b..5018f3a 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is2.dart
@@ -4,8 +4,8 @@
 
 // @dart = 2.7
 
-/*omit.class: A:*/
-/*strong.class: A:explicit=[A]*/
+/*prod:nnbd-off.class: A:*/
+/*spec:nnbd-off.class: A:explicit=[A]*/
 class A {
   /*member: A.instanceMethod:deps=[B.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_not2.dart b/tests/compiler/dart2js/rti/data/dynamic_not2.dart
index c8f9f6e..83b7dda 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not2.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*strong.class: A:explicit=[A]*/
+/*spec:nnbd-off.class: A:explicit=[A]*/
 class A {
   /*member: A.instanceMethod:deps=[B.instanceMethod]*/
   instanceMethod<T>(t) => t;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
index 74625dd..666f0f9 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
@@ -4,8 +4,8 @@
 
 // @dart = 2.7
 
-/*omit.class: A:*/
-/*strong.class: A:explicit=[A]*/
+/*prod:nnbd-off.class: A:*/
+/*spec:nnbd-off.class: A:explicit=[A]*/
 class A {
   /*member: A.instanceMethod:deps=[staticMethod],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_type_literal2.dart b/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
index 7bf6ce1..8812e53 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*strong.class: A:explicit=[A]*/
+/*spec:nnbd-off.class: A:explicit=[A]*/
 class A {
   /*member: A.instanceMethod:deps=[B.instanceMethod],exp,needsArgs,selectors=[Selector(call, instanceMethod, arity=0, types=1)]*/
   instanceMethod<T>() => T;
diff --git a/tests/compiler/dart2js/rti/data/explicit_as.dart b/tests/compiler/dart2js/rti/data/explicit_as.dart
index 8bb7f30..439b1a3 100644
--- a/tests/compiler/dart2js/rti/data/explicit_as.dart
+++ b/tests/compiler/dart2js/rti/data/explicit_as.dart
@@ -4,8 +4,8 @@
 
 // @dart = 2.7
 
-/*strong.class: C:direct,explicit=[C.T,C<String>],needsArgs*/
-/*omit.class: C:*/
+/*spec:nnbd-off.class: C:direct,explicit=[C.T,C<String>],needsArgs*/
+/*prod:nnbd-off.class: C:*/
 class C<T> {
   T field;
 }
diff --git a/tests/compiler/dart2js/rti/data/function_subtype_local5.dart b/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
index 8d429b8..e45aa6c 100644
--- a/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
+++ b/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
@@ -21,12 +21,12 @@
   void test(String nameOfT, bool expectedResult) {
     // TODO(johnniwinther): Optimize local function type signature need.
 
-    /*strong.needsSignature*/
-    /*omit.needsSignature*/
+    /*spec:nnbd-off.needsSignature*/
+    /*prod:nnbd-off.needsSignature*/
     int foo(bool a, [String b]) => null;
 
-    /*strong.needsSignature*/
-    /*omit.needsSignature*/
+    /*spec:nnbd-off.needsSignature*/
+    /*prod:nnbd-off.needsSignature*/
     int baz(bool a, {String b}) => null;
 
     Expect.equals(expectedResult, foo is Foo<T>, 'foo is Foo<$nameOfT>');
diff --git a/tests/compiler/dart2js/rti/data/generic_bounds.dart b/tests/compiler/dart2js/rti/data/generic_bounds.dart
index dcfdfbc..d87e5fd 100644
--- a/tests/compiler/dart2js/rti/data/generic_bounds.dart
+++ b/tests/compiler/dart2js/rti/data/generic_bounds.dart
@@ -6,46 +6,46 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: Class1a:explicit=[Class1a]*/
+/*spec:nnbd-off.class: Class1a:explicit=[Class1a]*/
 class Class1a {}
 
 class Class1b extends Class1a {}
 
-/*strong.class: Class2a:explicit=[Class2a<num>],needsArgs*/
+/*spec:nnbd-off.class: Class2a:explicit=[Class2a<num>],needsArgs*/
 class Class2a<T> {}
 
 class Class2b<T> extends Class2a<T> {}
 
-/*strong.member: method1:needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
+/*spec:nnbd-off.member: method1:needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
 method1<T extends Class1a>() => null;
 
-/*strong.member: method2:needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
+/*spec:nnbd-off.member: method2:needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
 method2<T extends Class2a<num>>() => null;
 
 method3<T>() => null;
 
 class Class3 {
-  /*strong.member: Class3.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*spec:nnbd-off.member: Class3.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
   method4<T extends Class1a>() => null;
 
-  /*strong.member: Class3.method5:needsArgs,selectors=[Selector(call, method5, arity=0, types=1)]*/
+  /*spec:nnbd-off.member: Class3.method5:needsArgs,selectors=[Selector(call, method5, arity=0, types=1)]*/
   method5<T extends Class2a<num>>() => null;
 
   method6<T>() => null;
 }
 
-/*strong.class: Class4:explicit=[Class4]*/
+/*spec:nnbd-off.class: Class4:explicit=[Class4]*/
 class Class4 {}
 
-/*strong.member: method10:needsArgs*/
+/*spec:nnbd-off.member: method10:needsArgs*/
 method10<T extends Class4>() => null;
 
 main() {
-  /*strong.needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
-  /*omit.*/method7<T extends Class1a>() => null;
+  /*spec:nnbd-off.needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
+  /*prod:nnbd-off.*/method7<T extends Class1a>() => null;
 
-  /*strong.needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
-  /*omit.*/method8<T extends Class2a<num>>() => null;
+  /*spec:nnbd-off.needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
+  /*prod:nnbd-off.*/method8<T extends Class2a<num>>() => null;
 
   /**/
   method9<T>() => null;
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is2.dart b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
index 1f60af6..4801a9b 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
@@ -9,8 +9,8 @@
 /*class: A:implicit=[List<A<C2>>,List<A<C>>]*/
 class A<T> {}
 
-/*omit.class: A1:*/
-/*strong.class: A1:implicit=[A1]*/
+/*prod:nnbd-off.class: A1:*/
+/*spec:nnbd-off.class: A1:implicit=[A1]*/
 class A1 implements A<C1> {}
 
 /*class: B:direct,explicit=[B.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_creation.dart b/tests/compiler/dart2js/rti/data/generic_creation.dart
index d0a90fa..a2b5519 100644
--- a/tests/compiler/dart2js/rti/data/generic_creation.dart
+++ b/tests/compiler/dart2js/rti/data/generic_creation.dart
@@ -8,44 +8,44 @@
 
 /*class: A:needsArgs*/
 
-/*strong.member: A.:*/
-/*omit.member: A.:*/
+/*spec:nnbd-off.member: A.:*/
+/*prod:nnbd-off.member: A.:*/
 class A<X, Y, Z> {
-  /*strong.member: A.shift:*/
-  /*omit.member: A.shift:*/
+  /*spec:nnbd-off.member: A.shift:*/
+  /*prod:nnbd-off.member: A.shift:*/
   shift() => new A<Z, X, Y>();
 
-  /*strong.member: A.swap:*/
-  /*omit.member: A.swap:*/
+  /*spec:nnbd-off.member: A.swap:*/
+  /*prod:nnbd-off.member: A.swap:*/
   swap() => new A<Z, Y, X>();
 
-  /*strong.member: A.first:*/
-  /*omit.member: A.first:*/
+  /*spec:nnbd-off.member: A.first:*/
+  /*prod:nnbd-off.member: A.first:*/
   first() => new A<X, X, X>();
 
-  /*strong.member: A.last:*/
-  /*omit.member: A.last:*/
+  /*spec:nnbd-off.member: A.last:*/
+  /*prod:nnbd-off.member: A.last:*/
   last() => new A<Z, Z, Z>();
 
-  /*strong.member: A.wrap:*/
-  /*omit.member: A.wrap:*/
+  /*spec:nnbd-off.member: A.wrap:*/
+  /*prod:nnbd-off.member: A.wrap:*/
   wrap() => new A<A<X, X, X>, A<Y, Y, Y>, A<Z, Z, Z>>();
 }
 
-/*strong.member: B.:*/
-/*omit.member: B.:*/
+/*spec:nnbd-off.member: B.:*/
+/*prod:nnbd-off.member: B.:*/
 class B extends A<U, V, W> {}
 
 /*class: C:needsArgs*/
 
-/*strong.member: C.:*/
-/*omit.member: C.:*/
+/*spec:nnbd-off.member: C.:*/
+/*prod:nnbd-off.member: C.:*/
 class C<T> extends A<U, T, W> {}
 
 /*class: D:needsArgs*/
 
-/*strong.member: D.:*/
-/*omit.member: D.:*/
+/*spec:nnbd-off.member: D.:*/
+/*prod:nnbd-off.member: D.:*/
 class D<X, Y, Z> extends A<Y, Z, X> {}
 
 class U {}
@@ -54,12 +54,12 @@
 
 class W {}
 
-/*strong.member: sameType:*/
-/*omit.member: sameType:*/
+/*spec:nnbd-off.member: sameType:*/
+/*prod:nnbd-off.member: sameType:*/
 sameType(a, b) => Expect.equals(a.runtimeType, b.runtimeType);
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   A a = new A<U, V, W>();
   sameType(new A<W, U, V>(), a.shift());
diff --git a/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
index 3599e85..1b5c9bf 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
@@ -10,8 +10,8 @@
 /*class: B:deps=[method],explicit=[B<A>],needsArgs*/
 class B<T> {}
 
-/*strong.member: method:needsArgs*/
-/*omit.member: method:needsArgs*/
+/*spec:nnbd-off.member: method:needsArgs*/
+/*prod:nnbd-off.member: method:needsArgs*/
 method<T>() => new B<T>();
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is.dart b/tests/compiler/dart2js/rti/data/generic_method_is.dart
index 8f24a5d..53bf8c4 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_is.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_is.dart
@@ -4,8 +4,8 @@
 
 // @dart = 2.7
 
-/*strong.member: method:direct,explicit=[method.T],needsArgs*/
-/*omit.member: method:direct,explicit=[method.T],needsArgs*/
+/*spec:nnbd-off.member: method:direct,explicit=[method.T],needsArgs*/
+/*prod:nnbd-off.member: method:direct,explicit=[method.T],needsArgs*/
 method<T>(T t) => t is T;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is2.dart b/tests/compiler/dart2js/rti/data/generic_method_is2.dart
index de364f3..590ae1b 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_is2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_is2.dart
@@ -7,19 +7,19 @@
 /*class: A1:implicit=[A1]*/
 class A1 {}
 
-/*strong.class: A2:implicit=[A2]*/
+/*spec:nnbd-off.class: A2:implicit=[A2]*/
 class A2 {}
 
 /*class: B1:implicit=[B1]*/
 class B1 {}
 
-/*strong.class: B2:implicit=[B2]*/
+/*spec:nnbd-off.class: B2:implicit=[B2]*/
 class B2 {}
 
 /*class: C1:implicit=[C1]*/
 class C1 {}
 
-/*strong.class: C2:implicit=[C2]*/
+/*spec:nnbd-off.class: C2:implicit=[C2]*/
 class C2 {}
 
 /*class: C3:implicit=[C3]*/
@@ -28,19 +28,19 @@
 /*class: D1:implicit=[D1]*/
 class D1 {}
 
-/*strong.class: D2:implicit=[D2]*/
+/*spec:nnbd-off.class: D2:implicit=[D2]*/
 class D2 {}
 
 /*class: E1:implicit=[E1]*/
 class E1 {}
 
-/*strong.class: E2:implicit=[E2]*/
+/*spec:nnbd-off.class: E2:implicit=[E2]*/
 class E2 {}
 
 /*class: F1:implicit=[F1]*/
 class F1 {}
 
-/*strong.class: F2:implicit=[F2]*/
+/*spec:nnbd-off.class: F2:implicit=[F2]*/
 class F2 {}
 
 /*class: F3:implicit=[F3]*/
@@ -50,7 +50,7 @@
 // Calls to this imply a check of the passed type arguments.
 bool topLevelMethod1<T>(T t, {a1}) => t is T;
 
-/*strong.member: topLevelMethod2:direct,explicit=[topLevelMethod2.T],needsArgs,selectors=[Selector(call, call, arity=2, named=[a2], types=1)]*/
+/*spec:nnbd-off.member: topLevelMethod2:direct,explicit=[topLevelMethod2.T],needsArgs,selectors=[Selector(call, call, arity=2, named=[a2], types=1)]*/
 // Calls to this does _not_ imply a check of the passed type arguments.
 T topLevelMethod2<T>(T t, {a2}) => t;
 
@@ -59,7 +59,7 @@
   // Calls to this imply a check of the passed type arguments.
   bool instanceMethod1<S>(S s, {b1}) => s is S;
 
-  /*strong.member: Class.instanceMethod2:direct,explicit=[instanceMethod2.S],needsArgs,selectors=[Selector(call, call, arity=2, named=[b2], types=1),Selector(call, instanceMethod2, arity=2, named=[b2], types=1)]*/
+  /*spec:nnbd-off.member: Class.instanceMethod2:direct,explicit=[instanceMethod2.S],needsArgs,selectors=[Selector(call, call, arity=2, named=[b2], types=1),Selector(call, instanceMethod2, arity=2, named=[b2], types=1)]*/
   // Calls to this does _not_ imply a check of the passed type arguments.
   S instanceMethod2<S>(S s, {b2}) => s;
 }
@@ -70,13 +70,13 @@
   bool localFunction1<U>(U u, {c1}) => u is U;
 
   // Calls to this does _not_ imply a check of the passed type arguments.
-  /*strong.direct,explicit=[localFunction2.U],needsArgs,selectors=[Selector(call, call, arity=2, named=[c2], types=1)]*/
+  /*spec:nnbd-off.direct,explicit=[localFunction2.U],needsArgs,selectors=[Selector(call, call, arity=2, named=[c2], types=1)]*/
   U localFunction2<U>(U u, {c2}) => u;
 
   // Calls to this does _not_ imply a check of the passed type arguments. A
   // call to the .call function on this will, though, since it has the same
   // signature as [localFunction1] which needs its type arguments.
-  /*strong.direct,explicit=[localFunction3.U],needsArgs,selectors=[Selector(call, call, arity=2, named=[c1], types=1)]*/
+  /*spec:nnbd-off.direct,explicit=[localFunction3.U],needsArgs,selectors=[Selector(call, call, arity=2, named=[c1], types=1)]*/
   localFunction3<U>(U u, {c1}) => u;
 
   var c = new Class();
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 13c5edd..f32f4e6 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart
@@ -6,22 +6,22 @@
 
 // Test derived from language_2/generic_methods_dynamic_test/05
 
-/*omit.class: global#JSArray:deps=[List],explicit=[JSArray],needsArgs*/
-/*strong.class: global#JSArray:deps=[ArrayIterator,List],direct,explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs*/
-/*strong.class: global#List:deps=[C.bar],explicit=[List,List<B>,List<String>],indirect,needsArgs*/
+/*prod:nnbd-off.class: global#JSArray:deps=[List],explicit=[JSArray],needsArgs*/
+/*spec:nnbd-off.class: global#JSArray:deps=[ArrayIterator,List],direct,explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs*/
+/*spec:nnbd-off.class: global#List:deps=[C.bar],explicit=[List,List<B>,List<String>],indirect,needsArgs*/
 
-/*omit.class: global#List:deps=[C.bar],explicit=[List,List<B>],needsArgs*/
+/*prod:nnbd-off.class: global#List:deps=[C.bar],explicit=[List,List<B>],needsArgs*/
 import "package:expect/expect.dart";
 
 class A {}
 
-/*strong.class: B:explicit=[List<B>],implicit=[B]*/
-/*omit.class: B:explicit=[List<B>]*/
+/*spec:nnbd-off.class: B:explicit=[List<B>],implicit=[B]*/
+/*prod:nnbd-off.class: B:explicit=[List<B>]*/
 class B {}
 
 class C {
-  /*strong.member: C.bar:direct,explicit=[Iterable<bar.T>],implicit=[bar.T],needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
-  /*omit.member: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*spec:nnbd-off.member: C.bar:direct,explicit=[Iterable<bar.T>],implicit=[bar.T],needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*prod:nnbd-off.member: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
   List<T> bar<T>(Iterable<T> t) => <T>[t.first];
 }
 
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 e0575e5..b780758 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart
@@ -8,21 +8,21 @@
 
 import "package:expect/expect.dart";
 
-/*omit.class: A:deps=[C.bar],explicit=[A<B>],needsArgs*/
-/*strong.class: A:deps=[C.bar],direct,explicit=[A.T,A<B>,A<bar.T>],needsArgs*/
+/*prod:nnbd-off.class: A:deps=[C.bar],explicit=[A<B>],needsArgs*/
+/*spec:nnbd-off.class: A:deps=[C.bar],direct,explicit=[A.T,A<B>,A<bar.T>],needsArgs*/
 class A<T> {
   final T field;
 
   A(this.field);
 }
 
-/*omit.class: B:explicit=[A<B>]*/
-/*strong.class: B:explicit=[A<B>],implicit=[B]*/
+/*prod:nnbd-off.class: B:explicit=[A<B>]*/
+/*spec:nnbd-off.class: B:explicit=[A<B>],implicit=[B]*/
 class B {}
 
 class C {
-  /*omit.member: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
-  /*strong.member: C.bar:explicit=[A<bar.T>],implicit=[bar.T],indirect,needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*prod:nnbd-off.member: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*spec:nnbd-off.member: C.bar:explicit=[A<bar.T>],implicit=[bar.T],indirect,needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
   A<T> bar<T>(A<T> t) => new A<T>(t.field);
 }
 
diff --git a/tests/compiler/dart2js/rti/data/implicit_as.dart b/tests/compiler/dart2js/rti/data/implicit_as.dart
index 6c76287..95770b8 100644
--- a/tests/compiler/dart2js/rti/data/implicit_as.dart
+++ b/tests/compiler/dart2js/rti/data/implicit_as.dart
@@ -4,8 +4,8 @@
 
 // @dart = 2.7
 
-/*strong.class: C:direct,explicit=[C.T,C<String>],needsArgs*/
-/*omit.class: C:*/
+/*spec:nnbd-off.class: C:direct,explicit=[C.T,C<String>],needsArgs*/
+/*prod:nnbd-off.class: C:*/
 class C<T> {
   T field;
 }
diff --git a/tests/compiler/dart2js/rti/data/indirect_through_static.dart b/tests/compiler/dart2js/rti/data/indirect_through_static.dart
index f1cc990..3dd9a7c 100644
--- a/tests/compiler/dart2js/rti/data/indirect_through_static.dart
+++ b/tests/compiler/dart2js/rti/data/indirect_through_static.dart
@@ -4,19 +4,19 @@
 
 // @dart = 2.7
 
-/*strong.class: A:implicit=[A]*/
-/*omit.class: A:implicit=[A]*/
+/*spec:nnbd-off.class: A:implicit=[A]*/
+/*prod:nnbd-off.class: A:implicit=[A]*/
 abstract class A {}
 
 class B implements A {}
 
-/*strong.class: C:
+/*spec:nnbd-off.class: C:
   deps=[lookup],
   explicit=[C<lookup.T>,Map<String,C>],
   implicit=[C],
   needsArgs
 */
-/*omit.class: C:
+/*prod:nnbd-off.class: C:
  deps=[lookup],explicit=[C<lookup.T>],
  needsArgs
 */
@@ -28,8 +28,8 @@
   map['x'] = new C<B>();
 }
 
-/*strong.member: lookup:direct,explicit=[C<lookup.T>],needsArgs*/
-/*omit.member: lookup:direct,explicit=[C<lookup.T>],needsArgs*/
+/*spec:nnbd-off.member: lookup:direct,explicit=[C<lookup.T>],needsArgs*/
+/*prod:nnbd-off.member: lookup:direct,explicit=[C<lookup.T>],needsArgs*/
 C<T> lookup<T>(String key) {
   final value = map[key];
   if (value != null && value is C<T>) {
diff --git a/tests/compiler/dart2js/rti/data/instantiation1.dart b/tests/compiler/dart2js/rti/data/instantiation1.dart
index bd638dc..3ed0070 100644
--- a/tests/compiler/dart2js/rti/data/instantiation1.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation1.dart
@@ -4,13 +4,13 @@
 
 // @dart = 2.7
 
-/*strong.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
-/*omit.member: f:deps=[B]*/
+/*spec:nnbd-off.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*prod:nnbd-off.member: f:deps=[B]*/
 int f<T>(T a) => null;
 
 typedef int F<R>(R a);
 
-/*strong.class: B:explicit=[int Function(B.S)],indirect,needsArgs*/
+/*spec:nnbd-off.class: B:explicit=[int Function(B.S)],indirect,needsArgs*/
 class B<S> {
   F<S> c;
 
diff --git a/tests/compiler/dart2js/rti/data/instantiation2.dart b/tests/compiler/dart2js/rti/data/instantiation2.dart
index 8c040bc..ee21996 100644
--- a/tests/compiler/dart2js/rti/data/instantiation2.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation2.dart
@@ -4,14 +4,14 @@
 
 // @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>]*/
+/*spec:nnbd-off.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*prod:nnbd-off.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
 
-/*strong.class: B:explicit=[bool Function(B.S)],indirect,needsArgs*/
-/*omit.class: B:indirect,needsArgs*/
+/*spec:nnbd-off.class: B:explicit=[bool Function(B.S)],indirect,needsArgs*/
+/*prod:nnbd-off.class: B:indirect,needsArgs*/
 class B<S> {
   F<S> c;
 
diff --git a/tests/compiler/dart2js/rti/data/instantiation3.dart b/tests/compiler/dart2js/rti/data/instantiation3.dart
index 19899d9..67bfc44 100644
--- a/tests/compiler/dart2js/rti/data/instantiation3.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation3.dart
@@ -4,13 +4,13 @@
 
 // @dart = 2.7
 
-/*strong.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
-/*omit.member: f:deps=[B]*/
+/*spec:nnbd-off.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*prod:nnbd-off.member: f:deps=[B]*/
 int f<T>(T a) => null;
 
 typedef int F<R>(R a);
 
-/*strong.class: B:direct,explicit=[int Function(B.S)],needsArgs*/
+/*spec:nnbd-off.class: B:direct,explicit=[int Function(B.S)],needsArgs*/
 class B<S> {
   F<S> c;
 
diff --git a/tests/compiler/dart2js/rti/data/instantiation4.dart b/tests/compiler/dart2js/rti/data/instantiation4.dart
index c40ca9c..57616a0 100644
--- a/tests/compiler/dart2js/rti/data/instantiation4.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation4.dart
@@ -4,14 +4,14 @@
 
 // @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>]*/
+/*spec:nnbd-off.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*prod:nnbd-off.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
 
-/*strong.class: B:direct,explicit=[bool Function(B.S)],needsArgs*/
-/*omit.class: B:indirect,needsArgs*/
+/*spec:nnbd-off.class: B:direct,explicit=[bool Function(B.S)],needsArgs*/
+/*prod:nnbd-off.class: B:indirect,needsArgs*/
 class B<S> {
   F<S> c;
 
diff --git a/tests/compiler/dart2js/rti/data/instantiation5.dart b/tests/compiler/dart2js/rti/data/instantiation5.dart
index 8f3fb60..7ffbd29 100644
--- a/tests/compiler/dart2js/rti/data/instantiation5.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation5.dart
@@ -4,13 +4,13 @@
 
 // @dart = 2.7
 
-/*strong.member: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
-/*omit.member: f:deps=[method]*/
+/*spec:nnbd-off.member: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
+/*prod:nnbd-off.member: f:deps=[method]*/
 int f<T>(T a) => null;
 
 typedef int F<R>(R a);
 
-/*strong.member: method:indirect,needsArgs*/
+/*spec:nnbd-off.member: method:indirect,needsArgs*/
 method<S>() {
   F<S> c;
 
diff --git a/tests/compiler/dart2js/rti/data/instantiation6.dart b/tests/compiler/dart2js/rti/data/instantiation6.dart
index 212557f..a2e2c79 100644
--- a/tests/compiler/dart2js/rti/data/instantiation6.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation6.dart
@@ -4,14 +4,14 @@
 
 // @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>]*/
+/*spec:nnbd-off.member: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
+/*prod:nnbd-off.member: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
 
-/*strong.member: method:indirect,needsArgs*/
-/*omit.member: method:indirect,needsArgs*/
+/*spec:nnbd-off.member: method:indirect,needsArgs*/
+/*prod:nnbd-off.member: method:indirect,needsArgs*/
 method<S>() {
   F<S> c;
 
diff --git a/tests/compiler/dart2js/rti/data/instantiation7.dart b/tests/compiler/dart2js/rti/data/instantiation7.dart
index 2786071..71498ebb 100644
--- a/tests/compiler/dart2js/rti/data/instantiation7.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation7.dart
@@ -4,23 +4,23 @@
 
 // @dart = 2.7
 
-/*strong.member: f1:deps=[method],direct,explicit=[f1.T],needsArgs,needsInst=[<method.X>]*/
-/*omit.member: f1:deps=[method]*/
+/*spec:nnbd-off.member: f1:deps=[method],direct,explicit=[f1.T],needsArgs,needsInst=[<method.X>]*/
+/*prod:nnbd-off.member: f1:deps=[method]*/
 int f1<T>(T a, T b, T c) => null;
 
-/*strong.member: f2:deps=[method],direct,explicit=[f2.S,f2.T],needsArgs,needsInst=[<method.X,method.Y>]*/
-/*omit.member: f2:deps=[method]*/
+/*spec:nnbd-off.member: f2:deps=[method],direct,explicit=[f2.S,f2.T],needsArgs,needsInst=[<method.X,method.Y>]*/
+/*prod:nnbd-off.member: f2:deps=[method]*/
 int f2<T, S>(T a, S b, S c) => null;
 
-/*strong.member: f3:deps=[method],direct,explicit=[f3.S,f3.T,f3.U],needsArgs,needsInst=[<method.X,method.Y,method.Z>]*/
-/*omit.member: f3:deps=[method]*/
+/*spec:nnbd-off.member: f3:deps=[method],direct,explicit=[f3.S,f3.T,f3.U],needsArgs,needsInst=[<method.X,method.Y,method.Z>]*/
+/*prod:nnbd-off.member: f3:deps=[method]*/
 int f3<T, S, U>(T a, S b, U c) => null;
 
 typedef int F1<R>(R a, R b, R c);
 typedef int F2<R, P>(R a, P b, P c);
 typedef int F3<R, P, Q>(R a, P b, Q c);
 
-/*strong.member: method:indirect,needsArgs*/
+/*spec:nnbd-off.member: method:indirect,needsArgs*/
 method<X, Y, Z>() {
   F1<X> c1;
   F2<X, Y> c2;
diff --git a/tests/compiler/dart2js/rti/data/list_literal.dart b/tests/compiler/dart2js/rti/data/list_literal.dart
index b5caf11..4baa47f 100644
--- a/tests/compiler/dart2js/rti/data/list_literal.dart
+++ b/tests/compiler/dart2js/rti/data/list_literal.dart
@@ -4,11 +4,11 @@
 
 // @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*/
+/*spec:nnbd-off.class: global#List:deps=[Class.m],explicit=[List,List<String>],indirect,needsArgs*/
+/*prod:nnbd-off.class: global#List:deps=[Class.m],explicit=[List],indirect,needsArgs*/
 
-/*strong.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],indirect,needsArgs*/
-/*omit.class: global#JSArray:deps=[List],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
+/*spec:nnbd-off.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],indirect,needsArgs*/
+/*prod:nnbd-off.class: global#JSArray:deps=[List],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
 
 main() {
   var c = new Class();
diff --git a/tests/compiler/dart2js/rti/data/list_to_set.dart b/tests/compiler/dart2js/rti/data/list_to_set.dart
index d5457ee..576528d 100644
--- a/tests/compiler/dart2js/rti/data/list_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/list_to_set.dart
@@ -4,11 +4,11 @@
 
 // @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*/
+/*spec:nnbd-off.class: global#List:deps=[Class],explicit=[List,List<String>],indirect,needsArgs*/
+/*prod:nnbd-off.class: global#List:deps=[Class],explicit=[List],indirect,needsArgs*/
 
-/*strong.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],indirect,needsArgs*/
-/*omit.class: global#JSArray:deps=[List],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
+/*spec:nnbd-off.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],indirect,needsArgs*/
+/*prod:nnbd-off.class: global#JSArray:deps=[List],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
 
 main() {
   var c = new Class<int>();
diff --git a/tests/compiler/dart2js/rti/data/local_function_generic.dart b/tests/compiler/dart2js/rti/data/local_function_generic.dart
index 99ea166..c3ca915 100644
--- a/tests/compiler/dart2js/rti/data/local_function_generic.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_generic.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 
 method1() {
-  /*strong.direct,explicit=[local.T],needsArgs,needsSignature*/
-  /*omit.needsSignature*/
+  /*spec:nnbd-off.direct,explicit=[local.T],needsArgs,needsSignature*/
+  /*prod:nnbd-off.needsSignature*/
   T local<T>(T t) => t;
   return local;
 }
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 585ab8b..66de226 100644
--- a/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
@@ -6,10 +6,10 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.member: method:implicit=[method.T],indirect,needsArgs*/
-/*omit.member: method:needsArgs*/
-/*strong.class: global#JSArray:deps=[ArrayIterator,List],direct,explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs*/
-/*omit.class: global#JSArray:deps=[List],explicit=[JSArray],needsArgs*/
+/*spec:nnbd-off.member: method:implicit=[method.T],indirect,needsArgs*/
+/*prod:nnbd-off.member: method:needsArgs*/
+/*spec:nnbd-off.class: global#JSArray:deps=[ArrayIterator,List],direct,explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs*/
+/*prod:nnbd-off.class: global#JSArray:deps=[List],explicit=[JSArray],needsArgs*/
 
 @pragma('dart2js:noInline')
 method<T>() {
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 2aea2bb..0fed376 100644
--- a/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
@@ -6,11 +6,11 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
-/*omit.class: global#LinkedHashMap:deps=[Map],needsArgs*/
+/*spec:nnbd-off.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
+/*prod:nnbd-off.class: global#LinkedHashMap:deps=[Map],needsArgs*/
 
-/*strong.member: method:implicit=[method.T],indirect,needsArgs*/
-/*omit.member: method:needsArgs*/
+/*spec:nnbd-off.member: method:implicit=[method.T],indirect,needsArgs*/
+/*prod:nnbd-off.member: method:needsArgs*/
 @pragma('dart2js:noInline')
 method<T>() {
   return () => <T, int>{};
diff --git a/tests/compiler/dart2js/rti/data/local_function_signature2.dart b/tests/compiler/dart2js/rti/data/local_function_signature2.dart
index 9d38877..48d3161 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signature2.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signature2.dart
@@ -27,8 +27,8 @@
 }
 
 class Class2 {
-  /*strong.member: Class2.method4:direct,explicit=[method4.T],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
-  /*omit.member: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*spec:nnbd-off.member: Class2.method4:direct,explicit=[method4.T],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*prod:nnbd-off.member: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
   method4<T>() {
     /*needsSignature*/
     num local(T n) => null;
@@ -46,8 +46,8 @@
 }
 
 class Class4 {
-  /*strong.member: Class4.method6:direct,explicit=[method6.T],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
-  /*omit.member: Class4.method6:*/
+  /*spec:nnbd-off.member: Class4.method6:direct,explicit=[method6.T],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
+  /*prod:nnbd-off.member: Class4.method6:*/
   method6<T>() {
     /**/
     num local(num n, T t) => null;
@@ -55,8 +55,8 @@
   }
 }
 
-/*strong.member: method7:direct,explicit=[method7.T],needsArgs*/
-/*omit.member: method7:needsArgs*/
+/*spec:nnbd-off.member: method7:direct,explicit=[method7.T],needsArgs*/
+/*prod:nnbd-off.member: method7:needsArgs*/
 method7<T>() {
   /*needsSignature*/
   num local(T n) => null;
@@ -70,8 +70,8 @@
   return local;
 }
 
-/*strong.member: method9:direct,explicit=[method9.T],needsArgs*/
-/*omit.member: method9:*/
+/*spec:nnbd-off.member: method9:direct,explicit=[method9.T],needsArgs*/
+/*prod:nnbd-off.member: method9:*/
 method9<T>() {
   /**/
   num local(num n, T t) => null;
@@ -79,8 +79,8 @@
 }
 
 method10() {
-  /*strong.direct,explicit=[local.T],needsArgs*/
-  /*omit.*/
+  /*spec:nnbd-off.direct,explicit=[local.T],needsArgs*/
+  /*prod:nnbd-off.*/
   num local<T>(T n) => null;
   return local;
 }
@@ -92,8 +92,8 @@
 }
 
 method12() {
-  /*strong.direct,explicit=[local.T],needsArgs*/
-  /*omit.*/
+  /*spec:nnbd-off.direct,explicit=[local.T],needsArgs*/
+  /*prod:nnbd-off.*/
   num local<T>(num n, T t) => null;
   return local;
 }
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures.dart b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
index f963ae0..2a2b2e9 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
@@ -8,8 +8,8 @@
 
 class Class1 {
   method1() {
-    /*strong.needsSignature*/
-    /*omit.needsSignature*/
+    /*spec:nnbd-off.needsSignature*/
+    /*prod:nnbd-off.needsSignature*/
     num local(num n) => null;
     return local;
   }
@@ -25,8 +25,8 @@
   }
 }
 
-/*omit.class: Class2:needsArgs*/
-/*strong.class: Class2:direct,explicit=[Class2.T],needsArgs*/
+/*prod:nnbd-off.class: Class2:needsArgs*/
+/*spec:nnbd-off.class: Class2:direct,explicit=[Class2.T],needsArgs*/
 class Class2<T> {
   method4() {
     /*needsSignature*/
@@ -44,8 +44,8 @@
   }
 }
 
-/*omit.class: Class4:*/
-/*strong.class: Class4:direct,explicit=[Class4.T],needsArgs*/
+/*prod:nnbd-off.class: Class4:*/
+/*spec:nnbd-off.class: Class4:direct,explicit=[Class4.T],needsArgs*/
 class Class4<T> {
   method6() {
     /**/
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 0f38f17..1a089c8 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
@@ -27,8 +27,8 @@
 }
 
 class Class2 {
-  /*strong.member: Class2.method4:direct,explicit=[method4.T],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
-  /*omit.member: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*spec:nnbd-off.member: Class2.method4:direct,explicit=[method4.T],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*prod:nnbd-off.member: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
   method4<T>() {
     /*needsSignature*/
     num local(T n) => null;
@@ -46,8 +46,8 @@
 }
 
 class Class4 {
-  /*strong.member: Class4.method6:direct,explicit=[method6.T],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
-  /*omit.member: Class4.method6:*/
+  /*spec:nnbd-off.member: Class4.method6:direct,explicit=[method6.T],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
+  /*prod:nnbd-off.member: Class4.method6:*/
   method6<T>() {
     /**/
     num local(num n, T t) => null;
@@ -55,8 +55,8 @@
   }
 }
 
-/*strong.member: method7:direct,explicit=[method7.T],needsArgs*/
-/*omit.member: method7:needsArgs*/
+/*spec:nnbd-off.member: method7:direct,explicit=[method7.T],needsArgs*/
+/*prod:nnbd-off.member: method7:needsArgs*/
 method7<T>() {
   /*needsSignature*/
   num local(T n) => null;
@@ -70,8 +70,8 @@
   return local;
 }
 
-/*strong.member: method9:direct,explicit=[method9.T],needsArgs*/
-/*omit.member: method9:*/
+/*spec:nnbd-off.member: method9:direct,explicit=[method9.T],needsArgs*/
+/*prod:nnbd-off.member: method9:*/
 method9<T>() {
   /**/
   num local(num n, T t) => null;
@@ -79,8 +79,8 @@
 }
 
 method10() {
-  /*strong.direct,explicit=[local.T],needsArgs,needsInst=[<dynamic>,<num>,<num>],needsSignature*/
-  /*omit.needsSignature*/
+  /*spec:nnbd-off.direct,explicit=[local.T],needsArgs,needsInst=[<dynamic>,<num>,<num>],needsSignature*/
+  /*prod:nnbd-off.needsSignature*/
   num local<T>(T n) => null;
   return local;
 }
@@ -92,8 +92,8 @@
 }
 
 method12() {
-  /*strong.direct,explicit=[local.T],needsArgs,needsInst=[<dynamic>,<num>,<num>]*/
-  /*omit.*/
+  /*spec:nnbd-off.direct,explicit=[local.T],needsArgs,needsInst=[<dynamic>,<num>,<num>]*/
+  /*prod:nnbd-off.*/
   num local<T>(num n, T t) => null;
   return local;
 }
@@ -105,8 +105,8 @@
 }
 
 num Function(num) method14() {
-  /*strong.direct,explicit=[local.T],needsArgs,needsInst=[<dynamic>,<num>,<num>],needsSignature*/
-  /*omit.needsSignature*/
+  /*spec:nnbd-off.direct,explicit=[local.T],needsArgs,needsInst=[<dynamic>,<num>,<num>],needsSignature*/
+  /*prod:nnbd-off.needsSignature*/
   num local<T>(T n) => null;
   return local;
 }
diff --git a/tests/compiler/dart2js/rti/data/map_literal.dart b/tests/compiler/dart2js/rti/data/map_literal.dart
index 3472e19..47252cb 100644
--- a/tests/compiler/dart2js/rti/data/map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/map_literal.dart
@@ -4,17 +4,17 @@
 
 // @dart = 2.7
 
-/*omit.class: global#Map:*/
-/*strong.class: global#Map:explicit=[Map],indirect,needsArgs*/
+/*prod:nnbd-off.class: global#Map:*/
+/*spec:nnbd-off.class: global#Map:explicit=[Map],indirect,needsArgs*/
 
-/*omit.class: global#LinkedHashMap:deps=[Map]*/
-/*strong.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
+/*prod:nnbd-off.class: global#LinkedHashMap:deps=[Map]*/
+/*spec:nnbd-off.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
 
-/*omit.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
-/*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],needsArgs*/
+/*prod:nnbd-off.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
+/*spec:nnbd-off.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],needsArgs*/
 
-/*omit.class: global#double:explicit=[double]*/
-/*strong.class: global#double:explicit=[double],implicit=[double]*/
+/*prod:nnbd-off.class: global#double:explicit=[double]*/
+/*spec:nnbd-off.class: global#double:explicit=[double],implicit=[double]*/
 
 /*class: global#JSDouble:*/
 
diff --git a/tests/compiler/dart2js/rti/data/map_to_set.dart b/tests/compiler/dart2js/rti/data/map_to_set.dart
index 127552a..78dff5e 100644
--- a/tests/compiler/dart2js/rti/data/map_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/map_to_set.dart
@@ -4,17 +4,17 @@
 
 // @dart = 2.7
 
-/*omit.class: global#Map:deps=[Class],needsArgs*/
-/*strong.class: global#Map:deps=[Class],explicit=[Map],indirect,needsArgs*/
+/*prod:nnbd-off.class: global#Map:deps=[Class],needsArgs*/
+/*spec:nnbd-off.class: global#Map:deps=[Class],explicit=[Map],indirect,needsArgs*/
 
-/*omit.class: global#LinkedHashMap:deps=[Map],needsArgs*/
-/*strong.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
+/*prod:nnbd-off.class: global#LinkedHashMap:deps=[Map],needsArgs*/
+/*spec:nnbd-off.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
 
-/*omit.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
-/*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],needsArgs*/
+/*prod:nnbd-off.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
+/*spec:nnbd-off.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],needsArgs*/
 
-/*omit.class: global#double:explicit=[double]*/
-/*strong.class: global#double:explicit=[double],implicit=[double]*/
+/*prod:nnbd-off.class: global#double:explicit=[double]*/
+/*spec:nnbd-off.class: global#double:explicit=[double],implicit=[double]*/
 
 /*class: global#JSDouble:*/
 
@@ -25,8 +25,8 @@
   set is Set<String>;
 }
 
-/*omit.class: Class:needsArgs*/
-/*strong.class: Class:implicit=[Class.S,Class.T],indirect,needsArgs*/
+/*prod:nnbd-off.class: Class:needsArgs*/
+/*spec:nnbd-off.class: Class:implicit=[Class.S,Class.T],indirect,needsArgs*/
 class Class<T, S> {
   m() {
     return <T, S>{};
diff --git a/tests/compiler/dart2js/rti/data/marker.options b/tests/compiler/dart2js/rti/data/marker.options
index b77684b..cef4600 100644
--- a/tests/compiler/dart2js/rti/data/marker.options
+++ b/tests/compiler/dart2js/rti/data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/rti/rti_need_test_helper.dart
-omit=tests/compiler/dart2js/rti/rti_need_test_helper.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/rti/rti_need_test_helper.dart
+prod:nnbd-off=tests/compiler/dart2js/rti/rti_need_test_helper.dart
+spec:nnbd-sdk=tests/compiler/dart2js/rti/rti_need_test_helper.dart
+prod:nnbd-sdk=tests/compiler/dart2js/rti/rti_need_test_helper.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/rti/data/method_signatures.dart b/tests/compiler/dart2js/rti/data/method_signatures.dart
index b8332d1..77a96ee 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures.dart
@@ -17,11 +17,11 @@
   Object method3(num n) => null;
 }
 
-/*strong.class: Class2:direct,explicit=[Class2.T],needsArgs*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:direct,explicit=[Class2.T],needsArgs*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.method4:*/
-  /*omit.member: Class2.method4:*/
+  /*spec:nnbd-off.member: Class2.method4:*/
+  /*prod:nnbd-off.member: Class2.method4:*/
   num method4(T n) => null;
 }
 
@@ -31,8 +31,8 @@
   T method5(num n) => null;
 }
 
-/*omit.class: Class4:*/
-/*strong.class: Class4:direct,explicit=[Class4.T],needsArgs*/
+/*prod:nnbd-off.class: Class4:*/
+/*spec:nnbd-off.class: Class4:direct,explicit=[Class4.T],needsArgs*/
 class Class4<T> {
   /*member: Class4.method6:*/
   num method6(num n, T t) => null;
diff --git a/tests/compiler/dart2js/rti/data/method_signatures_generic.dart b/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
index eb0efc1..0a7024c 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
@@ -18,8 +18,8 @@
 }
 
 class Class2 {
-  /*strong.member: Class2.method4:direct,explicit=[method4.T],needsArgs,needsInst=[<num>,<num>,<num>,<num>]*/
-  /*omit.member: Class2.method4:*/
+  /*spec:nnbd-off.member: Class2.method4:direct,explicit=[method4.T],needsArgs,needsInst=[<num>,<num>,<num>,<num>]*/
+  /*prod:nnbd-off.member: Class2.method4:*/
   num method4<T>(T n) => null;
 }
 
@@ -29,20 +29,20 @@
 }
 
 class Class4 {
-  /*strong.member: Class4.method6:direct,explicit=[method6.T],needsArgs,needsInst=[<num>,<num>,<num>,<num>]*/
-  /*omit.member: Class4.method6:*/
+  /*spec:nnbd-off.member: Class4.method6:direct,explicit=[method6.T],needsArgs,needsInst=[<num>,<num>,<num>,<num>]*/
+  /*prod:nnbd-off.member: Class4.method6:*/
   num method6<T>(num n, T t) => null;
 }
 
-/*strong.member: method7:direct,explicit=[method7.T],needsArgs,needsInst=[<num>,<num>,<num>,<num>]*/
-/*omit.member: method7:*/
+/*spec:nnbd-off.member: method7:direct,explicit=[method7.T],needsArgs,needsInst=[<num>,<num>,<num>,<num>]*/
+/*prod:nnbd-off.member: method7:*/
 num method7<T>(T n) => null;
 
 /*member: method8:*/
 T method8<T>(num n) => null;
 
-/*strong.member: method9:direct,explicit=[method9.T],needsArgs,needsInst=[<num>,<num>,<num>,<num>]*/
-/*omit.member: method9:*/
+/*spec:nnbd-off.member: method9:direct,explicit=[method9.T],needsArgs,needsInst=[<num>,<num>,<num>,<num>]*/
+/*prod:nnbd-off.member: method9:*/
 num method9<T>(num n, T t) => null;
 
 @pragma('dart2js:noInline')
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 a42deee..48bbd34 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
@@ -6,16 +6,16 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: Class:*/
-/*omit.class: Class:*/
+/*spec:nnbd-off.class: Class:*/
+/*prod:nnbd-off.class: Class:*/
 class Class<T> {
-  /*strong.member: Class.:*/
-  /*omit.member: Class.:*/
+  /*spec:nnbd-off.member: Class.:*/
+  /*prod:nnbd-off.member: Class.:*/
   Class();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   /*needsSignature*/
   local1a() {}
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 c44c1f7..77913d6 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
@@ -6,27 +6,27 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: Class:*/
-/*omit.class: Class:*/
+/*spec:nnbd-off.class: Class:*/
+/*prod:nnbd-off.class: Class:*/
 class Class<T> {
-  /*strong.member: Class.:*/
-  /*omit.member: Class.:*/
+  /*spec:nnbd-off.member: Class.:*/
+  /*prod:nnbd-off.member: Class.:*/
   Class();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
-  /*strong.needsArgs,needsSignature*/
-  /*omit.needsArgs,needsSignature*/
+  /*spec:nnbd-off.needsArgs,needsSignature*/
+  /*prod:nnbd-off.needsArgs,needsSignature*/
   T local1a<T>() => null;
 
-  /*strong.needsArgs,needsSignature*/
-  /*omit.needsArgs,needsSignature*/
+  /*spec:nnbd-off.needsArgs,needsSignature*/
+  /*prod:nnbd-off.needsArgs,needsSignature*/
   T local1b<T>() => null;
 
-  /*strong.direct,explicit=[local2.T],needsArgs,needsSignature*/
-  /*omit.needsArgs,needsSignature*/
+  /*spec:nnbd-off.direct,explicit=[local2.T],needsArgs,needsSignature*/
+  /*prod:nnbd-off.needsArgs,needsSignature*/
   T local2<T>(T t, String s) => t;
 
   Expect.isTrue(local1a.runtimeType == local1b.runtimeType);
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 230f46f..51e8cfc 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
@@ -8,15 +8,15 @@
 
 String method() => null;
 
-/*omit.class: Class1:needsArgs*/
-/*strong.class: Class1:direct,explicit=[Class1.T],needsArgs*/
+/*prod:nnbd-off.class: Class1:needsArgs*/
+/*spec:nnbd-off.class: Class1:direct,explicit=[Class1.T],needsArgs*/
 class Class1<T> {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 
-  /*strong.member: Class1.method:*/
-  /*omit.member: Class1.method:*/
+  /*spec:nnbd-off.member: Class1.method:*/
+  /*prod:nnbd-off.member: Class1.method:*/
   method() {
     /*needsSignature*/
     T local1a() => null;
@@ -33,16 +33,16 @@
   }
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   new Class1<int>().method();
   new Class2<int>();
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 43358cb..549493b 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
@@ -6,40 +6,40 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: Class1:*/
-/*omit.class: Class1:*/
+/*spec:nnbd-off.class: Class1:*/
+/*prod:nnbd-off.class: Class1:*/
 class Class1<T> {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 
   // TODO(johnniwinther): Currently only methods that use class type variables
   // in their signature are marked as 'needs signature'. Change this to mark
   // all methods that need to support access to their function type at runtime.
 
-  /*strong.member: Class1.method1a:*/
-  /*omit.member: Class1.method1a:*/
+  /*spec:nnbd-off.member: Class1.method1a:*/
+  /*prod:nnbd-off.member: Class1.method1a:*/
   method1a() => null;
 
-  /*strong.member: Class1.method1b:*/
-  /*omit.member: Class1.method1b:*/
+  /*spec:nnbd-off.member: Class1.method1b:*/
+  /*prod:nnbd-off.member: Class1.method1b:*/
   method1b() => null;
 
-  /*strong.member: Class1.method2:*/
-  /*omit.member: Class1.method2:*/
+  /*spec:nnbd-off.member: Class1.method2:*/
+  /*prod:nnbd-off.member: Class1.method2:*/
   method2(t, s) => t;
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   var c = new Class1<int>();
 
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 e2cd3bd..2feedd8 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
@@ -6,36 +6,36 @@
 
 import 'package:expect/expect.dart';
 
-/*omit.class: Class1:needsArgs*/
-/*strong.class: Class1:direct,explicit=[Class1.T],needsArgs*/
+/*prod:nnbd-off.class: Class1:needsArgs*/
+/*spec:nnbd-off.class: Class1:direct,explicit=[Class1.T],needsArgs*/
 class Class1<T> {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 
-  /*strong.member: Class1.method1a:needsSignature*/
-  /*omit.member: Class1.method1a:needsSignature*/
+  /*spec:nnbd-off.member: Class1.method1a:needsSignature*/
+  /*prod:nnbd-off.member: Class1.method1a:needsSignature*/
   T method1a() => null;
 
-  /*strong.member: Class1.method1b:needsSignature*/
-  /*omit.member: Class1.method1b:needsSignature*/
+  /*spec:nnbd-off.member: Class1.method1b:needsSignature*/
+  /*prod:nnbd-off.member: Class1.method1b:needsSignature*/
   T method1b() => null;
 
-  /*strong.member: Class1.method2:needsSignature*/
-  /*omit.member: Class1.method2:needsSignature*/
+  /*spec:nnbd-off.member: Class1.method2:needsSignature*/
+  /*prod:nnbd-off.member: Class1.method2:needsSignature*/
   T method2(T t, String s) => t;
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   var c = new Class1<int>();
 
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 77593d4..d08a341 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
@@ -6,28 +6,28 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.member: method1a:*/
-/*omit.member: method1a:*/
+/*spec:nnbd-off.member: method1a:*/
+/*prod:nnbd-off.member: method1a:*/
 method1a() => null;
 
-/*strong.member: method1b:*/
-/*omit.member: method1b:*/
+/*spec:nnbd-off.member: method1b:*/
+/*prod:nnbd-off.member: method1b:*/
 method1b() => null;
 
-/*strong.member: method2:*/
-/*omit.member: method2:*/
+/*spec:nnbd-off.member: method2:*/
+/*prod:nnbd-off.member: method2:*/
 method2(t, s) => t;
 
-/*strong.class: Class:*/
-/*omit.class: Class:*/
+/*spec:nnbd-off.class: Class:*/
+/*prod:nnbd-off.class: Class:*/
 class Class<T> {
-  /*strong.member: Class.:*/
-  /*omit.member: Class.:*/
+  /*spec:nnbd-off.member: Class.:*/
+  /*prod:nnbd-off.member: Class.:*/
   Class();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
   Expect.isFalse(method1a.runtimeType == method2.runtimeType);
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 198424c..e43e522 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
@@ -12,20 +12,20 @@
 /*member: method1b:*/
 T method1b<T>() => null;
 
-/*strong.member: method2:direct,explicit=[method2.T],needsArgs*/
-/*omit.member: method2:*/
+/*spec:nnbd-off.member: method2:direct,explicit=[method2.T],needsArgs*/
+/*prod:nnbd-off.member: method2:*/
 T method2<T>(T t, String s) => t;
 
-/*strong.class: Class:*/
-/*omit.class: Class:*/
+/*spec:nnbd-off.class: Class:*/
+/*prod:nnbd-off.class: Class:*/
 class Class<T> {
-  /*strong.member: Class.:*/
-  /*omit.member: Class.:*/
+  /*spec:nnbd-off.member: Class.:*/
+  /*prod:nnbd-off.member: Class.:*/
   Class();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
   Expect.isFalse(method1a.runtimeType == method2.runtimeType);
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 5656b34..ca1408e 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
@@ -6,11 +6,11 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: Class1:*/
-/*omit.class: Class1:*/
+/*spec:nnbd-off.class: Class1:*/
+/*prod:nnbd-off.class: Class1:*/
 class Class1<S> {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 
   /*member: Class1.method1a:*/
@@ -19,21 +19,21 @@
   /*member: Class1.method1b:*/
   T method1b<T>() => null;
 
-  /*strong.member: Class1.method2:direct,explicit=[method2.T],needsArgs*/
-  /*omit.member: Class1.method2:*/
+  /*spec:nnbd-off.member: Class1.method2:direct,explicit=[method2.T],needsArgs*/
+  /*prod:nnbd-off.member: Class1.method2:*/
   T method2<T>(T t, String s) => t;
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   var c = new Class1<int>();
 
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 cc64617..8622fed 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
@@ -4,23 +4,23 @@
 
 // @dart = 2.7
 
-/*strong.class: Class:*/
-/*omit.class: Class:*/
+/*spec:nnbd-off.class: Class:*/
+/*prod:nnbd-off.class: Class:*/
 class Class<T> {
-  /*strong.member: Class.:*/
-  /*omit.member: Class.:*/
+  /*spec:nnbd-off.member: Class.:*/
+  /*prod:nnbd-off.member: Class.:*/
   Class();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
-  /*strong.needsSignature*/
-  /*omit.*/
+  /*spec:nnbd-off.needsSignature*/
+  /*prod:nnbd-off.*/
   local1() {}
 
-  /*strong.needsSignature*/
-  /*omit.*/
+  /*spec:nnbd-off.needsSignature*/
+  /*prod:nnbd-off.*/
   local2(int i, String s) => i;
 
   print('${local1.runtimeType}');
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 e79d08a..d01980c 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
@@ -4,23 +4,23 @@
 
 // @dart = 2.7
 
-/*strong.class: Class:*/
-/*omit.class: Class:*/
+/*spec:nnbd-off.class: Class:*/
+/*prod:nnbd-off.class: Class:*/
 class Class<T> {
-  /*strong.member: Class.:*/
-  /*omit.member: Class.:*/
+  /*spec:nnbd-off.member: Class.:*/
+  /*prod:nnbd-off.member: Class.:*/
   Class();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
-  /*strong.needsArgs,needsSignature*/
-  /*omit.*/
+  /*spec:nnbd-off.needsArgs,needsSignature*/
+  /*prod:nnbd-off.*/
   local1<T>() {}
 
-  /*strong.needsArgs,needsSignature,selectors=[Selector(call, call, arity=2, types=1)]*/
-  /*omit.*/
+  /*spec:nnbd-off.needsArgs,needsSignature,selectors=[Selector(call, call, arity=2, types=1)]*/
+  /*prod:nnbd-off.*/
   local2<T>(t, s) => t;
 
   print('${local1.runtimeType}');
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 d1d3744..ac6dcf5 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
@@ -4,28 +4,28 @@
 
 // @dart = 2.7
 
-/*strong.class: Class1:needsArgs*/
-/*omit.class: Class1:*/
+/*spec:nnbd-off.class: Class1:needsArgs*/
+/*prod:nnbd-off.class: Class1:*/
 class Class1<T> {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 
-  /*strong.member: Class1.method:needsSignature*/
-  /*omit.member: Class1.method:*/
+  /*spec:nnbd-off.member: Class1.method:needsSignature*/
+  /*prod:nnbd-off.member: Class1.method:*/
   T method() => null;
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1<int> cls1 = new Class1<int>();
   print(cls1.method.runtimeType.toString());
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 ef8ea71..25c1942 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
@@ -4,24 +4,24 @@
 
 // @dart = 2.7
 
-/*strong.class: Class:*/
-/*omit.class: Class:*/
+/*spec:nnbd-off.class: Class:*/
+/*prod:nnbd-off.class: Class:*/
 class Class<T> {
-  /*strong.member: Class.:*/
-  /*omit.member: Class.:*/
+  /*spec:nnbd-off.member: Class.:*/
+  /*prod:nnbd-off.member: Class.:*/
   Class();
 }
 
-/*strong.member: method1:*/
-/*omit.member: method1:*/
+/*spec:nnbd-off.member: method1:*/
+/*prod:nnbd-off.member: method1:*/
 method1() {}
 
-/*strong.member: method2:*/
-/*omit.member: method2:*/
+/*spec:nnbd-off.member: method2:*/
+/*prod:nnbd-off.member: method2:*/
 method2(int i, String s) => i;
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   print('${method1.runtimeType}');
   method2(0, '');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
index cc6dfc5..5f321e0 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
@@ -8,12 +8,12 @@
 
 /*class: Class1a:needsArgs*/
 class Class1a<T> {
-  /*strong.member: Class1a.:*/
-  /*omit.member: Class1a.:*/
+  /*spec:nnbd-off.member: Class1a.:*/
+  /*prod:nnbd-off.member: Class1a.:*/
   Class1a();
 
-  /*strong.member: Class1a.==:*/
-  /*omit.member: Class1a.==:*/
+  /*spec:nnbd-off.member: Class1a.==:*/
+  /*prod:nnbd-off.member: Class1a.==:*/
   bool operator ==(other) {
     if (identical(this, other)) return true;
     return runtimeType == other.runtimeType;
@@ -22,8 +22,8 @@
 
 /*class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a<T> {
-  /*strong.member: Class1b.:*/
-  /*omit.member: Class1b.:*/
+  /*spec:nnbd-off.member: Class1b.:*/
+  /*prod:nnbd-off.member: Class1b.:*/
   Class1b();
 }
 
@@ -31,21 +31,21 @@
 // this class.
 /*class: Class1c:needsArgs*/
 class Class1c<T> implements Class1a<T> {
-  /*strong.member: Class1c.:*/
-  /*omit.member: Class1c.:*/
+  /*spec:nnbd-off.member: Class1c.:*/
+  /*prod:nnbd-off.member: Class1c.:*/
   Class1c();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1a<int> cls1a = new Class1a<int>();
   Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
index 77abea4..9f77e4c 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
@@ -8,12 +8,12 @@
 
 /*class: Class1a:needsArgs*/
 class Class1a<T> {
-  /*strong.member: Class1a.:*/
-  /*omit.member: Class1a.:*/
+  /*spec:nnbd-off.member: Class1a.:*/
+  /*prod:nnbd-off.member: Class1a.:*/
   Class1a();
 
-  /*strong.member: Class1a.==:*/
-  /*omit.member: Class1a.==:*/
+  /*spec:nnbd-off.member: Class1a.==:*/
+  /*prod:nnbd-off.member: Class1a.==:*/
   bool operator ==(other) {
     if (identical(this, other)) return true;
     return other.runtimeType == runtimeType;
@@ -22,8 +22,8 @@
 
 /*class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a<T> {
-  /*strong.member: Class1b.:*/
-  /*omit.member: Class1b.:*/
+  /*spec:nnbd-off.member: Class1b.:*/
+  /*prod:nnbd-off.member: Class1b.:*/
   Class1b();
 }
 
@@ -31,21 +31,21 @@
 // this class.
 /*class: Class1c:needsArgs*/
 class Class1c<T> implements Class1a<T> {
-  /*strong.member: Class1c.:*/
-  /*omit.member: Class1c.:*/
+  /*spec:nnbd-off.member: Class1c.:*/
+  /*prod:nnbd-off.member: Class1c.:*/
   Class1c();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1a<int> cls1a = new Class1a<int>();
   Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
index 5b030ba..ccdccad 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
@@ -8,12 +8,12 @@
 
 /*class: Class1a:needsArgs*/
 class Class1a<T> {
-  /*strong.member: Class1a.:*/
-  /*omit.member: Class1a.:*/
+  /*spec:nnbd-off.member: Class1a.:*/
+  /*prod:nnbd-off.member: Class1a.:*/
   Class1a();
 
-  /*strong.member: Class1a.==:*/
-  /*omit.member: Class1a.==:*/
+  /*spec:nnbd-off.member: Class1a.==:*/
+  /*prod:nnbd-off.member: Class1a.==:*/
   bool operator ==(other) {
     if (identical(this, other)) return true;
     return runtimeType == other?.runtimeType;
@@ -22,8 +22,8 @@
 
 /*class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a<T> {
-  /*strong.member: Class1b.:*/
-  /*omit.member: Class1b.:*/
+  /*spec:nnbd-off.member: Class1b.:*/
+  /*prod:nnbd-off.member: Class1b.:*/
   Class1b();
 }
 
@@ -31,21 +31,21 @@
 // this class.
 /*class: Class1c:needsArgs*/
 class Class1c<T> implements Class1a<T> {
-  /*strong.member: Class1c.:*/
-  /*omit.member: Class1c.:*/
+  /*spec:nnbd-off.member: Class1c.:*/
+  /*prod:nnbd-off.member: Class1c.:*/
   Class1c();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1a<int> cls1a = new Class1a<int>();
   Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
index 9892440..fd1f0dc 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
@@ -8,12 +8,12 @@
 
 /*class: Class1a:needsArgs*/
 class Class1a<T> {
-  /*strong.member: Class1a.:*/
-  /*omit.member: Class1a.:*/
+  /*spec:nnbd-off.member: Class1a.:*/
+  /*prod:nnbd-off.member: Class1a.:*/
   Class1a();
 
-  /*strong.member: Class1a.==:*/
-  /*omit.member: Class1a.==:*/
+  /*spec:nnbd-off.member: Class1a.==:*/
+  /*prod:nnbd-off.member: Class1a.==:*/
   bool operator ==(other) {
     if (identical(this, other)) return true;
     return other?.runtimeType == runtimeType;
@@ -22,8 +22,8 @@
 
 /*class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a<T> {
-  /*strong.member: Class1b.:*/
-  /*omit.member: Class1b.:*/
+  /*spec:nnbd-off.member: Class1b.:*/
+  /*prod:nnbd-off.member: Class1b.:*/
   Class1b();
 }
 
@@ -31,21 +31,21 @@
 // this class.
 /*class: Class1c:needsArgs*/
 class Class1c<T> implements Class1a<T> {
-  /*strong.member: Class1c.:*/
-  /*omit.member: Class1c.:*/
+  /*spec:nnbd-off.member: Class1c.:*/
+  /*prod:nnbd-off.member: Class1c.:*/
   Class1c();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1a<int> cls1a = new Class1a<int>();
   Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
index b7b1d2c..ad20c46 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
@@ -6,37 +6,37 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: Class1a:explicit=[Class1a]*/
+/*spec:nnbd-off.class: Class1a:explicit=[Class1a]*/
 class Class1a {
   Class1a();
 }
 
-/*strong.class: Class1b:needsArgs*/
-/*omit.class: Class1b:needsArgs*/
+/*spec:nnbd-off.class: Class1b:needsArgs*/
+/*prod:nnbd-off.class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a {
   Class1b();
 }
 
-/*strong.class: Class1c:needsArgs*/
-/*omit.class: Class1c:needsArgs*/
+/*spec:nnbd-off.class: Class1c:needsArgs*/
+/*prod:nnbd-off.class: Class1c:needsArgs*/
 class Class1c<T> extends Class1a {
   Class1c();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
   Class2();
 }
 
-/*strong.member: test:*/
-/*omit.member: test:*/
+/*spec:nnbd-off.member: test:*/
+/*prod:nnbd-off.member: test:*/
 test(Class1a c, Type type) {
   return c.runtimeType == type;
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Expect.isTrue(test(new Class1a(), Class1a));
   Expect.isFalse(test(new Class1b<int>(), Class1a));
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
index 8482f3d..2098c62 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
@@ -6,38 +6,38 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: Class1a:explicit=[Class1a],needsArgs*/
-/*omit.class: Class1a:needsArgs*/
+/*spec:nnbd-off.class: Class1a:explicit=[Class1a],needsArgs*/
+/*prod:nnbd-off.class: Class1a:needsArgs*/
 class Class1a<T> {
   Class1a();
 }
 
-/*strong.class: Class1b:needsArgs*/
-/*omit.class: Class1b:needsArgs*/
+/*spec:nnbd-off.class: Class1b:needsArgs*/
+/*prod:nnbd-off.class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a<T> {
   Class1b();
 }
 
-/*strong.class: Class1c:needsArgs*/
-/*omit.class: Class1c:needsArgs*/
+/*spec:nnbd-off.class: Class1c:needsArgs*/
+/*prod:nnbd-off.class: Class1c:needsArgs*/
 class Class1c<T> extends Class1a<T> {
   Class1c();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
   Class2();
 }
 
-/*strong.member: test:*/
-/*omit.member: test:*/
+/*spec:nnbd-off.member: test:*/
+/*prod:nnbd-off.member: test:*/
 test(Class1a c, Type type) {
   return c.runtimeType == type;
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Expect.isTrue(test(new Class1a(), Class1a));
   Expect.isFalse(test(new Class1b<int>(), Class1a));
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
index 980f832..9d448cd 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
@@ -6,45 +6,45 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: Class1a:explicit=[Class1a]*/
+/*spec:nnbd-off.class: Class1a:explicit=[Class1a]*/
 class Class1a {
   Class1a();
 }
 
-/*strong.class: Class1b:needsArgs*/
-/*omit.class: Class1b:needsArgs*/
+/*spec:nnbd-off.class: Class1b:needsArgs*/
+/*prod:nnbd-off.class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a {
   Class1b();
 }
 
-/*strong.class: Class1c:needsArgs*/
-/*omit.class: Class1c:needsArgs*/
+/*spec:nnbd-off.class: Class1c:needsArgs*/
+/*prod:nnbd-off.class: Class1c:needsArgs*/
 class Class1c<T> extends Class1a {
   Class1c();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
   Class2();
 }
 
-/*strong.class: Class3:explicit=[Class3]*/
-/*omit.class: Class3:*/
+/*spec:nnbd-off.class: Class3:explicit=[Class3]*/
+/*prod:nnbd-off.class: Class3:*/
 class Class3<T> {
   final Class1a field;
 
   Class3(this.field);
 }
 
-/*strong.member: test:*/
-/*omit.member: test:*/
+/*spec:nnbd-off.member: test:*/
+/*prod:nnbd-off.member: test:*/
 test(Class3 c, Type type) {
   return c.field.runtimeType == type;
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Expect.isTrue(test(new Class3<int>(new Class1a()), Class1a));
   Expect.isFalse(test(new Class3<int>(new Class1b<int>()), 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 36de144..a5a2214 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
@@ -7,7 +7,7 @@
 /*member: global#instantiate1:needsArgs*/
 
 main() {
-  /*strong.direct,explicit=[id.T],needsArgs,needsInst=[<int>],needsSignature*/
+  /*spec:nnbd-off.direct,explicit=[id.T],needsArgs,needsInst=[<int>],needsSignature*/
   T id<T>(T t, String s) => t;
   int Function(int, String s) x = id;
   print("${x.runtimeType}");
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 2b1fc09..d5c35e2 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
@@ -6,7 +6,7 @@
 
 /*member: global#instantiate1:needsArgs*/
 
-/*strong.member: id:direct,explicit=[id.T],needsArgs,needsInst=[<int>]*/
+/*spec:nnbd-off.member: id:direct,explicit=[id.T],needsArgs,needsInst=[<int>]*/
 T id<T>(T t, String s) => t;
 
 main() {
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 0060b4c..49733ad 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
@@ -7,7 +7,7 @@
 /*member: global#instantiate1:needsArgs*/
 
 class Class {
-  /*strong.member: Class.id:direct,explicit=[id.T],needsArgs,needsInst=[<int>]*/
+  /*spec:nnbd-off.member: Class.id:direct,explicit=[id.T],needsArgs,needsInst=[<int>]*/
   T id<T>(T t, String s) => t;
 }
 
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 33499d6..a414f91 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
@@ -4,32 +4,32 @@
 
 // @dart = 2.7
 
-/*strong.class: Class1:*/
-/*omit.class: Class1:*/
+/*spec:nnbd-off.class: Class1:*/
+/*prod:nnbd-off.class: Class1:*/
 class Class1 {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.class: Class3:needsArgs*/
-/*omit.class: Class3:*/
+/*spec:nnbd-off.class: Class3:needsArgs*/
+/*prod:nnbd-off.class: Class3:*/
 class Class3<T> implements Class1 {
-  /*strong.member: Class3.:*/
-  /*omit.member: Class3.:*/
+  /*spec:nnbd-off.member: Class3.:*/
+  /*prod:nnbd-off.member: Class3.:*/
   Class3();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1 cls1 = new Class1();
   print(cls1.runtimeType.toString());
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 b2f2adb..97d71504 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
@@ -4,24 +4,24 @@
 
 // @dart = 2.7
 
-/*strong.class: Class1:needsArgs*/
-/*omit.class: Class1:*/
+/*spec:nnbd-off.class: Class1:needsArgs*/
+/*prod:nnbd-off.class: Class1:*/
 class Class1<T> {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1<int> cls1 = new Class1<int>();
   print('${cls1.runtimeType}');
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 2fa2623..c13a88b 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
@@ -4,24 +4,24 @@
 
 // @dart = 2.7
 
-/*strong.class: Class1:needsArgs*/
-/*omit.class: Class1:*/
+/*spec:nnbd-off.class: Class1:needsArgs*/
+/*prod:nnbd-off.class: Class1:*/
 class Class1<T> {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1<int> cls1 = new Class1<int>();
   print(cls1.runtimeType?.toString());
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 75ce88e..d8418e1 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
@@ -4,24 +4,24 @@
 
 // @dart = 2.7
 
-/*strong.class: Class1:needsArgs*/
-/*omit.class: Class1:*/
+/*spec:nnbd-off.class: Class1:needsArgs*/
+/*prod:nnbd-off.class: Class1:*/
 class Class1<T> {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1<int> cls1 = new Class1<int>();
   print(cls1?.runtimeType?.toString());
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 520fbb6..56a3c53 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
@@ -4,24 +4,24 @@
 
 // @dart = 2.7
 
-/*strong.class: Class1:needsArgs*/
-/*omit.class: Class1:*/
+/*spec:nnbd-off.class: Class1:needsArgs*/
+/*prod:nnbd-off.class: Class1:*/
 class Class1<T> {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1<int> cls1 = new Class1<int>();
   print('${cls1?.runtimeType}');
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 8272616..b9a04c6 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
@@ -4,24 +4,24 @@
 
 // @dart = 2.7
 
-/*strong.class: Class1:needsArgs*/
-/*omit.class: Class1:*/
+/*spec:nnbd-off.class: Class1:needsArgs*/
+/*prod:nnbd-off.class: Class1:*/
 class Class1<T> {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 }
 
-/*strong.class: Class2:needsArgs*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:needsArgs*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   dynamic cls1 = new Class1<int>();
   print('${cls1.runtimeType}');
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 33499d6..a414f91 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
@@ -4,32 +4,32 @@
 
 // @dart = 2.7
 
-/*strong.class: Class1:*/
-/*omit.class: Class1:*/
+/*spec:nnbd-off.class: Class1:*/
+/*prod:nnbd-off.class: Class1:*/
 class Class1 {
-  /*strong.member: Class1.:*/
-  /*omit.member: Class1.:*/
+  /*spec:nnbd-off.member: Class1.:*/
+  /*prod:nnbd-off.member: Class1.:*/
   Class1();
 }
 
-/*strong.class: Class2:*/
-/*omit.class: Class2:*/
+/*spec:nnbd-off.class: Class2:*/
+/*prod:nnbd-off.class: Class2:*/
 class Class2<T> {
-  /*strong.member: Class2.:*/
-  /*omit.member: Class2.:*/
+  /*spec:nnbd-off.member: Class2.:*/
+  /*prod:nnbd-off.member: Class2.:*/
   Class2();
 }
 
-/*strong.class: Class3:needsArgs*/
-/*omit.class: Class3:*/
+/*spec:nnbd-off.class: Class3:needsArgs*/
+/*prod:nnbd-off.class: Class3:*/
 class Class3<T> implements Class1 {
-  /*strong.member: Class3.:*/
-  /*omit.member: Class3.:*/
+  /*spec:nnbd-off.member: Class3.:*/
+  /*prod:nnbd-off.member: Class3.:*/
   Class3();
 }
 
-/*strong.member: main:*/
-/*omit.member: main:*/
+/*spec:nnbd-off.member: main:*/
+/*prod:nnbd-off.member: main:*/
 main() {
   Class1 cls1 = new Class1();
   print(cls1.runtimeType.toString());
diff --git a/tests/compiler/dart2js/rti/data/subtype_named_args.dart b/tests/compiler/dart2js/rti/data/subtype_named_args.dart
index 905ab05..bd72027 100644
--- a/tests/compiler/dart2js/rti/data/subtype_named_args.dart
+++ b/tests/compiler/dart2js/rti/data/subtype_named_args.dart
@@ -8,7 +8,7 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: A:
+/*spec:nnbd-off.class: A:
  explicit=[
   A,G<A,A1,A1,A1>,
   dynamic Function({a:A,b:A1,c:A1,d:A1}),
@@ -20,7 +20,7 @@
   dynamic Function({v:dynamic Function({a:A,b:B,c:C,d:D}),x:int,y:bool,z:List<Map>}),
   dynamic Function({v:dynamic,x:A,y:G,z:dynamic Function({b:B,f:dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),g:G<A,B,C,D>,x:dynamic})})]
 */
-/*omit.class: A:
+/*prod:nnbd-off.class: A:
  explicit=[
   dynamic Function({a:A,b:B,c:C,d:D}),
   dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),
@@ -28,13 +28,13 @@
 */
 class A {}
 
-/*strong.class: A1:explicit=[A1,G<A,A1,A1,A1>,List<List<A1>>,dynamic Function({a:A,b:A1,c:A1,d:A1}),dynamic Function({g:G<A,A1,A1,A1>,l:List<List<A1>>,m:Map<num,num>})]*/
+/*spec:nnbd-off.class: A1:explicit=[A1,G<A,A1,A1,A1>,List<List<A1>>,dynamic Function({a:A,b:A1,c:A1,d:A1}),dynamic Function({g:G<A,A1,A1,A1>,l:List<List<A1>>,m:Map<num,num>})]*/
 class A1 {}
 
-/*strong.class: A2:explicit=[A2]*/
+/*spec:nnbd-off.class: A2:explicit=[A2]*/
 class A2 {}
 
-/*strong.class: B:
+/*spec:nnbd-off.class: B:
  explicit=[
   B,
   dynamic Function({a:A,b:B,c:C,d:D}),
@@ -44,7 +44,7 @@
   dynamic Function({v:dynamic Function({a:A,b:B,c:C,d:D}),x:int,y:bool,z:List<Map>}),
   dynamic Function({v:dynamic,x:A,y:G,z:dynamic Function({b:B,f:dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),g:G<A,B,C,D>,x:dynamic})})]
 */
-/*omit.class: B:
+/*prod:nnbd-off.class: B:
  explicit=[
   dynamic Function({a:A,b:B,c:C,d:D}),
   dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),
@@ -52,7 +52,7 @@
 */
 class B implements A, A1, A2 {}
 
-/*strong.class: C:
+/*spec:nnbd-off.class: C:
  explicit=[
   C,
   dynamic Function({a:A,b:B,c:C,d:D}),
@@ -61,7 +61,7 @@
   dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),dynamic Function({v:dynamic Function({a:A,b:B,c:C,d:D}),x:int,y:bool,z:List<Map>}),
   dynamic Function({v:dynamic,x:A,y:G,z:dynamic Function({b:B,f:dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),g:G<A,B,C,D>,x:dynamic})})]
 */
-/*omit.class: C:
+/*prod:nnbd-off.class: C:
  explicit=[
   dynamic Function({a:A,b:B,c:C,d:D}),
   dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),
@@ -69,7 +69,7 @@
 */
 class C implements B {}
 
-/*strong.class: D:
+/*spec:nnbd-off.class: D:
  explicit=[
   D,G<D,D,D,D>,List<List<D>>,
   dynamic Function({a:A,b:B,c:C,d:D}),
@@ -78,7 +78,7 @@
   dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),dynamic Function({g:G<D,D,D,D>,l:List<List<D>>,m:Map<int,int>}),
   dynamic Function({v:dynamic Function({a:A,b:B,c:C,d:D}),x:int,y:bool,z:List<Map>}),dynamic Function({v:dynamic,x:A,y:G,z:dynamic Function({b:B,f:dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),g:G<A,B,C,D>,x:dynamic})})]
 */
-/*omit.class: D:
+/*prod:nnbd-off.class: D:
  explicit=[
   dynamic Function({a:A,b:B,c:C,d:D}),
   dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),
@@ -86,7 +86,7 @@
 */
 class D implements C {}
 
-/*strong.class: G:
+/*spec:nnbd-off.class: G:
  explicit=[
   G,G<A,A1,A1,A1>,G<D,D,D,D>,
   dynamic Function({b:B,f:dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),g:G<A,B,C,D>,x:dynamic}),
@@ -97,7 +97,7 @@
   dynamic Function({v:dynamic,x:A,y:G,z:dynamic Function({b:B,f:dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),g:G<A,B,C,D>,x:dynamic})})],
  needsArgs
 */
-/*omit.class: G:
+/*prod:nnbd-off.class: G:
  explicit=[
   dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),
   dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]
@@ -123,19 +123,19 @@
 
 main() {
   Expect.isTrue(
-      /*strong.needsSignature*/
+      /*spec:nnbd-off.needsSignature*/
       ({D a, B b, C c, A d}) {} is classesFunc);
   Expect.isTrue(
       /*needsSignature*/
       ({A a, A b, A c, A d}) {} is classesFunc);
   Expect.isTrue(
-      /*strong.needsSignature*/
+      /*spec:nnbd-off.needsSignature*/
       ({D a, A1 b, A1 c, A1 d}) {} is classesFunc);
   Expect.isTrue(
-      /*strong.needsSignature*/
+      /*spec:nnbd-off.needsSignature*/
       ({D a, A2 b, A2 c, A2 d}) {} is classesFunc);
   Expect.isTrue(
-      /*strong.needsSignature*/
+      /*spec:nnbd-off.needsSignature*/
       ({D a, D b, D c, D d}) {} is classesFunc);
   Expect.isTrue(
       /*needsSignature*/
@@ -149,7 +149,7 @@
       ({Map<num, num> m, List<List<A1>> l, G<A, A1, A1, A1> g}) {}
           is genericsFunc);
   Expect.isTrue(
-      /*strong.needsSignature*/
+      /*spec:nnbd-off.needsSignature*/
       ({Map<int, int> m, List<List<D>> l, G<D, D, D, D> g}) {} is genericsFunc);
   Expect.isTrue(
       /*needsSignature*/
@@ -159,10 +159,10 @@
       ({Object m, Object l, Object g}) {} is genericsFunc);
 
   Expect.isTrue(
-      /*strong.needsSignature*/
+      /*spec:nnbd-off.needsSignature*/
       ({A x, G y, mixFunc z, var v}) {} is dynamicFunc);
   Expect.isTrue(
-      /*strong.needsSignature*/
+      /*spec:nnbd-off.needsSignature*/
       ({int x, bool y, List<Map> z, classesFunc v}) {} is dynamicFunc);
 
   Expect.isTrue((
diff --git a/tests/compiler/dart2js/rti/data/subtype_named_args1.dart b/tests/compiler/dart2js/rti/data/subtype_named_args1.dart
index dc140e4..08e4684 100644
--- a/tests/compiler/dart2js/rti/data/subtype_named_args1.dart
+++ b/tests/compiler/dart2js/rti/data/subtype_named_args1.dart
@@ -8,18 +8,18 @@
 
 import "package:expect/expect.dart";
 
-/*strong.class: A:explicit=[A,dynamic Function({a:A})]*/
+/*spec:nnbd-off.class: A:explicit=[A,dynamic Function({a:A})]*/
 class A {}
 
-/*strong.class: B:explicit=[B,dynamic Function({a:B}),dynamic Function({f:dynamic Function({a:B})})]*/
-/*omit.class: B:explicit=[dynamic Function({a:B}),dynamic Function({f:dynamic Function({a:B})})]*/
+/*spec:nnbd-off.class: B:explicit=[B,dynamic Function({a:B}),dynamic Function({f:dynamic Function({a:B})})]*/
+/*prod:nnbd-off.class: B:explicit=[dynamic Function({a:B}),dynamic Function({f:dynamic Function({a:B})})]*/
 class B implements A {}
 
-/*strong.class: C:explicit=[C,dynamic Function({a:C}),dynamic Function({c:C})]*/
-/*omit.class: C:explicit=[dynamic Function({c:C})]*/
+/*spec:nnbd-off.class: C:explicit=[C,dynamic Function({a:C}),dynamic Function({c:C})]*/
+/*prod:nnbd-off.class: C:explicit=[dynamic Function({c:C})]*/
 class C implements B {}
 
-/*strong.class: D:explicit=[D,dynamic Function({a:D})]*/
+/*spec:nnbd-off.class: D:explicit=[D,dynamic Function({a:D})]*/
 class D implements C {}
 
 typedef t1({B a});
@@ -39,8 +39,8 @@
 main() {
   Expect.isTrue(/*needsSignature*/ ({A a}) {} is t1);
   Expect.isTrue(/*needsSignature*/ ({B a}) {} is t1);
-  Expect.isTrue(/*strong.needsSignature*/ ({C a}) {} is t1);
-  Expect.isTrue(/*strong.needsSignature*/ ({D a}) {} is t1);
+  Expect.isTrue(/*spec:nnbd-off.needsSignature*/ ({C a}) {} is t1);
+  Expect.isTrue(/*spec:nnbd-off.needsSignature*/ ({D a}) {} is t1);
   Expect.isTrue(/*needsSignature*/ ({Object a}) {} is t1);
   Expect.isTrue(/*needsSignature*/ ({var a}) {} is t1);
 
@@ -90,8 +90,8 @@
 
   Expect.isTrue(/*needsSignature*/ ({A a}) {} is t8);
   Expect.isTrue(/*needsSignature*/ ({B a}) {} is t8);
-  Expect.isTrue(/*strong.needsSignature*/ ({C a}) {} is t8);
-  Expect.isTrue(/*strong.needsSignature*/ ({D a}) {} is t8);
+  Expect.isTrue(/*spec:nnbd-off.needsSignature*/ ({C a}) {} is t8);
+  Expect.isTrue(/*spec:nnbd-off.needsSignature*/ ({D a}) {} is t8);
   Expect.isTrue(/*needsSignature*/ ({Object a}) {} is t8);
   Expect.isTrue(/*needsSignature*/ ({var a}) {} is t8);
   Expect.isTrue(({num a}) {} is t8);
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic.dart b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
index fea635a..727f8be 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
@@ -4,11 +4,11 @@
 
 // @dart = 2.7
 
-/*strong.class: A:direct,explicit=[A.T],needsArgs*/
-/*omit.class: A:*/
+/*spec:nnbd-off.class: A:direct,explicit=[A.T],needsArgs*/
+/*prod:nnbd-off.class: A:*/
 class A<T> {
-  /*strong.member: A.m:*/
-  /*omit.member: A.m:*/
+  /*spec:nnbd-off.member: A.m:*/
+  /*prod:nnbd-off.member: A.m:*/
   void m(T t) {}
 
   /*member: A.f:*/
diff --git a/tests/compiler/dart2js/rti/emission/closure_function.dart b/tests/compiler/dart2js/rti/emission/closure_function.dart
index d478691..8e032bf 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function.dart
@@ -10,8 +10,7 @@
 main() {
   test(
 
-      /*strong.checks=[],instance*/
-      /*omit.checks=[],instance*/
+      /*checks=[],instance*/
       () {});
   test(null);
 }
diff --git a/tests/compiler/dart2js/rti/emission/closure_function_type.dart b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
index 6436a12..b40047e 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function_type.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
@@ -11,7 +11,6 @@
   test(/*checks=[$signature],instance*/ () {});
   test(
 
-      /*strong.checks=[],instance*/
-      /*omit.checks=[],instance*/
+      /*checks=[],instance*/
       (a) {});
 }
diff --git a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
index 28e2660..15549d7 100644
--- a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
@@ -12,8 +12,7 @@
     // potential subtype of the checked function types.
     return
 
-        /*strong.checks=[],instance*/
-        /*omit.checks=[],instance*/
+        /*checks=[],instance*/
         (T t, String s) {};
   }
 }
diff --git a/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart b/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
index 097a0ce9..280e65d 100644
--- a/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
+++ b/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
@@ -4,14 +4,14 @@
 
 // @dart = 2.7
 
-/*strong.class: A1:checkedInstance,checks=[],instance*/
-/*omit.class: A1:checks=[],instance*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A1:checkedInstance,checks=[],instance*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: A1:checks=[],instance*/
 class A1 {}
 
 // Constructor calls are always statically invoked, so there is no checks at the
 // entry and the `Test1` constructor does not cause any checks.
-/*strong.class: B1:checks=[$isA1],instance*/
-/*omit.class: B1:checks=[],instance*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: B1:checks=[$isA1],instance*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: B1:checks=[],instance*/
 class B1 implements A1 {}
 
 /*class: Test1:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/event_callback.dart b/tests/compiler/dart2js/rti/emission/event_callback.dart
index 288d1da..7402b76 100644
--- a/tests/compiler/dart2js/rti/emission/event_callback.dart
+++ b/tests/compiler/dart2js/rti/emission/event_callback.dart
@@ -6,8 +6,8 @@
 
 import 'dart:html';
 
-/*strong.class: global#Event:checkedInstance,checkedTypeArgument,checks=[$isEvent],instance,typeArgument*/
-/*omit.class: global#Event:checkedTypeArgument,checks=[$isEvent],instance,typeArgument*/
+/*spec:nnbd-off.class: global#Event:checkedInstance,checkedTypeArgument,checks=[$isEvent],instance,typeArgument*/
+/*prod:nnbd-off.class: global#Event:checkedTypeArgument,checks=[$isEvent],instance,typeArgument*/
 /*class: global#MouseEvent:checks=[$isMouseEvent],instance,typeArgument*/
 /*class: global#KeyboardEvent:checks=[$isKeyboardEvent],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 e636027..8e9d63f 100644
--- a/tests/compiler/dart2js/rti/emission/fixed_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/fixed_type_argument.dart
@@ -4,12 +4,12 @@
 
 // @dart = 2.7
 
-/*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A {}
 
-/*strong.class: B:checkedInstance,checks=[$isA],typeArgument*/
-/*omit.class: B:checks=[$isA],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: B:checkedInstance,checks=[$isA],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: B:checks=[$isA],typeArgument*/
 class B implements A {}
 
 /*class: C:checks=[],indirectInstance*/
@@ -24,7 +24,7 @@
 main() {
   C<A> c = new D();
   c.method(
-      /*strong.checks=[$signature],instance*/
-      /*omit.checks=[],instance*/
+      /*spec:nnbd-off|spec:nnbd-sdk.checks=[$signature],instance*/
+      /*prod:nnbd-off|prod:nnbd-sdk.checks=[],instance*/
       (A 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 b5bdbee..9a9331c 100644
--- a/tests/compiler/dart2js/rti/emission/fixed_type_argument_implements.dart
+++ b/tests/compiler/dart2js/rti/emission/fixed_type_argument_implements.dart
@@ -7,19 +7,19 @@
 // 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.
 
-/*strong.class: A:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A {}
 
-/*strong.class: B:checks=[$isA],typeArgument*/
-/*omit.class: B:checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: B:checks=[$isA],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: B:checks=[],typeArgument*/
 class B implements A {}
 
-/*strong.class: C:checkedInstance*/
-/*omit.class: C:*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: C:checkedInstance*/
+/*prod:nnbd-off.class: C:*/
 class C<T> {}
 
-/*strong.class: D:checks=[$isC],instance*/
-/*omit.class: D:checks=[],instance*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: D:checks=[$isC],instance*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: D:checks=[],instance*/
 class D implements C<B> {}
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/function_type_argument.dart b/tests/compiler/dart2js/rti/emission/function_type_argument.dart
index f674415..cf4fdc3 100644
--- a/tests/compiler/dart2js/rti/emission/function_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/function_type_argument.dart
@@ -6,14 +6,14 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: C:checkedInstance,checks=[],instance,typeArgument*/
-/*omit.class: C:checks=[],instance,typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: C:checkedInstance,checks=[],instance,typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: C:checks=[],instance,typeArgument*/
 class C {
   call(int i) {}
 }
 
-/*strong.class: D:checkedInstance,checks=[],instance,typeArgument*/
-/*omit.class: D:checks=[],instance,typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: D:checkedInstance,checks=[],instance,typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: D:checks=[],instance,typeArgument*/
 class D {
   call(double i) {}
 }
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 0241ff4..5c4b796 100644
--- a/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart
+++ b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart
@@ -8,12 +8,12 @@
 
 library generic_methods_dynamic_test;
 
-/*strong.class: A:checkedInstance,checks=[],typeArgument*/
-/*omit.class: A:*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A:checkedInstance,checks=[],typeArgument*/
+/*prod:nnbd-off.class: A:*/
 class A {}
 
-/*strong.class: B:checks=[],instance*/
-/*omit.class: B:*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: B:checks=[],instance*/
+/*prod:nnbd-off.class: B:*/
 class B {}
 
 /*class: C:*/
diff --git a/tests/compiler/dart2js/rti/emission/indirect_through_static.dart b/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
index 5a70d24..8246072 100644
--- a/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
+++ b/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
@@ -4,16 +4,13 @@
 
 // @dart = 2.7
 
-/*strong.class: A:checkedInstance,checks=[],typeArgument*/
-/*omit.class: A:checkedInstance,checks=[],typeArgument*/
+/*class: A:checkedInstance,checks=[],typeArgument*/
 abstract class A {}
 
-/*strong.class: B:checks=[$isA],typeArgument*/
-/*omit.class: B:checks=[$isA],typeArgument*/
+/*class: B:checks=[$isA],typeArgument*/
 class B implements A {}
 
-/*strong.class: C:checkedInstance,checks=[],instance,typeArgument*/
-/*omit.class: C:checkedInstance,checks=[],instance,typeArgument*/
+/*class: C:checkedInstance,checks=[],instance,typeArgument*/
 class C<T> {}
 
 final Map<String, C> map = {};
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 65a16f8..b86d758 100644
--- a/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
+++ b/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
@@ -14,8 +14,8 @@
 import 'package:expect/expect.dart';
 import 'package:js/js.dart';
 
-/*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: A:checkedTypeArgument,checks=[],typeArgument*/
 @JS()
 @anonymous
 class A<T> {
diff --git a/tests/compiler/dart2js/rti/emission/list.dart b/tests/compiler/dart2js/rti/emission/list.dart
index 6efdf08..ee93c8d 100644
--- a/tests/compiler/dart2js/rti/emission/list.dart
+++ b/tests/compiler/dart2js/rti/emission/list.dart
@@ -4,17 +4,17 @@
 
 // @dart = 2.7
 
-/*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
-/*strong.class: global#JSArray:checkedInstance,checks=[$isIterable],instance*/
-/*omit.class: global#JSArray:checks=[$isIterable],instance*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: A:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off.class: global#JSArray:checkedInstance,checks=[$isIterable],instance*/
+/*prod:nnbd-off.class: global#JSArray:checks=[$isIterable],instance*/
 
 /*class: global#Iterable:checkedInstance*/
 
 class A {}
 
-/*strong.class: B:checkedInstance,checks=[],typeArgument*/
-/*omit.class: B:checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: B:checkedInstance,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: B:checks=[],typeArgument*/
 class B {}
 
 @pragma('dart2js:noInline')
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 7573410..115a5d1 100644
--- a/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
@@ -6,8 +6,8 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: global#JSArray:checkedInstance,checks=[$isIterable,$isList],instance*/
-/*omit.class: global#JSArray:checks=[$isList],instance*/
+/*spec:nnbd-off.class: global#JSArray:checkedInstance,checks=[$isIterable,$isList],instance*/
+/*prod:nnbd-off.class: global#JSArray:checks=[$isList],instance*/
 
 @pragma('dart2js:noInline')
 method<T>() {
diff --git a/tests/compiler/dart2js/rti/emission/map_literal.dart b/tests/compiler/dart2js/rti/emission/map_literal.dart
index 273331d..e424e80 100644
--- a/tests/compiler/dart2js/rti/emission/map_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/map_literal.dart
@@ -4,12 +4,12 @@
 
 // @dart = 2.7
 
-/*strong.class: global#Map:instance*/
+/*spec:nnbd-off.class: global#Map:instance*/
 
 /*class: global#LinkedHashMap:*/
 /*class: global#JsLinkedHashMap:checks=[],instance*/
 
-/*strong.class: global#double:checkedInstance,checks=[],instance,typeArgument*/
+/*spec:nnbd-off.class: global#double:checkedInstance,checks=[],instance,typeArgument*/
 
 /*class: global#JSDouble:checks=[],instance*/
 
diff --git a/tests/compiler/dart2js/rti/emission/marker.options b/tests/compiler/dart2js/rti/emission/marker.options
index bc69057..a072260 100644
--- a/tests/compiler/dart2js/rti/emission/marker.options
+++ b/tests/compiler/dart2js/rti/emission/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/rti/rti_emission_test.dart
-omit=tests/compiler/dart2js/rti/rti_emission_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/rti/rti_emission_test.dart
+prod:nnbd-off=tests/compiler/dart2js/rti/rti_emission_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/rti/rti_emission_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/rti/rti_emission_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart b/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
index 36f671d..9809bbc 100644
--- a/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
+++ b/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
@@ -28,12 +28,12 @@
 // inserts an implicit cast at the call-site or we disregard the forced check
 // because it is a static call.
 
-/*strong.class: Class1a:checkedInstance*/
-/*omit.class: Class1a:*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: Class1a:checkedInstance*/
+/*prod:nnbd-off.class: Class1a:*/
 class Class1a {}
 
-/*strong.class: Class1b:checkedInstance*/
-/*omit.class: Class1b:*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: Class1b:checkedInstance*/
+/*prod:nnbd-off.class: Class1b:*/
 class Class1b {}
 
 // Checks are needed both with and without --omit-implicit-checks.
@@ -52,12 +52,12 @@
 /*class: Class3b:*/
 class Class3b {}
 
-/*strong.class: Class4a:checkedInstance*/
-/*omit.class: Class4a:*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: Class4a:checkedInstance*/
+/*prod:nnbd-off.class: Class4a:*/
 class Class4a<T> {}
 
-/*strong.class: Class4b:checkedInstance*/
-/*omit.class: Class4b:*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: Class4b:checkedInstance*/
+/*prod:nnbd-off.class: Class4b:*/
 class Class4b<T> {}
 
 // Checks are needed both with and without --omit-implicit-checks.
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 668a859..bddb58e 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
@@ -5,8 +5,8 @@
 // @dart = 2.7
 
 main() {
-  /*strong.checks=[$signature],instance*/
-  /*omit.checks=[],instance*/
+  /*spec:nnbd-off|spec:nnbd-sdk.checks=[$signature],instance*/
+  /*prod:nnbd-off|prod:nnbd-sdk.checks=[],instance*/
   T id<T>(T t) => t;
   int Function(int) x = id;
   print("${x.runtimeType}");
diff --git a/tests/compiler/dart2js/rti/emission/static_argument.dart b/tests/compiler/dart2js/rti/emission/static_argument.dart
index 4230400..3730ece 100644
--- a/tests/compiler/dart2js/rti/emission/static_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/static_argument.dart
@@ -4,19 +4,18 @@
 
 // @dart = 2.7
 
-/*strong.class: I1:*/
-/*omit.class: I1:*/
+/*spec:nnbd-off|prod:nnbd-off.class: I1:*/
 class I1 {}
 
-/*strong.class: I2:checkedInstance*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: I2:checkedInstance*/
 class I2 {}
 
-/*strong.class: A:checks=[$isI2],instance*/
-/*omit.class: A:checks=[],instance*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A:checks=[$isI2],instance*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: A:checks=[],instance*/
 class A implements I1, I2 {}
 
-/*strong.class: B:checks=[$isI2],instance*/
-/*omit.class: B:checks=[],instance*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: B:checks=[$isI2],instance*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: B:checks=[],instance*/
 class B implements I1, I2 {}
 
 @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/emission/subtype_named_args.dart b/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
index def20ab..9478512 100644
--- a/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
+++ b/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
@@ -8,32 +8,32 @@
 
 import 'package:expect/expect.dart';
 
-/*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A {}
 
-/*strong.class: A1:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: A1:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A1:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: A1:checkedTypeArgument,checks=[],typeArgument*/
 class A1 {}
 
-/*strong.class: A2:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: A2:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A2:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: A2:checkedTypeArgument,checks=[],typeArgument*/
 class A2 {}
 
-/*strong.class: B:checkedInstance,checkedTypeArgument,checks=[$isA,$isA1,$isA2],typeArgument*/
-/*omit.class: B:checkedTypeArgument,checks=[$isA,$isA1,$isA2],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: B:checkedInstance,checkedTypeArgument,checks=[$isA,$isA1,$isA2],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: B:checkedTypeArgument,checks=[$isA,$isA1,$isA2],typeArgument*/
 class B implements A, A1, A2 {}
 
-/*strong.class: C:checkedInstance,checkedTypeArgument,checks=[$isA,$isA1,$isA2,$isB],typeArgument*/
-/*omit.class: C:checkedTypeArgument,checks=[$isA,$isA1,$isA2,$isB],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: C:checkedInstance,checkedTypeArgument,checks=[$isA,$isA1,$isA2,$isB],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: C:checkedTypeArgument,checks=[$isA,$isA1,$isA2,$isB],typeArgument*/
 class C implements B {}
 
-/*strong.class: D:checkedInstance,checkedTypeArgument,checks=[$isA,$isA1,$isA2,$isB,$isC],typeArgument*/
-/*omit.class: D:checkedTypeArgument,checks=[$isA,$isA1,$isA2,$isB,$isC],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: D:checkedInstance,checkedTypeArgument,checks=[$isA,$isA1,$isA2,$isB,$isC],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: D:checkedTypeArgument,checks=[$isA,$isA1,$isA2,$isB,$isC],typeArgument*/
 class D implements C {}
 
-/*strong.class: G:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: G:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: G:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: G:checkedTypeArgument,checks=[],typeArgument*/
 class G<T, S, U, W> {}
 
 typedef classesFunc({A a, B b, C c, D d});
@@ -55,23 +55,23 @@
 
 main() {
   Expect.isTrue(
-      /*strong.checks=[$signature],instance*/
-      /*omit.checks=[],instance*/
+      /*spec:nnbd-off|spec:nnbd-sdk.checks=[$signature],instance*/
+      /*prod:nnbd-off|prod:nnbd-sdk.checks=[],instance*/
       ({D a, B b, C c, A d}) {} is classesFunc);
   Expect.isTrue(
       /*checks=[$signature],instance*/
       ({A a, A b, A c, A d}) {} is classesFunc);
   Expect.isTrue(
-      /*strong.checks=[$signature],instance*/
-      /*omit.checks=[],instance*/
+      /*spec:nnbd-off|spec:nnbd-sdk.checks=[$signature],instance*/
+      /*prod:nnbd-off|prod:nnbd-sdk.checks=[],instance*/
       ({D a, A1 b, A1 c, A1 d}) {} is classesFunc);
   Expect.isTrue(
-      /*strong.checks=[$signature],instance*/
-      /*omit.checks=[],instance*/
+      /*spec:nnbd-off|spec:nnbd-sdk.checks=[$signature],instance*/
+      /*prod:nnbd-off|prod:nnbd-sdk.checks=[],instance*/
       ({D a, A2 b, A2 c, A2 d}) {} is classesFunc);
   Expect.isTrue(
-      /*strong.checks=[$signature],instance*/
-      /*omit.checks=[],instance*/
+      /*spec:nnbd-off|spec:nnbd-sdk.checks=[$signature],instance*/
+      /*prod:nnbd-off|prod:nnbd-sdk.checks=[],instance*/
       ({D a, D b, D c, D d}) {} is classesFunc);
   Expect.isTrue(
       /*checks=[$signature],instance*/
@@ -83,8 +83,8 @@
       ({Map<num, num> m, List<List<A1>> l, G<A, A1, A1, A1> g}) {}
           is genericsFunc);
   Expect.isTrue(
-      /*strong.checks=[$signature],instance*/
-      /*omit.checks=[],instance*/
+      /*spec:nnbd-off|spec:nnbd-sdk.checks=[$signature],instance*/
+      /*prod:nnbd-off|prod:nnbd-sdk.checks=[],instance*/
       ({Map<int, int> m, List<List<D>> l, G<D, D, D, D> g}) {} is genericsFunc);
   Expect.isTrue(
       /*checks=[$signature],instance*/
@@ -94,12 +94,12 @@
       ({Object m, Object l, Object g}) {} is genericsFunc);
 
   Expect.isTrue(
-      /*strong.checks=[$signature],instance*/
-      /*omit.checks=[],instance*/
+      /*spec:nnbd-off|spec:nnbd-sdk.checks=[$signature],instance*/
+      /*prod:nnbd-off|prod:nnbd-sdk.checks=[],instance*/
       ({A x, G y, mixFunc z, var v}) {} is dynamicFunc);
   Expect.isTrue(
-      /*strong.checks=[$signature],instance*/
-      /*omit.checks=[],instance*/
+      /*spec:nnbd-off|spec:nnbd-sdk.checks=[$signature],instance*/
+      /*prod:nnbd-off|prod:nnbd-sdk.checks=[],instance*/
       ({int x, bool y, List<Map> z, classesFunc v}) {} is dynamicFunc);
 
   Expect.isTrue(
diff --git a/tests/compiler/dart2js/rti/emission/tear_off_types.dart b/tests/compiler/dart2js/rti/emission/tear_off_types.dart
index 4381d93..7bf619c 100644
--- a/tests/compiler/dart2js/rti/emission/tear_off_types.dart
+++ b/tests/compiler/dart2js/rti/emission/tear_off_types.dart
@@ -36,12 +36,12 @@
 @pragma('dart2js:noInline')
 bool _test1(f) => f is A1<int> Function();
 
-/*strong.class: A2:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: A2:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A2:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: A2:checkedTypeArgument,checks=[],typeArgument*/
 class A2<T> {}
 
-/*strong.class: B2:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: B2:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: B2:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: B2:checkedTypeArgument,checks=[],typeArgument*/
 class B2 extends A2<int> {}
 
 @pragma('dart2js:noInline')
@@ -58,12 +58,12 @@
 @pragma('dart2js:noInline')
 bool _test2(f) => f is void Function(A2<int>);
 
-/*strong.class: A3:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: A3:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: A3:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: A3:checkedTypeArgument,checks=[],typeArgument*/
 class A3<T> {}
 
-/*strong.class: B3:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
-/*omit.class: B3:checkedTypeArgument,checks=[],typeArgument*/
+/*spec:nnbd-off|spec:nnbd-sdk.class: B3:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*prod:nnbd-off|prod:nnbd-sdk.class: B3:checkedTypeArgument,checks=[],typeArgument*/
 class B3 extends A3<int> {}
 
 @pragma('dart3js:noInline')
diff --git a/tests/compiler/dart2js/static_type/data/marker.options b/tests/compiler/dart2js/static_type/data/marker.options
index 95c2117..12bfcee 100644
--- a/tests/compiler/dart2js/static_type/data/marker.options
+++ b/tests/compiler/dart2js/static_type/data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/static_type/static_type_test.dart
-omit=tests/compiler/dart2js/static_type/static_type_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/static_type/static_type_test.dart
+prod:nnbd-off=tests/compiler/dart2js/static_type/static_type_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/static_type/static_type_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/static_type/static_type_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/static_type/static_type_test.dart b/tests/compiler/dart2js/static_type/static_type_test.dart
index 250f450..a2c679e 100644
--- a/tests/compiler/dart2js/static_type/static_type_test.dart
+++ b/tests/compiler/dart2js/static_type/static_type_test.dart
@@ -27,7 +27,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, new StaticTypeDataComputer(),
-        args: args, testedConfigs: [strongConfig]);
+        args: args, testedConfigs: allSpecConfigs);
   });
 }
 
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/marker.options b/tests/compiler/dart2js/static_type/type_promotion_data/marker.options
index c280594..d745ddd 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/marker.options
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/marker.options
@@ -1,2 +1,4 @@
-strong=tests/compiler/dart2js/static_type/type_promotion_test.dart
-omit=tests/compiler/dart2js/static_type/type_promotion_test.dart
\ No newline at end of file
+spec:nnbd-off=tests/compiler/dart2js/static_type/type_promotion_test.dart
+prod:nnbd-off=tests/compiler/dart2js/static_type/type_promotion_test.dart
+spec:nnbd-sdk=tests/compiler/dart2js/static_type/type_promotion_test.dart
+prod:nnbd-sdk=tests/compiler/dart2js/static_type/type_promotion_test.dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js_extra/regress/unused_generator_type_parameter_test.dart b/tests/compiler/dart2js_extra/regress/unused_generator_type_parameter_test.dart
new file mode 100644
index 0000000..65dba5b
--- /dev/null
+++ b/tests/compiler/dart2js_extra/regress/unused_generator_type_parameter_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.7
+
+import "package:expect/expect.dart";
+
+class Foo<X> {
+  // T is unused, so can be erased, but that should not break anything.  The
+  // generator should still have a header and a body since it needs to compute
+  // the return type.
+  Iterable<Set<X>> bar<T>() sync* {}
+}
+
+main() {
+  var f = Foo<String>();
+  var c = f.bar<int>();
+  Expect.isFalse(c.iterator is Iterator<Set<int>>);
+  Expect.isTrue(c.iterator is Iterator<Set<String>>);
+}
diff --git a/tests/language/async_star/await_for_test.dart b/tests/language/async_star/await_for_test.dart
index 13d8fc8..9f12002 100644
--- a/tests/language/async_star/await_for_test.dart
+++ b/tests/language/async_star/await_for_test.dart
@@ -24,7 +24,7 @@
   test('simple stream, await', () {
     f(Stream<int> s) async {
       var r = 0;
-      await for (var v in s) r += await Future.microtask(() => v);
+      await for (var v in s) r += await Future<int>.microtask(() => v);
       return r;
     }
 
@@ -57,7 +57,7 @@
   test('simple stream, await, reyield', () {
     f(Stream<int> s) async* {
       var r = 0;
-      await for (var v in s) yield r += await Future.microtask(() => v);
+      await for (var v in s) yield r += await Future<int>.microtask(() => v);
     }
 
     return expectList(f(mkStream(5)), [0, 1, 3, 6, 10]);
@@ -93,7 +93,7 @@
       var r = 0;
       await for (var i in mkStream(5)) {
         await for (var j in mkStream(3)) {
-          r += await Future.microtask(() => i * j);
+          r += await Future<int>.microtask(() => i * j);
         }
       }
       return r;
@@ -108,9 +108,9 @@
     f() async {
       var r = 0;
       await for (var i in mkStream(5)) {
-        var ai = await Future.microtask(() => i);
+        var ai = await Future<int>.microtask(() => i);
         await for (var j in mkStream(3)) {
-          r += await Future.microtask(() => ai * j);
+          r += await Future<int>.microtask(() => ai * j);
         }
       }
       return r;
@@ -136,7 +136,7 @@
     f(Stream<int> s) async {
       var r = 0;
       await for (var i in s) {
-        r += await Future.delayed(ms * 10, () => i);
+        r += await Future<int>.delayed(ms * 10, () => i);
       }
       return r;
     }
diff --git a/tests/language/constructor/constructor12_lib.dart b/tests/language/constructor/constructor12_lib.dart
new file mode 100644
index 0000000..70dfe76
--- /dev/null
+++ b/tests/language/constructor/constructor12_lib.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.
+
+// TODO(nshahan) Merge back into constructor12_test.dart along with the
+// expectation from constructor12_strong_test.dart after ending support for weak
+// mode.
+
+class B {
+  final z;
+  B(this.z);
+
+  foo() => this.z;
+}
+
+class A<T> extends B {
+  var captured, captured2;
+  var typedList;
+
+  // p must be inside a box (in dart2js).
+  A(p)
+      : captured = (() => p),
+        super(p++) {
+    // Make constructor body non-inlinable.
+    try {} catch (e) {}
+
+    captured2 = () => p++;
+
+    // In the current implementation of dart2js makes the generic type an
+    // argument to the body.
+    typedList = <T>[];
+  }
+
+  foo() => captured();
+  bar() => captured2();
+}
+
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
+confuse(x) => x;
diff --git a/tests/language/constructor/constructor12_strong_test.dart b/tests/language/constructor/constructor12_strong_test.dart
new file mode 100644
index 0000000..bcc2672
--- /dev/null
+++ b/tests/language/constructor/constructor12_strong_test.dart
@@ -0,0 +1,17 @@
+// 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.
+
+// Requirements=nnbd-strong
+
+// Copied from constructor12_test.dart to break out a single expectation that
+// is different in weak and strong modes.
+
+import "package:expect/expect.dart";
+
+import 'constructor12_lib.dart';
+
+main() {
+  var a2 = confuse(new A(2));
+  Expect.isFalse(a2 is A<Object>);
+}
diff --git a/tests/language/constructor/constructor12_test.dart b/tests/language/constructor/constructor12_test.dart
index 477955c..2af0ed2 100644
--- a/tests/language/constructor/constructor12_test.dart
+++ b/tests/language/constructor/constructor12_test.dart
@@ -4,38 +4,7 @@
 
 import "package:expect/expect.dart";
 
-class B {
-  final z;
-  B(this.z);
-
-  foo() => this.z;
-}
-
-class A<T> extends B {
-  var captured, captured2;
-  var typedList;
-
-  // p must be inside a box (in dart2js).
-  A(p)
-      : captured = (() => p),
-        super(p++) {
-    // Make constructor body non-inlinable.
-    try {} catch (e) {}
-
-    captured2 = () => p++;
-
-    // In the current implementation of dart2js makes the generic type an
-    // argument to the body.
-    typedList = <T>[];
-  }
-
-  foo() => captured();
-  bar() => captured2();
-}
-
-@pragma('dart2js:noInline')
-@pragma('dart2js:assumeDynamic')
-confuse(x) => x;
+import 'constructor12_lib.dart';
 
 main() {
   var a = confuse(new A<int>(1));
@@ -51,7 +20,9 @@
   Expect.isFalse(a is A<String>);
   Expect.isFalse(a2 is A<int>);
   Expect.isFalse(a2 is A<String>);
-  Expect.isFalse(a2 is A<Object>);
+  // TODO(nshahan) Move back from constructor12_strong_test.dart after ending
+  // support for weak mode.
+  // Expect.isFalse(a2 is A<Object>);
   Expect.isTrue(a2 is A<Object?>);
   Expect.equals(2, a.bar());
   Expect.equals(3, a2.bar());
diff --git a/tests/language/constructor/constructor12_weak_test.dart b/tests/language/constructor/constructor12_weak_test.dart
new file mode 100644
index 0000000..2a4d2f6
--- /dev/null
+++ b/tests/language/constructor/constructor12_weak_test.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.
+
+// Requirements=nnbd-weak
+
+// Copied from constructor12_test.dart to break out a single expectation that
+// is different in weak and strong modes.
+
+import "package:expect/expect.dart";
+
+import 'constructor12_lib.dart';
+
+main() {
+  var a2 = confuse(new A(2));
+  // Only true in weak mode.
+  Expect.isTrue(a2 is A<Object>);
+}
diff --git a/tests/language/control_flow_collections/for_dynamic_null_weak_test.dart b/tests/language/control_flow_collections/for_dynamic_null_weak_test.dart
index 0337e9c..5904782 100644
--- a/tests/language/control_flow_collections/for_dynamic_null_weak_test.dart
+++ b/tests/language/control_flow_collections/for_dynamic_null_weak_test.dart
@@ -14,8 +14,10 @@
 
   // Null iterable.
   dynamic nullIterable = null;
-  Expect.throwsAssertionError(() => <int>[for (var i in nullIterable) 1]);
-  Expect.throwsAssertionError(
-      () => <int, int>{for (var i in nullIterable) 1: 1});
-  Expect.throwsAssertionError(() => <int>{for (var i in nullIterable) 1});
+  // The current behavior is inconsistent across the backends. The VM currently
+  // tries calling .iterable and throws a NoSuchMethodError. DDC throws a
+  // TypeError.
+  Expect.throws(() => <int>[for (var i in nullIterable) 1]);
+  Expect.throws(() => <int, int>{for (var i in nullIterable) 1: 1});
+  Expect.throws(() => <int>{for (var i in nullIterable) 1});
 }
diff --git a/tests/language/dynamic_type_helper.dart b/tests/language/dynamic_type_helper.dart
new file mode 100644
index 0000000..cb14450
--- /dev/null
+++ b/tests/language/dynamic_type_helper.dart
@@ -0,0 +1,36 @@
+// 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.
+
+library dynamic_type_helper;
+
+import 'package:expect/expect.dart';
+
+/// Checks that a dynamic type error is thrown when [f] is executed
+/// and [expectTypeError] is `true`.
+void testDynamicTypeError(bool expectTypeError, f(), [String? message]) {
+  if (expectTypeError) {
+    checkDynamicTypeError(f, message);
+  } else {
+    checkNoDynamicTypeError(f, message);
+  }
+}
+
+/// Checks that a dynamic type error is thrown when f is executed.
+void checkDynamicTypeError(f(), [String? message]) {
+  message = message != null ? ': $message' : '';
+  try {
+    f();
+    Expect.fail('Missing type error$message.');
+  } on TypeError catch (e) {}
+}
+
+/// Checks that no dynamic type error is thrown when [f] is executed.
+void checkNoDynamicTypeError(f(), [String? message]) {
+  message = message != null ? ': $message' : '';
+  try {
+    f();
+  } on TypeError catch (e) {
+    Expect.fail('Unexpected type error$message.');
+  }
+}
diff --git a/tests/language/function/apply_generic2_test.dart b/tests/language/function/apply_generic2_test.dart
new file mode 100644
index 0000000..d45117a
--- /dev/null
+++ b/tests/language/function/apply_generic2_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+makeFn() {
+  return <T extends num>({T? a1, T? a2, T? a3, T? a4, T? a5}) {
+    return <T?>[a1, a2, a3, a4, a5];
+  };
+}
+
+staticFn<T extends num>({T? a1, T? a2, T? a3, T? a4, T? a5, T? xx}) {
+  return <T?>[a1, a2, a3, a4, a5, xx];
+}
+
+class CCC {
+  memberFn<T extends num>({T? a1, T? a2, T? a3, T? a4, T? a5, T? yy}) {
+    return <T?>[a1, a2, a3, a4, a5, yy];
+  }
+}
+
+check(a, b) {
+  print('a: $a\nb: $b');
+  Expect.equals(a.toString(), b.toString());
+}
+
+main() {
+  check('[null, 33, null, 11, 22, null]',
+      Function.apply(new CCC().memberFn, [], {#a4: 11, #a5: 22, #a2: 33}));
+
+  Expect.throwsTypeError(
+      () => Function.apply(new CCC().memberFn, [], {#a3: 'hi'}));
+
+  check('[11, 22, 33, null, null]',
+      Function.apply(makeFn(), [], {#a1: 11, #a2: 22, #a3: 33}));
+
+  check('[null, 33, null, 11, 22]',
+      Function.apply(makeFn(), [], {#a4: 11, #a5: 22, #a2: 33}));
+
+  Expect.throwsTypeError(() => Function.apply(makeFn(), [], {#a3: 'hi'}));
+
+  check('[null, 33, null, 11, 22, null]',
+      Function.apply(staticFn, [], {#a4: 11, #a5: 22, #a2: 33}));
+
+  Expect.throwsTypeError(() => Function.apply(staticFn, [], {#a3: 'hi'}));
+}
diff --git a/tests/language/function/apply_generic_test.dart b/tests/language/function/apply_generic_test.dart
new file mode 100644
index 0000000..4831e5d
--- /dev/null
+++ b/tests/language/function/apply_generic_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+List<T?> staticFn<T>(
+    [T? a1, T? a2, T? a3, T? a4, T? a5, T? a6, T? a7, T? a8, T? a9, T? a10]) {
+  return <T?>[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10];
+}
+
+class C<CT> {
+  List<T?> memberFn<T>(
+      [T? a1, T? a2, T? a3, T? a4, T? a5, T? a6, T? a7, T? a8, T? a9, T? a10]) {
+    return <T?>[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10];
+  }
+
+  // Intercepted, e.g. on JSArray.
+  List<T?> map<T>(
+      [T? a1, T? a2, T? a3, T? a4, T? a5, T? a6, T? a7, T? a8, T? a9, T? a10]) {
+    return <T?>[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10];
+  }
+}
+
+check(a, b) {
+  print('a: $a\nb: $b');
+  Expect.equals(a.toString(), b.toString());
+}
+
+main() {
+  check('[1, 2, 3, null, null, null, null, null, null, null]',
+      Function.apply(staticFn, [1, 2, 3]));
+
+  check('[1, 2, 3, 4, null, null, null, null, null, null]',
+      Function.apply(staticFn, [1, 2, 3, 4]));
+
+  check('[1, 2, 3, 4, 5, 6, 7, null, null, null]',
+      Function.apply(staticFn, [1, 2, 3, 4, 5, 6, 7]));
+
+  var o = new C<num>();
+  dynamic memberFn1 = o.map;
+
+  check('[1, 2, 3, null, null, null, null, null, null, null]',
+      Function.apply(memberFn1, [1, 2, 3]));
+
+  check('[1, 2, 3, 4, null, null, null, null, null, null]',
+      Function.apply(memberFn1, [1, 2, 3, 4]));
+
+  check('[1, 2, 3, 4, 5, 6, 7, null, null, null]',
+      Function.apply(memberFn1, [1, 2, 3, 4, 5, 6, 7]));
+
+  dynamic memberFn2 = o.memberFn;
+
+  check('[1, 2, 3, null, null, null, null, null, null, null]',
+      Function.apply(memberFn2, [1, 2, 3]));
+
+  check('[1, 2, 3, 4, null, null, null, null, null, null]',
+      Function.apply(memberFn2, [1, 2, 3, 4]));
+
+  check('[1, 2, 3, 4, 5, 6, 7, null, null, null]',
+      Function.apply(memberFn2, [1, 2, 3, 4, 5, 6, 7]));
+
+  // TODO(sra): Apply of instantiations
+}
diff --git a/tests/language/function/argument_test.dart b/tests/language/function/argument_test.dart
new file mode 100644
index 0000000..f56861a
--- /dev/null
+++ b/tests/language/function/argument_test.dart
@@ -0,0 +1,22 @@
+// 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 test for function passing.
+
+import "package:expect/expect.dart";
+
+class FunctionArgumentTest {
+  static testMe(Function f) {
+    return f();
+  }
+
+  static void testMain() {
+    Expect.equals(42, testMe(() {
+      return 42;
+    }));
+  }
+}
+
+main() {
+  FunctionArgumentTest.testMain();
+}
diff --git a/tests/language/function/call_generic_test.dart b/tests/language/function/call_generic_test.dart
new file mode 100644
index 0000000..de3b0bd
--- /dev/null
+++ b/tests/language/function/call_generic_test.dart
@@ -0,0 +1,83 @@
+// 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.
+// dart2jsOptions=-Ddart.isdart2js=true
+
+import "package:expect/expect.dart";
+
+@pragma('dart2js:noInline')
+List staticFn<T>([T? a1, T? a2, T? a3, T? a4, T? a5]) => [T, a1, a2, a3, a4, a5];
+
+class C {
+  @pragma('dart2js:noInline')
+  List memberFn<T>([T? a1, T? a2, T? a3, T? a4, T? a5]) => [T, a1, a2, a3, a4, a5];
+
+  @pragma('dart2js:noInline')
+  // 'map' is implemented by native iterables. On dart2js, 'map' has interceptor
+  // calling convention.
+  List map<T>([T? a1, T? a2, T? a3, T? a4, T? a5]) => [T, a1, a2, a3, a4, a5];
+}
+
+check(expected, actual) {
+  print('a:  $expected');
+  print('b:  $actual');
+  if (((actual[0] == Object && expected[0] == dynamic) ||
+          (actual[0] == dynamic && expected[0] == Object)) &&
+      !const bool.fromEnvironment('dart.isdart2js')) {
+    // TODO(32483): dartdevk sometimes defaults type to 'Object' when 'dynamic'
+    // is required. Remove this hack when fixed.
+    // TODO(31581): dart2js needs instantiate-to-bound to generic 'dynamic'
+    // instead of 'Object'.
+    actual = actual.toList()..[0] = expected[0];
+    print('b*: $actual');
+  }
+  Expect.equals(expected.toString(), actual.toString());
+}
+
+main() {
+  check([dynamic, 1, 2, 3, null, null], staticFn(1 as dynamic, 2, 3));
+
+  check([Object, 'Z', 2, 4, null, null], staticFn('Z', 2, 4));
+
+  check([int, 3, 2, 1, null, null], staticFn(3, 2, 1));
+
+  dynamic f1 = staticFn;
+
+  check([dynamic, 4, 2, 3, null, null], f1(4 as dynamic, 2, 3));
+
+  check([dynamic, 'Q', 2, 3, null, null], f1('Q', 2, 3));
+
+  check([dynamic, 6, 2, 3, null, null], f1(6, 2, 3));
+
+  check([int, 7, 2, null, null, null], f1<int>(7, 2));
+
+  var c = new C();
+
+  check([dynamic, 8, 2, 3, null, null], c.memberFn(8 as dynamic, 2, 3));
+
+  check([Object, 'A', 2, 3, null, null], c.memberFn('A', 2, 3));
+
+  check([int, 9, 2, 3, null, null], c.memberFn<int>(9, 2, 3));
+
+  check([dynamic, 10, 2, 3, null, null], c.map(10 as dynamic, 2, 3));
+
+  check([Object, 'B', 2, 3, null, null], c.map('B', 2, 3));
+
+  check([int, 11, 2, 3, null, null], c.map(11, 2, 3));
+
+  dynamic o = new C();
+
+  check([dynamic, 12, 2, 3, null, null], o.memberFn(12 as dynamic, 2, 3));
+
+  check([dynamic, 'C', 2, 3, null, null], o.memberFn('C', 2, 3));
+
+  check([int, 13, 2, null, null, null], o.memberFn<int>(13, 2));
+
+  check([dynamic, 14, 2, 3, null, null], o.map(14 as dynamic, 2, 3));
+
+  check([dynamic, 'D', 2, 3, null, null], o.map('D', 2, 3));
+
+  check([int, 15, null, null, null, null], o.map<int>(15));
+
+  check([int, 16, 2, 3, 4, null], o.map<int>(16, 2, 3, 4));
+}
diff --git a/tests/language/function/field_test.dart b/tests/language/function/field_test.dart
new file mode 100644
index 0000000..099a11d
--- /dev/null
+++ b/tests/language/function/field_test.dart
@@ -0,0 +1,20 @@
+// 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=--fatal-type-errors --enable_type_checks
+//
+// Test of calling Function, which is field of some class.
+
+import "package:expect/expect.dart";
+
+class Wrapper {
+  late Function f;
+}
+
+main() {
+  Wrapper w = new Wrapper();
+  w.f = () {
+    return 42;
+  };
+  Expect.equals(42, w.f());
+}
diff --git a/tests/language/function/function_test.dart b/tests/language/function/function_test.dart
new file mode 100644
index 0000000..201b8f1
--- /dev/null
+++ b/tests/language/function/function_test.dart
@@ -0,0 +1,378 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+// Tests function statements and expressions.
+
+class Bug4089219 {
+  int x;
+  var f;
+
+  Bug4089219(int i) : this.x = i {
+    f = () => x;
+  }
+}
+
+class Bug4342163 {
+  final m;
+  Bug4342163(int a) : this.m = (() => a) {}
+}
+
+class StaticFunctionDef {
+  static const int one = 1;
+  static var fn1;
+  static var fn2;
+  static var fn3;
+
+  static init() {
+    fn1 = () {
+      return one;
+    };
+    fn2 = () {
+      return (() {
+        return one;
+      })();
+    };
+    fn3 = () {
+      final local = 1;
+      return (() {
+        return local;
+      })();
+    };
+  }
+}
+
+class A {
+  var ma;
+  A(a) {
+    ma = a;
+  }
+}
+
+class B1 extends A {
+  final mfn;
+  B1(int a)
+      : this.mfn = (() {
+          return a;
+        }),
+        super(a);
+}
+
+class B2 extends A {
+  final mfn;
+  B2(int a)
+      : this.mfn = (() {
+          return a;
+        }),
+        super(2);
+}
+
+class B3 extends A {
+  final mfn;
+  B3(int a)
+      : this.mfn = (() {
+          return a;
+        }),
+        super(() {
+          return a;
+        });
+}
+
+typedef void Fisk();
+
+class FunctionTest {
+  FunctionTest() {}
+
+  static void testMain() {
+    var test = new FunctionTest();
+    test.testForEach();
+    test.testVarOrder1();
+    test.testVarOrder2();
+    test.testLexicalClosureRef1();
+    test.testLexicalClosureRef2();
+    test.testLexicalClosureRef3();
+    test.testLexicalClosureRef4();
+    test.testLexicalClosureRef5();
+    test.testDefaultParametersOrder();
+    test.testParametersOrder();
+    test.testFunctionDefaults1();
+    test.testFunctionDefaults2();
+    test.testEscapingFunctions();
+    test.testThisBinding();
+    test.testFnBindingInStatics();
+    test.testFnBindingInInitLists();
+    test.testSubclassConstructorScopeAlias();
+  }
+
+  void testSubclassConstructorScopeAlias() {
+    var b1 = new B1(10);
+    Expect.equals(10, (b1.mfn)());
+    Expect.equals(10, b1.ma);
+
+    var b2 = new B2(11);
+    Expect.equals(11, (b2.mfn)());
+    Expect.equals(2, b2.ma);
+
+    var b3 = new B3(12);
+    Expect.equals(12, (b3.mfn)());
+    Expect.equals(12, (b3.ma)());
+  }
+
+  void testFnBindingInInitLists() {
+    Expect.equals(1, (new Bug4342163(1).m)());
+  }
+
+  void testFnBindingInStatics() {
+    StaticFunctionDef.init();
+    Expect.equals(1, ((StaticFunctionDef.fn1)()));
+    Expect.equals(1, ((StaticFunctionDef.fn2)()));
+    Expect.equals(1, ((StaticFunctionDef.fn3)()));
+  }
+
+  Fisk testReturnVoidFunction() {
+    void f() {}
+    Fisk x = f;
+    return f;
+  }
+
+  void testVarOrder1() {
+    var a = 0, b = a++, c = a++;
+
+    Expect.equals(a, 2);
+    Expect.equals(b, 0);
+    Expect.equals(c, 1);
+  }
+
+  void testVarOrder2() {
+    var a = 0;
+    f() {
+      return a++;
+    }
+
+    ;
+    var b = f(), c = f();
+
+    Expect.equals(a, 2);
+    Expect.equals(b, 0);
+    Expect.equals(c, 1);
+  }
+
+  void testLexicalClosureRef1() {
+    var a = 1;
+    var f, g;
+    {
+      var b = 2;
+      f = () {
+        return b - a;
+      };
+    }
+
+    {
+      var b = 3;
+      g = () {
+        return b - a;
+      };
+    }
+    Expect.equals(1, f());
+    Expect.equals(2, g());
+  }
+
+  void testLexicalClosureRef2() {
+    var a = 1;
+    var f, g;
+    {
+      var b = 2;
+      f = () {
+        return (() {
+          return b - a;
+        })();
+      };
+    }
+
+    {
+      var b = 3;
+      g = () {
+        return (() {
+          return b - a;
+        })();
+      };
+    }
+    Expect.equals(1, f());
+    Expect.equals(2, g());
+  }
+
+  void testLexicalClosureRef3() {
+    var a = [];
+    for (int i = 0; i < 10; i++) {
+      var x = i;
+      a.add(() {
+        return x;
+      });
+    }
+
+    var sum = 0;
+    for (int i = 0; i < a.length; i++) {
+      sum += (a[i])() as int;
+    }
+
+    Expect.equals(45, sum);
+  }
+
+  void testLexicalClosureRef5() {
+    {
+      var a;
+      Expect.equals(null, a);
+      a = 1;
+      Expect.equals(1, a);
+    }
+
+    {
+      var a;
+      Expect.equals(null, a);
+      a = 1;
+      Expect.equals(1, a);
+    }
+  }
+
+  // Make sure labels are preserved, and a second 'i' does influence the first.
+  void testLexicalClosureRef4() {
+    var a = [];
+    x:
+    for (int i = 0; i < 10; i++) {
+      a.add(() {
+        return i;
+      });
+      continue x;
+    }
+
+    var sum = 0;
+    for (int i = 0; i < a.length; i++) {
+      sum += (a[i])() as int;
+    }
+
+    Expect.equals(45, sum);
+  }
+
+  int tempField = -1;
+
+  void testForEach() {
+    List<int> vals = [1, 2, 3];
+    int total = 0;
+    vals.forEach((int v) {
+      total += v;
+    });
+    Expect.equals(6, total);
+  }
+
+  void testDefaultParametersOrder() {
+    f([a = 1, b = 3]) {
+      return a - b;
+    }
+
+    Expect.equals(-2, f());
+  }
+
+  void testParametersOrder() {
+    f(a, b) {
+      return a - b;
+    }
+
+    Expect.equals(-2, f(1, 3));
+  }
+
+  void testFunctionDefaults1() {
+    // TODO(jimhug): This return null shouldn't be necessary.
+    f() {
+      return null;
+    }
+
+    ;
+    (([a = 10]) {
+      Expect.equals(10, a);
+    })();
+    ((a, [b = 10]) {
+      Expect.equals(10, b);
+    })(1);
+    (([a = 10]) {
+      Expect.equals(null, a);
+    })(f());
+    // FAILS: (([a = 10]) { Expect.equals(null ,a); })( f() );
+  }
+
+  void testFunctionDefaults2() {
+    Expect.equals(10, helperFunctionDefaults2());
+    Expect.equals(1, helperFunctionDefaults2(1));
+  }
+
+  num helperFunctionDefaults2([a = 10]) {
+    return (() {
+      return a;
+    })();
+  }
+
+  void testEscapingFunctions() {
+    f() {
+      return 42;
+    }
+
+    ;
+    (() {
+      Expect.equals(42, f());
+    })();
+    var o = new Bug4089219(42);
+    Expect.equals(42, (o.f)());
+  }
+
+  void testThisBinding() {
+    Expect.equals(this, () {
+      return this;
+    }());
+  }
+}
+
+typedef void Foo<A, B>(A a, B b);
+
+class Bar<A, B> {
+  Foo<A, B> field;
+  Bar(A a, B b) : this.field = ((A a1, B b2) {}) {
+    field(a, b);
+  }
+}
+
+typedef UntypedFunction(arg);
+typedef UntypedFunction2(arg);
+
+class UseFunctionTypes {
+  void test() {
+    Function? f = null;
+    UntypedFunction? uf = null;
+    UntypedFunction2? uf2 = null;
+    Foo? foo = null;
+    Foo<int, String>? fooIntString = null;
+    Foo<Object, Object>? fooObjectObject = null;
+
+    f = uf;
+    f = uf2;
+    f = foo;
+    f = fooIntString;
+
+    uf = f as UntypedFunction?;
+    uf2 = f;
+    foo = f as Foo?;
+    fooIntString = f as Foo<int, String>?;
+
+    fooIntString = foo as Foo<int, String>?;
+
+    foo = fooObjectObject as Foo?;
+    fooObjectObject = foo as Foo<Object, Object>?;
+
+    uf = uf2;
+    uf2 = uf;
+  }
+}
+
+main() {
+  FunctionTest.testMain();
+}
diff --git a/tests/language/function/getter_test.dart b/tests/language/function/getter_test.dart
new file mode 100644
index 0000000..efc483e
--- /dev/null
+++ b/tests/language/function/getter_test.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.
+
+import "package:expect/expect.dart";
+
+class A {
+  a() => 42;
+}
+
+main() {
+  Expect.equals(new A().a(), (new A().a)());
+}
diff --git a/tests/language/function/literals2_test.dart b/tests/language/function/literals2_test.dart
new file mode 100644
index 0000000..2b5de44
--- /dev/null
+++ b/tests/language/function/literals2_test.dart
@@ -0,0 +1,113 @@
+// 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 test for new function type alias.
+
+import "package:expect/expect.dart";
+
+class FunctionLiteralsTest {
+  static void testMain() {
+    f(x) {
+      return x * 2;
+    }
+
+    f(42); // make sure it is parsed as a function call
+    Expect.equals(20, f(10));
+
+    int g(x) {
+      return x * 2;
+    }
+
+    g(42); // make sure it is parsed as a function call
+    Expect.equals(20, g(10));
+
+    h(x) {
+      return x * 2;
+    }
+
+    h(42); // make sure it is parsed as a function call
+    Expect.equals(20, h(10));
+
+    dynamic a = (x) {
+      return x + 2;
+    };
+    Expect.equals(7, a(5));
+
+    Expect.equals(
+        10,
+        apply((k) {
+          return k << 1;
+        }, 5));
+    Expect.equals(20, apply((k) => k << 1, 10));
+
+    a = new A(3);
+    Expect.equals(-1, a.f);
+    Expect.equals(-3, a.f2);
+
+    a = new A.n(5);
+    Expect.equals(-2, a.f);
+    Expect.equals(2, a.f2);
+
+    Expect.equals(true, isOdd(5));
+    Expect.equals(false, isOdd(8));
+
+    var b = new B(10);
+    Expect.equals(10, b.n);
+    Expect.equals(100, (b.f)(10));
+
+    b = new B.withZ(10);
+    Expect.equals(10, b.n);
+    Expect.equals(101, (b.f)(10));
+
+    var c = new C(5);
+    Expect.equals("2*x is 10", c.s);
+
+    int x = 0;
+    int y = 1;
+    // make sure this isn't parsed as a generic type
+    Expect.isTrue(x < y, "foo");
+  }
+}
+
+int apply(f, n) {
+  return f(n) as int;
+}
+
+bool isOdd(b) => b % 2 == 1;
+
+class A {
+  int f = -1;
+  int f2 = -1;
+  A(p) : f = apply((j) => 2 - j, p) {
+    /* constr. body */
+    f2 = -p;
+  }
+  A.n(p) : f = 1 + apply((j) => 2 - j, p) {
+    /* constr. body */
+    f2 = -f;
+  }
+}
+
+class B {
+  var f;
+  int n = -1;
+  B(z) : f = ((x) => x * x) {
+    n = z;
+  }
+  B.withZ(z)
+      : f = ((x) {
+          return x * x + 1;
+        }) {
+    n = z;
+  }
+}
+
+class C {
+  String s;
+  C(x) : s = "2*x is ${() { return 2*x; }()}";
+}
+
+main() {
+  FunctionLiteralsTest.testMain();
+}
diff --git a/tests/language/function/literals_test.dart b/tests/language/function/literals_test.dart
new file mode 100644
index 0000000..e75ce3a
--- /dev/null
+++ b/tests/language/function/literals_test.dart
@@ -0,0 +1,112 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+/**
+ * Test various forms of function literals.
+ */
+typedef int IntFunc(int);
+
+class FunctionLiteralsTest {
+  static void checkIntFunction<T>(expected, int f(T x), arg) {
+    Expect.equals(expected, f(arg));
+  }
+
+  static void checkIntFuncFunction<T>(expected, IntFunc f(T x), arg) {
+    Expect.equals(expected, f(arg)(arg));
+  }
+
+  int func1(int x) => x;
+
+  int func2(x) => x;
+
+  int func3(int x) {
+    return x;
+  }
+
+  int func4(x) {
+    return x;
+  }
+
+  FunctionLiteralsTest() {}
+
+  static void testMain() {
+    var test = new FunctionLiteralsTest();
+    test.testArrow();
+    test.testArrowArrow();
+    test.testArrowBlock();
+    test.testBlock();
+    test.testBlockArrow();
+    test.testBlockBlock();
+    test.testFunctionRef();
+  }
+
+  void testArrow() {
+    checkIntFunction(42, (x) => x as int, 42);
+    checkIntFunction(42, (dynamic x) => x, 42);
+  }
+
+  void testArrowArrow() {
+    checkIntFuncFunction(84, (x) => (y) => (x as int) + (y as int), 42);
+    checkIntFuncFunction(84, (dynamic x) => (y) => x + y, 42);
+  }
+
+  void testArrowBlock() {
+    checkIntFuncFunction(
+        84,
+        (x) => (y) {
+              return (x as int) + (y as int);
+            },
+        42);
+    checkIntFuncFunction(
+        84,
+        (int x) => (y) {
+              return (x + y) as int;
+            },
+        42);
+  }
+
+  void testBlock() {
+    checkIntFunction(42, (x) {
+      return x as int;
+    }, 42);
+    checkIntFunction(42, (int x) {
+      return x;
+    }, 42);
+  }
+
+  void testBlockArrow() {
+    checkIntFuncFunction(84, (x) {
+      return (y) => (x as int) + (y as int);
+    }, 42);
+    checkIntFuncFunction(84, (int x) {
+      return (y) => (x + y) as int;
+    }, 42);
+  }
+
+  void testBlockBlock() {
+    checkIntFuncFunction(84, (x) {
+      return (y) {
+        return (x as int) + (y as int);
+      };
+    }, 42);
+    checkIntFuncFunction(84, (int x) {
+      return (y) {
+        return (x + y) as int;
+      };
+    }, 42);
+  }
+
+  void testFunctionRef() {
+    checkIntFunction(42, func1, 42);
+    checkIntFunction(42, func2, 42);
+    checkIntFunction(42, func3, 42);
+    checkIntFunction(42, func4, 42);
+  }
+}
+
+main() {
+  FunctionLiteralsTest.testMain();
+}
diff --git a/tests/language/function/local2_test.dart b/tests/language/function/local2_test.dart
new file mode 100644
index 0000000..44d2ef9
--- /dev/null
+++ b/tests/language/function/local2_test.dart
@@ -0,0 +1,45 @@
+// 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 test program testing closures.
+
+import "package:expect/expect.dart";
+
+typedef T F<T>(T t);
+
+class Parameterized<T> {
+  Parameterized() {}
+  T mul3(F<T> f, T t) {
+    return (3 as dynamic) * f(t);
+  }
+
+  T test(T t) {
+    return mul3((T t) {
+      return (3 as dynamic) * t;
+    }, t);
+  }
+}
+
+class LocalFunction2Test {
+  static int f(int n) {
+    int a = 0;
+    var g = (int n) {
+      a += n;
+      return a;
+    };
+    var h = (int n) {
+      a += 10 * n;
+      return a;
+    };
+    return g(n) + h(n);
+  }
+
+  static testMain() {
+    Expect.equals(3 + 33, f(3));
+    Expect.equals(9.0, new Parameterized<double>().test(1.0));
+  }
+}
+
+main() {
+  LocalFunction2Test.testMain();
+}
diff --git a/tests/language/function/local3_test.dart b/tests/language/function/local3_test.dart
new file mode 100644
index 0000000..46c3284
--- /dev/null
+++ b/tests/language/function/local3_test.dart
@@ -0,0 +1,39 @@
+// 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 test program testing closures.
+
+import "package:expect/expect.dart";
+
+class LocalFunction3Test {
+  static testExceptions() {
+    dynamic f = (int n) {
+      return n + 1;
+    };
+    Expect.equals(true, f is Object);
+    bool exception_caught = false;
+    try {
+      f.xyz(0);
+    } on NoSuchMethodError {
+      exception_caught = true;
+    }
+    Expect.equals(true, exception_caught);
+    exception_caught = false;
+    String f_string = "";
+    try {
+      f_string = f.toString();
+    } on NoSuchMethodError  {
+      exception_caught = true;
+    }
+    Expect.equals(false, exception_caught);
+    Expect.equals(true, f_string.startsWith("Closure"));
+  }
+
+  static testMain() {
+    testExceptions();
+  }
+}
+
+main() {
+  LocalFunction3Test.testMain();
+}
diff --git a/tests/language/function/local_function_test.dart b/tests/language/function/local_function_test.dart
new file mode 100644
index 0000000..4ed1bff
--- /dev/null
+++ b/tests/language/function/local_function_test.dart
@@ -0,0 +1,227 @@
+// 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 test program testing closures.
+
+import "package:expect/expect.dart";
+
+class LocalFunctionTest {
+  LocalFunctionTest()
+      : field1 = 100,
+        field2_ = 200 {}
+  static int f(int n) {
+    int a = 0;
+    g(int m) {
+      a = 3 * n + m + 1; // Capture parameter n and local a.
+      return a;
+    }
+
+    var b = g(n);
+    return a + b;
+  }
+
+  static int h(int n) {
+    k(int n) {
+      var a = new List<dynamic>.filled(n, null);
+      var b = new List<dynamic>.filled(n, null);
+      int i;
+      for (i = 0; i < n; i++) {
+        var j = i;
+        a[i] = () => i; // Captured i is always n.
+        b[i] = () => j; // Captured j varies from 0 to n-1.
+      }
+      var a_sum = 0;
+      var b_sum = 0;
+      for (int i = 0; i < n; i++) {
+        a_sum += a[i]() as int;
+        b_sum += b[i]() as int;
+      }
+      return a_sum + b_sum;
+    }
+
+    return k(n);
+  }
+
+  static int h2(int n) {
+    k(int n) {
+      var a = new List<dynamic>.filled(n, null);
+      var b = new List<dynamic>.filled(n, null);
+      for (int i = 0; i < n; i++) {
+        var j = i;
+        a[i] = () => i; // Captured i varies from 0 to n-1.
+        b[i] = () => j; // Captured j varies from 0 to n-1.
+      }
+      var a_sum = 0;
+      var b_sum = 0;
+      for (int i = 0; i < n; i++) {
+        a_sum += a[i]() as int;
+        b_sum += b[i]() as int;
+      }
+      return a_sum + b_sum;
+    }
+
+    return k(n);
+  }
+
+  int field1;
+  int field2_;
+  int get field2 {
+    return field2_;
+  }
+
+  void set field2(int value) {
+    field2_ = value;
+  }
+
+  int method(int n) {
+    incField1() {
+      field1++;
+    }
+
+    incField2() {
+      field2++;
+    }
+
+    for (int i = 0; i < n; i++) {
+      incField1();
+      incField2();
+    }
+    return field1 + field2;
+  }
+
+  int execute(int times, apply(int x)) {
+    for (int i = 0; i < times; i++) {
+      apply(i);
+    }
+    return field1;
+  }
+
+  int testExecute(int n) {
+    execute(n, (int x) {
+      field1 += x;
+    });
+    return field1;
+  }
+
+  static int foo(int n) {
+    return -100; // Wrong foo.
+  }
+
+  static testSelfReference1(int n) {
+    int foo(int n) {
+      if (n == 0) {
+        return 0;
+      } else {
+        return 1 + foo(n - 1); // Local foo, not static foo.
+      }
+    }
+
+    ;
+    return foo(n); // Local foo, not static foo.
+  }
+
+  static void hep(Function f) {
+    f();
+  }
+
+  static testNesting(int n) {
+    var a = new List<dynamic>.filled(n * n, null);
+    f0() {
+      for (int i = 0; i < n; i++) {
+        int vi = i;
+        f1() {
+          for (int j = 0; j < n; j++) {
+            int vj = j;
+            a[i * n + j] = () => vi * n + vj;
+          }
+        }
+
+        f1();
+      }
+    }
+
+    f0();
+    int result = 0;
+    for (int k = 0; k < n * n; k++) {
+      Expect.equals(k, a[k]());
+      result += a[k]() as int;
+    }
+    return result;
+  }
+
+  static var field5;
+  static var set_field5_func;
+  static testClosureCallStatement(int x) {
+    LocalFunctionTest.set_field5_func = (int n) {
+      field5 = n * n;
+    };
+    (LocalFunctionTest.set_field5_func)(x);
+    Expect.equals(x * x, LocalFunctionTest.field5);
+    return true;
+  }
+
+  static testExceptions() {
+    dynamic f = (int n) => n + 1;
+    Expect.equals(2, f(1));
+    Expect.equals(true, f is Function);
+    Expect.equals(true, f is Object);
+    Expect.equals(true, f.toString().startsWith("Closure"));
+    bool exception_caught = false;
+    try {
+      f(1, 2);
+    } on NoSuchMethodError catch (e) {
+      exception_caught = true;
+    }
+    Expect.equals(true, exception_caught);
+    exception_caught = false;
+    try {
+      f();
+    } on NoSuchMethodError catch (e) {
+      exception_caught = true;
+    }
+    Expect.equals(true, exception_caught);
+    exception_caught = false;
+    try {
+      f.xyz(0);
+    } on NoSuchMethodError catch (e) {
+      exception_caught = true;
+    }
+    Expect.equals(true, exception_caught);
+
+    // Overwrite closure value.
+    f = 3;
+    exception_caught = false;
+    try {
+      f(1);
+    } on NoSuchMethodError catch (e) {
+      exception_caught = true;
+    }
+    Expect.equals(true, exception_caught);
+
+    // Do not expect any exceptions to be thrown.
+    var g = ([int n = 1]) => n + 1;
+    Expect.equals(2, g());
+    Expect.equals(3, g(2));
+  }
+
+  static int doThis(int n, int f(int n)) {
+    return f(n);
+  }
+
+  static testMain() {
+    Expect.equals(2 * (3 * 2 + 2 + 1), f(2));
+    Expect.equals(10 * 10 + 10 * 9 / 2, h(10));
+    Expect.equals(90, h2(10));
+    Expect.equals(320, new LocalFunctionTest().method(10));
+    Expect.equals(145, new LocalFunctionTest().testExecute(10));
+    Expect.equals(5, testSelfReference1(5));
+    Expect.equals(24 * 25 / 2, testNesting(5));
+    Expect.equals(true, testClosureCallStatement(7));
+    Expect.equals(99, doThis(10, (n) => n * n - 1));
+    testExceptions();
+  }
+}
+
+main() {
+  LocalFunctionTest.testMain();
+}
diff --git a/tests/language/function/local_non_equal_test.dart b/tests/language/function/local_non_equal_test.dart
new file mode 100644
index 0000000..5fbaf57
--- /dev/null
+++ b/tests/language/function/local_non_equal_test.dart
@@ -0,0 +1,33 @@
+// 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 "package:expect/expect.dart";
+
+foo() => () => 42;
+bar() {
+  var c = () => 54;
+  return c;
+}
+
+baz() {
+  c() => 68;
+  return c;
+}
+
+main() {
+  var first = foo();
+  var second = foo();
+  Expect.isFalse(identical(first, second));
+  Expect.notEquals(first, second);
+
+  first = bar();
+  second = bar();
+  Expect.isFalse(identical(first, second));
+  Expect.notEquals(first, second);
+
+  first = baz();
+  second = baz();
+  Expect.isFalse(identical(first, second));
+  Expect.notEquals(first, second);
+}
diff --git a/tests/language/function/malformed_result_type_runtime_test.dart b/tests/language/function/malformed_result_type_runtime_test.dart
new file mode 100644
index 0000000..02b26b4
--- /dev/null
+++ b/tests/language/function/malformed_result_type_runtime_test.dart
@@ -0,0 +1,16 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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 test for a function with a malformed result type.
+
+import "package:expect/expect.dart";
+
+class C<T, U> {}
+
+main() {
+
+}
diff --git a/tests/language/function/malformed_result_type_test.dart b/tests/language/function/malformed_result_type_test.dart
new file mode 100644
index 0000000..182258b
--- /dev/null
+++ b/tests/language/function/malformed_result_type_test.dart
@@ -0,0 +1,16 @@
+// 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 test for a function with a malformed result type.
+
+import "package:expect/expect.dart";
+
+class C<T, U> {}
+
+main() {
+  C<int> f() => throw "uncalled";
+//^^^^^^
+// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [cfe] Expected 2 type arguments.
+}
diff --git a/tests/language/function/propagation_test.dart b/tests/language/function/propagation_test.dart
new file mode 100644
index 0000000..9c6f7e6
--- /dev/null
+++ b/tests/language/function/propagation_test.dart
@@ -0,0 +1,23 @@
+// 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 "package:expect/expect.dart";
+
+class A {
+  int call(String str) => 499;
+}
+
+typedef int F(String str);
+
+main() {
+  var a = new A();
+  Expect.type<A>(a);
+  Expect.notType<F>(a);
+
+  Function a3 = new A();
+  Expect.notType<A>(a3);
+
+  F a4 = new A();
+  Expect.notType<A>(a4);
+}
diff --git a/tests/language/function/syntax_test.dart b/tests/language/function/syntax_test.dart
new file mode 100644
index 0000000..3baf2df
--- /dev/null
+++ b/tests/language/function/syntax_test.dart
@@ -0,0 +1,733 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+// Tests function statement and expression syntax.
+
+class FunctionSyntaxTest {
+  static void testMain
+/* //# 00: syntax error
+      ()
+*/ //# 00: continued
+  {
+    testNestedFunctions();
+    testFunctionExpressions();
+    testPrecedence();
+    testInitializers();
+    testFunctionParameter();
+    testFunctionIdentifierExpression();
+    testFunctionIdentifierStatement();
+  }
+
+  static void testNestedFunctions
+/* //# 01: syntax error
+      ()
+*/ //# 01: continued
+  {
+    // No types - braces.
+    nb0
+/* //# 02: syntax error
+        ()
+*/ //# 02: continued
+    {
+      return 42;
+    }
+
+    nb1
+/* //# 03: syntax error
+        (a)
+*/ //# 03: continued
+    {
+      return a;
+    }
+
+    nb2
+/* //# 04: syntax error
+        (a, b)
+*/ //# 04: continued
+    {
+      return a + b;
+    }
+
+    Expect.equals(42, nb0());
+    Expect.equals(87, nb1(87));
+    Expect.equals(1 + 2, nb2(1, 2));
+
+    // No types - arrows.
+    na0
+/* //# 05: syntax error
+        ()
+*/ //# 05: continued
+            =>
+            42;
+    na1
+/* //# 06: syntax error
+        (a)
+*/ //# 06: continued
+            =>
+            a;
+    na2
+/* //# 07: syntax error
+        (a, b)
+*/ //# 07: continued
+            =>
+            a + b;
+    Expect.equals(42, na0());
+    Expect.equals(87, na1(87));
+    Expect.equals(1 + 2, na2(1, 2));
+
+    // Return type - braces.
+    int rb0
+/* //# 08: syntax error
+        ()
+*/ //# 08: continued
+    {
+      return 42;
+    }
+
+    int rb1
+/* //# 09: syntax error
+        (a)
+*/ //# 09: continued
+    {
+      return a;
+    }
+
+    int rb2
+/* //# 10: syntax error
+        (a, b)
+*/ //# 10: continued
+    {
+      return a + b;
+    }
+
+    Expect.equals(42, rb0());
+    Expect.equals(87, rb1(87));
+    Expect.equals(1 + 2, rb2(1, 2));
+
+    // Return type - arrows.
+    int ra0
+/* //# 11: syntax error
+        ()
+*/ //# 11: continued
+            =>
+            42;
+    int ra1
+/* //# 12: syntax error
+        (a)
+*/ //# 12: continued
+            =>
+            a;
+    int ra2
+/* //# 13: syntax error
+        (a, b)
+*/ //# 13: continued
+            =>
+            a + b;
+    Expect.equals(42, ra0());
+    Expect.equals(87, ra1(87));
+    Expect.equals(1 + 2, ra2(1, 2));
+
+    // Fully typed - braces.
+    int fb1
+/* //# 14: syntax error
+        (int a)
+*/ //# 14: continued
+    {
+      return a;
+    }
+
+    int fb2
+/* //# 15: syntax error
+        (int a, int b)
+*/ //# 15: continued
+    {
+      return a + b;
+    }
+
+    Expect.equals(42, rb0());
+    Expect.equals(87, rb1(87));
+    Expect.equals(1 + 2, rb2(1, 2));
+
+    // Fully typed - arrows.
+    int fa1
+/* //# 16: syntax error
+        (int a)
+*/ //# 16: continued
+            =>
+            a;
+    int fa2
+/* //# 17: syntax error
+        (int a, int b)
+*/ //# 17: continued
+            =>
+            a + b;
+    Expect.equals(42, ra0());
+    Expect.equals(87, ra1(87));
+    Expect.equals(1 + 2, ra2(1, 2));
+
+    // Generic types - braces.
+    List<int> gb0
+/* //# 18: syntax error
+        ()
+*/ //# 18: continued
+    {
+      return [42];
+    }
+
+    List<int> gb1
+/* //# 19: syntax error
+        (List<int> a)
+*/ //# 19: continued
+    {
+      return a;
+    }
+
+    Expect.equals(42, gb0()[0]);
+    Expect.equals(87, gb1([87])[0]);
+
+    // Generic types - arrows.
+    List<int> ga0
+/* //# 20: syntax error
+        ()
+*/ //# 20: continued
+            =>
+            [42];
+    List<int> ga1
+/* //# 21: syntax error
+        (List<int> a)
+*/ //# 21: continued
+            =>
+            a;
+    Expect.equals(42, ga0()[0]);
+    Expect.equals(87, ga1([87])[0]);
+  }
+
+  static void testFunctionExpressions
+/* //# 22: syntax error
+      ()
+*/ //# 22: continued
+  {
+    eval0
+/* //# 23: syntax error
+        (fn)
+*/ //# 23: continued
+            =>
+            fn();
+    eval1
+/* //# 24: syntax error
+        (fn, a)
+*/ //# 24: continued
+            =>
+            fn(a);
+    eval2
+/* //# 25: syntax error
+        (fn, a, b)
+*/ //# 25: continued
+            =>
+            fn(a, b);
+
+    // No types - braces.
+    Expect.equals(42, eval0(
+/* //# 26: syntax error
+        ()
+*/ //# 26: continued
+        {
+      return 42;
+    }));
+    Expect.equals(
+        87,
+        eval1(
+/* //# 27: syntax error
+            (a)
+*/ //# 27: continued
+            {
+          return a;
+        }, 87));
+    Expect.equals(
+        1 + 2,
+        eval2(
+/* //# 28: syntax error
+            (a, b)
+*/ //# 28: continued
+            {
+          return a + b;
+        }, 1, 2));
+    Expect.equals(42, eval0(
+/* //# 29: syntax error
+        ()
+*/ //# 29: continued
+        {
+      return 42;
+    }));
+    Expect.equals(
+        87,
+        eval1(
+/* //# 30: syntax error
+            (a)
+*/ //# 30: continued
+            {
+          return a;
+        }, 87));
+    Expect.equals(
+        1 + 2,
+        eval2(
+/* //# 31: syntax error
+            (a, b)
+*/ //# 31: continued
+            {
+          return a + b;
+        }, 1, 2));
+
+    // No types - arrows.
+    Expect.equals(
+        42,
+        eval0(
+/* //# 32: syntax error
+            ()
+*/ //# 32: continued
+                =>
+                42));
+    Expect.equals(
+        87,
+        eval1(
+/* //# 33: syntax error
+            (a)
+*/ //# 33: continued
+                =>
+                a,
+            87));
+    Expect.equals(
+        1 + 2,
+        eval2(
+/* //# 34: syntax error
+            (a, b)
+*/ //# 34: continued
+                =>
+                a + b,
+            1,
+            2));
+    Expect.equals(
+        42,
+        eval0(
+/* //# 35: syntax error
+            ()
+*/ //# 35: continued
+                =>
+                42));
+    Expect.equals(
+        87,
+        eval1(
+/* //# 36: syntax error
+            (a)
+*/ //# 36: continued
+                =>
+                a,
+            87));
+    Expect.equals(
+        1 + 2,
+        eval2(
+/* //# 37: syntax error
+            (a, b)
+*/ //# 37: continued
+                =>
+                a + b,
+            1,
+            2));
+
+    // Argument types - braces.
+    Expect.equals(42, eval0(
+/* //# 44: syntax error
+        ()
+*/ //# 44: continued
+        {
+      return 42;
+    }));
+    Expect.equals(
+        87,
+        eval1(
+/* //# 45: syntax error
+            (int a)
+*/ //# 45: continued
+            {
+          return a;
+        }, 87));
+    Expect.equals(
+        1 + 2,
+        eval2(
+/* //# 46: syntax error
+            (int a, int b)
+*/ //# 46: continued
+            {
+          return a + b;
+        }, 1, 2));
+    Expect.equals(42, eval0(
+/* //# 47: syntax error
+        ()
+*/ //# 47: continued
+        {
+      return 42;
+    }));
+    Expect.equals(
+        87,
+        eval1(
+/* //# 48: syntax error
+            (int a)
+*/ //# 48: continued
+            {
+          return a;
+        }, 87));
+    Expect.equals(
+        1 + 2,
+        eval2(
+/* //# 49: syntax error
+            (int a, int b)
+*/ //# 49: continued
+            {
+          return a + b;
+        }, 1, 2));
+
+    // Argument types - arrows.
+    Expect.equals(
+        42,
+        eval0(
+/* //# 50: syntax error
+            ()
+*/ //# 50: continued
+                =>
+                42));
+    Expect.equals(
+        87,
+        eval1(
+/* //# 51: syntax error
+            (int a)
+*/ //# 51: continued
+                =>
+                a,
+            87));
+    Expect.equals(
+        1 + 2,
+        eval2(
+/* //# 52: syntax error
+            (int a, int b)
+*/ //# 52: continued
+                =>
+                a + b,
+            1,
+            2));
+    Expect.equals(
+        42,
+        eval0(
+/* //# 53: syntax error
+            ()
+*/ //# 53: continued
+                =>
+                42));
+    Expect.equals(
+        87,
+        eval1(
+/* //# 54: syntax error
+            (int a)
+*/ //# 54: continued
+                =>
+                a,
+            87));
+    Expect.equals(
+        1 + 2,
+        eval2(
+/* //# 55: syntax error
+            (int a, int b)
+*/ //# 55: continued
+                =>
+                a + b,
+            1,
+            2));
+  }
+
+  static void testPrecedence
+/* //# 64: syntax error
+      ()
+*/ //# 64: continued
+  {
+    expectEvaluatesTo
+/* //# 65: syntax error
+        (value, fn)
+*/ //# 65: continued
+    {
+      Expect.equals(value, fn());
+    }
+
+    // Assignment.
+    var x;
+    expectEvaluatesTo(42, () => x = 42);
+    Expect.equals(42, x);
+    x = 1;
+    expectEvaluatesTo(100, () => x += 99);
+    Expect.equals(100, x);
+    x = 1;
+    expectEvaluatesTo(87, () => x *= 87);
+    Expect.equals(87, x);
+
+    // Conditional.
+    expectEvaluatesTo(42, () => true ? 42 : 87);
+    expectEvaluatesTo(87, () => false ? 42 : 87);
+
+    // Logical or.
+    expectEvaluatesTo(true, () => true || true);
+    expectEvaluatesTo(true, () => true || false);
+    expectEvaluatesTo(true, () => false || true);
+    expectEvaluatesTo(false, () => false || false);
+
+    // Logical and.
+    expectEvaluatesTo(true, () => true && true);
+    expectEvaluatesTo(false, () => true && false);
+    expectEvaluatesTo(false, () => false && true);
+    expectEvaluatesTo(false, () => false && false);
+
+    // Bitwise operations.
+    expectEvaluatesTo(3, () => 1 | 2);
+    expectEvaluatesTo(2, () => 3 ^ 1);
+    expectEvaluatesTo(1, () => 3 & 1);
+
+    // Equality.
+    expectEvaluatesTo(true, () => 1 == 1);
+    expectEvaluatesTo(false, () => 1 != 1);
+    expectEvaluatesTo(true, () => identical(1, 1));
+    expectEvaluatesTo(false, () => !identical(1, 1));
+
+    // Relational.
+    expectEvaluatesTo(true, () => 1 <= 1);
+    expectEvaluatesTo(false, () => 1 < 1);
+    expectEvaluatesTo(false, () => 1 > 1);
+    expectEvaluatesTo(true, () => 1 >= 1);
+
+    // Is.
+    expectEvaluatesTo(true, () => 1 is int);
+    expectEvaluatesTo(true, () => 1.0 is double);
+
+    // Shift.
+    expectEvaluatesTo(2, () => 1 << 1);
+    expectEvaluatesTo(1, () => 2 >> 1);
+
+    // Additive.
+    expectEvaluatesTo(2, () => 1 + 1);
+    expectEvaluatesTo(1, () => 2 - 1);
+
+    // Multiplicative.
+    expectEvaluatesTo(2, () => 1 * 2);
+    expectEvaluatesTo(2.0, () => 4 / 2);
+    expectEvaluatesTo(2, () => 4 ~/ 2);
+    expectEvaluatesTo(0, () => 4 % 2);
+
+    // Negate.
+    expectEvaluatesTo(false, () => !true);
+
+    // Postfix / prefix.
+    var y = 0;
+    expectEvaluatesTo(0, () => y++);
+    expectEvaluatesTo(2, () => ++y);
+    expectEvaluatesTo(1, () => --y);
+    expectEvaluatesTo(1, () => y--);
+    Expect.equals(0, y);
+
+    // Selector.
+    fn
+/* //# 66: syntax error
+        ()
+*/ //# 66: continued
+            =>
+            42;
+    var list = [87];
+    expectEvaluatesTo(42, () => fn());
+    expectEvaluatesTo(1, () => list.length);
+    expectEvaluatesTo(87, () => list[0]);
+    expectEvaluatesTo(87, () => list.removeLast());
+  }
+
+  static void testInitializers
+/* //# 67: syntax error
+      ()
+*/ //# 67: continued
+  {
+    Expect.equals(42, (new C.cb0().fn)());
+    Expect.equals(43, (new C.ca0().fn)());
+    Expect.equals(44, (new C.cb1().fn)());
+    Expect.equals(45, (new C.ca1().fn)());
+    Expect.equals(46, (new C.cb2().fn)());
+    Expect.equals(47, (new C.ca2().fn)());
+    Expect.equals(48, (new C.cb3().fn)());
+    Expect.equals(49, (new C.ca3().fn)());
+
+    Expect.equals(52, (new C.nb0().fn)());
+    Expect.equals(53, (new C.na0().fn)());
+    Expect.equals(54, (new C.nb1().fn)());
+    Expect.equals(55, (new C.na1().fn)());
+    Expect.equals(56, (new C.nb2().fn)());
+    Expect.equals(57, (new C.na2().fn)());
+    Expect.equals(58, (new C.nb3().fn)());
+    Expect.equals(59, (new C.na3().fn)());
+
+    Expect.equals(62, (new C.rb0().fn)());
+    Expect.equals(63, (new C.ra0().fn)());
+    Expect.equals(64, (new C.rb1().fn)());
+    Expect.equals(65, (new C.ra1().fn)());
+    Expect.equals(66, (new C.rb2().fn)());
+    Expect.equals(67, (new C.ra2().fn)());
+    Expect.equals(68, (new C.rb3().fn)());
+    Expect.equals(69, (new C.ra3().fn)());
+  }
+
+  static void testFunctionParameter
+/* //# 68: syntax error
+      ()
+*/ //# 68: continued
+  {
+    f0(fn()) => fn();
+    Expect.equals(42, f0(() => 42));
+
+    f1(int fn()) => fn();
+    Expect.equals(87, f1(() => 87));
+
+    f2(fn(a)) => fn(42);
+    Expect.equals(43, f2((a) => a + 1));
+
+    f3(fn(int a)) => fn(42);
+    Expect.equals(44, f3((int a) => a + 2));
+  }
+
+  static void testFunctionIdentifierExpression
+/* //# 69: syntax error
+      ()
+*/ //# 69: continued
+  {
+    Expect.equals(
+        87,
+        (
+/* //# 70: syntax error
+            ()
+*/ //# 70: continued
+                =>
+                87)());
+  }
+
+  static void testFunctionIdentifierStatement
+/* //# 71: syntax error
+      ()
+*/ //# 71: continued
+  {
+    function
+/* //# 72: syntax error
+        ()
+*/ //# 72: continued
+            =>
+            42;
+    Expect.equals(42, function());
+    Expect.equals(true, function is Function);
+  }
+}
+
+class C {
+  C.cb0()
+      : fn = (() {
+          return 42;
+        }) {}
+  C.ca0() : fn = (() => 43) {}
+
+  C.cb1()
+      : fn = wrap(() {
+          return 44;
+        }) {}
+  C.ca1() : fn = wrap(() => 45) {}
+
+  C.cb2()
+      : fn = [
+          () {
+            return 46;
+          }
+        ][0] {}
+  C.ca2() : fn = [() => 47][0] {}
+
+  C.cb3()
+      : fn = {
+          'x': () {
+            return 48;
+          }
+        }['x'] {}
+  C.ca3() : fn = {'x': () => 49}['x'] {}
+
+  C.nb0()
+      : fn = (() {
+          return 52;
+        }) {}
+  C.na0() : fn = (() => 53) {}
+
+  C.nb1()
+      : fn = wrap(() {
+          return 54;
+        }) {}
+  C.na1() : fn = wrap(() => 55) {}
+
+  C.nb2()
+      : fn = [
+          () {
+            return 56;
+          }
+        ][0] {}
+  C.na2() : fn = [() => 57][0] {}
+
+  C.nb3()
+      : fn = {
+          'x': () {
+            return 58;
+          }
+        }['x'] {}
+  C.na3() : fn = {'x': () => 59}['x'] {}
+
+  C.rb0()
+      : fn = (() {
+          return 62;
+        }) {}
+  C.ra0() : fn = (() => 63) {}
+
+  C.rb1()
+      : fn = wrap(() {
+          return 64;
+        }) {}
+  C.ra1() : fn = wrap(() => 65) {}
+
+  C.rb2()
+      : fn = [
+          () {
+            return 66;
+          }
+        ][0] {}
+  C.ra2() : fn = [() => 67][0] {}
+
+  C.rb3()
+      : fn = {
+          'x': () {
+            return 68;
+          }
+        }['x'] {}
+  C.ra3() : fn = {'x': () => 69}['x'] {}
+
+  static wrap
+/* //# 73: syntax error
+      (fn)
+*/ //# 73: continued
+  {
+    return fn;
+  }
+
+  final fn;
+}
+
+main
+/* //# 74: syntax error
+    ()
+*/ //# 74: continued
+{
+  FunctionSyntaxTest.testMain();
+}
diff --git a/tests/language/function/type2_test.dart b/tests/language/function/type2_test.dart
new file mode 100644
index 0000000..42ca6ff
--- /dev/null
+++ b/tests/language/function/type2_test.dart
@@ -0,0 +1,20 @@
+// 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 "package:expect/expect.dart";
+
+class A<T> {
+  A(f) {
+    f(42);
+  }
+}
+
+class B<T> extends A<T> {
+  B() : super((T param) => 42);
+}
+
+main() {
+  var t = new B<int>();
+  Expect.throwsTypeError(() => new B<String>());
+}
diff --git a/tests/language/function/type3_test.dart b/tests/language/function/type3_test.dart
new file mode 100644
index 0000000..b21b3e0
--- /dev/null
+++ b/tests/language/function/type3_test.dart
@@ -0,0 +1,28 @@
+// 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 "package:expect/expect.dart";
+
+class A<T> {
+  @pragma('dart2js:noInline')
+  A();
+
+  @pragma('dart2js:noInline')
+  foo() => new B<T>();
+}
+
+class B<T> {
+  T bar() => throw "uncalled";
+}
+
+typedef F();
+typedef F2(x);
+
+// Dart2js realized that the generic type for A was not needed, but then used
+// it nevertheless when it constructed the closure.
+main() {
+  var f = new A<int>().foo().bar;
+  Expect.isTrue(f is F);
+  Expect.isFalse(f is F2);
+}
diff --git a/tests/language/function/type_alias10_test.dart b/tests/language/function/type_alias10_test.dart
new file mode 100644
index 0000000..664ad7a
--- /dev/null
+++ b/tests/language/function/type_alias10_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// Regression test for https://github.com/dart-lang/sdk/issues/30912.
+import 'package:expect/expect.dart';
+
+class Foo {}
+
+class Bar {}
+
+typedef Type Func<S extends Foo, T>(T s);
+
+class Baz<S extends Foo, T extends Bar> {
+  Func<S, Bar>? func;
+}
+
+void main() {
+  dynamic baz = new Baz();
+  Expect.isNull(baz.func);
+  baz.func = (Bar b) => b.runtimeType;
+  Expect.equals(baz.func(new Bar()), Bar);
+}
diff --git a/tests/language/function/type_alias2_test.dart b/tests/language/function/type_alias2_test.dart
new file mode 100644
index 0000000..59c3166
--- /dev/null
+++ b/tests/language/function/type_alias2_test.dart
@@ -0,0 +1,54 @@
+// 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_type_checks
+
+// Dart test for function type alias with optional parameters.
+import "package:expect/expect.dart";
+
+typedef int f1<T>([int? a, int? b, T? c]);
+typedef int f2<T>([int? a, int? b, T? d]);
+typedef int f3<T>({int? a, int? b, T? c});
+typedef int f4<T>({int? a, int? b, T? d});
+
+class A<T> {
+  int baz([int? a, int? b, T? c]) => -1;
+  int bar({int? a, int? b, T? c}) => -1;
+}
+
+int baz([int? a, int? b, int? c]) => -1;
+
+int bar({int? a, int? b, int? c}) => -1;
+
+main() {
+  Expect.isFalse(baz is f1);
+  Expect.isFalse(baz is f3);
+  Expect.isFalse(bar is f1);
+  Expect.isFalse(bar is f3);
+  Expect.isFalse(baz is f1);
+  Expect.isTrue(baz is f1<int>);
+  Expect.isTrue(bar is f3<int>);
+  Expect.isFalse(baz is f1<double>);
+  Expect.isFalse(bar is f3<double>);
+  Expect.isFalse(baz is f2);
+  Expect.isFalse(bar is f4);
+  Expect.isTrue(baz is f2<int>);
+  Expect.isFalse(bar is f2<int>);
+
+  A<int> a = new A<int>();
+  Expect.isTrue(a.baz is f1);
+  Expect.isFalse(a.baz is f3);
+  Expect.isFalse(a.bar is f1);
+  Expect.isTrue(a.bar is f3);
+  Expect.isTrue(a.baz is f1);
+  Expect.isTrue(a.baz is f1<Object>);
+  Expect.isTrue(a.bar is f3<Object>);
+  Expect.isTrue(a.baz is f1<int>);
+  Expect.isTrue(a.bar is f3<int>);
+  Expect.isTrue(a.baz is f1<double>);
+  Expect.isTrue(a.bar is f3<double>);
+  Expect.isTrue(a.baz is f2);
+  Expect.isFalse(a.bar is f4);
+  Expect.isTrue(a.baz is f2<Object>);
+  Expect.isFalse(a.bar is f2<Object>);
+}
diff --git a/tests/language/function/type_alias3_test.dart b/tests/language/function/type_alias3_test.dart
new file mode 100644
index 0000000..69ebd6e1
--- /dev/null
+++ b/tests/language/function/type_alias3_test.dart
@@ -0,0 +1,26 @@
+// 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 test for function type alias with an imported result type that happens
+// to have the same name as a type parameter.
+import "package:expect/expect.dart";
+import "../library11.dart" as lib11;
+
+typedef lib11.Library111<Library111> F<Library111>(
+    lib11.Library111<Library111> a, Library111 b);
+
+class A<T> {
+  T foo(T a, bool b) => throw "uncalled";
+}
+
+main() {
+  var a = new A<lib11.Library111<bool>>();
+  var b = new A<lib11.Library111<int>>();
+  Expect.isTrue(a.foo is! F);
+  Expect.isTrue(a.foo is F<bool>);
+  Expect.isTrue(a.foo is! F<int>);
+  Expect.isTrue(b.foo is! F);
+  Expect.isTrue(b.foo is! F<bool>);
+  Expect.isTrue(a.foo is! F<int>);
+}
diff --git a/tests/language/function/type_alias4_test.dart b/tests/language/function/type_alias4_test.dart
new file mode 100644
index 0000000..3bdba67
--- /dev/null
+++ b/tests/language/function/type_alias4_test.dart
@@ -0,0 +1,40 @@
+// 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 test for function type alias with a type parameter as result type.
+import "package:expect/expect.dart";
+
+typedef bool F<bool>(bool a); // 'bool' is not the boolean type.
+
+bool bar(bool a) => false;
+
+int baz(int a) => -1;
+
+class A<T> {
+  T foo(T a) => throw "uncalled";
+}
+
+main() {
+  Expect.isTrue(bar is! F);
+  Expect.isTrue(baz is! F);
+  Expect.isTrue(bar is! F<Object>);
+  Expect.isTrue(baz is! F<Object>);
+  Expect.isTrue(bar is F<bool>);
+  Expect.isTrue(baz is F<int>);
+  Expect.isTrue(bar is! F<int>);
+  Expect.isTrue(baz is! F<bool>);
+
+  var b = new A<bool>();
+  var i = new A<int>();
+  Expect.isTrue(b.foo is F, 'runtime type of covaraint parameters is Object');
+  Expect.isTrue(i.foo is F, 'runtime type of covaraint parameters is Object');
+  Expect.isTrue(
+      b.foo is F<Object>, 'runtime type of covaraint parameters is Object');
+  Expect.isTrue(
+      i.foo is F<Object>, 'runtime type of covaraint parameters is Object');
+  Expect.isTrue(b.foo is F<bool>);
+  Expect.isTrue(i.foo is F<int>);
+  Expect.isTrue(b.foo is! F<int>);
+  Expect.isTrue(i.foo is! F<bool>);
+}
diff --git a/tests/language/function/type_alias5_test.dart b/tests/language/function/type_alias5_test.dart
new file mode 100644
index 0000000..40d6309
--- /dev/null
+++ b/tests/language/function/type_alias5_test.dart
@@ -0,0 +1,17 @@
+// 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 test for illegally self referencing function type alias.
+
+typedef Handle Handle(String command); //# 00: compile-time error
+
+typedef F(F x); //# 01: compile-time error
+
+typedef A(B x); //# 02: compile-time error
+typedef B(A x); //# 02: continued
+
+main() {
+  Handle h; //# 00: continued
+  F f; //# 01: continued
+  A f; //# 02: continued
+}
diff --git a/tests/language/function/type_alias6_runtime_test.dart b/tests/language/function/type_alias6_runtime_test.dart
new file mode 100644
index 0000000..362fccf
--- /dev/null
+++ b/tests/language/function/type_alias6_runtime_test.dart
@@ -0,0 +1,31 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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 test for legally self referencing function type alias.
+
+import "package:expect/expect.dart";
+
+typedef F(
+    List
+
+        x);
+
+typedef D C();
+
+class D {
+  C foo() => throw "uncalled";
+  D bar() => throw "uncalled";
+}
+
+main() {
+  var f = (List x) {};
+  Expect.isTrue(f is F);
+  var g = (List<F> x) {};
+  Expect.isFalse(g is F);
+  var d = new D();
+  Expect.isTrue(d.foo is! C);
+  Expect.isTrue(d.bar is C);
+}
diff --git a/tests/language/function/type_alias6_test.dart b/tests/language/function/type_alias6_test.dart
new file mode 100644
index 0000000..f8e508d
--- /dev/null
+++ b/tests/language/function/type_alias6_test.dart
@@ -0,0 +1,29 @@
+// 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 test for legally self referencing function type alias.
+
+import "package:expect/expect.dart";
+
+typedef F(List<F> x);
+// [error line 8, column 1, length 21]
+// [analyzer] COMPILE_TIME_ERROR.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
+//      ^
+// [cfe] The typedef 'F' has a reference to itself.
+
+typedef D C();
+
+class D {
+  C foo() => throw "uncalled";
+  D bar() => throw "uncalled";
+}
+
+main() {
+  var f = (List x) {};
+  Expect.isTrue(f is F);
+  var g = (List<F> x) {};
+  Expect.isFalse(g is F);
+  var d = new D();
+  Expect.isTrue(d.foo is! C);
+  Expect.isTrue(d.bar is C);
+}
diff --git a/tests/language/function/type_alias7_test.dart b/tests/language/function/type_alias7_test.dart
new file mode 100644
index 0000000..79bd6e7
--- /dev/null
+++ b/tests/language/function/type_alias7_test.dart
@@ -0,0 +1,19 @@
+// 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.
+
+typedef void funcType([int arg]);
+
+typedef void badFuncType([int arg = 0]); //# 00: compile-time error
+
+typedef void badFuncType({int arg: 0}); //# 02: compile-time error
+
+class A
+  extends funcType // //# 01: compile-time error
+{}
+
+main() {
+  new A();
+  badFuncType f; //# 00: continued
+  badFuncType f; //# 02: continued
+}
diff --git a/tests/language/function/type_alias8_test.dart b/tests/language/function/type_alias8_test.dart
new file mode 100644
index 0000000..b272ed7
--- /dev/null
+++ b/tests/language/function/type_alias8_test.dart
@@ -0,0 +1,19 @@
+// 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.
+
+// Regression test for issue 9442.
+
+typedef dynamic GetFromThing<T extends Thing>(T target);
+
+typedef GetFromThing<T>? DefGetFromThing<T extends Thing>(dynamic def);
+
+class Thing {}
+
+class Test {
+  static final DefGetFromThing<Thing> fromThing = (dynamic def) {};
+}
+
+main() {
+  Test.fromThing(10);
+}
diff --git a/tests/language/function/type_alias9_runtime_test.dart b/tests/language/function/type_alias9_runtime_test.dart
new file mode 100644
index 0000000..1aa72a3
--- /dev/null
+++ b/tests/language/function/type_alias9_runtime_test.dart
@@ -0,0 +1,18 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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 test for legally self referencing function type alias.
+
+typedef void F(
+    List
+
+        l);
+typedef void G(List<F> l);
+
+main() {
+  F? foo(G? g) => g as F?;
+  foo(null);
+}
diff --git a/tests/language/function/type_alias9_test.dart b/tests/language/function/type_alias9_test.dart
new file mode 100644
index 0000000..71c0d7b
--- /dev/null
+++ b/tests/language/function/type_alias9_test.dart
@@ -0,0 +1,18 @@
+// 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 test for legally self referencing function type alias.
+
+typedef void F(List<G> l);
+// [error line 6, column 1, length 26]
+// [analyzer] COMPILE_TIME_ERROR.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
+//           ^
+// [cfe] The typedef 'F' has a reference to itself.
+typedef void G(List<F> l);
+// [error line 11, column 1, length 26]
+// [analyzer] COMPILE_TIME_ERROR.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
+
+main() {
+  F? foo(G? g) => g as F?;
+  foo(null);
+}
diff --git a/tests/language/function/type_alias_test.dart b/tests/language/function/type_alias_test.dart
new file mode 100644
index 0000000..9fc9f28
--- /dev/null
+++ b/tests/language/function/type_alias_test.dart
@@ -0,0 +1,125 @@
+// 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_type_checks
+//
+// Dart test for function type alias.
+
+import "package:expect/expect.dart";
+
+typedef Fun(Never a, Never b);
+
+typedef int IntFun(Never a, Never b);
+
+typedef bool BoolFun(Never a, Never b);
+
+typedef int CompareObj(Object a, Object b);
+
+typedef int CompareInt(int a, int b);
+
+typedef int CompareString(String a, String b, [bool swap]);
+
+typedef void Test();
+
+typedef ParameterizedFun1<T, U extends bool, V>(T t, U u);
+
+typedef List<T> ParameterizedFun2<T, U, V extends Map<T, int>>(
+    Map<T, int> t, U u);
+
+typedef void BoundsCheck<T extends num>(T arg);
+
+class FunctionTypeAliasTest {
+  FunctionTypeAliasTest() {}
+  static int test<T>(int compare(T a, T b), T a, T b) {
+    return compare(a, b);
+  }
+
+  foo(Test arg) {}
+  static bar() {
+    FunctionTypeAliasTest a = new FunctionTypeAliasTest();
+    a.foo(() {});
+    return 0;
+  }
+
+  static void testMain() {
+    int compareStrLen(String a, String b) {
+      return a.length - b.length;
+    }
+
+    Expect.isTrue(compareStrLen is Fun);
+    Expect.isTrue(compareStrLen is IntFun);
+    Expect.isTrue(compareStrLen is! BoolFun);
+    Expect.isTrue(compareStrLen is! CompareObj);
+    Expect.isTrue(compareStrLen is! CompareInt);
+    Expect.isTrue(compareStrLen is! CompareString);
+    Expect.equals(3, test(compareStrLen, "abcdef", "xyz"));
+
+    int compareStrLenSwap(String a, String b, [bool swap = false]) {
+      return swap ? (a.length - b.length) : (b.length - a.length);
+    }
+
+    Expect.isTrue(compareStrLenSwap is Fun);
+    Expect.isTrue(compareStrLenSwap is IntFun);
+    Expect.isTrue(compareStrLenSwap is! BoolFun);
+    Expect.isTrue(compareStrLenSwap is! CompareObj);
+    Expect.isTrue(compareStrLenSwap is! CompareInt);
+    Expect.isTrue(compareStrLenSwap is CompareString);
+
+    int compareStrLenReverse(String a, String b, [bool reverse = false]) {
+      return reverse ? (a.length - b.length) : (b.length - a.length);
+    }
+
+    Expect.isTrue(compareStrLenReverse is Fun);
+    Expect.isTrue(compareStrLenReverse is IntFun);
+    Expect.isTrue(compareStrLenReverse is! BoolFun);
+    Expect.isTrue(compareStrLenReverse is! CompareObj);
+    Expect.isTrue(compareStrLenReverse is! CompareInt);
+    Expect.isTrue(compareStrLenReverse is CompareString);
+
+    int compareObj(Object a, Object b) {
+      return identical(a, b) ? 0 : -1;
+    }
+
+    Expect.isTrue(compareObj is Fun);
+    Expect.isTrue(compareObj is IntFun);
+    Expect.isTrue(compareObj is! BoolFun);
+    Expect.isTrue(compareObj is CompareObj);
+    Expect.isTrue(compareObj is CompareInt);
+    Expect.isTrue(compareObj is! CompareString);
+    Expect.equals(-1, test(compareObj, "abcdef", "xyz"));
+
+    CompareInt minus = (int a, int b) {
+      return a - b;
+    };
+    Expect.isTrue(minus is Fun);
+    Expect.isTrue(minus is IntFun);
+    Expect.isTrue(minus is! BoolFun);
+    Expect.isTrue(minus is! CompareObj);
+    Expect.isTrue(minus is CompareInt);
+    Expect.isTrue(minus is! CompareString);
+    Expect.equals(99, test(minus, 100, 1));
+
+    int plus(int a, [int b = 1]) {
+      return a + b;
+    }
+
+    ;
+    Expect.isTrue(plus is Fun);
+    Expect.isTrue(plus is IntFun);
+    Expect.isTrue(plus is! BoolFun);
+    Expect.isTrue(plus is! CompareObj);
+    Expect.isTrue(plus is CompareInt);
+    Expect.isTrue(plus is! CompareString);
+
+    Expect.equals(0, bar());
+
+    Function boundsTrue = (num arg) {};
+    Function boundsFalse = (String arg) {};
+    Expect.isTrue(boundsTrue is BoundsCheck<int>);
+    Expect.isFalse(boundsFalse is BoundsCheck<num>);
+  }
+}
+
+main() {
+  FunctionTypeAliasTest.testMain();
+}
diff --git a/tests/language/function/type_call_getter2_runtime_test.dart b/tests/language/function/type_call_getter2_runtime_test.dart
new file mode 100644
index 0000000..689328b
--- /dev/null
+++ b/tests/language/function/type_call_getter2_runtime_test.dart
@@ -0,0 +1,76 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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 "package:expect/expect.dart";
+
+class A {
+  final call = null;
+}
+
+class B {
+  get call => null;
+}
+
+class C {
+  set call(x) {}
+}
+
+typedef int F(String str);
+
+main() {
+  A a = new A();
+  B b = new B();
+  C c = new C();
+
+  final
+
+      a2 = a;
+
+  final
+
+      a3 = a;
+
+  final
+
+      b2 = b;
+
+  final
+
+      b3 = b;
+
+  final
+
+      c2 = c;
+
+  final
+
+      c3 = c;
+
+  Expect.throwsTypeError(() {
+    Function a4 = a as dynamic;
+  });
+
+  Expect.throwsTypeError(() {
+    F a5 = a as dynamic;
+  });
+
+  Expect.throwsTypeError(() {
+    Function b4 = b as dynamic;
+  });
+
+  Expect.throwsTypeError(() {
+    F b5 = b as dynamic;
+  });
+
+  Expect.throwsTypeError(() {
+    Function c4 = c as dynamic;
+  });
+
+  Expect.throwsTypeError(() {
+    F c5 = c as dynamic;
+  });
+}
diff --git a/tests/language/function/type_call_getter2_test.dart b/tests/language/function/type_call_getter2_test.dart
new file mode 100644
index 0000000..c52cb9e
--- /dev/null
+++ b/tests/language/function/type_call_getter2_test.dart
@@ -0,0 +1,91 @@
+// 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 "package:expect/expect.dart";
+
+class A {
+  final call = null;
+}
+
+class B {
+  get call => null;
+}
+
+class C {
+  set call(x) {}
+}
+
+typedef int F(String str);
+
+main() {
+  A a = new A();
+  B b = new B();
+  C c = new C();
+
+  final
+      Function
+      a2 = a;
+      //   ^
+      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [cfe] A value of type 'A' can't be assigned to a variable of type 'Function'.
+
+  final
+      F
+      a3 = a;
+      //   ^
+      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [cfe] A value of type 'A' can't be assigned to a variable of type 'int Function(String)'.
+
+  final
+      Function
+      b2 = b;
+      //   ^
+      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [cfe] A value of type 'B' can't be assigned to a variable of type 'Function'.
+
+  final
+      F
+      b3 = b;
+      //   ^
+      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [cfe] A value of type 'B' can't be assigned to a variable of type 'int Function(String)'.
+
+  final
+      Function
+      c2 = c;
+      //   ^
+      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [cfe] A value of type 'C' can't be assigned to a variable of type 'Function'.
+
+  final
+      F
+      c3 = c;
+      //   ^
+      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [cfe] A value of type 'C' can't be assigned to a variable of type 'int Function(String)'.
+
+  Expect.throwsTypeError(() {
+    Function a4 = a as dynamic;
+  });
+
+  Expect.throwsTypeError(() {
+    F a5 = a as dynamic;
+  });
+
+  Expect.throwsTypeError(() {
+    Function b4 = b as dynamic;
+  });
+
+  Expect.throwsTypeError(() {
+    F b5 = b as dynamic;
+  });
+
+  Expect.throwsTypeError(() {
+    Function c4 = c as dynamic;
+  });
+
+  Expect.throwsTypeError(() {
+    F c5 = c as dynamic;
+  });
+}
diff --git a/tests/language/function/type_call_getter_test.dart b/tests/language/function/type_call_getter_test.dart
new file mode 100644
index 0000000..52ecbaa
--- /dev/null
+++ b/tests/language/function/type_call_getter_test.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 "package:expect/expect.dart";
+
+class A {
+  final call = null;
+}
+
+class B {
+  get call => null;
+}
+
+class C {
+  set call(x) {}
+}
+
+typedef int F(String str);
+
+main() {
+  Expect.isFalse(new A() is Function);
+  Expect.isFalse(new B() is Function);
+  Expect.isFalse(new C() is Function);
+  Expect.isFalse(new A() is F);
+  Expect.isFalse(new B() is F);
+  Expect.isFalse(new C() is F);
+}
diff --git a/tests/language/function/type_in_constant_test.dart b/tests/language/function/type_in_constant_test.dart
new file mode 100644
index 0000000..ca9db12
--- /dev/null
+++ b/tests/language/function/type_in_constant_test.dart
@@ -0,0 +1,23 @@
+// 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 that consts can be created with inlined function types as type
+/// arguments.
+
+import 'package:expect/expect.dart';
+
+class A<T> {
+  const A();
+}
+
+@pragma('dart2js:noInline')
+test(a, b) {
+  Expect.notEquals(a, b);
+}
+
+main() {
+  test(const A<int Function()>(), const A<String Function()>());
+  test(const A<int>(), const A<String Function()>());
+  test(const A<int Function()>(), const A<String>());
+}
diff --git a/tests/language/function/type_parameter2_test.dart b/tests/language/function/type_parameter2_test.dart
new file mode 100644
index 0000000..4a30d5a
--- /dev/null
+++ b/tests/language/function/type_parameter2_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// Test to check that we can parse closure type formal parameters with
+// default value.
+
+import "package:expect/expect.dart";
+
+class FunctionTypeParameterTest {
+  static var formatter;
+
+  static SetFormatter([String fmt(int i)? = null]) {
+    formatter = fmt;
+  }
+
+  static void testMain() {
+    Expect.equals(null, formatter);
+    SetFormatter((i) => "$i");
+    Expect.equals(false, null == formatter);
+    Expect.equals("1234", formatter(1230 + 4));
+    SetFormatter();
+    Expect.equals(null, formatter);
+  }
+}
+
+main() {
+  FunctionTypeParameterTest.testMain();
+}
diff --git a/tests/language/function/type_parameter3_test.dart b/tests/language/function/type_parameter3_test.dart
new file mode 100644
index 0000000..cb79201
--- /dev/null
+++ b/tests/language/function/type_parameter3_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Test that we detect that a function literal is not
+/// a compile time constant.
+
+test([String fmt(int i) = (i) => "$i"]) {}
+//                        ^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_DEFAULT_VALUE
+// [cfe] Not a constant expression.
+//                                 ^
+// [cfe] Not a constant expression.
+
+main() {
+  test();
+}
diff --git a/tests/language/function/type_parameter_bound_object_test.dart b/tests/language/function/type_parameter_bound_object_test.dart
new file mode 100644
index 0000000..61486c2f
--- /dev/null
+++ b/tests/language/function/type_parameter_bound_object_test.dart
@@ -0,0 +1,17 @@
+// 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.
+
+Q hest<Q>(dynamic x) {
+  if (x is Q) return x;
+  throw "unreached";
+}
+
+Q Function<Q>(dynamic) pony = hest;
+Q Function<Q extends Object?>(dynamic) zebra = hest;
+
+main() {
+  hest(42).fisk(); //# 01: runtime error
+  pony(42).fisk(); //# 02: runtime error
+  zebra(42).fisk(); //# 03: compile-time error
+}
diff --git a/tests/language/function/type_parameter_test.dart b/tests/language/function/type_parameter_test.dart
new file mode 100644
index 0000000..4f18fb8
--- /dev/null
+++ b/tests/language/function/type_parameter_test.dart
@@ -0,0 +1,32 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+// Test to check that we can parse closure type formal parameters with
+// default value.
+
+class A {
+  final f;
+  A(int this.f());
+  const A.nother(int this.f());
+
+  static Function? func;
+
+  static SetFunc([String fmt(int i)? = null]) {
+    func = fmt;
+  }
+}
+
+main() {
+  Expect.equals(null, A.func);
+  A.SetFunc((i) => "$i");
+  Expect.equals(false, null == A.func);
+  Expect.equals("1234", A.func!(1230 + 4));
+  A.SetFunc();
+  Expect.equals(null, A.func);
+
+  Expect.equals(42, new A(() => 42).f());
+  Expect.equals(42, new A.nother(() => 42).f());
+}
diff --git a/tests/language/function/type_test.dart b/tests/language/function/type_test.dart
new file mode 100644
index 0000000..0812e71
--- /dev/null
+++ b/tests/language/function/type_test.dart
@@ -0,0 +1,17 @@
+// 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 test for a function type test that cannot be eliminated at compile time.
+import "package:expect/expect.dart";
+
+typedef FListInt(List<int> l);
+
+main() {
+  Expect.throwsTypeError(() {
+    // Static result type of f(), i.e. FList, is a subtype of FListInt.
+    // However, run time type of returned function is not a subtype of FListInt.
+    // Run time type check should not be eliminated.
+    FListInt fli = ((List<String> l) => null) as dynamic;
+  });
+}
diff --git a/tests/language/function/type_this_parameter_test.dart b/tests/language/function/type_this_parameter_test.dart
new file mode 100644
index 0000000..4ce65c7
--- /dev/null
+++ b/tests/language/function/type_this_parameter_test.dart
@@ -0,0 +1,17 @@
+// 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.
+// Check that function types are accepted for constructor arguments that
+// initialize fields.
+
+import "package:expect/expect.dart";
+
+class A {
+  Function f;
+  A(int this.f());
+}
+
+main() {
+  var a = new A(() => 499);
+  Expect.equals(499, (a.f)());
+}
diff --git a/tests/language/library1.dart b/tests/language/library1.dart
new file mode 100644
index 0000000..96cdd1b
--- /dev/null
+++ b/tests/language/library1.dart
@@ -0,0 +1,18 @@
+// 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 library1.dart;
+
+var foo;
+
+bar() => "library1.dart bar()";
+
+baz() => "library1.dart baz()";
+
+var bay;
+
+typedef int bax(int a, int b);
+
+class baw {}
diff --git a/tests/language/library10.dart b/tests/language/library10.dart
new file mode 100644
index 0000000..afa22f6
--- /dev/null
+++ b/tests/language/library10.dart
@@ -0,0 +1,40 @@
+// 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 library10.dart;
+
+import "library11.dart" as lib11;
+import "package:expect/expect.dart";
+
+class Library10 {
+  Library10(this.fld);
+  int func() {
+    return 2;
+  }
+
+  var fld;
+  static int static_func() {
+    var result = 0;
+    var obj = new lib11.Library11(4);
+    result = obj.fld;
+    Expect.equals(4, result);
+    result += obj.func();
+    Expect.equals(7, result);
+    result += lib11.Library11.static_func();
+    Expect.equals(9, result);
+    result += lib11.Library11.static_fld;
+    Expect.equals(10, result);
+    Expect.equals(100, lib11.top_level11);
+    Expect.equals(200, lib11.top_level_func11());
+    return 3;
+  }
+
+  static var static_fld = 4;
+}
+
+const int top_level10 = 10;
+int top_level_func10() {
+  return 20;
+}
diff --git a/tests/language/library11.dart b/tests/language/library11.dart
new file mode 100644
index 0000000..f8a4395
--- /dev/null
+++ b/tests/language/library11.dart
@@ -0,0 +1,31 @@
+// 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 library11.dart;
+
+class Library11 {
+  Library11(this.fld);
+  Library11.namedConstructor(this.fld);
+  int func() {
+    return 3;
+  }
+
+  var fld;
+  static int static_func() {
+    return 2;
+  }
+
+  static var static_fld = 1;
+}
+
+class Library111<T> {
+  Library111.namedConstructor(T this.fld);
+  T fld;
+}
+
+const int top_level11 = 100;
+int top_level_func11() {
+  return 200;
+}
diff --git a/tests/language/library12.dart b/tests/language/library12.dart
new file mode 100644
index 0000000..1eeaa0e
--- /dev/null
+++ b/tests/language/library12.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.
+//
+
+library library12.dart;
+
+import 'package:expect/expect.dart';
+
+import "library11.dart";
+
+class Library12 {
+  Library12(this.fld);
+  Library12.other(fld, multiplier) {
+    this.fld = fld * multiplier;
+  }
+  func() {
+    return 2;
+  }
+
+  var fld;
+  static static_func() {
+    var result = 0;
+    var obj = new Library11(4);
+    result = obj.fld;
+    Expect.equals(4, result);
+    result += obj.func();
+    Expect.equals(7, result);
+    result += Library11.static_func();
+    Expect.equals(9, result);
+    result += Library11.static_fld;
+    Expect.equals(10, result);
+    Expect.equals(100, top_level11);
+    Expect.equals(200, top_level_func11());
+    return 3;
+  }
+
+  static var static_fld = 4;
+}
+
+abstract class Library12Interface {
+  Library12 addObjects(Library12 value1, Library12 value2);
+}
+
+const int top_level12 = 10;
+top_level_func12() {
+  return 20;
+}
diff --git a/tests/language/library2.dart b/tests/language/library2.dart
new file mode 100644
index 0000000..219303f
--- /dev/null
+++ b/tests/language/library2.dart
@@ -0,0 +1,16 @@
+// 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.
+
+var foo;
+var foo1 = 0;
+
+bar() => "library2.dart bar()";
+
+var baz;
+
+bay() => "library2.dart bay()";
+
+typedef double bax(int a, int b);
+
+var baw;
diff --git a/tests/language/nnbd/never/never_null_assignability_error_test.dart b/tests/language/nnbd/never/never_null_assignability_error_test.dart
new file mode 100644
index 0000000..634e219
--- /dev/null
+++ b/tests/language/nnbd/never/never_null_assignability_error_test.dart
@@ -0,0 +1,217 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. 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 'never_null_assignability_lib1.dart';
+
+// This test validates that in a null safe (opted in) library which calls out
+// to another null safe (opted in) library, the static errors around `Never`
+// and `Null` that are suppressed when calling out a null safe library from
+// a **legacy** library are correctly reported.  This file is derived from
+// never_null_assignability_weak_test.dart and validates that calls to a
+// null safe library that are only permitted in that test because of legacy
+// support become errors when it is opted in.
+
+// Tests for direct calls to null safe functions.
+void testNullSafeCalls() {
+  // Test calling a null safe function expecting Null from a null safe library
+  {
+    takesNull(nil);
+    takesNull(never);
+    takesNull(3 as dynamic);
+    (takesNull as dynamic)(3);
+  }
+
+  // Test calling a null safe function expecting Never from a null safe library
+  {
+    takesNever(nil);
+    //         ^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'Null?' can't be assigned to the parameter type 'Never'.
+    takesNever(never);
+    takesNever(3 as dynamic);
+    (takesNever as dynamic)(3);
+  }
+
+  // Test calling a null safe function expecting int from a null safe library
+  {
+    takesInt(3);
+    takesInt(nil);
+    //       ^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'Null?' can't be assigned to the parameter type 'int'.
+    takesInt(nil as dynamic);
+    (takesInt as dynamic)(nil);
+    (takesInt as dynamic)("hello");
+  }
+
+  // Test calling a null safe function expecting Object from a null safe library
+  {
+    takesObject(3);
+    takesObject(nil);
+    //          ^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'Null?' can't be assigned to the parameter type 'Object'.
+    takesObject(nil as dynamic);
+    (takesObject as dynamic)(nil);
+  }
+
+  // Test calling a null safe function expecting Object? from a null safe library
+  {
+    takesAny(3);
+    takesAny(nil);
+    (takesAny as dynamic)(nil);
+  }
+}
+
+void testNullSafeApply() {
+  // Test applying a null safe function of static type void Function(Null)
+  // in a null safe library, when called with null cast to Null at the call
+  // site.
+  {
+    applyTakesNull(takesNull, nil);
+    applyTakesNull(takesNever, nil);
+    //             ^^^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNull(takesAny, nil);
+
+    applyTakesNull(takesInt, nil);
+    //             ^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNull(takesObject, nil);
+    //             ^^^^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null?)'.
+  }
+
+  // Test applying a null safe function of static type void Function(Null)
+  // in a null safe library, when called with a non-null value cast to Null
+  // at the call site.
+  {
+    applyTakesNull(takesNull, 3);
+    applyTakesNull(takesNever, 3);
+    //             ^^^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNull(takesInt, 3);
+    //             ^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNull(takesObject, 3);
+    //             ^^^^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNull(takesAny, 3);
+  }
+
+  // Test applying a null safe function of static type void Function(Never)
+  // in a null safe library, when called with null cast to Never at the call
+  // site.
+  {
+    applyTakesNever(takesNull, nil);
+    applyTakesNever(takesNever, nil);
+    applyTakesNever(takesAny, nil);
+    applyTakesNever(takesInt, nil);
+    applyTakesNever(takesObject, nil);
+  }
+
+  // Test applying a null safe function of static type void Function(Never)
+  // in a null safe library, when called with a non-null value cast to Never
+  // at the call site.
+  {
+    applyTakesNever(takesNull, 3);
+    applyTakesNever(takesNever, 3);
+    applyTakesNever(takesInt, 3);
+    applyTakesNever(takesObject, 3);
+    applyTakesNever(takesAny, 3);
+  }
+}
+
+void testNullSafeApplyDynamically() {
+  // Test dynamically applying a null safe function of static type
+  // void Function(Null) in a null safe library, when called with
+  // null.
+  {
+    applyTakesNullDynamically(takesNull, nil);
+    applyTakesNullDynamically(takesNever, nil);
+    //                        ^^^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNullDynamically(takesAny, nil);
+    applyTakesNullDynamically(takesInt, nil);
+    //                        ^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNullDynamically(takesObject, nil);
+    //                        ^^^^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null?)'.
+  }
+
+  // Test dynamically applying a null safe function of static type
+  // void Function(Null) in a null safe library, when called with
+  // a non-null value.
+  {
+    applyTakesNullDynamically(takesNull, 3);
+    applyTakesNullDynamically(takesNever, 3);
+    //                        ^^^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNullDynamically(takesInt, 3);
+    //                        ^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNullDynamically(takesInt, "hello");
+    //                        ^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNullDynamically(takesObject, 3);
+    //                        ^^^^^^^^^^^
+    // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null?)'.
+    applyTakesNullDynamically(takesAny, 3);
+  }
+
+  // Test dynamically applying a null safe function of static type
+  // void Function(Never) in a null safe library, when called with
+  // null.
+  {
+    applyTakesNeverDynamically(takesNull, nil);
+    applyTakesNeverDynamically(takesNever, nil);
+    applyTakesNeverDynamically(takesAny, nil);
+    applyTakesNeverDynamically(takesInt, nil);
+    applyTakesNeverDynamically(takesObject, nil);
+  }
+
+  // Test dynamically applying a null safe function of static type
+  // void Function(Never) in a null safe library, when called with
+  // a non-null value.
+  {
+    applyTakesNeverDynamically(takesNull, 3);
+    applyTakesNeverDynamically(takesNever, 3);
+    applyTakesNeverDynamically(takesInt, 3);
+    applyTakesNeverDynamically(takesInt, "hello");
+    applyTakesNeverDynamically(takesObject, 3);
+    applyTakesNeverDynamically(takesAny, 3);
+  }
+}
+
+void main() {
+  never = null;
+  // ^
+  // [analyzer] unspecified
+  //      ^
+  // [cfe] A value of type 'Null?' can't be assigned to a variable of type 'Never'.
+  never = nil;
+  // ^
+  // [analyzer] unspecified
+  //      ^
+  // [cfe] A value of type 'Null?' can't be assigned to a variable of type 'Never'.
+  nil = never;
+  testNullSafeCalls();
+  testNullSafeApply();
+  testNullSafeApplyDynamically();
+}
diff --git a/tests/language/nnbd/never/never_null_assignability_lib1.dart b/tests/language/nnbd/never/never_null_assignability_lib1.dart
new file mode 100644
index 0000000..b006476
--- /dev/null
+++ b/tests/language/nnbd/never/never_null_assignability_lib1.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.
+
+Null nil = null;
+
+Never never = throw "Never";
+
+void takesAny(Object? n) {}
+
+void takesObject(Object n) {
+  // In weak mode, we may get null.  Throw AssertionError so that this
+  // can be distinguished from a dynamic call failure.
+  if (n == null) throw AssertionError("Not an Object");
+}
+
+void takesInt(int n) {
+  // In weak mode, we may get null.  Throw AssertionError so that this
+  // can be distinguished from a dynamic call failure.
+  if (n == null) throw AssertionError("Not an int");
+}
+
+void takesNull(Null n) {
+  if (n != null) throw AssertionError("Not null");
+}
+
+void takesNever(Never n) {
+  // In weak mode, we may get null.  Throw AssertionError so that this
+  // can be distinguished from a dynamic call failure.
+  if (n != null) throw AssertionError("Not null");
+}
+
+void applyTakesNull(void Function(Null) fn, dynamic arg) {
+  // Make the cast explicit for clarity.
+  fn(arg as Null);
+}
+
+void applyTakesNever(void Function(Never) fn, dynamic arg) {
+  // Make the cast explicit for clarity.
+  fn(arg as Never);
+}
+
+void applyTakesNullDynamically(void Function(Null) fn, dynamic arg) {
+  (fn as dynamic)(arg);
+}
+
+void applyTakesNeverDynamically(void Function(Never) fn, dynamic arg) {
+  (fn as dynamic)(arg);
+}
diff --git a/tests/language/nnbd/never/never_null_assignability_strong_test.dart b/tests/language/nnbd/never/never_null_assignability_strong_test.dart
new file mode 100644
index 0000000..a902e45
--- /dev/null
+++ b/tests/language/nnbd/never/never_null_assignability_strong_test.dart
@@ -0,0 +1,146 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Requirements=nnbd-strong
+
+import 'package:expect/expect.dart';
+import 'never_null_assignability_lib1.dart';
+
+// Tests for direct calls to null safe functions.
+void testNullSafeCalls() {
+  // Test calling a null safe function expecting Null from a null safe libary
+  {
+    takesNull(nil);
+    Expect.throws<String>(() => takesNull(never));
+    // 3 can't be cast to Null or Never
+    Expect.throwsTypeError(() => takesNull(3 as dynamic));
+    Expect.throwsTypeError(() => (takesNull as dynamic)(3));
+  }
+
+  // Test calling a null safe function expecting Never from a null safe libary
+  {
+    Expect.throws<String>(() => takesNever(never));
+    // 3 can't be cast to Null or Never
+    Expect.throwsTypeError(() => takesNever(3 as dynamic));
+    Expect.throwsTypeError(() => (takesNever as dynamic)(3));
+  }
+
+  // Test calling a null safe function expecting int from a null safe libary
+  {
+    takesInt(3);
+    Expect.throwsTypeError(() => takesInt(nil as dynamic));
+    Expect.throwsTypeError(() => (takesInt as dynamic)(nil));
+    Expect.throwsTypeError(() => (takesInt as dynamic)("hello"));
+  }
+
+  // Test calling a null safe function expecting Object from a null safe libary
+  {
+    takesObject(3);
+    Expect.throwsTypeError(() => takesObject(nil as dynamic));
+    Expect.throwsTypeError(() => (takesObject as dynamic)(nil));
+  }
+
+  // Test calling a null safe function expecting Object? from a null safe libary
+  {
+    takesAny(3);
+    takesAny(nil);
+    (takesAny as dynamic)(nil);
+  }
+}
+
+void testNullSafeApply() {
+  // Test applying a null safe function of static type void Function(Null)
+  // in a null safe library, when called with null cast to Null at the call
+  // site.
+  {
+    applyTakesNull(takesNull, nil);
+    applyTakesNull(takesAny, nil);
+  }
+
+  // Test applying a null safe function of static type void Function(Null)
+  // in a null safe library, when called with a non-null value cast to Null
+  // at the call site.
+  {
+    Expect.throwsTypeError(() => applyTakesNull(takesNull, 3));
+    Expect.throwsTypeError(() => applyTakesNull(takesAny, 3));
+  }
+
+  // Test applying a null safe function of static type void Function(Never)
+  // in a null safe library, when called with null cast to Never at the call
+  // site.
+  {
+    // Cast of null to Never should fail.
+    Expect.throwsTypeError(() => applyTakesNever(takesNull, nil));
+    // Cast of null to Never should fail.
+    Expect.throwsTypeError(() => applyTakesNever(takesNever, nil));
+    // Cast of null to Never should fail.
+    Expect.throwsTypeError(() => applyTakesNever(takesInt, nil));
+    // Cast of null to Never should fail.
+    Expect.throwsTypeError(() => applyTakesNever(takesObject, nil));
+    // Cast of null to Never should fail.
+    Expect.throwsTypeError(() => applyTakesNever(takesAny, nil));
+  }
+
+  // Test applying a null safe function of static type void Function(Never)
+  // in a null safe library, when called with a non-null value cast to Never
+  // at the call site.
+  {
+    Expect.throwsTypeError(() => applyTakesNever(takesNull, 3));
+    Expect.throwsTypeError(() => applyTakesNever(takesNever, 3));
+    Expect.throwsTypeError(() => applyTakesNever(takesInt, 3));
+    Expect.throwsTypeError(() => applyTakesNever(takesObject, 3));
+    Expect.throwsTypeError(() => applyTakesNever(takesAny, 3));
+  }
+}
+
+void testNullSafeApplyDynamically() {
+  // Test dynamically applying a null safe function of static type
+  // void Function(Null) in a null safe library, when called with
+  // null.
+  {
+    applyTakesNullDynamically(takesNull, nil);
+    applyTakesNullDynamically(takesAny, nil);
+  }
+
+  // Test dynamically applying a null safe function of static type
+  // void Function(Null) in a null safe library, when called with
+  // a non-null value.
+  {
+    Expect.throwsTypeError(() => applyTakesNullDynamically(takesNull, 3));
+    applyTakesNullDynamically(takesAny, 3);
+  }
+
+  // Test dynamically applying a null safe function of static type
+  // void Function(Never) in a null safe library, when called with
+  // null.
+  {
+    applyTakesNeverDynamically(takesNull, nil);
+    applyTakesNeverDynamically(takesAny, nil);
+
+    // Dynamic call should fail.
+    Expect.throwsTypeError(() => applyTakesNeverDynamically(takesNever, nil));
+    // Dynamic call should fail.
+    Expect.throwsTypeError(() => applyTakesNeverDynamically(takesInt, nil));
+    // Dynamic call should fail.
+    Expect.throwsTypeError(() => applyTakesNeverDynamically(takesObject, nil));
+  }
+
+  // Test dynamically applying a null safe function of static type
+  // void Function(Never) in a null safe library, when called with
+  // a non-null value.
+  {
+    Expect.throwsTypeError(() => applyTakesNeverDynamically(takesNull, 3));
+    Expect.throwsTypeError(() => applyTakesNeverDynamically(takesNever, 3));
+    applyTakesNeverDynamically(takesInt, 3);
+    Expect.throwsTypeError(() => applyTakesNeverDynamically(takesInt, "hello"));
+    applyTakesNeverDynamically(takesObject, 3);
+    applyTakesNeverDynamically(takesAny, 3);
+  }
+}
+
+void main() {
+  testNullSafeCalls();
+  testNullSafeApply();
+  testNullSafeApplyDynamically();
+}
diff --git a/tests/language/nnbd/never/never_null_assignability_weak_test.dart b/tests/language/nnbd/never/never_null_assignability_weak_test.dart
new file mode 100644
index 0000000..1c87799
--- /dev/null
+++ b/tests/language/nnbd/never/never_null_assignability_weak_test.dart
@@ -0,0 +1,316 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.7
+
+// Requirements=nnbd-weak
+
+import 'package:expect/expect.dart';
+import 'never_null_assignability_lib1.dart';
+
+void takesLegacyObject(Object n) {
+  // In a legacy library, we may get null.  Throw AssertionError so that this
+  // can be distinguished from a dynamic call failure.
+  if (n == null) throw AssertionError("Not an Object");
+}
+
+void takesLegacyInt(int n) {
+  // In a legacy library, we may get null.  Throw AssertionError so that this
+  // can be distinguished from a dynamic call failure.
+  if (n == null) throw AssertionError("Not an int");
+}
+
+void takesLegacyNull(Null n) {
+  // This should never happen!
+  if (n != null) throw AssertionError("Not null");
+}
+
+// Tests for direct calls to null safe functions.
+void testNullSafeCalls() {
+  // Test calling a null safe function expecting Null from a legacy library
+  {
+    takesNull(nil);
+    takesNull(never);
+    // Even in weak mode, 3 can't be cast to Null or Never
+    Expect.throwsTypeError(() => takesNull(3 as dynamic));
+    Expect.throwsTypeError(() => (takesNull as dynamic)(3));
+  }
+
+  // Test calling a null safe function expecting Never from a legacy library
+  {
+    takesNever(nil);
+    takesNever(never);
+    // Even in weak mode, 3 can't be cast to Null or Never
+    Expect.throwsTypeError(() => takesNever(3 as dynamic));
+    Expect.throwsTypeError(() => (takesNever as dynamic)(3));
+  }
+
+  // Test calling a null safe function expecting int from a legacy library
+  {
+    takesInt(3);
+    Expect.throwsAssertionError(() => takesInt(nil));
+    Expect.throwsAssertionError(() => takesInt(nil as dynamic));
+    Expect.throwsAssertionError(() => (takesInt as dynamic)(nil));
+    Expect.throwsTypeError(() => (takesInt as dynamic)("hello"));
+  }
+
+  // Test calling a null safe function expecting Object from a legacy library
+  {
+    takesObject(3);
+    Expect.throwsAssertionError(() => takesObject(nil));
+    Expect.throwsAssertionError(() => takesObject(nil as dynamic));
+    Expect.throwsAssertionError(() => (takesObject as dynamic)(nil));
+  }
+
+  // Test calling a null safe function expecting Object? from a legacy library
+  {
+    takesAny(3);
+    takesAny(nil);
+    (takesAny as dynamic)(nil);
+  }
+}
+
+// Tests for direct calls to legacy functions.
+void testLegacyCalls() {
+  // Test calling a legacy function expecting Null from a legacy library
+  {
+    takesLegacyNull(nil);
+    // Even in weak mode, 3 can't be cast to Null or Never
+    Expect.throwsTypeError(() => takesLegacyNull(3 as dynamic));
+    Expect.throwsTypeError(() => (takesLegacyNull as dynamic)(3));
+  }
+
+  // Test calling a legacy function expecting int from a legacy library
+  {
+    takesLegacyInt(3);
+    Expect.throwsAssertionError(() => takesLegacyInt(nil));
+    Expect.throwsAssertionError(() => (takesLegacyInt as dynamic)(nil));
+    Expect.throwsTypeError(() => (takesLegacyInt as dynamic)("hello"));
+  }
+
+  // Test calling a legacy function expecting Object from a legacy library
+  {
+    takesLegacyObject(3);
+    Expect.throwsAssertionError(() => takesLegacyObject(nil));
+    Expect.throwsAssertionError(() => (takesLegacyObject as dynamic)(nil));
+  }
+}
+
+void testNullSafeApply() {
+  // Test applying a null safe function of static type void Function(Null)
+  // in a null safe library, when called with null cast to Null at the call
+  // site.
+  {
+    applyTakesNull(takesNull, nil);
+    applyTakesNull(takesNever, nil);
+    applyTakesNull(takesAny, nil);
+
+    // Cast of null to Null shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(() => applyTakesNull(takesInt, nil));
+    // Cast of null to Null shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(() => applyTakesNull(takesObject, nil));
+  }
+
+  // Test applying a null safe function of static type void Function(Null)
+  // in a null safe library, when called with a non-null value cast to Null
+  // at the call site.
+  {
+    Expect.throwsTypeError(() => applyTakesNull(takesNull, 3));
+    Expect.throwsTypeError(() => applyTakesNull(takesNever, 3));
+    Expect.throwsTypeError(() => applyTakesNull(takesInt, 3));
+    Expect.throwsTypeError(() => applyTakesNull(takesObject, 3));
+    Expect.throwsTypeError(() => applyTakesNull(takesAny, 3));
+  }
+
+  // Test applying a null safe function of static type void Function(Never)
+  // in a null safe library, when called with null cast to Never at the call
+  // site.
+  {
+    applyTakesNever(takesNull, nil);
+    applyTakesNever(takesNever, nil);
+    applyTakesNever(takesAny, nil);
+
+    // Cast of null to Never shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(() => applyTakesNever(takesInt, nil));
+    // Cast of null to Never shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(() => applyTakesNever(takesObject, nil));
+  }
+
+  // Test applying a null safe function of static type void Function(Never)
+  // in a null safe library, when called with a non-null value cast to Never
+  // at the call site.
+  {
+    Expect.throwsTypeError(() => applyTakesNever(takesNull, 3));
+    Expect.throwsTypeError(() => applyTakesNever(takesNever, 3));
+    Expect.throwsTypeError(() => applyTakesNever(takesInt, 3));
+    Expect.throwsTypeError(() => applyTakesNever(takesObject, 3));
+    Expect.throwsTypeError(() => applyTakesNever(takesAny, 3));
+  }
+}
+
+void testLegacyApply() {
+  // Test applying a legacy function of static type void Function(Null)
+  // in a null safe library, when called with null cast to Null at the call
+  // site.
+  {
+    applyTakesNull(takesLegacyNull, nil);
+
+    // Cast of null to Null shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(() => applyTakesNull(takesLegacyInt, nil));
+    // Cast of null to Null shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(() => applyTakesNull(takesLegacyObject, nil));
+  }
+
+  // Test applying a legacy function of static type void Function(Null)
+  // in a null safe library, when called with a non-null value cast to Null
+  // at the call site.
+  {
+    Expect.throwsTypeError(() => applyTakesNull(takesLegacyNull, 3));
+    Expect.throwsTypeError(() => applyTakesNull(takesLegacyInt, 3));
+    Expect.throwsTypeError(() => applyTakesNull(takesLegacyObject, 3));
+  }
+
+  // Test applying a legacy function of static type void Function(Never)
+  // in a null safe library, when called with null cast to Never at the call
+  // site.
+  {
+    applyTakesNever(takesLegacyNull, nil);
+
+    // Cast of null to Never shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(() => applyTakesNever(takesLegacyInt, nil));
+    // Cast of null to Never shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(() => applyTakesNever(takesLegacyObject, nil));
+  }
+
+  // Test applying a legacy function of static type void Function(Never)
+  // in a null safe library, when called with a non-null value cast to Never
+  // at the call site.
+  {
+    Expect.throwsTypeError(() => applyTakesNever(takesLegacyNull, 3));
+    Expect.throwsTypeError(() => applyTakesNever(takesLegacyInt, 3));
+    Expect.throwsTypeError(() => applyTakesNever(takesLegacyObject, 3));
+  }
+}
+
+void testNullSafeApplyDynamically() {
+  // Test dynamically applying a null safe function of static type
+  // void Function(Null) in a null safe library, when called with
+  // null.
+  {
+    applyTakesNullDynamically(takesNull, nil);
+    applyTakesNullDynamically(takesNever, nil);
+    applyTakesNullDynamically(takesAny, nil);
+
+    // Dynamic call shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(() => applyTakesNullDynamically(takesInt, nil));
+    // Dynamic call shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(
+        () => applyTakesNullDynamically(takesObject, nil));
+  }
+
+  // Test dynamically applying a null safe function of static type
+  // void Function(Null) in a null safe library, when called with
+  // a non-null value.
+  {
+    Expect.throwsTypeError(() => applyTakesNullDynamically(takesNull, 3));
+    Expect.throwsTypeError(() => applyTakesNullDynamically(takesNever, 3));
+    applyTakesNullDynamically(takesInt, 3);
+    Expect.throwsTypeError(() => applyTakesNullDynamically(takesInt, "hello"));
+    applyTakesNullDynamically(takesObject, 3);
+    applyTakesNullDynamically(takesAny, 3);
+  }
+
+  // Test dynamically applying a null safe function of static type
+  // void Function(Never) in a null safe library, when called with
+  // null.
+  {
+    applyTakesNeverDynamically(takesNull, nil);
+    applyTakesNeverDynamically(takesNever, nil);
+    applyTakesNeverDynamically(takesAny, nil);
+
+    // Dynamic call shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(
+        () => applyTakesNeverDynamically(takesInt, nil));
+    // Dynamic call shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(
+        () => applyTakesNeverDynamically(takesObject, nil));
+  }
+
+  // Test dynamically applying a null safe function of static type
+  // void Function(Never) in a null safe library, when called with
+  // a non-null value.
+  {
+    Expect.throwsTypeError(() => applyTakesNeverDynamically(takesNull, 3));
+    Expect.throwsTypeError(() => applyTakesNeverDynamically(takesNever, 3));
+    applyTakesNeverDynamically(takesInt, 3);
+    Expect.throwsTypeError(() => applyTakesNeverDynamically(takesInt, "hello"));
+    applyTakesNeverDynamically(takesObject, 3);
+    applyTakesNeverDynamically(takesAny, 3);
+  }
+}
+
+void testLegacyApplyDynamically() {
+  // Test dynamically applying a legacy function of static type
+  // void Function(Null) in a null safe library, when called with
+  // null.
+  {
+    applyTakesNullDynamically(takesLegacyNull, nil);
+
+    // Dynamic call shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(
+        () => applyTakesNullDynamically(takesLegacyInt, nil));
+    // Dynamic call shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(
+        () => applyTakesNullDynamically(takesLegacyObject, nil));
+  }
+
+  // Test dynamically applying a legacy function of static type
+  // void Function(Null) in a null safe library, when called with
+  // a non-null value.
+  {
+    Expect.throwsTypeError(() => applyTakesNullDynamically(takesLegacyNull, 3));
+    applyTakesNullDynamically(takesLegacyInt, 3);
+    Expect.throwsTypeError(
+        () => applyTakesNullDynamically(takesLegacyInt, "hello"));
+    applyTakesNullDynamically(takesLegacyObject, 3);
+  }
+
+  // Test dynamically applying a legacy function of static type
+  // void Function(Never) in a null safe library, when called with
+  // null.
+  {
+    applyTakesNeverDynamically(takesLegacyNull, nil);
+
+    // Dynamic call shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(
+        () => applyTakesNeverDynamically(takesLegacyInt, nil));
+    // Dynamic call shouldn't fail, check that we reach the assertion.
+    Expect.throwsAssertionError(
+        () => applyTakesNeverDynamically(takesLegacyObject, nil));
+  }
+
+  // Test dynamically applying a legacy function of static type
+  // void Function(Never) in a null safe library, when called with
+  // a non-null value.
+  {
+    Expect.throwsTypeError(
+        () => applyTakesNeverDynamically(takesLegacyNull, 3));
+    applyTakesNeverDynamically(takesLegacyInt, 3);
+    Expect.throwsTypeError(
+        () => applyTakesNeverDynamically(takesLegacyInt, "hello"));
+    applyTakesNeverDynamically(takesLegacyObject, 3);
+  }
+}
+
+void main() {
+  never = null;
+  never = nil;
+  nil = never;
+  testNullSafeCalls();
+  testLegacyCalls();
+  testNullSafeApply();
+  testLegacyApply();
+  testNullSafeApplyDynamically();
+  testLegacyApplyDynamically();
+}
diff --git a/tests/language/nnbd/resolution/issue41479_test.dart b/tests/language/nnbd/resolution/issue41479_test.dart
new file mode 100644
index 0000000..bf6f6cd
--- /dev/null
+++ b/tests/language/nnbd/resolution/issue41479_test.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.
+
+// SharedOptions=--enable-experiment=non-nullable
+
+main() {
+  A a = A()..foo?.isEven;
+}
+
+class A {
+  int? get foo => 0;
+}
diff --git a/tests/language/nnbd/static_errors/unchecked_use_of_nullable_test.dart b/tests/language/nnbd/static_errors/unchecked_use_of_nullable_test.dart
index cee406f..4e23e5f 100644
--- a/tests/language/nnbd/static_errors/unchecked_use_of_nullable_test.dart
+++ b/tests/language/nnbd/static_errors/unchecked_use_of_nullable_test.dart
@@ -170,7 +170,7 @@
   dyn.toString(); //# 124: ok
   dyn.hashCode; //# 125: ok
   dyn.runtimeType; //# 126: ok
-  dyn.noSuchMethod(null); //# 127: ok
+  dyn.noSuchMethod(Invocation.method(#toString, [])); //# 127: ok
   dyn + 1; //# 128: ok
   -dyn; //# 129: ok
   dyn++; //# 130: ok
diff --git a/tests/language/nnbd/type_promotion/function_expression_outer_is_type_assigned_outside_test.dart b/tests/language/nnbd/type_promotion/function_expression_outer_is_type_assigned_outside_test.dart
index a9a546f..dd1df88 100644
--- a/tests/language/nnbd/type_promotion/function_expression_outer_is_type_assigned_outside_test.dart
+++ b/tests/language/nnbd/type_promotion/function_expression_outer_is_type_assigned_outside_test.dart
@@ -5,7 +5,7 @@
 // SharedOptions=--enable-experiment=non-nullable
 
 void f(Object x) {
-  void Function() g;
+  late void Function() g;
 
   if (x is String) {
     x.length;
diff --git a/tests/language/regress/regress41613_test.dart b/tests/language/regress/regress41613_test.dart
new file mode 100644
index 0000000..0ea1de0
--- /dev/null
+++ b/tests/language/regress/regress41613_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.7
+
+// Requirements=nnbd-weak
+
+import "package:expect/expect.dart";
+
+main() {
+  // In legacy Dart 2 and null safety weak mode the error handlers can
+  // return null.
+  Expect.equals(null, int.parse("foo", onError: (_) => null));
+  Expect.equals(null, double.parse("foo", (_) => null));
+}
diff --git a/tests/language_2/regress/regress41613_test.dart b/tests/language_2/regress/regress41613_test.dart
new file mode 100644
index 0000000..5c31ecb
--- /dev/null
+++ b/tests/language_2/regress/regress41613_test.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 "package:expect/expect.dart";
+
+main() {
+  // In legacy Dart 2 and null safety weak mode the error handlers can
+  // return null.
+  Expect.equals(null, int.parse("foo", onError: (_) => null));
+  Expect.equals(null, double.parse("foo", (_) => null));
+}
diff --git a/tests/lib/async/futures_test.dart b/tests/lib/async/futures_test.dart
index 88c8d7a..1cf5e0e 100644
--- a/tests/lib/async/futures_test.dart
+++ b/tests/lib/async/futures_test.dart
@@ -77,6 +77,15 @@
   });
 }
 
+// Regression test for https://github.com/dart-lang/sdk/issues/41656
+Future testWaitWithErrorAndNonErrorEager() {
+  return Future(() {
+    var f1 = Future(() => throw "Error");
+    var f2 = Future(() => 3);
+    return Future.wait([f1, f2], eagerError: true);
+  }).then((_) => 0, onError: (_) => -1);
+}
+
 Future testWaitWithMultipleErrorsEager() {
   final futures = <Future>[];
   final c1 = new Completer();
@@ -249,6 +258,7 @@
   futures.add(testWaitWithMultipleValues());
   futures.add(testWaitWithSingleError());
   futures.add(testWaitWithMultipleErrors());
+  futures.add(testWaitWithErrorAndNonErrorEager());
   futures.add(testWaitWithMultipleErrorsEager());
   futures.add(testWaitWithSingleErrorWithStackTrace());
   futures.add(testWaitWithMultipleErrorsWithStackTrace());
@@ -264,7 +274,7 @@
 
   asyncStart();
   Future.wait(futures).then((List list) {
-    Expect.equals(18, list.length);
+    Expect.equals(19, list.length);
     asyncEnd();
   });
 }
diff --git a/tests/lib/async/slow_consumer2_test.dart b/tests/lib/async/slow_consumer2_test.dart
index 5722efb..15710a4 100644
--- a/tests/lib/async/slow_consumer2_test.dart
+++ b/tests/lib/async/slow_consumer2_test.dart
@@ -88,7 +88,7 @@
       listSize -= sentCount - targetCount;
       sentCount = targetCount;
     }
-    controller.add(new List(listSize));
+    controller.add(List.filled(listSize, -1));
     int ms = listSize * 1000 ~/ bytesPerSecond;
     Duration duration = new Duration(milliseconds: ms);
     if (!controller.isPaused) new Timer(duration, send);
diff --git a/tests/lib/html/js_util_test.dart b/tests/lib/html/js_util_test.dart
index ab74e43..f06e729 100644
--- a/tests/lib/html/js_util_test.dart
+++ b/tests/lib/html/js_util_test.dart
@@ -360,12 +360,12 @@
     });
   });
 
-  void testResolvedPromise() async {
+  Future<void> testResolvedPromise() async {
     final String result = await js_util.promiseToFuture(resolvedPromise);
     expect(result, equals('resolved'));
   }
 
-  void testRejectedPromise() async {
+  Future<void> testRejectedPromise() async {
     try {
       final String result = await promiseToFuture(rejectedPromise);
       fail('expected Future to throw an error');
@@ -374,7 +374,7 @@
     }
   }
 
-  void testReturnRejectedPromise() async {
+  Future<void> testReturnRejectedPromise() async {
     final String result = await promiseToFuture(getResolvedPromise());
     expect(result, equals('resolved'));
   }
diff --git a/tests/lib/mirrors/relation_subclass_test.dart b/tests/lib/mirrors/relation_subclass_test.dart
index 7e83931..a80194a 100644
--- a/tests/lib/mirrors/relation_subclass_test.dart
+++ b/tests/lib/mirrors/relation_subclass_test.dart
@@ -96,12 +96,12 @@
   TypeMirror IntGenRef = (IntGen as TypedefMirror).referent;
   TypeMirror DubGenRef = (DubGen as TypedefMirror).referent;
 
-  Expect.isFalse(Func.isSubclassOf(NumPredRef));
-  Expect.isFalse(Func.isSubclassOf(IntPredRef));
-  Expect.isFalse(Func.isSubclassOf(DubPredRef));
-  Expect.isFalse(Func.isSubclassOf(NumGenRef));
-  Expect.isFalse(Func.isSubclassOf(IntGenRef));
-  Expect.isFalse(Func.isSubclassOf(DubGenRef));
+  Expect.isFalse(Func.isSubclassOf(NumPredRef as ClassMirror));
+  Expect.isFalse(Func.isSubclassOf(IntPredRef as ClassMirror));
+  Expect.isFalse(Func.isSubclassOf(DubPredRef as ClassMirror));
+  Expect.isFalse(Func.isSubclassOf(NumGenRef as ClassMirror));
+  Expect.isFalse(Func.isSubclassOf(IntGenRef as ClassMirror));
+  Expect.isFalse(Func.isSubclassOf(DubGenRef as ClassMirror));
 
   // The spec doesn't require these to be either value, only that they implement
   // Function.
diff --git a/tests/lib/mirrors/typedef_reflected_type_test.dart b/tests/lib/mirrors/typedef_reflected_type_test.dart
index 7b017f5..43b1378 100644
--- a/tests/lib/mirrors/typedef_reflected_type_test.dart
+++ b/tests/lib/mirrors/typedef_reflected_type_test.dart
@@ -12,7 +12,7 @@
 typedef int Bar();
 
 class C {
-  Bar fun(Foo<int> x) => null;
+  Bar fun(Foo<int> x) => () => 123;
 }
 
 main() {
diff --git a/tests/lib_2/async/futures_test.dart b/tests/lib_2/async/futures_test.dart
index a98d612..26b3019 100644
--- a/tests/lib_2/async/futures_test.dart
+++ b/tests/lib_2/async/futures_test.dart
@@ -77,6 +77,15 @@
   });
 }
 
+// Regression test for https://github.com/dart-lang/sdk/issues/41656
+Future testWaitWithErrorAndNonErrorEager() {
+  return Future(() {
+    var f1 = Future(() => throw "Error");
+    var f2 = Future(() => 3);
+    return Future.wait([f1, f2], eagerError: true);
+  }).then((_) => 0, onError: (_) => -1);
+}
+
 Future testWaitWithMultipleErrorsEager() {
   final futures = new List<Future>();
   final c1 = new Completer();
@@ -250,6 +259,7 @@
   futures.add(testWaitWithMultipleValues());
   futures.add(testWaitWithSingleError());
   futures.add(testWaitWithMultipleErrors());
+  futures.add(testWaitWithErrorAndNonErrorEager());
   futures.add(testWaitWithMultipleErrorsEager());
   futures.add(testWaitWithSingleErrorWithStackTrace());
   futures.add(testWaitWithMultipleErrorsWithStackTrace());
@@ -265,7 +275,7 @@
 
   asyncStart();
   Future.wait(futures).then((List list) {
-    Expect.equals(18, list.length);
+    Expect.equals(19, list.length);
     asyncEnd();
   });
 }
diff --git a/tests/lib_2/html/js_util_test.dart b/tests/lib_2/html/js_util_test.dart
index 0166e9c..d32df10 100644
--- a/tests/lib_2/html/js_util_test.dart
+++ b/tests/lib_2/html/js_util_test.dart
@@ -360,12 +360,12 @@
     });
   });
 
-  void testResolvedPromise() async {
+  Future<void> testResolvedPromise() async {
     final String result = await js_util.promiseToFuture(resolvedPromise);
     expect(result, equals('resolved'));
   }
 
-  void testRejectedPromise() async {
+  Future<void> testRejectedPromise() async {
     try {
       final String result = await promiseToFuture(rejectedPromise);
       fail('expected Future to throw an error');
@@ -374,7 +374,7 @@
     }
   }
 
-  void testReturnRejectedPromise() async {
+  Future<void> testReturnRejectedPromise() async {
     final String result = await promiseToFuture(getResolvedPromise());
     expect(result, equals('resolved'));
   }
diff --git a/tests/standalone/array_bounds_check_generalization_test.dart b/tests/standalone/array_bounds_check_generalization_test.dart
index 96b5946..537b0b2 100644
--- a/tests/standalone/array_bounds_check_generalization_test.dart
+++ b/tests/standalone/array_bounds_check_generalization_test.dart
@@ -72,7 +72,7 @@
 
 main() {
   var a = const [0, 1, 2, 3, 4, 5, 6, 7];
-  var b = new List(a.length);
+  var b = List.filled(a.length, -1);
   for (var i = 0; i < 10000; i++) {
     Expect.equals(a.last, test1(a, 0, 1, a.length));
     Expect.equals(a.last, test2(a, b));
@@ -84,6 +84,6 @@
 
   test1(a, 0, 2, a.length ~/ 2);
   Expect.throws(() => test1(a, 1, 1, a.length));
-  Expect.throws(() => test2(a, new List(a.length - 1)));
+  Expect.throws(() => test2(a, List.filled(a.length - 1, -1)));
   Expect.throws(() => test6(a, 4, 3));
 }
diff --git a/tests/standalone/io/http_compression_test.dart b/tests/standalone/io/http_compression_test.dart
index ae5507c..594d5d7 100644
--- a/tests/standalone/io/http_compression_test.dart
+++ b/tests/standalone/io/http_compression_test.dart
@@ -11,8 +11,8 @@
 import 'dart:io';
 import 'dart:typed_data';
 
-void testServerCompress({bool clientAutoUncompress: true}) async {
-  void test(List<int> data) async {
+Future<void> testServerCompress({bool clientAutoUncompress: true}) async {
+  Future<void> test(List<int> data) async {
     final server = await HttpServer.bind("127.0.0.1", 0);
     server.autoCompress = true;
     server.listen((request) {
@@ -45,8 +45,8 @@
   await test(longBuffer);
 }
 
-void testAcceptEncodingHeader() async {
-  void test(String encoding, bool valid) async {
+Future<void> testAcceptEncodingHeader() async {
+  Future<void> test(String encoding, bool valid) async {
     final server = await HttpServer.bind("127.0.0.1", 0);
     server.autoCompress = true;
     server.listen((request) {
@@ -78,7 +78,7 @@
   await test('gzipx;', false);
 }
 
-void testDisableCompressTest() async {
+Future<void> testDisableCompressTest() async {
   final server = await HttpServer.bind("127.0.0.1", 0);
   Expect.equals(false, server.autoCompress);
   server.listen((request) {
diff --git a/tests/standalone/io/http_parser_connect_method.dart b/tests/standalone/io/http_parser_connect_method.dart
new file mode 100644
index 0000000..f543bcd
--- /dev/null
+++ b/tests/standalone/io/http_parser_connect_method.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "dart:io";
+import "package:expect/expect.dart";
+
+test(String header, value) async {
+  final connect = "CONNECT";
+  var server = await HttpServer.bind("127.0.0.1", 0);
+  server.listen((HttpRequest request) {
+    Expect.equals(connect, request.method);
+    request.response.statusCode = 200;
+    request.response.headers.add(header, value);
+    request.response.close();
+  });
+
+  var completer = Completer();
+  HttpClient client = HttpClient();
+  client
+      .open(connect, "127.0.0.1", server.port, "/")
+      .then((HttpClientRequest request) {
+    return request.close();
+  }).then((HttpClientResponse response) {
+    Expect.isTrue(response.statusCode == 200);
+    Expect.isNull(response.headers[header]);
+    client.close();
+    server.close();
+    completer.complete();
+  });
+
+  await completer.future;
+}
+
+main() async {
+  await test(HttpHeaders.contentLengthHeader, 0);
+  await test(HttpHeaders.transferEncodingHeader, 'chunked');
+}
diff --git a/tests/standalone/io/http_parser_connect_method_test.dart b/tests/standalone/io/http_parser_connect_method_test.dart
deleted file mode 100644
index ab02945..0000000
--- a/tests/standalone/io/http_parser_connect_method_test.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:async";
-import "dart:io";
-
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
-
-Future<void> test(String header, value) async {
-  final connect = "CONNECT";
-  final server = await HttpServer.bind("127.0.0.1", 0);
-  server.listen((HttpRequest request) {
-    Expect.equals(connect, request.method);
-    request.response.statusCode = 200;
-    request.response.headers.add(header, value);
-    request.response.close();
-  });
-
-  final completer = Completer<void>();
-  HttpClient client = HttpClient();
-  client
-      .open(connect, "127.0.0.1", server.port, "/")
-      .then((HttpClientRequest request) {
-    return request.close();
-  }).then((HttpClientResponse response) {
-    Expect.equals(200, response.statusCode);
-    // Headers except Content-Length and Transfer-Encoding header will be read.
-    if (header == HttpHeaders.contentLengthHeader ||
-        header == HttpHeaders.transferEncodingHeader) {
-      Expect.isNull(response.headers[header]);
-    } else {
-      final list = response.headers[header];
-      Expect.isNotNull(list);
-      Expect.equals(1, list!.length);
-      Expect.equals(value, list[0]);
-    }
-
-    client.close();
-    server.close();
-    completer.complete();
-  });
-
-  await completer.future;
-}
-
-Future<void> runTests() async {
-  await test(HttpHeaders.contentLengthHeader, 0);
-  await test(HttpHeaders.transferEncodingHeader, 'chunked');
-  await test('testHeader', 'testValue');
-}
-
-main() {
-  asyncTest(runTests);
-}
diff --git a/tests/standalone/io/http_parser_header_add_test.dart b/tests/standalone/io/http_parser_header_add_test.dart
deleted file mode 100644
index ebb947b..0000000
--- a/tests/standalone/io/http_parser_header_add_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:io";
-
-import "package:async_helper/async_helper.dart";
-
-// The ’ character is U+2019 RIGHT SINGLE QUOTATION MARK.
-final value = 'Bob’s browser';
-
-// When a invalid value is added to http header, test that a FormatException is
-// thrown on an invalid user-agent header.
-Future<void> main() async {
-  final client = HttpClient();
-  client.userAgent = value;
-
-  asyncExpectThrows<FormatException>(() async {
-    try {
-      await client.getUrl(Uri.parse('https://postman-echo.com/get?'));
-    } finally {
-      client.close(force: true);
-    }
-  });
-}
diff --git a/tests/standalone/io/socket_hang_test.dart b/tests/standalone/io/socket_hang_test.dart
index 810d2a1..2231844 100644
--- a/tests/standalone/io/socket_hang_test.dart
+++ b/tests/standalone/io/socket_hang_test.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
+import 'dart:convert';
+import 'dart:io' as io;
 
-import 'package:expect/expect.dart';
-
-// A regression test for: https://github.com/dart-lang/sdk/issues/40589
-Future<void> main(List<String> args) async {
+void main(List<String> args) async {
   if (args.length != 0) {
     for (int i = 0; i < 100000; i++) {
       print('line $i');
@@ -16,14 +14,11 @@
     return;
   } else {
     // Create child process and keeps writing into stdout.
-    final p = await Process.start(
-        Platform.executable, [Platform.script.toFilePath(), 'child']);
-    p.stdout.drain();
-    p.stderr.drain();
+    final p = await io.Process.start(
+        io.Platform.executable, [io.Platform.script.toFilePath(), 'child']);
+    p.stdout.transform(utf8.decoder).listen((x) => print('stdout: $x'));
+    p.stderr.transform(utf8.decoder).listen((x) => print('stderr: $x'));
     final exitCode = await p.exitCode;
-    if (exitCode != 0) {
-      Expect.fail('process failed with ${exitCode}');
-    }
-    return;
+    print('process exited with ${exitCode}');
   }
 }
diff --git a/tests/standalone/io/unix_socket_test.dart b/tests/standalone/io/unix_socket_test.dart
index cc6ed79..7c52777 100644
--- a/tests/standalone/io/unix_socket_test.dart
+++ b/tests/standalone/io/unix_socket_test.dart
@@ -74,7 +74,7 @@
   var socket = await Socket.connect(address, server.port);
   socket.write(" socket content");
 
-  await socket.destroy();
+  socket.destroy();
   await server.close();
 }
 
@@ -138,7 +138,7 @@
 }
 
 // Create socket in temp directory
-Future withTempDir(String prefix, void test(Directory dir)) async {
+Future withTempDir(String prefix, Future<void> test(Directory dir)) async {
   var tempDir = Directory.systemTemp.createTempSync(prefix);
   try {
     await test(tempDir);
diff --git a/tests/standalone_2/io/http_compression_test.dart b/tests/standalone_2/io/http_compression_test.dart
index 2e0b45f..ca9f2cf 100644
--- a/tests/standalone_2/io/http_compression_test.dart
+++ b/tests/standalone_2/io/http_compression_test.dart
@@ -11,8 +11,8 @@
 import 'dart:io';
 import 'dart:typed_data';
 
-void testServerCompress({bool clientAutoUncompress: true}) async {
-  void test(List<int> data) async {
+Future<void> testServerCompress({bool clientAutoUncompress: true}) async {
+  Future<void> test(List<int> data) async {
     final server = await HttpServer.bind("127.0.0.1", 0);
     server.autoCompress = true;
     server.listen((request) {
@@ -44,8 +44,8 @@
   await test(longBuffer);
 }
 
-void testAcceptEncodingHeader() async {
-  void test(String encoding, bool valid) async {
+Future<void> testAcceptEncodingHeader() async {
+  Future<void> test(String encoding, bool valid) async {
     final server = await HttpServer.bind("127.0.0.1", 0);
     server.autoCompress = true;
     server.listen((request) {
@@ -77,7 +77,7 @@
   await test('gzipx;', false);
 }
 
-void testDisableCompressTest() async {
+Future<void> testDisableCompressTest() async {
   final server = await HttpServer.bind("127.0.0.1", 0);
   Expect.equals(false, server.autoCompress);
   server.listen((request) {
diff --git a/tests/standalone_2/io/http_parser_connect_method.dart b/tests/standalone_2/io/http_parser_connect_method.dart
new file mode 100644
index 0000000..f543bcd
--- /dev/null
+++ b/tests/standalone_2/io/http_parser_connect_method.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "dart:io";
+import "package:expect/expect.dart";
+
+test(String header, value) async {
+  final connect = "CONNECT";
+  var server = await HttpServer.bind("127.0.0.1", 0);
+  server.listen((HttpRequest request) {
+    Expect.equals(connect, request.method);
+    request.response.statusCode = 200;
+    request.response.headers.add(header, value);
+    request.response.close();
+  });
+
+  var completer = Completer();
+  HttpClient client = HttpClient();
+  client
+      .open(connect, "127.0.0.1", server.port, "/")
+      .then((HttpClientRequest request) {
+    return request.close();
+  }).then((HttpClientResponse response) {
+    Expect.isTrue(response.statusCode == 200);
+    Expect.isNull(response.headers[header]);
+    client.close();
+    server.close();
+    completer.complete();
+  });
+
+  await completer.future;
+}
+
+main() async {
+  await test(HttpHeaders.contentLengthHeader, 0);
+  await test(HttpHeaders.transferEncodingHeader, 'chunked');
+}
diff --git a/tests/standalone_2/io/http_parser_connect_method_test.dart b/tests/standalone_2/io/http_parser_connect_method_test.dart
deleted file mode 100644
index d4ecad2..0000000
--- a/tests/standalone_2/io/http_parser_connect_method_test.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:async";
-import "dart:io";
-
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
-
-Future<void> test(String header, value) async {
-  final connect = "CONNECT";
-  final server = await HttpServer.bind("127.0.0.1", 0);
-  server.listen((HttpRequest request) {
-    Expect.equals(connect, request.method);
-    request.response.statusCode = 200;
-    request.response.headers.add(header, value);
-    request.response.close();
-  });
-
-  final completer = Completer<void>();
-  HttpClient client = HttpClient();
-  client
-      .open(connect, "127.0.0.1", server.port, "/")
-      .then((HttpClientRequest request) {
-    return request.close();
-  }).then((HttpClientResponse response) {
-    Expect.equals(200, response.statusCode);
-    // Headers except Content-Length and Transfer-Encoding header will be read.
-    if (header == HttpHeaders.contentLengthHeader ||
-        header == HttpHeaders.transferEncodingHeader) {
-      Expect.isNull(response.headers[header]);
-    } else {
-      Expect.isNotNull(response.headers[header]);
-      Expect.equals(1, response.headers[header].length);
-      Expect.equals(value, response.headers[header][0]);
-    }
-
-    client.close();
-    server.close();
-    completer.complete();
-  });
-
-  await completer.future;
-}
-
-Future<void> runTests() async {
-  await test(HttpHeaders.contentLengthHeader, 0);
-  await test(HttpHeaders.transferEncodingHeader, 'chunked');
-  await test('testHeader', 'testValue');
-}
-
-main() {
-  asyncTest(runTests);
-}
diff --git a/tests/standalone_2/io/http_parser_header_add_test.dart b/tests/standalone_2/io/http_parser_header_add_test.dart
deleted file mode 100644
index ebb947b..0000000
--- a/tests/standalone_2/io/http_parser_header_add_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:io";
-
-import "package:async_helper/async_helper.dart";
-
-// The ’ character is U+2019 RIGHT SINGLE QUOTATION MARK.
-final value = 'Bob’s browser';
-
-// When a invalid value is added to http header, test that a FormatException is
-// thrown on an invalid user-agent header.
-Future<void> main() async {
-  final client = HttpClient();
-  client.userAgent = value;
-
-  asyncExpectThrows<FormatException>(() async {
-    try {
-      await client.getUrl(Uri.parse('https://postman-echo.com/get?'));
-    } finally {
-      client.close(force: true);
-    }
-  });
-}
diff --git a/tests/standalone_2/io/socket_hang_test.dart b/tests/standalone_2/io/socket_hang_test.dart
index 810d2a1..2231844 100644
--- a/tests/standalone_2/io/socket_hang_test.dart
+++ b/tests/standalone_2/io/socket_hang_test.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
+import 'dart:convert';
+import 'dart:io' as io;
 
-import 'package:expect/expect.dart';
-
-// A regression test for: https://github.com/dart-lang/sdk/issues/40589
-Future<void> main(List<String> args) async {
+void main(List<String> args) async {
   if (args.length != 0) {
     for (int i = 0; i < 100000; i++) {
       print('line $i');
@@ -16,14 +14,11 @@
     return;
   } else {
     // Create child process and keeps writing into stdout.
-    final p = await Process.start(
-        Platform.executable, [Platform.script.toFilePath(), 'child']);
-    p.stdout.drain();
-    p.stderr.drain();
+    final p = await io.Process.start(
+        io.Platform.executable, [io.Platform.script.toFilePath(), 'child']);
+    p.stdout.transform(utf8.decoder).listen((x) => print('stdout: $x'));
+    p.stderr.transform(utf8.decoder).listen((x) => print('stderr: $x'));
     final exitCode = await p.exitCode;
-    if (exitCode != 0) {
-      Expect.fail('process failed with ${exitCode}');
-    }
-    return;
+    print('process exited with ${exitCode}');
   }
 }
diff --git a/tests/standalone_2/io/unix_socket_test.dart b/tests/standalone_2/io/unix_socket_test.dart
index cc6ed79..7c52777 100644
--- a/tests/standalone_2/io/unix_socket_test.dart
+++ b/tests/standalone_2/io/unix_socket_test.dart
@@ -74,7 +74,7 @@
   var socket = await Socket.connect(address, server.port);
   socket.write(" socket content");
 
-  await socket.destroy();
+  socket.destroy();
   await server.close();
 }
 
@@ -138,7 +138,7 @@
 }
 
 // Create socket in temp directory
-Future withTempDir(String prefix, void test(Directory dir)) async {
+Future withTempDir(String prefix, Future<void> test(Directory dir)) async {
   var tempDir = Directory.systemTemp.createTempSync(prefix);
   try {
     await test(tempDir);
diff --git a/third_party/pkg_tested/pkg_tested.status b/third_party/pkg_tested/pkg_tested.status
index 47ab254..0b31420 100644
--- a/third_party/pkg_tested/pkg_tested.status
+++ b/third_party/pkg_tested/pkg_tested.status
@@ -15,7 +15,6 @@
 pub/test/transformer/loads_a_diamond_transformer_dependency_graph_test: Pass, Slow
 
 [ $runtime == vm ]
-dart_style/test/command_line_test: Skip # Issue 33473
 http_io/test/http_cross_process_test: Skip # Fails with --no-preview-dart-2
 http_io/test/http_proxy_advanced_test: Pass, RuntimeError # flaky
 http_io/test/http_proxy_test: Pass, RuntimeError # flaky
diff --git a/tools/VERSION b/tools/VERSION
index aad0d9f..8324ed2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
 MAJOR 2
 MINOR 9
 PATCH 0
-PRERELEASE 3
+PRERELEASE 4
 PRERELEASE_PATCH 0
 ABI_VERSION 32
 OLDEST_SUPPORTED_ABI_VERSION 32
diff --git a/tools/bots/get_builder_status.dart b/tools/bots/get_builder_status.dart
index 3612ffa..725c9f4 100755
--- a/tools/bots/get_builder_status.dart
+++ b/tools/bots/get_builder_status.dart
@@ -23,8 +23,6 @@
 String builderBase;
 int buildNumber;
 String token;
-List<String> configurations;
-Map<String, List<Map<String, dynamic>>> failures = {};
 http.Client client;
 
 String get buildTable => builder.endsWith('-try') ? 'try_builds' : 'builds';
@@ -77,19 +75,21 @@
       if (document != null) {
         bool success = booleanFieldOrFalse(document, 'success');
         bool completed = booleanFieldOrFalse(document, 'completed');
-        bool activeFailures = booleanFieldOrFalse(document, 'active_failures');
         if (completed) {
-          if (success) {
-            print('No unapproved new failures');
-            if (activeFailures == true) {
-              print('There are unapproved failures from previous builds');
-              await printResults();
-            }
+          print(success
+              ? 'No new unapproved failures'
+              : 'There are new unapproved failures on this build');
+          if (builder.endsWith('-try')) exit(success ? 0 : 1);
+          final configurations = await getConfigurations();
+          final failures = await fetchActiveFailures(configurations);
+          if (failures.isNotEmpty) {
+            print('There are unapproved failures');
+            printActiveFailures(failures);
+            exit(1);
           } else {
-            print('There are unapproved new failures on this build');
-            await printResults();
+            print('There are no unapproved failures');
+            exit(0);
           }
-          exit((success && (activeFailures != true)) ? 0 : 1);
         }
         String chunks =
             (document['fields']['num_chunks'] ?? const {})['integerValue'];
@@ -116,12 +116,6 @@
   exit(2);
 }
 
-void printResults() async {
-  if (builder.endsWith('-try')) return;
-  configurations = await getConfigurations();
-  await printActiveFailures();
-}
-
 Future<List<String>> getConfigurations() async {
   final response = await runFirestoreQuery(configurationsQuery());
   if (response.statusCode == HttpStatus.ok) {
@@ -153,7 +147,9 @@
   return 'missing hash for commit $index';
 }
 
-Future<void> printActiveFailures() async {
+Future<Map<String, List<Map<String, dynamic>>>> fetchActiveFailures(
+    List<String> configurations) async {
+  final failures = <String, List<Map<String, dynamic>>>{};
   for (final configuration in configurations) {
     final response =
         await runFirestoreQuery(unapprovedFailuresQuery(configuration));
@@ -165,8 +161,10 @@
         final fields = document['fields'];
         failures.putIfAbsent(configuration, () => []).add({
           'name': fields['name']['stringValue'],
-          'start': int.parse(fields['blamelist_start_index']['integerValue']),
-          'end': int.parse(fields['blamelist_end_index']['integerValue']),
+          'start_commit': await commitHash(
+              int.parse(fields['blamelist_start_index']['integerValue'])),
+          'end_commit': await commitHash(
+              int.parse(fields['blamelist_end_index']['integerValue'])),
           'result': fields['result']['stringValue'],
           'expected': fields['expected']['stringValue'],
           'previous': fields['previous_result']['stringValue'],
@@ -174,6 +172,10 @@
       }
     }
   }
+  return failures;
+}
+
+void printActiveFailures(Map<String, List<Map<String, dynamic>>> failures) {
   for (final configuration in failures.keys) {
     print('($configuration):');
     for (final failure in failures[configuration]) {
@@ -187,10 +189,10 @@
         ', expected ',
         failure['expected'],
         ') at ',
-        (await commitHash(failure['start'])).substring(0, 6),
-        if (failure['start'] != failure['end']) ...[
+        failure['start_commit'].substring(0, 6),
+        if (failure['end_commit'] != failure['start_commit']) ...[
           '..',
-          (await commitHash(failure['end'])).substring(0, 6)
+          failure['end_commit'].substring(0, 6)
         ]
       ].join(''));
     }
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 068c5df..32fbbf1 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -171,10 +171,13 @@
       "tests/co19_2/co19_2-runtime.status",
       "tests/compiler/",
       "tests/corelib_2/",
+      "tests/corelib/",
       "tests/dart/",
       "tests/kernel/",
       "tests/language_2/",
+      "tests/language/",
       "tests/lib_2/",
+      "tests/lib/",
       "tests/light_unittest.dart",
       "tests/search/",
       "tests/standalone_2/",
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index 150f727..d4f94297 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -4,7 +4,7 @@
 interface WaveShaperNode {
   // TODO(ager): Auto-generate this custom method when the info about retaining
   // typed arrays is in the IDL.
-  [Custom=Setter] attribute Float32Array curve;
+  [Custom=Setter] attribute Float32Array? curve;
 };
 
 [DartSupplemental]
@@ -40,14 +40,14 @@
 
 [DartSupplemental]
 interface Element {
-  readonly attribute Element nextElementSibling;
-  readonly attribute Element previousElementSibling;
+  readonly attribute Element? nextElementSibling;
+  readonly attribute Element? previousElementSibling;
 };
 
 [DartSupplemental]
 interface CharacterData {
-  readonly attribute Element nextElementSibling;
-  readonly attribute Element previousElementSibling;
+  readonly attribute Element? nextElementSibling;
+  readonly attribute Element? previousElementSibling;
 };
 
 [Callback]
@@ -418,6 +418,9 @@
   [DartSuppress] void scroll(long x, long y);
   [DartSuppress] void scroll(long x, long y, Dictionary scrollOptions);
   [RaisesException] void scroll(long x, long y, optional Dictionary scrollOptions);
+
+  [RuntimeEnabled=VisualViewportAPI, Replaceable, SameObject, DartSuppress] readonly attribute VisualViewport visualViewport;
+  [RuntimeEnabled=VisualViewportAPI, Replaceable, SameObject] readonly attribute VisualViewport? visualViewport;
 };
 
 [DartSupplemental]
diff --git a/tools/dom/scripts/databasebuilder.py b/tools/dom/scripts/databasebuilder.py
index 0636a47..e768ee4 100755
--- a/tools/dom/scripts/databasebuilder.py
+++ b/tools/dom/scripts/databasebuilder.py
@@ -271,6 +271,8 @@
             res = node.id
             if res.startswith('unsigned '):
                 res = res[len('unsigned '):]
+            if hasattr(node, 'nullable') and node.nullable:
+                res += '?'
             return res
 
         res = []
diff --git a/utils/dartdev/BUILD.gn b/utils/dartdev/BUILD.gn
index 495643d..44a5426 100644
--- a/utils/dartdev/BUILD.gn
+++ b/utils/dartdev/BUILD.gn
@@ -18,8 +18,20 @@
                             ],
                             "list lines")
 
-application_snapshot("dartdev") {
+group("dartdev") {
+  deps = [ ":copy_dartdev_snapshot" ]
+}
+
+copy("copy_dartdev_snapshot") {
+  visibility = [ ":dartdev" ]
+  deps = [ ":generate_dartdev_snapshot" ]
+  sources = [ "$root_gen_dir/dartdev.dart.snapshot" ]
+  outputs = [ "$root_out_dir/dartdev.dart.snapshot" ]
+}
+
+application_snapshot("generate_dartdev_snapshot") {
   main_dart = "../../pkg/dartdev/bin/dartdev.dart"
   training_args = [ "--help" ]
   inputs = dartdev_files + dartfix_files
+  output = "$root_gen_dir/dartdev.dart.snapshot"
 }