Version 1.4.0-dev.6.0

svn merge -r 35615:35841 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@35843 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/client/tools/buildbot_annotated_steps.py b/client/tools/buildbot_annotated_steps.py
index a2b306f..9dacc5a 100755
--- a/client/tools/buildbot_annotated_steps.py
+++ b/client/tools/buildbot_annotated_steps.py
@@ -208,6 +208,8 @@
     status = ProcessBot(name, 'linux_distribution_support')
   elif name.startswith('ft'):
     status = ProcessBot(name, 'functional_testing')
+  elif name.startswith('version-checker'):
+    status = ProcessBot(name, 'version_checker')
   else:
     status = ProcessBot(name, 'compiler')
 
diff --git a/dart.gyp b/dart.gyp
index b7ae219..0dbe443 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -8,9 +8,10 @@
       'target_name': 'most',
       'type': 'none',
       'dependencies': [
-        'dartanalyzer',
+        'analyzer_java',
         'create_sdk',
         'dart2js',
+        'dartanalyzer',
         'editor',
         'packages',
         'runtime',
@@ -55,6 +56,13 @@
       ],
     },
     {
+      'target_name': 'analyzer_java',
+      'type': 'none',
+      'dependencies': [
+        'editor/analyzer_java.gyp:analyzer',
+      ],
+    },
+    {
       'target_name': 'dartfmt',
       'type': 'none',
       'dependencies': [
diff --git a/pkg/analysis_server/lib/src/generated/service_computers.dart b/pkg/analysis_server/lib/src/generated/service_computers.dart
index 3a83340..8f8d10f 100644
--- a/pkg/analysis_server/lib/src/generated/service_computers.dart
+++ b/pkg/analysis_server/lib/src/generated/service_computers.dart
@@ -12,8 +12,10 @@
 import 'package:analyzer/src/generated/source.dart' show Source;
 import 'package:analyzer/src/generated/scanner.dart' show Token;
 import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'service_interfaces.dart';
+import 'package:analyzer/src/generated/element.dart' as pae;
+import 'package:analyzer/src/generated/element.dart' show DartType;
+import 'package:analyzer/src/generated/source.dart';
+import 'service_interfaces.dart' as psi;
 
 /**
  * A computer for [HighlightRegion]s in a Dart [CompilationUnit].
@@ -21,14 +23,14 @@
 class DartUnitHighlightsComputer {
   final CompilationUnit _unit;
 
-  List<HighlightRegion> _regions = [];
+  List<psi.HighlightRegion> _regions = [];
 
   DartUnitHighlightsComputer(this._unit);
 
   /**
    * Returns the computed [HighlightRegion]s, not `null`.
    */
-  List<HighlightRegion> compute() {
+  List<psi.HighlightRegion> compute() {
     _unit.accept(new RecursiveAstVisitor_DartUnitHighlightsComputer_compute(this));
     return new List.from(_regions);
   }
@@ -76,39 +78,39 @@
     if (_addIdentifierRegion_typeParameter(node)) {
       return;
     }
-    _addRegion_node(node, HighlightType.IDENTIFIER_DEFAULT);
+    _addRegion_node(node, psi.HighlightType.IDENTIFIER_DEFAULT);
   }
 
   void _addIdentifierRegion_annotation(Annotation node) {
     ArgumentList arguments = node.arguments;
     if (arguments == null) {
-      _addRegion_node(node, HighlightType.ANNOTATION);
+      _addRegion_node(node, psi.HighlightType.ANNOTATION);
     } else {
-      _addRegion_nodeStart_tokenEnd(node, arguments.beginToken, HighlightType.ANNOTATION);
-      _addRegion_token(arguments.endToken, HighlightType.ANNOTATION);
+      _addRegion_nodeStart_tokenEnd(node, arguments.beginToken, psi.HighlightType.ANNOTATION);
+      _addRegion_token(arguments.endToken, psi.HighlightType.ANNOTATION);
     }
   }
 
   bool _addIdentifierRegion_class(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is! ClassElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.ClassElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.CLASS);
+    return _addRegion_node(node, psi.HighlightType.CLASS);
   }
 
   bool _addIdentifierRegion_constructor(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is! ConstructorElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.ConstructorElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.CONSTRUCTOR);
+    return _addRegion_node(node, psi.HighlightType.CONSTRUCTOR);
   }
 
   bool _addIdentifierRegion_dynamicType(SimpleIdentifier node) {
     // should be variable
-    Element element = node.staticElement;
-    if (element is! VariableElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.VariableElement) {
       return false;
     }
     // has propagated type
@@ -121,51 +123,51 @@
       return false;
     }
     // OK
-    return _addRegion_node(node, HighlightType.DYNAMIC_TYPE);
+    return _addRegion_node(node, psi.HighlightType.DYNAMIC_TYPE);
   }
 
   bool _addIdentifierRegion_field(SimpleIdentifier node) {
-    Element element = node.bestElement;
-    if (element is FieldFormalParameterElement) {
-      element = (element as FieldFormalParameterElement).field;
+    pae.Element element = node.bestElement;
+    if (element is pae.FieldFormalParameterElement) {
+      element = (element as pae.FieldFormalParameterElement).field;
     }
-    if (element is FieldElement) {
-      if ((element as FieldElement).isStatic) {
-        return _addRegion_node(node, HighlightType.FIELD_STATIC);
+    if (element is pae.FieldElement) {
+      if ((element as pae.FieldElement).isStatic) {
+        return _addRegion_node(node, psi.HighlightType.FIELD_STATIC);
       } else {
-        return _addRegion_node(node, HighlightType.FIELD);
+        return _addRegion_node(node, psi.HighlightType.FIELD);
       }
     }
-    if (element is PropertyAccessorElement) {
-      if ((element as PropertyAccessorElement).isStatic) {
-        return _addRegion_node(node, HighlightType.FIELD_STATIC);
+    if (element is pae.PropertyAccessorElement) {
+      if ((element as pae.PropertyAccessorElement).isStatic) {
+        return _addRegion_node(node, psi.HighlightType.FIELD_STATIC);
       } else {
-        return _addRegion_node(node, HighlightType.FIELD);
+        return _addRegion_node(node, psi.HighlightType.FIELD);
       }
     }
     return false;
   }
 
   bool _addIdentifierRegion_function(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is! FunctionElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.FunctionElement) {
       return false;
     }
-    HighlightType type;
+    psi.HighlightType type;
     if (node.inDeclarationContext()) {
-      type = HighlightType.FUNCTION_DECLARATION;
+      type = psi.HighlightType.FUNCTION_DECLARATION;
     } else {
-      type = HighlightType.FUNCTION;
+      type = psi.HighlightType.FUNCTION;
     }
     return _addRegion_node(node, type);
   }
 
   bool _addIdentifierRegion_functionTypeAlias(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is! FunctionTypeAliasElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.FunctionTypeAliasElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.FUNCTION_TYPE_ALIAS);
+    return _addRegion_node(node, psi.HighlightType.FUNCTION_TYPE_ALIAS);
   }
 
   bool _addIdentifierRegion_getterSetterDeclaration(SimpleIdentifier node) {
@@ -175,117 +177,117 @@
       return false;
     }
     // should be property accessor
-    Element element = node.staticElement;
-    if (element is! PropertyAccessorElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.PropertyAccessorElement) {
       return false;
     }
     // getter or setter
-    PropertyAccessorElement propertyAccessorElement = element as PropertyAccessorElement;
+    pae.PropertyAccessorElement propertyAccessorElement = element as pae.PropertyAccessorElement;
     if (propertyAccessorElement.isGetter) {
-      return _addRegion_node(node, HighlightType.GETTER_DECLARATION);
+      return _addRegion_node(node, psi.HighlightType.GETTER_DECLARATION);
     } else {
-      return _addRegion_node(node, HighlightType.SETTER_DECLARATION);
+      return _addRegion_node(node, psi.HighlightType.SETTER_DECLARATION);
     }
   }
 
   bool _addIdentifierRegion_importPrefix(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is! PrefixElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.PrefixElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.IMPORT_PREFIX);
+    return _addRegion_node(node, psi.HighlightType.IMPORT_PREFIX);
   }
 
   bool _addIdentifierRegion_keyword(SimpleIdentifier node) {
     String name = node.name;
     if (name == "void") {
-      return _addRegion_node(node, HighlightType.KEYWORD);
+      return _addRegion_node(node, psi.HighlightType.KEYWORD);
     }
     return false;
   }
 
   bool _addIdentifierRegion_localVariable(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is! LocalVariableElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.LocalVariableElement) {
       return false;
     }
     // OK
-    HighlightType type;
+    psi.HighlightType type;
     if (node.inDeclarationContext()) {
-      type = HighlightType.LOCAL_VARIABLE_DECLARATION;
+      type = psi.HighlightType.LOCAL_VARIABLE_DECLARATION;
     } else {
-      type = HighlightType.LOCAL_VARIABLE;
+      type = psi.HighlightType.LOCAL_VARIABLE;
     }
     return _addRegion_node(node, type);
   }
 
   bool _addIdentifierRegion_method(SimpleIdentifier node) {
-    Element element = node.bestElement;
-    if (element is! MethodElement) {
+    pae.Element element = node.bestElement;
+    if (element is! pae.MethodElement) {
       return false;
     }
-    MethodElement methodElement = element as MethodElement;
+    pae.MethodElement methodElement = element as pae.MethodElement;
     bool isStatic = methodElement.isStatic;
     // OK
-    HighlightType type;
+    psi.HighlightType type;
     if (node.inDeclarationContext()) {
       if (isStatic) {
-        type = HighlightType.METHOD_DECLARATION_STATIC;
+        type = psi.HighlightType.METHOD_DECLARATION_STATIC;
       } else {
-        type = HighlightType.METHOD_DECLARATION;
+        type = psi.HighlightType.METHOD_DECLARATION;
       }
     } else {
       if (isStatic) {
-        type = HighlightType.METHOD_STATIC;
+        type = psi.HighlightType.METHOD_STATIC;
       } else {
-        type = HighlightType.METHOD;
+        type = psi.HighlightType.METHOD;
       }
     }
     return _addRegion_node(node, type);
   }
 
   bool _addIdentifierRegion_parameter(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is! ParameterElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.ParameterElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.PARAMETER);
+    return _addRegion_node(node, psi.HighlightType.PARAMETER);
   }
 
   bool _addIdentifierRegion_topLevelVariable(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is! TopLevelVariableElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.TopLevelVariableElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.TOP_LEVEL_VARIABLE);
+    return _addRegion_node(node, psi.HighlightType.TOP_LEVEL_VARIABLE);
   }
 
   bool _addIdentifierRegion_typeParameter(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is! TypeParameterElement) {
+    pae.Element element = node.staticElement;
+    if (element is! pae.TypeParameterElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.TYPE_PARAMETER);
+    return _addRegion_node(node, psi.HighlightType.TYPE_PARAMETER);
   }
 
-  void _addRegion(int offset, int length, HighlightType type) {
+  void _addRegion(int offset, int length, psi.HighlightType type) {
     _regions.add(new HighlightRegionImpl(offset, length, type));
   }
 
-  bool _addRegion_node(AstNode node, HighlightType type) {
+  bool _addRegion_node(AstNode node, psi.HighlightType type) {
     int offset = node.offset;
     int length = node.length;
     _addRegion(offset, length, type);
     return true;
   }
 
-  void _addRegion_nodeStart_tokenEnd(AstNode a, Token b, HighlightType type) {
+  void _addRegion_nodeStart_tokenEnd(AstNode a, Token b, psi.HighlightType type) {
     int offset = a.offset;
     int end = b.end;
     _addRegion(offset, end - offset, type);
   }
 
-  void _addRegion_token(Token token, HighlightType type) {
+  void _addRegion_token(Token token, psi.HighlightType type) {
     if (token != null) {
       int offset = token.offset;
       int length = token.length;
@@ -293,7 +295,7 @@
     }
   }
 
-  void _addRegion_tokenStart_tokenEnd(Token a, Token b, HighlightType type) {
+  void _addRegion_tokenStart_tokenEnd(Token a, Token b, psi.HighlightType type) {
     int offset = a.offset;
     int end = b.end;
     _addRegion(offset, end - offset, type);
@@ -306,14 +308,14 @@
 class DartUnitNavigationComputer {
   final CompilationUnit _unit;
 
-  List<NavigationRegion> _regions = [];
+  List<psi.NavigationRegion> _regions = [];
 
   DartUnitNavigationComputer(this._unit);
 
   /**
    * Returns the computed [NavigationRegion]s, not `null`.
    */
-  List<NavigationRegion> compute() {
+  List<psi.NavigationRegion> compute() {
     _unit.accept(new RecursiveAstVisitor_DartUnitNavigationComputer_compute(this));
     return new List.from(_regions);
   }
@@ -322,15 +324,15 @@
    * If the given [Element] is not `null`, then creates a corresponding
    * [NavigationRegion].
    */
-  void _addRegion(int offset, int length, Element element) {
-    NavigationTarget target = _createTarget(element);
+  void _addRegion(int offset, int length, pae.Element element) {
+    psi.Element target = _createTarget(element);
     if (target == null) {
       return;
     }
-    _regions.add(new NavigationRegionImpl(offset, length, <NavigationTarget> [target]));
+    _regions.add(new NavigationRegionImpl(offset, length, <psi.Element> [target]));
   }
 
-  void _addRegion_tokenStart_nodeEnd(Token a, AstNode b, Element element) {
+  void _addRegion_tokenStart_nodeEnd(Token a, AstNode b, pae.Element element) {
     int offset = a.offset;
     int length = b.end - offset;
     _addRegion(offset, length, element);
@@ -340,7 +342,7 @@
    * If the given [Element] is not `null`, then creates a corresponding
    * [NavigationRegion].
    */
-  void _addRegionForNode(AstNode node, Element element) {
+  void _addRegionForNode(AstNode node, pae.Element element) {
     int offset = node.offset;
     int length = node.length;
     _addRegion(offset, length, element);
@@ -350,53 +352,50 @@
    * If the given [Element] is not `null`, then creates a corresponding
    * [NavigationRegion].
    */
-  void _addRegionForToken(Token token, Element element) {
+  void _addRegionForToken(Token token, pae.Element element) {
     int offset = token.offset;
     int length = token.length;
     _addRegion(offset, length, element);
   }
 
   /**
-   * Returns the [NavigationTarget] for the given [Element], maybe `null` if
-   * `null` was given.
+   * Returns the [com.google.dart.server.Element] for the given [Element], maybe
+   * `null` if `null` was given.
    */
-  NavigationTarget _createTarget(Element element) {
+  psi.Element _createTarget(pae.Element element) {
     if (element == null) {
       return null;
     }
-    if (element is FieldFormalParameterElement) {
-      element = (element as FieldFormalParameterElement).field;
+    if (element is pae.FieldFormalParameterElement) {
+      element = (element as pae.FieldFormalParameterElement).field;
     }
-    int nameOffset = element.nameOffset;
-    int nameLength = element.displayName.length;
-    if (nameOffset == -1) {
-      nameLength = 0;
-    }
-    return new NavigationTargetImpl(element.source, _getElementId(element), nameOffset, nameLength);
+    return ElementImpl.create(element);
   }
-
-  String _getElementId(Element element) => element.location.encoding;
 }
 
 /**
  * A computer for [Outline]s in a Dart [CompilationUnit].
  */
 class DartUnitOutlineComputer {
+  static String _UNITTEST_LIBRARY = "unittest";
+
+  final Source _source;
+
   final CompilationUnit _unit;
 
-  DartUnitOutlineComputer(this._unit);
+  DartUnitOutlineComputer(this._source, this._unit);
 
   /**
    * Returns the computed [Outline]s, not `null`.
    */
-  Outline compute() {
+  psi.Outline compute() {
     OutlineImpl unitOutline = _newUnitOutline();
-    List<Outline> unitChildren = [];
+    List<psi.Outline> unitChildren = [];
     for (CompilationUnitMember unitMember in _unit.declarations) {
       if (unitMember is ClassDeclaration) {
         ClassDeclaration classDeclartion = unitMember;
         OutlineImpl classOutline = _newClassOutline(unitOutline, unitChildren, classDeclartion);
-        List<Outline> classChildren = [];
+        List<psi.Outline> classChildren = [];
         for (ClassMember classMember in classDeclartion.members) {
           if (classMember is ConstructorDeclaration) {
             ConstructorDeclaration constructorDeclaration = classMember;
@@ -437,16 +436,59 @@
     return unitOutline;
   }
 
-  void _addLocalFunctionOutlines(OutlineImpl parenet, FunctionBody body) {
-    List<Outline> localOutlines = [];
-    body.accept(new RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines(this, parenet, localOutlines));
-    parenet.children = new List.from(localOutlines);
+  void _addLocalFunctionOutlines(OutlineImpl parent, FunctionBody body) {
+    List<psi.Outline> localOutlines = [];
+    body.accept(new RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines(this, parent, localOutlines));
+    parent.children = new List.from(localOutlines);
+  }
+
+  bool _addUnitTestOutlines(OutlineImpl parent, List<psi.Outline> children, MethodInvocation node) {
+    psi.ElementKind unitTestKind = null;
+    if (_isUnitTestFunctionInvocation(node, "group")) {
+      unitTestKind = psi.ElementKind.UNIT_TEST_GROUP;
+    } else if (_isUnitTestFunctionInvocation(node, "test")) {
+      unitTestKind = psi.ElementKind.UNIT_TEST_CASE;
+    } else {
+      return false;
+    }
+    ArgumentList argumentList = node.argumentList;
+    if (argumentList != null) {
+      List<Expression> arguments = argumentList.arguments;
+      if (arguments.length == 2 && arguments[1] is FunctionExpression) {
+        // prepare name
+        String name;
+        int nameOffset;
+        int nameLength;
+        {
+          Expression nameNode = arguments[0];
+          if (nameNode is SimpleStringLiteral) {
+            SimpleStringLiteral nameLiteral = arguments[0] as SimpleStringLiteral;
+            name = nameLiteral.value;
+            nameOffset = nameLiteral.valueOffset;
+            nameLength = name.length;
+          } else {
+            name = "??????????";
+            nameOffset = nameNode.offset;
+            nameLength = nameNode.length;
+          }
+        }
+        // add a new outline
+        FunctionExpression functionExpression = arguments[1] as FunctionExpression;
+        SourceRegionImpl sourceRegion = new SourceRegionImpl(node.offset, node.length);
+        ElementImpl element = new ElementImpl(null, _source, unitTestKind, name, nameOffset, nameLength, null, null, false, false, false);
+        OutlineImpl outline = new OutlineImpl(parent, element, sourceRegion);
+        children.add(outline);
+        _addLocalFunctionOutlines(outline, functionExpression.body);
+        return true;
+      }
+    }
+    return false;
   }
 
   /**
    * Returns the [AstNode]'s source region.
    */
-  SourceRegion _getSourceRegion(AstNode node) {
+  psi.SourceRegion _getSourceRegion(AstNode node) {
     int endOffset = node.end;
     // prepare position of the node among its siblings
     int firstOffset;
@@ -490,21 +532,45 @@
     return new SourceRegionImpl(prevSiblingEnd, endOffset - prevSiblingEnd);
   }
 
-  OutlineImpl _newClassOutline(Outline unitOutline, List<Outline> unitChildren, ClassDeclaration classDeclaration) {
+  /**
+   * Returns `true` if the given [MethodInvocation] is invocation of the function with
+   * the given name from the "unittest" library.
+   */
+  bool _isUnitTestFunctionInvocation(MethodInvocation node, String name) {
+    SimpleIdentifier methodName = node.methodName;
+    if (methodName != null) {
+      pae.Element element = methodName.staticElement;
+      if (element is pae.FunctionElement) {
+        pae.FunctionElement functionElement = element;
+        if (name == functionElement.name) {
+          pae.LibraryElement libraryElement = functionElement.library;
+          return libraryElement != null && _UNITTEST_LIBRARY == libraryElement.name;
+        }
+      }
+    }
+    return false;
+  }
+
+  OutlineImpl _newClassOutline(psi.Outline unitOutline, List<psi.Outline> unitChildren, ClassDeclaration classDeclaration) {
     SimpleIdentifier nameNode = classDeclaration.name;
     String name = nameNode.name;
-    OutlineImpl outline = new OutlineImpl(unitOutline, _getSourceRegion(classDeclaration), OutlineKind.CLASS, name, nameNode.offset, name.length, null, null, classDeclaration.isAbstract, StringUtilities.startsWithChar(name, 0x5F), false);
+    ElementImpl element = new ElementImpl(ElementImpl.createId(classDeclaration.element), _source, psi.ElementKind.CLASS, name, nameNode.offset, name.length, null, null, classDeclaration.isAbstract, false, StringUtilities.startsWithChar(name, 0x5F));
+    psi.SourceRegion sourceRegion = _getSourceRegion(classDeclaration);
+    OutlineImpl outline = new OutlineImpl(unitOutline, element, sourceRegion);
     unitChildren.add(outline);
     return outline;
   }
 
-  void _newClassTypeAlias(Outline unitOutline, List<Outline> unitChildren, ClassTypeAlias alias) {
+  void _newClassTypeAlias(psi.Outline unitOutline, List<psi.Outline> unitChildren, ClassTypeAlias alias) {
     SimpleIdentifier nameNode = alias.name;
     String name = nameNode.name;
-    unitChildren.add(new OutlineImpl(unitOutline, _getSourceRegion(alias), OutlineKind.CLASS_TYPE_ALIAS, name, nameNode.offset, nameNode.length, null, null, alias.isAbstract, StringUtilities.startsWithChar(name, 0x5F), false));
+    ElementImpl element = new ElementImpl(ElementImpl.createId(alias.element), _source, psi.ElementKind.CLASS_TYPE_ALIAS, name, nameNode.offset, nameNode.length, null, null, alias.isAbstract, false, StringUtilities.startsWithChar(name, 0x5F));
+    psi.SourceRegion sourceRegion = _getSourceRegion(alias);
+    OutlineImpl outline = new OutlineImpl(unitOutline, element, sourceRegion);
+    unitChildren.add(outline);
   }
 
-  void _newConstructorOutline(OutlineImpl classOutline, List<Outline> children, ConstructorDeclaration constructorDeclaration) {
+  void _newConstructorOutline(OutlineImpl classOutline, List<psi.Outline> children, ConstructorDeclaration constructorDeclaration) {
     Identifier returnType = constructorDeclaration.returnType;
     String name = returnType.name;
     int offset = returnType.offset;
@@ -519,70 +585,234 @@
       length = constructorNameNode.length;
     }
     FormalParameterList parameters = constructorDeclaration.parameters;
-    OutlineImpl outline = new OutlineImpl(classOutline, _getSourceRegion(constructorDeclaration), OutlineKind.CONSTRUCTOR, name, offset, length, parameters != null ? parameters.toSource() : "", null, false, isPrivate, false);
+    ElementImpl element = new ElementImpl(ElementImpl.createId(constructorDeclaration.element), _source, psi.ElementKind.CONSTRUCTOR, name, offset, length, parameters != null ? parameters.toSource() : "", null, false, false, isPrivate);
+    psi.SourceRegion sourceRegion = _getSourceRegion(constructorDeclaration);
+    OutlineImpl outline = new OutlineImpl(classOutline, element, sourceRegion);
     children.add(outline);
     _addLocalFunctionOutlines(outline, constructorDeclaration.body);
   }
 
-  void _newField(OutlineImpl classOutline, List<Outline> children, String fieldTypeName, VariableDeclaration field, bool isStatic) {
+  void _newField(OutlineImpl classOutline, List<psi.Outline> children, String fieldTypeName, VariableDeclaration field, bool isStatic) {
     SimpleIdentifier nameNode = field.name;
     String name = nameNode.name;
-    children.add(new OutlineImpl(classOutline, _getSourceRegion(field), OutlineKind.FIELD, name, nameNode.offset, nameNode.length, null, fieldTypeName, false, StringUtilities.startsWithChar(name, 0x5F), isStatic));
+    ElementImpl element = new ElementImpl(ElementImpl.createId(field.element), _source, psi.ElementKind.FIELD, name, nameNode.offset, nameNode.length, null, fieldTypeName, false, isStatic, StringUtilities.startsWithChar(name, 0x5F));
+    psi.SourceRegion sourceRegion = _getSourceRegion(field);
+    OutlineImpl outline = new OutlineImpl(classOutline, element, sourceRegion);
+    children.add(outline);
   }
 
-  void _newFunctionOutline(Outline unitOutline, List<Outline> unitChildren, FunctionDeclaration functionDeclaration) {
+  void _newFunctionOutline(psi.Outline parent, List<psi.Outline> children, FunctionDeclaration functionDeclaration) {
     TypeName returnType = functionDeclaration.returnType;
     SimpleIdentifier nameNode = functionDeclaration.name;
     String name = nameNode.name;
     FunctionExpression functionExpression = functionDeclaration.functionExpression;
     FormalParameterList parameters = functionExpression.parameters;
-    OutlineKind kind;
+    psi.ElementKind kind;
     if (functionDeclaration.isGetter) {
-      kind = OutlineKind.GETTER;
+      kind = psi.ElementKind.GETTER;
     } else if (functionDeclaration.isSetter) {
-      kind = OutlineKind.SETTER;
+      kind = psi.ElementKind.SETTER;
     } else {
-      kind = OutlineKind.FUNCTION;
+      kind = psi.ElementKind.FUNCTION;
     }
-    OutlineImpl outline = new OutlineImpl(unitOutline, _getSourceRegion(functionDeclaration), kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, StringUtilities.startsWithChar(name, 0x5F), false);
-    unitChildren.add(outline);
+    ElementImpl element = new ElementImpl(ElementImpl.createId(functionDeclaration.element), _source, kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, false, StringUtilities.startsWithChar(name, 0x5F));
+    psi.SourceRegion sourceRegion = _getSourceRegion(functionDeclaration);
+    OutlineImpl outline = new OutlineImpl(parent, element, sourceRegion);
+    children.add(outline);
     _addLocalFunctionOutlines(outline, functionExpression.body);
   }
 
-  void _newFunctionTypeAliasOutline(Outline unitOutline, List<Outline> unitChildren, FunctionTypeAlias alias) {
+  void _newFunctionTypeAliasOutline(psi.Outline unitOutline, List<psi.Outline> unitChildren, FunctionTypeAlias alias) {
     TypeName returnType = alias.returnType;
     SimpleIdentifier nameNode = alias.name;
     String name = nameNode.name;
     FormalParameterList parameters = alias.parameters;
-    unitChildren.add(new OutlineImpl(unitOutline, _getSourceRegion(alias), OutlineKind.FUNCTION_TYPE_ALIAS, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, StringUtilities.startsWithChar(name, 0x5F), false));
+    ElementImpl element = new ElementImpl(ElementImpl.createId(alias.element), _source, psi.ElementKind.FUNCTION_TYPE_ALIAS, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, false, StringUtilities.startsWithChar(name, 0x5F));
+    psi.SourceRegion sourceRegion = _getSourceRegion(alias);
+    OutlineImpl outline = new OutlineImpl(unitOutline, element, sourceRegion);
+    unitChildren.add(outline);
   }
 
-  void _newMethodOutline(OutlineImpl classOutline, List<Outline> children, MethodDeclaration methodDeclaration) {
+  void _newMethodOutline(OutlineImpl classOutline, List<psi.Outline> children, MethodDeclaration methodDeclaration) {
     TypeName returnType = methodDeclaration.returnType;
     SimpleIdentifier nameNode = methodDeclaration.name;
     String name = nameNode.name;
     FormalParameterList parameters = methodDeclaration.parameters;
-    OutlineKind kind;
+    psi.ElementKind kind;
     if (methodDeclaration.isGetter) {
-      kind = OutlineKind.GETTER;
+      kind = psi.ElementKind.GETTER;
     } else if (methodDeclaration.isSetter) {
-      kind = OutlineKind.SETTER;
+      kind = psi.ElementKind.SETTER;
     } else {
-      kind = OutlineKind.METHOD;
+      kind = psi.ElementKind.METHOD;
     }
-    OutlineImpl outline = new OutlineImpl(classOutline, _getSourceRegion(methodDeclaration), kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", methodDeclaration.isAbstract, StringUtilities.startsWithChar(name, 0x5F), methodDeclaration.isStatic);
+    ElementImpl element = new ElementImpl(ElementImpl.createId(methodDeclaration.element), _source, kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", methodDeclaration.isAbstract, methodDeclaration.isStatic, StringUtilities.startsWithChar(name, 0x5F));
+    psi.SourceRegion sourceRegion = _getSourceRegion(methodDeclaration);
+    OutlineImpl outline = new OutlineImpl(classOutline, element, sourceRegion);
     children.add(outline);
     _addLocalFunctionOutlines(outline, methodDeclaration.body);
   }
 
-  OutlineImpl _newUnitOutline() => new OutlineImpl(null, new SourceRegionImpl(_unit.offset, _unit.length), OutlineKind.COMPILATION_UNIT, null, 0, 0, null, null, false, false, false);
+  OutlineImpl _newUnitOutline() {
+    ElementImpl element = new ElementImpl(ElementImpl.createId(_unit.element), _source, psi.ElementKind.COMPILATION_UNIT, null, 0, 0, null, null, false, false, false);
+    return new OutlineImpl(null, element, new SourceRegionImpl(_unit.offset, _unit.length));
+  }
+}
+
+/**
+ * A concrete implementation of [Element].
+ */
+class ElementImpl implements psi.Element {
+  /**
+   * Creates an [ElementImpl] instance for the given
+   * [com.google.dart.engine.element.Element].
+   */
+  static ElementImpl create(pae.Element element) {
+    // prepare name
+    String name = element.displayName;
+    int nameOffset = element.nameOffset;
+    int nameLength = name != null ? name.length : 0;
+    // prepare element kind specific information
+    psi.ElementKind outlineKind;
+    bool isAbstract = false;
+    bool isStatic = false;
+    bool isPrivate = element.isPrivate;
+    while (true) {
+      if (element.kind == pae.ElementKind.CLASS) {
+        outlineKind = psi.ElementKind.CLASS;
+        isAbstract = (element as pae.ClassElement).isAbstract;
+      } else if (element.kind == pae.ElementKind.COMPILATION_UNIT) {
+        outlineKind = psi.ElementKind.COMPILATION_UNIT;
+        nameOffset = -1;
+        nameLength = 0;
+      } else if (element.kind == pae.ElementKind.CONSTRUCTOR) {
+        outlineKind = psi.ElementKind.CONSTRUCTOR;
+        String className = element.enclosingElement.name;
+        if (name.length != 0) {
+          name = "${className}.${name}";
+        } else {
+          name = className;
+        }
+      } else if (element.kind == pae.ElementKind.FUNCTION) {
+        outlineKind = psi.ElementKind.FUNCTION;
+      } else if (element.kind == pae.ElementKind.FUNCTION_TYPE_ALIAS) {
+        outlineKind = psi.ElementKind.FUNCTION_TYPE_ALIAS;
+      } else if (element.kind == pae.ElementKind.LIBRARY) {
+        outlineKind = psi.ElementKind.LIBRARY;
+      } else if (element.kind == pae.ElementKind.METHOD) {
+        outlineKind = psi.ElementKind.METHOD;
+        isAbstract = (element as pae.MethodElement).isAbstract;
+      } else {
+        outlineKind = psi.ElementKind.UNKNOWN;
+      }
+      break;
+    }
+    // extract return type and parameters from toString()
+    // TODO(scheglov) we need a way to get this information directly from an Element
+    String parameters;
+    String returnType;
+    {
+      String str = element.toString();
+      // return type
+      String rightArrow = pae.Element.RIGHT_ARROW;
+      int returnIndex = str.lastIndexOf(rightArrow);
+      if (returnIndex != -1) {
+        returnType = str.substring(returnIndex + rightArrow.length);
+        str = str.substring(0, returnIndex);
+      } else {
+        returnType = null;
+      }
+      // parameters
+      int parametersIndex = str.indexOf("(");
+      if (parametersIndex != -1) {
+        parameters = str.substring(parametersIndex);
+      } else {
+        parameters = null;
+      }
+    }
+    // new element
+    return new ElementImpl(createId(element), element.source, outlineKind, name, nameOffset, nameLength, parameters, returnType, isAbstract, isStatic, isPrivate);
+  }
+
+  /**
+   * Returns an identifier of the given [Element], maybe `null` if `null` given.
+   */
+  static String createId(pae.Element element) {
+    if (element == null) {
+      return null;
+    }
+    return element.location.encoding;
+  }
+
+  final String id;
+
+  final Source source;
+
+  final psi.ElementKind kind;
+
+  final String name;
+
+  final int offset;
+
+  final int length;
+
+  final String parameters;
+
+  final String returnType;
+
+  final bool isAbstract;
+
+  final bool isPrivate;
+
+  final bool isStatic;
+
+  ElementImpl(this.id, this.source, this.kind, this.name, this.offset, this.length, this.parameters, this.returnType, this.isAbstract, this.isStatic, this.isPrivate);
+
+  @override
+  bool operator ==(Object obj) {
+    if (identical(obj, this)) {
+      return true;
+    }
+    if (obj is! ElementImpl) {
+      return false;
+    }
+    ElementImpl other = obj as ElementImpl;
+    return other.kind == kind && (other.source == source) && (name == other.name);
+  }
+
+  @override
+  int get hashCode {
+    if (name == null) {
+      return source.hashCode;
+    }
+    return ObjectUtilities.combineHashCodes(source.hashCode, name.hashCode);
+  }
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("[name=");
+    builder.append(name);
+    builder.append(", kind=");
+    builder.append(kind);
+    builder.append(", offset=");
+    builder.append(offset);
+    builder.append(", length=");
+    builder.append(length);
+    builder.append(", parameters=");
+    builder.append(parameters);
+    builder.append(", return=");
+    builder.append(returnType);
+    builder.append("]");
+    return builder.toString();
+  }
 }
 
 /**
  * A concrete implementation of [HighlightRegion].
  */
-class HighlightRegionImpl extends SourceRegionImpl implements HighlightRegion {
-  final HighlightType type;
+class HighlightRegionImpl extends SourceRegionImpl implements psi.HighlightRegion {
+  final psi.HighlightType type;
 
   HighlightRegionImpl(int offset, int length, this.type) : super(offset, length);
 
@@ -603,8 +833,8 @@
 /**
  * A concrete implementation of [NavigationRegion].
  */
-class NavigationRegionImpl extends SourceRegionImpl implements NavigationRegion {
-  final List<NavigationTarget> targets;
+class NavigationRegionImpl extends SourceRegionImpl implements psi.NavigationRegion {
+  final List<psi.Element> targets;
 
   NavigationRegionImpl(int offset, int length, this.targets) : super(offset, length);
 
@@ -620,64 +850,18 @@
 }
 
 /**
- * A concrete implementation of [NavigationTarget].
- */
-class NavigationTargetImpl implements NavigationTarget {
-  final Source source;
-
-  final String elementId;
-
-  final int offset;
-
-  final int length;
-
-  NavigationTargetImpl(this.source, this.elementId, this.offset, this.length);
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[offset=");
-    builder.append(offset);
-    builder.append(", length=");
-    builder.append(length);
-    builder.append(", source=");
-    builder.append(source);
-    builder.append(", element=");
-    builder.append(elementId);
-    builder.append("]");
-    return builder.toString();
-  }
-}
-
-/**
  * A concrete implementation of [Outline].
  */
-class OutlineImpl implements Outline {
-  final Outline parent;
+class OutlineImpl implements psi.Outline {
+  final psi.Outline parent;
 
-  final SourceRegion sourceRegion;
+  final psi.Element element;
 
-  final OutlineKind kind;
+  final psi.SourceRegion sourceRegion;
 
-  final String name;
+  List<psi.Outline> children = psi.Outline.EMPTY_ARRAY;
 
-  final int offset;
-
-  final int length;
-
-  final String parameters;
-
-  final String returnType;
-
-  final bool isAbstract;
-
-  final bool isPrivate;
-
-  final bool isStatic;
-
-  List<Outline> children = Outline.EMPTY_ARRAY;
-
-  OutlineImpl(this.parent, this.sourceRegion, this.kind, this.name, this.offset, this.length, this.parameters, this.returnType, this.isAbstract, this.isPrivate, this.isStatic);
+  OutlineImpl(this.parent, this.element, this.sourceRegion);
 
   @override
   bool operator ==(Object obj) {
@@ -688,27 +872,22 @@
       return false;
     }
     OutlineImpl other = obj as OutlineImpl;
-    return (other.parent == parent) && other.offset == offset;
+    return (other.element == element) && (other.parent == parent);
   }
 
   @override
-  int get hashCode => offset;
+  int get hashCode {
+    if (parent == null) {
+      return element.hashCode;
+    }
+    return ObjectUtilities.combineHashCodes(parent.hashCode, element.hashCode);
+  }
 
   @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[name=");
-    builder.append(name);
-    builder.append(", kind=");
-    builder.append(kind);
-    builder.append(", offset=");
-    builder.append(offset);
-    builder.append(", length=");
-    builder.append(length);
-    builder.append(", parameters=");
-    builder.append(parameters);
-    builder.append(", return=");
-    builder.append(returnType);
+    builder.append("[element=");
+    builder.append(element);
     builder.append(", children=[");
     builder.append(StringUtils.join(children, ", "));
     builder.append("]]");
@@ -729,134 +908,134 @@
 
   @override
   Object visitAsExpression(AsExpression node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.asOperator, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.asOperator, psi.HighlightType.BUILT_IN);
     return super.visitAsExpression(node);
   }
 
   @override
   Object visitBooleanLiteral(BooleanLiteral node) {
-    DartUnitHighlightsComputer_this._addRegion_node(node, HighlightType.LITERAL_BOOLEAN);
+    DartUnitHighlightsComputer_this._addRegion_node(node, psi.HighlightType.LITERAL_BOOLEAN);
     return super.visitBooleanLiteral(node);
   }
 
   @override
   Object visitCatchClause(CatchClause node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.onKeyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.onKeyword, psi.HighlightType.BUILT_IN);
     return super.visitCatchClause(node);
   }
 
   @override
   Object visitClassDeclaration(ClassDeclaration node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.abstractKeyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.abstractKeyword, psi.HighlightType.BUILT_IN);
     return super.visitClassDeclaration(node);
   }
 
   @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
-    DartUnitHighlightsComputer_this._addRegion_token(node.factoryKeyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, psi.HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.factoryKeyword, psi.HighlightType.BUILT_IN);
     return super.visitConstructorDeclaration(node);
   }
 
   @override
   Object visitDoubleLiteral(DoubleLiteral node) {
-    DartUnitHighlightsComputer_this._addRegion_node(node, HighlightType.LITERAL_DOUBLE);
+    DartUnitHighlightsComputer_this._addRegion_node(node, psi.HighlightType.LITERAL_DOUBLE);
     return super.visitDoubleLiteral(node);
   }
 
   @override
   Object visitExportDirective(ExportDirective node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
     return super.visitExportDirective(node);
   }
 
   @override
   Object visitFieldDeclaration(FieldDeclaration node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.staticKeyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.staticKeyword, psi.HighlightType.BUILT_IN);
     return super.visitFieldDeclaration(node);
   }
 
   @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
-    DartUnitHighlightsComputer_this._addRegion_token(node.propertyKeyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, psi.HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.propertyKeyword, psi.HighlightType.BUILT_IN);
     return super.visitFunctionDeclaration(node);
   }
 
   @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
     return super.visitFunctionTypeAlias(node);
   }
 
   @override
   Object visitHideCombinator(HideCombinator node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
     return super.visitHideCombinator(node);
   }
 
   @override
   Object visitImplementsClause(ImplementsClause node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
     return super.visitImplementsClause(node);
   }
 
   @override
   Object visitImportDirective(ImportDirective node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
-    DartUnitHighlightsComputer_this._addRegion_token(node.deferredToken, HighlightType.BUILT_IN);
-    DartUnitHighlightsComputer_this._addRegion_token(node.asToken, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.deferredToken, psi.HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.asToken, psi.HighlightType.BUILT_IN);
     return super.visitImportDirective(node);
   }
 
   @override
   Object visitIntegerLiteral(IntegerLiteral node) {
-    DartUnitHighlightsComputer_this._addRegion_node(node, HighlightType.LITERAL_INTEGER);
+    DartUnitHighlightsComputer_this._addRegion_node(node, psi.HighlightType.LITERAL_INTEGER);
     return super.visitIntegerLiteral(node);
   }
 
   @override
   Object visitLibraryDirective(LibraryDirective node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
     return super.visitLibraryDirective(node);
   }
 
   @override
   Object visitMethodDeclaration(MethodDeclaration node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
-    DartUnitHighlightsComputer_this._addRegion_token(node.modifierKeyword, HighlightType.BUILT_IN);
-    DartUnitHighlightsComputer_this._addRegion_token(node.operatorKeyword, HighlightType.BUILT_IN);
-    DartUnitHighlightsComputer_this._addRegion_token(node.propertyKeyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, psi.HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.modifierKeyword, psi.HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.operatorKeyword, psi.HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.propertyKeyword, psi.HighlightType.BUILT_IN);
     return super.visitMethodDeclaration(node);
   }
 
   @override
   Object visitNativeClause(NativeClause node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
     return super.visitNativeClause(node);
   }
 
   @override
   Object visitNativeFunctionBody(NativeFunctionBody node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.nativeToken, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.nativeToken, psi.HighlightType.BUILT_IN);
     return super.visitNativeFunctionBody(node);
   }
 
   @override
   Object visitPartDirective(PartDirective node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
     return super.visitPartDirective(node);
   }
 
   @override
   Object visitPartOfDirective(PartOfDirective node) {
-    DartUnitHighlightsComputer_this._addRegion_tokenStart_tokenEnd(node.partToken, node.ofToken, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_tokenStart_tokenEnd(node.partToken, node.ofToken, psi.HighlightType.BUILT_IN);
     return super.visitPartOfDirective(node);
   }
 
   @override
   Object visitShowCombinator(ShowCombinator node) {
-    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
     return super.visitShowCombinator(node);
   }
 
@@ -868,7 +1047,7 @@
 
   @override
   Object visitSimpleStringLiteral(SimpleStringLiteral node) {
-    DartUnitHighlightsComputer_this._addRegion_node(node, HighlightType.LITERAL_STRING);
+    DartUnitHighlightsComputer_this._addRegion_node(node, psi.HighlightType.LITERAL_STRING);
     return super.visitSimpleStringLiteral(node);
   }
 
@@ -877,7 +1056,7 @@
     DartType type = node.type;
     if (type != null) {
       if (type.isDynamic && node.name.name == "dynamic") {
-        DartUnitHighlightsComputer_this._addRegion_node(node, HighlightType.TYPE_NAME_DYNAMIC);
+        DartUnitHighlightsComputer_this._addRegion_node(node, psi.HighlightType.TYPE_NAME_DYNAMIC);
         return null;
       }
     }
@@ -904,9 +1083,9 @@
 
   @override
   Object visitExportDirective(ExportDirective node) {
-    ExportElement exportElement = node.element;
+    pae.ExportElement exportElement = node.element;
     if (exportElement != null) {
-      Element element = exportElement.exportedLibrary;
+      pae.Element element = exportElement.exportedLibrary;
       DartUnitNavigationComputer_this._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
     }
     return super.visitExportDirective(node);
@@ -914,9 +1093,9 @@
 
   @override
   Object visitImportDirective(ImportDirective node) {
-    ImportElement importElement = node.element;
+    pae.ImportElement importElement = node.element;
     if (importElement != null) {
-      Element element = importElement.importedLibrary;
+      pae.Element element = importElement.importedLibrary;
       DartUnitNavigationComputer_this._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
     }
     return super.visitImportDirective(node);
@@ -962,23 +1141,66 @@
 class RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines extends RecursiveAstVisitor<Object> {
   final DartUnitOutlineComputer DartUnitOutlineComputer_this;
 
-  OutlineImpl parenet;
+  OutlineImpl parent;
 
-  List<Outline> localOutlines;
+  List<psi.Outline> localOutlines;
 
-  RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines(this.DartUnitOutlineComputer_this, this.parenet, this.localOutlines) : super();
+  RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines(this.DartUnitOutlineComputer_this, this.parent, this.localOutlines) : super();
 
   @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
-    DartUnitOutlineComputer_this._newFunctionOutline(parenet, localOutlines, node);
+    DartUnitOutlineComputer_this._newFunctionOutline(parent, localOutlines, node);
     return null;
   }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    bool handled = DartUnitOutlineComputer_this._addUnitTestOutlines(parent, localOutlines, node);
+    if (handled) {
+      return null;
+    }
+    return super.visitMethodInvocation(node);
+  }
+}
+
+/**
+ * A concrete implementation of [SearchResult].
+ */
+class SearchResultImpl implements psi.SearchResult {
+  final List<psi.Element> path;
+
+  final Source source;
+
+  final psi.SearchResultKind kind;
+
+  final int offset;
+
+  final int length;
+
+  SearchResultImpl(this.path, this.source, this.kind, this.offset, this.length);
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("[source=");
+    builder.append(source);
+    builder.append(", kind=");
+    builder.append(kind);
+    builder.append(", offset=");
+    builder.append(offset);
+    builder.append(", length=");
+    builder.append(length);
+    builder.append(", path=");
+    builder.append(path);
+    builder.append("]");
+    return builder.toString();
+  }
 }
 
 /**
  * A concrete implementation of [SourceRegion].
  */
-class SourceRegionImpl implements SourceRegion {
+class SourceRegionImpl implements psi.SourceRegion {
   final int offset;
 
   final int length;
@@ -993,10 +1215,10 @@
     if (identical(obj, this)) {
       return true;
     }
-    if (obj is! SourceRegion) {
+    if (obj is! psi.SourceRegion) {
       return false;
     }
-    SourceRegion other = obj as SourceRegion;
+    psi.SourceRegion other = obj as psi.SourceRegion;
     return other.offset == offset && other.length == length;
   }
 
diff --git a/pkg/analysis_server/lib/src/generated/service_interfaces.dart b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
index e2666e1..dae1c78 100644
--- a/pkg/analysis_server/lib/src/generated/service_interfaces.dart
+++ b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
@@ -9,6 +9,154 @@
 
 import 'package:analyzer/src/generated/java_core.dart' show Enum, StringUtils;
 import 'package:analyzer/src/generated/source.dart' show Source;
+import 'package:analysis_services/src/generated/proposal.dart';
+
+/**
+ * The interface `Element` defines the behavior of objects that represent an information for
+ * an element.
+ */
+abstract class Element {
+  /**
+   * An empty array of elements.
+   */
+  static final List<Element> EMPTY_ARRAY = new List<Element>(0);
+
+  /**
+   * Return the id of the element, may be `null` if there is no resolution information
+   * associated with this element.
+   *
+   * @return the id of the element
+   */
+  String get id;
+
+  /**
+   * Return the kind of the element.
+   *
+   * @return the kind of the element
+   */
+  ElementKind get kind;
+
+  /**
+   * Return the length of the element's name.
+   *
+   * @return the length of the element's name
+   */
+  int get length;
+
+  /**
+   * Return the name of the element.
+   *
+   * @return the name of the element
+   */
+  String get name;
+
+  /**
+   * Return the offset to the beginning of the element's name.
+   *
+   * @return the offset to the beginning of the element's name
+   */
+  int get offset;
+
+  /**
+   * Return the parameter list for the element, or `null` if the element is not a constructor,
+   * method or function. If the element has zero arguments, the string `"()"` will be
+   * returned.
+   *
+   * @return the parameter list for the element
+   */
+  String get parameters;
+
+  /**
+   * Return the return type of the element, or `null` if the element is not a method or
+   * function. If the element does not have a declared return type then an empty string will be
+   * returned.
+   *
+   * @return the return type of the element
+   */
+  String get returnType;
+
+  /**
+   * Return the source containing the element, not `null`.
+   *
+   * @return the source containing the element
+   */
+  Source get source;
+
+  /**
+   * Return `true` if the element is abstract.
+   *
+   * @return `true` if the element is abstract
+   */
+  bool get isAbstract;
+
+  /**
+   * Return `true` if the element is private.
+   *
+   * @return `true` if the element is private
+   */
+  bool get isPrivate;
+
+  /**
+   * Return `true` if the element is a class member and is a static element.
+   *
+   * @return `true` if the element is a static element
+   */
+  bool get isStatic;
+}
+
+/**
+ * The enumeration `ElementKind` defines the various kinds of [Element]s.
+ */
+class ElementKind extends Enum<ElementKind> {
+  static const ElementKind CLASS = const ElementKind('CLASS', 0);
+
+  static const ElementKind CLASS_TYPE_ALIAS = const ElementKind('CLASS_TYPE_ALIAS', 1);
+
+  static const ElementKind COMPILATION_UNIT = const ElementKind('COMPILATION_UNIT', 2);
+
+  static const ElementKind CONSTRUCTOR = const ElementKind('CONSTRUCTOR', 3);
+
+  static const ElementKind GETTER = const ElementKind('GETTER', 4);
+
+  static const ElementKind FIELD = const ElementKind('FIELD', 5);
+
+  static const ElementKind FUNCTION = const ElementKind('FUNCTION', 6);
+
+  static const ElementKind FUNCTION_TYPE_ALIAS = const ElementKind('FUNCTION_TYPE_ALIAS', 7);
+
+  static const ElementKind LIBRARY = const ElementKind('LIBRARY', 8);
+
+  static const ElementKind METHOD = const ElementKind('METHOD', 9);
+
+  static const ElementKind SETTER = const ElementKind('SETTER', 10);
+
+  static const ElementKind TOP_LEVEL_VARIABLE = const ElementKind('TOP_LEVEL_VARIABLE', 11);
+
+  static const ElementKind UNKNOWN = const ElementKind('UNKNOWN', 12);
+
+  static const ElementKind UNIT_TEST_CASE = const ElementKind('UNIT_TEST_CASE', 13);
+
+  static const ElementKind UNIT_TEST_GROUP = const ElementKind('UNIT_TEST_GROUP', 14);
+
+  static const List<ElementKind> values = const [
+      CLASS,
+      CLASS_TYPE_ALIAS,
+      COMPILATION_UNIT,
+      CONSTRUCTOR,
+      GETTER,
+      FIELD,
+      FUNCTION,
+      FUNCTION_TYPE_ALIAS,
+      LIBRARY,
+      METHOD,
+      SETTER,
+      TOP_LEVEL_VARIABLE,
+      UNKNOWN,
+      UNIT_TEST_CASE,
+      UNIT_TEST_GROUP];
+
+  const ElementKind(String name, int ordinal) : super(name, ordinal);
+}
 
 /**
  * The interface `HighlightRegion` defines the behavior of objects representing a particular
@@ -167,6 +315,20 @@
 }
 
 /**
+ * The interface `MinorRefactoringsConsumer` defines the behavior of objects that consume
+ * minor refactorings [CorrectionProposal]s.
+ */
+abstract class MinorRefactoringsConsumer {
+  /**
+   * A set [CorrectionProposal]s has been computed.
+   *
+   * @param proposals an array of computed [CorrectionProposal]s
+   * @param isLastResult is `true` if this is the last set of results
+   */
+  void computedProposals(List<CorrectionProposal> proposals, bool isLastResult);
+}
+
+/**
  * The interface `NavigationRegion` defines the behavior of objects representing a list of
  * elements with which a source region is associated.
  */
@@ -177,45 +339,11 @@
   static final List<NavigationRegion> EMPTY_ARRAY = new List<NavigationRegion>(0);
 
   /**
-   * Return the identifiers of the elements associated with the region.
+   * Return the elements associated with the region.
    *
-   * @return the identifiers of the elements associated with the region
+   * @return the elements associated with the region
    */
-  List<NavigationTarget> get targets;
-}
-
-/**
- * The interface `NavigationTarget` defines the behavior of objects that provide information
- * about the target of a navigation region.
- */
-abstract class NavigationTarget {
-  /**
-   * Return the id of the element to which this target will navigate.
-   *
-   * @return the id of the element to which this target will navigate
-   */
-  String get elementId;
-
-  /**
-   * Return the length of the region to which the target will navigate.
-   *
-   * @return the length of the region to which the target will navigate
-   */
-  int get length;
-
-  /**
-   * Return the offset to the region to which the target will navigate.
-   *
-   * @return the offset to the region to which the target will navigate
-   */
-  int get offset;
-
-  /**
-   * Return the source containing the element to which this target will navigate.
-   *
-   * @return the source containing the element to which this target will navigate
-   */
-  Source get source;
+  List<Element> get targets;
 }
 
 /**
@@ -237,8 +365,8 @@
 }
 
 /**
- * The interface `Outline` defines the behavior of objects that represent an outline for a
- * single source.
+ * The interface `Outline` defines the behavior of objects that represent an outline for an
+ * element.
  */
 abstract class Outline {
   /**
@@ -247,49 +375,19 @@
   static final List<Outline> EMPTY_ARRAY = new List<Outline>(0);
 
   /**
-   * Return an array containing the children of the element. The array will be empty if the element
-   * has no children.
+   * Return an array containing the children outline. The array will be empty if the outline has no
+   * children.
    *
    * @return an array containing the children of the element
    */
   List<Outline> get children;
 
   /**
-   * Return the kind of the element.
+   * Return the information about the element.
    *
-   * @return the kind of the element
+   * @return the information about the element
    */
-  OutlineKind get kind;
-
-  /**
-   * Return the length of the element's name.
-   *
-   * @return the length of the element's name
-   */
-  int get length;
-
-  /**
-   * Return the name of the element.
-   *
-   * @return the name of the element
-   */
-  String get name;
-
-  /**
-   * Return the offset to the beginning of the element's name.
-   *
-   * @return the offset to the beginning of the element's name
-   */
-  int get offset;
-
-  /**
-   * Return the parameter list for the element, or `null` if the element is not a constructor,
-   * method or function. If the element has zero arguments, the string `"()"` will be
-   * returned.
-   *
-   * @return the parameter list for the element
-   */
-  String get parameters;
+  Element get element;
 
   /**
    * Return the outline that either physically or logically encloses this outline. This will be
@@ -300,83 +398,168 @@
   Outline get parent;
 
   /**
-   * Return the return type of the element, or `null` if the element is not a method or
-   * function. If the element does not have a declared return type then an empty string will be
-   * returned.
+   * Return the source range associated with this outline.
    *
-   * @return the return type of the element
-   */
-  String get returnType;
-
-  /**
-   * Return the element's source range.
-   *
-   * @return the element's source range
+   * @return the source range associated with this outline
    */
   SourceRegion get sourceRegion;
-
-  /**
-   * Return `true` if the element is abstract.
-   *
-   * @return `true` if the element is abstract
-   */
-  bool get isAbstract;
-
-  /**
-   * Return `true` if the element is private.
-   *
-   * @return `true` if the element is private
-   */
-  bool get isPrivate;
-
-  /**
-   * Return `true` if the element is a class member and is a static element.
-   *
-   * @return `true` if the element is a static element
-   */
-  bool get isStatic;
 }
 
 /**
- * The enumeration `OutlineKind` defines the various kinds of [Outline] items.
+ * The interface `SearchResult` defines the behavior of objects that represent a search
+ * result.
  */
-class OutlineKind extends Enum<OutlineKind> {
-  static const OutlineKind CLASS = const OutlineKind('CLASS', 0);
+abstract class SearchResult {
+  /**
+   * An empty array of [SearchResult]s.
+   */
+  static final List<SearchResult> EMPTY_ARRAY = new List<SearchResult>(0);
 
-  static const OutlineKind CLASS_TYPE_ALIAS = const OutlineKind('CLASS_TYPE_ALIAS', 1);
+  /**
+   * Return the kind to this result.
+   *
+   * @return the kind of this result
+   */
+  SearchResultKind get kind;
 
-  static const OutlineKind CONSTRUCTOR = const OutlineKind('CONSTRUCTOR', 2);
+  /**
+   * Return the length of the result.
+   *
+   * @return the length of the result
+   */
+  int get length;
 
-  static const OutlineKind GETTER = const OutlineKind('GETTER', 3);
+  /**
+   * Return the offset to the beginning of the result in [getSource].
+   *
+   * @return the offset to the beginning of the result
+   */
+  int get offset;
 
-  static const OutlineKind FIELD = const OutlineKind('FIELD', 4);
+  /**
+   * Return the path to this result starting with the element that encloses it, then for its
+   * enclosing element, etc up to the library.
+   *
+   * @return the path to this result
+   */
+  List<Element> get path;
 
-  static const OutlineKind FUNCTION = const OutlineKind('FUNCTION', 5);
+  /**
+   * Return the source containing the result.
+   *
+   * @return the source containing the result
+   */
+  Source get source;
+}
 
-  static const OutlineKind FUNCTION_TYPE_ALIAS = const OutlineKind('FUNCTION_TYPE_ALIAS', 6);
+/**
+ * The enumeration `SearchResultKind` defines the various kinds of [SearchResult].
+ */
+class SearchResultKind extends Enum<SearchResultKind> {
+  /**
+   * A reference to a constructor.
+   */
+  static const SearchResultKind CONSTRUCTOR_REFERENCE = const SearchResultKind('CONSTRUCTOR_REFERENCE', 0);
 
-  static const OutlineKind METHOD = const OutlineKind('METHOD', 7);
+  /**
+   * A reference to a field (from field formal parameter).
+   */
+  static const SearchResultKind FIELD_REFERENCE = const SearchResultKind('FIELD_REFERENCE', 1);
 
-  static const OutlineKind SETTER = const OutlineKind('SETTER', 8);
+  /**
+   * A reference to a field in which it is read.
+   */
+  static const SearchResultKind FIELD_READ = const SearchResultKind('FIELD_READ', 2);
 
-  static const OutlineKind TOP_LEVEL_VARIABLE = const OutlineKind('TOP_LEVEL_VARIABLE', 9);
+  /**
+   * A reference to a field in which it is written.
+   */
+  static const SearchResultKind FIELD_WRITE = const SearchResultKind('FIELD_WRITE', 3);
 
-  static const OutlineKind COMPILATION_UNIT = const OutlineKind('COMPILATION_UNIT', 10);
+  /**
+   * A reference to a function in which it is invoked.
+   */
+  static const SearchResultKind FUNCTION_INVOCATION = const SearchResultKind('FUNCTION_INVOCATION', 4);
 
-  static const List<OutlineKind> values = const [
-      CLASS,
-      CLASS_TYPE_ALIAS,
-      CONSTRUCTOR,
-      GETTER,
-      FIELD,
-      FUNCTION,
-      FUNCTION_TYPE_ALIAS,
-      METHOD,
-      SETTER,
-      TOP_LEVEL_VARIABLE,
-      COMPILATION_UNIT];
+  /**
+   * A reference to a function in which it is referenced.
+   */
+  static const SearchResultKind FUNCTION_REFERENCE = const SearchResultKind('FUNCTION_REFERENCE', 5);
 
-  const OutlineKind(String name, int ordinal) : super(name, ordinal);
+  /**
+   * A reference to a method in which it is invoked.
+   */
+  static const SearchResultKind METHOD_INVOCATION = const SearchResultKind('METHOD_INVOCATION', 6);
+
+  /**
+   * A reference to a method in which it is referenced.
+   */
+  static const SearchResultKind METHOD_REFERENCE = const SearchResultKind('METHOD_REFERENCE', 7);
+
+  /**
+   * A reference to a property accessor.
+   */
+  static const SearchResultKind PROPERTY_ACCESSOR_REFERENCE = const SearchResultKind('PROPERTY_ACCESSOR_REFERENCE', 8);
+
+  /**
+   * A reference to a type.
+   */
+  static const SearchResultKind TYPE_REFERENCE = const SearchResultKind('TYPE_REFERENCE', 9);
+
+  /**
+   * A declaration of a variable.
+   */
+  static const SearchResultKind VARIABLE_DECLARATION = const SearchResultKind('VARIABLE_DECLARATION', 10);
+
+  /**
+   * A reference to a variable in which it is read.
+   */
+  static const SearchResultKind VARIABLE_READ = const SearchResultKind('VARIABLE_READ', 11);
+
+  /**
+   * A reference to a variable in which it is both read and written.
+   */
+  static const SearchResultKind VARIABLE_READ_WRITE = const SearchResultKind('VARIABLE_READ_WRITE', 12);
+
+  /**
+   * A reference to a variable in which it is written.
+   */
+  static const SearchResultKind VARIABLE_WRITE = const SearchResultKind('VARIABLE_WRITE', 13);
+
+  static const List<SearchResultKind> values = const [
+      CONSTRUCTOR_REFERENCE,
+      FIELD_REFERENCE,
+      FIELD_READ,
+      FIELD_WRITE,
+      FUNCTION_INVOCATION,
+      FUNCTION_REFERENCE,
+      METHOD_INVOCATION,
+      METHOD_REFERENCE,
+      PROPERTY_ACCESSOR_REFERENCE,
+      TYPE_REFERENCE,
+      VARIABLE_DECLARATION,
+      VARIABLE_READ,
+      VARIABLE_READ_WRITE,
+      VARIABLE_WRITE];
+
+  const SearchResultKind(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * The interface `SearchReferencesConsumer` defines the behavior of objects that consume
+ * [SearchResult]s.
+ */
+abstract class SearchResultsConsumer {
+  /**
+   * [SearchResult]s have been computed.
+   *
+   * @param contextId the identifier of the context to search within
+   * @param source the [Source] with element
+   * @param offset the offset within the `source`
+   * @param searchResults an array of [SearchResult]s computed so far
+   * @param isLastResult is `true` if this is the last set of results
+   */
+  void computedReferences(String contextId, Source source, int offset, List<SearchResult> searchResults, bool isLastResult);
 }
 
 /**
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 84ddf94..da3c136 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -6,7 +6,8 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: 0.14.2
+  analysis_services: any
+  analyzer: 0.15.1
   args: any
   logging: any
 dev_dependencies:
diff --git a/pkg/analysis_services/lib/src/generated/change.dart b/pkg/analysis_services/lib/src/generated/change.dart
index 35935cf..9cc094f 100644
--- a/pkg/analysis_services/lib/src/generated/change.dart
+++ b/pkg/analysis_services/lib/src/generated/change.dart
@@ -7,6 +7,7 @@
 
 library services.change;
 
+import 'dart:collection';
 import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
 import 'package:analyzer/src/generated/source.dart';
 
@@ -118,7 +119,7 @@
 
   final List<Edit> edits = [];
 
-  Map<String, List<Edit>> _editGroups = {};
+  Map<String, List<Edit>> _editGroups = new LinkedHashMap();
 
   /**
    * @param name the name of this change to display in UI
diff --git a/pkg/analysis_services/lib/src/generated/completion.dart b/pkg/analysis_services/lib/src/generated/completion.dart
new file mode 100644
index 0000000..d2c50c6
--- /dev/null
+++ b/pkg/analysis_services/lib/src/generated/completion.dart
@@ -0,0 +1,3770 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.completion;
+
+import 'dart:collection';
+import 'package:analyzer/src/generated/java_core.dart' hide StringUtils;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'stubs.dart';
+import 'util.dart';
+
+class AstNodeClassifier_CompletionEngine_typeOf extends CompletionEngine_AstNodeClassifier {
+  final CompletionEngine CompletionEngine_this;
+
+  List<DartType> result;
+
+  AstNodeClassifier_CompletionEngine_typeOf(this.CompletionEngine_this, this.result) : super();
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) => visitSimpleIdentifier(node.identifier);
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    Element elem = node.bestElement;
+    if (elem != null && elem.kind == ElementKind.GETTER) {
+      PropertyAccessorElement accessor = elem as PropertyAccessorElement;
+      if (accessor.isSynthetic) {
+        PropertyInducingElement var2 = accessor.variable;
+        result[0] = CompletionEngine_this._typeSearch(var2);
+      }
+    }
+    return null;
+  }
+}
+
+/**
+ * The analysis engine for code completion.
+ *
+ * Note: During development package-private methods are used to group element-specific completion
+ * utilities.
+ *
+ * TODO: Recognize when completion is requested in the middle of a multi-character operator.
+ * Re-write the AST as it would be if an identifier were present at the completion point then
+ * restart the analysis.
+ */
+class CompletionEngine {
+  static String _C_DYNAMIC = "dynamic";
+
+  static String _C_FALSE = "false";
+
+  static String _C_NULL = "null";
+
+  static String _C_PARAMNAME = "arg";
+
+  static String _C_TRUE = "true";
+
+  static String _C_VAR = "var";
+
+  static String _C_VOID = "void";
+
+  static bool _isPrivate(Element element) {
+    String name = element.displayName;
+    return Identifier.isPrivateName(name);
+  }
+
+  static bool _isSyntheticIdentifier(Expression expression) => expression is SimpleIdentifier && expression.isSynthetic;
+
+  CompletionRequestor _requestor;
+
+  final CompletionFactory _factory;
+
+  AssistContext _context;
+
+  Filter _filter;
+
+  CompletionState _state;
+
+  List<LibraryElement> _libraries;
+
+  CompletionEngine(CompletionRequestor requestor, this._factory) {
+    this._requestor = requestor;
+    this._state = new CompletionState();
+  }
+
+  /**
+   * Analyze the source unit in the given context to determine completion proposals at the selection
+   * offset of the context.
+   *
+   * @throws Exception
+   */
+  void complete(AssistContext context) {
+    this._context = context;
+    _requestor.beginReporting();
+    AstNode completionNode = context.coveredNode;
+    if (completionNode != null) {
+      _state.context = completionNode;
+      CompletionEngine_TerminalNodeCompleter visitor = new CompletionEngine_TerminalNodeCompleter(this);
+      completionNode.accept(visitor);
+    }
+    _requestor.endReporting();
+  }
+
+  void _analyzeAnnotationName(SimpleIdentifier identifier) {
+    _filter = _createFilter(identifier);
+    CompletionEngine_NameCollector names = _collectTopLevelElementVisibleAt(identifier);
+    for (Element element in names.uniqueElements) {
+      if (element is PropertyAccessorElement) {
+        element = (element as PropertyAccessorElement).variable;
+      }
+      if (element is TopLevelVariableElement) {
+        TopLevelVariableElement variable = element as TopLevelVariableElement;
+        if (_state._isCompileTimeConstantRequired && !variable.isConst) {
+          continue;
+        }
+        _proposeName(element, identifier, names);
+      }
+      if (element is ClassElement) {
+        ClassElement classElement = element as ClassElement;
+        for (ConstructorElement constructor in classElement.constructors) {
+          _pNamedConstructor(classElement, constructor, identifier);
+        }
+      }
+    }
+  }
+
+  void _analyzeConstructorTypeName(SimpleIdentifier identifier) {
+    _filter = _createFilter(identifier);
+    List<Element> types = _findAllTypes(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
+    for (Element type in types) {
+      if (type is ClassElement) {
+        _namedConstructorReference(type, identifier);
+      }
+    }
+    List<Element> prefixes = _findAllPrefixes();
+    for (Element prefix in prefixes) {
+      _pName(prefix, identifier);
+    }
+  }
+
+  void _analyzeDeclarationName(VariableDeclaration varDecl) {
+    // We might want to propose multiple names for a declaration based on types someday.
+    // For now, just use whatever is already there.
+    SimpleIdentifier identifier = varDecl.name;
+    _filter = _createFilter(identifier);
+    VariableDeclarationList varList = varDecl.parent as VariableDeclarationList;
+    TypeName type = varList.type;
+    if (identifier.length > 0) {
+      _pName3(identifier.name, ProposalKind.VARIABLE);
+    }
+    if (type == null) {
+      if (varList.keyword == null) {
+        // Interpret as the type name of a typed variable declaration { DivE!; }
+        _analyzeLocalName(identifier);
+      }
+    } else {
+      _pParamName(type.name.name.toLowerCase());
+    }
+  }
+
+  void _analyzeDirectAccess(DartType receiverType, SimpleIdentifier completionNode) {
+    if (receiverType != null) {
+      // Complete this.!y where this is absent
+      Element rcvrTypeElem = receiverType.element;
+      if (receiverType.isDynamic) {
+        rcvrTypeElem = objectClassElement;
+      }
+      if (rcvrTypeElem is ClassElement) {
+        _directAccess(rcvrTypeElem as ClassElement, completionNode);
+      }
+    }
+  }
+
+  void _analyzeImmediateField(SimpleIdentifier fieldName) {
+    _filter = _createFilter(fieldName);
+    ClassDeclaration classDecl = fieldName.getAncestor((node) => node is ClassDeclaration);
+    ClassElement classElement = classDecl.element;
+    for (FieldElement field in classElement.fields) {
+      _pName3(field.displayName, ProposalKind.FIELD);
+    }
+  }
+
+  void _analyzeLiteralReference(BooleanLiteral literal) {
+    //    state.setContext(literal);
+    Ident ident = _createIdent(literal.parent);
+    ident.token = literal.literal;
+    _filter = _createFilter(ident);
+    _analyzeLocalName(ident);
+  }
+
+  void _analyzeLocalName(SimpleIdentifier identifier) {
+    // Completion x!
+    _filter = _createFilter(identifier);
+    // TODO Filter out types that have no static members.
+    CompletionEngine_NameCollector names = _collectIdentifiersVisibleAt(identifier);
+    for (Element element in names.uniqueElements) {
+      if (_state._isSourceDeclarationStatic) {
+        if (element is FieldElement) {
+          if (!element.isStatic) {
+            continue;
+          }
+        } else if (element is PropertyAccessorElement) {
+          if (!element.isStatic) {
+            continue;
+          }
+        }
+      }
+      if (_state._isOptionalArgumentRequired) {
+        if (element is! ParameterElement) {
+          continue;
+        }
+        ParameterElement param = element as ParameterElement;
+        if (!param.parameterKind.isOptional) {
+          continue;
+        }
+      }
+      _proposeName(element, identifier, names);
+    }
+    if (_state._areLiteralsAllowed) {
+      _pNull();
+      _pTrue();
+      _pFalse();
+    }
+  }
+
+  void _analyzeNamedParameter(ArgumentList args, SimpleIdentifier identifier) {
+    // Completion x!
+    _filter = _createFilter(identifier);
+    // prepare parameters
+    List<ParameterElement> parameters = _getParameterElements(args);
+    if (parameters == null) {
+      return;
+    }
+    // remember already used names
+    Set<String> usedNames = new Set();
+    for (Expression arg in args.arguments) {
+      if (arg is NamedExpression) {
+        NamedExpression namedExpr = arg;
+        String name = namedExpr.name.label.name;
+        usedNames.add(name);
+      }
+    }
+    // propose named parameters
+    for (ParameterElement parameterElement in parameters) {
+      // should be named
+      if (parameterElement.parameterKind != ParameterKind.NAMED) {
+        continue;
+      }
+      // filter by name
+      if (_filterDisallows(parameterElement)) {
+        continue;
+      }
+      // may be already used
+      String parameterName = parameterElement.name;
+      if (usedNames.contains(parameterName)) {
+        continue;
+      }
+      // OK, add proposal
+      CompletionProposal prop = _createProposal4(ProposalKind.NAMED_ARGUMENT);
+      prop.setCompletion(parameterName);
+      prop.setParameterName(parameterName);
+      prop.setParameterType(parameterElement.type.displayName);
+      prop.setLocation(identifier.offset);
+      prop.setReplacementLength(identifier.length);
+      prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
+      _requestor.accept(prop);
+    }
+  }
+
+  void _analyzeNewParameterName(List<FormalParameter> params, SimpleIdentifier typeIdent, String identifierName) {
+    String typeName = typeIdent.name;
+    _filter = _createFilter(_createIdent(typeIdent));
+    List<String> names = new List<String>();
+    for (FormalParameter node in params) {
+      names.add(node.identifier.name);
+    }
+    // Find name similar to typeName not in names, ditto for identifierName.
+    if (identifierName == null || identifierName.isEmpty) {
+      String candidate = typeName == null || typeName.isEmpty ? _C_PARAMNAME : typeName.toLowerCase();
+      _pParamName(_makeNonconflictingName(candidate, names));
+    } else {
+      _pParamName(_makeNonconflictingName(identifierName, names));
+      if (typeName != null && !typeName.isEmpty) {
+        _pParamName(_makeNonconflictingName(typeName.toLowerCase(), names));
+      }
+    }
+  }
+
+  void _analyzePositionalArgument(ArgumentList args, SimpleIdentifier identifier) {
+    // Show parameter name only if there is nothing to complete, so that if there is only
+    // one match, we won't to force user to choose.
+    if (!StringUtils.isEmpty(identifier.name)) {
+      return;
+    }
+    // prepare parameters
+    List<ParameterElement> parameters = _getParameterElements(args);
+    if (parameters == null) {
+      return;
+    }
+    // show current parameter
+    int argIndex = args.arguments.indexOf(identifier);
+    if (argIndex == -1) {
+      argIndex = 0;
+    }
+    if (argIndex >= 0 && argIndex < parameters.length) {
+      ParameterElement parameter = parameters[argIndex];
+      if (parameter.parameterKind != ParameterKind.NAMED) {
+        String parameterName = parameter.displayName;
+        CompletionProposal prop = _createProposal4(ProposalKind.OPTIONAL_ARGUMENT);
+        prop.setCompletion(parameterName);
+        prop.setParameterName(parameterName);
+        prop.setParameterType(parameter.type.displayName);
+        prop.setLocation(identifier.offset);
+        prop.setReplacementLength(identifier.length);
+        prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
+        _requestor.accept(prop);
+      }
+    }
+  }
+
+  void _analyzePrefixedAccess(Expression receiver, SimpleIdentifier completionNode) {
+    if (receiver is ThisExpression && !_state._isThisAllowed) {
+      return;
+    }
+    DartType receiverType = _typeOf2(receiver);
+    bool forSuper = receiver is SuperExpression;
+    _analyzePrefixedAccess2(receiverType, forSuper, completionNode);
+  }
+
+  void _analyzePrefixedAccess2(DartType receiverType, bool forSuper, SimpleIdentifier completionNode) {
+    if (receiverType != null) {
+      // Complete x.!y
+      Element rcvrTypeElem = receiverType.element;
+      if (receiverType.isBottom) {
+        receiverType = objectType;
+      }
+      if (receiverType.isDynamic) {
+        receiverType = objectType;
+      }
+      if (receiverType is InterfaceType) {
+        _prefixedAccess(receiverType, forSuper, completionNode);
+      } else if (rcvrTypeElem is TypeParameterElement) {
+        TypeParameterElement typeParamElem = rcvrTypeElem;
+        _analyzePrefixedAccess2(typeParamElem.bound, false, completionNode);
+      }
+    }
+  }
+
+  void _analyzeReceiver(SimpleIdentifier identifier) {
+    // Completion x!.y
+    _filter = _createFilter(identifier);
+    CompletionEngine_NameCollector names = _collectIdentifiersVisibleAt(identifier);
+    for (Element element in names.uniqueElements) {
+      _proposeName(element, identifier, names);
+    }
+  }
+
+  void _analyzeSuperConstructorInvocation(SuperConstructorInvocation node) {
+    ClassDeclaration enclosingClassNode = node.getAncestor((node) => node is ClassDeclaration);
+    if (enclosingClassNode != null) {
+      ClassElement enclosingClassElement = enclosingClassNode.element;
+      if (enclosingClassElement != null) {
+        ClassElement superClassElement = enclosingClassElement.supertype.element;
+        _constructorReference(superClassElement, node.constructorName);
+      }
+    }
+  }
+
+  void _analyzeTypeName(SimpleIdentifier identifier, SimpleIdentifier nameIdent) {
+    _filter = _createFilter(identifier);
+    String name = nameIdent == null ? "" : nameIdent.name;
+    List<Element> types = _findAllTypes(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
+    for (Element type in types) {
+      if (_state._isForMixin) {
+        if (type is! ClassElement) {
+          continue;
+        }
+        ClassElement classElement = type as ClassElement;
+        if (!classElement.isValidMixin) {
+          continue;
+        }
+      }
+      if (type.displayName == name) {
+        continue;
+      }
+      _pName(type, nameIdent);
+    }
+    if (!_state._isForMixin) {
+      ClassDeclaration classDecl = identifier.getAncestor((node) => node is ClassDeclaration);
+      if (classDecl != null) {
+        ClassElement classElement = classDecl.element;
+        for (TypeParameterElement param in classElement.typeParameters) {
+          _pName(param, nameIdent);
+        }
+      }
+    }
+    List<Element> prefixes = _findAllPrefixes();
+    for (Element prefix in prefixes) {
+      _pName(prefix, nameIdent);
+    }
+    if (_state._isDynamicAllowed) {
+      _pDynamic();
+    }
+    if (_state._isVarAllowed) {
+      _pVar();
+    }
+    if (_state._isVoidAllowed) {
+      _pVoid();
+    }
+  }
+
+  void _constructorReference(ClassElement classElement, SimpleIdentifier identifier) {
+    // Complete identifier when it refers to a constructor defined in classElement.
+    _filter = _createFilter(identifier);
+    for (ConstructorElement cons in classElement.constructors) {
+      if (_state._isCompileTimeConstantRequired == cons.isConst && _filterAllows(cons)) {
+        _pExecutable2(cons, identifier, false);
+      }
+    }
+  }
+
+  void _directAccess(ClassElement classElement, SimpleIdentifier identifier) {
+    _filter = _createFilter(identifier);
+    CompletionEngine_NameCollector names = _createNameCollector();
+    names.addLocalNames(identifier);
+    names._addNamesDefinedByHierarchy(classElement, false);
+    names._addTopLevelNames2(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
+    _proposeNames(names, identifier);
+  }
+
+  void _dispatchPrefixAnalysis(InstanceCreationExpression node) {
+    // prepare ClassElement
+    ClassElement classElement;
+    {
+      Element typeElement = _typeOf2(node).element;
+      if (typeElement is! ClassElement) {
+        return;
+      }
+      classElement = typeElement as ClassElement;
+    }
+    // prepare constructor name
+    Identifier typeName = node.constructorName.type.name;
+    SimpleIdentifier identifier = null;
+    if (typeName is SimpleIdentifier) {
+      identifier = typeName;
+    } else if (typeName is PrefixedIdentifier) {
+      identifier = typeName.identifier;
+    }
+    if (identifier == null) {
+      identifier = _createIdent(node);
+    }
+    // analyze constructor name
+    _analyzeConstructorTypeName(identifier);
+    _constructorReference(classElement, identifier);
+  }
+
+  void _dispatchPrefixAnalysis2(MethodInvocation node) {
+    // This might be a library prefix on a top-level function
+    Expression expr = node.realTarget;
+    if (expr is SimpleIdentifier) {
+      SimpleIdentifier ident = expr;
+      if (ident.bestElement is PrefixElement) {
+        _prefixedAccess2(ident, node.methodName);
+        return;
+      } else if (ident.bestElement is ClassElement) {
+        _state._areInstanceReferencesProhibited = true;
+        _state._areStaticReferencesProhibited = false;
+      } else {
+        _state._areInstanceReferencesProhibited = false;
+        _state._areStaticReferencesProhibited = true;
+      }
+    }
+    if (expr == null) {
+      _analyzeLocalName(_createIdent(node));
+    } else {
+      _analyzePrefixedAccess(expr, node.methodName);
+    }
+  }
+
+  void _dispatchPrefixAnalysis3(PrefixedIdentifier node, SimpleIdentifier identifier) {
+    SimpleIdentifier receiverName = node.prefix;
+    Element receiver = receiverName.bestElement;
+    if (receiver == null) {
+      _prefixedAccess2(receiverName, identifier);
+      return;
+    }
+    while (true) {
+      if (receiver.kind == ElementKind.PREFIX || receiver.kind == ElementKind.IMPORT) {
+        // Complete lib_prefix.name
+        _prefixedAccess2(receiverName, identifier);
+      } else {
+        {
+          DartType receiverType;
+          DartType propType = _typeOf2(receiverName);
+          if (propType == null || propType.isDynamic) {
+            receiverType = _typeOf(receiver);
+          } else {
+            DartType declType = _typeOf(receiver);
+            if (propType.isMoreSpecificThan(declType)) {
+              receiverType = propType;
+            } else {
+              receiverType = declType;
+            }
+          }
+          _analyzePrefixedAccess2(receiverType, false, identifier);
+          break;
+        }
+      }
+      break;
+    }
+  }
+
+  void _fieldReference(ClassElement classElement, SimpleIdentifier identifier) {
+    // Complete identifier when it refers to a constructor defined in classElement.
+    _filter = _createFilter(identifier);
+    for (FieldElement cons in classElement.fields) {
+      if (_filterAllows(cons)) {
+        _pField(cons, identifier, classElement);
+      }
+    }
+  }
+
+  void _namedConstructorReference(ClassElement classElement, SimpleIdentifier identifier) {
+    // Complete identifier when it refers to a named constructor defined in classElement.
+    if (_filter == null) {
+      _filter = _createFilter(identifier);
+    }
+    for (ConstructorElement cons in classElement.constructors) {
+      if (!_isVisible(cons)) {
+        continue;
+      }
+      if (_state._isCompileTimeConstantRequired && !cons.isConst) {
+        continue;
+      }
+      _pNamedConstructor(classElement, cons, identifier);
+    }
+  }
+
+  void _namespacePubReference(NamespaceDirective node, Set<String> packageUris) {
+    // no import URI or package:
+    String prefix = _filter._prefix;
+    List<String> prefixStrings = prefix.split(":");
+    if (!prefix.isEmpty && !"package:".startsWith(prefixStrings[0])) {
+      return;
+    }
+    // if no URI yet, propose package:
+    if (prefix.isEmpty) {
+      _pImportUriWithScheme(node, "package:");
+      return;
+    }
+    // check "packages" folder for package libraries that are not added to AnalysisContext
+    {
+      Source contextSource = _context.source;
+      if (contextSource is FileBasedSource) {
+        FileBasedSource contextFileSource = contextSource;
+        String contextFilePath = contextFileSource.fullName;
+        JavaFile contextFile = new JavaFile(contextFilePath);
+        JavaFile contextFolder = contextFile.getParentFile();
+        JavaFile contextPackages = new JavaFile.relative(contextFolder, "packages");
+        if (contextPackages.isDirectory()) {
+          for (JavaFile packageFolder in contextPackages.listFiles()) {
+            String packageName = packageFolder.getName();
+            String packageLibName = "${packageName}.dart";
+            JavaFile packageFile = new JavaFile.relative(packageFolder, packageLibName);
+            if (packageFile.exists() && packageFile.isFile()) {
+              packageUris.add("package:${packageName}/${packageLibName}");
+            }
+          }
+        }
+      }
+    }
+    // add known package: URIs
+    for (String uri in packageUris) {
+      if (_filterDisallows2(uri)) {
+        continue;
+      }
+      CompletionProposal prop = _createProposal4(ProposalKind.IMPORT);
+      prop.setCompletion(uri);
+      // put "lib" before "lib/src"
+      if (!uri.contains("/src/")) {
+        prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
+      }
+      // done
+      _requestor.accept(prop);
+    }
+  }
+
+  void _namespaceReference(NamespaceDirective node, SimpleStringLiteral literal) {
+    String lit = literal.literal.lexeme;
+    if (!lit.isEmpty) {
+      lit = lit.substring(1, Math.max(lit.length - 1, 0));
+    }
+    _filter = _createFilter(new Ident.con2(node, lit, literal.offset + 1));
+    Set<String> packageUris = new Set();
+    List<LibraryElement> libraries = new List<LibraryElement>();
+    List<LibraryElement> librariesInLib = new List<LibraryElement>();
+    String currentLibraryName = currentLibrary.source.fullName;
+    AnalysisContext ac = analysisContext;
+    List<Source> sources = ac.librarySources;
+    for (Source s in sources) {
+      String sName = s.fullName;
+      // skip current library
+      if (currentLibraryName == sName) {
+        continue;
+      }
+      // ".pub-cache/..../unittest-0.8.8/lib/unittest.dart" -> "package:unittest/unittest.dart"
+      {
+        Uri uri = ac.sourceFactory.restoreUri(s);
+        if (uri != null) {
+          String uriString = uri.toString();
+          if (uriString.startsWith("package:")) {
+            packageUris.add(uriString);
+          }
+        }
+      }
+      LibraryElement lib = ac.getLibraryElement(s);
+      if (lib == null) {
+        continue;
+      } else if (_isUnitInLibFolder(lib.definingCompilationUnit)) {
+        librariesInLib.add(lib);
+      } else {
+        libraries.add(lib);
+      }
+    }
+    _namespaceSdkReference(node);
+    _namespacePubReference(node, packageUris);
+  }
+
+  void _namespaceSdkReference(NamespaceDirective node) {
+    String prefix = _filter._prefix;
+    List<String> prefixStrings = prefix.split(":");
+    if (!prefix.isEmpty && !"dart:".startsWith(prefixStrings[0])) {
+      return;
+    }
+    if (prefix.isEmpty) {
+      _pImportUriWithScheme(node, "dart:");
+      return;
+    }
+    // add DartSdk libraries
+    DartSdk dartSdk = analysisContext.sourceFactory.dartSdk;
+    for (SdkLibrary library in dartSdk.sdkLibraries) {
+      String name = library.shortName;
+      // ignore internal
+      if (library.isInternal) {
+        continue;
+      }
+      // ignore implementation
+      if (library.isImplementation) {
+        continue;
+      }
+      // standard libraries name name starting with "dart:"
+      name = StringUtils.removeStart(name, "dart:");
+      // ignore private libraries
+      if (Identifier.isPrivateName(name)) {
+        continue;
+      }
+      // add with "dart:" prefix
+      _pName3("dart:${name}", ProposalKind.IMPORT);
+    }
+  }
+
+  void _operatorAccess(Expression expr, SimpleIdentifier identifier) {
+    _state._requiresOperators();
+    _analyzePrefixedAccess(expr, identifier);
+  }
+
+  void _prefixedAccess(InterfaceType type, bool forSuper, SimpleIdentifier identifier) {
+    // Complete identifier when it refers to field or method in classElement.
+    _filter = _createFilter(identifier);
+    CompletionEngine_NameCollector names = _createNameCollector();
+    if (_state._areInstanceReferencesProhibited) {
+      names._addNamesDefinedByType2(type);
+    } else {
+      names._addNamesDefinedByHierarchy2(type, forSuper);
+    }
+    _proposeNames(names, identifier);
+  }
+
+  void _prefixedAccess2(SimpleIdentifier prefixName, SimpleIdentifier identifier) {
+    if (_filter == null) {
+      _filter = _createFilter(identifier);
+    }
+    CompletionEngine_NameCollector names = _createNameCollector();
+    List<ImportElement> prefixImports = _importsWithName(prefixName);
+    // Library prefixes do not have a unique AST representation so we need to fudge state vars.
+    bool litsAllowed = _state._areLiteralsAllowed;
+    _state._areLiteralsAllowed = false;
+    names._addTopLevelNames(prefixImports, TopLevelNamesKind.DECLARED_AND_EXPORTS);
+    _state._areLiteralsAllowed = litsAllowed;
+    _proposeNames(names, identifier);
+  }
+
+  List<InterfaceType> _allSubtypes(ClassElement classElement) {
+    // TODO(scheglov) translate it
+    return [];
+  }
+
+  CompletionEngine_NameCollector _collectIdentifiersVisibleAt(AstNode ident) {
+    CompletionEngine_NameCollector names = _createNameCollector();
+    ScopedNameFinder finder = new ScopedNameFinder(_completionLocation());
+    ident.accept(finder);
+    names.addAll(finder.locals.values);
+    Declaration decl = finder.declaration;
+    if (decl != null && decl.parent is ClassDeclaration) {
+      ClassElement classElement = (decl.parent as ClassDeclaration).element;
+      names._addNamesDefinedByHierarchy(classElement, false);
+    }
+    names._addTopLevelNames2(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
+    return names;
+  }
+
+  CompletionEngine_NameCollector _collectTopLevelElementVisibleAt(AstNode ident) {
+    CompletionEngine_NameCollector names = _createNameCollector();
+    names._addTopLevelNames2(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
+    return names;
+  }
+
+  int _completionLocation() => _context.selectionOffset;
+
+  int _completionTokenOffset() => _completionLocation() - _filter._prefix.length;
+
+  List<FormalParameter> _copyWithout(NodeList oldList, AstNode deletion) {
+    List<FormalParameter> newList = new List<FormalParameter>();
+    oldList.accept(new GeneralizingAstVisitor_CompletionEngine_copyWithout(deletion, newList));
+    return newList;
+  }
+
+  Filter _createFilter(SimpleIdentifier ident) => new Filter.con1(ident, _context.selectionOffset);
+
+  Ident _createIdent(AstNode node) => new Ident.con1(node, _completionLocation());
+
+  CompletionEngine_NameCollector _createNameCollector() => new CompletionEngine_NameCollector(this);
+
+  CompletionProposal _createProposal(Element element) {
+    String completion = element.displayName;
+    return _createProposal3(element, completion);
+  }
+
+  CompletionProposal _createProposal2(Element element, SimpleIdentifier identifier) {
+    // Create a completion proposal for the element: variable, field, class, function.
+    if (_filterDisallows(element)) {
+      return null;
+    }
+    CompletionProposal prop = _createProposal(element);
+    Element container = element.enclosingElement;
+    if (container != null) {
+      prop.setDeclaringType(container.displayName);
+    }
+    DartType type = _typeOf(element);
+    if (type != null) {
+      prop.setReturnType(type.name);
+    }
+    if (identifier != null) {
+      prop.setReplacementLengthIdentifier(identifier.length);
+    }
+    return prop;
+  }
+
+  CompletionProposal _createProposal3(Element element, String completion) {
+    ProposalKind kind = _proposalKindOf(element);
+    CompletionProposal prop = _createProposal4(kind);
+    prop.setElement(element);
+    prop.setCompletion(completion);
+    prop.setDeprecated(_isDeprecated(element));
+    if (_isPrivate(element)) {
+      prop.setRelevance(CompletionProposal.RELEVANCE_LOW);
+    }
+    if (_filter._isSameCasePrefix(element.name)) {
+      prop.incRelevance();
+    }
+    return prop;
+  }
+
+  CompletionProposal _createProposal4(ProposalKind kind) => _factory.createCompletionProposal(kind, _completionTokenOffset());
+
+  List<LibraryElement> _currentLibraryList() {
+    Set<LibraryElement> libraries = new Set<LibraryElement>();
+    LibraryElement curLib = currentLibrary;
+    libraries.add(curLib);
+    Queue<LibraryElement> queue = new Queue<LibraryElement>();
+    queue.addAll(curLib.importedLibraries);
+    _currentLibraryLister(queue, libraries);
+    return new List.from(libraries);
+  }
+
+  void _currentLibraryLister(Queue<LibraryElement> queue, Set<LibraryElement> libraries) {
+    while (!queue.isEmpty) {
+      LibraryElement sourceLib = queue.removeFirst();
+      libraries.add(sourceLib);
+      List<LibraryElement> expLibs = sourceLib.exportedLibraries;
+      for (LibraryElement lib in expLibs) {
+        if (!libraries.contains(lib)) {
+          queue.add(lib);
+        }
+      }
+    }
+  }
+
+  bool _filterAllows(Element element) => _filter._match(element);
+
+  bool _filterDisallows(Element element) => !_filter._match(element);
+
+  bool _filterDisallows2(String name) => !_filter._match2(name);
+
+  List<Element> _findAllNotTypes(List<Element> elements) {
+    elements = [];
+    for (JavaIterator<Element> I = new JavaIterator(elements); I.hasNext;) {
+      Element element = I.next();
+      ElementKind kind = element.kind;
+      if (kind == ElementKind.FUNCTION || kind == ElementKind.TOP_LEVEL_VARIABLE || kind == ElementKind.GETTER || kind == ElementKind.SETTER) {
+        continue;
+      }
+      I.remove();
+    }
+    return new List.from(elements);
+  }
+
+  List<Element> _findAllPrefixes() {
+    LibraryElement lib = _context.compilationUnitElement.enclosingElement;
+    return lib.prefixes;
+  }
+
+  List<Element> _findAllTypes(LibraryElement library, TopLevelNamesKind topKind) {
+    List<Element> elements = _findTopLevelElements(library, topKind);
+    return _findAllTypes2(elements);
+  }
+
+  List<Element> _findAllTypes2(List<Element> elements) {
+    elements = [];
+    for (JavaIterator<Element> I = new JavaIterator(elements); I.hasNext;) {
+      Element element = I.next();
+      ElementKind kind = element.kind;
+      if (kind == ElementKind.CLASS || kind == ElementKind.FUNCTION_TYPE_ALIAS) {
+        continue;
+      }
+      I.remove();
+    }
+    return new List.from(elements);
+  }
+
+  List<Element> _findTopLevelElements(LibraryElement library, TopLevelNamesKind topKind) {
+    List<Element> elements = [];
+    if (topKind == TopLevelNamesKind.DECLARED_AND_IMPORTS) {
+      elements.addAll(CorrectionUtils.getTopLevelElements(library));
+      for (ImportElement imp in library.imports) {
+        elements.addAll(CorrectionUtils.getImportNamespace(imp).values);
+      }
+      _removeNotMatchingFilter(elements);
+    }
+    if (topKind == TopLevelNamesKind.DECLARED_AND_EXPORTS) {
+      elements.addAll(CorrectionUtils.getExportNamespace2(library).values);
+      _removeNotMatchingFilter(elements);
+    }
+    return elements;
+  }
+
+  AnalysisContext get analysisContext => _context.compilationUnitElement.context;
+
+  LibraryElement get currentLibrary => _context.compilationUnitElement.enclosingElement;
+
+  FunctionType _getFunctionType(Element element) {
+    if (element is ExecutableElement) {
+      ExecutableElement executableElement = element;
+      return executableElement.type;
+    }
+    if (element is VariableElement) {
+      VariableElement variableElement = element;
+      DartType type = variableElement.type;
+      if (type is FunctionType) {
+        return type;
+      }
+    }
+    return null;
+  }
+
+  ClassElement get objectClassElement => typeProvider.objectType.element;
+
+  InterfaceType get objectType => typeProvider.objectType;
+
+  List<ParameterElement> _getParameterElements(ArgumentList args) {
+    List<ParameterElement> parameters = null;
+    AstNode argsParent = args.parent;
+    if (argsParent is MethodInvocation) {
+      MethodInvocation invocation = argsParent;
+      Element nameElement = invocation.methodName.staticElement;
+      FunctionType functionType = _getFunctionType(nameElement);
+      if (functionType != null) {
+        parameters = functionType.parameters;
+      }
+    }
+    if (argsParent is InstanceCreationExpression) {
+      InstanceCreationExpression creation = argsParent;
+      ConstructorElement element = creation.staticElement;
+      if (element != null) {
+        parameters = element.parameters;
+      }
+    }
+    if (argsParent is Annotation) {
+      Annotation annotation = argsParent;
+      Element element = annotation.element;
+      if (element is ConstructorElement) {
+        parameters = element.parameters;
+      }
+    }
+    return parameters;
+  }
+
+  TypeProvider get typeProvider {
+    AnalysisContext analysisContext = _context.compilationUnitElement.context;
+    try {
+      return (analysisContext as InternalAnalysisContext).typeProvider;
+    } on AnalysisException catch (exception) {
+      // TODO(brianwilkerson) Figure out the right thing to do if the core cannot be resolved.
+      return null;
+    }
+  }
+
+  bool get hasErrorBeforeCompletionLocation {
+    List<AnalysisError> errors = _context.errors;
+    if (errors == null || errors.length == 0) {
+      return false;
+    }
+    return errors[0].offset <= _completionLocation();
+  }
+
+  List<ImportElement> _importsWithName(SimpleIdentifier libName) {
+    String name = libName.name;
+    List<ImportElement> imports = [];
+    for (ImportElement imp in currentLibrary.imports) {
+      PrefixElement prefix = imp.prefix;
+      if (prefix != null) {
+        String impName = prefix.displayName;
+        if (name == impName) {
+          imports.add(imp);
+        }
+      }
+    }
+    return new List.from(imports);
+  }
+
+  bool _isCompletingKeyword(Token keyword) {
+    if (keyword == null) {
+      return false;
+    }
+    int completionLoc = _context.selectionOffset;
+    if (completionLoc >= keyword.offset && completionLoc <= keyword.end) {
+      return true;
+    }
+    return false;
+  }
+
+  bool _isCompletionAfter(int loc) => loc <= _completionLocation();
+
+  bool _isCompletionBefore(int loc) => _completionLocation() <= loc;
+
+  bool _isCompletionBetween(int firstLoc, int secondLoc) => _isCompletionAfter(firstLoc) && _isCompletionBefore(secondLoc);
+
+  bool _isDeprecated(Element element) => element != null && element.isDeprecated;
+
+  bool _isInCurrentLibrary(Element element) {
+    LibraryElement libElement = currentLibrary;
+    return identical(element.library, libElement);
+  }
+
+  bool _isUnitInLibFolder(CompilationUnitElement cu) {
+    String pathString = cu.source.fullName;
+    if (pathString.indexOf("/lib/") == -1) {
+      return false;
+    }
+    return true;
+  }
+
+  bool _isVisible(Element element) => !_isPrivate(element) || _isInCurrentLibrary(element);
+
+  String _makeNonconflictingName(String candidate, List<String> names) {
+    String possibility = candidate;
+    int count = 0;
+    loop: while (true) {
+      String name = count == 0 ? possibility : "${possibility}${count}";
+      for (String conflict in names) {
+        if (name == conflict) {
+          count += 1;
+          continue loop;
+        }
+      }
+      return name;
+    }
+  }
+
+  void _pArgumentList(CompletionProposal proposal, int offset, int len) {
+    // prepare parameters
+    List<String> parameterNames = proposal.parameterNames;
+    if (parameterNames.length == 0) {
+      return;
+    }
+    // fill arguments proposal
+    CompletionProposal prop = _createProposal4(ProposalKind.ARGUMENT_LIST);
+    prop.setElement(proposal.element);
+    prop.setCompletion(proposal.completion).setReturnType(proposal.returnType);
+    prop.setParameterNames(parameterNames);
+    prop.setParameterTypes(proposal.parameterTypes);
+    prop.setParameterStyle(proposal.positionalParameterCount, proposal.hasNamed, proposal.hasPositional);
+    prop.setReplacementLength(0).setLocation(_completionLocation());
+    prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
+    _requestor.accept(prop);
+  }
+
+  void _pDynamic() {
+    _pWord(_C_DYNAMIC, ProposalKind.VARIABLE);
+  }
+
+  void _pExecutable(Element element, FunctionType functionType, SimpleIdentifier identifier, bool isPotentialMatch) {
+    // Create a completion proposal for the element: function, method, getter, setter, constructor.
+    String name = element.displayName;
+    if (name.isEmpty) {
+      return;
+    }
+    if (_filterDisallows(element)) {
+      return;
+    }
+    if (!_isVisible(element)) {
+      return;
+    }
+    // May be we are in argument of function type parameter, propose function reference.
+    if (_state._targetParameter != null) {
+      DartType parameterType = _state._targetParameter.type;
+      if (parameterType is FunctionType) {
+        if (functionType.isAssignableTo(parameterType)) {
+          _pName2(name, element, CompletionProposal.RELEVANCE_HIGH, ProposalKind.METHOD_NAME);
+        }
+      }
+    }
+    CompletionProposal prop = _createProposal(element);
+    prop.setPotentialMatch(isPotentialMatch);
+    if (isPotentialMatch) {
+      prop.setRelevance(CompletionProposal.RELEVANCE_LOW);
+    }
+    _setParameterInfo(functionType, prop);
+    prop.setCompletion(name).setReturnType(functionType.returnType.displayName);
+    // If there is already argument list, then update only method name.
+    if (identifier.parent is MethodInvocation && (identifier.parent as MethodInvocation).argumentList != null) {
+      prop.setKind(ProposalKind.METHOD_NAME);
+    }
+    Element container = element.enclosingElement;
+    if (container != null) {
+      prop.setDeclaringType(container.displayName);
+    }
+    _requestor.accept(prop);
+  }
+
+  void _pExecutable2(ExecutableElement element, SimpleIdentifier identifier, bool isPotentialMatch) {
+    _pExecutable(element, element.type, identifier, isPotentialMatch);
+  }
+
+  void _pExecutable3(VariableElement element, SimpleIdentifier identifier) {
+    // Create a completion proposal for the element: top-level variable.
+    String name = element.displayName;
+    if (name.isEmpty || _filterDisallows(element)) {
+      return;
+    }
+    CompletionProposal prop = _createProposal(element);
+    if (element.type != null) {
+      prop.setReturnType(element.type.name);
+    }
+    Element container = element.enclosingElement;
+    if (container != null) {
+      prop.setDeclaringType(container.displayName);
+    }
+    if (identifier != null) {
+      prop.setReplacementLengthIdentifier(identifier.length);
+    }
+    _requestor.accept(prop);
+  }
+
+  void _pFalse() {
+    _pWord(_C_FALSE, ProposalKind.VARIABLE);
+  }
+
+  void _pField(FieldElement element, SimpleIdentifier identifier, ClassElement classElement) {
+    // Create a completion proposal for the element: field only.
+    if (_filterDisallows(element)) {
+      return;
+    }
+    CompletionProposal prop = _createProposal(element);
+    Element container = element.enclosingElement;
+    prop.setDeclaringType(container.displayName);
+    _requestor.accept(prop);
+  }
+
+  /**
+   * Proposes URI with the given scheme for the given [NamespaceDirective].
+   */
+  void _pImportUriWithScheme(NamespaceDirective node, String uriScheme) {
+    String newUri = "${uriScheme}${new String.fromCharCode(CompletionProposal.CURSOR_MARKER)}";
+    if (node.uri.isSynthetic) {
+      newUri = "'${newUri}'";
+      if (node.semicolon == null || node.semicolon.isSynthetic) {
+        newUri += ";";
+      }
+    }
+    if (_context.selectionOffset == node.keyword.end) {
+      newUri = " ${newUri}";
+    }
+    _pName3(newUri, ProposalKind.IMPORT);
+  }
+
+  void _pKeyword(Token keyword) {
+    _filter = new Filter.con2(keyword.lexeme, keyword.offset, _completionLocation());
+    // This isn't as useful as it might seem. It only works in the case that completion
+    // is requested on an existing recognizable keyword.
+    // TODO: Add keyword proposal kind
+    CompletionProposal prop = _createProposal4(ProposalKind.LIBRARY_PREFIX);
+    prop.setCompletion(keyword.lexeme);
+    _requestor.accept(prop);
+  }
+
+  void _pName(Element element, SimpleIdentifier identifier) {
+    CompletionProposal prop = _createProposal2(element, identifier);
+    if (prop != null) {
+      _requestor.accept(prop);
+    }
+  }
+
+  void _pName2(String name, Element element, int relevance, ProposalKind kind) {
+    if (_filterDisallows2(name)) {
+      return;
+    }
+    CompletionProposal prop = _createProposal4(kind);
+    prop.setRelevance(relevance);
+    prop.setCompletion(name);
+    prop.setElement(element);
+    _requestor.accept(prop);
+  }
+
+  void _pName3(String name, ProposalKind kind) {
+    if (_filterDisallows2(name)) {
+      return;
+    }
+    CompletionProposal prop = _createProposal4(kind);
+    prop.setCompletion(name);
+    _requestor.accept(prop);
+  }
+
+  void _pNamedConstructor(ClassElement classElement, ConstructorElement element, SimpleIdentifier identifier) {
+    // Create a completion proposal for the named constructor.
+    String name = classElement.displayName;
+    if (!element.displayName.isEmpty) {
+      name += ".${element.displayName}";
+    }
+    if (_filterDisallows2(name)) {
+      return;
+    }
+    CompletionProposal prop = _createProposal3(element, name);
+    _setParameterInfo(element.type, prop);
+    prop.setReturnType(element.type.returnType.name);
+    Element container = element.enclosingElement;
+    prop.setDeclaringType(container.displayName);
+    if (identifier != null) {
+      prop.setReplacementLengthIdentifier(identifier.length);
+    }
+    _requestor.accept(prop);
+  }
+
+  void _pNull() {
+    _pWord(_C_NULL, ProposalKind.VARIABLE);
+  }
+
+  void _pParamName(String name) {
+    if (_filterDisallows2(name)) {
+      return;
+    }
+    CompletionProposal prop = _createProposal4(ProposalKind.PARAMETER);
+    prop.setCompletion(name);
+    _requestor.accept(prop);
+  }
+
+  ProposalKind _proposalKindOf(Element element) {
+    ProposalKind kind;
+    while (true) {
+      if (element.kind == ElementKind.CONSTRUCTOR) {
+        kind = ProposalKind.CONSTRUCTOR;
+      } else if (element.kind == ElementKind.FUNCTION) {
+        kind = ProposalKind.FUNCTION;
+      } else if (element.kind == ElementKind.METHOD) {
+        kind = ProposalKind.METHOD;
+      } else if (element.kind == ElementKind.GETTER) {
+        kind = ProposalKind.GETTER;
+      } else if (element.kind == ElementKind.SETTER) {
+        kind = ProposalKind.SETTER;
+      } else if (element.kind == ElementKind.CLASS) {
+        kind = ProposalKind.CLASS;
+      } else if (element.kind == ElementKind.FIELD) {
+        kind = ProposalKind.FIELD;
+      } else if (element.kind == ElementKind.IMPORT) {
+        kind = ProposalKind.IMPORT;
+      } else if (element.kind == ElementKind.PARAMETER) {
+        kind = ProposalKind.PARAMETER;
+      } else if (element.kind == ElementKind.PREFIX) {
+        kind = ProposalKind.LIBRARY_PREFIX;
+      } else if (element.kind == ElementKind.FUNCTION_TYPE_ALIAS) {
+        kind = ProposalKind.CLASS_ALIAS;
+      } else if (element.kind == ElementKind.TYPE_PARAMETER) {
+        kind = ProposalKind.TYPE_PARAMETER;
+      } else if (element.kind == ElementKind.LOCAL_VARIABLE || element.kind == ElementKind.TOP_LEVEL_VARIABLE) {
+        kind = ProposalKind.VARIABLE;
+      } else {
+        throw new IllegalArgumentException();
+      }
+      break;
+    }
+    return kind;
+  }
+
+  void _proposeCombinator(Combinator node, SimpleIdentifier identifier) {
+    _filter = _createFilter(identifier);
+    NamespaceDirective directive = node.parent as NamespaceDirective;
+    LibraryElement libraryElement = directive.uriElement;
+    if (libraryElement != null) {
+      // prepare Elements with unique names
+      CompletionEngine_NameCollector nameCollector = _createNameCollector();
+      Iterable<Element> elements = CorrectionUtils.getExportNamespace2(libraryElement).values;
+      for (Element element in elements) {
+        if (_filterDisallows(element)) {
+          continue;
+        }
+        nameCollector._mergeName(element);
+      }
+      // propose each Element
+      for (Element element in nameCollector.uniqueElements) {
+        CompletionProposal proposal = _createProposal(element);
+        if (proposal.kind == ProposalKind.FUNCTION) {
+          proposal.setKind(ProposalKind.METHOD_NAME);
+        }
+        _requestor.accept(proposal);
+      }
+    }
+  }
+
+  void _proposeName(Element element, SimpleIdentifier identifier, CompletionEngine_NameCollector names) {
+    while (true) {
+      if (element.kind == ElementKind.FUNCTION || element.kind == ElementKind.GETTER || element.kind == ElementKind.METHOD || element.kind == ElementKind.SETTER) {
+        ExecutableElement candidate = element as ExecutableElement;
+        _pExecutable2(candidate, identifier, names._isPotentialMatch(candidate));
+      } else if (element.kind == ElementKind.LOCAL_VARIABLE || element.kind == ElementKind.PARAMETER || element.kind == ElementKind.TOP_LEVEL_VARIABLE) {
+        FunctionType functionType = _getFunctionType(element);
+        if (functionType != null) {
+          _pExecutable(element, functionType, identifier, names._isPotentialMatch(element));
+        } else {
+          VariableElement var2 = element as VariableElement;
+          _pExecutable3(var2, identifier);
+        }
+      } else if (element.kind == ElementKind.CLASS) {
+        _pName(element, identifier);
+      } else {
+      }
+      break;
+    }
+  }
+
+  void _proposeNames(CompletionEngine_NameCollector names, SimpleIdentifier identifier) {
+    for (Element element in names.uniqueElements) {
+      _proposeName(element, identifier, names);
+    }
+  }
+
+  void _pTrue() {
+    _pWord(_C_TRUE, ProposalKind.VARIABLE);
+  }
+
+  void _pVar() {
+    _pWord(_C_VAR, ProposalKind.VARIABLE);
+  }
+
+  void _pVoid() {
+    _pWord(_C_VOID, ProposalKind.VARIABLE);
+  }
+
+  void _pWord(String word, ProposalKind kind) {
+    if (_filterDisallows2(word)) {
+      return;
+    }
+    CompletionProposal prop = _createProposal4(kind);
+    prop.setCompletion(word);
+    _requestor.accept(prop);
+  }
+
+  void _removeNotMatchingFilter(List<Element> elements) {
+    if (_filter == null) {
+      return;
+    }
+    _filter._makePattern();
+    _filter._removeNotMatching(elements);
+  }
+
+  void _setParameterInfo(FunctionType functionType, CompletionProposal prop) {
+    List<String> params = new List<String>();
+    List<String> types = new List<String>();
+    bool named = false, positional = false;
+    int posCount = 0;
+    for (ParameterElement param in functionType.parameters) {
+      if (!param.isSynthetic) {
+        while (true) {
+          if (param.parameterKind == ParameterKind.REQUIRED) {
+            posCount += 1;
+          } else if (param.parameterKind == ParameterKind.NAMED) {
+            named = true;
+          } else if (param.parameterKind == ParameterKind.POSITIONAL) {
+            positional = true;
+          }
+          break;
+        }
+        params.add(param.displayName);
+        types.add(param.type.toString());
+      }
+    }
+    prop.setParameterNames(new List.from(params));
+    prop.setParameterTypes(new List.from(types));
+    prop.setParameterStyle(posCount, named, positional);
+  }
+
+  SimpleIdentifier _typeDeclarationName(AstNode node) {
+    AstNode parent = node;
+    while (parent != null) {
+      if (parent is ClassDeclaration) {
+        return (parent as ClassDeclaration).name;
+      }
+      if (parent is ClassTypeAlias) {
+        return (parent as ClassTypeAlias).name;
+      }
+      if (parent is FunctionTypeAlias) {
+        return (parent as FunctionTypeAlias).name;
+      }
+      parent = parent.parent;
+    }
+    return null;
+  }
+
+  DartType _typeOf(Element receiver) {
+    DartType receiverType;
+    while (true) {
+      if (receiver.kind == ElementKind.FIELD || receiver.kind == ElementKind.PARAMETER || receiver.kind == ElementKind.LOCAL_VARIABLE || receiver.kind == ElementKind.TOP_LEVEL_VARIABLE) {
+        {
+          VariableElement receiverElement = receiver as VariableElement;
+          receiverType = receiverElement.type;
+          break;
+        }
+      } else if (receiver.kind == ElementKind.GETTER) {
+        PropertyAccessorElement accessor = receiver as PropertyAccessorElement;
+        if (accessor.isSynthetic) {
+          PropertyInducingElement inducer = accessor.variable;
+          DartType inducerType = inducer.type;
+          if (inducerType == null || inducerType.isDynamic) {
+            receiverType = _typeSearch(inducer);
+            if (receiverType != null) {
+              break;
+            }
+          }
+        }
+        FunctionType accType = accessor.type;
+        receiverType = accType == null ? null : accType.returnType;
+      } else if (receiver.kind == ElementKind.CONSTRUCTOR || receiver.kind == ElementKind.FUNCTION || receiver.kind == ElementKind.METHOD || receiver.kind == ElementKind.SETTER) {
+        {
+          ExecutableElement receiverElement = receiver as ExecutableElement;
+          FunctionType funType = receiverElement.type;
+          receiverType = funType == null ? null : funType.returnType;
+          break;
+        }
+      } else if (receiver.kind == ElementKind.CLASS) {
+        {
+          ClassElement receiverElement = receiver as ClassElement;
+          receiverType = receiverElement.type;
+          break;
+        }
+      } else if (receiver.kind == ElementKind.DYNAMIC) {
+        {
+          receiverType = DynamicTypeImpl.instance;
+          break;
+        }
+      } else if (receiver.kind == ElementKind.FUNCTION_TYPE_ALIAS) {
+        {
+          FunctionTypeAliasElement receiverElement = receiver as FunctionTypeAliasElement;
+          FunctionType funType = receiverElement.type;
+          receiverType = funType == null ? null : funType.returnType;
+          break;
+        }
+      } else {
+        {
+          receiverType = null;
+          break;
+        }
+      }
+      break;
+    }
+    return receiverType;
+  }
+
+  DartType _typeOf2(Expression expr) {
+    DartType type = expr.bestType;
+    if (type.isDynamic) {
+      List<DartType> result = new List<DartType>(1);
+      CompletionEngine_AstNodeClassifier visitor = new AstNodeClassifier_CompletionEngine_typeOf(this, result);
+      expr.accept(visitor);
+      if (result[0] != null) {
+        return result[0];
+      }
+    }
+    return type;
+  }
+
+  DartType _typeOfContainingClass(AstNode node) {
+    AstNode parent = node;
+    while (parent != null) {
+      if (parent is ClassDeclaration) {
+        return (parent as ClassDeclaration).element.type;
+      }
+      parent = parent.parent;
+    }
+    return DynamicTypeImpl.instance;
+  }
+
+  DartType _typeSearch(PropertyInducingElement varElement) {
+    // TODO(scheglov) translate it
+    return null;
+  }
+}
+
+abstract class CompletionEngine_AstNodeClassifier extends GeneralizingAstVisitor<Object> {
+  @override
+  Object visitNode(AstNode node) => null;
+}
+
+class CompletionEngine_CommentReferenceCompleter extends CompletionEngine_AstNodeClassifier {
+  final CompletionEngine CompletionEngine_this;
+
+  final SimpleIdentifier _identifier;
+
+  CompletionEngine_NameCollector _names;
+
+  Set<Element> _enclosingElements = new Set();
+
+  CompletionEngine_CommentReferenceCompleter(this.CompletionEngine_this, this._identifier) {
+    CompletionEngine_this._filter = CompletionEngine_this._createFilter(_identifier);
+    _names = CompletionEngine_this._collectTopLevelElementVisibleAt(_identifier);
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement classElement = node.element;
+    _names._addNamesDefinedByHierarchy(classElement, false);
+    _enclosingElements.add(classElement);
+    return null;
+  }
+
+  @override
+  Object visitComment(Comment node) {
+    node.parent.accept(this);
+    // propose names
+    for (Element element in _names.uniqueElements) {
+      CompletionProposal proposal = CompletionEngine_this._createProposal2(element, _identifier);
+      if (proposal != null) {
+        // we don't want to add arguments, just names
+        if (element is MethodElement || element is FunctionElement) {
+          proposal.setKind(ProposalKind.METHOD_NAME);
+        }
+        // elevate priority for local elements
+        if (_enclosingElements.contains(element.enclosingElement)) {
+          proposal.setRelevance(CompletionProposal.RELEVANCE_HIGH);
+        }
+        // propose
+        CompletionEngine_this._requestor.accept(proposal);
+      }
+    }
+    // done
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    _visitExecutableDeclaration(node);
+    // pass through
+    return node.parent.accept(this);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    _visitExecutableDeclaration(node);
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAliasElement element = node.element;
+    _names._mergeNames(element.parameters);
+    _enclosingElements.add(element);
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    _visitExecutableDeclaration(node);
+    // pass through
+    return node.parent.accept(this);
+  }
+
+  void _visitExecutableDeclaration(Declaration node) {
+    ExecutableElement element = node.element as ExecutableElement;
+    _names._mergeNames(element.parameters);
+    _enclosingElements.add(element);
+  }
+}
+
+/**
+ * An IdentifierCompleter is used to classify the parent of the completion node when it has
+ * previously been determined that the completion node is a SimpleIdentifier.
+ */
+class CompletionEngine_IdentifierCompleter extends CompletionEngine_AstNodeClassifier {
+  final CompletionEngine CompletionEngine_this;
+
+  SimpleIdentifier _completionNode;
+
+  CompletionEngine_IdentifierCompleter(this.CompletionEngine_this, SimpleIdentifier node) {
+    _completionNode = node;
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    if (_completionNode is SimpleIdentifier) {
+      CompletionEngine_this._analyzeAnnotationName(_completionNode);
+    }
+    return null;
+  }
+
+  @override
+  Object visitArgumentList(ArgumentList node) {
+    if (_completionNode is SimpleIdentifier) {
+      if (CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
+        CompletionEngine_this._analyzeLocalName(_completionNode);
+        CompletionEngine_this._analyzePositionalArgument(node, _completionNode);
+        CompletionEngine_this._analyzeNamedParameter(node, _completionNode);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    if (_completionNode is SimpleIdentifier) {
+      CompletionEngine_this._analyzeLocalName(_completionNode);
+    }
+    return null;
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    if (identical(node.leftOperand, _completionNode)) {
+      CompletionEngine_this._analyzeLocalName(_completionNode);
+    } else if (identical(node.rightOperand, _completionNode)) {
+      CompletionEngine_this._analyzeLocalName(_completionNode);
+    }
+    return null;
+  }
+
+  @override
+  Object visitCombinator(Combinator node) {
+    CompletionEngine_this._proposeCombinator(node, _completionNode);
+    return null;
+  }
+
+  @override
+  Object visitCommentReference(CommentReference node) {
+    AstNode comment = node.parent;
+    CompletionEngine_CommentReferenceCompleter visitor = new CompletionEngine_CommentReferenceCompleter(CompletionEngine_this, _completionNode);
+    return comment.accept(visitor);
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (identical(node.returnType, _completionNode)) {
+      CompletionEngine_this._filter = CompletionEngine_this._createFilter(_completionNode);
+      CompletionEngine_this._pName3(_completionNode.name, ProposalKind.CONSTRUCTOR);
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    // { A() : this.!x = 1; }
+    if (identical(node.fieldName, _completionNode)) {
+      ClassElement classElement = (node.parent as ConstructorDeclaration).element.enclosingElement;
+      CompletionEngine_this._fieldReference(classElement, node.fieldName);
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorName(ConstructorName node) {
+    if (identical(node.name, _completionNode)) {
+      // { new A.!c(); }
+      TypeName typeName = node.type;
+      if (typeName != null) {
+        DartType type = typeName.type;
+        Element typeElement = type.element;
+        if (typeElement is ClassElement) {
+          ClassElement classElement = typeElement;
+          CompletionEngine_this._constructorReference(classElement, node.name);
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitDoStatement(DoStatement node) {
+    if (identical(node.condition, _completionNode)) {
+      CompletionEngine_this._analyzeLocalName(_completionNode);
+    }
+    return null;
+  }
+
+  @override
+  Object visitExpression(Expression node) {
+    SimpleIdentifier ident;
+    if (_completionNode is SimpleIdentifier) {
+      ident = _completionNode;
+    } else {
+      ident = CompletionEngine_this._createIdent(node);
+    }
+    CompletionEngine_this._analyzeLocalName(ident);
+    return null;
+  }
+
+  @override
+  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    if (identical(_completionNode, node.expression)) {
+      CompletionEngine_this._analyzeLocalName(_completionNode);
+    }
+    return null;
+  }
+
+  @override
+  Object visitExpressionStatement(ExpressionStatement node) {
+    SimpleIdentifier ident;
+    if (_completionNode is SimpleIdentifier) {
+      ident = _completionNode;
+    } else {
+      ident = CompletionEngine_this._createIdent(node);
+    }
+    CompletionEngine_this._analyzeLocalName(ident);
+    return null;
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    if (identical(_completionNode, node.identifier)) {
+      CompletionEngine_this._analyzeImmediateField(node.identifier);
+    }
+    return null;
+  }
+
+  @override
+  Object visitForEachStatement(ForEachStatement node) {
+    if (identical(node.iterator, _completionNode)) {
+      CompletionEngine_this._analyzeLocalName(_completionNode);
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    if (identical(node.name, _completionNode)) {
+      if (node.returnType == null) {
+        // This may be an incomplete class type alias
+        CompletionEngine_this._state._includesUndefinedTypes();
+        CompletionEngine_this._analyzeTypeName(node.name, CompletionEngine_this._typeDeclarationName(node));
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitIfStatement(IfStatement node) {
+    if (identical(node.condition, _completionNode)) {
+      // { if (!) }
+      CompletionEngine_this._analyzeLocalName(new Ident.con3(node, _completionNode.token));
+    }
+    return null;
+  }
+
+  @override
+  Object visitInterpolationExpression(InterpolationExpression node) {
+    if (node.expression is SimpleIdentifier) {
+      SimpleIdentifier ident = node.expression as SimpleIdentifier;
+      CompletionEngine_this._analyzeLocalName(ident);
+    }
+    return null;
+  }
+
+  @override
+  Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    if (identical(_completionNode, node.name)) {
+      if (node.returnType == null) {
+        // class Foo {const F!(); }
+        CompletionEngine_this._analyzeLocalName(_completionNode);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    if (identical(node.methodName, _completionNode)) {
+      // { x.!y() }
+      Expression expr = node.realTarget;
+      DartType receiverType;
+      if (expr == null) {
+        receiverType = CompletionEngine_this._typeOfContainingClass(node);
+        CompletionEngine_this._analyzeDirectAccess(receiverType, node.methodName);
+      } else {
+        CompletionEngine_this._dispatchPrefixAnalysis2(node);
+      }
+    } else if (identical(node.target, _completionNode)) {
+      // { x!.y() } -- only reached when node.getTarget() is a simple identifier.
+      if (_completionNode is SimpleIdentifier) {
+        SimpleIdentifier ident = _completionNode;
+        CompletionEngine_this._analyzeReceiver(ident);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitParenthesizedExpression(ParenthesizedExpression node) {
+    // Incomplete closure: foo((Str!)); We check if "()" is argument for function typed parameter.
+    if (node.parent is ArgumentList) {
+      ParameterElement parameterElement = node.bestParameterElement;
+      if (parameterElement != null && parameterElement.type is FunctionType) {
+        Ident ident = CompletionEngine_this._createIdent(_completionNode);
+        CompletionEngine_this._analyzeTypeName(_completionNode, ident);
+      }
+    }
+    return super.visitParenthesizedExpression(node);
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (identical(node.prefix, _completionNode)) {
+      // { x!.y }
+      CompletionEngine_this._analyzeLocalName(node.prefix);
+    } else {
+      // { v.! }
+      CompletionEngine_this._dispatchPrefixAnalysis3(node, node.identifier);
+    }
+    return null;
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    if (node.target != null && node.target.length == 0) {
+      return null;
+    }
+    // { o.!hashCode }
+    if (identical(node.propertyName, _completionNode)) {
+      CompletionEngine_this._analyzePrefixedAccess(node.realTarget, node.propertyName);
+    }
+    return null;
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    // { A.Fac() : this.!b(); }
+    if (identical(node.constructorName, _completionNode)) {
+      ClassElement classElement = node.staticElement.enclosingElement;
+      CompletionEngine_this._constructorReference(classElement, node.constructorName);
+    }
+    return null;
+  }
+
+  @override
+  Object visitReturnStatement(ReturnStatement node) {
+    if (_completionNode is SimpleIdentifier) {
+      CompletionEngine_this._analyzeLocalName(_completionNode);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (identical(node.identifier, _completionNode)) {
+      if (node.keyword == null && node.type == null) {
+        Ident ident = CompletionEngine_this._createIdent(node);
+        CompletionEngine_this._analyzeTypeName(node.identifier, ident);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    CompletionEngine_this._analyzeSuperConstructorInvocation(node);
+    return null;
+  }
+
+  @override
+  Object visitSwitchCase(SwitchCase node) {
+    if (identical(_completionNode, node.expression)) {
+      CompletionEngine_this._analyzeLocalName(_completionNode);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    if (identical(node.expression, _completionNode)) {
+      CompletionEngine_this._analyzeLocalName(_completionNode);
+    }
+    return null;
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    AstNode parent = node.parent;
+    if (parent != null) {
+      CompletionEngine_TypeNameCompleter visitor = new CompletionEngine_TypeNameCompleter(CompletionEngine_this, _completionNode, node);
+      return parent.accept(visitor);
+    }
+    return null;
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    // { X<!Y> }
+    if (CompletionEngine_this._isCompletionBetween(node.offset, node.end)) {
+      CompletionEngine_this._analyzeTypeName(_completionNode, CompletionEngine_this._typeDeclarationName(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    if (identical(node.name, _completionNode)) {
+      CompletionEngine_this._analyzeDeclarationName(node);
+    } else if (identical(node.initializer, _completionNode)) {
+      CompletionEngine_this._analyzeLocalName(node.initializer as SimpleIdentifier);
+    }
+    return null;
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    if (identical(node.condition, _completionNode)) {
+      CompletionEngine_this._analyzeLocalName(_completionNode);
+    }
+    return null;
+  }
+}
+
+class CompletionEngine_NameCollector {
+  final CompletionEngine CompletionEngine_this;
+
+  Map<String, List<Element>> _uniqueNames = new Map<String, List<Element>>();
+
+  Set<Element> _potentialMatches;
+
+  CompletionEngine_NameCollector(this.CompletionEngine_this);
+
+  void addAll(Iterable<SimpleIdentifier> values) {
+    for (SimpleIdentifier id in values) {
+      _mergeName(id.bestElement);
+    }
+  }
+
+  void addLocalNames(SimpleIdentifier identifier) {
+    AstNode node = identifier;
+    Declaration decl;
+    while ((decl = node.getAncestor((node) => node is Declaration)) != null) {
+      Element declElement = decl.element;
+      if (declElement is ExecutableElement) {
+        _addNamesDefinedByExecutable(declElement);
+      } else {
+        return;
+      }
+      node = decl.parent;
+    }
+  }
+
+  void _addNamesDefinedByExecutable(ExecutableElement execElement) {
+    _mergeNames(execElement.parameters);
+    _mergeNames(execElement.localVariables);
+    _mergeNames(execElement.functions);
+  }
+
+  void _addNamesDefinedByHierarchy(ClassElement classElement, bool forSuper) {
+    _addNamesDefinedByHierarchy2(classElement.type, forSuper);
+  }
+
+  void _addNamesDefinedByHierarchy2(InterfaceType type, bool forSuper) {
+    List<InterfaceType> superTypes = type.element.allSupertypes;
+    if (!forSuper) {
+      superTypes.insert(0, type);
+    }
+    _addNamesDefinedByTypes(superTypes);
+    // Collect names defined by subtypes separately so they can be identified later.
+    CompletionEngine_NameCollector potentialMatchCollector = CompletionEngine_this._createNameCollector();
+    if (!type.isObject) {
+      potentialMatchCollector._addNamesDefinedByTypes(CompletionEngine_this._allSubtypes(type.element));
+    }
+    _potentialMatches = new Set<Element>();
+    for (List<Element> matches in potentialMatchCollector._uniqueNames.values) {
+      for (Element match in matches) {
+        _mergeName(match);
+        _potentialMatches.add(match);
+      }
+    }
+  }
+
+  void _addNamesDefinedByType(ClassElement classElement) {
+    _addNamesDefinedByType2(classElement.type);
+  }
+
+  void _addNamesDefinedByType2(InterfaceType type) {
+    if (_inPrivateLibrary(type)) {
+      return;
+    }
+    List<PropertyAccessorElement> accessors = type.accessors;
+    _mergeNames(accessors);
+    List<MethodElement> methods = type.methods;
+    _mergeNames(methods);
+    _mergeNames(type.element.typeParameters);
+    _filterStaticRefs(accessors);
+    _filterStaticRefs(methods);
+  }
+
+  void _addNamesDefinedByTypes(List<InterfaceType> types) {
+    for (InterfaceType type in types) {
+      _addNamesDefinedByType2(type);
+    }
+  }
+
+  void _addTopLevelNames(List<ImportElement> imports, TopLevelNamesKind topKind) {
+    for (ImportElement imp in imports) {
+      Iterable<Element> elementsCollection = CorrectionUtils.getImportNamespace(imp).values;
+      List<Element> elements = [];
+      _addTopLevelNames4(elements);
+    }
+  }
+
+  void _addTopLevelNames2(LibraryElement library, TopLevelNamesKind topKind) {
+    List<Element> elements = CompletionEngine_this._findTopLevelElements(library, topKind);
+    _addTopLevelNames4(elements);
+  }
+
+  void _addTopLevelNames3(List<LibraryElement> libraries, TopLevelNamesKind topKind) {
+    for (LibraryElement library in libraries) {
+      _addTopLevelNames2(library, topKind);
+    }
+  }
+
+  Iterable<List<Element>> get names => _uniqueNames.values;
+
+  Iterable<Element> get uniqueElements {
+    List<Element> uniqueElements = [];
+    for (List<Element> uniques in _uniqueNames.values) {
+      Element element = uniques[0];
+      uniqueElements.add(element);
+    }
+    return uniqueElements;
+  }
+
+  bool _isPotentialMatch(Element element) => _potentialMatches != null && _potentialMatches.contains(element);
+
+  void _remove(Element element) {
+    String name = element.displayName;
+    List<Element> list = _uniqueNames[name];
+    if (list == null) {
+      return;
+    }
+    list.remove(element);
+    if (list.isEmpty) {
+      _uniqueNames.remove(name);
+    }
+  }
+
+  void _addTopLevelNames4(List<Element> elements) {
+    _mergeNames(CompletionEngine_this._findAllTypes2(elements));
+    if (!CompletionEngine_this._state._areClassesRequired) {
+      _mergeNames(CompletionEngine_this._findAllNotTypes(elements));
+      _mergeNames(CompletionEngine_this._findAllPrefixes());
+    }
+  }
+
+  void _filterStaticRefs(List<ExecutableElement> elements) {
+    for (ExecutableElement execElem in elements) {
+      if (CompletionEngine_this._state._areInstanceReferencesProhibited && !execElem.isStatic) {
+        _remove(execElem);
+      } else if (CompletionEngine_this._state._areStaticReferencesProhibited && execElem.isStatic) {
+        _remove(execElem);
+      } else if (!CompletionEngine_this._state._areOperatorsAllowed && execElem.isOperator) {
+        _remove(execElem);
+      } else if (CompletionEngine_this._state._areMethodsProhibited && !execElem.isOperator) {
+        _remove(execElem);
+      }
+    }
+  }
+
+  bool _inPrivateLibrary(InterfaceType type) {
+    LibraryElement lib = type.element.library;
+    if (!lib.name.startsWith("_")) {
+      return false;
+    }
+    // allow completion in the same library
+    if (identical(lib, CompletionEngine_this.currentLibrary)) {
+      return false;
+    }
+    // eliminate types defined in private libraries
+    return true;
+  }
+
+  void _mergeName(Element element) {
+    if (element == null) {
+      return;
+    }
+    // ignore private
+    String name = element.displayName;
+    if (Identifier.isPrivateName(name)) {
+      if (!CompletionEngine_this._isInCurrentLibrary(element)) {
+        return;
+      }
+    }
+    // add to other Element(s) with such name
+    List<Element> dups = _uniqueNames[name];
+    if (dups == null) {
+      dups = new List<Element>();
+      _uniqueNames[name] = dups;
+    }
+    dups.add(element);
+  }
+
+  void _mergeNames(List<Element> elements) {
+    for (Element element in elements) {
+      _mergeName(element);
+    }
+  }
+}
+
+/**
+ * An StringCompleter is used to classify the parent of the completion node when it has previously
+ * been determined that the completion node is a SimpleStringLiteral.
+ */
+class CompletionEngine_StringCompleter extends CompletionEngine_AstNodeClassifier {
+  final CompletionEngine CompletionEngine_this;
+
+  SimpleStringLiteral _completionNode;
+
+  CompletionEngine_StringCompleter(this.CompletionEngine_this, SimpleStringLiteral node) {
+    _completionNode = node;
+  }
+
+  @override
+  Object visitNamespaceDirective(NamespaceDirective node) {
+    if (identical(_completionNode, node.uri)) {
+      CompletionEngine_this._namespaceReference(node, _completionNode);
+    }
+    return null;
+  }
+}
+
+/**
+ * A TerminalNodeCompleter is used to classify the completion node when nothing else is known
+ * about it.
+ */
+class CompletionEngine_TerminalNodeCompleter extends CompletionEngine_AstNodeClassifier {
+  final CompletionEngine CompletionEngine_this;
+
+  CompletionEngine_TerminalNodeCompleter(this.CompletionEngine_this);
+
+  @override
+  Object visitArgumentList(ArgumentList node) {
+    if (node.arguments.isEmpty && CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
+      if (node.parent is MethodInvocation) {
+        // or node.getParent().accept(this); ?
+        MethodInvocation invokeNode = node.parent as MethodInvocation;
+        SimpleIdentifier methodName = invokeNode.methodName;
+        ProposalCollector proposalRequestor = new ProposalCollector(CompletionEngine_this._requestor);
+        try {
+          CompletionEngine_this._requestor = proposalRequestor;
+          CompletionEngine_this._dispatchPrefixAnalysis2(invokeNode);
+        } finally {
+          CompletionEngine_this._requestor = proposalRequestor.requestor;
+        }
+        int offset = methodName.offset;
+        int len = node.rightParenthesis.end - offset;
+        String name = methodName.name;
+        for (CompletionProposal proposal in proposalRequestor.proposals) {
+          if (proposal.completion == name) {
+            CompletionEngine_this._pArgumentList(proposal, offset, len);
+          }
+        }
+      } else if (node.parent is InstanceCreationExpression) {
+        InstanceCreationExpression invokeNode = node.parent as InstanceCreationExpression;
+        ConstructorName methodName = invokeNode.constructorName;
+        ProposalCollector proposalRequestor = new ProposalCollector(CompletionEngine_this._requestor);
+        try {
+          CompletionEngine_this._requestor = proposalRequestor;
+          CompletionEngine_this._dispatchPrefixAnalysis(invokeNode);
+        } finally {
+          CompletionEngine_this._requestor = proposalRequestor.requestor;
+        }
+        int offset = methodName.offset;
+        int len = node.rightParenthesis.end - offset;
+        for (CompletionProposal proposal in proposalRequestor.proposals) {
+          if (proposal.element == invokeNode.staticElement) {
+            CompletionEngine_this._pArgumentList(proposal, offset, len);
+          }
+        }
+      } else if (node.parent is Annotation) {
+        Annotation annotation = node.parent as Annotation;
+        Element annotationElement = annotation.element;
+        if (annotationElement is ConstructorElement) {
+          ConstructorElement constructorElement = annotationElement;
+          // we don't need any filter
+          CompletionEngine_this._filter = new Filter.con2("", -1, 0);
+          // fill parameters for "pArgumentList"
+          CompletionProposal prop = CompletionEngine_this._createProposal(constructorElement);
+          CompletionEngine_this._setParameterInfo(constructorElement.type, prop);
+          prop.setCompletion(constructorElement.enclosingElement.name);
+          // propose the whole parameters list
+          CompletionEngine_this._pArgumentList(prop, 0, 0);
+        }
+      }
+    }
+    if (CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
+      Ident ident = CompletionEngine_this._createIdent(node);
+      CompletionEngine_this._analyzeLocalName(ident);
+      CompletionEngine_this._analyzePositionalArgument(node, ident);
+      CompletionEngine_this._analyzeNamedParameter(node, ident);
+    }
+    return null;
+  }
+
+  @override
+  Object visitAsExpression(AsExpression node) {
+    if (CompletionEngine_this._isCompletionAfter(node.asOperator.end)) {
+      CompletionEngine_this._state._isDynamicAllowed = false;
+      CompletionEngine_this._state._isVoidAllowed = false;
+      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), null);
+    }
+    return null;
+  }
+
+  @override
+  Object visitAssertStatement(AssertStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitBlock(Block node) {
+    if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
+      // { {! stmt; !} }
+      CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitBooleanLiteral(BooleanLiteral node) {
+    CompletionEngine_this._analyzeLiteralReference(node);
+    return null;
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.onKeyword)) {
+      CompletionEngine_this._pKeyword(node.onKeyword);
+    } else if (CompletionEngine_this._isCompletingKeyword(node.catchKeyword)) {
+      CompletionEngine_this._pKeyword(node.catchKeyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.classKeyword)) {
+      CompletionEngine_this._pKeyword(node.classKeyword);
+    } else if (CompletionEngine_this._isCompletingKeyword(node.abstractKeyword)) {
+      CompletionEngine_this._pKeyword(node.abstractKeyword);
+    } else if (!node.leftBracket.isSynthetic) {
+      if (CompletionEngine_this._isCompletionAfter(node.leftBracket.end)) {
+        if (node.rightBracket.isSynthetic || CompletionEngine_this._isCompletionBefore(node.rightBracket.offset)) {
+          if (!CompletionEngine_this.hasErrorBeforeCompletionLocation) {
+            CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
+          }
+        }
+      }
+    }
+    // TODO { abstract ! class ! A ! extends B implements C, D ! {}}
+    return null;
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    }
+    // TODO { typedef ! A ! = ! B ! with C, D !; }
+    return null;
+  }
+
+  @override
+  Object visitCombinator(Combinator node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) => null;
+
+  @override
+  Object visitConstructorName(ConstructorName node) {
+    // { new A.!c(); }
+    TypeName typeName = node.type;
+    if (typeName != null) {
+      DartType type = typeName.type;
+      Element typeElement = type.element;
+      if (typeElement is ClassElement) {
+        ClassElement classElement = typeElement;
+        CompletionEngine_this._constructorReference(classElement, node.name);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitDirective(Directive node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitDoStatement(DoStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.doKeyword)) {
+      CompletionEngine_this._pKeyword(node.doKeyword);
+    } else if (CompletionEngine_this._isCompletingKeyword(node.whileKeyword)) {
+      CompletionEngine_this._pKeyword(node.whileKeyword);
+    } else if (CompletionEngine_this._isCompletionBetween(node.condition.end, node.rightParenthesis.offset)) {
+      CompletionEngine_this._operatorAccess(node.condition, CompletionEngine_this._createIdent(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitDoubleLiteral(DoubleLiteral node) => null;
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    visitNamespaceDirective(node);
+    return null;
+  }
+
+  @override
+  Object visitExpression(Expression node) {
+    CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
+    return null;
+  }
+
+  @override
+  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    if (node.expression != null && node.semicolon != null) {
+      if (CompletionEngine_this._isCompletionBetween(node.expression.end, node.semicolon.offset)) {
+        CompletionEngine_this._operatorAccess(node.expression, CompletionEngine_this._createIdent(node));
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitExpressionStatement(ExpressionStatement node) {
+    CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
+    return null;
+  }
+
+  @override
+  Object visitExtendsClause(ExtendsClause node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    } else if (node.superclass == null) {
+      // { X extends ! }
+      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+    } else {
+      // { X extends ! Y }
+      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitForEachStatement(ForEachStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.forKeyword)) {
+      CompletionEngine_this._pKeyword(node.forKeyword);
+    } else if (CompletionEngine_this._isCompletingKeyword(node.inKeyword)) {
+      CompletionEngine_this._pKeyword(node.inKeyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitFormalParameterList(FormalParameterList node) {
+    if (CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
+      NodeList<FormalParameter> params = node.parameters;
+      if (!params.isEmpty) {
+        FormalParameter last = params[params.length - 1];
+        if (CompletionEngine_this._isCompletionBetween(last.end, node.rightParenthesis.offset)) {
+          List<FormalParameter> newParams = CompletionEngine_this._copyWithout(params, last);
+          CompletionEngine_this._analyzeNewParameterName(newParams, last.identifier, null);
+        } else {
+          Ident ident = CompletionEngine_this._createIdent(node);
+          CompletionEngine_this._analyzeTypeName(ident, ident);
+        }
+      } else {
+        Ident ident = CompletionEngine_this._createIdent(node);
+        CompletionEngine_this._analyzeTypeName(ident, ident);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitForStatement(ForStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.forKeyword)) {
+      CompletionEngine_this._pKeyword(node.forKeyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitIfStatement(IfStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.ifKeyword)) {
+      CompletionEngine_this._pKeyword(node.ifKeyword);
+    } else if (CompletionEngine_this._isCompletingKeyword(node.elseKeyword)) {
+      CompletionEngine_this._pKeyword(node.elseKeyword);
+    } else if (CompletionEngine_this._isCompletionBetween(node.condition.end, node.rightParenthesis.offset)) {
+      CompletionEngine_this._operatorAccess(node.condition, CompletionEngine_this._createIdent(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitImplementsClause(ImplementsClause node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    } else if (node.interfaces.isEmpty) {
+      // { X implements ! }
+      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+    } else {
+      // { X implements ! Y }
+      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.asToken)) {
+      CompletionEngine_this._pKeyword(node.asToken);
+    } else {
+      visitNamespaceDirective(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+      Ident ident = new Ident.con3(node, node.keyword);
+      CompletionEngine_this._analyzeLocalName(ident);
+    } else {
+      Ident ident = CompletionEngine_this._createIdent(node);
+      CompletionEngine_this._analyzeConstructorTypeName(ident);
+    }
+    return null;
+  }
+
+  @override
+  Object visitIsExpression(IsExpression node) {
+    Ident ident;
+    Token isToken = node.isOperator;
+    int isTokenEnd = isToken.end;
+    if (isTokenEnd == CompletionEngine_this._completionLocation()) {
+      Expression expression = node.expression;
+      int offset = isToken.offset;
+      // { target.is! } possible name completion, parsed as "target.{synthetic} is!"
+      if (expression is PrefixedIdentifier) {
+        PrefixedIdentifier prefIdent = expression;
+        if (prefIdent.identifier.isSynthetic) {
+          CompletionEngine_this._analyzePrefixedAccess(prefIdent.prefix, new Ident.con2(node, "is", offset));
+        } else {
+          CompletionEngine_this._pKeyword(isToken);
+        }
+        return null;
+      }
+      // { expr is! }
+      if (!CompletionEngine._isSyntheticIdentifier(expression)) {
+        CompletionEngine_this._pKeyword(node.isOperator);
+        return null;
+      }
+      // { is! } possible name completion
+      ident = new Ident.con2(node, "is", offset);
+    } else if (CompletionEngine_this._isCompletionAfter(isTokenEnd)) {
+      CompletionEngine_this._state._isDynamicAllowed = false;
+      CompletionEngine_this._state._isVoidAllowed = false;
+      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), null);
+      return null;
+    } else {
+      ident = CompletionEngine_this._createIdent(node);
+    }
+    CompletionEngine_this._analyzeLocalName(ident);
+    return null;
+  }
+
+  @override
+  Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    Token period = node.period;
+    if (period != null && CompletionEngine_this._isCompletionAfter(period.end)) {
+      // { x.!y() }
+      CompletionEngine_this._dispatchPrefixAnalysis2(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitNamespaceDirective(NamespaceDirective node) {
+    StringLiteral uri = node.uri;
+    if (uri != null && uri.isSynthetic && node.keyword.end <= CompletionEngine_this._context.selectionOffset) {
+      uri.accept(this);
+    }
+    return super.visitNamespaceDirective(node);
+  }
+
+  @override
+  Object visitPartOfDirective(PartOfDirective node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.ofToken)) {
+      CompletionEngine_this._pKeyword(node.ofToken);
+    } else {
+      visitDirective(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (CompletionEngine_this._isCompletionAfter(node.period.end)) {
+      if (CompletionEngine_this._isCompletionBefore(node.identifier.offset)) {
+        // { x.! } or { x.!  y } Note missing/implied semicolon before y; this looks like an
+        // obscure case but it occurs frequently when editing existing code.
+        CompletionEngine_this._dispatchPrefixAnalysis3(node, node.identifier);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    if (node.target != null && node.target.length == 0) {
+      return null;
+    }
+    Expression target = node.realTarget;
+    // The "1 + str.!.length" is parsed as "(1 + str).!.length",
+    // but actually user wants "1 + (str.!).length".
+    // So, if completion inside of period-period ".!." then it is not really a cascade completion.
+    Token operator = node.operator;
+    if (operator.type == TokenType.PERIOD_PERIOD) {
+      int completionLocation = CompletionEngine_this._completionLocation();
+      if (completionLocation > operator.offset && completionLocation < operator.end) {
+        while (target is BinaryExpression) {
+          target = (target as BinaryExpression).rightOperand;
+        }
+      }
+    }
+    // do prefixed completion
+    CompletionEngine_this._analyzePrefixedAccess(target, node.propertyName);
+    return null;
+  }
+
+  @override
+  Object visitReturnStatement(ReturnStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+      return null;
+    }
+    Expression expression = node.expression;
+    // return !
+    if (expression is SimpleIdentifier) {
+      SimpleIdentifier identifier = expression;
+      CompletionEngine_this._analyzeLocalName(identifier);
+      return null;
+    }
+    // return expression ! ;
+    Token semicolon = node.semicolon;
+    if (expression != null && semicolon != null && CompletionEngine_this._isCompletionBetween(expression.end, semicolon.offset)) {
+      CompletionEngine_this._operatorAccess(expression, CompletionEngine_this._createIdent(node));
+      return null;
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (node.keyword != null && CompletionEngine_this._isCompletionBefore(node.keyword.end)) {
+      // f() { g(var! z) }
+      Token token = node.keyword;
+      Ident ident = new Ident.con3(node, token);
+      CompletionEngine_this._analyzeTypeName(ident, ident);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    AstNode parent = node.parent;
+    if (parent != null) {
+      CompletionEngine_IdentifierCompleter visitor = new CompletionEngine_IdentifierCompleter(CompletionEngine_this, node);
+      return parent.accept(visitor);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+    AstNode parent = node.parent;
+    if (parent is Directive) {
+      CompletionEngine_StringCompleter visitor = new CompletionEngine_StringCompleter(CompletionEngine_this, node);
+      return parent.accept(visitor);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    CompletionEngine_this._analyzeSuperConstructorInvocation(node);
+    return null;
+  }
+
+  @override
+  Object visitSwitchMember(SwitchMember node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitTryStatement(TryStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.tryKeyword)) {
+      CompletionEngine_this._pKeyword(node.tryKeyword);
+    }
+    return null;
+  }
+
+  @override
+  Object visitTypeArgumentList(TypeArgumentList node) {
+    if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
+      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), null);
+    }
+    return null;
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    } else if (node.name.name.isEmpty && CompletionEngine_this._isCompletionBefore(node.keyword.offset)) {
+      // { < ! extends X> }
+      CompletionEngine_this._analyzeTypeName(node.name, CompletionEngine_this._typeDeclarationName(node));
+    }
+    // { <! X ! extends ! Y !> }
+    return null;
+  }
+
+  @override
+  Object visitTypeParameterList(TypeParameterList node) {
+    // { <X extends A,! B,! > }
+    if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
+      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    if (CompletionEngine_this._isCompletionAfter(node.equals.end)) {
+      // { var x =! ...}
+      CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclarationList(VariableDeclarationList node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+      CompletionEngine_this._analyzeTypeName(new Ident.con3(node, node.keyword), null);
+    }
+    return null;
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+      CompletionEngine_this._pKeyword(node.keyword);
+    } else if (CompletionEngine_this._isCompletionBetween(node.condition.end, node.rightParenthesis.offset)) {
+      CompletionEngine_this._operatorAccess(node.condition, CompletionEngine_this._createIdent(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitWithClause(WithClause node) {
+    if (CompletionEngine_this._isCompletingKeyword(node.withKeyword)) {
+      CompletionEngine_this._pKeyword(node.withKeyword);
+    } else if (node.mixinTypes.isEmpty) {
+      // { X with ! }
+      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+    } else {
+      // { X with ! Y }
+      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+    }
+    return null;
+  }
+}
+
+/**
+ * A TypeNameCompleter is used to classify the parent of a SimpleIdentifier after it has been
+ * identified as a TypeName by the IdentifierCompleter.
+ */
+class CompletionEngine_TypeNameCompleter extends CompletionEngine_AstNodeClassifier {
+  final CompletionEngine CompletionEngine_this;
+
+  final SimpleIdentifier _identifier;
+
+  final TypeName _typeName;
+
+  CompletionEngine_TypeNameCompleter(this.CompletionEngine_this, this._identifier, this._typeName);
+
+  @override
+  Object visitAsExpression(AsExpression node) {
+    if (identical(node.type, _typeName)) {
+      CompletionEngine_this._state._isDynamicAllowed = false;
+      CompletionEngine_this._state._isVoidAllowed = false;
+      CompletionEngine_this._analyzeTypeName(_identifier, null);
+    }
+    return null;
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    if (identical(node.exceptionType, _typeName)) {
+      CompletionEngine_this._analyzeTypeName(_identifier, null);
+    }
+    return null;
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+    return null;
+  }
+
+  @override
+  Object visitConstructorName(ConstructorName node) {
+    if (identical(_typeName, node.type)) {
+      if (node.period != null) {
+        if (CompletionEngine_this._isCompletionAfter(node.period.end)) {
+          // Is this branch reachable? Probably only in IdentifierCompleter.
+          "".toString();
+        } else {
+          // { new Cla!ss.cons() }
+          Element element = _identifier.bestElement;
+          if (element is ClassElement) {
+            CompletionEngine_this._namedConstructorReference(element, _identifier);
+          }
+        }
+      } else {
+        // { new ! } { new Na!me(); } { new js!on. }
+        CompletionEngine_this._analyzeConstructorTypeName(_identifier);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitExtendsClause(ExtendsClause node) {
+    CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+    return null;
+  }
+
+  @override
+  Object visitImplementsClause(ImplementsClause node) {
+    CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+    return null;
+  }
+
+  @override
+  Object visitIsExpression(IsExpression node) {
+    if (identical(_typeName, node.type)) {
+      Token isToken = node.isOperator;
+      if (CompletionEngine_this._completionLocation() == isToken.end) {
+        Expression expression = node.expression;
+        int offset = isToken.offset;
+        // { target.is! } possible name completion, parsed as "target.{synthetic} is!"
+        if (expression is PrefixedIdentifier) {
+          PrefixedIdentifier prefIdent = expression;
+          if (prefIdent.identifier.isSynthetic) {
+            CompletionEngine_this._analyzePrefixedAccess(prefIdent.prefix, new Ident.con2(node, "is", offset));
+          } else {
+            CompletionEngine_this._pKeyword(node.isOperator);
+          }
+          return null;
+        }
+        // { expr is! }
+        if (!CompletionEngine._isSyntheticIdentifier(expression)) {
+          CompletionEngine_this._pKeyword(node.isOperator);
+          return null;
+        }
+        // { is! } possible name completion
+        CompletionEngine_this._analyzeLocalName(new Ident.con2(node, "is", offset));
+      } else {
+        CompletionEngine_this._analyzeTypeName(node.type.name as SimpleIdentifier, null);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    if (identical(node.returnType, _typeName)) {
+      CompletionEngine_this._analyzeTypeName(_identifier, null);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    CompletionEngine_this._analyzeTypeName(_identifier, null);
+    return null;
+  }
+
+  @override
+  Object visitTypeArgumentList(TypeArgumentList node) {
+    if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
+      CompletionEngine_this._analyzeTypeName(_identifier, null);
+    }
+    return null;
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    if (identical(node.bound, _typeName)) {
+      // { X<A extends !Y> }
+      CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclarationList(VariableDeclarationList node) {
+    if (node.parent is Statement) {
+      CompletionEngine_this._analyzeLocalName(_identifier);
+    } else {
+      CompletionEngine_this._analyzeTypeName(_identifier, null);
+    }
+    return null;
+  }
+
+  @override
+  Object visitWithClause(WithClause node) {
+    CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+    return null;
+  }
+}
+
+/**
+ * The factory class used to create completion proposals.
+ */
+class CompletionFactory {
+  /**
+   * Create a completion proposal of the given kind.
+   */
+  CompletionProposal createCompletionProposal(ProposalKind kind, int insertionPoint) {
+    CompletionProposalImpl prop = new CompletionProposalImpl();
+    prop.setKind(kind);
+    prop.setLocation(insertionPoint);
+    return prop;
+  }
+}
+
+abstract class CompletionProposal {
+  static final int RELEVANCE_LOW = 0;
+
+  static final int RELEVANCE_DEFAULT = 10;
+
+  static final int RELEVANCE_HIGH = 20;
+
+  /**
+   * This character is used to specify location of the cursor after completion.
+   */
+  static final int CURSOR_MARKER = 0x2758;
+
+  void applyPartitionOffset(int partitionOffset);
+
+  String get completion;
+
+  String get declaringType;
+
+  Element get element;
+
+  ProposalKind get kind;
+
+  int get location;
+
+  String get parameterName;
+
+  List<String> get parameterNames;
+
+  String get parameterType;
+
+  List<String> get parameterTypes;
+
+  int get positionalParameterCount;
+
+  int get relevance;
+
+  int get replacementLength;
+
+  int get replacementLengthIdentifier;
+
+  String get returnType;
+
+  bool get hasNamed;
+
+  bool get hasPositional;
+
+  CompletionProposal incRelevance();
+
+  bool get isDeprecated;
+
+  bool get isPotentialMatch;
+
+  CompletionProposal setCompletion(String x);
+
+  CompletionProposal setDeclaringType(String name);
+
+  CompletionProposal setDeprecated(bool deprecated);
+
+  CompletionProposal setElement(Element element);
+
+  CompletionProposal setKind(ProposalKind x);
+
+  CompletionProposal setLocation(int x);
+
+  CompletionProposal setParameterName(String paramName);
+
+  CompletionProposal setParameterNames(List<String> paramNames);
+
+  CompletionProposal setParameterStyle(int count, bool named, bool positional);
+
+  CompletionProposal setParameterType(String paramType);
+
+  CompletionProposal setParameterTypes(List<String> paramTypes);
+
+  CompletionProposal setPotentialMatch(bool isPotentialMatch);
+
+  CompletionProposal setRelevance(int n);
+
+  CompletionProposal setReplacementLength(int x);
+
+  CompletionProposal setReplacementLengthIdentifier(int x);
+
+  CompletionProposal setReturnType(String name);
+}
+
+class CompletionProposalImpl implements CompletionProposal {
+  Element _element;
+
+  String _completion = "";
+
+  String _returnType = "";
+
+  String _declaringType = "";
+
+  List<String> _parameterNames = StringUtilities.EMPTY_ARRAY;
+
+  List<String> _parameterTypes = StringUtilities.EMPTY_ARRAY;
+
+  String _parameterName;
+
+  String _parameterType;
+
+  ProposalKind _kind = ProposalKind.NONE;
+
+  int _location = 0;
+
+  int _replacementLength = 0;
+
+  int _replacementLength2 = 0;
+
+  int _positionalParameterCount = 0;
+
+  bool _named = false;
+
+  bool _positional = false;
+
+  bool _deprecated = false;
+
+  bool _potential = false;
+
+  int _relevance = CompletionProposal.RELEVANCE_DEFAULT;
+
+  @override
+  void applyPartitionOffset(int partitionOffset) {
+    _location += partitionOffset;
+  }
+
+  @override
+  String get completion => _completion;
+
+  @override
+  String get declaringType => _declaringType;
+
+  @override
+  Element get element => _element;
+
+  @override
+  ProposalKind get kind => _kind;
+
+  @override
+  int get location => _location;
+
+  @override
+  String get parameterName => _parameterName;
+
+  @override
+  List<String> get parameterNames => _parameterNames;
+
+  @override
+  String get parameterType => _parameterType;
+
+  @override
+  List<String> get parameterTypes => _parameterTypes;
+
+  @override
+  int get positionalParameterCount => _positionalParameterCount;
+
+  @override
+  int get relevance => _relevance;
+
+  @override
+  int get replacementLength => _replacementLength;
+
+  @override
+  int get replacementLengthIdentifier => _replacementLength2;
+
+  @override
+  String get returnType => _returnType;
+
+  @override
+  bool get hasNamed => _named;
+
+  @override
+  bool get hasPositional => _positional;
+
+  @override
+  CompletionProposal incRelevance() {
+    _relevance++;
+    return this;
+  }
+
+  @override
+  bool get isDeprecated => _deprecated;
+
+  @override
+  bool get isPotentialMatch => _potential;
+
+  @override
+  CompletionProposal setCompletion(String x) {
+    _completion = x;
+    if (_replacementLength == 0) {
+      setReplacementLength(x.length);
+    }
+    return this;
+  }
+
+  @override
+  CompletionProposal setDeclaringType(String name) {
+    _declaringType = name;
+    return this;
+  }
+
+  @override
+  CompletionProposal setDeprecated(bool deprecated) {
+    this._deprecated = deprecated;
+    return this;
+  }
+
+  @override
+  CompletionProposal setElement(Element element) {
+    this._element = element;
+    return this;
+  }
+
+  @override
+  CompletionProposal setKind(ProposalKind x) {
+    _kind = x;
+    return this;
+  }
+
+  @override
+  CompletionProposal setLocation(int x) {
+    _location = x;
+    return this;
+  }
+
+  @override
+  CompletionProposal setParameterName(String parameterName) {
+    this._parameterName = parameterName;
+    return this;
+  }
+
+  @override
+  CompletionProposal setParameterNames(List<String> paramNames) {
+    _parameterNames = paramNames;
+    return this;
+  }
+
+  @override
+  CompletionProposal setParameterStyle(int count, bool named, bool positional) {
+    this._named = named;
+    this._positional = positional;
+    this._positionalParameterCount = count;
+    return this;
+  }
+
+  @override
+  CompletionProposal setParameterType(String parameterType) {
+    this._parameterType = parameterType;
+    return this;
+  }
+
+  @override
+  CompletionProposal setParameterTypes(List<String> paramTypes) {
+    _parameterTypes = paramTypes;
+    return this;
+  }
+
+  @override
+  CompletionProposal setPotentialMatch(bool isPotentialMatch) {
+    _potential = isPotentialMatch;
+    return this;
+  }
+
+  @override
+  CompletionProposal setRelevance(int n) {
+    _relevance = n;
+    return this;
+  }
+
+  @override
+  CompletionProposal setReplacementLength(int x) {
+    _replacementLength = x;
+    return this;
+  }
+
+  @override
+  CompletionProposal setReplacementLengthIdentifier(int x) {
+    _replacementLength2 = x;
+    return this;
+  }
+
+  @override
+  CompletionProposal setReturnType(String name) {
+    _returnType = name;
+    return this;
+  }
+}
+
+/**
+ * A pathway for reporting completion proposals back to the client.
+ */
+abstract class CompletionRequestor {
+  /**
+   * Record the given completion proposal for eventual presentation to the user.
+   */
+  accept(CompletionProposal proposal);
+
+  void beginReporting();
+
+  void endReporting();
+}
+
+/**
+ */
+class CompletionState {
+  bool _isForMixin = false;
+
+  bool _isVoidAllowed = false;
+
+  bool _isDynamicAllowed = false;
+
+  bool _isSourceDeclarationStatic = false;
+
+  bool _isThisAllowed = true;
+
+  bool _isVarAllowed = false;
+
+  bool _areLiteralsAllowed = false;
+
+  bool _areLiteralsProhibited = false;
+
+  bool _areOperatorsAllowed = false;
+
+  bool _areStaticReferencesProhibited = false;
+
+  bool _areInstanceReferencesProhibited = false;
+
+  bool _areUndefinedTypesProhibited = false;
+
+  bool _isCompileTimeConstantRequired = false;
+
+  bool _isOptionalArgumentRequired = false;
+
+  bool _areMethodsProhibited = false;
+
+  bool _areClassesRequired = false;
+
+  ParameterElement _targetParameter;
+
+  void mustBeInstantiableType() {
+    _areClassesRequired = true;
+    _prohibitsLiterals();
+  }
+
+  void _includesLiterals() {
+    if (!_areLiteralsProhibited) {
+      _areLiteralsAllowed = true;
+    }
+  }
+
+  void _includesOperators() {
+    _areOperatorsAllowed = true;
+  }
+
+  void _includesUndefinedDeclarationTypes() {
+    if (!_areUndefinedTypesProhibited) {
+      _isVoidAllowed = true;
+      _isDynamicAllowed = true;
+    }
+  }
+
+  void _includesUndefinedTypes() {
+    _isVarAllowed = true;
+    _isDynamicAllowed = true;
+  }
+
+  void _mustBeMixin() {
+    _isForMixin = true;
+  }
+
+  void _prohibitsInstanceReferences() {
+    _areInstanceReferencesProhibited = true;
+  }
+
+  void _prohibitsLiterals() {
+    _areLiteralsAllowed = false;
+    _areLiteralsProhibited = true;
+  }
+
+  void _prohibitsStaticReferences() {
+    _areStaticReferencesProhibited = true;
+  }
+
+  void _prohibitThis() {
+    _isThisAllowed = false;
+  }
+
+  void _prohibitsUndefinedTypes() {
+    _areUndefinedTypesProhibited = true;
+  }
+
+  void _requiresConst(bool isConst) {
+    _isCompileTimeConstantRequired = isConst;
+  }
+
+  void _requiresOperators() {
+    _includesOperators();
+    _areMethodsProhibited = true;
+  }
+
+  void _requiresOptionalArgument() {
+    _isOptionalArgumentRequired = true;
+    _prohibitsLiterals();
+  }
+
+  void set context(AstNode base) {
+    base.accept(new ContextAnalyzer(this, base));
+  }
+
+  void _sourceDeclarationIsStatic(bool state) {
+    _isSourceDeclarationStatic = state;
+    if (state) {
+      if (!_areStaticReferencesProhibited) {
+        _prohibitsInstanceReferences();
+      }
+    }
+  }
+}
+
+/**
+ */
+class ContextAnalyzer extends GeneralizingAstVisitor<Object> {
+  final CompletionState _state;
+
+  final AstNode _completionNode;
+
+  AstNode _child;
+
+  bool _inExpression = false;
+
+  bool _inIdentifier = false;
+
+  bool _inTypeName = false;
+
+  bool _maybeInvocationArgument = true;
+
+  ContextAnalyzer(this._state, this._completionNode);
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    _state._requiresConst(true);
+    return super.visitAnnotation(node);
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    if (identical(node.exceptionType, _child)) {
+      _state._prohibitsLiterals();
+    }
+    return null;
+  }
+
+  @override
+  Object visitCompilationUnitMember(CompilationUnitMember node) {
+    if (node is! ClassDeclaration) {
+      _state._prohibitThis();
+    }
+    return super.visitCompilationUnitMember(node);
+  }
+
+  @override
+  Object visitConstructorInitializer(ConstructorInitializer node) {
+    _state._prohibitThis();
+    return super.visitConstructorInitializer(node);
+  }
+
+  @override
+  Object visitDirective(Directive node) {
+    _state._prohibitsLiterals();
+    return super.visitDirective(node);
+  }
+
+  @override
+  Object visitDoStatement(DoStatement node) {
+    if (identical(_child, node.condition)) {
+      _state._includesLiterals();
+    }
+    return super.visitDoStatement(node);
+  }
+
+  @override
+  Object visitExpression(Expression node) {
+    _inExpression = true;
+    _state._includesLiterals();
+    _mayBeSetParameterElement(node);
+    return super.visitExpression(node);
+  }
+
+  @override
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    _state._prohibitThis();
+    return super.visitFieldDeclaration(node);
+  }
+
+  @override
+  Object visitForEachStatement(ForEachStatement node) {
+    if (identical(_child, node.iterator)) {
+      _state._includesLiterals();
+    }
+    return super.visitForEachStatement(node);
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is Declaration) {
+      // Function expressions that are part of a declaration are not to be treated as expressions.
+      return visitNode(node);
+    } else {
+      return visitExpression(node);
+    }
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    if (_inTypeName || node.returnType == null) {
+      // This may be an incomplete class type alias
+      _state._includesUndefinedDeclarationTypes();
+    }
+    return super.visitFunctionTypeAlias(node);
+  }
+
+  @override
+  Object visitIdentifier(Identifier node) {
+    _mayBeSetParameterElement(node);
+    // Identifiers cannot safely be generalized to expressions, so just walk up one level.
+    // LibraryIdentifier is never an expression. PrefixedIdentifier may be an expression, but
+    // not in a catch-clause or a declaration. SimpleIdentifier may be an expression, but not
+    // in a constructor name, label, or where PrefixedIdentifier is not.
+    return visitNode(node);
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _state._requiresConst(node.isConst);
+    if (identical(_completionNode.parent.parent, _child)) {
+      _state.mustBeInstantiableType();
+    }
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    _state._sourceDeclarationIsStatic(node.isStatic);
+    if (identical(_child, node.returnType)) {
+      _state._includesUndefinedDeclarationTypes();
+    }
+    if (node.isStatic) {
+      _state._prohibitThis();
+    }
+    return super.visitMethodDeclaration(node);
+  }
+
+  @override
+  Object visitNode(AstNode node) {
+    // Walk UP the tree, not down.
+    AstNode parent = node.parent;
+    _updateIfShouldGetTargetParameter(node, parent);
+    if (parent != null) {
+      _child = node;
+      parent.accept(this);
+    }
+    return null;
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (identical(node, _completionNode) || identical(node.identifier, _completionNode)) {
+      SimpleIdentifier prefix = node.prefix;
+      if (_isClassLiteral(prefix)) {
+        _state._prohibitsInstanceReferences();
+      } else {
+        _state._prohibitsStaticReferences();
+      }
+    }
+    return super.visitPrefixedIdentifier(node);
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    if (identical(node, _completionNode) || identical(node.propertyName, _completionNode)) {
+      Expression target = node.realTarget;
+      if (_isClassLiteral(target)) {
+        _state._prohibitsInstanceReferences();
+      } else {
+        _state._prohibitsStaticReferences();
+      }
+    }
+    return super.visitPropertyAccess(node);
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _state._includesUndefinedTypes();
+    return super.visitSimpleFormalParameter(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    _inIdentifier = true;
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    if (identical(_child, node.expression)) {
+      _state._includesLiterals();
+    }
+    return super.visitSwitchStatement(node);
+  }
+
+  @override
+  Object visitTypeArgumentList(TypeArgumentList node) {
+    _state._prohibitsUndefinedTypes();
+    return super.visitTypeArgumentList(node);
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    _inTypeName = true;
+    return super.visitTypeName(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    if (identical(node.name, _completionNode)) {
+      _state._prohibitsLiterals();
+    }
+    return super.visitVariableDeclaration(node);
+  }
+
+  @override
+  Object visitVariableDeclarationList(VariableDeclarationList node) {
+    _state._includesUndefinedDeclarationTypes();
+    return super.visitVariableDeclarationList(node);
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    if (identical(_child, node.condition)) {
+      _state._includesLiterals();
+    }
+    return super.visitWhileStatement(node);
+  }
+
+  @override
+  Object visitWithClause(WithClause node) {
+    _state._mustBeMixin();
+    return super.visitWithClause(node);
+  }
+
+  bool _isClassLiteral(Expression expression) => expression is Identifier && expression.staticElement is ClassElement;
+
+  void _mayBeSetParameterElement(Expression node) {
+    if (!_maybeInvocationArgument) {
+      return;
+    }
+    if (node.parent is ArgumentList) {
+      if (_state._targetParameter == null) {
+        _state._targetParameter = node.bestParameterElement;
+      }
+    }
+  }
+
+  void _updateIfShouldGetTargetParameter(AstNode node, AstNode parent) {
+    if (!_maybeInvocationArgument) {
+      return;
+    }
+    // prefix.node
+    if (parent is PrefixedIdentifier) {
+      if (identical(parent.identifier, node)) {
+        return;
+      }
+    }
+    // something unknown
+    _maybeInvocationArgument = false;
+  }
+}
+
+class Filter {
+  String _prefix;
+
+  String _originalPrefix;
+
+  RegExp _pattern;
+
+  Filter.con1(SimpleIdentifier ident, int loc) : this.con2(ident.name, ident.offset, loc);
+
+  Filter.con2(String name, int pos, int loc) {
+    int len = loc - pos;
+    if (len > 0) {
+      if (len <= name.length) {
+        _prefix = name.substring(0, len);
+      } else {
+        _prefix = name;
+      }
+    } else {
+      _prefix = "";
+    }
+    _originalPrefix = _prefix;
+    _prefix = _prefix.toLowerCase();
+  }
+
+  /**
+   * @return `true` if the given name starts with the same prefix as used for filter.
+   */
+  bool _isSameCasePrefix(String name) => name.startsWith(_originalPrefix);
+
+  String _makePattern() {
+    // TODO(scheglov) translate it
+    return null;
+  }
+
+  bool _match(Element elem) => _match2(elem.displayName);
+
+  bool _match2(String name) {
+    // Return true if the filter passes.
+    if (name.toLowerCase().startsWith(_prefix)) {
+      return true;
+    }
+    return _matchPattern(name);
+  }
+
+  void _removeNotMatching(List<Element> elements) {
+    for (JavaIterator<Element> I = new JavaIterator(elements); I.hasNext;) {
+      Element element = I.next();
+      if (!_match(element)) {
+        I.remove();
+      }
+    }
+  }
+
+  bool _matchPattern(String name) {
+    // TODO(scheglov) translate it
+    return false;
+  }
+}
+
+class GeneralizingAstVisitor_CompletionEngine_copyWithout extends GeneralizingAstVisitor<Object> {
+  AstNode deletion;
+
+  List<FormalParameter> newList;
+
+  GeneralizingAstVisitor_CompletionEngine_copyWithout(this.deletion, this.newList) : super();
+
+  @override
+  Object visitNode(AstNode node) {
+    if (!identical(node, deletion)) {
+      newList.add(node as FormalParameter);
+    }
+    return null;
+  }
+}
+
+/**
+ * An [Ident] is a wrapper for a String that provides type equivalence with SimpleIdentifier.
+ */
+class Ident extends EphemeralIdentifier {
+  String _name;
+
+  Ident.con1(AstNode parent, int offset) : super(parent, offset);
+
+  Ident.con2(AstNode parent, String name, int offset) : super(parent, offset) {
+    this._name = name;
+  }
+
+  Ident.con3(AstNode parent, Token name) : super(parent, name.offset) {
+    this._name = name.lexeme;
+  }
+
+  @override
+  String get name {
+    if (_name != null) {
+      return _name;
+    }
+    String n = super.name;
+    if (n != null) {
+      return n;
+    }
+    return "";
+  }
+}
+
+class ProposalCollector implements CompletionRequestor {
+  final CompletionRequestor requestor;
+
+  List<CompletionProposal> _proposals;
+
+  ProposalCollector(this.requestor) {
+    this._proposals = new List<CompletionProposal>();
+  }
+
+  @override
+  accept(CompletionProposal proposal) {
+    _proposals.add(proposal);
+  }
+
+  @override
+  void beginReporting() {
+    requestor.beginReporting();
+  }
+
+  @override
+  void endReporting() {
+    requestor.endReporting();
+  }
+
+  List<CompletionProposal> get proposals => _proposals;
+}
+
+/**
+ * The various kinds of completion proposals. Each specifies the kind of completion to be created,
+ * corresponding to different syntactical elements.
+ */
+class ProposalKind extends Enum<ProposalKind> {
+  static const ProposalKind NONE = const ProposalKind('NONE', 0);
+
+  static const ProposalKind CLASS = const ProposalKind('CLASS', 1);
+
+  static const ProposalKind CLASS_ALIAS = const ProposalKind('CLASS_ALIAS', 2);
+
+  static const ProposalKind CONSTRUCTOR = const ProposalKind('CONSTRUCTOR', 3);
+
+  static const ProposalKind FIELD = const ProposalKind('FIELD', 4);
+
+  static const ProposalKind FUNCTION = const ProposalKind('FUNCTION', 5);
+
+  static const ProposalKind FUNCTION_ALIAS = const ProposalKind('FUNCTION_ALIAS', 6);
+
+  static const ProposalKind GETTER = const ProposalKind('GETTER', 7);
+
+  static const ProposalKind IMPORT = const ProposalKind('IMPORT', 8);
+
+  static const ProposalKind LIBRARY_PREFIX = const ProposalKind('LIBRARY_PREFIX', 9);
+
+  static const ProposalKind METHOD = const ProposalKind('METHOD', 10);
+
+  static const ProposalKind METHOD_NAME = const ProposalKind('METHOD_NAME', 11);
+
+  static const ProposalKind PARAMETER = const ProposalKind('PARAMETER', 12);
+
+  static const ProposalKind SETTER = const ProposalKind('SETTER', 13);
+
+  static const ProposalKind VARIABLE = const ProposalKind('VARIABLE', 14);
+
+  static const ProposalKind TYPE_PARAMETER = const ProposalKind('TYPE_PARAMETER', 15);
+
+  static const ProposalKind ARGUMENT_LIST = const ProposalKind('ARGUMENT_LIST', 16);
+
+  static const ProposalKind OPTIONAL_ARGUMENT = const ProposalKind('OPTIONAL_ARGUMENT', 17);
+
+  static const ProposalKind NAMED_ARGUMENT = const ProposalKind('NAMED_ARGUMENT', 18);
+
+  static const List<ProposalKind> values = const [
+      NONE,
+      CLASS,
+      CLASS_ALIAS,
+      CONSTRUCTOR,
+      FIELD,
+      FUNCTION,
+      FUNCTION_ALIAS,
+      GETTER,
+      IMPORT,
+      LIBRARY_PREFIX,
+      METHOD,
+      METHOD_NAME,
+      PARAMETER,
+      SETTER,
+      VARIABLE,
+      TYPE_PARAMETER,
+      ARGUMENT_LIST,
+      OPTIONAL_ARGUMENT,
+      NAMED_ARGUMENT];
+
+  const ProposalKind(String name, int ordinal) : super(name, ordinal);
+}
+
+class SearchFilter_CompletionEngine_allSubtypes implements SearchFilter {
+  ClassElement classElement;
+
+  SearchFilter_CompletionEngine_allSubtypes(this.classElement);
+
+  @override
+  bool passes(SearchMatch match) {
+    Element element = match.element;
+    if (element is ClassElement) {
+      ClassElement clElem = element;
+      while (clElem != null) {
+        InterfaceType ifType = clElem.supertype;
+        if (ifType == null) {
+          return false;
+        }
+        clElem = ifType.element;
+        if (identical(clElem, classElement)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+}
+
+class TopLevelNamesKind extends Enum<TopLevelNamesKind> {
+  static const TopLevelNamesKind DECLARED_AND_IMPORTS = const TopLevelNamesKind('DECLARED_AND_IMPORTS', 0);
+
+  static const TopLevelNamesKind DECLARED_AND_EXPORTS = const TopLevelNamesKind('DECLARED_AND_EXPORTS', 1);
+
+  static const List<TopLevelNamesKind> values = const [DECLARED_AND_IMPORTS, DECLARED_AND_EXPORTS];
+
+  const TopLevelNamesKind(String name, int ordinal) : super(name, ordinal);
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/lib/src/generated/proposal.dart b/pkg/analysis_services/lib/src/generated/proposal.dart
index ef3d9d8..4e7f842 100644
--- a/pkg/analysis_services/lib/src/generated/proposal.dart
+++ b/pkg/analysis_services/lib/src/generated/proposal.dart
@@ -228,6 +228,11 @@
  * Proposal for some change.
  */
 class CorrectionProposal {
+  /**
+   * An empty array of [CorrectionProposal]s.
+   */
+  static List<CorrectionProposal> EMPTY_ARRAY = new List<CorrectionProposal>(0);
+
   final CorrectionKind kind;
 
   String _name;
diff --git a/pkg/analysis_services/lib/src/generated/stubs.dart b/pkg/analysis_services/lib/src/generated/stubs.dart
index c991206..7293cad 100644
--- a/pkg/analysis_services/lib/src/generated/stubs.dart
+++ b/pkg/analysis_services/lib/src/generated/stubs.dart
@@ -12,6 +12,11 @@
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/source.dart';
 
+
+abstract class SearchFilter {
+  bool passes(SearchMatch match);
+}
+
 class SearchMatch {
   final Element element = null;
   final SourceRange sourceRange = null;
diff --git a/pkg/analysis_services/lib/src/generated/util.dart b/pkg/analysis_services/lib/src/generated/util.dart
index 49c5394..fdfb01b 100644
--- a/pkg/analysis_services/lib/src/generated/util.dart
+++ b/pkg/analysis_services/lib/src/generated/util.dart
@@ -1256,7 +1256,7 @@
    */
   int getLineNext(int index) {
     int length = _buffer.length;
-    // skip whitespace characters
+    // skip to the end of the line
     while (index < length) {
       int c = _buffer.codeUnitAt(index);
       if (c == 0xD || c == 0xA) {
@@ -1444,7 +1444,7 @@
     if (expression == null) {
       return null;
     }
-    DartType type = expression.staticType;
+    DartType type = expression.bestType;
     String typeSource = getTypeSource2(type);
     if ("dynamic" == typeSource) {
       return null;
diff --git a/pkg/analysis_services/pubspec.yaml b/pkg/analysis_services/pubspec.yaml
index 5321e84..960ff75 100644
--- a/pkg/analysis_services/pubspec.yaml
+++ b/pkg/analysis_services/pubspec.yaml
@@ -6,6 +6,6 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: 0.14.2
+  analyzer: 0.15.1
 dev_dependencies:
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 4459077..90db683 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -378,69 +378,6 @@
 }
 
 /**
- * Instances of the class `ArgumentDefinitionTest` represent an argument definition test.
- *
- * <pre>
- * argumentDefinitionTest ::=
- *     '?' [SimpleIdentifier]
- * </pre>
- */
-class ArgumentDefinitionTest extends Expression {
-  /**
-   * The token representing the question mark.
-   */
-  Token question;
-
-  /**
-   * The identifier representing the argument being tested.
-   */
-  SimpleIdentifier _identifier;
-
-  /**
-   * Initialize a newly created argument definition test.
-   *
-   * @param question the token representing the question mark
-   * @param identifier the identifier representing the argument being tested
-   */
-  ArgumentDefinitionTest(this.question, SimpleIdentifier identifier) {
-    this._identifier = becomeParentOf(identifier);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitArgumentDefinitionTest(this);
-
-  @override
-  Token get beginToken => question;
-
-  @override
-  Token get endToken => _identifier.endToken;
-
-  /**
-   * Return the identifier representing the argument being tested.
-   *
-   * @return the identifier representing the argument being tested
-   */
-  SimpleIdentifier get identifier => _identifier;
-
-  @override
-  int get precedence => 15;
-
-  /**
-   * Set the identifier representing the argument being tested to the given identifier.
-   *
-   * @param identifier the identifier representing the argument being tested
-   */
-  void set identifier(SimpleIdentifier identifier) {
-    this._identifier = becomeParentOf(identifier);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(_identifier, visitor);
-  }
-}
-
-/**
  * Instances of the class `ArgumentList` represent a list of arguments in the invocation of a
  * executable element: a function, method, or constructor.
  *
@@ -1019,9 +956,6 @@
   Annotation visitAnnotation(Annotation node) => new Annotation(node.atSign, _cloneNode(node.name), node.period, _cloneNode(node.constructorName), _cloneNode(node.arguments));
 
   @override
-  ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) => new ArgumentDefinitionTest(node.question, _cloneNode(node.identifier));
-
-  @override
   ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(node.leftParenthesis, _cloneNodeList(node.arguments), node.rightParenthesis);
 
   @override
@@ -1417,12 +1351,6 @@
   }
 
   @override
-  bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    ArgumentDefinitionTest other = this._other as ArgumentDefinitionTest;
-    return _isEqualTokens(node.question, other.question) && _isEqualNodes(node.identifier, other.identifier);
-  }
-
-  @override
   bool visitArgumentList(ArgumentList node) {
     ArgumentList other = this._other as ArgumentList;
     return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.arguments, other.arguments) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
@@ -2353,8 +2281,6 @@
 
   R visitAnnotation(Annotation node);
 
-  R visitArgumentDefinitionTest(ArgumentDefinitionTest node);
-
   R visitArgumentList(ArgumentList node);
 
   R visitAsExpression(AsExpression node);
@@ -5489,6 +5415,37 @@
 }
 
 /**
+ * This recursive Ast visitor is used to run over [Expression]s to determine if the expression
+ * is composed by at least one deferred [PrefixedIdentifier].
+ *
+ * @see PrefixedIdentifier#isDeferred()
+ */
+class DeferredLibraryReferenceDetector extends RecursiveAstVisitor<Object> {
+  bool _result = false;
+
+  /**
+   * Return the result, `true` if the visitor found a [PrefixedIdentifier] that returned
+   * `true` to the [PrefixedIdentifier#isDeferred] query.
+   *
+   * @return `true` if the visitor found a [PrefixedIdentifier] that returned
+   *         `true` to the [PrefixedIdentifier#isDeferred] query
+   */
+  bool get result => _result;
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    // If result is already true, skip.
+    if (!_result) {
+      // Set result to true if isDeferred() is true
+      if (node.isDeferred) {
+        _result = true;
+      }
+    }
+    return null;
+  }
+}
+
+/**
  * The abstract class `Directive` defines the behavior common to nodes that represent a
  * directive.
  *
@@ -5754,6 +5711,9 @@
    * @return the associated element, or `null` if none is found
    */
   static Element locateWithOffset(AstNode node, int offset) {
+    if (node == null) {
+      return null;
+    }
     // try to get Element from node
     {
       Element nodeElement = locate(node);
@@ -7882,9 +7842,6 @@
   R visitAnnotation(Annotation node) => visitNode(node);
 
   @override
-  R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => visitExpression(node);
-
-  @override
   R visitArgumentList(ArgumentList node) => visitNode(node);
 
   @override
@@ -8754,14 +8711,6 @@
   }
 
   @override
-  ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    ArgumentDefinitionTest copy = new ArgumentDefinitionTest(_mapToken(node.question), _cloneNode(node.identifier));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
   ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(_mapToken(node.leftParenthesis), _cloneNodeList(node.arguments), _mapToken(node.rightParenthesis));
 
   @override
@@ -12473,12 +12422,6 @@
   }
 
   @override
-  R visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
   R visitArgumentList(ArgumentList node) {
     node.visitChildren(this);
     return null;
@@ -13562,9 +13505,6 @@
   R visitAnnotation(Annotation node) => null;
 
   @override
-  R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => null;
-
-  @override
   R visitArgumentList(ArgumentList node) => null;
 
   @override
@@ -15055,13 +14995,6 @@
   }
 
   @override
-  Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    _writer.print('?');
-    _visitNode(node.identifier);
-    return null;
-  }
-
-  @override
   Object visitArgumentList(ArgumentList node) {
     _writer.print('(');
     _visitNodeListWithSeparator(node.arguments, ", ");
@@ -15503,6 +15436,9 @@
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("import ");
     _visitNode(node.uri);
+    if (node.deferredToken != null) {
+      _writer.print(" deferred");
+    }
     _visitNodeWithPrefix(" as ", node.prefix);
     _visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
     _writer.print(';');
@@ -16712,9 +16648,6 @@
   R visitAnnotation(Annotation node) => visitNode(node);
 
   @override
-  R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => visitNode(node);
-
-  @override
   R visitArgumentList(ArgumentList node) => visitNode(node);
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index cab0aae..9be227d 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -2718,6 +2718,15 @@
   Element get enclosingElement;
 
   /**
+   * Return a display name for the given element that includes the path to the compilation unit in
+   * which the type is defined.
+   *
+   * @param type the type for which an extended display name is to be returned
+   * @return a display name that can help distinguish between two types with the same name
+   */
+  String get extendedDisplayName;
+
+  /**
    * Return the kind of element that this is.
    *
    * @return the kind of this element
@@ -3095,6 +3104,16 @@
   Element get enclosingElement => _enclosingElement;
 
   @override
+  String get extendedDisplayName {
+    String displayName = this.displayName;
+    Source source = this.source;
+    if (source != null) {
+      return "${displayName} (${source.fullName})";
+    }
+    return displayName;
+  }
+
+  @override
   LibraryElement get library => getAncestor((element) => element is LibraryElement);
 
   @override
@@ -4446,6 +4465,18 @@
  */
 abstract class FunctionElement implements ExecutableElement, LocalElement {
   /**
+   * The name of the method that can be implemented by a class to allow its instances to be invoked
+   * as if they were a function.
+   */
+  static final String CALL_METHOD_NAME = "call";
+
+  /**
+   * The name of the method that will be invoked if an attempt is made to invoke an undefined method
+   * on an object.
+   */
+  static final String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
+
+  /**
    * The name of the synthetic function defined for libraries that are deferred.
    */
   static final String LOAD_LIBRARY_NAME = "loadLibrary";
@@ -5026,7 +5057,11 @@
     List<DartType> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
     for (ParameterElement parameter in parameters) {
       if (parameter.parameterKind == ParameterKind.NAMED) {
-        namedParameterTypes[parameter.name] = parameter.type.substitute2(typeArguments, typeParameters);
+        DartType type = parameter.type;
+        if (typeArguments.length != 0 && typeArguments.length == typeParameters.length) {
+          type = type.substitute2(typeArguments, typeParameters);
+        }
+        namedParameterTypes[parameter.name] = type;
       }
     }
     return namedParameterTypes;
@@ -5042,7 +5077,11 @@
     List<DartType> types = new List<DartType>();
     for (ParameterElement parameter in parameters) {
       if (parameter.parameterKind == ParameterKind.REQUIRED) {
-        types.add(parameter.type.substitute2(typeArguments, typeParameters));
+        DartType type = parameter.type;
+        if (typeArguments.length != 0 && typeArguments.length == typeParameters.length) {
+          type = type.substitute2(typeArguments, typeParameters);
+        }
+        types.add(type);
       }
     }
     return new List.from(types);
@@ -5058,7 +5097,11 @@
     List<DartType> types = new List<DartType>();
     for (ParameterElement parameter in parameters) {
       if (parameter.parameterKind == ParameterKind.POSITIONAL) {
-        types.add(parameter.type.substitute2(typeArguments, typeParameters));
+        DartType type = parameter.type;
+        if (typeArguments.length != 0 && typeArguments.length == typeParameters.length) {
+          type = type.substitute2(typeArguments, typeParameters);
+        }
+        types.add(type);
       }
     }
     return new List.from(types);
@@ -5088,6 +5131,11 @@
       // understand why it is and fix it.
       return DynamicTypeImpl.instance;
     }
+    // If there are no arguments to substitute, or if the arguments size doesn't match the parameter
+    // size, return the base return type.
+    if (typeArguments.length == 0 || typeArguments.length != typeParameters.length) {
+      return baseReturnType;
+    }
     return baseReturnType.substitute2(typeArguments, TypeParameterTypeImpl.getTypes(typeParameters));
   }
 
@@ -6627,7 +6675,11 @@
     if (supertype == null) {
       return null;
     }
-    return supertype.substitute2(typeArguments, classElement.type.typeArguments);
+    List<DartType> typeParameters = classElement.type.typeArguments;
+    if (typeArguments.length == 0 || typeArguments.length != typeParameters.length) {
+      return supertype;
+    }
+    return supertype.substitute2(typeArguments, typeParameters);
   }
 
   @override
@@ -7913,6 +7965,9 @@
   String get displayName => _baseElement.displayName;
 
   @override
+  String get extendedDisplayName => _baseElement.extendedDisplayName;
+
+  @override
   ElementKind get kind => _baseElement.kind;
 
   @override
@@ -8433,6 +8488,9 @@
   Element get enclosingElement => null;
 
   @override
+  String get extendedDisplayName => displayName;
+
+  @override
   ElementKind get kind => ElementKind.ERROR;
 
   @override
@@ -10401,6 +10459,11 @@
   static List<TypeParameterType> EMPTY_ARRAY = new List<TypeParameterType>(0);
 
   /**
+   * The name of the type Type from dart.core.
+   */
+  static String _TYPE_CLASS_NAME = "Type";
+
+  /**
    * Return an array containing the type parameter types defined by the given array of type
    * parameter elements.
    *
@@ -10479,12 +10542,22 @@
   bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => isMoreSpecificThan2(type, true, new Set<TypeImpl_TypePair>());
 
   bool _isMoreSpecificThan(DartType s, Set<DartType> visitedTypes, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+    //
+    // If s is of type Type from dart.core, return true
+    //
+    Element sElement = s.element;
+    LibraryElement sLibrary = sElement != null ? sElement.library : null;
+    if (sLibrary != null && sLibrary.isDartCore && s.name == _TYPE_CLASS_NAME) {
+      return true;
+    }
+    //
     // T is a type parameter and S is the upper bound of T.
     //
     DartType bound = element.bound;
     if (s == bound) {
       return true;
     }
+    //
     // T is a type parameter and S is Object.
     //
     if (s.isObject) {
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 3a8bdeb..9289e9a 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -74,6 +74,28 @@
   }
 
   /**
+   * Return the number of entries in this cache that have an AST associated with them.
+   *
+   * @return the number of entries in this cache that have an AST associated with them
+   */
+  int get astSize => _partitions[_partitions.length - 1].astSize;
+
+  /**
+   * Return information about each of the partitions in this cache.
+   *
+   * @return information about each of the partitions in this cache
+   */
+  List<AnalysisContextStatistics_PartitionData> get partitionData {
+    int count = _partitions.length;
+    List<AnalysisContextStatistics_PartitionData> data = new List<AnalysisContextStatistics_PartitionData>(count);
+    for (int i = 0; i < count; i++) {
+      CachePartition partition = _partitions[i];
+      data[i] = new AnalysisContextStatisticsImpl_PartitionDataImpl(partition.astSize, partition.map.length);
+    }
+    return data;
+  }
+
+  /**
    * Return an iterator returning all of the map entries mapping sources to cache entries.
    *
    * @return an iterator returning all of the map entries mapping sources to cache entries
@@ -165,155 +187,6 @@
 }
 
 /**
- * Container with statistics about the [AnalysisContext].
- */
-abstract class AnalysisContentStatistics {
-  /**
-   * Return the statistics for each kind of cached data.
-   *
-   * @return the statistics for each kind of cached data
-   */
-  List<AnalysisContentStatistics_CacheRow> get cacheRows;
-
-  /**
-   * Return the exceptions that caused some entries to have a state of [CacheState#ERROR].
-   *
-   * @return the exceptions that caused some entries to have a state of [CacheState#ERROR]
-   */
-  List<AnalysisException> get exceptions;
-
-  /**
-   * Return an array containing all of the sources in the cache.
-   *
-   * @return an array containing all of the sources in the cache
-   */
-  List<Source> get sources;
-}
-
-/**
- * Implementation of the [AnalysisContentStatistics].
- */
-class AnalysisContentStatisticsImpl implements AnalysisContentStatistics {
-  Map<String, AnalysisContentStatistics_CacheRow> _dataMap = new Map<String, AnalysisContentStatistics_CacheRow>();
-
-  List<Source> _sources = new List<Source>();
-
-  Set<AnalysisException> _exceptions = new Set<AnalysisException>();
-
-  void addSource(Source source) {
-    _sources.add(source);
-  }
-
-  @override
-  List<AnalysisContentStatistics_CacheRow> get cacheRows {
-    Iterable<AnalysisContentStatistics_CacheRow> items = _dataMap.values;
-    return new List.from(items);
-  }
-
-  @override
-  List<AnalysisException> get exceptions => new List.from(_exceptions);
-
-  @override
-  List<Source> get sources => new List.from(_sources);
-
-  void putCacheItem(SourceEntry dartEntry, DataDescriptor descriptor) {
-    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
-  }
-
-  void putCacheItemInLibrary(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
-    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getStateInLibrary(descriptor, librarySource));
-  }
-
-  void _internalPutCacheItem(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
-    String rowName = rowDesc.toString();
-    AnalysisContentStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContentStatisticsImpl_CacheRowImpl;
-    if (row == null) {
-      row = new AnalysisContentStatisticsImpl_CacheRowImpl(rowName);
-      _dataMap[rowName] = row;
-    }
-    row._incState(state);
-    if (state == CacheState.ERROR) {
-      AnalysisException exception = dartEntry.exception;
-      if (exception != null) {
-        _exceptions.add(exception);
-      }
-    }
-  }
-}
-
-class AnalysisContentStatisticsImpl_CacheRowImpl implements AnalysisContentStatistics_CacheRow {
-  final String name;
-
-  int _errorCount = 0;
-
-  int _flushedCount = 0;
-
-  int _inProcessCount = 0;
-
-  int _invalidCount = 0;
-
-  int _validCount = 0;
-
-  AnalysisContentStatisticsImpl_CacheRowImpl(this.name);
-
-  @override
-  bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && obj.name == name;
-
-  @override
-  int get errorCount => _errorCount;
-
-  @override
-  int get flushedCount => _flushedCount;
-
-  @override
-  int get inProcessCount => _inProcessCount;
-
-  @override
-  int get invalidCount => _invalidCount;
-
-  @override
-  int get validCount => _validCount;
-
-  @override
-  int get hashCode => name.hashCode;
-
-  void _incState(CacheState state) {
-    if (state == CacheState.ERROR) {
-      _errorCount++;
-    }
-    if (state == CacheState.FLUSHED) {
-      _flushedCount++;
-    }
-    if (state == CacheState.IN_PROCESS) {
-      _inProcessCount++;
-    }
-    if (state == CacheState.INVALID) {
-      _invalidCount++;
-    }
-    if (state == CacheState.VALID) {
-      _validCount++;
-    }
-  }
-}
-
-/**
- * Information about single item in the cache.
- */
-abstract class AnalysisContentStatistics_CacheRow {
-  int get errorCount;
-
-  int get flushedCount;
-
-  int get inProcessCount;
-
-  int get invalidCount;
-
-  String get name;
-
-  int get validCount;
-}
-
-/**
  * The interface `AnalysisContext` defines the behavior of objects that represent a context in
  * which a single analysis can be performed and incrementally maintained. The context includes such
  * information as the version of the SDK being analyzed against as well as the package-root used to
@@ -349,6 +222,14 @@
  */
 abstract class AnalysisContext {
   /**
+   * Apply the given delta to change the level of analysis that will be performed for the sources
+   * known to this context.
+   *
+   * @param delta a description of the level of analysis that should be performed for some sources
+   */
+  void applyAnalysisDelta(AnalysisDelta delta);
+
+  /**
    * Apply the changes specified by the given change set to this context. Any analysis results that
    * have been invalidated by these changes will be removed.
    *
@@ -1022,7 +903,7 @@
   AnalysisContextImpl() : super() {
     _resultRecorder = new AnalysisContextImpl_AnalysisTaskResultRecorder(this);
     _privatePartition = new UniversalCachePartition(AnalysisOptionsImpl.DEFAULT_CACHE_SIZE, new AnalysisContextImpl_ContextRetentionPolicy(this));
-    _cache = _createCacheFromSourceFactory(null);
+    _cache = createCacheFromSourceFactory(null);
   }
 
   @override
@@ -1033,6 +914,20 @@
   }
 
   @override
+  void applyAnalysisDelta(AnalysisDelta delta) {
+    ChangeSet changeSet = new ChangeSet();
+    for (MapEntry<Source, AnalysisLevel> entry in getMapEntrySet(delta.analysisLevels)) {
+      Source source = entry.getKey();
+      if (entry.getValue() == AnalysisLevel.NONE) {
+        changeSet.removedSource(source);
+      } else {
+        changeSet.addedSource(source);
+      }
+    }
+    applyChanges(changeSet);
+  }
+
+  @override
   void applyChanges(ChangeSet changeSet) {
     if (changeSet.isEmpty) {
       return;
@@ -1629,9 +1524,9 @@
   }
 
   @override
-  AnalysisContentStatistics get statistics {
+  AnalysisContextStatistics get statistics {
     bool hintsEnabled = _options.hint;
-    AnalysisContentStatisticsImpl statistics = new AnalysisContentStatisticsImpl();
+    AnalysisContextStatisticsImpl statistics = new AnalysisContextStatisticsImpl();
     MapIterator<Source, SourceEntry> iterator = _cache.iterator();
     while (iterator.moveNext()) {
       SourceEntry sourceEntry = iterator.value;
@@ -1673,6 +1568,7 @@
         statistics.putCacheItem(htmlEntry, HtmlEntry.RESOLVED_UNIT);
       }
     }
+    statistics.partitionData = _cache.partitionData;
     return statistics;
   }
 
@@ -1937,11 +1833,30 @@
     factory.context = this;
     _sourceFactory = factory;
     _coreLibrarySource = _sourceFactory.forUri(DartSdk.DART_CORE);
-    _cache = _createCacheFromSourceFactory(factory);
+    _cache = createCacheFromSourceFactory(factory);
     _invalidateAllLocalResolutionInformation();
   }
 
   /**
+   * Create an analysis cache based on the given source factory.
+   *
+   * @param factory the source factory containing the information needed to create the cache
+   * @return the cache that was created
+   */
+  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+    if (factory == null) {
+      return new AnalysisCache(<CachePartition> [_privatePartition]);
+    }
+    DartSdk sdk = factory.dartSdk;
+    if (sdk == null) {
+      return new AnalysisCache(<CachePartition> [_privatePartition]);
+    }
+    return new AnalysisCache(<CachePartition> [
+        AnalysisEngine.instance.partitionManager.forSdk(sdk),
+        _privatePartition]);
+  }
+
+  /**
    * Record the results produced by performing a [ResolveDartLibraryCycleTask]. If the results
    * were computed from data that is now out-of-date, then the results will not be recorded.
    *
@@ -1969,8 +1884,11 @@
           throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
         }
         DartEntryImpl dartCopy = unitEntry.writableCopy;
-        dartCopy.recordResolutionError();
-        dartCopy.exception = thrownException;
+        if (thrownException == null) {
+          dartCopy.recordResolutionError(new AnalysisException.con1("In recordResolveDartLibraryCycleTaskResults, resolvedLibraries was null and there was no thrown exception"));
+        } else {
+          dartCopy.recordResolutionError(thrownException);
+        }
         _cache.put(unitSource, dartCopy);
         _cache.remove(unitSource);
         if (thrownException != null) {
@@ -1997,10 +1915,9 @@
               }
               _cache.storedAst(source);
             } else {
-              dartCopy.recordResolutionError();
+              dartCopy.recordResolutionErrorInLibrary(librarySource, thrownException);
               _cache.remove(source);
             }
-            dartCopy.exception = thrownException;
             _cache.put(source, dartCopy);
             if (source != librarySource) {
               _workManager.add(source, SourcePriority.PRIORITY_PART);
@@ -2035,10 +1952,9 @@
                 // the cache so that we won't attempt to re-analyze the sources until there's a
                 // good chance that we'll be able to do so without error.
                 //
-                dartCopy.recordResolutionError();
+                dartCopy.recordResolutionError(thrownException);
                 _cache.remove(source);
               }
-              dartCopy.exception = thrownException;
               _cache.put(source, dartCopy);
               if (source == unitSource) {
                 unitEntry = dartCopy;
@@ -2083,8 +1999,11 @@
           throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
         }
         DartEntryImpl dartCopy = unitEntry.writableCopy;
-        dartCopy.recordResolutionError();
-        dartCopy.exception = thrownException;
+        if (thrownException == null) {
+          dartCopy.recordResolutionError(new AnalysisException.con1("In recordResolveDartLibraryTaskResults, resolvedLibraries was null and there was no thrown exception"));
+        } else {
+          dartCopy.recordResolutionError(thrownException);
+        }
         _cache.put(unitSource, dartCopy);
         _cache.remove(unitSource);
         if (thrownException != null) {
@@ -2122,10 +2041,9 @@
               }
               _cache.storedAst(source);
             } else {
-              dartCopy.recordResolutionError();
+              dartCopy.recordResolutionErrorInLibrary(librarySource, thrownException);
               _cache.remove(source);
             }
-            dartCopy.exception = thrownException;
             _cache.put(source, dartCopy);
             if (source != librarySource) {
               _workManager.add(source, SourcePriority.PRIORITY_PART);
@@ -2160,10 +2078,9 @@
                 // the cache so that we won't attempt to re-analyze the sources until there's a
                 // good chance that we'll be able to do so without error.
                 //
-                dartCopy.recordResolutionError();
+                dartCopy.recordResolutionError(thrownException);
                 _cache.remove(source);
               }
-              dartCopy.exception = thrownException;
               _cache.put(source, dartCopy);
               if (source == unitSource) {
                 unitEntry = dartCopy;
@@ -2625,8 +2542,7 @@
       return new AnalysisContextImpl_TaskData(new BuildDartElementModelTask(this, source, builder.librariesInCycle), false);
     } on AnalysisException catch (exception) {
       DartEntryImpl dartCopy = dartEntry.writableCopy;
-      dartCopy.recordBuildElementError();
-      dartCopy.exception = exception;
+      dartCopy.recordBuildElementErrorInLibrary(source, exception);
       _cache.put(source, dartCopy);
       AnalysisEngine.instance.logger.logError2("Internal error trying to compute the next analysis task", exception);
     }
@@ -2634,25 +2550,6 @@
   }
 
   /**
-   * Create an analysis cache based on the given source factory.
-   *
-   * @param factory the source factory containing the information needed to create the cache
-   * @return the cache that was created
-   */
-  AnalysisCache _createCacheFromSourceFactory(SourceFactory factory) {
-    if (factory == null) {
-      return new AnalysisCache(<CachePartition> [_privatePartition]);
-    }
-    DartSdk sdk = factory.dartSdk;
-    if (sdk == null) {
-      return new AnalysisCache(<CachePartition> [_privatePartition]);
-    }
-    return new AnalysisCache(<CachePartition> [
-        AnalysisEngine.instance.partitionManager.forSdk(sdk),
-        _privatePartition]);
-  }
-
-  /**
    * Create a [GenerateDartErrorsTask] for the given source, marking the verification errors
    * as being in-process. The compilation unit and the library can be the same if the compilation
    * unit is the defining compilation unit of the library.
@@ -2669,9 +2566,10 @@
     }
     CompilationUnit unit = unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
     if (unit == null) {
-      AnalysisEngine.instance.logger.logInformation2("Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}", new AnalysisException());
+      AnalysisException exception = new AnalysisException.con1("Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}");
+      AnalysisEngine.instance.logger.logInformation2(exception.toString(), exception);
       DartEntryImpl dartCopy = unitEntry.writableCopy;
-      dartCopy.recordResolutionError();
+      dartCopy.recordResolutionError(exception);
       _cache.put(unitSource, dartCopy);
       return new AnalysisContextImpl_TaskData(null, false);
     }
@@ -2866,10 +2764,9 @@
       return new AnalysisContextImpl_TaskData(new ResolveDartLibraryCycleTask(this, source, source, builder.librariesInCycle), false);
     } on AnalysisException catch (exception) {
       DartEntryImpl dartCopy = dartEntry.writableCopy;
-      dartCopy.recordResolutionError();
-      dartCopy.exception = exception;
+      dartCopy.recordResolutionError(exception);
       _cache.put(source, dartCopy);
-      AnalysisEngine.instance.logger.logError2("Internal error trying to compute the next analysis task", exception);
+      AnalysisEngine.instance.logger.logError2("Internal error trying to create a ResolveDartLibraryTask", exception);
     }
     return new AnalysisContextImpl_TaskData(null, false);
   }
@@ -3958,10 +3855,9 @@
               dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(libraryElement, htmlSource, new Set<LibraryElement>()));
             }
           } else {
-            dartCopy.recordBuildElementError();
+            dartCopy.recordBuildElementErrorInLibrary(librarySource, thrownException);
             _cache.remove(source);
           }
-          dartCopy.exception = thrownException;
           _cache.put(source, dartCopy);
           if (source != librarySource) {
             _workManager.add(librarySource, SourcePriority.PRIORITY_PART);
@@ -3978,6 +3874,7 @@
       PrintStringWriter writer = new PrintStringWriter();
       writer.println("Build element model results discarded for");
       for (ResolvableLibrary library in builtLibraries) {
+        Source librarySource = library.librarySource;
         for (Source source in library.compilationUnitSources) {
           DartEntry dartEntry = _getReadableDartEntry(source);
           if (dartEntry != null) {
@@ -3996,10 +3893,9 @@
               // the cache so that we won't attempt to re-analyze the sources until there's a
               // good chance that we'll be able to do so without error.
               //
-              dartCopy.recordBuildElementError();
+              dartCopy.recordBuildElementErrorInLibrary(librarySource, thrownException);
               _cache.remove(source);
             }
-            dartCopy.exception = thrownException;
             _cache.put(source, dartCopy);
             if (source == targetLibrary) {
               targetEntry = dartCopy;
@@ -4077,9 +3973,8 @@
         ChangeNoticeImpl notice = _getNotice(source);
         notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
       } else {
-        dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
+        dartCopy.recordVerificationErrorInLibrary(librarySource, thrownException);
       }
-      dartCopy.exception = thrownException;
       _cache.put(source, dartCopy);
       dartEntry = dartCopy;
     } else {
@@ -4102,9 +3997,8 @@
         // cache so that we won't attempt to re-verify the source until there's a good chance
         // that we'll be able to do so without error.
         //
-        dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
+        dartCopy.recordVerificationErrorInLibrary(librarySource, thrownException);
       }
-      dartCopy.exception = thrownException;
       _cache.put(source, dartCopy);
       dartEntry = dartCopy;
     }
@@ -4142,8 +4036,7 @@
         thrownException = new AnalysisException.con1("GenerateDartHintsTask returned a null hint map without throwing an exception: ${librarySource.fullName}");
       }
       DartEntryImpl dartCopy = (sourceEntry as DartEntry).writableCopy;
-      dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
-      dartCopy.exception = thrownException;
+      dartCopy.recordHintErrorInLibrary(librarySource, thrownException);
       _cache.put(librarySource, dartCopy);
       throw thrownException;
     }
@@ -4177,9 +4070,8 @@
           ChangeNoticeImpl notice = _getNotice(unitSource);
           notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
         } else {
-          dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
+          dartCopy.recordHintErrorInLibrary(librarySource, thrownException);
         }
-        dartCopy.exception = thrownException;
         _cache.put(unitSource, dartCopy);
         dartEntry = dartCopy;
       } else {
@@ -4203,9 +4095,8 @@
             // cache so that we won't attempt to re-analyze the sources until there's a good chance
             // that we'll be able to do so without error.
             //
-            dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
+            dartCopy.recordHintErrorInLibrary(librarySource, thrownException);
           }
-          dartCopy.exception = thrownException;
           _cache.put(unitSource, dartCopy);
           dartEntry = dartCopy;
         }
@@ -4240,8 +4131,7 @@
       sourceCopy.modificationTime = task.modificationTime;
       sourceCopy.setValue(SourceEntry.CONTENT, task.content);
     } else {
-      sourceCopy.exception = thrownException;
-      sourceCopy.recordContentError();
+      sourceCopy.recordContentError(thrownException);
       _workManager.remove(source);
     }
     _cache.put(source, sourceCopy);
@@ -4350,10 +4240,9 @@
         _incrementalAnalysisCache = IncrementalAnalysisCache.verifyStructure(_incrementalAnalysisCache, source, task.compilationUnit);
       } else {
         _removeFromParts(source, dartEntry);
-        dartCopy.recordParseError();
+        dartCopy.recordParseError(thrownException);
         _cache.removedAst(source);
       }
-      dartCopy.exception = thrownException;
       _cache.put(source, dartCopy);
       dartEntry = dartCopy;
     } else {
@@ -4376,9 +4265,8 @@
         // cache so that we won't attempt to re-analyze the sources until there's a good chance
         // that we'll be able to do so without error.
         //
-        dartCopy.recordParseError();
+        dartCopy.recordParseError(thrownException);
       }
-      dartCopy.exception = thrownException;
       _cache.put(source, dartCopy);
       dartEntry = dartCopy;
     }
@@ -4432,10 +4320,9 @@
         ChangeNoticeImpl notice = _getNotice(source);
         notice.setErrors(htmlCopy.allErrors, lineInfo);
       } else {
-        htmlCopy.recordParseError();
+        htmlCopy.recordParseError(thrownException);
         _cache.removedAst(source);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     } else {
@@ -4464,12 +4351,8 @@
         // cache so that we won't attempt to re-analyze the sources until there's a good chance
         // that we'll be able to do so without error.
         //
-        htmlCopy.setState(SourceEntry.LINE_INFO, CacheState.ERROR);
-        htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
-        htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.ERROR);
-        htmlCopy.setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.ERROR);
+        htmlCopy.recordParseError(thrownException);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     }
@@ -4517,9 +4400,8 @@
         ChangeNoticeImpl notice = _getNotice(source);
         notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
-        htmlCopy.recordResolutionError();
+        htmlCopy.recordResolutionError(thrownException);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     } else {
@@ -4538,9 +4420,8 @@
         // cache so that we won't attempt to re-analyze the sources until there's a good chance
         // that we'll be able to do so without error.
         //
-        htmlCopy.recordResolutionError();
+        htmlCopy.recordResolutionError(thrownException);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     }
@@ -4588,9 +4469,8 @@
         ChangeNoticeImpl notice = _getNotice(source);
         notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
-        htmlCopy.recordResolutionError();
+        htmlCopy.recordResolutionError(thrownException);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     } else {
@@ -4609,9 +4489,8 @@
         // cache so that we won't attempt to re-analyze the sources until there's a good chance
         // that we'll be able to do so without error.
         //
-        htmlCopy.recordResolutionError();
+        htmlCopy.recordResolutionError(thrownException);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     }
@@ -4660,9 +4539,8 @@
         notice.htmlUnit = task.resolvedUnit;
         notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
-        htmlCopy.recordResolutionError();
+        htmlCopy.recordResolutionError(thrownException);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     } else {
@@ -4690,9 +4568,8 @@
         // cache so that we won't attempt to re-analyze the sources until there's a good chance
         // that we'll be able to do so without error.
         //
-        htmlCopy.recordResolutionError();
+        htmlCopy.recordResolutionError(thrownException);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     }
@@ -4742,9 +4619,8 @@
         notice.htmlUnit = task.resolvedUnit;
         notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
-        htmlCopy.recordResolutionError();
+        htmlCopy.recordResolutionError(thrownException);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     } else {
@@ -4772,9 +4648,8 @@
         // cache so that we won't attempt to re-analyze the sources until there's a good chance
         // that we'll be able to do so without error.
         //
-        htmlCopy.recordResolutionError();
+        htmlCopy.recordResolutionError(thrownException);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     }
@@ -4822,10 +4697,9 @@
         dartCopy.setValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource, task.resolvedUnit);
         _cache.storedAst(unitSource);
       } else {
-        dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.ERROR);
+        dartCopy.recordResolutionErrorInLibrary(librarySource, thrownException);
         _cache.removedAst(unitSource);
       }
-      dartCopy.exception = thrownException;
       _cache.put(unitSource, dartCopy);
       dartEntry = dartCopy;
     } else {
@@ -4850,9 +4724,8 @@
         // cache so that we won't attempt to re-analyze the sources until there's a good chance
         // that we'll be able to do so without error.
         //
-        dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.ERROR);
+        dartCopy.recordResolutionErrorInLibrary(librarySource, thrownException);
       }
-      dartCopy.exception = thrownException;
       _cache.put(unitSource, dartCopy);
       dartEntry = dartCopy;
     }
@@ -4905,10 +4778,9 @@
         notice.htmlUnit = task.resolvedUnit;
         notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
-        htmlCopy.recordResolutionError();
+        htmlCopy.recordResolutionError(thrownException);
         _cache.removedAst(source);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     } else {
@@ -4934,9 +4806,8 @@
         // cache so that we won't attempt to re-analyze the sources until there's a good chance
         // that we'll be able to do so without error.
         //
-        htmlCopy.recordResolutionError();
+        htmlCopy.recordResolutionError(thrownException);
       }
-      htmlCopy.exception = thrownException;
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     }
@@ -4990,10 +4861,9 @@
         notice.setErrors(dartEntry.allErrors, lineInfo);
       } else {
         _removeFromParts(source, dartEntry);
-        dartCopy.recordScanError();
+        dartCopy.recordScanError(thrownException);
         _cache.removedAst(source);
       }
-      dartCopy.exception = thrownException;
       _cache.put(source, dartCopy);
       dartEntry = dartCopy;
     } else {
@@ -5016,9 +4886,8 @@
         // cache so that we won't attempt to re-analyze the sources until there's a good chance
         // that we'll be able to do so without error.
         //
-        dartCopy.recordScanError();
+        dartCopy.recordScanError(thrownException);
       }
-      dartCopy.exception = thrownException;
       _cache.put(source, dartCopy);
       dartEntry = dartCopy;
     }
@@ -5181,7 +5050,7 @@
     if (sourceEntry is HtmlEntry) {
       HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
       _invalidateAngularResolution(htmlCopy);
-      htmlCopy.recordContentError();
+      htmlCopy.recordContentError(new AnalysisException.con1("This source was marked as being deleted"));
       _cache.put(source, htmlCopy);
     } else if (sourceEntry is DartEntry) {
       Set<Source> libraries = new Set<Source>();
@@ -5195,7 +5064,7 @@
         _invalidateLibraryResolution(librarySource);
       }
       DartEntryImpl dartCopy = sourceEntry.writableCopy;
-      dartCopy.recordContentError();
+      dartCopy.recordContentError(new AnalysisException.con1("This source was marked as being deleted"));
       _cache.put(source, dartCopy);
     }
     _workManager.remove(source);
@@ -5873,6 +5742,291 @@
 }
 
 /**
+ * The interface `AnalysisContextStatistics` defines access to statistics about a single
+ * [AnalysisContext].
+ */
+abstract class AnalysisContextStatistics {
+  /**
+   * Return the statistics for each kind of cached data.
+   */
+  List<AnalysisContextStatistics_CacheRow> get cacheRows;
+
+  /**
+   * Return the exceptions that caused some entries to have a state of [CacheState#ERROR].
+   */
+  List<AnalysisException> get exceptions;
+
+  /**
+   * Return information about each of the partitions in the cache.
+   */
+  List<AnalysisContextStatistics_PartitionData> get partitionData;
+
+  /**
+   * Return an array containing all of the sources in the cache.
+   */
+  List<Source> get sources;
+}
+
+/**
+ * Implementation of the [AnalysisContextStatistics].
+ */
+class AnalysisContextStatisticsImpl implements AnalysisContextStatistics {
+  Map<String, AnalysisContextStatistics_CacheRow> _dataMap = new Map<String, AnalysisContextStatistics_CacheRow>();
+
+  List<Source> _sources = new List<Source>();
+
+  Set<AnalysisException> _exceptions = new Set<AnalysisException>();
+
+  List<AnalysisContextStatistics_PartitionData> _partitionData;
+
+  void addSource(Source source) {
+    _sources.add(source);
+  }
+
+  @override
+  List<AnalysisContextStatistics_CacheRow> get cacheRows {
+    Iterable<AnalysisContextStatistics_CacheRow> items = _dataMap.values;
+    return new List.from(items);
+  }
+
+  @override
+  List<AnalysisException> get exceptions => new List.from(_exceptions);
+
+  @override
+  List<AnalysisContextStatistics_PartitionData> get partitionData => _partitionData;
+
+  @override
+  List<Source> get sources => new List.from(_sources);
+
+  void putCacheItem(SourceEntry dartEntry, DataDescriptor descriptor) {
+    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
+  }
+
+  void putCacheItemInLibrary(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
+    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getStateInLibrary(descriptor, librarySource));
+  }
+
+  /**
+   * Set the partition data returned by this object to the given data.
+   */
+  void set partitionData(List<AnalysisContextStatistics_PartitionData> data) {
+    _partitionData = data;
+  }
+
+  void _internalPutCacheItem(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
+    String rowName = rowDesc.toString();
+    AnalysisContextStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContextStatisticsImpl_CacheRowImpl;
+    if (row == null) {
+      row = new AnalysisContextStatisticsImpl_CacheRowImpl(rowName);
+      _dataMap[rowName] = row;
+    }
+    row._incState(state);
+    if (state == CacheState.ERROR) {
+      AnalysisException exception = dartEntry.exception;
+      if (exception != null) {
+        _exceptions.add(exception);
+      }
+    }
+  }
+}
+
+class AnalysisContextStatisticsImpl_CacheRowImpl implements AnalysisContextStatistics_CacheRow {
+  final String name;
+
+  int _errorCount = 0;
+
+  int _flushedCount = 0;
+
+  int _inProcessCount = 0;
+
+  int _invalidCount = 0;
+
+  int _validCount = 0;
+
+  AnalysisContextStatisticsImpl_CacheRowImpl(this.name);
+
+  @override
+  bool operator ==(Object obj) => obj is AnalysisContextStatisticsImpl_CacheRowImpl && obj.name == name;
+
+  @override
+  int get errorCount => _errorCount;
+
+  @override
+  int get flushedCount => _flushedCount;
+
+  @override
+  int get inProcessCount => _inProcessCount;
+
+  @override
+  int get invalidCount => _invalidCount;
+
+  @override
+  int get validCount => _validCount;
+
+  @override
+  int get hashCode => name.hashCode;
+
+  void _incState(CacheState state) {
+    if (state == CacheState.ERROR) {
+      _errorCount++;
+    }
+    if (state == CacheState.FLUSHED) {
+      _flushedCount++;
+    }
+    if (state == CacheState.IN_PROCESS) {
+      _inProcessCount++;
+    }
+    if (state == CacheState.INVALID) {
+      _invalidCount++;
+    }
+    if (state == CacheState.VALID) {
+      _validCount++;
+    }
+  }
+}
+
+class AnalysisContextStatisticsImpl_PartitionDataImpl implements AnalysisContextStatistics_PartitionData {
+  final int astCount;
+
+  final int totalCount;
+
+  AnalysisContextStatisticsImpl_PartitionDataImpl(this.astCount, this.totalCount);
+}
+
+/**
+ * Information about single piece of data in the cache.
+ */
+abstract class AnalysisContextStatistics_CacheRow {
+  /**
+   * Return the number of entries whose state is [CacheState#ERROR].
+   */
+  int get errorCount;
+
+  /**
+   * Return the number of entries whose state is [CacheState#FLUSHED].
+   */
+  int get flushedCount;
+
+  /**
+   * Return the number of entries whose state is [CacheState#IN_PROCESS].
+   */
+  int get inProcessCount;
+
+  /**
+   * Return the number of entries whose state is [CacheState#INVALID].
+   */
+  int get invalidCount;
+
+  /**
+   * Return the name of the data represented by this object.
+   */
+  String get name;
+
+  /**
+   * Return the number of entries whose state is [CacheState#VALID].
+   */
+  int get validCount;
+}
+
+/**
+ * Information about a single partition in the cache.
+ */
+abstract class AnalysisContextStatistics_PartitionData {
+  /**
+   * Return the number of entries in the partition that have an AST structure in one state or
+   * another.
+   */
+  int get astCount;
+
+  /**
+   * Return the total number of entries in the partition.
+   */
+  int get totalCount;
+}
+
+/**
+ * Instances of the class `AnalysisDelta` indicate changes to the types of analysis that
+ * should be performed.
+ */
+class AnalysisDelta {
+  /**
+   * A mapping from source to what type of analysis should be performed on that source.
+   */
+  Map<Source, AnalysisLevel> _analysisMap = new Map<Source, AnalysisLevel>();
+
+  /**
+   * Return a collection of the sources that have been added. This is equivalent to calling
+   * [getAnalysisLevels] and collecting all sources that do not have an analysis level of
+   * [AnalysisLevel#NONE].
+   *
+   * @return a collection of the sources
+   */
+  Iterable<Source> get addedSources {
+    List<Source> result = new List<Source>();
+    for (MapEntry<Source, AnalysisLevel> entry in getMapEntrySet(_analysisMap)) {
+      if (entry.getValue() != AnalysisLevel.NONE) {
+        result.add(entry.getKey());
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Return a mapping of sources to the level of analysis that should be performed.
+   *
+   * @return the analysis map
+   */
+  Map<Source, AnalysisLevel> get analysisLevels => _analysisMap;
+
+  /**
+   * Record that the specified source should be analyzed at the specified level.
+   *
+   * @param source the source
+   * @param level the level at which the given source should be analyzed
+   */
+  void setAnalysisLevel(Source source, AnalysisLevel level) {
+    _analysisMap[source] = level;
+  }
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    bool needsSeparator = _appendSources(builder, false, AnalysisLevel.ALL);
+    needsSeparator = _appendSources(builder, needsSeparator, AnalysisLevel.RESOLVED);
+    _appendSources(builder, needsSeparator, AnalysisLevel.NONE);
+    return builder.toString();
+  }
+
+  /**
+   * Append sources with the given analysis level, prefixed with a label and possibly a separator.
+   *
+   * @param builder the builder to which the sources are to be appended
+   * @param needsSeparator `true` if a separator is needed before the label
+   * @param level the analysis level of the sources to be appended
+   * @return `true` if future lists of sources will need a separator
+   */
+  bool _appendSources(JavaStringBuilder builder, bool needsSeparator, AnalysisLevel level) {
+    bool first = true;
+    for (MapEntry<Source, AnalysisLevel> entry in getMapEntrySet(_analysisMap)) {
+      if (entry.getValue() == level) {
+        if (first) {
+          first = false;
+          if (needsSeparator) {
+            builder.append("; ");
+          }
+          builder.append(level);
+          builder.append(" ");
+        } else {
+          builder.append(", ");
+        }
+        builder.append(entry.getKey().fullName);
+      }
+    }
+    return needsSeparator || !first;
+  }
+}
+
+/**
  * The unique instance of the class `AnalysisEngine` serves as the entry point for the
  * functionality provided by the analysis engine.
  */
@@ -6054,6 +6208,36 @@
 }
 
 /**
+ * The enumeration `AnalysisLevel` encodes the different levels at which a source can be
+ * analyzed.
+ */
+class AnalysisLevel extends Enum<AnalysisLevel> {
+  /**
+   * Indicates a source should be fully analyzed.
+   */
+  static const AnalysisLevel ALL = const AnalysisLevel('ALL', 0);
+
+  /**
+   * Indicates a source should be resolved and that errors, warnings and hints are needed.
+   */
+  static const AnalysisLevel ERRORS = const AnalysisLevel('ERRORS', 1);
+
+  /**
+   * Indicates a source should be resolved, but that errors, warnings and hints are not needed.
+   */
+  static const AnalysisLevel RESOLVED = const AnalysisLevel('RESOLVED', 2);
+
+  /**
+   * Indicates a source is not of interest to the client.
+   */
+  static const AnalysisLevel NONE = const AnalysisLevel('NONE', 3);
+
+  static const List<AnalysisLevel> values = const [ALL, ERRORS, RESOLVED, NONE];
+
+  const AnalysisLevel(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
  * The interface `AnalysisOptions` defines the behavior of objects that provide access to a
  * set of analysis options used to control the behavior of an analysis context.
  */
@@ -7817,6 +8001,30 @@
   SourceEntry get(Source source) => _sourceMap[source];
 
   /**
+   * Return the number of entries in this partition that have an AST associated with them.
+   *
+   * @return the number of entries in this partition that have an AST associated with them
+   */
+  int get astSize {
+    int astSize = 0;
+    int count = _recentlyUsed.length;
+    for (int i = 0; i < count; i++) {
+      Source source = _recentlyUsed[i];
+      SourceEntry sourceEntry = _sourceMap[source];
+      if (sourceEntry is DartEntry) {
+        if (sourceEntry.anyParsedCompilationUnit != null) {
+          astSize++;
+        }
+      } else if (sourceEntry is HtmlEntry) {
+        if (sourceEntry.anyParsedUnit != null) {
+          astSize++;
+        }
+      }
+    }
+    return astSize;
+  }
+
+  /**
    * Return a table mapping the sources known to the context to the information known about the
    * source.
    *
@@ -8964,7 +9172,7 @@
       state = state._nextState;
     }
     ;
-    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
+    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.BUILT_UNIT) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
       return CacheState.INVALID;
     } else {
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
@@ -9175,14 +9383,19 @@
    * Record that an error occurred while attempting to build the element model for the source
    * represented by this entry. This will set the state of all resolution-based information as being
    * in error, but will not change the state of any parse results.
+   *
+   * @param librarySource the source of the library in which the element model was being built
+   * @param exception the exception that shows where the error occurred
    */
-  void recordBuildElementError() {
+  void recordBuildElementErrorInLibrary(Source librarySource, AnalysisException exception) {
+    this.exception = exception;
     _element = null;
     _elementState = CacheState.ERROR;
     clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
     _clientServerState = CacheState.ERROR;
     _launchableState = CacheState.ERROR;
-    recordResolutionError();
+    DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
+    state.recordBuildElementError();
   }
 
   /**
@@ -9202,17 +9415,32 @@
   }
 
   @override
-  void recordContentError() {
-    super.recordContentError();
-    recordScanError();
+  void recordContentError(AnalysisException exception) {
+    super.recordContentError(exception);
+    recordScanError(exception);
+  }
+
+  /**
+   * Record that an error occurred while attempting to generate hints for the source represented by
+   * this entry. This will set the state of all verification information as being in error.
+   *
+   * @param librarySource the source of the library in which hints were being generated
+   * @param exception the exception that shows where the error occurred
+   */
+  void recordHintErrorInLibrary(Source librarySource, AnalysisException exception) {
+    this.exception = exception;
+    DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
+    state.recordHintError();
   }
 
   /**
    * Record that an error occurred while attempting to scan or parse the entry represented by this
    * entry. This will set the state of all information, including any resolution-based information,
    * as being in error.
+   *
+   * @param exception the exception that shows where the error occurred
    */
-  void recordParseError() {
+  void recordParseError(AnalysisException exception) {
     _sourceKind = SourceKind.UNKNOWN;
     _sourceKindState = CacheState.ERROR;
     _parseErrors = AnalysisError.NO_ERRORS;
@@ -9226,7 +9454,7 @@
     _importedLibrariesState = CacheState.ERROR;
     _includedParts = Source.EMPTY_ARRAY;
     _includedPartsState = CacheState.ERROR;
-    recordResolutionError();
+    recordResolutionError(exception);
   }
 
   /**
@@ -9286,8 +9514,11 @@
    * Record that an error occurred while attempting to resolve the source represented by this entry.
    * This will set the state of all resolution-based information as being in error, but will not
    * change the state of any parse results.
+   *
+   * @param exception the exception that shows where the error occurred
    */
-  void recordResolutionError() {
+  void recordResolutionError(AnalysisException exception) {
+    this.exception = exception;
     _element = null;
     _elementState = CacheState.ERROR;
     clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
@@ -9295,7 +9526,28 @@
     _launchableState = CacheState.ERROR;
     _publicNamespace = null;
     _publicNamespaceState = CacheState.ERROR;
-    _resolutionState.recordResolutionError();
+    _resolutionState.recordResolutionErrorsInAllLibraries();
+  }
+
+  /**
+   * Record that an error occurred while attempting to resolve the source represented by this entry.
+   * This will set the state of all resolution-based information as being in error, but will not
+   * change the state of any parse results.
+   *
+   * @param librarySource the source of the library in which resolution was being performed
+   * @param exception the exception that shows where the error occurred
+   */
+  void recordResolutionErrorInLibrary(Source librarySource, AnalysisException exception) {
+    this.exception = exception;
+    _element = null;
+    _elementState = CacheState.ERROR;
+    clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
+    _clientServerState = CacheState.ERROR;
+    _launchableState = CacheState.ERROR;
+    _publicNamespace = null;
+    _publicNamespaceState = CacheState.ERROR;
+    DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
+    state.recordResolutionError();
   }
 
   /**
@@ -9324,14 +9576,17 @@
    * Record that an error occurred while attempting to scan or parse the entry represented by this
    * entry. This will set the state of all information, including any resolution-based information,
    * as being in error.
+   *
+   * @param exception the exception that shows where the error occurred
    */
-  void recordScanError() {
-    setState(SourceEntry.LINE_INFO, CacheState.ERROR);
+  @override
+  void recordScanError(AnalysisException exception) {
+    super.recordScanError(exception);
     _scanErrors = AnalysisError.NO_ERRORS;
     _scanErrorsState = CacheState.ERROR;
     _tokenStream = null;
     _tokenStreamState = CacheState.ERROR;
-    recordParseError();
+    recordParseError(exception);
   }
 
   /**
@@ -9367,6 +9622,20 @@
   }
 
   /**
+   * Record that an error occurred while attempting to generate errors and warnings for the source
+   * represented by this entry. This will set the state of all verification information as being in
+   * error.
+   *
+   * @param librarySource the source of the library in which verification was being performed
+   * @param exception the exception that shows where the error occurred
+   */
+  void recordVerificationErrorInLibrary(Source librarySource, AnalysisException exception) {
+    this.exception = exception;
+    DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
+    state.recordVerificationError();
+  }
+
+  /**
    * Remove the given library from the list of libraries that contain this part. This method should
    * only be invoked on entries that represent a part.
    *
@@ -9852,11 +10121,44 @@
   }
 
   /**
+   * Record that an error occurred while attempting to build the element model for the source
+   * represented by this state.
+   */
+  void recordBuildElementError() {
+    _builtUnitState = CacheState.ERROR;
+    _builtUnit = null;
+    _buildElementErrorsState = CacheState.ERROR;
+    _buildElementErrors = AnalysisError.NO_ERRORS;
+    recordResolutionError();
+  }
+
+  /**
+   * Record that an error occurred while attempting to generate hints for the source represented
+   * by this entry. This will set the state of all verification information as being in error.
+   */
+  void recordHintError() {
+    _hints = AnalysisError.NO_ERRORS;
+    _hintsState = CacheState.ERROR;
+  }
+
+  /**
+   * Record that an error occurred while attempting to resolve the source represented by this
+   * state.
+   */
+  void recordResolutionError() {
+    _resolvedUnitState = CacheState.ERROR;
+    _resolvedUnit = null;
+    _resolutionErrorsState = CacheState.ERROR;
+    _resolutionErrors = AnalysisError.NO_ERRORS;
+    recordVerificationError();
+  }
+
+  /**
    * Record that an error occurred while attempting to scan or parse the entry represented by this
    * entry. This will set the state of all resolution-based information as being in error, but
    * will not change the state of any parse results.
    */
-  void recordResolutionError() {
+  void recordResolutionErrorsInAllLibraries() {
     _builtUnitState = CacheState.ERROR;
     _builtUnit = null;
     _buildElementErrorsState = CacheState.ERROR;
@@ -9865,12 +10167,9 @@
     _resolvedUnit = null;
     _resolutionErrorsState = CacheState.ERROR;
     _resolutionErrors = AnalysisError.NO_ERRORS;
-    _verificationErrorsState = CacheState.ERROR;
-    _verificationErrors = AnalysisError.NO_ERRORS;
-    _hintsState = CacheState.ERROR;
-    _hints = AnalysisError.NO_ERRORS;
+    recordVerificationError();
     if (_nextState != null) {
-      _nextState.recordResolutionError();
+      _nextState.recordResolutionErrorsInAllLibraries();
     }
   }
 
@@ -9897,6 +10196,17 @@
   }
 
   /**
+   * Record that an error occurred while attempting to generate errors and warnings for the source
+   * represented by this entry. This will set the state of all verification information as being
+   * in error.
+   */
+  void recordVerificationError() {
+    _verificationErrors = AnalysisError.NO_ERRORS;
+    _verificationErrorsState = CacheState.ERROR;
+    recordHintError();
+  }
+
+  /**
    * Write a textual representation of this state to the given builder. The result will only be
    * used for debugging purposes.
    *
@@ -10723,35 +11033,51 @@
   }
 
   @override
-  void recordContentError() {
-    super.recordContentError();
-    recordParseError();
+  void recordContentError(AnalysisException exception) {
+    super.recordContentError(exception);
+    recordParseError(exception);
   }
 
   /**
    * Record that an error was encountered while attempting to parse the source associated with this
    * entry.
+   *
+   * @param exception the exception that shows where the error occurred
    */
-  void recordParseError() {
-    setState(SourceEntry.LINE_INFO, CacheState.ERROR);
-    setState(HtmlEntry.PARSE_ERRORS, CacheState.ERROR);
-    setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
-    setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.ERROR);
-    recordResolutionError();
+  void recordParseError(AnalysisException exception) {
+    // If the scanning and parsing of HTML are separated, the following line can be removed.
+    recordScanError(exception);
+    _parseErrors = AnalysisError.NO_ERRORS;
+    _parseErrorsState = CacheState.ERROR;
+    _parsedUnit = null;
+    _parsedUnitState = CacheState.ERROR;
+    _referencedLibraries = Source.EMPTY_ARRAY;
+    _referencedLibrariesState = CacheState.ERROR;
+    recordResolutionError(exception);
   }
 
   /**
    * Record that an error was encountered while attempting to resolve the source associated with
    * this entry.
+   *
+   * @param exception the exception that shows where the error occurred
    */
-  void recordResolutionError() {
-    setState(HtmlEntry.ANGULAR_ERRORS, CacheState.ERROR);
-    setState(HtmlEntry.RESOLVED_UNIT, CacheState.ERROR);
-    setState(HtmlEntry.ELEMENT, CacheState.ERROR);
-    setState(HtmlEntry.RESOLUTION_ERRORS, CacheState.ERROR);
-    setState(HtmlEntry.HINTS, CacheState.ERROR);
-    setState(HtmlEntry.POLYMER_BUILD_ERRORS, CacheState.ERROR);
-    setState(HtmlEntry.POLYMER_RESOLUTION_ERRORS, CacheState.ERROR);
+  void recordResolutionError(AnalysisException exception) {
+    this.exception = exception;
+    _angularErrors = AnalysisError.NO_ERRORS;
+    _angularErrorsState = CacheState.ERROR;
+    _resolvedUnit = null;
+    _resolvedUnitState = CacheState.ERROR;
+    _element = null;
+    _elementState = CacheState.ERROR;
+    _resolutionErrors = AnalysisError.NO_ERRORS;
+    _resolutionErrorsState = CacheState.ERROR;
+    _hints = AnalysisError.NO_ERRORS;
+    _hintsState = CacheState.ERROR;
+    _polymerBuildErrors = AnalysisError.NO_ERRORS;
+    _polymerBuildErrorsState = CacheState.ERROR;
+    _polymerResolutionErrors = AnalysisError.NO_ERRORS;
+    _polymerResolutionErrorsState = CacheState.ERROR;
   }
 
   @override
@@ -11233,6 +11559,18 @@
   }
 
   @override
+  void applyAnalysisDelta(AnalysisDelta delta) {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-updateAnalysis");
+    _checkThread(instrumentation);
+    try {
+      instrumentation.metric3("contextId", _contextId);
+      _basis.applyAnalysisDelta(delta);
+    } finally {
+      instrumentation.log();
+    }
+  }
+
+  @override
   void applyChanges(ChangeSet changeSet) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-applyChanges");
     _checkThread(instrumentation);
@@ -11696,7 +12034,7 @@
   }
 
   @override
-  AnalysisContentStatistics get statistics => _basis.statistics;
+  AnalysisContextStatistics get statistics => _basis.statistics;
 
   @override
   TypeProvider get typeProvider => _basis.typeProvider;
@@ -11980,7 +12318,7 @@
   /**
    * Returns a statistics about this context.
    */
-  AnalysisContentStatistics get statistics;
+  AnalysisContextStatistics get statistics;
 
   /**
    * Returns a type provider for this context or throws an exception if dart:core cannot be
@@ -14296,6 +14634,24 @@
 }
 
 /**
+ * Instances of the class `SdkAnalysisContext` implement an [AnalysisContext] that only
+ * contains sources for a Dart SDK.
+ */
+class SdkAnalysisContext extends AnalysisContextImpl {
+  @override
+  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+    if (factory == null) {
+      return super.createCacheFromSourceFactory(factory);
+    }
+    DartSdk sdk = factory.dartSdk;
+    if (sdk == null) {
+      throw new IllegalArgumentException("The source factory for an SDK analysis context must have a DartUriResolver");
+    }
+    return new AnalysisCache(<CachePartition> [AnalysisEngine.instance.partitionManager.forSdk(sdk)]);
+  }
+}
+
+/**
  * Instances of the class `SdkCachePartition` implement a cache partition that contains all of
  * the sources in the SDK.
  */
@@ -14406,7 +14762,7 @@
   /**
    * The exception that caused one or more values to have a state of [CacheState#ERROR].
    */
-  AnalysisException exception;
+  AnalysisException _exception;
 
   /**
    * The state of the cached content.
@@ -14440,19 +14796,28 @@
    */
   void fixExceptionState() {
     if (hasErrorState) {
-      if (exception == null) {
+      if (_exception == null) {
         //
         // This code should never be reached, but is a fail-safe in case an exception is not
         // recorded when it should be.
         //
-        exception = new AnalysisException.con1("State set to ERROR without setting an exception");
+        _exception = new AnalysisException.con1("State set to ERROR without setting an exception");
       }
     } else {
-      exception = null;
+      _exception = null;
     }
   }
 
   /**
+   * Return the exception that caused one or more values to have a state of [CacheState#ERROR]
+   * .
+   *
+   * @return the exception that caused one or more values to be uncomputable
+   */
+  @override
+  AnalysisException get exception => _exception;
+
+  /**
    * Return `true` if the source was explicitly added to the context or `false` if the
    * source was implicitly added because it was referenced by another source.
    *
@@ -14500,10 +14865,26 @@
    * Record that an error occurred while attempting to get the contents of the source represented by
    * this entry. This will set the state of all information, including any resolution-based
    * information, as being in error.
+   *
+   * @param exception the exception that shows where the error occurred
    */
-  void recordContentError() {
+  void recordContentError(AnalysisException exception) {
     _content = null;
     _contentState = CacheState.ERROR;
+    recordScanError(exception);
+  }
+
+  /**
+   * Record that an error occurred while attempting to scan or parse the entry represented by this
+   * entry. This will set the state of all information, including any resolution-based information,
+   * as being in error.
+   *
+   * @param exception the exception that shows where the error occurred
+   */
+  void recordScanError(AnalysisException exception) {
+    this.exception = exception;
+    _lineInfo = null;
+    _lineInfoState = CacheState.ERROR;
   }
 
   /**
@@ -14587,7 +14968,7 @@
   void copyFrom(SourceEntryImpl entry) {
     _modificationTime = entry._modificationTime;
     _flags = entry._flags;
-    exception = entry.exception;
+    _exception = entry._exception;
     _contentState = entry._contentState;
     _content = entry._content;
     _lineInfoState = entry._lineInfoState;
@@ -14610,6 +14991,19 @@
   bool get hasErrorState => _contentState == CacheState.ERROR || _lineInfoState == CacheState.ERROR;
 
   /**
+   * Set the exception that caused one or more values to have a state of [CacheState#ERROR] to
+   * the given exception.
+   *
+   * @param exception the exception that caused one or more values to be uncomputable
+   */
+  void set exception(AnalysisException exception) {
+    if (exception == null) {
+      throw new IllegalArgumentException("exception cannot be null");
+    }
+    this._exception = exception;
+  }
+
+  /**
    * Set the value of the flag with the given index to the given value.
    *
    * @param index the index of the flag whose value is to be returned
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 705d264..5257ff0 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -534,17 +534,26 @@
   static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 20, "'const' variables must be constant value");
 
   /**
+   * 5 Variables: A constant variable must be initialized to a compile-time constant or a
+   * compile-time error occurs.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+   * deferred prefix.
+   */
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY', 21, "Constant values from a deferred library cannot be used to initialized a 'const' variable");
+
+  /**
    * 7.5 Instance Variables: It is a compile-time error if an instance variable is declared to be
    * constant.
    */
-  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 21, "Only static fields can be declared as 'const'");
+  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 22, "Only static fields can be declared as 'const'");
 
   /**
    * 12.8 Maps: It is a compile-time error if the key of an entry in a constant map literal is an
    * instance of a class that implements the operator <i>==</i> unless the key is a string or
    * integer.
    */
-  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 22, "The constant map entry key expression type '%s' cannot override the == operator");
+  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 23, "The constant map entry key expression type '%s' cannot override the == operator");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant (12.1) or a
@@ -552,45 +561,45 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 23, "The const variable '%s' must be initialized");
+  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 24, "The const variable '%s' must be initialized");
 
   /**
    * 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2, where e, e1 and e2
    * are constant expressions that evaluate to a boolean value.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 24, "An expression of type 'bool' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 25, "An expression of type 'bool' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
    * constant expressions that evaluate to a numeric, string or boolean value or to null.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 25, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 26, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2, e1 | e2, e1 >> e2 or e1
    * << e2, where e, e1 and e2 are constant expressions that evaluate to an integer value or to
    * null.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 26, "An expression of type 'int' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 27, "An expression of type 'int' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 * e2, e1 / e2, e1 ~/
    * e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are constant
    * expressions that evaluate to a numeric value or to null..
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 27, "An expression of type 'num' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 28, "An expression of type 'num' was expected");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 28, "Evaluation of this constant expression causes exception");
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 29, "Evaluation of this constant expression causes exception");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 29, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 30, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
 
   /**
    * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
@@ -603,7 +612,7 @@
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 30, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 31, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
@@ -611,13 +620,13 @@
    * compile-time error if the type <i>T</i> does not declare a constant constructor with the same
    * name as the declaration of <i>T</i>.
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 31, "The constructor being called is not a 'const' constructor");
+  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 32, "The constructor being called is not a 'const' constructor");
 
   /**
    * 12.11.2 Const: In all of the above cases, it is a compile-time error if <i>a<sub>i</sub>, 1
    * &lt;= i &lt;= n + k</i>, is not a compile-time constant expression.
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 32, "Arguments of a constant creation must be constant expressions");
+  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 33, "Arguments of a constant creation must be constant expressions");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
@@ -630,12 +639,12 @@
    *
    * @param name the name of the non-type element
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 33, "The name '%s' is not a class");
+  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 34, "The name '%s' is not a class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
    */
-  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 34, "The constant creation cannot use a type parameter");
+  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 35, "The constant creation cannot use a type parameter");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -644,7 +653,7 @@
    * @param typeName the name of the type
    * @param constructorName the name of the requested constant constructor
    */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 35, "The class '%s' does not have a constant constructor '%s'");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 36, "The class '%s' does not have a constant constructor '%s'");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -652,32 +661,32 @@
    *
    * @param typeName the name of the type
    */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 36, "The class '%s' does not have a default constant constructor");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 37, "The class '%s' does not have a default constant constructor");
 
   /**
    * 15.3.1 Typedef: It is a compile-time error if any default values are specified in the signature
    * of a function type alias.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 37, "Default values aren't allowed in typedefs");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 38, "Default values aren't allowed in typedefs");
 
   /**
    * 6.2.1 Required Formals: By means of a function signature that names the parameter and describes
    * its type as a function type. It is a compile-time error if any default values are specified in
    * the signature of such a function type.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 38, "Default values aren't allowed in function type parameters");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 39, "Default values aren't allowed in function type parameters");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> explicitly specifies a default value
    * for an optional parameter.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 39, "Default values aren't allowed in factory constructors that redirect to another constructor");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 40, "Default values aren't allowed in factory constructors that redirect to another constructor");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
    * declared in the same scope.
    */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 40, "The default constructor is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 41, "The default constructor is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -685,7 +694,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 41, "The constructor with name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 42, "The constructor with name '%s' is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -698,7 +707,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 42, "The name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 43, "The name '%s' is already defined");
 
   /**
    * 7. Classes: It is a compile-time error if a class has an instance member and a static member
@@ -710,21 +719,21 @@
    * @param name the name of the conflicting members
    * @see #DUPLICATE_DEFINITION
    */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 43, "The name '%s' is already defined in '%s'");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 44, "The name '%s' is already defined in '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
    * q<sub>j</sub></i> for any <i>i != j</i> [where <i>q<sub>i</sub></i> is the label for a named
    * argument].
    */
-  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 44, "The argument for the named parameter '%s' was already specified");
+  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 45, "The argument for the named parameter '%s' was already specified");
 
   /**
    * SDK implementation libraries can be exported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 45, "The library '%s' is internal and cannot be exported");
+  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 46, "The library '%s' is internal and cannot be exported");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -732,7 +741,7 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 46, "The exported library '%s' must not have a part-of directive");
+  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 47, "The exported library '%s' must not have a part-of directive");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -740,7 +749,7 @@
    *
    * @param typeName the name of the superclass that was not found
    */
-  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 47, "Classes can only extend other classes");
+  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 48, "Classes can only extend other classes");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -759,7 +768,7 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 48, "Classes cannot extend '%s'");
+  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 49, "Classes cannot extend '%s'");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -769,7 +778,7 @@
    * @see #IMPLEMENTS_DEFERRED_CLASS
    * @see #MIXIN_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 49, "This class cannot extend the deferred class '%s'");
+  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 50, "This class cannot extend the deferred class '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -781,21 +790,21 @@
    * @param requiredCount the maximum number of positional arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 50, "%d positional arguments expected, but %d found");
+  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 51, "%d positional arguments expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if more than one initializer corresponding to a given instance variable appears in
    * <i>k</i>'s list.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 51, "The field '%s' cannot be initialized twice in the same constructor");
+  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 52, "The field '%s' cannot be initialized twice in the same constructor");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if <i>k</i>'s initializer list contains an initializer for a variable that is initialized
    * by means of an initializing formal of <i>k</i>.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 52, "Fields cannot be initialized in both the parameter list and the initializers");
+  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 53, "Fields cannot be initialized in both the parameter list and the initializers");
 
   /**
    * 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
@@ -804,19 +813,19 @@
    *
    * @param name the name of the field in question
    */
-  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 53, "'%s' is a final field and so can only be set once");
+  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 54, "'%s' is a final field and so can only be set once");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 54, "Initializing formal fields cannot be used in factory constructors");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 55, "Initializing formal fields cannot be used in factory constructors");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 55, "Initializing formal fields can only be used in constructors");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 56, "Initializing formal fields can only be used in constructors");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -825,7 +834,7 @@
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 56, "The redirecting constructor cannot have a field initializer");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 57, "The redirecting constructor cannot have a field initializer");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -833,7 +842,7 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 57, "'%s' cannot be used to name a getter, there is already a method with the same name");
+  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 58, "'%s' cannot be used to name a getter, there is already a method with the same name");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -843,7 +852,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #MIXIN_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 58, "This class cannot implement the deferred class '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 59, "This class cannot implement the deferred class '%s'");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -862,13 +871,13 @@
    * @param typeName the name of the type that cannot be implemented
    * @see #EXTENDS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 59, "Classes cannot implement '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 60, "Classes cannot implement '%s'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
    * type dynamic.
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 60, "Classes cannot implement 'dynamic'");
+  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 61, "Classes cannot implement 'dynamic'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -877,7 +886,7 @@
    *
    * @param typeName the name of the interface that was not found
    */
-  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 61, "Classes can only implement other classes");
+  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 62, "Classes can only implement other classes");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
@@ -885,7 +894,7 @@
    *
    * @param className the name of the class that is implemented more than once
    */
-  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 62, "'%s' can only be implemented once");
+  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 63, "'%s' can only be implemented once");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
@@ -893,7 +902,7 @@
    *
    * @param className the name of the class that appears in both "extends" and "implements" clauses
    */
-  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 63, "'%s' cannot be used in both 'extends' and 'implements' clauses");
+  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 64, "'%s' cannot be used in both 'extends' and 'implements' clauses");
 
   /**
    * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the right hand side of
@@ -905,14 +914,7 @@
    *
    * @param name the name of the type in question
    */
-  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 64, "Only static members can be accessed in initializers");
-
-  /**
-   * Speculative.
-   *
-   * TODO (jwren) Revisit to remove after we know for sure that this won't be in the Spec.
-   */
-  static const CompileTimeErrorCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = const CompileTimeErrorCode.con1('IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION', 65, "The library '%s' defines a top-level function named 'loadLibrary' and therefore cannot be deferred");
+  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 65, "Only static members can be accessed in initializers");
 
   /**
    * SDK implementation libraries can be imported only by other SDK libraries.
@@ -998,31 +1000,41 @@
   static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 74, "Annotation can be only constant variable or constant constructor invocation");
 
   /**
+   * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
+   * character @, followed by a constant expression that must be either a reference to a
+   * compile-time constant variable, or a call to a constant constructor.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+   * deferred prefix.
+   */
+  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 75, "Constant values from a deferred library cannot be used as annotations");
+
+  /**
    * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
    * constants. Until then, this acts as a placeholder for more informative errors.
    *
    * See TODOs in ConstantVisitor
    */
-  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 75, "Invalid constant value");
+  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 76, "Invalid constant value");
 
   /**
    * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
    * name.
    */
-  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 76, "Invalid constructor name");
+  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 77, "Invalid constructor name");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
    * enclosing class.
    */
-  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 77, "The name of the immediately enclosing class expected");
+  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 78, "The name of the immediately enclosing class expected");
 
   /**
    * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
    * initializer, in a factory constructor, or in a static method or variable initializer, or in the
    * initializer of an instance variable.
    */
-  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 78, "Invalid reference to 'this' expression");
+  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 79, "Invalid reference to 'this' expression");
 
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1030,7 +1042,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 79, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 80, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
@@ -1038,7 +1050,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 80, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 81, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1053,7 +1065,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 81, "Invalid URI syntax: '%s'");
+  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 82, "Invalid URI syntax: '%s'");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1064,7 +1076,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 82, "Cannot reference label '%s' declared in an outer method");
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 83, "Cannot reference label '%s' declared in an outer method");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1075,7 +1087,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 83, "Cannot reference undefined label '%s'");
+  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 84, "Cannot reference undefined label '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1089,7 +1101,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 84, "The element type '%s' cannot be assigned to the list type '%s'");
+  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 85, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1103,7 +1115,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 85, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 86, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1117,13 +1129,13 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 86, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 87, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
    * as <i>C</i>.
    */
-  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 87, "Class members cannot have the same name as the enclosing class");
+  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 88, "Class members cannot have the same name as the enclosing class");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1131,17 +1143,17 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 88, "'%s' cannot be used to name a method, there is already a getter with the same name");
+  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 89, "'%s' cannot be used to name a method, there is already a getter with the same name");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant list literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 89, "List literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 90, "List literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant map literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 90, "Map literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 91, "Map literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
@@ -1149,7 +1161,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 91, "The class '%s' cannot be used as a mixin because it declares a constructor");
+  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 92, "The class '%s' cannot be used as a mixin because it declares a constructor");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if the with clause of a mixin application
@@ -1159,7 +1171,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #IMPLEMENTS_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 92, "This class cannot mixin the deferred class '%s'");
+  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 93, "This class cannot mixin the deferred class '%s'");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1167,7 +1179,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 93, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 94, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1186,43 +1198,43 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 94, "Classes cannot mixin '%s'");
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 95, "Classes cannot mixin '%s'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
    * available in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 95, "Classes can only mixin other classes");
+  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 96, "Classes can only mixin other classes");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
    */
-  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 96, "The class '%s' cannot be used as a mixin because it references 'super'");
+  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 97, "The class '%s' cannot be used as a mixin because it references 'super'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
    * in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 97, "Mixin can only be applied to class");
+  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 98, "Mixin can only be applied to class");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 98, "Constructor may have at most one 'this' redirection");
+  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 99, "Constructor may have at most one 'this' redirection");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
    * include at most one superinitializer in its initializer list or a compile time error occurs.
    */
-  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 99, "Constructor may have at most one 'super' initializer");
+  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 100, "Constructor may have at most one 'super' initializer");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 100, "Annotation creation must have arguments");
+  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 101, "Annotation creation must have arguments");
 
   /**
    * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1232,7 +1244,7 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 101, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 102, "The class '%s' does not have a default constructor");
 
   /**
    * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
@@ -1241,13 +1253,13 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 102, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 103, "The class '%s' does not have a default constructor");
 
   /**
    * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
    * no explicit type arguments appears in a place where a statement is expected.
    */
-  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 103, "A non-constant map literal without type arguments cannot be used as an expression statement");
+  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 104, "A non-constant map literal without type arguments cannot be used as an expression statement");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1257,45 +1269,58 @@
    * s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip; label<sub>njn</sub> case e<sub>n</sub>:
    * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
    * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
+   *
+   * TODO (jwren) For this and all other NON_CONSTANT_* error codes we need a corresponding
+   * NON_CONSTANT_*_FROM_DEFERRED_LIBRARY, see NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY or
+   * CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 104, "Case expressions must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 105, "Case expressions must be constant");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
    * parameter is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 105, "Default values of an optional parameter must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 106, "Default values of an optional parameter must be constant");
+
+  /**
+   * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
+   * parameter is not a compile-time constant.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+   * deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 107, "Constant values from a deferred library cannot be used as a default parameter value");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
    * compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 106, "'const' lists must have all constant values");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 108, "'const' lists must have all constant values");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 107, "The keys in a map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 109, "The keys in a map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 108, "The values in a 'const' map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 110, "The values in a 'const' map must be constant");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 109, "Annotation creation can use only 'const' constructor");
+  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 111, "Annotation creation can use only 'const' constructor");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
    * constant constructor must be a potentially constant expression, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 110, "Initializer expressions in constant constructors must be constants");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 112, "Initializer expressions in constant constructors must be constants");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -1306,7 +1331,7 @@
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 111, "%d required argument(s) expected, but %d found");
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 113, "%d required argument(s) expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1314,17 +1339,17 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 112, "The generative constructor '%s' expected, but factory found");
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 114, "The generative constructor '%s' expected, but factory found");
 
   /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
    */
-  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 113, "");
+  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 115, "");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
    */
-  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 114, "Optional parameters are not allowed when defining an operator");
+  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 116, "Optional parameters are not allowed when defining an operator");
 
   /**
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
@@ -1332,25 +1357,25 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 115, "The included part '%s' must have a part-of directive");
+  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 117, "The included part '%s' must have a part-of directive");
 
   /**
    * 14.1 Imports: It is a compile-time error if the current library declares a top-level member
    * named <i>p</i>.
    */
-  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 116, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 118, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
    * begins with an '_' character.
    */
-  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 117, "Named optional parameters cannot start with an underscore");
+  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 119, "Named optional parameters cannot start with an underscore");
 
   /**
    * 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
    * depends on itself.
    */
-  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 118, "");
+  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 120, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1361,13 +1386,13 @@
    *
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 119, "Cycle in redirecting generative constructors");
+  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 121, "Cycle in redirecting generative constructors");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
    * itself, either directly or indirectly via a sequence of redirections.
    */
-  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 120, "Cycle in redirecting factory constructors");
+  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 122, "Cycle in redirecting factory constructors");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1380,7 +1405,7 @@
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 121, "'%s' cannot be a superinterface of itself: %s");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 123, "'%s' cannot be a superinterface of itself: %s");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1392,7 +1417,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 122, "'%s' cannot extend itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 124, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1404,49 +1429,49 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 123, "'%s' cannot implement itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 125, "'%s' cannot implement itself");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 124, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 126, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 125, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 127, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 126, "Constant factory constructor cannot delegate to a non-constant constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 128, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
    * 5 Variables: A local variable may only be referenced at a source code location that is after
    * its initializer, if any, is complete, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 127, "Local variables cannot be referenced before they are declared");
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 129, "Local variables cannot be referenced before they are declared");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
    * enclosed within a on-catch clause.
    */
-  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 128, "rethrow must be inside of a catch clause");
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 130, "rethrow must be inside of a catch clause");
 
   /**
    * 13.12 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 129, "Constructors cannot return a value");
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 131, "Constructors cannot return a value");
 
   /**
    * 14.1 Imports: It is a compile-time error if a prefix used in a deferred import is used in
    * another import clause.
    */
-  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 130, "The prefix of a deferred import cannot be used in other import directives");
+  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 132, "The prefix of a deferred import cannot be used in other import directives");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1456,19 +1481,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 131, "Invalid context for 'super' invocation");
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 133, "Invalid context for 'super' invocation");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 132, "The redirecting constructor cannot have a 'super' initializer");
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 134, "The redirecting constructor cannot have a 'super' initializer");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if a generative constructor of class Object includes a superinitializer.
    */
-  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 133, "");
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 135, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1487,19 +1512,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 134, "'%s' does not extend '%s'");
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 136, "'%s' does not extend '%s'");
 
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
    * compile time error.
    */
-  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 135, "Type alias cannot reference itself directly or recursively via another typedef");
+  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 137, "Type alias cannot reference itself directly or recursively via another typedef");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 136, "Undefined class '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 138, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1507,7 +1532,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 137, "The class '%s' does not have a generative constructor '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 139, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1515,7 +1540,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 138, "The class '%s' does not have a default generative constructor");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 140, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1527,7 +1552,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 139, "The named parameter '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 141, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1542,7 +1567,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 140, "Target of URI does not exist: '%s'");
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 142, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1554,7 +1579,7 @@
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 141, "URIs cannot use string interpolation");
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 143, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1567,7 +1592,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 142, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 144, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1575,13 +1600,13 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 143, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 145, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 144, "Setters should declare exactly one required parameter");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 146, "Setters should declare exactly one required parameter");
 
   static const List<CompileTimeErrorCode> values = const [
       AMBIGUOUS_EXPORT,
@@ -1605,6 +1630,7 @@
       CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
       CONST_FORMAL_PARAMETER,
       CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
+      CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY,
       CONST_INSTANCE_FIELD,
       CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
       CONST_NOT_INITIALIZED,
@@ -1649,7 +1675,6 @@
       IMPLEMENTS_REPEATED,
       IMPLEMENTS_SUPER_CLASS,
       IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
-      IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
       IMPORT_INTERNAL_LIBRARY,
       IMPORT_OF_NON_LIBRARY,
       INCONSISTENT_CASE_EXPRESSION_TYPES,
@@ -1659,6 +1684,7 @@
       INITIALIZING_FORMAL_FOR_STATIC_FIELD,
       INSTANCE_MEMBER_ACCESS_FROM_STATIC,
       INVALID_ANNOTATION,
+      INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
       INVALID_CONSTANT,
       INVALID_CONSTRUCTOR_NAME,
       INVALID_FACTORY_NAME_NOT_A_CLASS,
@@ -1690,6 +1716,7 @@
       NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
       NON_CONSTANT_CASE_EXPRESSION,
       NON_CONSTANT_DEFAULT_VALUE,
+      NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY,
       NON_CONSTANT_LIST_ELEMENT,
       NON_CONSTANT_MAP_KEY,
       NON_CONSTANT_MAP_VALUE,
@@ -2140,6 +2167,11 @@
   static const HintCode IS_NOT_INT = const HintCode.con1('IS_NOT_INT', 10, "When compiled to JS, this test might return false when the left hand side is a double");
 
   /**
+   * Deferred libraries shouldn't define a top level function 'loadLibrary'.
+   */
+  static const HintCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = const HintCode.con1('IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION', 11, "The library '%s' defines a top-level function named 'loadLibrary' which is hidden by deferring this library");
+
+  /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#INVALID_ASSIGNMENT]
    * would have been generated, if we used propagated information for the warnings.
    *
@@ -2147,7 +2179,7 @@
    * @param lhsTypeName the name of the left hand side type
    * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
    */
-  static const HintCode INVALID_ASSIGNMENT = const HintCode.con1('INVALID_ASSIGNMENT', 11, "A value of type '%s' cannot be assigned to a variable of type '%s'");
+  static const HintCode INVALID_ASSIGNMENT = const HintCode.con1('INVALID_ASSIGNMENT', 12, "A value of type '%s' cannot be assigned to a variable of type '%s'");
 
   /**
    * Generate a hint for methods or functions that have a return type, but do not have a non-void
@@ -2156,39 +2188,39 @@
    *
    * @param returnType the name of the declared return type
    */
-  static const HintCode MISSING_RETURN = const HintCode.con2('MISSING_RETURN', 12, "This function declares a return type of '%s', but does not end with a return statement", "Either add a return statement or change the return type to 'void'");
+  static const HintCode MISSING_RETURN = const HintCode.con2('MISSING_RETURN', 13, "This function declares a return type of '%s', but does not end with a return statement", "Either add a return statement or change the return type to 'void'");
 
   /**
    * A getter with the override annotation does not override an existing getter.
    */
-  static const HintCode OVERRIDE_ON_NON_OVERRIDING_GETTER = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_GETTER', 13, "Getter does not override an inherited getter");
+  static const HintCode OVERRIDE_ON_NON_OVERRIDING_GETTER = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_GETTER', 14, "Getter does not override an inherited getter");
 
   /**
    * A method with the override annotation does not override an existing method.
    */
-  static const HintCode OVERRIDE_ON_NON_OVERRIDING_METHOD = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_METHOD', 14, "Method does not override an inherited method");
+  static const HintCode OVERRIDE_ON_NON_OVERRIDING_METHOD = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_METHOD', 15, "Method does not override an inherited method");
 
   /**
    * A setter with the override annotation does not override an existing setter.
    */
-  static const HintCode OVERRIDE_ON_NON_OVERRIDING_SETTER = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_SETTER', 15, "Setter does not override an inherited setter");
+  static const HintCode OVERRIDE_ON_NON_OVERRIDING_SETTER = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_SETTER', 16, "Setter does not override an inherited setter");
 
   /**
    * Hint for classes that override equals, but not hashCode.
    *
    * @param className the name of the current class
    */
-  static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode.con1('OVERRIDE_EQUALS_BUT_NOT_HASH_CODE', 16, "The class '%s' overrides 'operator==', but not 'get hashCode'");
+  static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode.con1('OVERRIDE_EQUALS_BUT_NOT_HASH_CODE', 17, "The class '%s' overrides 'operator==', but not 'get hashCode'");
 
   /**
    * Type checks of the type `x is! Null` should be done with `x != null`.
    */
-  static const HintCode TYPE_CHECK_IS_NOT_NULL = const HintCode.con1('TYPE_CHECK_IS_NOT_NULL', 17, "Tests for non-null should be done with '!= null'");
+  static const HintCode TYPE_CHECK_IS_NOT_NULL = const HintCode.con1('TYPE_CHECK_IS_NOT_NULL', 18, "Tests for non-null should be done with '!= null'");
 
   /**
    * Type checks of the type `x is Null` should be done with `x == null`.
    */
-  static const HintCode TYPE_CHECK_IS_NULL = const HintCode.con1('TYPE_CHECK_IS_NULL', 18, "Tests for null should be done with '== null'");
+  static const HintCode TYPE_CHECK_IS_NULL = const HintCode.con1('TYPE_CHECK_IS_NULL', 19, "Tests for null should be done with '== null'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_GETTER] or
@@ -2200,7 +2232,7 @@
    * @see StaticTypeWarningCode#UNDEFINED_GETTER
    * @see StaticWarningCode#UNDEFINED_GETTER
    */
-  static const HintCode UNDEFINED_GETTER = const HintCode.con1('UNDEFINED_GETTER', 19, "There is no such getter '%s' in '%s'");
+  static const HintCode UNDEFINED_GETTER = const HintCode.con1('UNDEFINED_GETTER', 20, "There is no such getter '%s' in '%s'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_METHOD] would
@@ -2210,7 +2242,7 @@
    * @param typeName the resolved type name that the method lookup is happening on
    * @see StaticTypeWarningCode#UNDEFINED_METHOD
    */
-  static const HintCode UNDEFINED_METHOD = const HintCode.con1('UNDEFINED_METHOD', 20, "The method '%s' is not defined for the class '%s'");
+  static const HintCode UNDEFINED_METHOD = const HintCode.con1('UNDEFINED_METHOD', 21, "The method '%s' is not defined for the class '%s'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_OPERATOR]
@@ -2220,7 +2252,7 @@
    * @param enclosingType the name of the enclosing type where the operator is being looked for
    * @see StaticTypeWarningCode#UNDEFINED_OPERATOR
    */
-  static const HintCode UNDEFINED_OPERATOR = const HintCode.con1('UNDEFINED_OPERATOR', 21, "There is no such operator '%s' in '%s'");
+  static const HintCode UNDEFINED_OPERATOR = const HintCode.con1('UNDEFINED_OPERATOR', 22, "There is no such operator '%s' in '%s'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_SETTER] or
@@ -2232,27 +2264,27 @@
    * @see StaticTypeWarningCode#UNDEFINED_SETTER
    * @see StaticWarningCode#UNDEFINED_SETTER
    */
-  static const HintCode UNDEFINED_SETTER = const HintCode.con1('UNDEFINED_SETTER', 22, "There is no such setter '%s' in '%s'");
+  static const HintCode UNDEFINED_SETTER = const HintCode.con1('UNDEFINED_SETTER', 23, "There is no such setter '%s' in '%s'");
 
   /**
    * Unnecessary cast.
    */
-  static const HintCode UNNECESSARY_CAST = const HintCode.con1('UNNECESSARY_CAST', 23, "Unnecessary cast");
+  static const HintCode UNNECESSARY_CAST = const HintCode.con1('UNNECESSARY_CAST', 24, "Unnecessary cast");
 
   /**
    * Unnecessary type checks, the result is always true.
    */
-  static const HintCode UNNECESSARY_TYPE_CHECK_FALSE = const HintCode.con1('UNNECESSARY_TYPE_CHECK_FALSE', 24, "Unnecessary type check, the result is always false");
+  static const HintCode UNNECESSARY_TYPE_CHECK_FALSE = const HintCode.con1('UNNECESSARY_TYPE_CHECK_FALSE', 25, "Unnecessary type check, the result is always false");
 
   /**
    * Unnecessary type checks, the result is always false.
    */
-  static const HintCode UNNECESSARY_TYPE_CHECK_TRUE = const HintCode.con1('UNNECESSARY_TYPE_CHECK_TRUE', 25, "Unnecessary type check, the result is always true");
+  static const HintCode UNNECESSARY_TYPE_CHECK_TRUE = const HintCode.con1('UNNECESSARY_TYPE_CHECK_TRUE', 26, "Unnecessary type check, the result is always true");
 
   /**
    * Unused imports are imports which are never not used.
    */
-  static const HintCode UNUSED_IMPORT = const HintCode.con1('UNUSED_IMPORT', 26, "Unused import");
+  static const HintCode UNUSED_IMPORT = const HintCode.con1('UNUSED_IMPORT', 27, "Unused import");
 
   /**
    * Hint for cases where the source expects a method or function to return a non-void result, but
@@ -2260,7 +2292,7 @@
    *
    * @param name the name of the method or function that returns void
    */
-  static const HintCode USE_OF_VOID_RESULT = const HintCode.con1('USE_OF_VOID_RESULT', 27, "The result of '%s' is being used, even though it is declared to be 'void'");
+  static const HintCode USE_OF_VOID_RESULT = const HintCode.con1('USE_OF_VOID_RESULT', 28, "The result of '%s' is being used, even though it is declared to be 'void'");
 
   static const List<HintCode> values = const [
       ARGUMENT_TYPE_NOT_ASSIGNABLE,
@@ -2274,6 +2306,7 @@
       IS_INT,
       IS_NOT_DOUBLE,
       IS_NOT_INT,
+      IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
       INVALID_ASSIGNMENT,
       MISSING_RETURN,
       OVERRIDE_ON_NON_OVERRIDING_GETTER,
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 34c3f4f..93a86b6 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -113,14 +113,6 @@
   }
 
   @override
-  AstNode visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    if (identical(_oldNode, node.identifier)) {
-      return _parser.parseSimpleIdentifier();
-    }
-    return _notAChild(node);
-  }
-
-  @override
   AstNode visitArgumentList(ArgumentList node) {
     if (node.arguments.contains(_oldNode)) {
       return _parser.parseArgument();
@@ -1886,6 +1878,13 @@
       _validateModifiersForGetterOrSetterOrMethod(modifiers);
       _validateFormalParameterList(parameters);
       return _parseMethodDeclarationAfterParameters(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, parameters);
+    } else if (_tokenMatches(_peek(), TokenType.OPEN_CURLY_BRACKET)) {
+      // We have found "TypeName identifier {", and are guessing that this is a getter without the
+      // keyword 'get'.
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_GET, []);
+      _currentToken = _injectToken(new Parser_SyntheticKeywordToken(Keyword.GET, _currentToken.offset));
+      return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
     }
     return _parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, _validateModifiersForField(modifiers), type);
   }
@@ -3422,23 +3421,6 @@
   }
 
   /**
-   * Parse an argument definition test.
-   *
-   * <pre>
-   * argumentDefinitionTest ::=
-   *     '?' identifier
-   * </pre>
-   *
-   * @return the argument definition test that was parsed
-   */
-  ArgumentDefinitionTest _parseArgumentDefinitionTest() {
-    Token question = _expect(TokenType.QUESTION);
-    SimpleIdentifier identifier = parseSimpleIdentifier();
-    _reportErrorForToken(ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST, question, []);
-    return new ArgumentDefinitionTest(question, identifier);
-  }
-
-  /**
    * Parse an assert statement.
    *
    * <pre>
@@ -5788,8 +5770,10 @@
       }
     } else if (_matches(TokenType.LT)) {
       return _parseListOrMapLiteral(null);
-    } else if (_matches(TokenType.QUESTION)) {
-      return _parseArgumentDefinitionTest();
+    } else if (_matches(TokenType.QUESTION) && _tokenMatches(_peek(), TokenType.IDENTIFIER)) {
+      _reportErrorForCurrentToken(ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
+      _advance();
+      return _parsePrimaryExpression();
     } else if (_matchesKeyword(Keyword.VOID)) {
       //
       // Recover from having a return type of "void" where a return type is not expected.
@@ -7472,119 +7456,119 @@
 
   static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = const ParserErrorCode.con3('CONTINUE_WITHOUT_LABEL_IN_CASE', 19, "A continue statement in a switch statement must have a label as a target");
 
-  static const ParserErrorCode DEPRECATED_ARGUMENT_DEFINITION_TEST = const ParserErrorCode.con3('DEPRECATED_ARGUMENT_DEFINITION_TEST', 20, "The argument definition test ('?' operator) has been deprecated");
+  static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = const ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 20, "The 'typedef' mixin application was replaced with 'class'");
 
-  static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = const ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 21, "The 'typedef' mixin application was replaced with 'class'");
+  static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = const ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 21, "Directives must appear before any declarations");
 
-  static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = const ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 22, "Directives must appear before any declarations");
+  static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 22, "The label %s was already used in this switch statement");
 
-  static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 23, "The label %s was already used in this switch statement");
+  static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 23, "The modifier '%s' was already specified.");
 
-  static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 24, "The modifier '%s' was already specified.");
+  static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = const ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 24, "Equality expression cannot be operand of another equality expression.");
 
-  static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = const ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 25, "Equality expression cannot be operand of another equality expression.");
+  static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 25, "Expected 'case' or 'default'");
 
-  static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 26, "Expected 'case' or 'default'");
+  static const ParserErrorCode EXPECTED_CLASS_MEMBER = const ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 26, "Expected a class member");
 
-  static const ParserErrorCode EXPECTED_CLASS_MEMBER = const ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 27, "Expected a class member");
+  static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode.con3('EXPECTED_EXECUTABLE', 27, "Expected a method, getter, setter or operator declaration");
 
-  static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode.con3('EXPECTED_EXECUTABLE', 28, "Expected a method, getter, setter or operator declaration");
+  static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = const ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 28, "Expected a list or map literal");
 
-  static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = const ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 29, "Expected a list or map literal");
+  static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 29, "Expected a string literal");
 
-  static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 30, "Expected a string literal");
+  static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 30, "Expected to find '%s'");
 
-  static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 31, "Expected to find '%s'");
+  static const ParserErrorCode EXPECTED_TYPE_NAME = const ParserErrorCode.con3('EXPECTED_TYPE_NAME', 31, "Expected a type name");
 
-  static const ParserErrorCode EXPECTED_TYPE_NAME = const ParserErrorCode.con3('EXPECTED_TYPE_NAME', 32, "Expected a type name");
+  static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 32, "Export directives must preceed part directives");
 
-  static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 33, "Export directives must preceed part directives");
+  static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 33, "The modifier 'external' should be before the modifier 'const'");
 
-  static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 34, "The modifier 'external' should be before the modifier 'const'");
+  static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 34, "The modifier 'external' should be before the modifier 'factory'");
 
-  static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 35, "The modifier 'external' should be before the modifier 'factory'");
+  static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 35, "The modifier 'external' should be before the modifier 'static'");
 
-  static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 36, "The modifier 'external' should be before the modifier 'static'");
+  static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode.con3('EXTERNAL_CLASS', 36, "Classes cannot be declared to be 'external'");
 
-  static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode.con3('EXTERNAL_CLASS', 37, "Classes cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 37, "External constructors cannot have a body");
 
-  static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 38, "External constructors cannot have a body");
+  static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode.con3('EXTERNAL_FIELD', 38, "Fields cannot be declared to be 'external'");
 
-  static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode.con3('EXTERNAL_FIELD', 39, "Fields cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 39, "External getters cannot have a body");
 
-  static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 40, "External getters cannot have a body");
+  static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 40, "External methods cannot have a body");
 
-  static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 41, "External methods cannot have a body");
+  static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 41, "External operators cannot have a body");
 
-  static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 42, "External operators cannot have a body");
+  static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 42, "External setters cannot have a body");
 
-  static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 43, "External setters cannot have a body");
+  static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode.con3('EXTERNAL_TYPEDEF', 43, "Type aliases cannot be declared to be 'external'");
 
-  static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode.con3('EXTERNAL_TYPEDEF', 44, "Type aliases cannot be declared to be 'external'");
+  static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 44, "Top-level declarations cannot be declared to be 'factory'");
 
-  static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 45, "Top-level declarations cannot be declared to be 'factory'");
+  static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 45, "A non-redirecting 'factory' constructor must have a body");
 
-  static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 46, "A non-redirecting 'factory' constructor must have a body");
+  static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 46, "Field initializers can only be used in a constructor");
 
-  static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 47, "Field initializers can only be used in a constructor");
+  static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode.con3('FINAL_AND_VAR', 47, "Members cannot be declared to be both 'final' and 'var'");
 
-  static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode.con3('FINAL_AND_VAR', 48, "Members cannot be declared to be both 'final' and 'var'");
+  static const ParserErrorCode FINAL_CLASS = const ParserErrorCode.con3('FINAL_CLASS', 48, "Classes cannot be declared to be 'final'");
 
-  static const ParserErrorCode FINAL_CLASS = const ParserErrorCode.con3('FINAL_CLASS', 49, "Classes cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode.con3('FINAL_CONSTRUCTOR', 49, "A constructor cannot be declared to be 'final'");
 
-  static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode.con3('FINAL_CONSTRUCTOR', 50, "A constructor cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_METHOD = const ParserErrorCode.con3('FINAL_METHOD', 50, "Getters, setters and methods cannot be declared to be 'final'");
 
-  static const ParserErrorCode FINAL_METHOD = const ParserErrorCode.con3('FINAL_METHOD', 51, "Getters, setters and methods cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode.con3('FINAL_TYPEDEF', 51, "Type aliases cannot be declared to be 'final'");
 
-  static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode.con3('FINAL_TYPEDEF', 52, "Type aliases cannot be declared to be 'final'");
+  static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 52, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
 
-  static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 53, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
+  static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode.con3('GETTER_IN_FUNCTION', 53, "Getters cannot be defined within methods or functions");
 
-  static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode.con3('GETTER_IN_FUNCTION', 54, "Getters cannot be defined within methods or functions");
+  static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 54, "Getter should be declared without a parameter list");
 
-  static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 55, "Getter should be declared without a parameter list");
+  static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = const ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 55, "Illegal assignment to non-assignable expression");
 
-  static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = const ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 56, "Illegal assignment to non-assignable expression");
+  static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 56, "The extends clause must be before the implements clause");
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 57, "The extends clause must be before the implements clause");
+  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 57, "The with clause must be before the implements clause");
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 58, "The with clause must be before the implements clause");
+  static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 58, "Import directives must preceed part directives");
 
-  static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 59, "Import directives must preceed part directives");
+  static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 59, "The loop variable in a for-each loop cannot be initialized");
 
-  static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 60, "The loop variable in a for-each loop cannot be initialized");
+  static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 60, "The escape sequence '%s' is not a valid code point");
 
-  static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 61, "The escape sequence '%s' is not a valid code point");
+  static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 61, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
 
-  static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 62, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
+  static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode.con3('INVALID_HEX_ESCAPE', 62, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
 
-  static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode.con3('INVALID_HEX_ESCAPE', 63, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
+  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 63, "The string '%s' is not a valid operator");
 
-  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 64, "The string '%s' is not a valid operator");
+  static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 64, "The operator '%s' cannot be used with 'super'");
 
-  static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 65, "The operator '%s' cannot be used with 'super'");
+  static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 65, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
 
-  static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 66, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
+  static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = const ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 66, "The library directive must appear before all other directives");
 
-  static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = const ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 67, "The library directive must appear before all other directives");
+  static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = const ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 67, "Local function declarations cannot specify any modifier");
 
-  static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = const ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 68, "Local function declarations cannot specify any modifier");
+  static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = const ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 68, "Missing selector such as \".<identifier>\" or \"[0]\"");
 
-  static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = const ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 69, "Missing selector such as \".<identifier>\" or \"[0]\"");
+  static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 69, "A try statement must have either a catch or finally clause");
 
-  static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 70, "A try statement must have either a catch or finally clause");
+  static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode.con3('MISSING_CLASS_BODY', 70, "A class definition must have a body, even if it is empty");
 
-  static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode.con3('MISSING_CLASS_BODY', 71, "A class definition must have a body, even if it is empty");
+  static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = const ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 71, "The closing parenthesis is missing");
 
-  static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = const ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 72, "The closing parenthesis is missing");
+  static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 72, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
 
-  static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 73, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
+  static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = const ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 73, "Throw expressions must compute the object to be thrown");
 
-  static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = const ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 74, "Throw expressions must compute the object to be thrown");
+  static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode.con3('MISSING_FUNCTION_BODY', 74, "A function body must be provided");
 
-  static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode.con3('MISSING_FUNCTION_BODY', 75, "A function body must be provided");
+  static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = const ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 75, "Functions must have an explicit list of parameters");
 
-  static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = const ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 76, "Functions must have an explicit list of parameters");
+  static const ParserErrorCode MISSING_GET = const ParserErrorCode.con3('MISSING_GET', 76, "Getters must have the keyword 'get' before the getter name");
 
   static const ParserErrorCode MISSING_IDENTIFIER = const ParserErrorCode.con3('MISSING_IDENTIFIER', 77, "Expected an identifier");
 
@@ -7719,7 +7703,6 @@
       CONSTRUCTOR_WITH_RETURN_TYPE,
       CONTINUE_OUTSIDE_OF_LOOP,
       CONTINUE_WITHOUT_LABEL_IN_CASE,
-      DEPRECATED_ARGUMENT_DEFINITION_TEST,
       DEPRECATED_CLASS_TYPE_ALIAS,
       DIRECTIVE_AFTER_DECLARATION,
       DUPLICATE_LABEL_IN_SWITCH_STATEMENT,
@@ -7776,6 +7759,7 @@
       MISSING_EXPRESSION_IN_THROW,
       MISSING_FUNCTION_BODY,
       MISSING_FUNCTION_PARAMETERS,
+      MISSING_GET,
       MISSING_IDENTIFIER,
       MISSING_KEYWORD_OPERATOR,
       MISSING_NAME_IN_LIBRARY_DIRECTIVE,
@@ -7936,17 +7920,6 @@
   }
 
   @override
-  bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    ArgumentDefinitionTest toNode = this._toNode as ArgumentDefinitionTest;
-    if (javaBooleanAnd(_isEqualTokens(node.question, toNode.question), _isEqualNodes(node.identifier, toNode.identifier))) {
-      toNode.propagatedType = node.propagatedType;
-      toNode.staticType = node.staticType;
-      return true;
-    }
-    return false;
-  }
-
-  @override
   bool visitArgumentList(ArgumentList node) {
     ArgumentList toNode = this._toNode as ArgumentList;
     return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), _isEqualNodeLists(node.arguments, toNode.arguments)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
@@ -8938,7 +8911,6 @@
   'matchesString_1': new MethodTrampoline(1, (Parser target, arg0) => target._matchesString(arg0)),
   'optional_1': new MethodTrampoline(1, (Parser target, arg0) => target._optional(arg0)),
   'parseAdditiveExpression_0': new MethodTrampoline(0, (Parser target) => target._parseAdditiveExpression()),
-  'parseArgumentDefinitionTest_0': new MethodTrampoline(0, (Parser target) => target._parseArgumentDefinitionTest()),
   'parseAssertStatement_0': new MethodTrampoline(0, (Parser target) => target._parseAssertStatement()),
   'parseAssignableExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseAssignableExpression(arg0)),
   'parseAssignableSelector_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseAssignableSelector(arg0, arg1)),
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index a71751a9..f106655 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -744,6 +744,12 @@
   @override
   Object visitImportDirective(ImportDirective node) {
     _checkForDeprecatedMemberUse(node.uriElement, node);
+    ImportElement importElement = node.element;
+    if (importElement != null) {
+      if (importElement.isDeferred) {
+        _checkForLoadLibraryFunction(node, importElement);
+      }
+    }
     return super.visitImportDirective(node);
   }
 
@@ -1065,8 +1071,8 @@
     if (lhs == null || rhs == null) {
       return false;
     }
-    VariableElement leftElement = ErrorVerifier.getVariableElement(lhs);
-    DartType leftType = (leftElement == null) ? ErrorVerifier.getStaticType(lhs) : leftElement.type;
+    VariableElement leftVariableElement = ErrorVerifier.getVariableElement(lhs);
+    DartType leftType = (leftVariableElement == null) ? ErrorVerifier.getStaticType(lhs) : leftVariableElement.type;
     DartType staticRightType = ErrorVerifier.getStaticType(rhs);
     if (!staticRightType.isAssignableTo(leftType)) {
       // The warning was generated on this rhs
@@ -1079,8 +1085,12 @@
         String leftName = leftType.displayName;
         String rightName = bestRightType.displayName;
         if (leftName == rightName) {
-          leftName = ErrorVerifier.getExtendedDisplayName(leftType);
-          rightName = ErrorVerifier.getExtendedDisplayName(bestRightType);
+          Element leftElement = leftType.element;
+          Element rightElement = bestRightType.element;
+          if (leftElement != null && rightElement != null) {
+            leftName = leftElement.extendedDisplayName;
+            rightName = rightElement.extendedDisplayName;
+          }
         }
         _errorReporter.reportErrorForNode(HintCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
         return true;
@@ -1090,6 +1100,27 @@
   }
 
   /**
+   * Check that the imported library does not define a loadLibrary function. The import has already
+   * been determined to be deferred when this is called.
+   *
+   * @param node the import directive to evaluate
+   * @param importElement the [ImportElement] retrieved from the node
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION
+   */
+  bool _checkForLoadLibraryFunction(ImportDirective node, ImportElement importElement) {
+    LibraryElement importedLibrary = importElement.importedLibrary;
+    if (importedLibrary == null) {
+      return false;
+    }
+    if (importedLibrary.hasLoadLibraryFunction) {
+      _errorReporter.reportErrorForNode(HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION, node, [importedLibrary.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
    * Generate a hint for functions or methods that have a return type, but do not have a return
    * statement on all branches. At the end of blocks with no return, Dart implicitly returns
    * `null`, avoiding these implicit returns is considered a best practice.
@@ -1462,8 +1493,16 @@
         //
         result = _validate(initializer, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
         element.evaluationResult = result;
+        return null;
       } else if (result is ErrorResult) {
         _reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
+        return null;
+      }
+      DeferredLibraryReferenceDetector referenceDetector = new DeferredLibraryReferenceDetector();
+      initializer.accept(referenceDetector);
+      if (referenceDetector.result) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY, initializer, []);
+        return null;
       }
     }
     return null;
@@ -1537,6 +1576,11 @@
           EvaluationResultImpl result = _validate(defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
           VariableElementImpl element = parameter.element as VariableElementImpl;
           element.evaluationResult = result;
+          DeferredLibraryReferenceDetector referenceDetector = new DeferredLibraryReferenceDetector();
+          defaultValue.accept(referenceDetector);
+          if (result is ValidResult && referenceDetector.result) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY, defaultValue, []);
+          }
         }
       }
     }
@@ -1771,19 +1815,7 @@
   @override
   Object visitBlock(Block node) {
     NodeList<Statement> statements = node.statements;
-    int size = statements.length;
-    for (int i = 0; i < size; i++) {
-      Statement currentStatement = statements[i];
-      _safelyVisit(currentStatement);
-      if (currentStatement is ReturnStatement && i != size - 1) {
-        Statement nextStatement = statements[i + 1];
-        Statement lastStatement = statements[size - 1];
-        int offset = nextStatement.offset;
-        int length = lastStatement.end - offset;
-        _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length, []);
-        return null;
-      }
-    }
+    _checkForDeadStatementsInNodeList(statements);
     return null;
   }
 
@@ -1837,6 +1869,18 @@
   }
 
   @override
+  Object visitSwitchCase(SwitchCase node) {
+    _checkForDeadStatementsInNodeList(node.statements);
+    return super.visitSwitchCase(node);
+  }
+
+  @override
+  Object visitSwitchDefault(SwitchDefault node) {
+    _checkForDeadStatementsInNodeList(node.statements);
+    return super.visitSwitchDefault(node);
+  }
+
+  @override
   Object visitTryStatement(TryStatement node) {
     _safelyVisit(node.body);
     _safelyVisit(node.finallyBlock);
@@ -1854,10 +1898,10 @@
           if (currentType.isObject) {
             // Found catch clause clause that has Object as an exception type, this is equivalent to
             // having a catch clause that doesn't have an exception type, visit the block, but
-            // generate an error on any following catch clauses (and don't visit them).
+             // generate an error on any following catch clauses (and don't visit them).
             _safelyVisit(catchClause);
             if (i + 1 != numOfCatchClauses) {
-              // this catch clause is not the last in the try statement
+               // this catch clause is not the last in the try statement
               CatchClause nextCatchClause = catchClauses[i + 1];
               CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
               int offset = nextCatchClause.offset;
@@ -1879,7 +1923,7 @@
         }
         _safelyVisit(catchClause);
       } else {
-        // Found catch clause clause that doesn't have an exception type, visit the block, but
+         // Found catch clause clause that doesn't have an exception type, visit the block, but
         // generate an error on any following catch clauses (and don't visit them).
         _safelyVisit(catchClause);
         if (i + 1 != numOfCatchClauses) {
@@ -1915,6 +1959,30 @@
   }
 
   /**
+   * Given some [NodeList] of [Statement]s, from either a [Block] or
+   * [SwitchMember], this loops through the list in reverse order searching for statements
+   * after a return, unlabeled break or unlabeled continue statement to mark them as dead code.
+   *
+   * @param statements some ordered list of statements in a [Block] or [SwitchMember]
+   */
+  void _checkForDeadStatementsInNodeList(NodeList<Statement> statements) {
+    int size = statements.length;
+    for (int i = 0; i < size; i++) {
+      Statement currentStatement = statements[i];
+      _safelyVisit(currentStatement);
+      bool returnOrBreakingStatement = currentStatement is ReturnStatement || (currentStatement is BreakStatement && currentStatement.label == null) || (currentStatement is ContinueStatement && currentStatement.label == null);
+      if (returnOrBreakingStatement && i != size - 1) {
+        Statement nextStatement = statements[i + 1];
+        Statement lastStatement = statements[size - 1];
+        int offset = nextStatement.offset;
+        int length = lastStatement.end - offset;
+        _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length, []);
+        return;
+      }
+    }
+  }
+
+  /**
    * Given some [Expression], this method returns [ValidResult#RESULT_TRUE] if it is
    * `true`, [ValidResult#RESULT_FALSE] if it is `false`, or `null` if the
    * expression is not a constant boolean value.
@@ -1934,15 +2002,24 @@
     }
     // Don't consider situations where we could evaluate to a constant boolean expression with the
     // ConstantVisitor
-    //    else {
-    //      EvaluationResultImpl result = expression.accept(new ConstantVisitor());
-    //      if (result == ValidResult.RESULT_TRUE) {
-    //        return ValidResult.RESULT_TRUE;
-    //      } else if (result == ValidResult.RESULT_FALSE) {
-    //        return ValidResult.RESULT_FALSE;
-    //      }
-    //      return null;
-    //    }
+//
+       // else {
+//
+         // EvaluationResultImpl result = expression.accept(new ConstantVisitor());
+//
+         // if (result == ValidResult.RESULT_TRUE) {
+//
+           // return ValidResult.RESULT_TRUE;
+//
+         // } else if (result == ValidResult.RESULT_FALSE) {
+//
+           // return ValidResult.RESULT_FALSE;
+//
+         // }
+//
+         // return null;
+//
+       // }
     return null;
   }
 
@@ -4431,18 +4508,6 @@
   TypePromotionManager _promoteManager;
 
   /**
-   * The name of the method that can be implemented by a class to allow its instances to be invoked
-   * as if they were a function.
-   */
-  static String CALL_METHOD_NAME = "call";
-
-  /**
-   * The name of the method that will be invoked if an attempt is made to invoke an undefined method
-   * on an object.
-   */
-  static String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
-
-  /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    *
    * @param resolver the resolver driving this participant
@@ -4865,7 +4930,7 @@
     if (target == null) {
       staticElement = _resolveInvokedElement(methodName);
       propagatedElement = null;
-    } else if (_isDeferredPrefix(target) && methodName.name == FunctionElement.LOAD_LIBRARY_NAME) {
+    } else if (methodName.name == FunctionElement.LOAD_LIBRARY_NAME && _isDeferredPrefix(target)) {
       LibraryElement importedLibrary = _getImportedLibrary(target);
       methodName.staticElement = importedLibrary.loadLibraryFunction;
       return null;
@@ -4965,7 +5030,7 @@
             targetType = _getStaticType(target);
           }
         }
-        if (targetType != null && targetType.isDartCoreFunction && methodName.name == CALL_METHOD_NAME) {
+        if (targetType != null && targetType.isDartCoreFunction && methodName.name == FunctionElement.CALL_METHOD_NAME) {
           // TODO(brianwilkerson) Can we ever resolve the function being invoked?
           //resolveArgumentsToParameters(node.getArgumentList(), invokedFunction);
           return null;
@@ -5025,7 +5090,15 @@
     SimpleIdentifier prefix = node.prefix;
     SimpleIdentifier identifier = node.identifier;
     //
-    // First, check to see whether the prefix is really a prefix.
+    // First, check the "lib.loadLibrary" case
+    //
+    if (identifier.name == FunctionElement.LOAD_LIBRARY_NAME && _isDeferredPrefix(prefix)) {
+      LibraryElement importedLibrary = _getImportedLibrary(prefix);
+      identifier.staticElement = importedLibrary.loadLibraryFunction;
+      return null;
+    }
+    //
+    // Check to see whether the prefix is really a prefix.
     //
     Element prefixElement = prefix.staticElement;
     if (prefixElement is PrefixElement) {
@@ -5431,7 +5504,7 @@
       if (getterType != null) {
         DartType getterReturnType = getterType.returnType;
         if (getterReturnType is InterfaceType) {
-          MethodElement callMethod = getterReturnType.lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
+          MethodElement callMethod = getterReturnType.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
           if (callMethod != null) {
             return _resolveArgumentsToFunction(false, argumentList, callMethod);
           }
@@ -5453,7 +5526,7 @@
         return _resolveArgumentsToParameters(false, argumentList, parameters);
       } else if (type is InterfaceType) {
         // "call" invocation
-        MethodElement callMethod = type.lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
+        MethodElement callMethod = type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
         if (callMethod != null) {
           List<ParameterElement> parameters = callMethod.parameters;
           return _resolveArgumentsToParameters(false, argumentList, parameters);
@@ -5639,7 +5712,7 @@
       if (classElement.isProxy && type.isSubtypeOf(_resolver.typeProvider.functionType)) {
         return true;
       }
-      MethodElement methodElement = classElement.lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
+      MethodElement methodElement = classElement.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
       return methodElement != null;
     }
     return false;
@@ -6811,24 +6884,6 @@
  */
 class ErrorVerifier extends RecursiveAstVisitor<Object> {
   /**
-   * Return a display name for the given type that includes the path to the compilation unit in
-   * which the type is defined.
-   *
-   * @param type the type for which an extended display name is to be returned
-   * @return a display name that can help distiguish between two types with the same name
-   */
-  static String getExtendedDisplayName(DartType type) {
-    Element element = type.element;
-    if (element != null) {
-      Source source = element.source;
-      if (source != null) {
-        return "${type.displayName} (${source.fullName})";
-      }
-    }
-    return type.displayName;
-  }
-
-  /**
    * Return the static type of the given expression that is to be used for type analysis.
    *
    * @param expression the expression whose type is to be returned
@@ -7090,6 +7145,12 @@
   }
 
   @override
+  Object visitAnnotation(Annotation node) {
+    _checkForInvalidAnnotationFromDeferredLibrary(node);
+    return super.visitAnnotation(node);
+  }
+
+  @override
   Object visitArgumentList(ArgumentList node) {
     _checkForArgumentTypesNotAssignableInList(node);
     return super.visitArgumentList(node);
@@ -7104,13 +7165,15 @@
   @override
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.TokenType operatorType = node.operator.type;
+    Expression lhs = node.leftHandSide;
+    Expression rhs = node.rightHandSide;
     if (operatorType == sc.TokenType.EQ) {
-      _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
+      _checkForInvalidAssignment(lhs, rhs);
     } else {
-      _checkForInvalidCompoundAssignment(node);
+      _checkForInvalidCompoundAssignment(node, lhs, rhs);
     }
-    _checkForAssignmentToFinal(node.leftHandSide);
-    _checkForArgumentTypeNotAssignableForArgument(node.rightHandSide);
+    _checkForAssignmentToFinal(lhs);
+    _checkForArgumentTypeNotAssignableForArgument(rhs);
     return super.visitAssignmentExpression(node);
   }
 
@@ -7192,9 +7255,8 @@
         }
       }
       // initialize initialFieldElementsMap
-      ClassElement classElement = node.element;
-      if (classElement != null) {
-        List<FieldElement> fieldElements = classElement.fields;
+      if (_enclosingClass != null) {
+        List<FieldElement> fieldElements = _enclosingClass.fields;
         _initialFieldElementsMap = new Map<FieldElement, INIT_STATE>();
         for (FieldElement fieldElement in fieldElements) {
           if (!fieldElement.isSynthetic) {
@@ -7219,12 +7281,13 @@
     ClassElement outerClassElement = _enclosingClass;
     try {
       _enclosingClass = node.element;
+      ImplementsClause implementsClause = node.implementsClause;
       // Only check for all of the inheritance logic around clauses if there isn't an error code
       // such as "Cannot extend double" already on the class.
-      if (!_checkForExtendsDisallowedClassInTypeAlias(node) && !_checkForImplementsDisallowedClass(node.implementsClause) && !_checkForAllMixinErrorCodes(node.withClause)) {
+      if (!_checkForExtendsDisallowedClassInTypeAlias(node) && !_checkForImplementsDisallowedClass(implementsClause) && !_checkForAllMixinErrorCodes(node.withClause)) {
         _checkForExtendsDeferredClassInTypeAlias(node);
-        _checkForImplementsDeferredClass(node.implementsClause);
-        _checkForRecursiveInterfaceInheritance(node.element);
+        _checkForImplementsDeferredClass(implementsClause);
+        _checkForRecursiveInterfaceInheritance(_enclosingClass);
         _checkForTypeAliasCannotReferenceItself_mixin(node);
         _checkForNonAbstractClassInheritsAbstractMember(node.name);
       }
@@ -7260,20 +7323,21 @@
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
-      _enclosingFunction = node.element;
+      ConstructorElement constructorElement = node.element;
+      _enclosingFunction = constructorElement;
       _isEnclosingConstructorConst = node.constKeyword != null;
-      _checkForConstConstructorWithNonFinalField(node);
+      _checkForConstConstructorWithNonFinalField(node, constructorElement);
       _checkForConstConstructorWithNonConstSuper(node);
-      _checkForConflictingConstructorNameAndMember(node);
+      _checkForConflictingConstructorNameAndMember(node, constructorElement);
       _checkForAllFinalInitializedErrorCodes(node);
       _checkForRedirectingConstructorErrorCodes(node);
       _checkForMultipleSuperInitializers(node);
-      _checkForRecursiveConstructorRedirect(node);
-      if (!_checkForRecursiveFactoryRedirect(node)) {
+      _checkForRecursiveConstructorRedirect(node, constructorElement);
+      if (!_checkForRecursiveFactoryRedirect(node, constructorElement)) {
         _checkForAllRedirectConstructorErrorCodes(node);
       }
       _checkForUndefinedConstructorInInitializerImplicit(node);
-      _checkForRedirectToNonConstConstructor(node);
+      _checkForRedirectToNonConstConstructor(node, constructorElement);
       _checkForReturnInGenerativeConstructor(node);
       return super.visitConstructorDeclaration(node);
     } finally {
@@ -7286,8 +7350,10 @@
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     _isInConstructorInitializer = true;
     try {
-      _checkForInvalidField(node);
-      _checkForFieldInitializerNotAssignable(node);
+      SimpleIdentifier fieldName = node.fieldName;
+      Element staticElement = fieldName.staticElement;
+      _checkForInvalidField(node, fieldName, staticElement);
+      _checkForFieldInitializerNotAssignable(node, staticElement);
       return super.visitConstructorFieldInitializer(node);
     } finally {
       _isInConstructorInitializer = false;
@@ -7323,8 +7389,9 @@
   Object visitExportDirective(ExportDirective node) {
     ExportElement exportElement = node.element;
     if (exportElement != null) {
-      _checkForAmbiguousExport(node, exportElement);
-      _checkForExportDuplicateLibraryName(node, exportElement);
+      LibraryElement exportedLibrary = exportElement.exportedLibrary;
+      _checkForAmbiguousExport(node, exportElement, exportedLibrary);
+      _checkForExportDuplicateLibraryName(node, exportElement, exportedLibrary);
       _checkForExportInternalLibrary(node, exportElement);
     }
     return super.visitExportDirective(node);
@@ -7377,18 +7444,18 @@
         methodName = identifier.name;
       }
       _enclosingFunction = node.element;
+      TypeName returnType = node.returnType;
       if (node.isSetter || node.isGetter) {
         _checkForMismatchedAccessorTypes(node, methodName);
         if (node.isSetter) {
           FunctionExpression functionExpression = node.functionExpression;
           if (functionExpression != null) {
-            _checkForWrongNumberOfParametersForSetter(node.name, functionExpression.parameters);
+            _checkForWrongNumberOfParametersForSetter(identifier, functionExpression.parameters);
           }
-          TypeName returnType = node.returnType;
           _checkForNonVoidReturnTypeForSetter(returnType);
         }
       }
-      _checkForTypeAnnotationDeferredClass(node.returnType);
+      _checkForTypeAnnotationDeferredClass(returnType);
       return super.visitFunctionDeclaration(node);
     } finally {
       _enclosingFunction = outerFunction;
@@ -7454,9 +7521,6 @@
     if (importElement != null) {
       _checkForImportDuplicateLibraryName(node, importElement);
       _checkForImportInternalLibrary(node, importElement);
-      if (importElement.isDeferred) {
-        _checkForLoadLibraryFunction(node, importElement);
-      }
     }
     return super.visitImportDirective(node);
   }
@@ -7479,11 +7543,11 @@
         _checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
         if (_isInConstInstanceCreation) {
           _checkForConstWithNonConst(node);
-          _checkForConstWithUndefinedConstructor(node);
-          _checkForConstWithTypeParametersInCreation(node);
+          _checkForConstWithUndefinedConstructor(node, constructorName, typeName);
+          _checkForConstWithTypeParameters(typeName);
           _checkForConstDeferredClass(node, constructorName, typeName);
         } else {
-          _checkForNewWithUndefinedConstructor(node);
+          _checkForNewWithUndefinedConstructor(node, constructorName, typeName);
         }
       }
       return super.visitInstanceCreationExpression(node);
@@ -7494,17 +7558,17 @@
 
   @override
   Object visitListLiteral(ListLiteral node) {
-    if (node.constKeyword != null) {
-      TypeArgumentList typeArguments = node.typeArguments;
-      if (typeArguments != null) {
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      if (node.constKeyword != null) {
         NodeList<TypeName> arguments = typeArguments.arguments;
         if (arguments.length != 0) {
           _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
         }
       }
+      _checkForExpectedOneListTypeArgument(node, typeArguments);
+      _checkForListElementTypeNotAssignable(node, typeArguments);
     }
-    _checkForExpectedOneListTypeArgument(node);
-    _checkForListElementTypeNotAssignable(node);
     return super.visitListLiteral(node);
   }
 
@@ -7518,10 +7582,10 @@
           _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
         }
       }
+      _checkExpectedTwoMapTypeArguments(typeArguments);
+      _checkForMapTypeNotAssignable(node, typeArguments);
     }
-    _checkExpectedTwoMapTypeArguments(typeArguments);
     _checkForNonConstMapAsExpressionStatement(node);
-    _checkForMapTypeNotAssignable(node);
     _checkForConstMapKeyExpressionTypeImplementsEquals(node);
     return super.visitMapLiteral(node);
   }
@@ -7713,6 +7777,15 @@
   }
 
   @override
+  Object visitTypeArgumentList(TypeArgumentList node) {
+    NodeList<TypeName> list = node.arguments;
+    for (TypeName typeName in list) {
+      _checkForTypeAnnotationDeferredClass(typeName);
+    }
+    return super.visitTypeArgumentList(node);
+  }
+
+  @override
   Object visitTypeName(TypeName node) {
     _checkForTypeArgumentNotMatchingBounds(node);
     _checkForTypeParameterReferencedByStatic(node);
@@ -7772,15 +7845,11 @@
   /**
    * This verifies if the passed map literal has type arguments then there is exactly two.
    *
-   * @param node the map literal to evaluate
+   * @param typeArguments the type arguments, always non-`null`
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#EXPECTED_TWO_MAP_TYPE_ARGUMENTS
    */
   bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
-    // has type arguments
-    if (typeArguments == null) {
-      return false;
-    }
     // check number of type arguments
     int num = typeArguments.arguments.length;
     if (num == 2) {
@@ -8394,12 +8463,11 @@
    * @param node the export directive node to report problem on
    * @param exportElement the [ExportElement] retrieved from the node, if the element in the
    *          node was `null`, then this method is not called
+   * @param exportedLibrary the library element containing the exported element
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
    */
-  bool _checkForAmbiguousExport(ExportDirective node, ExportElement exportElement) {
-    // prepare exported library
-    LibraryElement exportedLibrary = exportElement.exportedLibrary;
+  bool _checkForAmbiguousExport(ExportDirective node, ExportElement exportElement, LibraryElement exportedLibrary) {
     if (exportedLibrary == null) {
       return false;
     }
@@ -8688,14 +8756,14 @@
    * members of the same class.
    *
    * @param node the constructor declaration to evaluate
+   * @param constructorElement the constructor element
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
    * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME
    * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
    * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD
    */
-  bool _checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) {
-    ConstructorElement constructorElement = node.element;
+  bool _checkForConflictingConstructorNameAndMember(ConstructorDeclaration node, ConstructorElement constructorElement) {
     SimpleIdentifier constructorName = node.name;
     String name = constructorElement.name;
     ClassElement classElement = constructorElement.enclosingElement;
@@ -9091,15 +9159,15 @@
    * instance variable.
    *
    * @param node the constructor declaration to evaluate
+   * @param constructorElement the constructor element
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
    */
-  bool _checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) {
+  bool _checkForConstConstructorWithNonFinalField(ConstructorDeclaration node, ConstructorElement constructorElement) {
     if (!_isEnclosingConstructorConst) {
       return false;
     }
     // check if there is non-final field
-    ConstructorElement constructorElement = node.element;
     ClassElement classElement = constructorElement.enclosingElement;
     if (!classElement.hasNonFinalField) {
       return false;
@@ -9114,8 +9182,8 @@
    * type.
    *
    * @param node the instance creation expression to evaluate
-   * @param constructorName the constructor name from the instance creation expression
-   * @param typeName the type name off of the constructor name
+   * @param constructorName the constructor name, always non-`null`
+   * @param typeName the name of the type defining the constructor, always non-`null`
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_DEFERRED_CLASS
    */
@@ -9264,51 +9332,24 @@
   }
 
   /**
-   * This verifies that the passed 'const' instance creation expression does not reference any type
-   * parameters.
-   *
-   * This method assumes that the instance creation was tested to be 'const' before being called.
-   *
-   * @param node the instance creation expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
-   */
-  bool _checkForConstWithTypeParametersInCreation(InstanceCreationExpression node) {
-    ConstructorName constructorName = node.constructorName;
-    if (constructorName == null) {
-      return false;
-    }
-    TypeName typeName = constructorName.type;
-    return _checkForConstWithTypeParameters(typeName);
-  }
-
-  /**
    * This verifies that if the passed 'const' instance creation expression is being invoked on the
    * resolved constructor.
    *
    * This method assumes that the instance creation was tested to be 'const' before being called.
    *
    * @param node the instance creation expression to evaluate
+   * @param constructorName the constructor name, always non-`null`
+   * @param typeName the name of the type defining the constructor, always non-`null`
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
    * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
    */
-  bool _checkForConstWithUndefinedConstructor(InstanceCreationExpression node) {
+  bool _checkForConstWithUndefinedConstructor(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
     // OK if resolved
     if (node.staticElement != null) {
       return false;
     }
-    // prepare constructor name
-    ConstructorName constructorName = node.constructorName;
-    if (constructorName == null) {
-      return false;
-    }
-    // prepare class name
-    TypeName type = constructorName.type;
-    if (type == null) {
-      return false;
-    }
-    Identifier className = type.name;
+    Identifier className = typeName.name;
     // report as named or default constructor absence
     SimpleIdentifier name = constructorName.name;
     if (name != null) {
@@ -9455,8 +9496,17 @@
     if (inheritedMember.isStatic) {
       return false;
     }
+    // determine the display name, use the extended display name if the enclosing class of the
+    // inherited member is in a different source
+    String displayName;
+    Element enclosingElement = inheritedMember.enclosingElement;
+    if (enclosingElement.source == _enclosingClass.source) {
+      displayName = enclosingElement.displayName;
+    } else {
+      displayName = enclosingElement.extendedDisplayName;
+    }
     // report problem
-    _errorReporter.reportErrorForOffset(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, inheritedMember.enclosingElement.displayName]);
+    _errorReporter.reportErrorForOffset(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, displayName]);
     return true;
   }
 
@@ -9464,15 +9514,11 @@
    * This verifies if the passed list literal has type arguments then there is exactly one.
    *
    * @param node the list literal to evaluate
+   * @param typeArguments the type arguments, always non-`null`
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#EXPECTED_ONE_LIST_TYPE_ARGUMENTS
    */
-  bool _checkForExpectedOneListTypeArgument(ListLiteral node) {
-    // prepare type arguments
-    TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments == null) {
-      return false;
-    }
+  bool _checkForExpectedOneListTypeArgument(ListLiteral node, TypeArgumentList typeArguments) {
     // check number of type arguments
     int num = typeArguments.arguments.length;
     if (num == 1) {
@@ -9489,28 +9535,27 @@
    * @param node the export directive to evaluate
    * @param exportElement the [ExportElement] retrieved from the node, if the element in the
    *          node was `null`, then this method is not called
+   * @param exportedLibrary the library element containing the exported element
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
    */
-  bool _checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement) {
-    // prepare exported library
-    LibraryElement nodeLibrary = exportElement.exportedLibrary;
-    if (nodeLibrary == null) {
+  bool _checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement, LibraryElement exportedLibrary) {
+    if (exportedLibrary == null) {
       return false;
     }
-    String name = nodeLibrary.name;
+    String name = exportedLibrary.name;
     // check if there is other exported library with the same name
     LibraryElement prevLibrary = _nameToExportElement[name];
     if (prevLibrary != null) {
-      if (prevLibrary != nodeLibrary) {
+      if (prevLibrary != exportedLibrary) {
         _errorReporter.reportErrorForNode(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME, node, [
             prevLibrary.definingCompilationUnit.displayName,
-            nodeLibrary.definingCompilationUnit.displayName,
+            exportedLibrary.definingCompilationUnit.displayName,
             name]);
         return true;
       }
     } else {
-      _nameToExportElement[name] = nodeLibrary;
+      _nameToExportElement[name] = exportedLibrary;
     }
     // OK
     return false;
@@ -9676,13 +9721,14 @@
    * initializer expression types.
    *
    * @param node the constructor field initializer to test
+   * @param staticElement the static element from the name in the
+   *          [ConstructorFieldInitializer]
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
    * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
    */
-  bool _checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) {
+  bool _checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node, Element staticElement) {
     // prepare field element
-    Element staticElement = node.fieldName.staticElement;
     if (staticElement is! FieldElement) {
       return false;
     }
@@ -10076,6 +10122,24 @@
   }
 
   /**
+   * This verifies that the passed [Annotation] isn't defined in a deferred library.
+   *
+   * @param node the [Annotation]
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY
+   */
+  bool _checkForInvalidAnnotationFromDeferredLibrary(Annotation node) {
+    Identifier nameIdentifier = node.name;
+    if (nameIdentifier is PrefixedIdentifier) {
+      if (nameIdentifier.isDeferred) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY, node.name, []);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
    * This verifies that the passed left hand side and right hand side represent a valid assignment.
    *
    * @param lhs the left hand side expression
@@ -10087,15 +10151,19 @@
     if (lhs == null || rhs == null) {
       return false;
     }
-    VariableElement leftElement = getVariableElement(lhs);
-    DartType leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
+    VariableElement leftVariableElement = getVariableElement(lhs);
+    DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
     DartType staticRightType = getStaticType(rhs);
     if (!staticRightType.isAssignableTo(leftType)) {
       String leftName = leftType.displayName;
       String rightName = staticRightType.displayName;
       if (leftName == rightName) {
-        leftName = getExtendedDisplayName(leftType);
-        rightName = getExtendedDisplayName(staticRightType);
+        Element leftElement = leftType.element;
+        Element rightElement = staticRightType.element;
+        if (leftElement != null && rightElement != null) {
+          leftName = leftElement.extendedDisplayName;
+          rightName = rightElement.extendedDisplayName;
+        }
       }
       _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
       return true;
@@ -10108,16 +10176,17 @@
    * assignment is valid.
    *
    * @param node the assignment expression being tested
+   * @param lhs the left hand side expression
+   * @param rhs the right hand side expression
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
    */
-  bool _checkForInvalidCompoundAssignment(AssignmentExpression node) {
-    Expression lhs = node.leftHandSide;
+  bool _checkForInvalidCompoundAssignment(AssignmentExpression node, Expression lhs, Expression rhs) {
     if (lhs == null) {
       return false;
     }
-    VariableElement leftElement = getVariableElement(lhs);
-    DartType leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
+    VariableElement leftVariableElement = getVariableElement(lhs);
+    DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
     MethodElement invokedMethod = node.staticElement;
     if (invokedMethod == null) {
       return false;
@@ -10130,10 +10199,14 @@
       String leftName = leftType.displayName;
       String rightName = rightType.displayName;
       if (leftName == rightName) {
-        leftName = getExtendedDisplayName(leftType);
-        rightName = getExtendedDisplayName(rightType);
+        Element leftElement = leftType.element;
+        Element rightElement = rightType.element;
+        if (leftElement != null && rightElement != null) {
+          leftName = leftElement.extendedDisplayName;
+          rightName = rightElement.extendedDisplayName;
+        }
       }
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, node.rightHandSide, [rightName, leftName]);
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
       return true;
     }
     return false;
@@ -10143,10 +10216,11 @@
    * Check the given initializer to ensure that the field being initialized is a valid field.
    *
    * @param node the field initializer being checked
+   * @param fieldName the field name from the [ConstructorFieldInitializer]
+   * @param staticElement the static element from the name in the
+   *          [ConstructorFieldInitializer]
    */
-  void _checkForInvalidField(ConstructorFieldInitializer node) {
-    SimpleIdentifier fieldName = node.fieldName;
-    Element staticElement = fieldName.staticElement;
+  void _checkForInvalidField(ConstructorFieldInitializer node, SimpleIdentifier fieldName, Element staticElement) {
     if (staticElement is FieldElement) {
       FieldElement fieldElement = staticElement;
       if (fieldElement.isSynthetic) {
@@ -10201,21 +10275,17 @@
    * type.
    *
    * @param node the list literal to evaluate
+   * @param typeArguments the type arguments, always non-`null`
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
    * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
    */
-  bool _checkForListElementTypeNotAssignable(ListLiteral node) {
-    // Prepare list element type.
-    TypeArgumentList typeArgumentList = node.typeArguments;
-    if (typeArgumentList == null) {
+  bool _checkForListElementTypeNotAssignable(ListLiteral node, TypeArgumentList typeArguments) {
+    NodeList<TypeName> typeNames = typeArguments.arguments;
+    if (typeNames.length < 1) {
       return false;
     }
-    NodeList<TypeName> typeArguments = typeArgumentList.arguments;
-    if (typeArguments.length < 1) {
-      return false;
-    }
-    DartType listElementType = typeArguments[0].type;
+    DartType listElementType = typeNames[0].type;
     // Prepare problem to report.
     ErrorCode errorCode;
     if (node.constKeyword != null) {
@@ -10232,48 +10302,25 @@
   }
 
   /**
-   * Check that the imported library does not define a loadLibrary function.
-   *
-   * @param node the import directive to evaluate
-   * @param importElement the [ImportElement] retrieved from the node
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION
-   */
-  bool _checkForLoadLibraryFunction(ImportDirective node, ImportElement importElement) {
-    LibraryElement importedLibrary = importElement.importedLibrary;
-    if (importedLibrary == null) {
-      return false;
-    }
-    if (importedLibrary.hasLoadLibraryFunction) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION, node, [importedLibrary.name]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
    * This verifies that the key/value of entries of the given [MapLiteral] are subtypes of the
    * key/value types specified in the type arguments.
    *
    * @param node the map literal to evaluate
+   * @param typeArguments the type arguments, always non-`null`
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
    * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
    * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
    * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
    */
-  bool _checkForMapTypeNotAssignable(MapLiteral node) {
+  bool _checkForMapTypeNotAssignable(MapLiteral node, TypeArgumentList typeArguments) {
     // Prepare maps key/value types.
-    TypeArgumentList typeArgumentList = node.typeArguments;
-    if (typeArgumentList == null) {
+    NodeList<TypeName> typeNames = typeArguments.arguments;
+    if (typeNames.length < 2) {
       return false;
     }
-    NodeList<TypeName> typeArguments = typeArgumentList.arguments;
-    if (typeArguments.length < 2) {
-      return false;
-    }
-    DartType keyType = typeArguments[0].type;
-    DartType valueType = typeArguments[1].type;
+    DartType keyType = typeNames[0].type;
+    DartType valueType = typeNames[1].type;
     // Prepare problem to report.
     ErrorCode keyErrorCode;
     ErrorCode valueErrorCode;
@@ -10524,25 +10571,18 @@
    * This method assumes that the instance creation was tested to be 'new' before being called.
    *
    * @param node the instance creation expression to evaluate
+   * @param constructorName the constructor name, always non-`null`
+   * @param typeName the name of the type defining the constructor, always non-`null`
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
    */
-  bool _checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
+  bool _checkForNewWithUndefinedConstructor(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
     // OK if resolved
     if (node.staticElement != null) {
       return false;
     }
-    // prepare constructor name
-    ConstructorName constructorName = node.constructorName;
-    if (constructorName == null) {
-      return false;
-    }
     // prepare class name
-    TypeName type = constructorName.type;
-    if (type == null) {
-      return false;
-    }
-    Identifier className = type.name;
+    Identifier className = typeName.name;
     // report as named or default constructor absence
     SimpleIdentifier name = constructorName.name;
     if (name != null) {
@@ -10616,7 +10656,7 @@
       // From Spec:  It is a static warning if a concrete class does not have an implementation for
       // a method in any of its superinterfaces unless it declares its own noSuchMethod
       // method (7.10).
-      if (methodName == ElementResolver.NO_SUCH_METHOD_METHOD_NAME) {
+      if (methodName == FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
         return false;
       }
     }
@@ -10917,10 +10957,11 @@
    * references itself directly or indirectly.
    *
    * @param node the constructor declaration to evaluate
+   * @param constructorElement the constructor element
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
    */
-  bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration node) {
+  bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration node, ConstructorElement constructorElement) {
     // we check generative constructor here
     if (node.factoryKeyword != null) {
       return false;
@@ -10929,8 +10970,7 @@
     for (ConstructorInitializer initializer in node.initializers) {
       if (initializer is RedirectingConstructorInvocation) {
         // OK if no cycle
-        ConstructorElement element = node.element;
-        if (!_hasRedirectingFactoryConstructorCycle(element)) {
+        if (!_hasRedirectingFactoryConstructorCycle(constructorElement)) {
           return false;
         }
         // report error
@@ -10947,18 +10987,18 @@
    * itself directly or indirectly.
    *
    * @param node the constructor declaration to evaluate
+   * @param constructorElement the constructor element
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
    */
-  bool _checkForRecursiveFactoryRedirect(ConstructorDeclaration node) {
+  bool _checkForRecursiveFactoryRedirect(ConstructorDeclaration node, ConstructorElement constructorElement) {
     // prepare redirected constructor
     ConstructorName redirectedConstructorNode = node.redirectedConstructor;
     if (redirectedConstructorNode == null) {
       return false;
     }
     // OK if no cycle
-    ConstructorElement element = node.element;
-    if (!_hasRedirectingFactoryConstructorCycle(element)) {
+    if (!_hasRedirectingFactoryConstructorCycle(constructorElement)) {
       return false;
     }
     // report error
@@ -11040,26 +11080,26 @@
    * itself directly or indirectly.
    *
    * @param node the constructor declaration to evaluate
+   * @param constructorElement the constructor element
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
    */
-  bool _checkForRedirectToNonConstConstructor(ConstructorDeclaration node) {
+  bool _checkForRedirectToNonConstConstructor(ConstructorDeclaration node, ConstructorElement constructorElement) {
     // prepare redirected constructor
     ConstructorName redirectedConstructorNode = node.redirectedConstructor;
     if (redirectedConstructorNode == null) {
       return false;
     }
     // prepare element
-    ConstructorElement element = node.element;
-    if (element == null) {
+    if (constructorElement == null) {
       return false;
     }
     // OK, it is not 'const'
-    if (!element.isConst) {
+    if (!constructorElement.isConst) {
       return false;
     }
     // prepare redirected constructor
-    ConstructorElement redirectedConstructor = element.redirectedConstructor;
+    ConstructorElement redirectedConstructor = constructorElement.redirectedConstructor;
     if (redirectedConstructor == null) {
       return false;
     }
@@ -11292,7 +11332,9 @@
       DartType argType = argTypeName.type;
       DartType boundType = boundingElts[i].bound;
       if (argType != null && boundType != null) {
-        boundType = boundType.substitute2(typeArguments, typeParameters);
+        if (typeArguments.length != 0 && typeArguments.length == typeParameters.length) {
+          boundType = boundType.substitute2(typeArguments, typeParameters);
+        }
         if (!argType.isSubtypeOf(boundType)) {
           ErrorCode errorCode;
           if (_isInConstInstanceCreation) {
@@ -11573,7 +11615,7 @@
       return false;
     }
     // If there is a noSuchMethod method, then don't report the warning, see dartbug.com/16078
-    if (classElement.getMethod(ElementResolver.NO_SUCH_METHOD_METHOD_NAME) != null) {
+    if (classElement.getMethod(FunctionElement.NO_SUCH_METHOD_METHOD_NAME) != null) {
       return false;
     }
     ExecutableElement callMethod = _inheritanceManager.lookupMember(classElement, "call");
@@ -11754,7 +11796,7 @@
     } else if (type is FunctionType || type.isDartCoreFunction) {
       return true;
     } else if (type is InterfaceType) {
-      MethodElement callMethod = type.lookUpMethod(ElementResolver.CALL_METHOD_NAME, _currentLibrary);
+      MethodElement callMethod = type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _currentLibrary);
       return callMethod != null;
     }
     return false;
@@ -19862,16 +19904,6 @@
   }
 
   /**
-   * The Dart Language Specification, 12.33: <blockquote>The static type of an argument definition
-   * test is `bool`.</blockquote>
-   */
-  @override
-  Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    _recordStaticType(node, _typeProvider.boolType);
-    return null;
-  }
-
-  /**
    * The Dart Language Specification, 12.32: <blockquote>... the cast expression <i>e as T</i> ...
    *
    * It is a static warning if <i>T</i> does not denote a type available in the current lexical
@@ -20962,7 +20994,7 @@
         if (returnType.isDartCoreFunction) {
           return _dynamicType;
         } else if (returnType is InterfaceType) {
-          MethodElement callMethod = returnType.lookUpMethod(ElementResolver.CALL_METHOD_NAME, _resolver.definingLibrary);
+          MethodElement callMethod = returnType.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _resolver.definingLibrary);
           if (callMethod != null) {
             return callMethod.type.returnType;
           }
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index fc67528..64dbef6 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -235,12 +235,13 @@
   @override
   AnalysisContext get context {
     if (_analysisContext == null) {
-      _analysisContext = new AnalysisContextImpl();
-      _analysisContext.sourceFactory = new SourceFactory([new DartUriResolver(this)]);
+      _analysisContext = new SdkAnalysisContext();
+      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
+      _analysisContext.sourceFactory = factory;
       List<String> uris = this.uris;
       ChangeSet changeSet = new ChangeSet();
       for (String uri in uris) {
-        changeSet.addedSource(_analysisContext.sourceFactory.forUri(uri));
+        changeSet.addedSource(factory.forUri(uri));
       }
       _analysisContext.applyChanges(changeSet);
     }
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index b9d8067..fa87510 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -11,6 +11,7 @@
 import 'java_core.dart';
 import 'java_io.dart';
 import 'utilities_general.dart';
+import 'instrumentation.dart';
 import 'engine.dart';
 export 'source.dart';
 
@@ -125,7 +126,7 @@
     try {
       return contentsFromFile;
     } finally {
-      handle.stop();
+      _reportIfSlowIO(handle.stop());
     }
   }
 
@@ -184,6 +185,22 @@
   TimestampedData<String> get contentsFromFile {
     return new TimestampedData<String>(file.lastModified(), file.readAsStringSync());
   }
+
+  /**
+   * Record the time the IO took if it was slow
+   */
+  void _reportIfSlowIO(int nanos) {
+    //If slower than 10ms
+    if (nanos > 10 * TimeCounter.NANOS_PER_MILLI) {
+      InstrumentationBuilder builder = Instrumentation.builder2("SlowIO");
+      try {
+        builder.data3("fileName", fullName);
+        builder.metric2("IO-Time-Nanos", nanos);
+      } finally {
+        builder.log();
+      }
+    }
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/utilities_general.dart b/pkg/analyzer/lib/src/generated/utilities_general.dart
index 78089ec..f5531a4 100644
--- a/pkg/analyzer/lib/src/generated/utilities_general.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_general.dart
@@ -11,6 +11,8 @@
  * Helper for measuring how much time is spent doing some operation.
  */
 class TimeCounter {
+  static final int NANOS_PER_MILLI = 1000 * 1000;
+  static final int NANOS_PER_MICRO = 1000;
   static TimeCounter _current = null;
   final Stopwatch _sw = new Stopwatch();
 
@@ -34,6 +36,7 @@
  */
 class TimeCounter_TimeCounterHandle {
   final TimeCounter _counter;
+  int _startMicros;
   TimeCounter _prev;
 
   TimeCounter_TimeCounterHandle(this._counter) {
@@ -44,18 +47,23 @@
     }
     TimeCounter._current = _counter;
     // start this counter
+    _startMicros = _counter._sw.elapsedMicroseconds;
     _counter._sw.start();
   }
 
   /**
    * Stops counting time and updates counter.
    */
-  void stop() {
+  int stop() {
     _counter._sw.stop();
+    int elapsed = (_counter._sw.elapsedMicroseconds - _startMicros) *
+        TimeCounter.NANOS_PER_MICRO;
     // restore previous counter and resume it
     TimeCounter._current = _prev;
     if (_prev != null) {
       _prev._sw.start();
     }
+    // done
+    return elapsed;
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/analyzer/lib/src/services/formatter_impl.dart b/pkg/analyzer/lib/src/services/formatter_impl.dart
index 22b9ebe..cfa81c9 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -421,11 +421,6 @@
     visit(node.arguments);
   }
 
-  visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    token(node.question);
-    visit(node.identifier);
-  }
-
   visitArgumentList(ArgumentList node) {
     token(node.leftParenthesis);
     breakableNonSpace();
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index b3dd5c0..0df5783 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,12 +1,12 @@
 name: analyzer
-version: 0.14.3
+version: 0.15.2-dev
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
 environment:
   sdk: '>=0.8.10+6 <2.0.0'
 dependencies:
-  args: '>=0.10.0 <0.11.0'
+  args: '>=0.10.0 <0.12.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
 dev_dependencies:
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 6d2fa31..7664e36 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -75,8 +75,6 @@
 
   static Annotation annotation2(Identifier name, SimpleIdentifier constructorName, ArgumentList arguments) => new Annotation(TokenFactory.tokenFromType(TokenType.AT), name, TokenFactory.tokenFromType(TokenType.PERIOD), constructorName, arguments);
 
-  static ArgumentDefinitionTest argumentDefinitionTest(String identifier) => new ArgumentDefinitionTest(TokenFactory.tokenFromType(TokenType.QUESTION), identifier3(identifier));
-
   static ArgumentList argumentList(List<Expression> arguments) => new ArgumentList(TokenFactory.tokenFromType(TokenType.OPEN_PAREN), list(arguments), TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
 
   static AsExpression asExpression(Expression expression, TypeName type) => new AsExpression(expression, TokenFactory.tokenFromKeyword(Keyword.AS), type);
@@ -230,9 +228,11 @@
 
   static ImplementsClause implementsClause(List<TypeName> types) => new ImplementsClause(TokenFactory.tokenFromKeyword(Keyword.IMPLEMENTS), list(types));
 
-  static ImportDirective importDirective(List<Annotation> metadata, String uri, String prefix, List<Combinator> combinators) => new ImportDirective(null, metadata, TokenFactory.tokenFromKeyword(Keyword.IMPORT), string2(uri), null, prefix == null ? null : TokenFactory.tokenFromKeyword(Keyword.AS), prefix == null ? null : identifier3(prefix), list(combinators), TokenFactory.tokenFromType(TokenType.SEMICOLON));
+  static ImportDirective importDirective(List<Annotation> metadata, String uri, bool isDeferred, String prefix, List<Combinator> combinators) => new ImportDirective(null, metadata, TokenFactory.tokenFromKeyword(Keyword.IMPORT), string2(uri), !isDeferred ? null : TokenFactory.tokenFromKeyword(Keyword.DEFERRED), prefix == null ? null : TokenFactory.tokenFromKeyword(Keyword.AS), prefix == null ? null : identifier3(prefix), list(combinators), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static ImportDirective importDirective2(String uri, String prefix, List<Combinator> combinators) => importDirective(new List<Annotation>(), uri, prefix, combinators);
+  static ImportDirective importDirective2(String uri, bool isDeferred, String prefix, List<Combinator> combinators) => importDirective(new List<Annotation>(), uri, isDeferred, prefix, combinators);
+
+  static ImportDirective importDirective3(String uri, String prefix, List<Combinator> combinators) => importDirective(new List<Annotation>(), uri, false, prefix, combinators);
 
   static IndexExpression indexExpression(Expression array, Expression index) => new IndexExpression.forTarget(array, TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET), index, TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
 
@@ -1630,11 +1630,6 @@
 }
 
 class SimpleIdentifierTest extends ParserTestCase {
-  void test_inDeclarationContext_argumentDefinition() {
-    SimpleIdentifier identifier = AstFactory.argumentDefinitionTest("p").identifier;
-    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
-  }
-
   void test_inDeclarationContext_catch_exception() {
     SimpleIdentifier identifier = AstFactory.catchClause("e", []).exceptionParameter;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
@@ -1822,10 +1817,6 @@
 
   static dartSuite() {
     _ut.group('SimpleIdentifierTest', () {
-      _ut.test('test_inDeclarationContext_argumentDefinition', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_argumentDefinition);
-      });
       _ut.test('test_inDeclarationContext_catch_exception', () {
         final __test = new SimpleIdentifierTest();
         runJUnitTest(__test, __test.test_inDeclarationContext_catch_exception);
@@ -1984,10 +1975,6 @@
     _assertSource("@A.c()", AstFactory.annotation2(AstFactory.identifier3("A"), AstFactory.identifier3("c"), AstFactory.argumentList([])));
   }
 
-  void test_visitArgumentDefinitionTest() {
-    _assertSource("?a", AstFactory.argumentDefinitionTest("a"));
-  }
-
   void test_visitArgumentList() {
     _assertSource("(a, b)", AstFactory.argumentList([AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
   }
@@ -2593,35 +2580,39 @@
   }
 
   void test_visitImportDirective_combinator() {
-    _assertSource("import 'a.dart' show A;", AstFactory.importDirective2("a.dart", null, [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
+    _assertSource("import 'a.dart' show A;", AstFactory.importDirective3("a.dart", null, [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
   }
 
   void test_visitImportDirective_combinators() {
-    _assertSource("import 'a.dart' show A hide B;", AstFactory.importDirective2("a.dart", null, [
+    _assertSource("import 'a.dart' show A hide B;", AstFactory.importDirective3("a.dart", null, [
         AstFactory.showCombinator([AstFactory.identifier3("A")]),
         AstFactory.hideCombinator([AstFactory.identifier3("B")])]));
   }
 
+  void test_visitImportDirective_deferred() {
+    _assertSource("import 'a.dart' deferred as p;", AstFactory.importDirective2("a.dart", true, "p", []));
+  }
+
   void test_visitImportDirective_minimal() {
-    _assertSource("import 'a.dart';", AstFactory.importDirective2("a.dart", null, []));
+    _assertSource("import 'a.dart';", AstFactory.importDirective3("a.dart", null, []));
   }
 
   void test_visitImportDirective_prefix() {
-    _assertSource("import 'a.dart' as p;", AstFactory.importDirective2("a.dart", "p", []));
+    _assertSource("import 'a.dart' as p;", AstFactory.importDirective3("a.dart", "p", []));
   }
 
   void test_visitImportDirective_prefix_combinator() {
-    _assertSource("import 'a.dart' as p show A;", AstFactory.importDirective2("a.dart", "p", [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
+    _assertSource("import 'a.dart' as p show A;", AstFactory.importDirective3("a.dart", "p", [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
   }
 
   void test_visitImportDirective_prefix_combinators() {
-    _assertSource("import 'a.dart' as p show A hide B;", AstFactory.importDirective2("a.dart", "p", [
+    _assertSource("import 'a.dart' as p show A hide B;", AstFactory.importDirective3("a.dart", "p", [
         AstFactory.showCombinator([AstFactory.identifier3("A")]),
         AstFactory.hideCombinator([AstFactory.identifier3("B")])]));
   }
 
   void test_visitImportDirective_withMetadata() {
-    ImportDirective directive = AstFactory.importDirective2("a.dart", null, []);
+    ImportDirective directive = AstFactory.importDirective3("a.dart", null, []);
     directive.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
     _assertSource("@deprecated import 'a.dart';", directive);
   }
@@ -3170,10 +3161,6 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitAnnotation_constructor);
       });
-      _ut.test('test_visitArgumentDefinitionTest', () {
-        final __test = new ToSourceVisitorTest();
-        runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
-      });
       _ut.test('test_visitArgumentList', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitArgumentList);
@@ -3726,6 +3713,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitImportDirective_combinators);
       });
+      _ut.test('test_visitImportDirective_deferred', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitImportDirective_deferred);
+      });
       _ut.test('test_visitImportDirective_minimal', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitImportDirective_minimal);
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 2c30dc8..485ffd9 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -2963,9 +2963,7 @@
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
     InterfaceType typeA = classA.type;
     TypeParameterType parameterType = classA.typeParameters[0].type;
-    DartType dynamicType = DynamicTypeImpl.instance;
     JUnitTestCase.assertFalse(typeA.isSubtypeOf(parameterType));
-    JUnitTestCase.assertTrue(dynamicType.isSubtypeOf(parameterType));
   }
 
   void test_isSupertypeOf_directSupertype() {
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 4e2bb45..a22619a 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -3821,6 +3821,18 @@
     EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
   }
 
+  void test_missingGet() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class C {", "  int length {}", "  void foo() {}", "}"]), [ParserErrorCode.MISSING_GET]);
+    JUnitTestCase.assertNotNull(unit);
+    ClassDeclaration classDeclaration = unit.declarations[0] as ClassDeclaration;
+    NodeList<ClassMember> members = classDeclaration.members;
+    EngineTestCase.assertSizeOfList(2, members);
+    EngineTestCase.assertInstanceOf((obj) => obj is MethodDeclaration, MethodDeclaration, members[0]);
+    ClassMember member = members[1];
+    EngineTestCase.assertInstanceOf((obj) => obj is MethodDeclaration, MethodDeclaration, member);
+    JUnitTestCase.assertEquals("foo", (member as MethodDeclaration).name.name);
+  }
+
   void test_missingIdentifier_afterAnnotation() {
     MethodDeclaration method = ParserTestCase.parse3("parseClassMember", <Object> ["C"], "@override }", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
     JUnitTestCase.assertNull(method.documentationComment);
@@ -3882,6 +3894,11 @@
     JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
   }
 
+  void test_primaryExpression_argumentDefinitionTest() {
+    Expression expression = ParserTestCase.parse4("parsePrimaryExpression", "?a", [ParserErrorCode.UNEXPECTED_TOKEN]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression);
+  }
+
   void test_relationalExpression_missing_LHS() {
     IsExpression expression = ParserTestCase.parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.expression);
@@ -4211,6 +4228,10 @@
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_logicalOrExpression_precedence_logicalAnd_right);
       });
+      _ut.test('test_missingGet', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_missingGet);
+      });
       _ut.test('test_missingIdentifier_afterAnnotation', () {
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_missingIdentifier_afterAnnotation);
@@ -4247,6 +4268,10 @@
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_prefixExpression_missing_operand_minus);
       });
+      _ut.test('test_primaryExpression_argumentDefinitionTest', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_primaryExpression_argumentDefinitionTest);
+      });
       _ut.test('test_relationalExpression_missing_LHS', () {
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_relationalExpression_missing_LHS);
@@ -4310,19 +4335,6 @@
     JUnitTestCase.assertSame(element, toNode.element);
   }
 
-  void test_visitArgumentDefinitionTest() {
-    String identifier = "p";
-    ArgumentDefinitionTest fromNode = AstFactory.argumentDefinitionTest(identifier);
-    DartType propagatedType = ElementFactory.classElement2("A", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("B", []).type;
-    fromNode.staticType = staticType;
-    ArgumentDefinitionTest toNode = AstFactory.argumentDefinitionTest(identifier);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
   void test_visitAsExpression() {
     AsExpression fromNode = AstFactory.asExpression(AstFactory.identifier3("x"), AstFactory.typeName4("A", []));
     DartType propagatedType = ElementFactory.classElement2("A", []).type;
@@ -4491,10 +4503,10 @@
   }
 
   void test_visitImportDirective() {
-    ImportDirective fromNode = AstFactory.importDirective2("dart:uri", null, []);
+    ImportDirective fromNode = AstFactory.importDirective3("dart:uri", null, []);
     ImportElement element = new ImportElementImpl(0);
     fromNode.element = element;
-    ImportDirective toNode = AstFactory.importDirective2("dart:uri", null, []);
+    ImportDirective toNode = AstFactory.importDirective3("dart:uri", null, []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(element, toNode.element);
   }
@@ -4860,10 +4872,6 @@
         final __test = new ResolutionCopierTest();
         runJUnitTest(__test, __test.test_visitAnnotation);
       });
-      _ut.test('test_visitArgumentDefinitionTest', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
-      });
       _ut.test('test_visitAsExpression', () {
         final __test = new ResolutionCopierTest();
         runJUnitTest(__test, __test.test_visitAsExpression);
@@ -5422,12 +5430,6 @@
     JUnitTestCase.assertEquals(lexeme, identifier.name);
   }
 
-  void test_parseArgumentDefinitionTest() {
-    ArgumentDefinitionTest test = ParserTestCase.parse4("parseArgumentDefinitionTest", "?x", [ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST]);
-    JUnitTestCase.assertNotNull(test.question);
-    JUnitTestCase.assertNotNull(test.identifier);
-  }
-
   void test_parseArgumentList_empty() {
     ArgumentList argumentList = ParserTestCase.parse4("parseArgumentList", "()", []);
     NodeList<Expression> arguments = argumentList.arguments;
@@ -10023,10 +10025,6 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseAnnotation_n3_a);
       });
-      _ut.test('test_parseArgumentDefinitionTest', () {
-        final __test = new SimpleParserTest();
-        runJUnitTest(__test, __test.test_parseArgumentDefinitionTest);
-      });
       _ut.test('test_parseArgumentList_empty', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseArgumentList_empty);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 5e6de85..a118fb6 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -803,6 +803,28 @@
     verify([source]);
   }
 
+  void test_constInitializedWithNonConstValueFromDeferredClass() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "const B = a.V;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_constInitializedWithNonConstValueFromDeferredClass_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "const B = a.V + 1;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
   void test_constInstanceField() {
     Source source = addSource(EngineTestCase.createSource(["class C {", "  const int f = 0;", "}"]));
     resolve(source);
@@ -1801,17 +1823,6 @@
     verify([source]);
   }
 
-  void test_importDeferredLibraryWithLoadFunction() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib1;",
-        "main() { lib1.f(); }"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
-    verify([source]);
-  }
-
   void test_importInternalLibrary() {
     Source source = addSource(EngineTestCase.createSource(["import 'dart:_interceptors';"]));
     resolve(source);
@@ -2053,6 +2064,45 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
   }
 
+  void test_invalidAnnotationFromDeferredLibrary() {
+    // See test_invalidAnnotation_notConstantVariable
+    addNamedSource("/lib1.dart", EngineTestCase.createSource([
+        "library lib1;",
+        "class V { const V(); }",
+        "const v = const V();"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "@a.v main () {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotationFromDeferredLibrary_constructor() {
+    // See test_invalidAnnotation_notConstantVariable
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class C { const C(); }"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "@a.C() main () {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotationFromDeferredLibrary_namedConstructor() {
+    // See test_invalidAnnotation_notConstantVariable
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class C { const C.name(); }"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "@a.C.name() main () {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
   void test_invalidConstructorName_notEnclosingClassName_defined() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}", "class B {}"]));
     resolve(source);
@@ -2630,6 +2680,28 @@
     verify([source]);
   }
 
+  void test_nonConstantDefaultValueFromDeferredLibrary() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f({x : a.V}) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValueFromDeferredLibrary_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f({x : a.V + 1}) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
   void test_nonConstCaseExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "f(int p, int q) {",
@@ -3874,6 +3946,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constInitializedWithNonConstValue);
       });
+      _ut.test('test_constInitializedWithNonConstValueFromDeferredClass', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constInitializedWithNonConstValueFromDeferredClass);
+      });
+      _ut.test('test_constInitializedWithNonConstValueFromDeferredClass_nested', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constInitializedWithNonConstValueFromDeferredClass_nested);
+      });
       _ut.test('test_constInitializedWithNonConstValue_missingConstInListLiteral', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constInitializedWithNonConstValue_missingConstInListLiteral);
@@ -4294,10 +4374,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_superConstructorInvocation);
       });
-      _ut.test('test_importDeferredLibraryWithLoadFunction', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
-      });
       _ut.test('test_importInternalLibrary', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_importInternalLibrary);
@@ -4358,6 +4434,18 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_method);
       });
+      _ut.test('test_invalidAnnotationFromDeferredLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary);
+      });
+      _ut.test('test_invalidAnnotationFromDeferredLibrary_constructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary_constructor);
+      });
+      _ut.test('test_invalidAnnotationFromDeferredLibrary_namedConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary_namedConstructor);
+      });
       _ut.test('test_invalidAnnotation_getter', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidAnnotation_getter);
@@ -4710,6 +4798,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstantAnnotationConstructor_unnamed);
       });
+      _ut.test('test_nonConstantDefaultValueFromDeferredLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstantDefaultValueFromDeferredLibrary);
+      });
+      _ut.test('test_nonConstantDefaultValueFromDeferredLibrary_nested', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstantDefaultValueFromDeferredLibrary_nested);
+      });
       _ut.test('test_nonConstantDefaultValue_function_named', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstantDefaultValue_function_named);
@@ -5288,7 +5384,7 @@
   void fail_visitImportDirective_combinators_noPrefix() {
     JUnitTestCase.fail("Not yet tested");
     // Need to set up the imported library so that the identifier can be resolved
-    ImportDirective directive = AstFactory.importDirective2(null, null, [AstFactory.showCombinator2(["A"])]);
+    ImportDirective directive = AstFactory.importDirective3(null, null, [AstFactory.showCombinator2(["A"])]);
     _resolveNode(directive, []);
     _listener.assertNoErrors();
   }
@@ -5298,7 +5394,7 @@
     // Need to set up the imported library so that the identifiers can be resolved
     String prefixName = "p";
     _definingLibrary.imports = <ImportElement> [ElementFactory.importFor(null, ElementFactory.prefix(prefixName), [])];
-    ImportDirective directive = AstFactory.importDirective2(null, prefixName, [
+    ImportDirective directive = AstFactory.importDirective3(null, prefixName, [
         AstFactory.showCombinator2(["A"]),
         AstFactory.hideCombinator2(["B"])]);
     _resolveNode(directive, []);
@@ -5468,7 +5564,7 @@
   }
 
   void test_visitImportDirective_noCombinators_noPrefix() {
-    ImportDirective directive = AstFactory.importDirective2(null, null, []);
+    ImportDirective directive = AstFactory.importDirective3(null, null, []);
     directive.element = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), null, []);
     _resolveNode(directive, []);
     _listener.assertNoErrors();
@@ -5478,7 +5574,7 @@
     String prefixName = "p";
     ImportElement importElement = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), ElementFactory.prefix(prefixName), []);
     _definingLibrary.imports = <ImportElement> [importElement];
-    ImportDirective directive = AstFactory.importDirective2(null, prefixName, []);
+    ImportDirective directive = AstFactory.importDirective3(null, prefixName, []);
     directive.element = importElement;
     _resolveNode(directive, []);
     _listener.assertNoErrors();
@@ -6460,6 +6556,115 @@
     verify([source]);
   }
 
+  void test_deadCode_statementAfterBreak_inDefaultCase() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(v) {",
+        "  switch(v) {",
+        "    case 1:",
+        "    default:",
+        "      break;",
+        "      var a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterBreak_inForEachStatement() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  var list;",
+        "  for(var l in list) {",
+        "    break;",
+        "    var a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterBreak_inForStatement() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  for(;;) {",
+        "    break;",
+        "    var a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterBreak_inSwitchCase() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(v) {",
+        "  switch(v) {",
+        "    case 1:",
+        "      break;",
+        "      var a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterBreak_inWhileStatement() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(v) {",
+        "  while(v) {",
+        "    break;",
+        "    var a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterContinue_inForEachStatement() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  var list;",
+        "  for(var l in list) {",
+        "    continue;",
+        "    var a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterContinue_inForStatement() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  for(;;) {",
+        "    continue;",
+        "    var a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterContinue_inWhileStatement() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(v) {",
+        "  while(v) {",
+        "    continue;",
+        "    var a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
   void test_deadCode_statementAfterReturn_function() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -6777,6 +6982,17 @@
     verify([source]);
   }
 
+  void test_importDeferredLibraryWithLoadFunction() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as lib1;",
+        "main() { lib1.f(); }"]));
+    resolve(source);
+    assertErrors(source, [HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
+    verify([source]);
+  }
+
   void test_invalidAssignment_instanceVariable() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -7343,6 +7559,38 @@
         final __test = new HintCodeTest();
         runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_or_nested);
       });
+      _ut.test('test_deadCode_statementAfterBreak_inDefaultCase', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterBreak_inDefaultCase);
+      });
+      _ut.test('test_deadCode_statementAfterBreak_inForEachStatement', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterBreak_inForEachStatement);
+      });
+      _ut.test('test_deadCode_statementAfterBreak_inForStatement', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterBreak_inForStatement);
+      });
+      _ut.test('test_deadCode_statementAfterBreak_inSwitchCase', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterBreak_inSwitchCase);
+      });
+      _ut.test('test_deadCode_statementAfterBreak_inWhileStatement', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterBreak_inWhileStatement);
+      });
+      _ut.test('test_deadCode_statementAfterContinue_inForEachStatement', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterContinue_inForEachStatement);
+      });
+      _ut.test('test_deadCode_statementAfterContinue_inForStatement', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterContinue_inForStatement);
+      });
+      _ut.test('test_deadCode_statementAfterContinue_inWhileStatement', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterContinue_inWhileStatement);
+      });
       _ut.test('test_deadCode_statementAfterReturn_function', () {
         final __test = new HintCodeTest();
         runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_function);
@@ -7443,6 +7691,10 @@
         final __test = new HintCodeTest();
         runJUnitTest(__test, __test.test_duplicateImport3);
       });
+      _ut.test('test_importDeferredLibraryWithLoadFunction', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
+      });
       _ut.test('test_invalidAssignment_instanceVariable', () {
         final __test = new HintCodeTest();
         runJUnitTest(__test, __test.test_invalidAssignment_instanceVariable);
@@ -8990,7 +9242,7 @@
     Library library = resolver.createLibrary(librarySource);
     LibraryElement element = builder.buildLibrary(library);
     GatheringErrorListener listener = new GatheringErrorListener();
-    listener.addAll(resolver.errorListener);
+    listener.addAll2(resolver.errorListener);
     listener.assertErrorsWithCodes(expectedErrorCodes);
     return element;
   }
@@ -9498,27 +9750,6 @@
     verify([source]);
   }
 
-  void test_argumentDefinitionTestNonParameter_formalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["f(var v) {", "  return ?v;", "}"]));
-    resolve(source);
-    assertErrors(source, [ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST]);
-    verify([source]);
-  }
-
-  void test_argumentDefinitionTestNonParameter_namedParameter() {
-    Source source = addSource(EngineTestCase.createSource(["f({var v : 0}) {", "  return ?v;", "}"]));
-    resolve(source);
-    assertErrors(source, [ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST]);
-    verify([source]);
-  }
-
-  void test_argumentDefinitionTestNonParameter_optionalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["f([var v]) {", "  return ?v;", "}"]));
-    resolve(source);
-    assertErrors(source, [ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST]);
-    verify([source]);
-  }
-
   void test_argumentTypeNotAssignable_classWithCall_Function() {
     Source source = addSource(EngineTestCase.createSource([
         "  caller(Function callee) {",
@@ -10588,17 +10819,6 @@
     verify([source]);
   }
 
-  void test_importDeferredLibraryWithLoadFunction() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib1;",
-        "main() { lib1.f(); }"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   void test_importDuplicatedLibraryName() {
     Source source = addSource(EngineTestCase.createSource([
         "library test;",
@@ -12495,6 +12715,19 @@
     verify([source]);
   }
 
+  void test_returnOfInvalidType_typeParameter_18468() {
+    // This test verifies that T << Type where T is a type parameter and Type is the type Type from
+    // core, this particular test case comes from issue 18468 which depends on this fact.
+    //
+    // A test cannot be added to TypeParameterTypeImplTest since the types returned out of the
+    // TestTypeProvider don't have a mock 'dart.core' enclosing library element.
+    // See TypeParameterTypeImpl.isMoreSpecificThan().
+    Source source = addSource(EngineTestCase.createSource(["class Foo<T> {", "  Type get t => T;", "}"]));
+    resolve(source);
+    assertErrors(source, []);
+    verify([source]);
+  }
+
   void test_returnOfInvalidType_void() {
     Source source = addSource(EngineTestCase.createSource([
         "void f1() {}",
@@ -13295,18 +13528,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_ambiguousExport_sameDeclaration);
       });
-      _ut.test('test_argumentDefinitionTestNonParameter_formalParameter', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter_formalParameter);
-      });
-      _ut.test('test_argumentDefinitionTestNonParameter_namedParameter', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter_namedParameter);
-      });
-      _ut.test('test_argumentDefinitionTestNonParameter_optionalParameter', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter_optionalParameter);
-      });
       _ut.test('test_argumentTypeNotAssignable_Object_Function', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_Object_Function);
@@ -13691,10 +13912,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_typeParameter);
       });
-      _ut.test('test_importDeferredLibraryWithLoadFunction', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
-      });
       _ut.test('test_importDuplicatedLibraryName', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_importDuplicatedLibraryName);
@@ -14331,6 +14548,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_returnOfInvalidType_supertype);
       });
+      _ut.test('test_returnOfInvalidType_typeParameter_18468', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_returnOfInvalidType_typeParameter_18468);
+      });
       _ut.test('test_returnOfInvalidType_void', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_returnOfInvalidType_void);
@@ -14802,6 +15023,17 @@
     verify([source]);
   }
 
+  void test_importDeferredLibraryWithLoadFunction() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as lib1;",
+        "main() { lib1.f(); }"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_missingReturn_emptyFunctionBody() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int m();", "}"]));
     resolve(source);
@@ -15341,6 +15573,10 @@
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_duplicateImport_show);
       });
+      _ut.test('test_importDeferredLibraryWithLoadFunction', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
+      });
       _ut.test('test_missingReturn_emptyFunctionBody', () {
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_missingReturn_emptyFunctionBody);
@@ -17511,13 +17747,6 @@
     _listener.assertNoErrors();
   }
 
-  void test_visitArgumentDefinitionTest() {
-    // ?p
-    Expression node = AstFactory.argumentDefinitionTest("p");
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
   void test_visitAsExpression() {
     // class A { ... this as B ... }
     // class B extends A {}
@@ -18447,10 +18676,6 @@
         final __test = new StaticTypeAnalyzerTest();
         runJUnitTest(__test, __test.test_visitAdjacentStrings);
       });
-      _ut.test('test_visitArgumentDefinitionTest', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
-      });
       _ut.test('test_visitAsExpression', () {
         final __test = new StaticTypeAnalyzerTest();
         runJUnitTest(__test, __test.test_visitAsExpression);
@@ -23019,6 +23244,32 @@
     verify([source]);
   }
 
+  void test_typeAnnotationDeferredClass_typeArgumentList() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class C<E> {}",
+        "C<a.A> c;"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_typeArgumentList2() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class C<E, F> {}",
+        "C<a.A, a.A> c;"]));
+    resolve(source);
+    assertErrors(source, [
+        StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
+        StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
   void test_typeAnnotationDeferredClass_typeParameter_bound() {
     addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
     Source source = addSource(EngineTestCase.createSource([
@@ -24074,6 +24325,14 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_simpleFormalParameter);
       });
+      _ut.test('test_typeAnnotationDeferredClass_typeArgumentList', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeArgumentList);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_typeArgumentList2', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeArgumentList2);
+      });
       _ut.test('test_typeAnnotationDeferredClass_typeParameter_bound', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeParameter_bound);
@@ -26523,5 +26782,6 @@
 //  StaticWarningCodeTest.dartSuite();
 //  StrictModeTest.dartSuite();
 //  TypePropagationTest.dartSuite();
+//  //AnalysisDeltaTest.dartSuite();
 //  ChangeSetTest.dartSuite();
 }
\ No newline at end of file
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 995876b..fe7f86b 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -473,14 +473,23 @@
   }
 
   /**
+   * Add all of the given errors to this listener.
+   *
+   * @param the errors to be added
+   */
+  void addAll(List<AnalysisError> errors) {
+    for (AnalysisError error in errors) {
+      onError(error);
+    }
+  }
+
+  /**
    * Add all of the errors recorded by the given listener to this listener.
    *
    * @param listener the listener that has recorded the errors to be added
    */
-  void addAll(RecordingErrorListener listener) {
-    for (AnalysisError error in listener.errors) {
-      onError(error);
-    }
+  void addAll2(RecordingErrorListener listener) {
+    addAll(listener.errors);
   }
 
   /**
diff --git a/pkg/args/CHANGELOG.md b/pkg/args/CHANGELOG.md
index aadaddc..cb8acb9 100644
--- a/pkg/args/CHANGELOG.md
+++ b/pkg/args/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.11.0
+
+* Move handling trailing options from `ArgParser.parse()` into `ArgParser`
+  itself. This lets subcommands have different behavior for how they handle
+  trailing options.
+
 ## 0.10.0+2
 
 * Usage ignores hidden options when determining column widths.
diff --git a/pkg/args/lib/args.dart b/pkg/args/lib/args.dart
index 4b9f857..bdd61a5 100644
--- a/pkg/args/lib/args.dart
+++ b/pkg/args/lib/args.dart
@@ -286,15 +286,32 @@
    */
   final Map<String, ArgParser> commands;
 
-  /** Creates a new ArgParser. */
-  factory ArgParser() =>
-      new ArgParser._(<String, Option>{}, <String, ArgParser>{});
+  /**
+   * Whether or not this parser parses options that appear after non-option
+   * arguments.
+   */
+  final bool allowTrailingOptions;
 
-  ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands) :
+  /**
+   * Creates a new ArgParser.
+   *
+   * If [allowTrailingOptions] is set, the parser will continue parsing even
+   * after it finds an argument that is neither an option nor a command.
+   * This allows options to be specified after regular arguments. Defaults to
+   * `false`.
+   */
+  factory ArgParser({bool allowTrailingOptions}) =>
+      new ArgParser._(<String, Option>{}, <String, ArgParser>{},
+          allowTrailingOptions: allowTrailingOptions);
+
+  ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands,
+      {bool allowTrailingOptions}) :
     this._options = options,
     this.options = new UnmodifiableMapView(options),
     this._commands = commands,
-    this.commands = new UnmodifiableMapView(commands);
+    this.commands = new UnmodifiableMapView(commands),
+    this.allowTrailingOptions = allowTrailingOptions != null ?
+        allowTrailingOptions : false;
 
   /**
    * Defines a command.
@@ -366,20 +383,9 @@
   /**
    * Parses [args], a list of command-line arguments, matches them against the
    * flags and options defined by this parser, and returns the result.
-   *
-   * If [allowTrailingOptions] is set, the parser will continue parsing even
-   * after it finds an argument that is neither an option nor a command.
-   * This allows options to be specified after regular arguments.
-   *
-   * [allowTrailingOptions] is false by default, so when a non-option,
-   * non-command argument is encountered, it and all remaining arguments,
-   * even those that look like options are passed to the innermost command.
    */
-  ArgResults parse(List<String> args, {bool allowTrailingOptions}) {
-    if (allowTrailingOptions == null) allowTrailingOptions = false;
-    return new Parser(null, this, args.toList(), null, null,
-        allowTrailingOptions: allowTrailingOptions).parse();
-  }
+  ArgResults parse(List<String> args) =>
+      new Parser(null, this, args.toList(), null, null).parse();
 
   /**
    * Generates a string displaying usage information for the defined options.
diff --git a/pkg/args/lib/src/parser.dart b/pkg/args/lib/src/parser.dart
index 550fe63..bccce64 100644
--- a/pkg/args/lib/src/parser.dart
+++ b/pkg/args/lib/src/parser.dart
@@ -28,9 +28,6 @@
    */
   final Parser parent;
 
-  /** If `true`, parsing will continue after a non-option argument. */
-  final bool allowTrailingOptions;
-
   /** The grammar being parsed. */
   final ArgParser grammar;
 
@@ -43,8 +40,7 @@
   /** The accumulated parsed options. */
   final Map<String, dynamic> results = <String, dynamic>{};
 
-  Parser(this.commandName, this.grammar, this.args, this.parent, rest,
-      {this.allowTrailingOptions: false}) {
+  Parser(this.commandName, this.grammar, this.args, this.parent, rest) {
     if (rest != null) this.rest.addAll(rest);
   }
 
@@ -79,8 +75,7 @@
       if (command != null) {
         validate(rest.isEmpty, 'Cannot specify arguments before a command.');
         var commandName = args.removeAt(0);
-        var commandParser = new Parser(commandName, command, args, this, rest,
-            allowTrailingOptions: allowTrailingOptions);
+        var commandParser = new Parser(commandName, command, args, this, rest);
         commandResults = commandParser.parse();
 
         // All remaining arguments were passed to command so clear them here.
@@ -96,7 +91,7 @@
 
       // This argument is neither option nor command, so stop parsing unless
       // the [allowTrailingOptions] option is set.
-      if (!allowTrailingOptions) break;
+      if (!grammar.allowTrailingOptions) break;
       rest.add(args.removeAt(0));
     }
 
diff --git a/pkg/args/pubspec.yaml b/pkg/args/pubspec.yaml
index ce264e1..a5c1a18 100644
--- a/pkg/args/pubspec.yaml
+++ b/pkg/args/pubspec.yaml
@@ -1,5 +1,5 @@
 name: args
-version: 0.10.0+2
+version: 0.11.0
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 documentation: http://api.dartlang.org/docs/pkg/args
@@ -10,6 +10,6 @@
 dependencies:
   collection: ">=0.9.0 <0.10.0"
 dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
+  unittest: ">=0.9.0 <0.11.0"
 environment:
   sdk: ">=1.0.0 <2.0.0"
diff --git a/pkg/args/test/parse_all_test.dart b/pkg/args/test/parse_all_test.dart
deleted file mode 100644
index d404c2f..0000000
--- a/pkg/args/test/parse_all_test.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library parse_all_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:args/args.dart';
-
-void main() {
-  group('ArgParser.parse(allowTrailingOptions: true) '
-        'starting with a non-option', () {
-    test('followed by flag', () {
-      var parser = new ArgParser()..addFlag('flag');
-      var args = ['A', '--flag'];
-
-      var resultsAll = parser.parse(args, allowTrailingOptions: true);
-      expect(resultsAll['flag'], isTrue);
-      expect(resultsAll.rest, equals(['A']));
-    });
-
-    test('followed by option', () {
-      var parser = new ArgParser()..addOption('opt');
-      var args = ['A', '--opt'];
-
-      expectThrows(parser, args);
-    });
-
-    test('followed by option and value', () {
-      var parser = new ArgParser()..addOption('opt');
-      var args = ['A', '--opt', 'V'];
-
-      var resultsAll = parser.parse(args, allowTrailingOptions: true);
-      expect(resultsAll['opt'], equals('V'));
-      expect(resultsAll.rest, equals(['A']));
-    });
-
-    test('followed by unknown flag', () {
-      var parser = new ArgParser();
-      var args = ['A', '--xflag'];
-
-      expectThrows(parser, args);
-    });
-
-    test('followed by unknown option and value', () {
-      var parser = new ArgParser();
-      var args = ['A', '--xopt', 'V'];
-
-      expectThrows(parser, args);
-    });
-
-    test('followed by command', () {
-      var parser = new ArgParser()..addCommand('com');
-      var args = ['A', 'com'];
-
-      expectThrows(parser, args);
-    });
-  });
-}
-
-void expectThrows(ArgParser parser, List<String> args) =>
-  expect(() => parser.parse(args, allowTrailingOptions: true),
-      throwsFormatException,
-      reason: "with allowTrailingOptions: true");
diff --git a/pkg/args/test/parse_test.dart b/pkg/args/test/parse_test.dart
index 659c08e..56320d6 100644
--- a/pkg/args/test/parse_test.dart
+++ b/pkg/args/test/parse_test.dart
@@ -53,6 +53,15 @@
 
         throwsFormat(parser, ['--verbose=true']);
       });
+
+      test('are case-sensitive', () {
+        var parser = new ArgParser();
+        parser.addFlag('verbose');
+        parser.addFlag('Verbose');
+        var results = parser.parse(['--verbose']);
+        expect(results['verbose'], isTrue);
+        expect(results['Verbose'], isFalse);
+      });
     });
 
     group('flags negated with "no-"', () {
@@ -295,6 +304,15 @@
         // The '?!' means this can only be understood as '--apple b?!c'.
         throwsFormat(parser, ['-ab?!c']);
       });
+
+      test('are case-sensitive', () {
+        var parser = new ArgParser();
+        parser.addFlag('file', abbr: 'f');
+        parser.addFlag('force', abbr: 'F');
+        var results = parser.parse(['-f']);
+        expect(results['file'], isTrue);
+        expect(results['force'], isFalse);
+      });
     });
 
     group('options', () {
@@ -384,6 +402,15 @@
         var args = parser.parse(['']);
         expect(args['define'], equals(['0']));
       });
+
+      test('are case-sensitive', () {
+        var parser = new ArgParser();
+        parser.addOption('verbose', defaultsTo: 'no');
+        parser.addOption('Verbose', defaultsTo: 'no');
+        var results = parser.parse(['--verbose', 'chatty']);
+        expect(results['verbose'], equals('chatty'));
+        expect(results['Verbose'], equals('no'));
+      });
     });
 
     group('remaining args', () {
@@ -397,10 +424,10 @@
         expect(results['woof'], isTrue);
         expect(results['meow'], equals('v'));
         expect(results['tweet'], equals('bird'));
-        expect(results.rest, orderedEquals(['not', 'option']));
+        expect(results.rest, equals(['not', 'option']));
       });
 
-      test('stops parsing at "--"', () {
+      test('consumes "--" and stops', () {
         var parser = new ArgParser();
         parser.addFlag('woof', defaultsTo: false);
         parser.addOption('meow', defaultsTo: 'kitty');
@@ -408,16 +435,16 @@
         var results = parser.parse(['--woof', '--', '--meow']);
         expect(results['woof'], isTrue);
         expect(results['meow'], equals('kitty'));
-        expect(results.rest, orderedEquals(['--meow']));
+        expect(results.rest, equals(['--meow']));
       });
 
-      test('handles options with case-sensitivity', () {
+      test('leaves "--" if not the first non-option', () {
         var parser = new ArgParser();
-        parser.addFlag('recurse', defaultsTo: false, abbr:'R');
-        var results = parser.parse(['-R']);
-        expect(results['recurse'], isTrue);
-        expect(results.rest, [ ]);
-        throwsFormat(parser, ['-r']);
+        parser.addFlag('woof');
+
+        var results = parser.parse(['--woof', 'stop', '--', 'arg']);
+        expect(results['woof'], isTrue);
+        expect(results.rest, equals(['stop', '--', 'arg']));
       });
     });
   });
diff --git a/pkg/args/test/trailing_options_test.dart b/pkg/args/test/trailing_options_test.dart
new file mode 100644
index 0000000..2ee860c
--- /dev/null
+++ b/pkg/args/test/trailing_options_test.dart
@@ -0,0 +1,100 @@
+// 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 trailing_options_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:args/args.dart';
+
+void main() {
+  test('allowTrailingOptions defaults to false', () {
+    var parser = new ArgParser();
+    expect(parser.allowTrailingOptions, isFalse);
+  });
+
+  group('when trailing options are allowed', () {
+    var parser;
+    setUp(() {
+      parser = new ArgParser(allowTrailingOptions: true);
+    });
+
+    void expectThrows(List<String> args) =>
+      expect(() => parser.parse(args), throwsFormatException,
+          reason: "with allowTrailingOptions: true");
+
+    test('collects non-options in rest', () {
+      parser.addFlag('flag');
+      parser.addOption('opt', abbr: 'o');
+      var results = parser.parse(['a', '--flag', 'b', '-o', 'value', 'c']);
+      expect(results['flag'], isTrue);
+      expect(results['opt'], equals('value'));
+      expect(results.rest, equals(['a', 'b', 'c']));
+    });
+
+    test('stops parsing options at "--"', () {
+      parser.addFlag('flag');
+      parser.addOption('opt', abbr: 'o');
+      var results = parser.parse(['a', '--flag', '--', '-ovalue', 'c']);
+      expect(results['flag'], isTrue);
+      expect(results.rest, equals(['a', '-ovalue', 'c']));
+    });
+
+    test('only consumes first "--"', () {
+      parser.addFlag('flag', abbr: 'f');
+      parser.addOption('opt', abbr: 'o');
+      var results = parser.parse(['a', '--', 'b', '--', 'c']);
+      expect(results.rest, equals(['a', 'b', '--', 'c']));
+    });
+
+    test('parses a trailing flag', () {
+      parser.addFlag('flag');
+      var results = parser.parse(['arg', '--flag']);
+
+      expect(results['flag'], isTrue);
+      expect(results.rest, equals(['arg']));
+    });
+
+    test('throws on a trailing option missing its value', () {
+      parser.addOption('opt');
+      expectThrows(['arg', '--opt']);
+    });
+
+    test('parses a trailing option', () {
+      parser.addOption('opt');
+      var results = parser.parse(['arg', '--opt', 'v']);
+      expect(results['opt'], equals('v'));
+      expect(results.rest, equals(['arg']));
+    });
+
+    test('throws on a trailing unknown flag', () {
+      expectThrows(['arg', '--xflag']);
+    });
+
+    test('throws on a trailing unknown option and value', () {
+      expectThrows(['arg', '--xopt', 'v']);
+    });
+
+    test('throws on a command', () {
+      parser.addCommand('com');
+      expectThrows(['arg', 'com']);
+    });
+  });
+
+  test("uses the innermost command's trailing options behavior", () {
+    var parser = new ArgParser(allowTrailingOptions: true);
+    parser.addFlag('flag', abbr: 'f');
+    var command = parser.addCommand('cmd',
+        new ArgParser(allowTrailingOptions: false));
+    command.addFlag('verbose', abbr: 'v');
+
+    var results = parser.parse(['a', '-f', 'b']);
+    expect(results['flag'], isTrue);
+    expect(results.rest, equals(['a', 'b']));
+
+    results = parser.parse(['cmd', '-f', 'a', '-v', '--unknown']);
+    expect(results['flag'], isTrue); // Not trailing.
+    expect(results.command['verbose'], isFalse);
+    expect(results.command.rest, equals(['a', '-v', '--unknown']));
+  });
+}
diff --git a/pkg/barback/lib/barback.dart b/pkg/barback/lib/barback.dart
index cbb55fc..e764f1a 100644
--- a/pkg/barback/lib/barback.dart
+++ b/pkg/barback/lib/barback.dart
@@ -4,20 +4,21 @@
 
 library barback;
 
-export 'src/asset.dart';
-export 'src/asset_id.dart';
-export 'src/asset_set.dart';
+export 'src/asset/asset.dart';
+export 'src/asset/asset_id.dart';
+export 'src/asset/asset_set.dart';
 export 'src/barback.dart';
-export 'src/barback_settings.dart';
-export 'src/base_transform.dart';
 export 'src/build_result.dart';
-export 'src/declaring_transform.dart' hide DeclaringTransformController;
-export 'src/declaring_transformer.dart';
 export 'src/errors.dart' hide flattenAggregateExceptions;
-export 'src/lazy_transformer.dart';
 export 'src/log.dart';
 export 'src/package_provider.dart';
-export 'src/transform.dart' hide TransformController;
-export 'src/transform_logger.dart';
-export 'src/transformer.dart';
-export 'src/transformer_group.dart';
+export 'src/transformer/barback_settings.dart';
+export 'src/transformer/base_transform.dart';
+export 'src/transformer/declaring_transform.dart'
+    hide DeclaringTransformController;
+export 'src/transformer/declaring_transformer.dart';
+export 'src/transformer/lazy_transformer.dart';
+export 'src/transformer/transform.dart' hide TransformController;
+export 'src/transformer/transform_logger.dart';
+export 'src/transformer/transformer.dart';
+export 'src/transformer/transformer_group.dart';
diff --git a/pkg/barback/lib/src/asset.dart b/pkg/barback/lib/src/asset/asset.dart
similarity index 97%
rename from pkg/barback/lib/src/asset.dart
rename to pkg/barback/lib/src/asset/asset.dart
index 5f05059..c0f11ba 100644
--- a/pkg/barback/lib/src/asset.dart
+++ b/pkg/barback/lib/src/asset/asset.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.
 
-library barback.asset;
+library barback.asset.asset;
 
 import 'dart:async';
 import 'dart:io';
diff --git a/pkg/barback/lib/src/asset_forwarder.dart b/pkg/barback/lib/src/asset/asset_forwarder.dart
similarity index 97%
rename from pkg/barback/lib/src/asset_forwarder.dart
rename to pkg/barback/lib/src/asset/asset_forwarder.dart
index a2440e0..03c493c 100644
--- a/pkg/barback/lib/src/asset_forwarder.dart
+++ b/pkg/barback/lib/src/asset/asset_forwarder.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.
 
-library barback.asset_forwarder;
+library barback.asset.asset_forwarder;
 
 import 'dart:async';
 
diff --git a/pkg/barback/lib/src/asset_id.dart b/pkg/barback/lib/src/asset/asset_id.dart
similarity index 98%
rename from pkg/barback/lib/src/asset_id.dart
rename to pkg/barback/lib/src/asset/asset_id.dart
index e091264..adb2247 100644
--- a/pkg/barback/lib/src/asset_id.dart
+++ b/pkg/barback/lib/src/asset/asset_id.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.
 
-library barback.asset_id;
+library barback.asset.asset_id;
 
 import 'package:path/path.dart' as pathos;
 
diff --git a/pkg/barback/lib/src/asset_node.dart b/pkg/barback/lib/src/asset/asset_node.dart
similarity index 98%
rename from pkg/barback/lib/src/asset_node.dart
rename to pkg/barback/lib/src/asset/asset_node.dart
index c0593e5..45d1b17 100644
--- a/pkg/barback/lib/src/asset_node.dart
+++ b/pkg/barback/lib/src/asset/asset_node.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.
 
-library barback.asset_node;
+library barback.asset.asset_node;
 
 import 'dart:async';
 
+import '../errors.dart';
+import '../graph/transform_node.dart';
+import '../utils.dart';
 import 'asset.dart';
 import 'asset_id.dart';
-import 'errors.dart';
-import 'transform_node.dart';
-import 'utils.dart';
 
 /// Describes the current state of an asset as part of a transformation graph.
 ///
diff --git a/pkg/barback/lib/src/asset_node_set.dart b/pkg/barback/lib/src/asset/asset_node_set.dart
similarity index 94%
rename from pkg/barback/lib/src/asset_node_set.dart
rename to pkg/barback/lib/src/asset/asset_node_set.dart
index be897b9..4474866 100644
--- a/pkg/barback/lib/src/asset_node_set.dart
+++ b/pkg/barback/lib/src/asset/asset_node_set.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.
 
-library barback.asset_node_set;
+library barback.asset.asset_node_set;
 
 import 'package:collection/collection.dart';
 
diff --git a/pkg/barback/lib/src/asset_set.dart b/pkg/barback/lib/src/asset/asset_set.dart
similarity index 98%
rename from pkg/barback/lib/src/asset_set.dart
rename to pkg/barback/lib/src/asset/asset_set.dart
index b17db97..d385ec22 100644
--- a/pkg/barback/lib/src/asset_set.dart
+++ b/pkg/barback/lib/src/asset/asset_set.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.
 
-library barback.asset_set;
+library barback.asset.asset_set;
 
 import 'dart:collection';
 
diff --git a/pkg/barback/lib/src/asset/internal_asset.dart b/pkg/barback/lib/src/asset/internal_asset.dart
new file mode 100644
index 0000000..dfacba5
--- /dev/null
+++ b/pkg/barback/lib/src/asset/internal_asset.dart
@@ -0,0 +1,187 @@
+// 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 barback.asset.internal_asset;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:typed_data';
+
+import '../serialize.dart';
+import '../utils.dart';
+import '../utils/file_pool.dart';
+import '../utils/stream_replayer.dart';
+import 'asset.dart';
+import 'asset_id.dart';
+
+/// Serialize an asset to a form that's safe to send across isolates.
+Map serializeAsset(Asset asset) {
+  var id = serializeId(asset.id);
+  if (asset is BinaryAsset) {
+    return {
+      'type': 'binary',
+      'id': id,
+      'contents': asset._contents
+    };
+  } else if (asset is FileAsset) {
+    return {
+      'type': 'file',
+      'id': id,
+      'path': asset._path
+    };
+  } else if (asset is StringAsset) {
+    return {
+      'type': 'string',
+      'id': id,
+      'contents': asset._contents
+    };
+  } else {
+    // [asset] is probably a [StreamAsset], but it's possible that the user has
+    // created a custom subclass, in which case we just serialize the stream
+    // anyway.
+    return {
+      'type': 'stream',
+      'id': id,
+      'stream': serializeStream(asset.read())
+    };
+  }
+}
+
+/// Deserialize an asset from the form returned by [serialize].
+Asset deserializeAsset(Map asset) {
+  var id = deserializeId(asset['id']);
+  switch (asset['type']) {
+    case 'binary': return new BinaryAsset(id, asset['contents']);
+    case 'file': return new FileAsset(id, asset['path']);
+    case 'string': return new StringAsset(id, asset['contents']);
+    case 'stream':
+      return new StreamAsset(id, deserializeStream(asset['stream']));
+    default:
+      throw new FormatException('Unknown asset type "${asset['type']}".');
+  }
+}
+
+/// An asset whose data is stored in a list of bytes.
+class BinaryAsset implements Asset {
+  final AssetId id;
+
+  final Uint8List _contents;
+
+  BinaryAsset(this.id, List<int> contents)
+      : _contents = toUint8List(contents);
+
+  Future<String> readAsString({Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+
+    return new Future.value(encoding.decode(_contents));
+  }
+
+  Stream<List<int>> read() => new Future<List<int>>.value(_contents).asStream();
+
+  String toString() {
+    var buffer = new StringBuffer();
+    buffer.write("Bytes [");
+
+    // Don't show the whole list if it's long.
+    if (_contents.length > 11) {
+      for (var i = 0; i < 5; i++) {
+        buffer.write(byteToHex(_contents[i]));
+        buffer.write(" ");
+      }
+
+      buffer.write("...");
+
+      for (var i = _contents.length - 5; i < _contents.length; i++) {
+        buffer.write(" ");
+        buffer.write(byteToHex(_contents[i]));
+      }
+    } else {
+      for (var i = 0; i < _contents.length; i++) {
+        if (i > 0) buffer.write(" ");
+        buffer.write(byteToHex(_contents[i]));
+      }
+    }
+
+    buffer.write("]");
+    return buffer.toString();
+  }
+}
+
+/// An asset backed by a file on the local file system.
+class FileAsset implements Asset {
+  final AssetId id;
+
+  /// Use a [FilePool] to handle reads so we can try to cope with running out
+  /// of file descriptors more gracefully.
+  static final _pool = new FilePool();
+
+  final String _path;
+  FileAsset(this.id, this._path);
+
+  Future<String> readAsString({Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return _pool.readAsString(_path, encoding);
+  }
+
+  Stream<List<int>> read() => _pool.openRead(_path);
+
+  String toString() => 'File "${_path}"';
+}
+
+/// An asset whose data is stored in a string.
+class StringAsset implements Asset {
+  final AssetId id;
+
+  final String _contents;
+
+  StringAsset(this.id, this._contents);
+
+  Future<String> readAsString({Encoding encoding}) =>
+      new Future.value(_contents);
+
+  Stream<List<int>> read() =>
+      new Future<List<int>>.value(UTF8.encode(_contents)).asStream();
+
+  String toString() {
+    // Don't show the whole string if it's long.
+    var contents = _contents;
+    if (contents.length > 40) {
+      contents = contents.substring(0, 20) + " ... " +
+                 contents.substring(contents.length - 20);
+    }
+
+    contents = _escape(contents);
+    return 'String "$contents"';
+  }
+
+  String _escape(String string) {
+    return string
+        .replaceAll("\"", r'\"')
+        .replaceAll("\n", r"\n")
+        .replaceAll("\r", r"\r")
+        .replaceAll("\t", r"\t");
+  }
+}
+
+/// An asset whose data is available from a stream.
+class StreamAsset implements Asset {
+  final AssetId id;
+
+  /// A stream replayer that records and replays the contents of the input
+  /// stream.
+  final StreamReplayer<List<int>> _replayer;
+
+  StreamAsset(this.id, Stream<List<int>> stream)
+      : _replayer = new StreamReplayer(stream);
+
+  Future<String> readAsString({Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return _replayer.getReplay().toList()
+        .then((chunks) => encoding.decode(flatten(chunks)));
+  }
+
+  Stream<List<int>> read() => _replayer.getReplay();
+
+  String toString() => "Stream";
+}
diff --git a/pkg/barback/lib/src/barback.dart b/pkg/barback/lib/src/barback.dart
index 1027369..e8cbedc 100644
--- a/pkg/barback/lib/src/barback.dart
+++ b/pkg/barback/lib/src/barback.dart
@@ -6,15 +6,15 @@
 
 import 'dart:async';
 
-import 'asset.dart';
-import 'asset_id.dart';
-import 'asset_set.dart';
+import 'asset/asset.dart';
+import 'asset/asset_id.dart';
+import 'asset/asset_set.dart';
 import 'log.dart';
 import 'build_result.dart';
 import 'errors.dart';
-import 'package_graph.dart';
+import 'graph/package_graph.dart';
 import 'package_provider.dart';
-import 'transformer.dart';
+import 'transformer/transformer.dart';
 
 /// A general-purpose asynchronous build dependency graph manager.
 ///
diff --git a/pkg/barback/lib/src/errors.dart b/pkg/barback/lib/src/errors.dart
index 5303b9d..290d534 100644
--- a/pkg/barback/lib/src/errors.dart
+++ b/pkg/barback/lib/src/errors.dart
@@ -6,8 +6,8 @@
 
 import 'package:stack_trace/stack_trace.dart';
 
-import 'asset_id.dart';
-import 'transformer.dart';
+import 'asset/asset_id.dart';
+import 'transformer/transformer.dart';
 import 'utils.dart';
 
 /// Error thrown when an asset with [id] cannot be found.
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/graph/asset_cascade.dart
similarity index 96%
rename from pkg/barback/lib/src/asset_cascade.dart
rename to pkg/barback/lib/src/graph/asset_cascade.dart
index 01c0659..ca08785 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/graph/asset_cascade.dart
@@ -2,22 +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.
 
-library barback.asset_cascade;
+library barback.graph.asset_cascade;
 
 import 'dart:async';
 
-import 'asset.dart';
-import 'asset_id.dart';
-import 'asset_node.dart';
-import 'asset_set.dart';
-import 'cancelable_future.dart';
-import 'errors.dart';
-import 'log.dart';
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_set.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/transformer.dart';
+import '../utils/cancelable_future.dart';
 import 'node_status.dart';
 import 'node_streams.dart';
 import 'package_graph.dart';
 import 'phase.dart';
-import 'transformer.dart';
 
 /// The asset cascade for an individual package.
 ///
diff --git a/pkg/barback/lib/src/group_runner.dart b/pkg/barback/lib/src/graph/group_runner.dart
similarity index 93%
rename from pkg/barback/lib/src/group_runner.dart
rename to pkg/barback/lib/src/graph/group_runner.dart
index e17f7fe..ce58eda 100644
--- a/pkg/barback/lib/src/group_runner.dart
+++ b/pkg/barback/lib/src/graph/group_runner.dart
@@ -2,17 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library barback.group_runner;
+library barback.graph.group_runner;
 
 import 'dart:async';
 
+import '../asset/asset_node.dart';
+import '../log.dart';
+import '../transformer/transformer_group.dart';
+import '../utils/stream_pool.dart';
 import 'asset_cascade.dart';
-import 'asset_node.dart';
-import 'log.dart';
 import 'node_status.dart';
 import 'phase.dart';
-import 'stream_pool.dart';
-import 'transformer_group.dart';
 
 /// A class that processes all of the phases in a single transformer group.
 ///
diff --git a/pkg/barback/lib/src/node_status.dart b/pkg/barback/lib/src/graph/node_status.dart
similarity index 98%
rename from pkg/barback/lib/src/node_status.dart
rename to pkg/barback/lib/src/graph/node_status.dart
index 21d26c6..a42e523 100644
--- a/pkg/barback/lib/src/node_status.dart
+++ b/pkg/barback/lib/src/graph/node_status.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.
 
-library barback.node_status;
+library barback.graph.node_status;
 
 /// The status of a node in barback's package graph.
 ///
diff --git a/pkg/barback/lib/src/node_streams.dart b/pkg/barback/lib/src/graph/node_streams.dart
similarity index 90%
rename from pkg/barback/lib/src/node_streams.dart
rename to pkg/barback/lib/src/graph/node_streams.dart
index 194314f..8344792 100644
--- a/pkg/barback/lib/src/node_streams.dart
+++ b/pkg/barback/lib/src/graph/node_streams.dart
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library barback.node_streams;
+library barback.graph.node_streams;
 
 import 'dart:async';
 
-import 'asset_node.dart';
-import 'log.dart';
+import '../asset/asset_node.dart';
+import '../log.dart';
+import '../utils/stream_pool.dart';
 import 'node_status.dart';
-import 'stream_pool.dart';
 
 /// A collection of streams that are common to nodes in barback's package graph.
 class NodeStreams {
@@ -39,6 +39,9 @@
 
   var _previousStatus = NodeStatus.RUNNING;
 
+  /// Whether [this] has been closed.
+  bool get isClosed => onAssetController.isClosed;
+
   NodeStreams() {
     onAssetPool.add(onAssetController.stream);
     onLogPool.add(onLogController.stream);
diff --git a/pkg/barback/lib/src/package_graph.dart b/pkg/barback/lib/src/graph/package_graph.dart
similarity index 96%
rename from pkg/barback/lib/src/package_graph.dart
rename to pkg/barback/lib/src/graph/package_graph.dart
index bbb480d..8cd4715 100644
--- a/pkg/barback/lib/src/package_graph.dart
+++ b/pkg/barback/lib/src/graph/package_graph.dart
@@ -2,22 +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.
 
-library barback.package_graph;
+library barback.graph.package_graph;
 
 import 'dart:async';
 import 'dart:collection';
 
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_set.dart';
+import '../build_result.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../package_provider.dart';
+import '../transformer/transformer.dart';
+import '../utils.dart';
 import 'asset_cascade.dart';
-import 'asset_id.dart';
-import 'asset_node.dart';
-import 'asset_set.dart';
-import 'build_result.dart';
-import 'errors.dart';
-import 'log.dart';
 import 'node_status.dart';
-import 'package_provider.dart';
-import 'transformer.dart';
-import 'utils.dart';
 
 /// The collection of [AssetCascade]s for an entire application.
 ///
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/graph/phase.dart
similarity index 81%
rename from pkg/barback/lib/src/phase.dart
rename to pkg/barback/lib/src/graph/phase.dart
index 103e0e8..70f7e7f 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/graph/phase.dart
@@ -2,25 +2,26 @@
 // for 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 barback.phase;
+library barback.graph.phase;
 
 import 'dart:async';
 
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_node_set.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/transformer.dart';
+import '../transformer/transformer_group.dart';
+import '../utils.dart';
+import '../utils/multiset.dart';
 import 'asset_cascade.dart';
-import 'asset_id.dart';
-import 'asset_node.dart';
-import 'errors.dart';
 import 'group_runner.dart';
-import 'log.dart';
-import 'multiset.dart';
 import 'node_status.dart';
 import 'node_streams.dart';
 import 'phase_forwarder.dart';
-import 'phase_input.dart';
 import 'phase_output.dart';
-import 'transformer.dart';
-import 'transformer_group.dart';
-import 'utils.dart';
+import 'transformer_classifier.dart';
 
 /// One phase in the ordered series of transformations in an [AssetCascade].
 ///
@@ -44,11 +45,6 @@
   /// The index of [this] in its parent cascade or group.
   final int _index;
 
-  /// The transformers that can access [inputs].
-  ///
-  /// Their outputs will be available to the next phase.
-  final _transformers = new Set<Transformer>();
-
   /// The groups for this phase.
   final _groups = new Map<TransformerGroup, GroupRunner>();
 
@@ -56,7 +52,10 @@
   ///
   /// For the first phase, these will be the source assets. For all other
   /// phases, they will be the outputs from the previous phase.
-  final _inputs = new Map<AssetId, PhaseInput>();
+  final _inputs = new AssetNodeSet();
+
+  /// The transformer classifiers for this phase.
+  final _classifiers = new Map<Transformer, TransformerClassifier>();
 
   /// The forwarders for this phase.
   final _forwarders = new Map<AssetId, PhaseForwarder>();
@@ -68,13 +67,12 @@
   /// phase.
   ///
   /// This is used to determine which assets have been passed unmodified through
-  /// [_inputs] or [_groups]. Each input asset has a PhaseInput in [_inputs]. If
-  /// that input isn't consumed by any transformers, it will be forwarded
-  /// through the PhaseInput. However, it's possible that it was consumed by a
-  /// group, and so shouldn't be forwarded through the phase as a whole.
+  /// [_classifiers] or [_groups]. It's possible that a given asset was consumed
+  /// by a group and not an individual transformer, and so shouldn't be
+  /// forwarded through the phase as a whole.
   ///
   /// In order to detect whether an output has been forwarded through a group or
-  /// a PhaseInput, we must be able to distinguish it from other outputs with
+  /// a classifier, we must be able to distinguish it from other outputs with
   /// the same id. To do so, we check if its origin is in [_inputOrigins]. If
   /// so, it's been forwarded unmodified.
   final _inputOrigins = new Multiset<AssetNode>();
@@ -87,12 +85,19 @@
 
   /// How far along [this] is in processing its assets.
   NodeStatus get status {
-    var inputStatus = NodeStatus.dirtiest(
-        _inputs.values.map((input) => input.status));
+    // Before any transformers are added, the phase should be dirty if and only
+    // if any input is dirty.
+    if (_classifiers.isEmpty && _groups.isEmpty) {
+      return _inputs.any((input) => input.state.isDirty) ?
+          NodeStatus.RUNNING : NodeStatus.IDLE;
+    }
+
+    var classifierStatus = NodeStatus.dirtiest(
+        _classifiers.values.map((classifier) => classifier.status));
     var groupStatus = NodeStatus.dirtiest(
         _groups.values.map((group) => group.status));
     return (previous == null ? NodeStatus.IDLE : previous.status)
-        .dirtier(inputStatus)
+        .dirtier(classifierStatus)
         .dirtier(groupStatus);
   }
 
@@ -157,12 +162,10 @@
   /// removed and re-created. The phase will automatically handle updated assets
   /// using the [AssetNode.onStateChange] stream.
   void addInput(AssetNode node) {
-    if (_inputs.containsKey(node.id)) _inputs[node.id].remove();
-
     // Each group is one channel along which an asset may be forwarded, as is
     // each transformer.
     var forwarder = new PhaseForwarder(
-        node, _transformers.length, _groups.length);
+        node, _classifiers.length, _groups.length);
     _forwarders[node.id] = forwarder;
     forwarder.onAsset.listen(_handleOutputWithoutForwarder);
     if (forwarder.output != null) {
@@ -170,20 +173,18 @@
     }
 
     _inputOrigins.add(node.origin);
-    var input = new PhaseInput(this, node, "$_location.$_index");
-    _inputs[node.id] = input;
-    input.input.whenRemoved(() {
-      _inputOrigins.remove(node.origin);
-      _inputs.remove(node.id);
-      _forwarders.remove(node.id).remove();
+    _inputs.add(node);
+    node.onStateChange.listen((state) {
+      if (state.isRemoved) {
+        _inputOrigins.remove(node.origin);
+        _forwarders.remove(node.id).remove();
+      }
       _streams.changeStatus(status);
     });
-    input.onAsset.listen(_handleOutput);
-    _streams.onLogPool.add(input.onLog);
-    input.onStatusChange.listen((_) => _streams.changeStatus(status));
 
-    input.updateTransformers(_transformers);
-
+    for (var classifier in _classifiers.values) {
+      classifier.addInput(node);
+    }
     for (var group in _groups.values) {
       group.addInput(node);
     }
@@ -235,11 +236,23 @@
 
   /// Set this phase's transformers to [transformers].
   void updateTransformers(Iterable transformers) {
-    var actualTransformers = transformers.where((op) => op is Transformer);
-    _transformers.clear();
-    _transformers.addAll(actualTransformers);
-    for (var input in _inputs.values) {
-      input.updateTransformers(actualTransformers);
+    var newTransformers = transformers.where((op) => op is Transformer)
+        .toSet();
+    var oldTransformers = _classifiers.keys.toSet();
+    for (var removed in oldTransformers.difference(newTransformers)) {
+      _classifiers.remove(removed).remove();
+    }
+
+    for (var transformer in newTransformers.difference(oldTransformers)) {
+      var classifier = new TransformerClassifier(
+          this, transformer, "$_location.$_index");
+      _classifiers[transformer] = classifier;
+      classifier.onAsset.listen(_handleOutput);
+      _streams.onLogPool.add(classifier.onLog);
+      classifier.onStatusChange.listen((_) => _streams.changeStatus(status));
+      for (var input in _inputs) {
+        classifier.addInput(input);
+      }
     }
 
     var newGroups = transformers.where((op) => op is TransformerGroup)
@@ -255,25 +268,27 @@
       runner.onAsset.listen(_handleOutput);
       _streams.onLogPool.add(runner.onLog);
       runner.onStatusChange.listen((_) => _streams.changeStatus(status));
-      for (var input in _inputs.values) {
-        runner.addInput(input.input);
+      for (var input in _inputs) {
+        runner.addInput(input);
       }
     }
 
     for (var forwarder in _forwarders.values) {
-      forwarder.updateTransformers(_transformers.length, _groups.length);
+      forwarder.updateTransformers(_classifiers.length, _groups.length);
     }
+
+    _streams.changeStatus(status);
   }
 
   /// Force all [LazyTransformer]s' transforms in this phase to begin producing
   /// concrete assets.
   void forceAllTransforms() {
-    for (var group in _groups.values) {
-      group.forceAllTransforms();
+    for (var classifier in _classifiers.values) {
+      classifier.forceAllTransforms();
     }
 
-    for (var input in _inputs.values) {
-      input.forceAllTransforms();
+    for (var group in _groups.values) {
+      group.forceAllTransforms();
     }
   }
 
@@ -295,8 +310,8 @@
   ///
   /// This will remove all the phase's outputs.
   void remove() {
-    for (var input in _inputs.values.toList()) {
-      input.remove();
+    for (var classifier in _classifiers.values.toList()) {
+      classifier.remove();
     }
     for (var group in _groups.values) {
       group.remove();
diff --git a/pkg/barback/lib/src/phase_forwarder.dart b/pkg/barback/lib/src/graph/phase_forwarder.dart
similarity index 97%
rename from pkg/barback/lib/src/phase_forwarder.dart
rename to pkg/barback/lib/src/graph/phase_forwarder.dart
index bb275a5..e70aff3 100644
--- a/pkg/barback/lib/src/phase_forwarder.dart
+++ b/pkg/barback/lib/src/graph/phase_forwarder.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.
 
-library barback.phase_forwarder;
+library barback.graph.phase_forwarder;
 
 import 'dart:async';
 
-import 'asset_node.dart';
-import 'asset_node_set.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_node_set.dart';
 
 /// A class that takes care of forwarding assets within a phase.
 ///
diff --git a/pkg/barback/lib/src/phase_output.dart b/pkg/barback/lib/src/graph/phase_output.dart
similarity index 96%
rename from pkg/barback/lib/src/phase_output.dart
rename to pkg/barback/lib/src/graph/phase_output.dart
index bb5f176..3d6460b 100644
--- a/pkg/barback/lib/src/phase_output.dart
+++ b/pkg/barback/lib/src/graph/phase_output.dart
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library barback.phase_output;
+library barback.graph.phase_output;
 
 import 'dart:async';
 import 'dart:collection';
 
-import 'asset_forwarder.dart';
-import 'asset_node.dart';
-import 'errors.dart';
+import '../asset/asset_forwarder.dart';
+import '../asset/asset_node.dart';
+import '../errors.dart';
 import 'phase.dart';
 
 /// A class that handles a single output of a phase.
diff --git a/pkg/barback/lib/src/transform_node.dart b/pkg/barback/lib/src/graph/transform_node.dart
similarity index 87%
rename from pkg/barback/lib/src/transform_node.dart
rename to pkg/barback/lib/src/graph/transform_node.dart
index 41437ae..4cdab8e 100644
--- a/pkg/barback/lib/src/transform_node.dart
+++ b/pkg/barback/lib/src/graph/transform_node.dart
@@ -2,24 +2,24 @@
 // for 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 barback.transform_node;
+library barback.graph.transform_node;
 
 import 'dart:async';
 
-import 'asset.dart';
-import 'asset_id.dart';
-import 'asset_node.dart';
-import 'declaring_transform.dart';
-import 'declaring_transformer.dart';
-import 'errors.dart';
-import 'lazy_transformer.dart';
-import 'log.dart';
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/declaring_transform.dart';
+import '../transformer/declaring_transformer.dart';
+import '../transformer/lazy_transformer.dart';
+import '../transformer/transform.dart';
+import '../transformer/transformer.dart';
+import '../utils.dart';
 import 'node_status.dart';
 import 'node_streams.dart';
 import 'phase.dart';
-import 'transform.dart';
-import 'transformer.dart';
-import 'utils.dart';
 
 /// Describes a transform on a set of assets and its relationship to the build
 /// dependency graph.
@@ -47,8 +47,7 @@
 
   /// How far along [this] is in processing its assets.
   NodeStatus get status {
-    if (_state == _State.NOT_PRIMARY || _state == _State.APPLIED ||
-        _state == _State.DECLARED) {
+    if (_state == _State.APPLIED || _state == _State.DECLARED) {
       return NodeStatus.IDLE;
     }
 
@@ -130,6 +129,7 @@
       : transformer = transformer,
         primary = primary {
     _forced = transformer is! DeclaringTransformer;
+    if (_forced) primary.force();
 
     _primarySubscription = primary.onStateChange.listen((state) {
       if (state.isRemoved) {
@@ -146,7 +146,14 @@
       _dirty();
     });
 
-    _isPrimary();
+    _declareOutputs().then((_) {
+      if (_forced || _canRunDeclaringEagerly) {
+        _apply();
+      } else {
+        _state = _State.DECLARED;
+        _streams.changeStatus(NodeStatus.IDLE);
+      }
+    });
   }
 
   /// The [TransformInfo] describing this node.
@@ -186,14 +193,8 @@
   ///
   /// This causes all of the transform's outputs to be marked as dirty as well.
   void _dirty() {
-    if (_state == _State.NOT_PRIMARY) {
-      _emitPassThrough();
-      return;
-    }
-
-    // If we're in the process of running [isPrimary] or [declareOutputs], we
-    // already know that [apply] needs to be run so there's nothing we need to
-    // mark as dirty.
+    // If we're in the process of running [declareOutputs], we already know that
+    // [apply] needs to be run so there's nothing we need to mark as dirty.
     if (_state == _State.DECLARING) return;
 
     if (!_forced && !_canRunDeclaringEagerly) {
@@ -227,41 +228,6 @@
     }
   }
 
-  /// Runs [transformer.isPrimary] and adjusts [this]'s state according to the
-  /// result.
-  ///
-  /// This will also run [_declareOutputs] and/or [_apply] as appropriate.
-  void _isPrimary() {
-    syncFuture(() => transformer.isPrimary(primary.id))
-        .catchError((error, stackTrace) {
-      if (_isRemoved) return false;
-
-      // Catch all transformer errors and pipe them to the results stream. This
-      // is so a broken transformer doesn't take down the whole graph.
-      phase.cascade.reportError(_wrapException(error, stackTrace));
-
-      return false;
-    }).then((isPrimary) {
-      if (_isRemoved) return null;
-      if (isPrimary) {
-        if (_forced) primary.force();
-        return _declareOutputs().then((_) {
-          if (_isRemoved) return;
-          if (_forced || _canRunDeclaringEagerly) {
-            _apply();
-          } else {
-            _state = _State.DECLARED;
-            _streams.changeStatus(NodeStatus.IDLE);
-          }
-        });
-      }
-
-      _emitPassThrough();
-      _state = _State.NOT_PRIMARY;
-      _streams.changeStatus(NodeStatus.IDLE);
-    });
-  }
-
   /// Runs [transform.declareOutputs] and emits the resulting assets as dirty
   /// assets.
   Future _declareOutputs() {
@@ -517,16 +483,17 @@
 
 /// The enum of states that [TransformNode] can be in.
 class _State {
-  /// The transform is running [Transformer.isPrimary] followed by
-  /// [DeclaringTransformer.declareOutputs] (for a [DeclaringTransformer]).
+  /// The transform is running [DeclaringTransformer.declareOutputs].
   ///
   /// This is the initial state of the transformer, and it will only occur once
-  /// since [Transformer.isPrimary] and [DeclaringTransformer.declareOutputs]
-  /// are independent of the contents of the primary input. Once the two methods
-  /// finish running, this will transition to [NOT_PRIMARY] if the input isn't
-  /// primary, [DECLARED] if the transform is deferred, and [APPLYING]
-  /// otherwise.
-  static final DECLARING = const _State._("computing isPrimary");
+  /// since [DeclaringTransformer.declareOutputs] is independent of the contents
+  /// of the primary input. Once the method finishes running, this will
+  /// transition to [APPLYING] if the transform is non-lazy and the input is
+  /// available, and [DECLARED] otherwise.
+  ///
+  /// Non-declaring transformers will transition out of this state and into
+  /// [APPLYING] immediately.
+  static final DECLARING = const _State._("declaring outputs");
 
   /// The transform is deferred and has run
   /// [DeclaringTransformer.declareOutputs] but hasn't yet been forced.
@@ -560,12 +527,6 @@
   /// is deferred and [APPLYING] otherwise.
   static final APPLIED = const _State._("applied");
 
-  /// The transform has finished running [Transformer.isPrimary], which returned
-  /// `false`.
-  ///
-  /// This will never transition to another state.
-  static final NOT_PRIMARY = const _State._("not primary");
-
   final String name;
 
   const _State._(this.name);
diff --git a/pkg/barback/lib/src/graph/transformer_classifier.dart b/pkg/barback/lib/src/graph/transformer_classifier.dart
new file mode 100644
index 0000000..6ba2480
--- /dev/null
+++ b/pkg/barback/lib/src/graph/transformer_classifier.dart
@@ -0,0 +1,127 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.transformer_classifier;
+
+import 'dart:async';
+
+import '../asset/asset_forwarder.dart';
+import '../asset/asset_node.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/transformer.dart';
+import '../utils.dart';
+import 'node_status.dart';
+import 'node_streams.dart';
+import 'phase.dart';
+import 'transform_node.dart';
+
+/// A class for classifying the primary inputs for a transformer according to
+/// its `classifyPrimary` method.
+///
+/// This is used for non-aggregate transformers; they're modeled as aggregate
+/// transformers that return the primary path if `isPrimary` is true and `null`
+/// if `isPrimary` is `null`.
+class TransformerClassifier {
+  /// The containing [Phase].
+  final Phase _phase;
+
+  /// The [Transformer] to use to classify the inputs.
+  final Transformer transformer;
+
+  /// A string describing the location of [this] in the transformer graph.
+  final String _location;
+
+  /// The individual transforms for each classiciation key.
+  final _transforms = new Map<Object, TransformNode>();
+
+  /// Forwarders used to pass through assets that aren't used by [transformer].
+  final _passThroughForwarders = new Set<AssetForwarder>();
+
+  /// The streams exposed by this classifier.
+  final _streams = new NodeStreams();
+  Stream get onStatusChange => _streams.onStatusChange;
+  Stream<AssetNode> get onAsset => _streams.onAsset;
+  Stream<LogEntry> get onLog => _streams.onLog;
+
+  /// The number of currently-active calls to [transformer.isPrimary].
+  ///
+  /// This is used to determine whether [this] is dirty.
+  var _activeIsPrimaries = 0;
+
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
+    if (_activeIsPrimaries > 0) return NodeStatus.RUNNING;
+    return NodeStatus.dirtiest(
+        _transforms.values.map((transform) => transform.status));
+  }
+
+  TransformerClassifier(this._phase, this.transformer, this._location);
+
+  /// Adds a new asset as an input for this transformer.
+  void addInput(AssetNode input) {
+    _activeIsPrimaries++;
+    syncFuture(() => transformer.isPrimary(input.id)).catchError(
+        (error, stackTrace) {
+      if (input.state.isRemoved) return false;
+
+      // Catch all transformer errors and pipe them to the results stream. This
+      // is so a broken transformer doesn't take down the whole graph.
+      var info = new TransformInfo(transformer, input.id);
+      if (error is! AssetNotFoundException) {
+        error = new TransformerException(info, error, stackTrace);
+      } else {
+        error = new MissingInputException(info, error.id);
+      }
+      _phase.cascade.reportError(error);
+
+      return false;
+    }).then((isPrimary) {
+      if (input.state.isRemoved) return;
+      if (!isPrimary) {
+        var forwarder = new AssetForwarder(input);
+        _passThroughForwarders.add(forwarder);
+        forwarder.node.whenRemoved(
+            () => _passThroughForwarders.remove(forwarder));
+        _streams.onAssetController.add(forwarder.node);
+      } else {
+        var transform = new TransformNode(
+            _phase, transformer, input, _location);
+        _transforms[input.id.path] = transform;
+
+        transform.onStatusChange.listen(
+            (_) => _streams.changeStatus(status),
+            onDone: () => _transforms.remove(input.id.path));
+
+        _streams.onAssetPool.add(transform.onAsset);
+        _streams.onLogPool.add(transform.onLog);
+      }
+    }).whenComplete(() {
+      _activeIsPrimaries--;
+      if (!_streams.isClosed) _streams.changeStatus(status);
+    });
+  }
+
+  /// Removes this transformer.
+  ///
+  /// This marks all outputs of the transformer as removed.
+  void remove() {
+    _streams.close();
+    for (var transform in _transforms.values.toList()) {
+      transform.remove();
+    }
+    for (var forwarder in _passThroughForwarders.toList()) {
+      forwarder.close();
+    }
+  }
+
+  /// Force all deferred transforms to begin producing concrete assets.
+  void forceAllTransforms() {
+    for (var transform in _transforms.values) {
+      transform.force();
+    }
+  }
+
+  String toString() => "classifier in $_location for $transformer";
+}
diff --git a/pkg/barback/lib/src/internal_asset.dart b/pkg/barback/lib/src/internal_asset.dart
index 75b4969..ab73901 100644
--- a/pkg/barback/lib/src/internal_asset.dart
+++ b/pkg/barback/lib/src/internal_asset.dart
@@ -1,187 +1,15 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// This library exists so that pub can retain backwards-compatibility with
+/// versions of barback prior to 0.13.1.
+///
+/// In 0.13.1, `lib/src/internal_asset.dart` was moved to
+/// `lib/src/asset/internal_asset.dart. Pub needs to support all versions of
+/// barback back through 0.13.0, though. In order for this to work, it needs to
+/// be able to import "package:barback/src/internal_asset.dart" on all available
+/// barback versions, hence the existence of this library.
 library barback.internal_asset;
 
-import 'dart:async';
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'asset.dart';
-import 'asset_id.dart';
-import 'file_pool.dart';
-import 'serialize.dart';
-import 'stream_replayer.dart';
-import 'utils.dart';
-
-/// Serialize an asset to a form that's safe to send across isolates.
-Map serializeAsset(Asset asset) {
-  var id = serializeId(asset.id);
-  if (asset is BinaryAsset) {
-    return {
-      'type': 'binary',
-      'id': id,
-      'contents': asset._contents
-    };
-  } else if (asset is FileAsset) {
-    return {
-      'type': 'file',
-      'id': id,
-      'path': asset._path
-    };
-  } else if (asset is StringAsset) {
-    return {
-      'type': 'string',
-      'id': id,
-      'contents': asset._contents
-    };
-  } else {
-    // [asset] is probably a [StreamAsset], but it's possible that the user has
-    // created a custom subclass, in which case we just serialize the stream
-    // anyway.
-    return {
-      'type': 'stream',
-      'id': id,
-      'stream': serializeStream(asset.read())
-    };
-  }
-}
-
-/// Deserialize an asset from the form returned by [serialize].
-Asset deserializeAsset(Map asset) {
-  var id = deserializeId(asset['id']);
-  switch (asset['type']) {
-    case 'binary': return new BinaryAsset(id, asset['contents']);
-    case 'file': return new FileAsset(id, asset['path']);
-    case 'string': return new StringAsset(id, asset['contents']);
-    case 'stream':
-      return new StreamAsset(id, deserializeStream(asset['stream']));
-    default:
-      throw new FormatException('Unknown asset type "${asset['type']}".');
-  }
-}
-
-/// An asset whose data is stored in a list of bytes.
-class BinaryAsset implements Asset {
-  final AssetId id;
-
-  final Uint8List _contents;
-
-  BinaryAsset(this.id, List<int> contents)
-      : _contents = toUint8List(contents);
-
-  Future<String> readAsString({Encoding encoding}) {
-    if (encoding == null) encoding = UTF8;
-
-    return new Future.value(encoding.decode(_contents));
-  }
-
-  Stream<List<int>> read() => new Future<List<int>>.value(_contents).asStream();
-
-  String toString() {
-    var buffer = new StringBuffer();
-    buffer.write("Bytes [");
-
-    // Don't show the whole list if it's long.
-    if (_contents.length > 11) {
-      for (var i = 0; i < 5; i++) {
-        buffer.write(byteToHex(_contents[i]));
-        buffer.write(" ");
-      }
-
-      buffer.write("...");
-
-      for (var i = _contents.length - 5; i < _contents.length; i++) {
-        buffer.write(" ");
-        buffer.write(byteToHex(_contents[i]));
-      }
-    } else {
-      for (var i = 0; i < _contents.length; i++) {
-        if (i > 0) buffer.write(" ");
-        buffer.write(byteToHex(_contents[i]));
-      }
-    }
-
-    buffer.write("]");
-    return buffer.toString();
-  }
-}
-
-/// An asset backed by a file on the local file system.
-class FileAsset implements Asset {
-  final AssetId id;
-
-  /// Use a [FilePool] to handle reads so we can try to cope with running out
-  /// of file descriptors more gracefully.
-  static final _pool = new FilePool();
-
-  final String _path;
-  FileAsset(this.id, this._path);
-
-  Future<String> readAsString({Encoding encoding}) {
-    if (encoding == null) encoding = UTF8;
-    return _pool.readAsString(_path, encoding);
-  }
-
-  Stream<List<int>> read() => _pool.openRead(_path);
-
-  String toString() => 'File "${_path}"';
-}
-
-/// An asset whose data is stored in a string.
-class StringAsset implements Asset {
-  final AssetId id;
-
-  final String _contents;
-
-  StringAsset(this.id, this._contents);
-
-  Future<String> readAsString({Encoding encoding}) =>
-      new Future.value(_contents);
-
-  Stream<List<int>> read() =>
-      new Future<List<int>>.value(UTF8.encode(_contents)).asStream();
-
-  String toString() {
-    // Don't show the whole string if it's long.
-    var contents = _contents;
-    if (contents.length > 40) {
-      contents = contents.substring(0, 20) + " ... " +
-                 contents.substring(contents.length - 20);
-    }
-
-    contents = _escape(contents);
-    return 'String "$contents"';
-  }
-
-  String _escape(String string) {
-    return string
-        .replaceAll("\"", r'\"')
-        .replaceAll("\n", r"\n")
-        .replaceAll("\r", r"\r")
-        .replaceAll("\t", r"\t");
-  }
-}
-
-/// An asset whose data is available from a stream.
-class StreamAsset implements Asset {
-  final AssetId id;
-
-  /// A stream replayer that records and replays the contents of the input
-  /// stream.
-  final StreamReplayer<List<int>> _replayer;
-
-  StreamAsset(this.id, Stream<List<int>> stream)
-      : _replayer = new StreamReplayer(stream);
-
-  Future<String> readAsString({Encoding encoding}) {
-    if (encoding == null) encoding = UTF8;
-    return _replayer.getReplay().toList()
-        .then((chunks) => encoding.decode(flatten(chunks)));
-  }
-
-  Stream<List<int>> read() => _replayer.getReplay();
-
-  String toString() => "Stream";
-}
+export 'asset/internal_asset.dart';
diff --git a/pkg/barback/lib/src/log.dart b/pkg/barback/lib/src/log.dart
index 23f425a..691f4db 100644
--- a/pkg/barback/lib/src/log.dart
+++ b/pkg/barback/lib/src/log.dart
@@ -6,7 +6,7 @@
 
 import 'package:source_maps/span.dart';
 
-import 'asset_id.dart';
+import 'asset/asset_id.dart';
 import 'errors.dart';
 
 /// The severity of a logged message.
diff --git a/pkg/barback/lib/src/package_provider.dart b/pkg/barback/lib/src/package_provider.dart
index 349785c..fe440f7 100644
--- a/pkg/barback/lib/src/package_provider.dart
+++ b/pkg/barback/lib/src/package_provider.dart
@@ -6,8 +6,8 @@
 
 import 'dart:async';
 
-import 'asset.dart';
-import 'asset_id.dart';
+import 'asset/asset.dart';
+import 'asset/asset_id.dart';
 
 /// API for locating and accessing packages on disk.
 ///
diff --git a/pkg/barback/lib/src/phase_input.dart b/pkg/barback/lib/src/phase_input.dart
deleted file mode 100644
index bd47f1a..0000000
--- a/pkg/barback/lib/src/phase_input.dart
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library barback.phase_input;
-
-import 'dart:async';
-
-import 'asset_forwarder.dart';
-import 'asset_node.dart';
-import 'log.dart';
-import 'node_status.dart';
-import 'node_streams.dart';
-import 'phase.dart';
-import 'transform_node.dart';
-import 'transformer.dart';
-
-/// A class for watching a single [AssetNode] and running any transforms that
-/// take that node as a primary input.
-class PhaseInput {
-  /// The phase for which this is an input.
-  final Phase _phase;
-
-  /// A string describing the location of [this] in the transformer graph.
-  final String _location;
-
-  /// The transforms currently applicable to [input].
-  ///
-  /// These are the transforms that have been "wired up": they represent a
-  /// repeatable transformation of a single concrete set of inputs. "dart2js" is
-  /// a transformer. "dart2js on web/main.dart" is a transform.
-  final _transforms = new Set<TransformNode>();
-
-  /// A forwarder for the input [AssetNode] for this phase.
-  ///
-  /// This is used to mark the node as removed should the input ever be removed.
-  final AssetForwarder _inputForwarder;
-
-  /// The asset node for this input.
-  AssetNode get input => _inputForwarder.node;
-
-  /// The subscription to [input]'s [AssetNode.onStateChange] stream.
-  StreamSubscription _inputSubscription;
-
-  /// The streams exposed by this input.
-  final _streams = new NodeStreams();
-  Stream get onStatusChange => _streams.onStatusChange;
-  Stream<AssetNode> get onAsset => _streams.onAsset;
-  Stream<LogEntry> get onLog => _streams.onLog;
-
-  /// How far along [this] is in processing its assets.
-  NodeStatus get status {
-    var status = input.state.isDirty && !input.isLazy ?
-        NodeStatus.MATERIALIZING : NodeStatus.IDLE;
-    return status.dirtier(NodeStatus.dirtiest(
-        _transforms.map((transform) => transform.status)));
-  }
-
-  PhaseInput(this._phase, AssetNode input, this._location)
-      : _inputForwarder = new AssetForwarder(input) {
-    _inputSubscription = input.onStateChange.listen((state) {
-      if (state.isRemoved) {
-        remove();
-      } else {
-        _streams.changeStatus(status);
-      }
-    });
-  }
-
-  /// Removes this input.
-  ///
-  /// This marks all outputs of the input as removed.
-  void remove() {
-    _streams.close();
-    _inputSubscription.cancel();
-    _inputForwarder.close();
-  }
-
-  /// Set this input's transformers to [transformers].
-  void updateTransformers(Iterable<Transformer> newTransformersIterable) {
-    var newTransformers = newTransformersIterable.toSet();
-    for (var transform in _transforms.toList()) {
-      if (newTransformers.remove(transform.transformer)) continue;
-      transform.remove();
-    }
-
-    // The remaining [newTransformers] are those for which there are no
-    // transforms in [_transforms].
-    for (var transformer in newTransformers) {
-      var transform = new TransformNode(
-          _phase, transformer, input, _location);
-      _transforms.add(transform);
-
-      transform.onStatusChange.listen(
-          (_) => _streams.changeStatus(status),
-          onDone: () => _transforms.remove(transform));
-
-      _streams.onAssetPool.add(transform.onAsset);
-      _streams.onLogPool.add(transform.onLog);
-    }
-  }
-
-  /// Force all [LazyTransformer]s' transforms in this input to begin producing
-  /// concrete assets.
-  void forceAllTransforms() {
-    for (var transform in _transforms) {
-      transform.force();
-    }
-  }
-
-  String toString() => "phase input in $_location for $input";
-}
diff --git a/pkg/barback/lib/src/serialize.dart b/pkg/barback/lib/src/serialize.dart
index adc365d..1458463 100644
--- a/pkg/barback/lib/src/serialize.dart
+++ b/pkg/barback/lib/src/serialize.dart
@@ -9,7 +9,7 @@
 
 import 'package:stack_trace/stack_trace.dart';
 
-import 'asset_id.dart';
+import 'asset/asset_id.dart';
 import 'utils.dart';
 
 /// Converts [id] into a serializable map.
diff --git a/pkg/barback/lib/src/barback_settings.dart b/pkg/barback/lib/src/transformer/barback_settings.dart
similarity index 97%
rename from pkg/barback/lib/src/barback_settings.dart
rename to pkg/barback/lib/src/transformer/barback_settings.dart
index 80c276e..5b3f46c 100644
--- a/pkg/barback/lib/src/barback_settings.dart
+++ b/pkg/barback/lib/src/transformer/barback_settings.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.
 
-library barback.barback_settings;
+library barback.transformer.barback_settings;
 
 /// A generic settings object for providing configuration details to
 /// [Transformer]s.
diff --git a/pkg/barback/lib/src/base_transform.dart b/pkg/barback/lib/src/transformer/base_transform.dart
similarity index 96%
rename from pkg/barback/lib/src/base_transform.dart
rename to pkg/barback/lib/src/transformer/base_transform.dart
index bb0183c..0672047 100644
--- a/pkg/barback/lib/src/base_transform.dart
+++ b/pkg/barback/lib/src/transformer/base_transform.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.
 
-library barback.base_transform;
+library barback.transformer.base_transform;
 
 import 'dart:async';
 
-import 'log.dart';
+import '../graph/transform_node.dart';
+import '../log.dart';
 import 'transform_logger.dart';
-import 'transform_node.dart';
 
 /// The base class for the ephemeral transform objects that are passed to
 /// transformers.
diff --git a/pkg/barback/lib/src/declaring_transform.dart b/pkg/barback/lib/src/transformer/declaring_transform.dart
similarity index 92%
rename from pkg/barback/lib/src/declaring_transform.dart
rename to pkg/barback/lib/src/transformer/declaring_transform.dart
index 2f8a8bf..e15082f 100644
--- a/pkg/barback/lib/src/declaring_transform.dart
+++ b/pkg/barback/lib/src/transformer/declaring_transform.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.
 
-library barback.declaring_transform;
+library barback.transformer.declaring_transform;
 
-import 'asset_id.dart';
+import '../asset/asset_id.dart';
+import '../graph/transform_node.dart';
 import 'base_transform.dart';
-import 'transform_node.dart';
 
 /// A transform for [DeclaringTransform]ers that allows them to declare the ids
 /// of the outputs they'll generate without generating the concrete bodies of
diff --git a/pkg/barback/lib/src/declaring_transformer.dart b/pkg/barback/lib/src/transformer/declaring_transformer.dart
similarity index 95%
rename from pkg/barback/lib/src/declaring_transformer.dart
rename to pkg/barback/lib/src/transformer/declaring_transformer.dart
index e3553e7..d9e5adc 100644
--- a/pkg/barback/lib/src/declaring_transformer.dart
+++ b/pkg/barback/lib/src/transformer/declaring_transformer.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.
 
-library barback.declaring_transformer;
+library barback.transformer.declaring_transformer;
 
 import 'dart:async';
 
diff --git a/pkg/barback/lib/src/lazy_transformer.dart b/pkg/barback/lib/src/transformer/lazy_transformer.dart
similarity index 93%
rename from pkg/barback/lib/src/lazy_transformer.dart
rename to pkg/barback/lib/src/transformer/lazy_transformer.dart
index 67511f8..657b65b 100644
--- a/pkg/barback/lib/src/lazy_transformer.dart
+++ b/pkg/barback/lib/src/transformer/lazy_transformer.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.
 
-library barback.lazy_transformer;
+library barback.transformer.lazy_transformer;
 
 import 'declaring_transformer.dart';
 
diff --git a/pkg/barback/lib/src/transform.dart b/pkg/barback/lib/src/transformer/transform.dart
similarity index 94%
rename from pkg/barback/lib/src/transform.dart
rename to pkg/barback/lib/src/transformer/transform.dart
index 268849d..809cd12 100644
--- a/pkg/barback/lib/src/transform.dart
+++ b/pkg/barback/lib/src/transformer/transform.dart
@@ -2,18 +2,18 @@
 // for 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 barback.transform;
+library barback.transformer.transform;
 
 import 'dart:async';
 import 'dart:convert';
 
-import 'asset.dart';
-import 'asset_id.dart';
-import 'asset_set.dart';
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../asset/asset_set.dart';
+import '../errors.dart';
+import '../graph/transform_node.dart';
+import '../utils.dart';
 import 'base_transform.dart';
-import 'errors.dart';
-import 'transform_node.dart';
-import 'utils.dart';
 
 /// While a [Transformer] represents a *kind* of transformation, this defines
 /// one specific usage of it on a set of files.
diff --git a/pkg/barback/lib/src/transform_logger.dart b/pkg/barback/lib/src/transformer/transform_logger.dart
similarity index 96%
rename from pkg/barback/lib/src/transform_logger.dart
rename to pkg/barback/lib/src/transformer/transform_logger.dart
index 5f43a2d..6524375 100644
--- a/pkg/barback/lib/src/transform_logger.dart
+++ b/pkg/barback/lib/src/transformer/transform_logger.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.
 
-library barback.transform_logger;
+library barback.transformer.transform_logger;
 
 import 'package:source_maps/span.dart';
 
-import 'asset_id.dart';
-import 'log.dart';
+import '../asset/asset_id.dart';
+import '../log.dart';
 
 typedef void LogFunction(AssetId asset, LogLevel level, String message,
                          Span span);
diff --git a/pkg/barback/lib/src/transformer.dart b/pkg/barback/lib/src/transformer/transformer.dart
similarity index 97%
rename from pkg/barback/lib/src/transformer.dart
rename to pkg/barback/lib/src/transformer/transformer.dart
index 08a9d85..efacf76 100644
--- a/pkg/barback/lib/src/transformer.dart
+++ b/pkg/barback/lib/src/transformer/transformer.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.
 
-library barback.transformer;
+library barback.transformer.transformer;
 
 import 'dart:async';
 
-import 'asset_id.dart';
+import '../asset/asset_id.dart';
+import '../utils.dart';
 import 'transform.dart';
-import 'utils.dart';
 
 /// A [Transformer] represents a processor that takes in one or more input
 /// assets and uses them to generate one or more output assets.
diff --git a/pkg/barback/lib/src/transformer_group.dart b/pkg/barback/lib/src/transformer/transformer_group.dart
similarity index 96%
rename from pkg/barback/lib/src/transformer_group.dart
rename to pkg/barback/lib/src/transformer/transformer_group.dart
index 58ffd2a..17a2e57 100644
--- a/pkg/barback/lib/src/transformer_group.dart
+++ b/pkg/barback/lib/src/transformer/transformer_group.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.
 
-library barback.transformer_group;
+library barback.transformer.transformer_group;
 
 /// A [TransformerGroup] encapsulates a phased collection of transformers.
 ///
diff --git a/pkg/barback/lib/src/cancelable_future.dart b/pkg/barback/lib/src/utils/cancelable_future.dart
similarity index 97%
rename from pkg/barback/lib/src/cancelable_future.dart
rename to pkg/barback/lib/src/utils/cancelable_future.dart
index 84c19f1..ff723b2 100644
--- a/pkg/barback/lib/src/cancelable_future.dart
+++ b/pkg/barback/lib/src/utils/cancelable_future.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.
 
-library barback.cancelable_future;
+library barback.utils.cancelable_future;
 
 import 'dart:async';
 
diff --git a/pkg/barback/lib/src/file_pool.dart b/pkg/barback/lib/src/utils/file_pool.dart
similarity index 97%
rename from pkg/barback/lib/src/file_pool.dart
rename to pkg/barback/lib/src/utils/file_pool.dart
index dab9409..6bea4a4 100644
--- a/pkg/barback/lib/src/file_pool.dart
+++ b/pkg/barback/lib/src/utils/file_pool.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.
 
-library barback.file_pool;
+library barback.utils.file_pool;
 
 import 'dart:async';
 import 'dart:convert';
@@ -10,8 +10,8 @@
 
 import 'package:stack_trace/stack_trace.dart';
 
+import '../utils.dart';
 import 'pool.dart';
-import 'utils.dart';
 
 /// Manages a pool of files that are opened for reading to cope with maximum
 /// file descriptor limits.
diff --git a/pkg/barback/lib/src/multiset.dart b/pkg/barback/lib/src/utils/multiset.dart
similarity index 98%
rename from pkg/barback/lib/src/multiset.dart
rename to pkg/barback/lib/src/utils/multiset.dart
index e2d3e30..20d1c57 100644
--- a/pkg/barback/lib/src/multiset.dart
+++ b/pkg/barback/lib/src/utils/multiset.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.
 
-library barback.multiset;
+library barback.utils.multiset;
 
 import 'dart:collection';
 
diff --git a/pkg/barback/lib/src/pool.dart b/pkg/barback/lib/src/utils/pool.dart
similarity index 98%
rename from pkg/barback/lib/src/pool.dart
rename to pkg/barback/lib/src/utils/pool.dart
index 4653722..c1c76bc 100644
--- a/pkg/barback/lib/src/pool.dart
+++ b/pkg/barback/lib/src/utils/pool.dart
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library barback.pool;
+library barback.utils.pool;
 
 import 'dart:async';
 import 'dart:collection';
 
 import 'package:stack_trace/stack_trace.dart';
 
-import 'utils.dart';
+import '../utils.dart';
 
 // TODO(nweiz): put this somewhere that it can be shared between packages.
 /// Manages an abstract pool of resources with a limit on how many may be in use
diff --git a/pkg/barback/lib/src/stream_pool.dart b/pkg/barback/lib/src/utils/stream_pool.dart
similarity index 98%
rename from pkg/barback/lib/src/stream_pool.dart
rename to pkg/barback/lib/src/utils/stream_pool.dart
index da5c715..679672d 100644
--- a/pkg/barback/lib/src/stream_pool.dart
+++ b/pkg/barback/lib/src/utils/stream_pool.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.
 
-library barback.stream_pool;
+library barback.utils.stream_pool;
 
 import 'dart:async';
 
diff --git a/pkg/barback/lib/src/stream_replayer.dart b/pkg/barback/lib/src/utils/stream_replayer.dart
similarity index 97%
rename from pkg/barback/lib/src/stream_replayer.dart
rename to pkg/barback/lib/src/utils/stream_replayer.dart
index 66a056a..4a25085 100644
--- a/pkg/barback/lib/src/stream_replayer.dart
+++ b/pkg/barback/lib/src/utils/stream_replayer.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.
 
-library barback.stream_replayer;
+library barback.utils.stream_replayer;
 
 import 'dart:async';
 import 'dart:collection';
 
-import 'utils.dart';
+import '../utils.dart';
 
 /// Records the values and errors that are sent through a stream and allows them
 /// to be replayed arbitrarily many times.
diff --git a/pkg/barback/test/asset_test.dart b/pkg/barback/test/asset_test.dart
index 9312fb0..7936c71 100644
--- a/pkg/barback/test/asset_test.dart
+++ b/pkg/barback/test/asset_test.dart
@@ -10,7 +10,7 @@
 import 'dart:isolate';
 
 import 'package:barback/barback.dart';
-import 'package:barback/src/internal_asset.dart';
+import 'package:barback/src/asset/internal_asset.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:unittest/unittest.dart';
 
diff --git a/pkg/barback/test/cancelable_future_test.dart b/pkg/barback/test/cancelable_future_test.dart
index d5f9ae4..6535894 100644
--- a/pkg/barback/test/cancelable_future_test.dart
+++ b/pkg/barback/test/cancelable_future_test.dart
@@ -6,8 +6,8 @@
 
 import 'dart:async';
 
-import 'package:barback/src/cancelable_future.dart';
 import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/cancelable_future.dart';
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
diff --git a/pkg/barback/test/multiset_test.dart b/pkg/barback/test/multiset_test.dart
index ab5e311..7b6f09f 100644
--- a/pkg/barback/test/multiset_test.dart
+++ b/pkg/barback/test/multiset_test.dart
@@ -4,7 +4,7 @@
 
 library barback.test.multiset_test;
 
-import 'package:barback/src/multiset.dart';
+import 'package:barback/src/utils/multiset.dart';
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
diff --git a/pkg/barback/test/stream_pool_test.dart b/pkg/barback/test/stream_pool_test.dart
index fafa1f5..ed590f3 100644
--- a/pkg/barback/test/stream_pool_test.dart
+++ b/pkg/barback/test/stream_pool_test.dart
@@ -6,8 +6,8 @@
 
 import 'dart:async';
 
-import 'package:barback/src/stream_pool.dart';
 import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/stream_pool.dart';
 import 'package:scheduled_test/scheduled_test.dart';
 
 import 'utils.dart';
diff --git a/pkg/barback/test/stream_replayer_test.dart b/pkg/barback/test/stream_replayer_test.dart
index 9bc8224..802db14 100644
--- a/pkg/barback/test/stream_replayer_test.dart
+++ b/pkg/barback/test/stream_replayer_test.dart
@@ -6,8 +6,8 @@
 
 import 'dart:async';
 
-import 'package:barback/src/stream_replayer.dart';
 import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/stream_replayer.dart';
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 50ad727..4fa3d3f 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -8,8 +8,8 @@
 import 'dart:convert' show Encoding;
 
 import 'package:barback/barback.dart';
-import 'package:barback/src/cancelable_future.dart';
 import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/cancelable_future.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:stack_trace/stack_trace.dart';
diff --git a/pkg/csslib/pubspec.yaml b/pkg/csslib/pubspec.yaml
index 295ff3f..81ddfd9 100644
--- a/pkg/csslib/pubspec.yaml
+++ b/pkg/csslib/pubspec.yaml
@@ -1,12 +1,12 @@
 name: csslib
-version: 0.9.2+1
+version: 0.9.3-dev
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://www.dartlang.org
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  args: '>=0.9.0 <0.11.0'
+  args: '>=0.9.0 <0.12.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
   source_maps: '>=0.9.0 <0.10.0'
diff --git a/pkg/custom_element/lib/custom_element.dart b/pkg/custom_element/lib/custom_element.dart
index fbf80eb..4fc679f 100644
--- a/pkg/custom_element/lib/custom_element.dart
+++ b/pkg/custom_element/lib/custom_element.dart
@@ -98,11 +98,15 @@
   void inserted() {}
   @deprecated
   void enteredView() {}
+  @deprecated
+  void attached() {}
 
   /** Invoked when this component is removed from the DOM tree. */
   void removed() {}
   @deprecated
   void leftView() {}
+  @deprecated
+  void detached() {}
 
   /** Invoked when any attribute of the component is modified. */
   void attributeChanged(String name, String oldValue, String newValue) =>
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index c23cd7d..6b50777 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -53,8 +53,8 @@
         introFileName: introFileName, out: out,
         excludeLibraries: excludeLibraries,
         includeDependentPackages: includeDependentPackages,
-        startPage: startPage, pubScript: pubScript, dartBinary: dartBinary,
-        indentJSON: indentJSON);
+        startPage: startPage, pubScriptValue: pubScript,
+        dartBinaryValue: dartBinary, indentJSON: indentJSON);
     viewer.addBackViewerCode();
     if (compile || serve) {
       result.then((success) {
@@ -64,6 +64,8 @@
       });
     }
   } else if (compile || serve) {
+    gen.pubScript = pubScript;
+    gen.dartBinary = dartBinary;
     viewer.createViewer(serve);
   }
   return result;
diff --git a/pkg/docgen/lib/src/generator.dart b/pkg/docgen/lib/src/generator.dart
index 9778b51..aba0551 100644
--- a/pkg/docgen/lib/src/generator.dart
+++ b/pkg/docgen/lib/src/generator.dart
@@ -41,12 +41,10 @@
 List<String> _excluded;
 
 /// The path of the pub script.
-String get pubScript => _pubScript;
-String _pubScript;
+String pubScript;
 
 /// The path of Dart binary.
-String get dartBinary => _dartBinary;
-String _dartBinary;
+String dartBinary;
 
 /// Docgen constructor initializes the link resolver for markdown parsing.
 /// Also initializes the command line arguments.
@@ -62,11 +60,11 @@
     bool outputToYaml: true, bool includePrivate: false, bool includeSdk: false,
     bool parseSdk: false, String introFileName: '',
     out: DEFAULT_OUTPUT_DIRECTORY, List<String> excludeLibraries: const [], bool
-    includeDependentPackages: false, String startPage, String dartBinary,
-    String pubScript, bool indentJSON: false}) {
+    includeDependentPackages: false, String startPage, String dartBinaryValue,
+    String pubScriptValue, bool indentJSON: false}) {
   _excluded = excludeLibraries;
-  _pubScript = pubScript;
-  _dartBinary = dartBinary;
+  dartBinary = dartBinaryValue;
+  pubScript = pubScriptValue;
 
   logger.onRecord.listen((record) => print(record.message));
 
@@ -384,13 +382,13 @@
 List<String> _allDependentPackageDirs(String packageDirectory) {
   var packageName = packageNameFor(packageDirectory);
   if (packageName == '') return [];
-  var dependentsJson = Process.runSync(_pubScript, ['list-package-dirs'],
+  var dependentsJson = Process.runSync(pubScript, ['list-package-dirs'],
       workingDirectory: packageDirectory, runInShell: true);
   if (dependentsJson.exitCode != 0) {
     print(dependentsJson.stderr);
   }
   var dependents = JSON.decode(dependentsJson.stdout)['packages'];
-  return dependents.values.toList();
+  return dependents != null ? dependents.values.toList() : [];
 }
 
 /// For all the libraries, return a list of the libraries that are part of
diff --git a/pkg/docgen/lib/src/library_helpers.dart b/pkg/docgen/lib/src/library_helpers.dart
index 05d6f4b..78db9e9 100644
--- a/pkg/docgen/lib/src/library_helpers.dart
+++ b/pkg/docgen/lib/src/library_helpers.dart
@@ -29,9 +29,6 @@
 }
 
 void set includePrivateMembers(bool value) {
-  if (_includePrivate != null) {
-    throw new StateError('includePrivate has already been set');
-  }
   if (value == null) throw new ArgumentError('includePrivate cannot be null');
   _includePrivate = value;
 }
diff --git a/pkg/docgen/lib/src/models/annotation.dart b/pkg/docgen/lib/src/models/annotation.dart
index 86cd274..f7a537c 100644
--- a/pkg/docgen/lib/src/models/annotation.dart
+++ b/pkg/docgen/lib/src/models/annotation.dart
@@ -4,53 +4,111 @@
 
 library docgen.models.annotation;
 
-import '../exports/mirrors_util.dart' as dart2js_util;
 import '../exports/source_mirrors.dart';
 
+import '../exports/dart2js_mirrors.dart' show ResolvedNode;
+
 import '../library_helpers.dart';
 
 import 'library.dart';
 import 'mirror_based.dart';
 
+import 'dart:mirrors';
+import '../../../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+
 /// Holds the name of the annotation, and its parameters.
 class Annotation extends MirrorBased<ClassMirror> {
   /// The class of this annotation.
-  final ClassMirror mirror;
+  DeclarationMirror mirror;
+  Send node;
   final Library owningLibrary;
-  final List<String> parameters;
+  List<String> parameters;
 
-  Annotation(InstanceMirror originalMirror, this.owningLibrary)
-      : mirror = originalMirror.type,
-        parameters = _createParamaters(originalMirror);
+  Annotation(ResolvedNode resolvedNode, this.owningLibrary) {
+    parameters = [];
+    getMirrorForResolvedNode(resolvedNode, (m, n) { mirror = m; node = n;},
+        (String param) => parameters.add(param));
+  }
+
+  String getMirrorForResolvedNode(ResolvedNode node, callbackFunc,
+      paramCallbackFunc) {
+    ResolvedNodeMirrorFinder finder = new ResolvedNodeMirrorFinder(node,
+        callbackFunc, paramCallbackFunc);
+    finder.unparse(node.node);
+    return finder.result;
+  }
 
   Map toMap() => {
-    'name': getDocgenObject(mirror, owningLibrary).docName,
+    'name': owningLibrary.packagePrefix +
+        getDocgenObject(mirror, owningLibrary).docName,
     'parameters': parameters
   };
 }
 
-List<String> _createParamaters(InstanceMirror originalMirror) {
-  var curMirror = originalMirror.type;
-  Map<Symbol, DeclarationMirror> allDeclarations =
-      new Map.from(curMirror.declarations);
-  // This method assumes that our users aren't creating deep inheritance
-  // chains of custom annotation inheritance. If this is not the case,
-  // re-write this section for performance.
-  while (curMirror.superclass !=  null &&
-      curMirror.superclass.simpleName.toString() != 'Object') {
-    allDeclarations.addAll(curMirror.superclass.declarations);
-    curMirror = curMirror.superclass;
+class ResolvedNodeMirrorFinder extends Unparser {
+  final ResolvedNode resolvedNode;
+  final Function annotationMirrorCallback;
+  final Function parameterValueCallback;
+  int recursionLevel;
+
+  ResolvedNodeMirrorFinder(this.resolvedNode, this.annotationMirrorCallback,
+      this.parameterValueCallback) : recursionLevel = 0;
+
+  visitSend(Send node) {
+    if (recursionLevel == 0) {
+      var m = resolvedNode.resolvedMirror(node.selector);
+      annotationMirrorCallback(m, node);
+    } else {
+      Operator op = node.selector.asOperator();
+      String opString = op != null ? op.source : null;
+      bool spacesNeeded =
+          identical(opString, 'is') || identical(opString, 'as');
+      if (node.isPrefix) visit(node.selector);
+          unparseSendReceiver(node, spacesNeeded: spacesNeeded);
+          if (!node.isPrefix && !node.isIndex) visit(node.selector);
+          if (spacesNeeded) sb.write(' ');
+          // Also add a space for sequences like x + +1 and y - -y.
+          // TODO(ahe): remove case for '+' when we drop the support for it.
+          if (node.argumentsNode != null && (identical(opString, '-')
+              || identical(opString, '+'))) {
+            var beginToken = node.argumentsNode.getBeginToken();
+            if (beginToken != null &&
+                identical(beginToken.stringValue, opString)) {
+              sb.write(' ');
+            }
+          }
+    }
+    recursionLevel++;
+    visit(node.argumentsNode);
+    recursionLevel--;
   }
 
-  // TODO(efortuna): Some originalMirrors, such as the
-  // Dart2JsMapConstantMirror and Dart2JsListConstantMirror don't have a
-  // reflectee field, but we want the value of the parameter from them.
-  // Gross workaround is to assemble the object manually.
-  // See issue 18346.
-  return dart2js_util.variablesOf(allDeclarations)
-      .where((e) => e.isFinal &&
-      originalMirror.getField(e.simpleName).hasReflectee)
-        .map((e) => originalMirror.getField(e.simpleName).reflectee)
-        .where((e) => e != null)
-        .toList();
+  unparseNodeListFrom(NodeList node, var from) {
+    if (from.isEmpty) return;
+
+    visit(from.head);
+
+    for (var link = from.tail; !link.isEmpty; link = link.tail) {
+      if (recursionLevel >= 2) {
+        parameterValueCallback(sb.toString());
+        sb.clear();
+      }
+      visit(link.head);
+    }
+    if (recursionLevel >= 2) {
+      parameterValueCallback(sb.toString());
+      sb.clear();
+    }
+  }
+
+  visitNodeList(NodeList node) {
+    addToken(node.beginToken);
+    if (recursionLevel == 1) sb.clear();
+    if (node.nodes != null) {
+      recursionLevel++;
+      unparseNodeListFrom(node, node.nodes);
+      recursionLevel--;
+    }
+    if (node.endToken != null) add(node.endToken.value);
+  }
 }
diff --git a/pkg/docgen/lib/src/models/model_helpers.dart b/pkg/docgen/lib/src/models/model_helpers.dart
index fa56731..48babc9 100644
--- a/pkg/docgen/lib/src/models/model_helpers.dart
+++ b/pkg/docgen/lib/src/models/model_helpers.dart
@@ -78,16 +78,15 @@
 /// Returns a list of meta annotations assocated with a mirror.
 List<Annotation> createAnnotations(DeclarationMirror mirror,
     Library owningLibrary) {
-  var annotationMirrors = mirror.metadata
-      .where((e) => e is dart2js_mirrors.Dart2JsConstructedConstantMirror);
   var annotations = [];
-  annotationMirrors.forEach((annotation) {
-    var docgenAnnotation = new Annotation(annotation, owningLibrary);
+  for (dart2js_mirrors.ResolvedNode node in
+      dart2js_mirrors.BackDoor.metadataSyntaxOf(mirror)) {
+    var docgenAnnotation = new Annotation(node, owningLibrary);
     if (!_SKIPPED_ANNOTATIONS.contains(dart2js_util.qualifiedNameOf(
         docgenAnnotation.mirror))) {
       annotations.add(docgenAnnotation);
     }
-  });
+  }
   return annotations;
 }
 
@@ -157,6 +156,15 @@
   // Determine the classes, variables and methods that are exported for a
   // specific dependency.
   void _populateExports(LibraryDependencyMirror export, bool showExport) {
+    var transitiveExports = calcExportedItems(export.targetLibrary);
+    exports['classes'].addAll(transitiveExports['classes']);
+    exports['methods'].addAll(transitiveExports['methods']);
+    exports['variables'].addAll(transitiveExports['variables']);
+    // If there is a show in the export, add only the show items to the
+    // library. Ex: "export foo show bar"
+    // Otherwise, add all items, and then remove the hidden ones.
+    // Ex: "export foo hide bar"
+
     if (!showExport) {
       // Add all items, and then remove the hidden ones.
       // Ex: "export foo hide bar"
@@ -199,10 +207,6 @@
   Iterable<LibraryDependencyMirror> exportList =
       library.libraryDependencies.where((lib) => lib.isExport);
   for (LibraryDependencyMirror export in exportList) {
-    // If there is a show in the export, add only the show items to the
-    // library. Ex: "export foo show bar"
-    // Otherwise, add all items, and then remove the hidden ones.
-    // Ex: "export foo hide bar"
     _populateExports(export,
         export.combinators.any((combinator) => combinator.isShow));
   }
diff --git a/pkg/docgen/pubspec.yaml b/pkg/docgen/pubspec.yaml
index e6913dd..63a90a5 100644
--- a/pkg/docgen/pubspec.yaml
+++ b/pkg/docgen/pubspec.yaml
@@ -3,7 +3,7 @@
 description: A documentation generator for the Dart repository.
 homepage: https://www.dartlang.org/
 dependencies:
-  args: '>=0.9.0 <0.11.0'
+  args: '>=0.9.0 <0.12.0'
   logging: '>=0.9.0 <0.10.0'
   markdown: 0.7.0
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib2.dart b/pkg/docgen/test/multi_library_code/lib/test_lib2.dart
new file mode 100644
index 0000000..d9fa7ee
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib2.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test_lib2;
+
+export 'test_lib2_foo.dart';
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib2_bar.dart b/pkg/docgen/test/multi_library_code/lib/test_lib2_bar.dart
new file mode 100644
index 0000000..1a07d2b
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib2_bar.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test_lib2_bar;
+
+class Bar {
+
+}
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib2_foo.dart b/pkg/docgen/test/multi_library_code/lib/test_lib2_foo.dart
new file mode 100644
index 0000000..1b3d037
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib2_foo.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test_lib2_foo;
+
+export 'test_lib2_bar.dart';
+
+class Foo {
+
+}
+
+main() {
+  print('hello world');
+}
diff --git a/pkg/docgen/test/multi_library_test.dart b/pkg/docgen/test/multi_library_test.dart
index 3ff966d..ceda276 100644
--- a/pkg/docgen/test/multi_library_test.dart
+++ b/pkg/docgen/test/multi_library_test.dart
@@ -89,5 +89,18 @@
 
         });
     });
+
+    test('multiple exported libraries.', () {
+      var lib_file = p.toUri(p.join(getMultiLibraryCodePath(), 'lib',
+          'test_lib2.dart'));
+      return getMirrorSystem([lib_file], false)
+        .then((mirrorSystem) {
+          var library = new Library(mirrorSystem.libraries[lib_file]);
+
+          // Test that libraries do recursive exports correctly.
+          expect(true, library.classes.keys.contains('Bar'));
+        });
+
+    });
   });
 }
diff --git a/pkg/http/CHANGELOG.md b/pkg/http/CHANGELOG.md
index 7bd8d07..d6fdd44 100644
--- a/pkg/http/CHANGELOG.md
+++ b/pkg/http/CHANGELOG.md
@@ -1,5 +1,14 @@
+## 0.11.0+1
+
+* Fix a bug in handling errors in decoding XMLHttpRequest responses for
+  `BrowserClient`.
+
 ## 0.11.0
 
+* The package no longer depends on `dart:io`. The `BrowserClient` class in
+  `package:http/browser_client.dart` can now be used to make requests on the
+  browser.
+
 * Change `MultipartFile.contentType` from `dart:io`'s `ContentType` type to
   `http_parser`'s `MediaType` type.
 
diff --git a/pkg/http/README.md b/pkg/http/README.md
index 81ca286..72466a9 100644
--- a/pkg/http/README.md
+++ b/pkg/http/README.md
@@ -3,15 +3,14 @@
 A composable, Future-based library for making HTTP requests.
 
 This package contains a set of high-level functions and classes that make it
-easy to consume HTTP resources.
-
-**NOTE:** This package currently only works for
-server-side or command-line Dart applications. In other words, if the app
-imports `dart:io`, it can use this package.
+easy to consume HTTP resources. It's platform-independent, and can be used on
+both the command-line and the browser. Currently the global utility functions
+are unsupported on the browser; see "Using on the Browser" below.
 
 ## Using
 
-The easiest way to use this library is via the top-level functions. They allow
+The easiest way to use this library is via the top-level functions, although
+they currently only work on platforms where `dart:io` is available. They allow
 you to make individual HTTP requests with minimal hassle:
 
 ```dart
@@ -74,6 +73,25 @@
 }
 ```
 
+## Using on the Browser
+
+The HTTP library can be used on the browser via the [BrowserClient][] class in
+`package:http/browser_client.dart`. This client translates requests into
+XMLHttpRequests. For example:
+
+```dart
+import 'package:http/browser_client.dart';
+import 'package:http/http.dart' as http;
+
+var client = new BrowserClient();
+var url = "/whatsit/create";
+client.post(url, body: {"name": "doodle", "color": "blue"})
+    .then((response) {
+  print("Response status: ${response.statusCode}");
+  print("Response body: ${response.body}");
+});
+```
+
 ## Filing issues
 
 Please file issues for the http package at [http://dartbug.com/new][bugs].
diff --git a/pkg/http/lib/browser_client.dart b/pkg/http/lib/browser_client.dart
new file mode 100644
index 0000000..911c842
--- /dev/null
+++ b/pkg/http/lib/browser_client.dart
@@ -0,0 +1,97 @@
+// 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 http.browser_client;
+
+import 'dart:async';
+import 'dart:html';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import 'src/base_client.dart';
+import 'src/base_request.dart';
+import 'src/byte_stream.dart';
+import 'src/exception.dart';
+import 'src/streamed_response.dart';
+
+// TODO(nweiz): Move this under src/, re-export from lib/http.dart, and use this
+// automatically from [new Client] once we can create an HttpRequest using
+// mirrors on dart2js (issue 18541) and dart2js doesn't crash on pkg/collection
+// (issue 18535).
+
+/// A `dart:html`-based HTTP client that runs in the browser and is backed by
+/// XMLHttpRequests.
+///
+/// This client inherits some of the limitations of XMLHttpRequest. It ignores
+/// the [BaseRequest.contentLength], [BaseRequest.persistentConnection],
+/// [BaseRequest.followRedirects], and [BaseRequest.maxRedirects] fields. It is
+/// also unable to stream requests or responses; a request will only be sent and
+/// a response will only be returned once all the data is available.
+class BrowserClient extends BaseClient {
+  /// The currently active XHRs.
+  ///
+  /// These are aborted if the client is closed.
+  final _xhrs = new Set<HttpRequest>();
+
+  /// Creates a new HTTP client.
+  BrowserClient();
+
+  /// Sends an HTTP request and asynchronously returns the response.
+  Future<StreamedResponse> send(BaseRequest request) {
+    return request.finalize().toBytes().then((bytes) {
+      var xhr = new HttpRequest();
+      _xhrs.add(xhr);
+      xhr.open(request.method, request.url.toString(), async: true);
+      xhr.responseType = 'blob';
+      request.headers.forEach(xhr.setRequestHeader);
+
+      var completer = new Completer();
+      xhr.onLoad.first.then((_) {
+        // TODO(nweiz): Set the response type to "arraybuffer" when issue 18542
+        // is fixed.
+        var blob = xhr.response == null ? new Blob([]) : xhr.response;
+        var reader = new FileReader();
+
+        reader.onLoad.first.then((_) {
+          var body = reader.result;
+          completer.complete(new StreamedResponse(
+              new ByteStream.fromBytes(body),
+              xhr.status,
+              contentLength: body.length,
+              request: request,
+              headers: xhr.responseHeaders,
+              reasonPhrase: xhr.statusText));
+        });
+
+        reader.onError.first.then((error) {
+          completer.completeError(
+              new ClientException(error.toString(), request.url),
+              new Chain.current());
+        });
+
+        reader.readAsArrayBuffer(blob);
+      });
+
+      xhr.onError.first.then((_) {
+        // Unfortunately, the underlying XMLHttpRequest API doesn't expose any
+        // specific information about the error itself.
+        completer.completeError(
+            new ClientException("XMLHttpRequest error.", request.url),
+            new Chain.current());
+      });
+
+      xhr.send(bytes);
+      return completer.future.whenComplete(() => _xhrs.remove(xhr));
+    });
+  }
+
+  /// Closes the client.
+  ///
+  /// This terminates all active requests.
+  void close() {
+    for (var xhr in _xhrs) {
+      xhr.abort();
+    }
+  }
+}
diff --git a/pkg/http/lib/src/byte_stream.dart b/pkg/http/lib/src/byte_stream.dart
index d4e7f70..f3546c7 100644
--- a/pkg/http/lib/src/byte_stream.dart
+++ b/pkg/http/lib/src/byte_stream.dart
@@ -23,7 +23,8 @@
   /// Collects the data of this stream in a [Uint8List].
   Future<Uint8List> toBytes() {
     var completer = new Completer();
-    var sink = new ByteConversionSink.withCallback(completer.complete);
+    var sink = new ByteConversionSink.withCallback((bytes) =>
+        completer.complete(new Uint8List.fromList(bytes)));
     listen(sink.add, onError: completer.completeError, onDone: sink.close,
         cancelOnError: true);
     return completer.future;
diff --git a/pkg/http/lib/src/client.dart b/pkg/http/lib/src/client.dart
index 68c9067..e29a9e0 100644
--- a/pkg/http/lib/src/client.dart
+++ b/pkg/http/lib/src/client.dart
@@ -10,9 +10,10 @@
 
 import 'base_client.dart';
 import 'base_request.dart';
+import 'io.dart' as io;
 import 'io_client.dart';
-import 'streamed_response.dart';
 import 'response.dart';
+import 'streamed_response.dart';
 
 /// The interface for HTTP clients that take care of maintaining persistent
 /// connections across multiple requests to the same server. If you only need to
@@ -24,9 +25,15 @@
 /// another instance of [Client] and add functionality on top of that. This
 /// allows all classes implementing [Client] to be mutually composable.
 abstract class Client {
-  /// Creates a new Client using the default implementation. This implementation
-  /// uses an underlying `dart:io` [HttpClient] to make requests.
-  factory Client() => new IOClient();
+  /// Creates a new client.
+  ///
+  /// Currently this will create an [IOClient] if `dart:io` is available and
+  /// throw an [UnsupportedError] otherwise. In the future, it will create a
+  /// [BrowserClient] if `dart:html` is available.
+  factory Client() {
+    io.assertSupported("IOClient");
+    return new IOClient();
+  }
 
   /// Sends an HTTP HEAD request with the given headers to the given URL, which
   /// can be a [Uri] or a [String].
diff --git a/pkg/http/lib/src/io.dart b/pkg/http/lib/src/io.dart
new file mode 100644
index 0000000..1730706
--- /dev/null
+++ b/pkg/http/lib/src/io.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.io;
+
+@MirrorsUsed(targets: const ['dart.io.HttpClient', 'dart.io.HttpException',
+  'dart.io.File'])
+import 'dart:mirrors';
+
+/// Whether `dart:io` is supported on this platform.
+bool get supported => _library != null;
+
+/// The `dart:io` library mirror, or `null` if it couldn't be loaded.
+final _library = _getLibrary();
+
+/// The `dart:io` HttpClient class mirror.
+final ClassMirror _httpClient =
+    _library.declarations[const Symbol('HttpClient')];
+
+/// The `dart:io` HttpException class mirror.
+final ClassMirror _httpException =
+    _library.declarations[const Symbol('HttpException')];
+
+/// The `dart:io` File class mirror.
+final ClassMirror _file = _library.declarations[const Symbol('File')];
+
+/// Asserts that the [name]d `dart:io` feature is supported on this platform.
+///
+/// If `dart:io` doesn't work on this platform, this throws an
+/// [UnsupportedError].
+void assertSupported(String name) {
+  if (supported) return;
+  throw new UnsupportedError("$name isn't supported on this platform.");
+}
+
+/// Creates a new `dart:io` HttpClient instance.
+newHttpClient() => _httpClient.newInstance(const Symbol(''), []).reflectee;
+
+/// Creates a new `dart:io` File instance with the given [path].
+newFile(String path) => _file.newInstance(const Symbol(''), [path]).reflectee;
+
+/// Returns whether [error] is a `dart:io` HttpException.
+bool isHttpException(error) => reflect(error).type.isSubtypeOf(_httpException);
+
+/// Tries to load `dart:io` and returns `null` if it fails.
+LibraryMirror _getLibrary() {
+  try {
+    return currentMirrorSystem().findLibrary(const Symbol('dart.io'));
+  } catch (_) {
+    // TODO(nweiz): narrow the catch clause when issue 18532 is fixed.
+    return null;
+  }
+}
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
index b5e4815..9fd81ac 100644
--- a/pkg/http/lib/src/io_client.dart
+++ b/pkg/http/lib/src/io_client.dart
@@ -5,22 +5,25 @@
 library io_client;
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:stack_trace/stack_trace.dart';
 
 import 'base_client.dart';
 import 'base_request.dart';
 import 'exception.dart';
+import 'io.dart' as io;
 import 'streamed_response.dart';
 
 /// A `dart:io`-based HTTP client. This is the default client.
 class IOClient extends BaseClient {
   /// The underlying `dart:io` HTTP client.
-  HttpClient _inner;
+  var _inner;
 
   /// Creates a new HTTP client.
-  IOClient() : _inner = new HttpClient();
+  IOClient() {
+    io.assertSupported("IOClient");
+    _inner = io.newHttpClient();
+  }
 
   /// Sends an HTTP request and asynchronously returns the response.
   Future<StreamedResponse> send(BaseRequest request) {
@@ -50,7 +53,7 @@
       return new StreamedResponse(
           response.handleError((error) =>
               throw new ClientException(error.message, error.uri),
-              test: (error) => error is HttpException),
+              test: (error) => io.isHttpException(error)),
           response.statusCode,
           contentLength: contentLength,
           request: request,
@@ -59,7 +62,7 @@
           persistentConnection: response.persistentConnection,
           reasonPhrase: response.reasonPhrase);
     }).catchError((error) {
-      if (error is! HttpException) throw error;
+      if (!io.isHttpException(error)) throw error;
       throw new ClientException(error.message, error.uri);
     });
   }
diff --git a/pkg/http/lib/src/multipart_file.dart b/pkg/http/lib/src/multipart_file.dart
index 220c286..07758b9 100644
--- a/pkg/http/lib/src/multipart_file.dart
+++ b/pkg/http/lib/src/multipart_file.dart
@@ -5,7 +5,6 @@
 library multipart_file;
 
 import 'dart:async';
-import 'dart:io';
 import 'dart:convert';
 
 import 'package:http_parser/http_parser.dart';
@@ -13,6 +12,7 @@
 import 'package:stack_trace/stack_trace.dart';
 
 import 'byte_stream.dart';
+import 'io.dart' as io;
 import 'utils.dart';
 
 /// A file to be uploaded as part of a [MultipartRequest]. This doesn't need to
@@ -86,10 +86,13 @@
   /// [filename] defaults to the basename of [filePath]. [contentType] currently
   /// defaults to `application/octet-stream`, but in the future may be inferred
   /// from [filename].
+  ///
+  /// This can only be used in an environment that supports "dart:io".
   static Future<MultipartFile> fromPath(String field, String filePath,
       {String filename, MediaType contentType}) {
+    io.assertSupported("MultipartFile.fromPath");
     if (filename == null) filename = path.basename(filePath);
-    var file = new File(filePath);
+    var file = io.newFile(filePath);
     return Chain.track(file.length()).then((length) {
       var stream = new ByteStream(Chain.track(file.openRead()));
       return new MultipartFile(field, stream, length,
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index f3cf0c3..b02477e 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http
-version: 0.11.0-dev
+version: 0.11.0+1
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://pub.dartlang.org/packages/http
 description: A composable, Future-based API for making HTTP requests.
diff --git a/pkg/http/test/html/client_test.dart b/pkg/http/test/html/client_test.dart
new file mode 100644
index 0000000..90e7507
--- /dev/null
+++ b/pkg/http/test/html/client_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library client_test;
+
+import 'package:http/http.dart' as http;
+import 'package:http/browser_client.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+  test('#send a StreamedRequest', () {
+    var client = new BrowserClient();
+    var request = new http.StreamedRequest("POST", echoUrl);
+
+    expect(client.send(request).then((response) {
+      return response.stream.bytesToString();
+    }).whenComplete(client.close), completion(equals('{"hello": "world"}')));
+
+    request.sink.add('{"hello": "world"}'.codeUnits);
+    request.sink.close();
+  });
+
+  test('#send with an invalid URL', () {
+    var client = new BrowserClient();
+    var url = Uri.parse('http://http.invalid');
+    var request = new http.StreamedRequest("POST", url);
+
+    expect(client.send(request),
+        throwsClientException("XMLHttpRequest error."));
+
+    request.sink.add('{"hello": "world"}'.codeUnits);
+    request.sink.close();
+  });
+}
diff --git a/pkg/http/test/html/streamed_request_test.dart b/pkg/http/test/html/streamed_request_test.dart
new file mode 100644
index 0000000..e75d130
--- /dev/null
+++ b/pkg/http/test/html/streamed_request_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.html.streamed_request_test;
+
+import 'dart:convert';
+
+import 'package:http/http.dart' as http;
+import 'package:http/browser_client.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+  group('contentLength', () {
+    test("works when it's set", () {
+      var request = new http.StreamedRequest('POST', echoUrl);
+      request.contentLength = 10;
+      request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+      request.sink.close();
+
+      return new BrowserClient().send(request).then((response) {
+        expect(response.stream.toBytes(),
+            completion(equals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])));
+      });
+    });
+
+    test("works when it's not set", () {
+      var request = new http.StreamedRequest('POST', echoUrl);
+      request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+      request.sink.close();
+
+      return new BrowserClient().send(request).then((response) {
+        expect(response.stream.toBytes(),
+            completion(equals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])));
+      });
+    });
+  });
+}
\ No newline at end of file
diff --git a/pkg/http/test/html/utils.dart b/pkg/http/test/html/utils.dart
new file mode 100644
index 0000000..5803ec2
--- /dev/null
+++ b/pkg/http/test/html/utils.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.html_utils;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:html';
+
+import 'package:http/http.dart';
+import 'package:http/src/utils.dart';
+import 'package:unittest/unittest.dart';
+
+export '../utils.dart';
+
+/// The test server's echo URL.
+Uri get echoUrl => Uri.parse(
+    '${window.location.protocol}//${window.location.host}/echo');
diff --git a/pkg/http/test/client_test.dart b/pkg/http/test/io/client_test.dart
similarity index 95%
rename from pkg/http/test/client_test.dart
rename to pkg/http/test/io/client_test.dart
index 6f397fa..b9cc5fa 100644
--- a/pkg/http/test/client_test.dart
+++ b/pkg/http/test/io/client_test.dart
@@ -1,8 +1,8 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library client_test;
+library http.test.io.client_test;
 
 import 'dart:io';
 
diff --git a/pkg/http/test/http_test.dart b/pkg/http/test/io/http_test.dart
similarity index 98%
rename from pkg/http/test/http_test.dart
rename to pkg/http/test/io/http_test.dart
index 69bc43d..9ba5924 100644
--- a/pkg/http/test/http_test.dart
+++ b/pkg/http/test/io/http_test.dart
@@ -1,8 +1,8 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library http_test;
+library http.test.io.http_test;
 
 import 'package:http/http.dart' as http;
 import 'package:unittest/unittest.dart';
diff --git a/pkg/http/test/io/multipart_test.dart b/pkg/http/test/io/multipart_test.dart
new file mode 100644
index 0000000..e3df378
--- /dev/null
+++ b/pkg/http/test/io/multipart_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.io.multipart_test;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:http/http.dart' as http;
+import 'package:path/path.dart' as path;
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+  var tempDir;
+  setUp(() {
+    tempDir = Directory.systemTemp.createTempSync('http_test_');
+  });
+
+  tearDown(() => tempDir.deleteSync(recursive: true));
+
+  test('with a file from disk', () {
+    expect(new Future.sync(() {
+      var filePath = path.join(tempDir.path, 'test-file');
+      new File(filePath).writeAsStringSync('hello');
+      return http.MultipartFile.fromPath('file', filePath);
+    }).then((file) {
+      var request = new http.MultipartRequest('POST', dummyUrl);
+      request.files.add(file);
+
+      expect(request, bodyMatches('''
+        --{{boundary}}
+        content-type: application/octet-stream
+        content-disposition: form-data; name="file"; filename="test-file"
+
+        hello
+        --{{boundary}}--
+      '''));
+    }), completes);
+  });
+}
diff --git a/pkg/http/test/io/request_test.dart b/pkg/http/test/io/request_test.dart
new file mode 100644
index 0000000..0259571
--- /dev/null
+++ b/pkg/http/test/io/request_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.io.request_test;
+
+import 'package:http/http.dart' as http;
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+  test('.send', () {
+    expect(startServer().then((_) {
+
+      var request = new http.Request('POST', serverUrl);
+      request.body = "hello";
+      request.headers['User-Agent'] = 'Dart';
+
+      expect(request.send().then((response) {
+        expect(response.statusCode, equals(200));
+        return response.stream.bytesToString();
+      }).whenComplete(stopServer), completion(parse(equals({
+        'method': 'POST',
+        'path': '/',
+        'headers': {
+          'content-type': ['text/plain; charset=utf-8'],
+          'accept-encoding': ['gzip'],
+          'user-agent': ['Dart'],
+          'content-length': ['5']
+        },
+        'body': 'hello'
+      }))));
+    }), completes);
+  });
+
+  test('#followRedirects', () {
+    expect(startServer().then((_) {
+      var request = new http.Request('POST', serverUrl.resolve('/redirect'))
+          ..followRedirects = false;
+      var future = request.send().then((response) {
+        expect(response.statusCode, equals(302));
+      });
+      expect(future.catchError((_) {}).then((_) => stopServer()), completes);
+      expect(future, completes);
+    }), completes);
+  });
+
+  test('#maxRedirects', () {
+    expect(startServer().then((_) {
+      var request = new http.Request('POST', serverUrl.resolve('/loop?1'))
+        ..maxRedirects = 2;
+      var future = request.send().catchError((error) {
+        expect(error, isRedirectLimitExceededException);
+        expect(error.redirects.length, equals(2));
+      });
+      expect(future.catchError((_) {}).then((_) => stopServer()), completes);
+      expect(future, completes);
+    }), completes);
+  });
+}
diff --git a/pkg/http/test/io/streamed_request_test.dart b/pkg/http/test/io/streamed_request_test.dart
new file mode 100644
index 0000000..ef823f9
--- /dev/null
+++ b/pkg/http/test/io/streamed_request_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.io.streamed_request_test;
+
+import 'dart:convert';
+
+import 'package:http/http.dart' as http;
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+  group('contentLength', () {
+    test('controls the Content-Length header', () {
+      return startServer().then((_) {
+        var request = new http.StreamedRequest('POST', serverUrl);
+        request.contentLength = 10;
+        request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+        request.sink.close();
+
+        return request.send();
+      }).then((response) {
+        expect(UTF8.decodeStream(response.stream),
+            completion(parse(containsPair('headers',
+                containsPair('content-length', ['10'])))));
+      }).whenComplete(stopServer);
+    });
+
+    test('defaults to sending no Content-Length', () {
+      return startServer().then((_) {
+        var request = new http.StreamedRequest('POST', serverUrl);
+        request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+        request.sink.close();
+
+        return request.send();
+      }).then((response) {
+        expect(UTF8.decodeStream(response.stream),
+            completion(parse(containsPair('headers',
+                isNot(contains('content-length'))))));
+      }).whenComplete(stopServer);
+    });
+  });
+
+  // Regression test.
+  test('.send() with a response with no content length', () {
+    return startServer().then((_) {
+      var request = new http.StreamedRequest(
+          'GET', serverUrl.resolve('/no-content-length'));
+      request.sink.close();
+      return request.send();
+    }).then((response) {
+      expect(UTF8.decodeStream(response.stream), completion(equals('body')));
+    }).whenComplete(stopServer);
+  });
+
+}
\ No newline at end of file
diff --git a/pkg/http/test/io/utils.dart b/pkg/http/test/io/utils.dart
new file mode 100644
index 0000000..53d1121
--- /dev/null
+++ b/pkg/http/test/io/utils.dart
@@ -0,0 +1,151 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.io_utils;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:http/http.dart';
+import 'package:http/src/utils.dart';
+import 'package:unittest/unittest.dart';
+
+export '../utils.dart';
+
+/// The current server instance.
+HttpServer _server;
+
+/// The URL for the current server instance.
+Uri get serverUrl => Uri.parse('http://localhost:${_server.port}');
+
+/// Starts a new HTTP server.
+Future startServer() {
+  return HttpServer.bind("localhost", 0).then((s) {
+    _server = s;
+    s.listen((request) {
+      var path = request.uri.path;
+      var response = request.response;
+
+      if (path == '/error') {
+        response.statusCode = 400;
+        response.contentLength = 0;
+        response.close();
+        return;
+      }
+
+      if (path == '/loop') {
+        var n = int.parse(request.uri.query);
+        response.statusCode = 302;
+        response.headers.set('location',
+            serverUrl.resolve('/loop?${n + 1}').toString());
+        response.contentLength = 0;
+        response.close();
+        return;
+      }
+
+      if (path == '/redirect') {
+        response.statusCode = 302;
+        response.headers.set('location', serverUrl.resolve('/').toString());
+        response.contentLength = 0;
+        response.close();
+        return;
+      }
+
+      if (path == '/no-content-length') {
+        response.statusCode = 200;
+        response.contentLength = -1;
+        response.write('body');
+        response.close();
+        return;
+      }
+
+      new ByteStream(request).toBytes().then((requestBodyBytes) {
+        var outputEncoding;
+        var encodingName = request.uri.queryParameters['response-encoding'];
+        if (encodingName != null) {
+          outputEncoding = requiredEncodingForCharset(encodingName);
+        } else {
+          outputEncoding = ASCII;
+        }
+
+        response.headers.contentType =
+            new ContentType(
+                "application", "json", charset: outputEncoding.name);
+        response.headers.set('single', 'value');
+
+        var requestBody;
+        if (requestBodyBytes.isEmpty) {
+          requestBody = null;
+        } else if (request.headers.contentType != null &&
+            request.headers.contentType.charset != null) {
+          var encoding = requiredEncodingForCharset(
+              request.headers.contentType.charset);
+          requestBody = encoding.decode(requestBodyBytes);
+        } else {
+          requestBody = requestBodyBytes;
+        }
+
+        var content = {
+          'method': request.method,
+          'path': request.uri.path,
+          'headers': {}
+        };
+        if (requestBody != null) content['body'] = requestBody;
+        request.headers.forEach((name, values) {
+          // These headers are automatically generated by dart:io, so we don't
+          // want to test them here.
+          if (name == 'cookie' || name == 'host') return;
+
+          content['headers'][name] = values;
+        });
+
+        var body = JSON.encode(content);
+        response.contentLength = body.length;
+        response.write(body);
+        response.close();
+      });
+    });
+  });
+}
+
+/// Stops the current HTTP server.
+void stopServer() {
+  if (_server != null) {
+    _server.close();
+    _server = null;
+  }
+}
+
+/// A matcher for functions that throw HttpException.
+Matcher get throwsClientException =>
+    throwsA(new isInstanceOf<ClientException>());
+
+/// A matcher for RedirectLimitExceededExceptions.
+const isRedirectLimitExceededException =
+    const _RedirectLimitExceededException();
+
+/// A matcher for functions that throw RedirectLimitExceededException.
+const Matcher throwsRedirectLimitExceededException =
+    const Throws(isRedirectLimitExceededException);
+
+class _RedirectLimitExceededException extends TypeMatcher {
+  const _RedirectLimitExceededException() :
+      super("RedirectLimitExceededException");
+
+  bool matches(item, Map matchState) =>
+    item is RedirectException && item.message == "Redirect limit exceeded";
+}
+
+/// A matcher for SocketExceptions.
+const isSocketException = const _SocketException();
+
+/// A matcher for functions that throw SocketException.
+const Matcher throwsSocketException =
+    const Throws(isSocketException);
+
+class _SocketException extends TypeMatcher {
+  const _SocketException() : super("SocketException");
+  bool matches(item, Map matchState) => item is SocketException;
+}
diff --git a/pkg/http/test/multipart_test.dart b/pkg/http/test/multipart_test.dart
index a3f0f8e..e2494d5 100644
--- a/pkg/http/test/multipart_test.dart
+++ b/pkg/http/test/multipart_test.dart
@@ -5,50 +5,13 @@
 library multipart_test;
 
 import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
 
 import 'package:http/http.dart' as http;
 import 'package:http_parser/http_parser.dart';
-import 'package:path/path.dart' as path;
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
 
-/// A matcher that validates the body of a multipart request after finalization.
-/// The string "{{boundary}}" in [pattern] will be replaced by the boundary
-/// string for the request, and LF newlines will be replaced with CRLF.
-/// Indentation will be normalized.
-Matcher bodyMatches(String pattern) => new _BodyMatches(pattern);
-
-class _BodyMatches extends Matcher {
-  final String _pattern;
-
-  _BodyMatches(this._pattern);
-
-  bool matches(item, Map matchState) {
-    if (item is! http.MultipartRequest) return false;
-
-    var future = item.finalize().toBytes().then((bodyBytes) {
-      var body = UTF8.decode(bodyBytes);
-      var contentType = new MediaType.parse(item.headers['content-type']);
-      var boundary = contentType.parameters['boundary'];
-      var expected = cleanUpLiteral(_pattern)
-          .replaceAll("\n", "\r\n")
-          .replaceAll("{{boundary}}", boundary);
-
-      expect(body, equals(expected));
-      expect(item.contentLength, equals(bodyBytes.length));
-    });
-
-    return completes.matches(future, matchState);
-  }
-
-  Description describe(Description description) {
-    return description.add('has a body that matches "$_pattern"');
-  }
-}
-
 void main() {
   test('empty', () {
     var request = new http.MultipartRequest('POST', dummyUrl);
@@ -269,33 +232,4 @@
         --{{boundary}}--
         '''));
   });
-
-  group('in a temp directory', () {
-    var tempDir;
-    setUp(() {
-      tempDir = Directory.systemTemp.createTempSync('http_test_');
-    });
-
-    tearDown(() => tempDir.deleteSync(recursive: true));
-
-    test('with a file from disk', () {
-      expect(new Future.sync(() {
-        var filePath = path.join(tempDir.path, 'test-file');
-        new File(filePath).writeAsStringSync('hello');
-        return http.MultipartFile.fromPath('file', filePath);
-      }).then((file) {
-        var request = new http.MultipartRequest('POST', dummyUrl);
-        request.files.add(file);
-
-        expect(request, bodyMatches('''
-        --{{boundary}}
-        content-type: application/octet-stream
-        content-disposition: form-data; name="file"; filename="test-file"
-
-        hello
-        --{{boundary}}--
-        '''));
-      }), completes);
-    });
-  });
 }
diff --git a/pkg/http/test/request_test.dart b/pkg/http/test/request_test.dart
index 08e2ef9..2875928 100644
--- a/pkg/http/test/request_test.dart
+++ b/pkg/http/test/request_test.dart
@@ -5,7 +5,6 @@
 library request_test;
 
 import 'dart:convert';
-import 'dart:io';
 
 import 'package:http/http.dart' as http;
 import 'package:unittest/unittest.dart';
@@ -13,30 +12,6 @@
 import 'utils.dart';
 
 void main() {
-  test('.send', () {
-    expect(startServer().then((_) {
-
-      var request = new http.Request('POST', serverUrl);
-      request.body = "hello";
-      request.headers['User-Agent'] = 'Dart';
-
-      expect(request.send().then((response) {
-        expect(response.statusCode, equals(200));
-        return response.stream.bytesToString();
-      }).whenComplete(stopServer), completion(parse(equals({
-        'method': 'POST',
-        'path': '/',
-        'headers': {
-          'content-type': ['text/plain; charset=utf-8'],
-          'accept-encoding': ['gzip'],
-          'user-agent': ['Dart'],
-          'content-length': ['5']
-        },
-        'body': 'hello'
-      }))));
-    }), completes);
-  });
-
   group('#contentLength', () {
     test('is computed from bodyBytes', () {
       var request = new http.Request('POST', dummyUrl);
@@ -74,8 +49,7 @@
 
     test('is based on the content-type charset if it exists', () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] =
-          'text/plain; charset=iso-8859-1';
+      request.headers['Content-Type'] = 'text/plain; charset=iso-8859-1';
       expect(request.encoding.name, equals(LATIN1.name));
     });
 
@@ -83,17 +57,16 @@
         () {
       var request = new http.Request('POST', dummyUrl);
       request.encoding = LATIN1;
-      request.headers[HttpHeaders.CONTENT_TYPE] =
-          'text/plain; charset=utf-8';
+      request.headers['Content-Type'] = 'text/plain; charset=utf-8';
       expect(request.encoding.name, equals(UTF8.name));
 
-      request.headers.remove(HttpHeaders.CONTENT_TYPE);
+      request.headers.remove('Content-Type');
       expect(request.encoding.name, equals(LATIN1.name));
     });
 
     test('throws an error if the content-type charset is unknown', () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] =
+      request.headers['Content-Type'] =
           'text/plain; charset=not-a-real-charset';
       expect(() => request.encoding, throwsFormatException);
     });
@@ -159,19 +132,19 @@
 
     test("can't be read with the wrong content-type", () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] = 'text/plain';
+      request.headers['Content-Type'] = 'text/plain';
       expect(() => request.bodyFields, throwsStateError);
     });
 
     test("can't be set with the wrong content-type", () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] = 'text/plain';
+      request.headers['Content-Type'] = 'text/plain';
       expect(() => request.bodyFields = {}, throwsStateError);
     });
 
     test('defaults to empty', () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] =
+      request.headers['Content-Type'] =
           'application/x-www-form-urlencoded';
       expect(request.bodyFields, isEmpty);
     });
@@ -184,7 +157,7 @@
 
     test('changes when body changes', () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] =
+      request.headers['Content-Type'] =
           'application/x-www-form-urlencoded';
       request.body = 'key%201=value&key+2=other%2bvalue';
       expect(request.bodyFields,
@@ -193,7 +166,7 @@
 
     test('is encoded according to the given encoding', () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] =
+      request.headers['Content-Type'] =
           'application/x-www-form-urlencoded';
       request.encoding = LATIN1;
       request.bodyFields = {"föø": "bãr"};
@@ -202,7 +175,7 @@
 
     test('is decoded according to the given encoding', () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] =
+      request.headers['Content-Type'] =
           'application/x-www-form-urlencoded';
       request.encoding = LATIN1;
       request.body = 'f%F6%F8=b%E3r';
@@ -210,65 +183,16 @@
     });
   });
 
-  test('#followRedirects', () {
-    print("This test is known to be flaky, please ignore "
-          "(debug prints below added by sgjesse@)");
-    print("#followRedirects test starting server...");
-    expect(startServer().then((_) {
-      print("#followRedirects test server running");
-
-      var request = new http.Request('POST', serverUrl.resolve('/redirect'))
-          ..followRedirects = false;
-      var future = request.send().then((response) {
-        print("#followRedirects test response received");
-        expect(response.statusCode, equals(302));
-      });
-      expect(future.catchError((_) {}).then((_) {
-        print("#followRedirects test stopping server...");
-        stopServer();
-        print("#followRedirects test server stopped");
-      }), completes);
-
-      expect(future, completes);
-      print("#followRedirects test started");
-    }), completes);
-  });
-
-  test('#maxRedirects', () {
-    print("This test is known to be flaky, please ignore "
-          "(debug prints below added by sgjesse@)");
-    print("#maxRedirects test starting server...");
-    expect(startServer().then((_) {
-      print("#maxRedirects test server running");
-
-      var request = new http.Request('POST', serverUrl.resolve('/loop?1'))
-        ..maxRedirects = 2;
-      var future = request.send().catchError((error) {
-        print("#maxRedirects test exception received");
-        expect(error, isRedirectLimitExceededException);
-        expect(error.redirects.length, equals(2));
-      });
-      expect(future.catchError((_) {}).then((_) {
-        print("#maxRedirects test stopping server...");
-        stopServer();
-        print("#maxRedirects test server stopped");
-      }), completes);
-
-      expect(future, completes);
-      print("#maxRedirects test started");
-    }), completes);
-  });
-
   group('content-type header', () {
     test('defaults to empty', () {
       var request = new http.Request('POST', dummyUrl);
-      expect(request.headers[HttpHeaders.CONTENT_TYPE], isNull);
+      expect(request.headers['Content-Type'], isNull);
     });
 
     test('defaults to empty if only encoding is set', () {
       var request = new http.Request('POST', dummyUrl);
       request.encoding = LATIN1;
-      expect(request.headers[HttpHeaders.CONTENT_TYPE], isNull);
+      expect(request.headers['Content-Type'], isNull);
     });
 
     test('name is case insensitive', () {
@@ -282,7 +206,7 @@
         'bodyFields is set', () {
       var request = new http.Request('POST', dummyUrl);
       request.bodyFields = {'hello': 'world'};
-      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+      expect(request.headers['Content-Type'],
           equals('application/x-www-form-urlencoded; charset=utf-8'));
     });
 
@@ -291,7 +215,7 @@
       var request = new http.Request('POST', dummyUrl);
       request.encoding = LATIN1;
       request.bodyFields = {'hello': 'world'};
-      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+      expect(request.headers['Content-Type'],
           equals('application/x-www-form-urlencoded; charset=iso-8859-1'));
     });
 
@@ -300,50 +224,50 @@
       var request = new http.Request('POST', dummyUrl);
       request.encoding = LATIN1;
       request.body = 'hello, world';
-      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+      expect(request.headers['Content-Type'],
           equals('text/plain; charset=iso-8859-1'));
     });
 
     test('is modified to include utf-8 if body is set', () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json';
+      request.headers['Content-Type'] = 'application/json';
       request.body = '{"hello": "world"}';
-      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+      expect(request.headers['Content-Type'],
           equals('application/json; charset=utf-8'));
     });
 
     test('is modified to include the given encoding if encoding is set', () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json';
+      request.headers['Content-Type'] = 'application/json';
       request.encoding = LATIN1;
-      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+      expect(request.headers['Content-Type'],
           equals('application/json; charset=iso-8859-1'));
     });
 
     test('has its charset overridden by an explicit encoding', () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] =
+      request.headers['Content-Type'] =
           'application/json; charset=utf-8';
       request.encoding = LATIN1;
-      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+      expect(request.headers['Content-Type'],
           equals('application/json; charset=iso-8859-1'));
     });
 
     test("doen't have its charset overridden by setting bodyFields", () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] =
+      request.headers['Content-Type'] =
           'application/x-www-form-urlencoded; charset=iso-8859-1';
       request.bodyFields = {'hello': 'world'};
-      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+      expect(request.headers['Content-Type'],
           equals('application/x-www-form-urlencoded; charset=iso-8859-1'));
     });
 
     test("doen't have its charset overridden by setting body", () {
       var request = new http.Request('POST', dummyUrl);
-      request.headers[HttpHeaders.CONTENT_TYPE] =
+      request.headers['Content-Type'] =
           'application/json; charset=iso-8859-1';
       request.body = '{"hello": "world"}';
-      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+      expect(request.headers['Content-Type'],
           equals('application/json; charset=iso-8859-1'));
     });
   });
diff --git a/pkg/http/test/streamed_request_test.dart b/pkg/http/test/streamed_request_test.dart
index c9e3689..afe8e09 100644
--- a/pkg/http/test/streamed_request_test.dart
+++ b/pkg/http/test/streamed_request_test.dart
@@ -23,52 +23,10 @@
       expect(() => request.contentLength = -1, throwsArgumentError);
     });
 
-    test('controls the Content-Length header', () {
-      return startServer().then((_) {
-        var request = new http.StreamedRequest('POST', serverUrl);
-        request.contentLength = 10;
-        request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
-        request.sink.close();
-
-        return request.send();
-      }).then((response) {
-        expect(UTF8.decodeStream(response.stream),
-            completion(parse(containsPair('headers',
-                containsPair('content-length', ['10'])))));
-      }).whenComplete(stopServer);
-    });
-
-    test('defaults to sending no Content-Length', () {
-      return startServer().then((_) {
-        var request = new http.StreamedRequest('POST', serverUrl);
-        request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
-        request.sink.close();
-
-        return request.send();
-      }).then((response) {
-        expect(UTF8.decodeStream(response.stream),
-            completion(parse(containsPair('headers',
-                isNot(contains('content-length'))))));
-      }).whenComplete(stopServer);
-    });
-
     test('is frozen by finalize()', () {
       var request = new http.StreamedRequest('POST', dummyUrl);
       request.finalize();
       expect(() => request.contentLength = 10, throwsStateError);
     });
   });
-
-  // Regression test.
-  test('.send() with a response with no content length', () {
-    return startServer().then((_) {
-      var request = new http.StreamedRequest(
-          'GET', serverUrl.resolve('/no-content-length'));
-      request.sink.close();
-      return request.send();
-    }).then((response) {
-      expect(UTF8.decodeStream(response.stream), completion(equals('body')));
-    }).whenComplete(stopServer);
-  });
-
 }
\ No newline at end of file
diff --git a/pkg/http/test/utils.dart b/pkg/http/test/utils.dart
index 051cbd4..f89a0c5 100644
--- a/pkg/http/test/utils.dart
+++ b/pkg/http/test/utils.dart
@@ -4,121 +4,15 @@
 
 library test_utils;
 
-import 'dart:async';
 import 'dart:convert';
-import 'dart:io';
 
-import 'package:http/http.dart';
-import 'package:http/src/utils.dart';
+import 'package:http/http.dart' as http;
+import 'package:http_parser/http_parser.dart';
 import 'package:unittest/unittest.dart';
 
-/// The current server instance.
-HttpServer _server;
-
-/// The URL for the current server instance.
-Uri get serverUrl => Uri.parse('http://localhost:${_server.port}');
-
 /// A dummy URL for constructing requests that won't be sent.
 Uri get dummyUrl => Uri.parse('http://dartlang.org/');
 
-/// Starts a new HTTP server.
-Future startServer() {
-  return HttpServer.bind("localhost", 0).then((s) {
-    _server = s;
-    s.listen((request) {
-      var path = request.uri.path;
-      var response = request.response;
-
-      if (path == '/error') {
-        response.statusCode = 400;
-        response.contentLength = 0;
-        response.close();
-        return;
-      }
-
-      if (path == '/loop') {
-        var n = int.parse(request.uri.query);
-        response.statusCode = 302;
-        response.headers.set('location',
-            serverUrl.resolve('/loop?${n + 1}').toString());
-        response.contentLength = 0;
-        response.close();
-        return;
-      }
-
-      if (path == '/redirect') {
-        response.statusCode = 302;
-        response.headers.set('location', serverUrl.resolve('/').toString());
-        response.contentLength = 0;
-        response.close();
-        return;
-      }
-
-      if (path == '/no-content-length') {
-        response.statusCode = 200;
-        response.contentLength = -1;
-        response.write('body');
-        response.close();
-        return;
-      }
-
-      new ByteStream(request).toBytes().then((requestBodyBytes) {
-        var outputEncoding;
-        var encodingName = request.uri.queryParameters['response-encoding'];
-        if (encodingName != null) {
-          outputEncoding = requiredEncodingForCharset(encodingName);
-        } else {
-          outputEncoding = ASCII;
-        }
-
-        response.headers.contentType =
-            new ContentType(
-                "application", "json", charset: outputEncoding.name);
-        response.headers.set('single', 'value');
-
-        var requestBody;
-        if (requestBodyBytes.isEmpty) {
-          requestBody = null;
-        } else if (request.headers.contentType != null &&
-            request.headers.contentType.charset != null) {
-          var encoding = requiredEncodingForCharset(
-              request.headers.contentType.charset);
-          requestBody = encoding.decode(requestBodyBytes);
-        } else {
-          requestBody = requestBodyBytes;
-        }
-
-        var content = {
-          'method': request.method,
-          'path': request.uri.path,
-          'headers': {}
-        };
-        if (requestBody != null) content['body'] = requestBody;
-        request.headers.forEach((name, values) {
-          // These headers are automatically generated by dart:io, so we don't
-          // want to test them here.
-          if (name == 'cookie' || name == 'host') return;
-
-          content['headers'][name] = values;
-        });
-
-        var body = JSON.encode(content);
-        response.contentLength = body.length;
-        response.write(body);
-        response.close();
-      });
-    });
-  });
-}
-
-/// Stops the current HTTP server.
-void stopServer() {
-  if (_server != null) {
-    _server.close();
-    _server = null;
-  }
-}
-
 /// Removes eight spaces of leading indentation from a multiline string.
 ///
 /// Note that this is very sensitive to how the literals are styled. They should
@@ -174,34 +68,51 @@
   }
 }
 
-/// A matcher for functions that throw HttpException.
-Matcher get throwsClientException =>
-    throwsA(new isInstanceOf<ClientException>());
+/// A matcher that validates the body of a multipart request after finalization.
+/// The string "{{boundary}}" in [pattern] will be replaced by the boundary
+/// string for the request, and LF newlines will be replaced with CRLF.
+/// Indentation will be normalized.
+Matcher bodyMatches(String pattern) => new _BodyMatches(pattern);
 
-/// A matcher for RedirectLimitExceededExceptions.
-const isRedirectLimitExceededException =
-    const _RedirectLimitExceededException();
+class _BodyMatches extends Matcher {
+  final String _pattern;
 
-/// A matcher for functions that throw RedirectLimitExceededException.
-const Matcher throwsRedirectLimitExceededException =
-    const Throws(isRedirectLimitExceededException);
+  _BodyMatches(this._pattern);
 
-class _RedirectLimitExceededException extends TypeMatcher {
-  const _RedirectLimitExceededException() :
-      super("RedirectLimitExceededException");
+  bool matches(item, Map matchState) {
+    if (item is! http.MultipartRequest) return false;
 
-  bool matches(item, Map matchState) =>
-    item is RedirectException && item.message == "Redirect limit exceeded";
+    var future = item.finalize().toBytes().then((bodyBytes) {
+      var body = UTF8.decode(bodyBytes);
+      var contentType = new MediaType.parse(item.headers['content-type']);
+      var boundary = contentType.parameters['boundary'];
+      var expected = cleanUpLiteral(_pattern)
+          .replaceAll("\n", "\r\n")
+          .replaceAll("{{boundary}}", boundary);
+
+      expect(body, equals(expected));
+      expect(item.contentLength, equals(bodyBytes.length));
+    });
+
+    return completes.matches(future, matchState);
+  }
+
+  Description describe(Description description) {
+    return description.add('has a body that matches "$_pattern"');
+  }
 }
 
-/// A matcher for SocketExceptions.
-const isSocketException = const _SocketException();
+/// A matcher that matches a [http.ClientException] with the given [message].
+///
+/// [message] can be a String or a [Matcher].
+Matcher isClientException(message) => predicate((error) {
+  expect(error, new isInstanceOf<http.ClientException>());
+  expect(error.message, message);
+  return true;
+});
 
-/// A matcher for functions that throw SocketException.
-const Matcher throwsSocketException =
-    const Throws(isSocketException);
-
-class _SocketException extends TypeMatcher {
-  const _SocketException() : super("SocketException");
-  bool matches(item, Map matchState) => item is SocketException;
-}
+/// A matcher that matches function or future that throws a
+/// [http.ClientException] with the given [message].
+///
+/// [message] can be a String or a [Matcher].
+Matcher throwsClientException(message) => throwsA(isClientException(message));
diff --git a/pkg/intl/lib/number_format.dart b/pkg/intl/lib/number_format.dart
index 248eeb8..864bb32 100644
--- a/pkg/intl/lib/number_format.dart
+++ b/pkg/intl/lib/number_format.dart
@@ -95,20 +95,20 @@
       new NumberFormat._forPattern(locale, (x) => newPattern);
 
   /** Create a number format that prints as DECIMAL_PATTERN. */
-  NumberFormat.decimalPattern([String locale]) :
-      this._forPattern(locale, (x) => x.DECIMAL_PATTERN);
+  NumberFormat.decimalPattern([String locale]) : this._forPattern(locale,
+      (x) => x.DECIMAL_PATTERN);
 
   /** Create a number format that prints as PERCENT_PATTERN. */
-  NumberFormat.percentPattern([String locale]) :
-    this._forPattern(locale, (x) => x.PERCENT_PATTERN);
+  NumberFormat.percentPattern([String locale]) : this._forPattern(locale,
+      (x) => x.PERCENT_PATTERN);
 
   /** Create a number format that prints as SCIENTIFIC_PATTERN. */
-  NumberFormat.scientificPattern([String locale]) :
-    this._forPattern(locale, (x) => x.SCIENTIFIC_PATTERN);
+  NumberFormat.scientificPattern([String locale]) : this._forPattern(locale,
+      (x) => x.SCIENTIFIC_PATTERN);
 
   /** Create a number format that prints as CURRENCY_PATTERN. */
   NumberFormat.currencyPattern([String locale, String currency]) :
-    this._forPattern(locale, (x) => x.CURRENCY_PATTERN, currency);
+      this._forPattern(locale, (x) => x.CURRENCY_PATTERN, currency);
 
   /**
    * Create a number format that prints in a pattern we get from
@@ -163,6 +163,12 @@
   }
 
   /**
+   * Parse the number represented by the string. If it's not
+   * parseable, throws a [FormatException].
+   */
+  num parse(String text) => new _NumberParser(this, text).value;
+
+  /**
    * Format the main part of the number in the form dictated by the pattern.
    */
   void _formatNumber(num number) {
@@ -185,8 +191,8 @@
     var mantissa = number / pow(10.0, exponent);
 
     var minIntDigits = minimumIntegerDigits;
-    if (maximumIntegerDigits > 1 &&
-        maximumIntegerDigits > minimumIntegerDigits) {
+    if (maximumIntegerDigits > 1 && maximumIntegerDigits > minimumIntegerDigits)
+        {
       // A repeating range is defined; adjust to it as follows.
       // If repeat == 3, we have 6,5,4=>3; 3,2,1=>0; 0,-1,-2=>-3;
       // -3,-4,-5=>-6, etc. This takes into account that the
@@ -258,11 +264,11 @@
     // with zeros. Check for Javascript by seeing if an integer is double.
     var paddingDigits = '';
     if (1 is double && intValue > _maxInt) {
-        var howManyDigitsTooBig = (log(intValue) / LN10).ceil() - 16;
-        var divisor = pow(10, howManyDigitsTooBig).round();
-        paddingDigits = symbols.ZERO_DIGIT * howManyDigitsTooBig.toInt();
+      var howManyDigitsTooBig = (log(intValue) / LN10).ceil() - 16;
+      var divisor = pow(10, howManyDigitsTooBig).round();
+      paddingDigits = symbols.ZERO_DIGIT * howManyDigitsTooBig.toInt();
 
-        intValue = (intValue / divisor).truncate();
+      intValue = (intValue / divisor).truncate();
     }
     var integerDigits = "${intValue}${paddingDigits}".codeUnits;
     var digitLength = integerDigits.length;
@@ -288,8 +294,8 @@
   void _formatFractionPart(String fractionPart) {
     var fractionCodes = fractionPart.codeUnits;
     var fractionLength = fractionPart.length;
-    while(fractionCodes[fractionLength - 1] == _zero &&
-           fractionLength > minimumFractionDigits + 1) {
+    while (fractionCodes[fractionLength - 1] == _zero &&
+        fractionLength > minimumFractionDigits + 1) {
       fractionLength--;
     }
     for (var i = 1; i < fractionLength; i++) {
@@ -316,9 +322,9 @@
    * required characters into [_buffer] easily.
    */
   void _add(String x) { _buffer.write(x);}
-  void _addCharCode(int x) { _buffer.writeCharCode(x); }
-  void _addZero() { _buffer.write(symbols.ZERO_DIGIT); }
-  void _addDigit(int x) { _buffer.writeCharCode(_localeZero + x - _zero); }
+  void _addCharCode(int x) { _buffer.writeCharCode(x);}
+  void _addZero() { _buffer.write(symbols.ZERO_DIGIT);}
+  void _addDigit(int x) { _buffer.writeCharCode(_localeZero + x - _zero);}
 
   /** Print padding up to [numberOfDigits] above what's included in [basic]. */
   void _pad(int numberOfDigits, [String basic = '']) {
@@ -371,8 +377,7 @@
     if (newPattern == null) return;
     // Make spaces non-breaking
     _pattern = newPattern.replaceAll(' ', '\u00a0');
-    var parser =
-        new _NumberFormatParser(this, newPattern, currencyName);
+    var parser = new _NumberFormatParser(this, newPattern, currencyName);
     parser.parse();
   }
 
@@ -380,6 +385,259 @@
 }
 
 /**
+ *  A one-time object for parsing a particular numeric string. One-time here
+ * means an instance can only parse one string. This is implemented by
+ * transforming from a locale-specific format to one that the system can parse,
+ * then calls the system parsing methods on it.
+ */
+class _NumberParser {
+
+  /** The format for which we are parsing. */
+  final NumberFormat format;
+
+  /** The text we are parsing. */
+  final String text;
+
+  /** What we use to iterate over the input text. */
+  final _Stream input;
+
+  /**
+   * The result of parsing [text] according to [format]. Automatically
+   * populated in the constructor.
+   */
+  num value;
+
+  /** The symbols used by our format. */
+  NumberSymbols get symbols => format.symbols;
+
+  /** Where we accumulate the normalized representation of the number. */
+  final StringBuffer _normalized = new StringBuffer();
+
+  /**
+   * Did we see something that indicates this is, or at least might be,
+   * a positive number.
+   */
+  bool gotPositive = false;
+
+  /**
+   * Did we see something that indicates this is, or at least might be,
+   * a negative number.
+   */
+  bool gotNegative = false;
+  /**
+   * Did we see the required positive suffix at the end. Should
+   * match [gotPositive].
+   */
+  bool gotPositiveSuffix = false;
+  /**
+   * Did we see the required negative suffix at the end. Should
+   * match [gotNegative].
+   */
+  bool gotNegativeSuffix = false;
+
+  /** Should we stop parsing before hitting the end of the string. */
+  bool done = false;
+
+  /** Have we already skipped over any required prefixes. */
+  bool prefixesSkipped = false;
+
+  /** If the number is percent or permill, what do we divide by at the end. */
+  int scale = 1;
+
+  String get _positivePrefix => format._positivePrefix;
+  String get _negativePrefix => format._negativePrefix;
+  String get _positiveSuffix => format._positiveSuffix;
+  String get _negativeSuffix => format._negativeSuffix;
+  int get _zero => format._zero;
+  int get _localeZero => format._localeZero;
+
+  /**
+   *  Create a new [_NumberParser] on which we can call parse().
+   */
+  _NumberParser(this.format, text) : this.text = text,
+      this.input = new _Stream(text) {
+    value = parse();
+  }
+
+  /**
+   *  The strings we might replace with functions that return the replacement
+   * values. They are functions because we might need to check something
+   * in the context. Note that the ordering is important here. For example,
+   * [symbols.PERCENT] might be " %", and we must handle that before we
+   * look at an individual space.
+   */
+  Map<String, Function> get replacements => _replacements == null ?
+      _replacements = _initializeReplacements() : _replacements;
+
+  var _replacements;
+
+  Map _initializeReplacements() => {
+      symbols.DECIMAL_SEP: () => '.',
+      symbols.EXP_SYMBOL: () => 'E',
+      symbols.GROUP_SEP: handleSpace,
+      symbols.PERCENT: () {
+        scale = 100;
+        return '';
+      },
+      symbols.PERMILL: () {
+        scale = 100;
+        return '';
+      },
+      ' ' : handleSpace,
+      '\u00a0' : handleSpace,
+      '+': () => '+',
+      '-': () => '-',
+    };
+
+  invalidFormat() =>
+      throw new FormatException("Invalid number: ${input.contents}");
+
+  /**
+   * Replace a space in the number with the normalized form. If space is not
+   * a significant character (normally grouping) then it's just invalid. If it
+   * is the grouping character, then it's only valid if it's followed by a
+   * digit. e.g. '$12 345.00'
+   */
+  handleSpace() =>
+      groupingIsNotASpaceOrElseItIsSpaceFollowedByADigit ? '' : invalidFormat();
+
+  /**
+   * Determine if a space is a valid character in the number. See [handleSpace].
+   */
+  bool get groupingIsNotASpaceOrElseItIsSpaceFollowedByADigit {
+    if (symbols.GROUP_SEP != '\u00a0' || symbols.GROUP_SEP != ' ') return true;
+    var peeked = input.peek(symbols.GROUP_SEP.length + 1);
+    return asDigit(peeked[peeked.length - 1]) != null;
+  }
+
+  /**
+   * Turn [char] into a number representing a digit, or null if it doesn't
+   * represent a digit in this locale.
+   */
+  int asDigit(String char) {
+    var charCode = char.codeUnitAt(0);
+    var digitValue = charCode - _localeZero;
+    if (digitValue >= 0 && digitValue < 10) {
+      return digitValue;
+    } else {
+      return null;
+    }
+  }
+
+  /**
+   * Check to see if the input begins with either the positive or negative
+   * prefixes. Set the [gotPositive] and [gotNegative] variables accordingly.
+   */
+  void checkPrefixes({bool skip: false}) {
+    bool checkPrefix(String prefix, skip) {
+        var matched = prefix.isNotEmpty && input.startsWith(prefix);
+        if (skip && matched) input.read(prefix.length);
+        return matched;
+    }
+
+    // TODO(alanknight): There's a faint possibility of a bug here where
+    // a positive prefix is followed by a negative prefix that's also a valid
+    // part of the number, but that seems very unlikely.
+    if (checkPrefix(_positivePrefix, skip)) gotPositive = true;
+    if (checkPrefix(_negativePrefix, skip)) gotNegative = true;
+
+    // Copied from Closure. It doesn't seem to be necessary to pass the test
+    // suite, so I'm not sure it's really needed.
+    if (gotPositive && gotNegative) {
+      if (_positivePrefix.length > _negativePrefix.length) {
+        gotNegative = false;
+      } else if (_negativePrefix.length > _positivePrefix.length) {
+        gotPositive = false;
+      }
+    }
+  }
+
+  /**
+   * If the rest of our input is either the positive or negative suffix,
+   * set [gotPositiveSuffix] or [gotNegativeSuffix] accordingly.
+   */
+  void checkSuffixes() {
+    var remainder = input.rest();
+    if (remainder == _positiveSuffix) gotPositiveSuffix = true;
+    if (remainder == _negativeSuffix) gotNegativeSuffix = true;
+  }
+
+  /**
+   * We've encountered a character that's not a digit. Go through our
+   * replacement rules looking for how to handle it. If we see something
+   * that's not a digit and doesn't have a replacement, then we're done
+   * and the number is probably invalid.
+   */
+  void processNonDigit() {
+    for (var key in replacements.keys) {
+      if (input.startsWith(key)) {
+        _normalized.write(replacements[key]());
+        input.read(key.length);
+        return;
+      }
+    }
+    // It might just be a prefix that we haven't skipped. We don't want to
+    // skip them initially because they might also be semantically meaningful,
+    // e.g. leading %. So we allow them through the loop, but only once.
+    if (input.index == 0 && !prefixesSkipped) {
+      prefixesSkipped = true;
+      checkPrefixes(skip: true);
+    } else {
+      done = true;
+    }
+  }
+
+  /**
+   * Parse [text] and return the resulting number. Throws [FormatException]
+   * if we can't parse it.
+   */
+  num parse() {
+    if (text == symbols.NAN) return double.NAN;
+    if (text == "$_positivePrefix${symbols.INFINITY}$_positiveSuffix") {
+      return double.INFINITY;
+    }
+    if (text == "$_negativePrefix${symbols.INFINITY}$_negativeSuffix") {
+      return double.NEGATIVE_INFINITY;
+    }
+
+    checkPrefixes();
+    var basicNumber = parseNumber(input);
+
+    if (gotPositive && !gotPositiveSuffix) invalidNumber();
+    if (gotNegative && !gotNegativeSuffix) invalidNumber();
+    if (!input.atEnd()) invalidNumber();
+
+    return gotNegative ? -basicNumber : basicNumber;
+  }
+
+  /** The number is invalid, throw a [FormatException]. */
+  void invalidNumber() =>
+      throw new FormatException("Invalid Number: ${input.contents}");
+
+  /**
+   * Parse the number portion of the input, i.e. not any prefixes or suffixes,
+   * and assuming NaN and Infinity are already handled.
+   */
+  num parseNumber(_Stream input) {
+    while (!done && !input.atEnd()) {
+      int digit = asDigit(input.peek());
+      if (digit != null) {
+        _normalized.writeCharCode(_zero + digit);
+        input.next();
+      } else {
+        processNonDigit();
+      }
+      checkSuffixes();
+    }
+
+    var normalizedText = _normalized.toString();
+    var parsed = int.parse(normalizedText, onError: (message) => null);
+    if (parsed == null) parsed = double.parse(normalizedText);
+    return parsed / scale;
+  }
+}
+
+/**
  * Private class that parses the numeric formatting pattern and sets the
  * variables in [format] to appropriate values. Instances of this are
  * transient and store parsing state in instance variables, so can only be used
@@ -417,8 +675,8 @@
    * [input] pattern.
    */
   _NumberFormatParser(this.format, input, this.currencyName) :
-    pattern = _iterator(input) {
-        pattern.moveNext();
+      pattern = _iterator(input) {
+    pattern.moveNext();
   }
 
   /** The [NumberSymbols] for the locale in which our [format] prints. */
@@ -573,8 +831,8 @@
     var effectiveDecimalPos = decimalPos >= 0 ? decimalPos : totalDigits;
     format.minimumIntegerDigits = effectiveDecimalPos - digitLeftCount;
     if (format._useExponentialNotation) {
-      format.maximumIntegerDigits =
-          digitLeftCount + format.minimumIntegerDigits;
+      format.maximumIntegerDigits = digitLeftCount +
+          format.minimumIntegerDigits;
 
       // In exponential display, we need to at least show something.
       if (format.maximumFractionDigits == 0 &&
@@ -610,8 +868,8 @@
         break;
       case _PATTERN_ZERO_DIGIT:
         if (digitRightCount > 0) {
-          throw new FormatException('Unexpected "0" in pattern "'
-              + pattern.input + '"');
+          throw new FormatException('Unexpected "0" in pattern "' +
+              pattern.input + '"');
         }
         zeroDigitCount++;
         if (groupingCount >= 0 && decimalPos < 0) {
@@ -656,8 +914,7 @@
 
         if ((digitLeftCount + zeroDigitCount) < 1 ||
             format.minimumExponentDigits < 1) {
-          throw new FormatException(
-              'Malformed exponential pattern "$pattern"');
+          throw new FormatException('Malformed exponential pattern "$pattern"');
         }
         return false;
       default:
diff --git a/pkg/intl/lib/src/date_format_helpers.dart b/pkg/intl/lib/src/date_format_helpers.dart
index 5508586..d8adde1 100644
--- a/pkg/intl/lib/src/date_format_helpers.dart
+++ b/pkg/intl/lib/src/date_format_helpers.dart
@@ -85,6 +85,11 @@
  * dates from strings simpler. It is general enough to operate on either
  * lists or strings.
  */
+// TODO(alanknight): With the improvements to the collection libraries
+// since this was written we might be able to get rid of it entirely
+// in favor of e.g. aString.split('') giving us an iterable of one-character
+// strings, or else make the implementation trivial. And consider renaming,
+// as _Stream is now just confusing with the system Streams.
 class _Stream {
   var contents;
   int index = 0;
@@ -106,6 +111,15 @@
   }
 
   /**
+   * Does the input start with the given string, if we start from the
+   * current position.
+   */
+  bool startsWith(String pattern) {
+    if (contents is String) return contents.startsWith(pattern, index);
+    return pattern == peek(pattern.length);
+  }
+
+  /**
    * Return the next [howMany] items, or as many as there are remaining.
    * Does not modify the stream position.
    */
diff --git a/pkg/intl/test/number_format_test.dart b/pkg/intl/test/number_format_test.dart
index 064933d..3401971 100644
--- a/pkg/intl/test/number_format_test.dart
+++ b/pkg/intl/test/number_format_test.dart
@@ -15,7 +15,7 @@
 /**
  * Tests the Numeric formatting library in dart.
  */
-var testNumbers = {
+var testNumbersWeCanReadBack = {
   "0.001": 0.001,
   "0.01": 0.01,
   "0.1": 0.1,
@@ -32,7 +32,23 @@
   "NaN": double.NAN,
   "∞": double.INFINITY,
   "-∞": double.NEGATIVE_INFINITY,
-  "3.142": PI};
+};
+
+/** Test numbers that we can't parse because we lose precision in formatting.*/
+var testNumbersWeCannotReadBack = {
+  "3.142" : PI,
+  };
+
+/** Test numbers that won't work in Javascript because they're too big. */
+var testNumbersOnlyForTheVM = {
+  "10,000,000,000,000,000,000,000,000,000,000" :
+      10000000000000000000000000000000,
+};
+
+get allTestNumbers =>
+    new Map.from(testNumbersWeCanReadBack)
+      ..addAll(testNumbersWeCannotReadBack)
+      ..addAll(inJavaScript() ? {} : testNumbersOnlyForTheVM);
 
 var testExponential = const {
   "1E-3" : 0.001,
@@ -51,14 +67,11 @@
           ];
 }
 
+// Pay no attention to the hint. This is here deliberately to have different
+// behavior in the Dart VM versus Javascript so we can distinguish the two.
 inJavaScript() => 1 is double;
 
 main() {
-  if (!inJavaScript()) {
-    testNumbers["10,000,000,000,000,000,000,000,000,000,000"] =
-        10000000000000000000000000000000;
-  }
-
   // For data from a list of locales, run each locale's data as a separate
   // test so we can see exactly which ones pass or fail.
   var mainList = numberTestData;
@@ -75,15 +88,26 @@
         var formatted = format.format(123);
         var expected = (list..moveNext()).current;
         expect(formatted, expected);
+        var readBack = format.parse(formatted);
+        expect(readBack, 123);
       }
     });
   }
 
   test('Simple set of numbers', () {
     var number = new NumberFormat();
-    for (var x in testNumbers.keys) {
-      var formatted = number.format(testNumbers[x]);
+    for (var x in allTestNumbers.keys) {
+      var formatted = number.format(allTestNumbers[x]);
       expect(formatted, x);
+      if (!testNumbersWeCannotReadBack.containsKey(x)) {
+        var readBack = number.parse(formatted);
+        // Even among ones we can read back, we can't test NaN for equality.
+        if (allTestNumbers[x].isNaN) {
+          expect(readBack.isNaN, isTrue);
+        } else {
+          expect(readBack, allTestNumbers[x]);
+        }
+      }
     }
   });
 
@@ -92,6 +116,8 @@
     for (var x in testExponential.keys) {
       var formatted = number.format(testExponential[x]);
       expect(formatted, x);
+      var readBack = number.parse(formatted);
+      expect(testExponential[x], readBack);
     }
   });
 
@@ -100,15 +126,21 @@
     var usConvention = new NumberFormat.currencyPattern('en_US', '€');
     var formatted = usConvention.format(amount);
     expect(formatted, '€1,000,000.32');
+    var readBack = usConvention.parse(formatted);
+    expect(readBack, amount);
     var swissConvention = new NumberFormat.currencyPattern('de_CH', r'$');
     formatted = swissConvention.format(amount);
     var nbsp = new String.fromCharCode(0xa0);
     expect(formatted, r"$" + nbsp + "1'000'000.32");
+    readBack = swissConvention.parse(formatted);
+    expect(readBack, amount);
 
     /// Verify we can leave off the currency and it gets filled in.
     var plainSwiss = new NumberFormat.currencyPattern('de_CH');
     formatted = plainSwiss.format(amount);
     expect(formatted, r"CHF" + nbsp + "1'000'000.32");
+    readBack = plainSwiss.parse(formatted);
+    expect(readBack, amount);
 
     // Verify that we can pass null in order to specify the currency symbol
     // but use the default locale.
@@ -116,5 +148,15 @@
     formatted = defaultLocale.format(amount);
     // We don't know what the exact format will be, but it should have Smurfs.
     expect(formatted.contains('Smurfs'), isTrue);
+    readBack = defaultLocale.parse(formatted);
+    expect(readBack, amount);
+  });
+
+  test('Unparseable', () {
+    var format = new NumberFormat.currencyPattern();
+    expect(() => format.parse("abcdefg"), throwsFormatException);
+    expect(() => format.parse(""), throwsFormatException);
+    expect(() => format.parse("1.0zzz"), throwsFormatException);
+    expect(() => format.parse("-∞+1"), throwsFormatException);
   });
 }
diff --git a/pkg/oauth2/CHANGELOG.md b/pkg/oauth2/CHANGELOG.md
index da65ce6..fc869c9 100644
--- a/pkg/oauth2/CHANGELOG.md
+++ b/pkg/oauth2/CHANGELOG.md
@@ -2,6 +2,9 @@
 
 * Update the `http` dependency.
 
+* Since `http` 0.11.0 now works in non-`dart:io` contexts, `oauth2` does as
+  well.
+
 # 0.9.2
 
 * Expand the dependency on the HTTP package to include 0.10.x.
diff --git a/pkg/oauth2/README.md b/pkg/oauth2/README.md
index 72aff2a..52b724c 100644
--- a/pkg/oauth2/README.md
+++ b/pkg/oauth2/README.md
@@ -1,6 +1,6 @@
 A client library for authenticating with a remote service via OAuth2 on
 behalf of a user, and making authorized HTTP requests with the user's OAuth2
-credentials. Currently this only works where `dart:io` is available.
+credentials.
 
 OAuth2 allows a client (the program using this library) to access and
 manipulate a resource that's owned by a resource owner (the end user) and
diff --git a/pkg/oauth2/pubspec.yaml b/pkg/oauth2/pubspec.yaml
index 2e61c58..7a1311e 100644
--- a/pkg/oauth2/pubspec.yaml
+++ b/pkg/oauth2/pubspec.yaml
@@ -1,15 +1,15 @@
 name: oauth2
-version: 0.9.3-dev
+version: 0.9.3
 author: Dart Team <misc@dartlang.org>
 homepage: http://www.dartlang.org
 description: >
   A client library for authenticating with a remote service via OAuth2 on
   behalf of a user, and making authorized HTTP requests with the user's
-  OAuth2 credentials. Currently only works with dart:io.
+  OAuth2 credentials.
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  http: '>=0.11.0-dev <0.12.0'
+  http: '>=0.11.0 <0.12.0'
   http_parser: '>=0.0.0 <0.1.0'
 dev_dependencies:
   unittest: '>=0.9.0 <0.11.0'
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 0101b9b..d0ea50e 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -18,6 +18,9 @@
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
 polymer/test/build/script_compactor_test: Pass, Slow
 
+[ $compiler == dart2js && $browser ]
+polymer/test/attr_mustache_test: CompileTimeError # Issue 18667
+
 [ $runtime == vm && $mode == debug]
 analysis_server/test/analysis_server_test: Pass, Timeout
 analysis_server/test/domain_context_test: Pass, Timeout
@@ -112,11 +115,6 @@
 source_maps/test/vlq_test: RuntimeError # A VLQ test checks for large numbers that
                                 # overflow in JS (numbers slightly larger than
                                 # 32 bits where we do bitwise operations).
-[ $runtime == jsshell ]
-# Bug in Spidermonkey's Uint8ClampedArray on x64 (non-Win FF is x64, Win is x86)
-# See https://bugzilla.mozilla.org/show_bug.cgi?id=940972
-# Likely to get patched only on some versions of Firefox.
-typed_data/test/typed_buffers_test: RuntimeError
 
 [ $runtime == opera && $compiler == dart2js ]
 intl/test/find_default_locale_browser_test: Fail
@@ -138,7 +136,7 @@
 [ $runtime == ie10 ]
 typed_data/test/typed_buffers_test/none: Fail # Issue   17607 (I put this here explicitly, since this is not the same as on ie9)
 
-[ $runtime == safari ]
+[ $runtime == safari || $runtime == safarimobilesim ]
 # Unexplained errors only occuring on Safari.
 typed_data/test/typed_buffers_test: RuntimeError
 
@@ -205,13 +203,7 @@
 analyzer/test/services/formatter_test: Fail, OK # Uses dart:io.
 barback/test/*: Fail, OK # Uses dart:io.
 code_transformers/test/*: Skip # Uses dart:io.
-http/test/client_test: Fail, OK # Uses dart:io.
-http/test/http_test: Fail, OK # Uses dart:io.
-http/test/mock_client_test: Fail, OK # Uses dart:io.
-http/test/multipart_test: Fail, OK # Uses dart:io.
-http/test/request_test: Fail, OK # Uses dart:io.
-http/test/response_test: Fail, OK # Uses dart:io.
-http/test/streamed_request_test: Fail, OK # Uses dart:io.
+http/test/io/*: Fail, OK # Uses dart:io.
 http_parser/test/web_socket_test: Fail, OK # Uses dart:io
 http_server/test/*: Fail, OK # Uses dart:io.
 intl/test/date_time_format_file_even_test: Fail, OK # Uses dart:io.
@@ -221,10 +213,6 @@
 intl/test/message_extraction/failed_extraction_test: Fail, OK # Users dart:io
 intl/test/message_extraction/message_extraction_test: Fail, OK # Uses dart:io.
 intl/test/message_extraction/really_fail_extraction_test: Fail, OK # Users dart:io
-oauth2/test/authorization_code_grant_test: Fail, OK # Uses dart:io.
-oauth2/test/client_test: Fail, OK # Uses dart:io.
-oauth2/test/credentials_test: Fail, OK # Uses dart:io.
-oauth2/test/handle_access_token_response_test: Fail, OK # Uses dart:io.
 observe/test/transformer_test: Fail, OK # Uses dart:io.
 path/test/io_test: Fail, OK # Uses dart:io.
 polymer/test/build/*: Fail, OK # Uses dart:io.
@@ -314,8 +302,9 @@
 polymer_expressions/test/globals_test: Skip
 polymer_expressions/test/bindings_test: Skip
 third_party/html5lib/test/browser/browser_test: Skip
+http/test/html/*: Skip
 
-[ $runtime == safari || $ie ]
+[ $runtime == safari || $runtime == safarimobilesim || $ie ]
 polymer_expressions/test/globals_test: Fail # Issue 16568
 polymer_expressions/test/bindings_test: Fail # Issue 16568
 
@@ -339,7 +328,7 @@
 [ $runtime == vm && ($system == windows || $system == linux) ]
 watcher/test/*/mac_os_test: Skip
 
-[ $runtime == safari || $runtime == chrome || $runtime == ff || $ie ]
+[ $runtime == safari || $runtime == safarimobilesim || $runtime == chrome || $runtime == ff || $ie ]
 # Various issues due to limited browser testing in Angular.
 third_party/angular_tests/*: Skip
 
@@ -355,3 +344,18 @@
 
 [ $runtime == ie9 ]
 polymer: Pass, Fail, Timeout # Issue 16717
+
+# No typed_data on IE9.
+http/test/html/client_test: Fail
+http/test/html/streamed_request_test: Skip
+http/test/mock_client_test: Fail
+http/test/multipart_test: Fail
+http/test/request_test: Fail
+http/test/response_test: Fail
+oauth2/test/authorization_code_grant_test: Fail
+oauth2/test/client_test: Fail
+oauth2/test/credentials_test: Fail
+oauth2/test/handle_access_token_response_test: Fail
+
+[ $runtime == drt ]
+http/test/html/client_test: Skip # Issue 18566
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index d3715c8..836631d 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -15,7 +15,6 @@
 samples/third_party/angular_todo: Fail # angular needs to be updated
 
 [ $use_public_packages ]
-pkg/oauth2: PubGetError # Uses -dev version of pkg/http.
 samples/third_party/angular_todo: Pass, Slow
 
 [ $use_public_packages && $builder_tag == russian ]
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index e4cb472..339bd87 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.10.0-pre.10
+version: 0.10.0-pre.11.dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
@@ -8,7 +8,7 @@
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
   analyzer: '>=0.13.0 <0.14.0'
-  args: '>=0.10.0 <0.11.0'
+  args: '>=0.10.0 <0.12.0'
   barback: '>=0.9.0 <0.14.0'
   browser: '>=0.10.0 <0.11.0'
   code_transformers: '>=0.1.0 <0.2.0'
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 4066bfa..82fdb50 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: scheduled_test
-version: 0.11.0+1
+version: 0.11.0+2
 author: Dart Team <misc@dartlang.org>
 homepage: http://www.dartlang.org
 description: >
@@ -10,7 +10,7 @@
   read like synchronous, linear code, despite executing asynchronously.
 
 dependencies:
-  http: '>=0.9.0 <0.11.0'
+  http: '>=0.9.0 <0.12.0'
   path: '>=0.9.0 <2.0.0'
   shelf: '>=0.4.0 <0.6.0'
   stack_trace: '>=0.9.1 <0.10.0'
diff --git a/pkg/shelf/lib/src/message.dart b/pkg/shelf/lib/src/message.dart
index 1b2e966..1522e13 100644
--- a/pkg/shelf/lib/src/message.dart
+++ b/pkg/shelf/lib/src/message.dart
@@ -5,14 +5,13 @@
 library shelf.message;
 
 import 'dart:async';
-import 'dart:collection';
 import 'dart:convert';
 
-// TODO(kevmoo): use UnmodifiableMapView from SDK once 1.4 ships
-import 'package:collection/wrappers.dart' as pc;
 import 'package:http_parser/http_parser.dart';
 import 'package:stack_trace/stack_trace.dart';
 
+import 'shelf_unmodifiable_map.dart';
+
 /// Represents logic shared between [Request] and [Response].
 abstract class Message {
   /// The HTTP headers.
@@ -43,9 +42,10 @@
   /// If [headers] is `null`, it is treated as empty.
   Message(this._body, {Map<String, String> headers,
         Map<String, Object> context})
-      : this.headers = _getIgnoreCaseMapView(headers),
-        this.context = new pc.UnmodifiableMapView(
-            context == null ? const {} : new Map.from(context));
+      : this.headers = new ShelfUnmodifiableMap<String>(headers,
+            ignoreKeyCase: true),
+        this.context = new ShelfUnmodifiableMap<Object>(context,
+            ignoreKeyCase: false);
 
   /// The contents of the content-length field in [headers].
   ///
@@ -112,18 +112,8 @@
     if (encoding == null) encoding = UTF8;
     return Chain.track(encoding.decodeStream(read()));
   }
-}
 
-/// Creates on an unmodifiable map of [headers] with case-insensitive access.
-Map<String, String> _getIgnoreCaseMapView(Map<String, String> headers) {
-  if (headers == null) return const {};
-  // TODO(kevmoo) generalize this model with a 'canonical map' to align with
-  // similiar implementation in http pkg [BaseRequest].
-  var map = new LinkedHashMap<String, String>(
-      equals: (key1, key2) => key1.toLowerCase() == key2.toLowerCase(),
-      hashCode: (key) => key.toLowerCase().hashCode);
-
-  map.addAll(headers);
-
-  return new pc.UnmodifiableMapView<String, String>(map);
+  /// Creates a new [Message] by copying existing values and applying specified
+  /// changes.
+  Message change({Map<String, String> headers, Map<String, Object> context});
 }
diff --git a/pkg/shelf/lib/src/request.dart b/pkg/shelf/lib/src/request.dart
index f7e011d..192a782 100644
--- a/pkg/shelf/lib/src/request.dart
+++ b/pkg/shelf/lib/src/request.dart
@@ -9,6 +9,7 @@
 import 'package:http_parser/http_parser.dart';
 
 import 'message.dart';
+import 'util.dart';
 
 /// Represents an HTTP request to be processed by a Shelf application.
 class Request extends Message {
@@ -81,8 +82,7 @@
             headers: headers, context: context) {
     if (method.isEmpty) throw new ArgumentError('method cannot be empty.');
 
-    // TODO(kevmoo) use isAbsolute property on Uri once Issue 18053 is fixed
-    if (requestedUri.scheme.isEmpty) {
+    if (!requestedUri.isAbsolute) {
       throw new ArgumentError('requstedUri must be an absolute URI.');
     }
 
@@ -107,6 +107,27 @@
       throw new ArgumentError('scriptName and url cannot both be empty.');
     }
   }
+
+  /// Creates a new [Request] by copying existing values and applying specified
+  /// changes.
+  ///
+  /// New key-value pairs in [context] and [headers] will be added to the copied
+  /// [Request].
+  ///
+  /// If [context] or [headers] includes a key that already exists, the
+  /// key-value pair will replace the corresponding entry in the copied
+  /// [Request].
+  ///
+  /// All other context and header values from the [Request] will be included
+  /// in the copied [Request] unchanged.
+  Request change({Map<String, String> headers, Map<String, Object> context}) {
+    headers = updateMap(this.headers, headers);
+    context = updateMap(this.context, context);
+
+    return new Request(this.method, this.requestedUri,
+        protocolVersion: this.protocolVersion, headers: headers, url: this.url,
+        scriptName: this.scriptName, body: this.read(), context: context);
+  }
 }
 
 /// Computes `url` from the provided [Request] constructor arguments.
@@ -123,7 +144,6 @@
   }
 
   if (url != null && scriptName != null) {
-    // TODO(kevmoo) use isAbsolute property on Uri once Issue 18053 is fixed
     if (url.scheme.isNotEmpty) throw new ArgumentError('url must be relative.');
     return url;
   }
diff --git a/pkg/shelf/lib/src/response.dart b/pkg/shelf/lib/src/response.dart
index e59b0c5..c36c551 100644
--- a/pkg/shelf/lib/src/response.dart
+++ b/pkg/shelf/lib/src/response.dart
@@ -10,6 +10,7 @@
 import 'package:http_parser/http_parser.dart';
 
 import 'message.dart';
+import 'util.dart';
 
 /// The response returned by a [Handler].
 class Response extends Message {
@@ -53,7 +54,7 @@
   /// If [encoding] is passed, the "encoding" field of the Content-Type header
   /// in [headers] will be set appropriately. If there is no existing
   /// Content-Type header, it will be set to "application/octet-stream".
-  Response.ok(body, {Map<String, String> headers, Encoding encoding, 
+  Response.ok(body, {Map<String, String> headers, Encoding encoding,
     Map<String, Object> context})
       : this(200, body: body, headers: headers, encoding: encoding,
           context: context);
@@ -118,7 +119,7 @@
 
   /// Constructs a helper constructor for redirect responses.
   Response._redirect(int statusCode, location, body,
-      Map<String, String> headers, Encoding encoding, 
+      Map<String, String> headers, Encoding encoding,
       { Map<String, Object> context })
       : this(statusCode,
             body: body,
@@ -133,7 +134,7 @@
   /// information used to determine whether the requested resource has changed
   /// since the last request. It indicates that the resource has not changed and
   /// the old value should be used.
-  Response.notModified({Map<String, String> headers, 
+  Response.notModified({Map<String, String> headers,
     Map<String, Object> context})
       : this(304, headers: _addHeader(
             headers, 'date', formatHttpDate(new DateTime.now())),
@@ -169,7 +170,7 @@
   /// If [encoding] is passed, the "encoding" field of the Content-Type header
   /// in [headers] will be set appropriately. If there is no existing
   /// Content-Type header, it will be set to "application/octet-stream".
-  Response.notFound(body, {Map<String, String> headers, Encoding encoding, 
+  Response.notFound(body, {Map<String, String> headers, Encoding encoding,
     Map<String, Object> context})
       : this(404, body: body, headers: headers,
           context: context);
@@ -215,6 +216,26 @@
       throw new ArgumentError("Invalid status code: $statusCode.");
     }
   }
+
+  /// Creates a new [Response] by copying existing values and applying specified
+  /// changes.
+  ///
+  /// New key-value pairs in [context] and [headers] will be added to the copied
+  /// [Response].
+  ///
+  /// If [context] or [headers] includes a key that already exists, the
+  /// key-value pair will replace the corresponding entry in the copied
+  /// [Response].
+  ///
+  /// All other context and header values from the [Response] will be included
+  /// in the copied [Response] unchanged.
+  Response change({Map<String, String> headers, Map<String, Object> context}) {
+    headers = updateMap(this.headers, headers);
+    context = updateMap(this.context, context);
+
+    return new Response(this.statusCode, body: this.read(), headers: headers,
+        context: context);
+  }
 }
 
 /// Converts [body] to a byte stream.
diff --git a/pkg/shelf/lib/src/shelf_unmodifiable_map.dart b/pkg/shelf/lib/src/shelf_unmodifiable_map.dart
new file mode 100644
index 0000000..34775f0
--- /dev/null
+++ b/pkg/shelf/lib/src/shelf_unmodifiable_map.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.shelf_unmodifiable_map;
+
+import 'dart:collection';
+
+// TODO(kevmoo): use UnmodifiableMapView from SDK once 1.4 ships
+import 'package:collection/wrappers.dart' as pc;
+
+/// A simple wrapper over [pc.UnmodifiableMapView] which avoids re-wrapping
+/// itself.
+class ShelfUnmodifiableMap<V> extends pc.UnmodifiableMapView<String, V> {
+  /// If [source] is a [ShelfUnmodifiableMap] with matching [ignoreKeyCase],
+  /// then [source] is returned.
+  ///
+  /// If [source] is `null` it is treated like an empty map.
+  ///
+  /// If [ignoreKeyCase] is `true`, the keys will have case-insensitive access.
+  ///
+  /// [source] is copied to a new [Map] to ensure changes to the paramater value
+  /// after constructions are not reflected.
+  factory ShelfUnmodifiableMap(Map<String, V> source,
+      {bool ignoreKeyCase: false}) {
+    if (source is ShelfUnmodifiableMap<V>) {
+      return source;
+    }
+
+    if (source == null || source.isEmpty) {
+      return const _EmptyShelfUnmodifiableMap();
+    }
+
+    if (ignoreKeyCase) {
+      // TODO(kevmoo) generalize this model with a 'canonical map' to align with
+      // similiar implementation in http pkg [BaseRequest].
+      var map = new LinkedHashMap<String, V>(
+          equals: (key1, key2) => key1.toLowerCase() == key2.toLowerCase(),
+          hashCode: (key) => key.toLowerCase().hashCode);
+
+      map.addAll(source);
+
+      source = map;
+    } else {
+      source = new Map<String, V>.from(source);
+    }
+
+    return new ShelfUnmodifiableMap<V>._(source);
+  }
+
+  ShelfUnmodifiableMap._(Map<String, V> source) : super(source);
+}
+
+/// An const empty implementation of [ShelfUnmodifiableMap].
+class _EmptyShelfUnmodifiableMap<V> extends pc.DelegatingMap<String, V>
+    implements ShelfUnmodifiableMap<V>  {
+  const _EmptyShelfUnmodifiableMap() : super(const {});
+}
diff --git a/pkg/shelf/lib/src/util.dart b/pkg/shelf/lib/src/util.dart
index 43f7238..bb4847c 100644
--- a/pkg/shelf/lib/src/util.dart
+++ b/pkg/shelf/lib/src/util.dart
@@ -23,3 +23,17 @@
     return callback();
   }
 }
+
+/// Returns a [Map] with the values from [original] and the values from
+/// [updates].
+///
+/// For keys that are the same between [original] and [updates], the value in
+/// [updates] is used.
+///
+/// If [updates] is `null` or empty, [original] is returned unchanged.
+Map updateMap(Map original, Map updates) {
+  if (updates == null || updates.isEmpty) return original;
+
+  return new Map.from(original)
+      ..addAll(updates);
+}
diff --git a/pkg/shelf/pubspec.yaml b/pkg/shelf/pubspec.yaml
index ee83ade..bd09077 100644
--- a/pkg/shelf/pubspec.yaml
+++ b/pkg/shelf/pubspec.yaml
@@ -12,6 +12,6 @@
   path: '>=1.0.0 <2.0.0'
   stack_trace: '>=0.9.2 <0.10.0'
 dev_dependencies:
-  http: '>=0.9.2 <0.11.0'
+  http: '>=0.9.2 <0.12.0'
   scheduled_test: '>=0.10.0 <0.12.0'
   unittest: '>=0.10.0 <0.11.0'
diff --git a/pkg/shelf/test/message_change_test.dart b/pkg/shelf/test/message_change_test.dart
new file mode 100644
index 0000000..f77edd1
--- /dev/null
+++ b/pkg/shelf/test/message_change_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.message_change_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:shelf/shelf.dart';
+import 'package:shelf/src/message.dart';
+
+import 'test_util.dart';
+
+void main() {
+  group('Request', () {
+    _testChange(({headers, context}) {
+      return new Request('GET', LOCALHOST_URI, headers: headers,
+          context: context);
+    });
+  });
+
+  group('Response', () {
+    _testChange(({headers, context}) {
+      return new Response.ok(null, headers: headers,
+          context: context);
+    });
+  });
+}
+
+/// Shared test method used by [Request] and [Response] tests to validate
+/// the behavior of `change` with different `headers` and `context` values.
+void _testChange(Message factory({Map<String, String> headers,
+  Map<String, Object> context})) {
+  test('with empty headers returns indentical instance', () {
+    var request = factory(headers: {'header1': 'header value 1'});
+    var copy = request.change(headers: {});
+
+    expect(copy.headers, same(request.headers));
+  });
+
+  test('with empty context returns identical instance', () {
+    var request = factory(context: {'context1': 'context value 1'});
+    var copy = request.change(context: {});
+
+    expect(copy.context, same(request.context));
+  });
+
+  test('new header values are added', () {
+    var request = factory(headers: {'test':'test value'});
+    var copy = request.change(headers: {'test2': 'test2 value'});
+
+    expect(copy.headers, {'test':'test value', 'test2':'test2 value'});
+  });
+
+  test('existing header values are overwritten', () {
+    var request = factory(headers: {'test':'test value'});
+    var copy = request.change(headers: {'test': 'new test value'});
+
+    expect(copy.headers, {'test':'new test value'});
+  });
+
+  test('new context values are added', () {
+    var request = factory(context: {'test':'test value'});
+    var copy = request.change(context: {'test2': 'test2 value'});
+
+    expect(copy.context, {'test':'test value', 'test2':'test2 value'});
+  });
+
+  test('existing context values are overwritten', () {
+    var request = factory(context: {'test':'test value'});
+    var copy = request.change(context: {'test': 'new test value'});
+
+    expect(copy.context, {'test':'new test value'});
+  });
+}
diff --git a/pkg/shelf/test/message_test.dart b/pkg/shelf/test/message_test.dart
index 1db286ba..d393388 100644
--- a/pkg/shelf/test/message_test.dart
+++ b/pkg/shelf/test/message_test.dart
@@ -10,10 +10,16 @@
 import 'package:shelf/src/message.dart';
 import 'package:unittest/unittest.dart';
 
+import 'test_util.dart';
+
 class _TestMessage extends Message {
   _TestMessage(Map<String, String> headers, Map<String, Object> context,
         Stream<List<int>> body)
       : super(body, headers: headers, context: context);
+
+  Message change({Map<String, String> headers, Map<String, Object> context}) {
+    throw new UnimplementedError();
+  }
 }
 
 Message _createMessage({Map<String, String> headers,
@@ -76,10 +82,10 @@
       var request = _createMessage(body: controller.stream);
       expect(request.readAsString(), completion(equals("hello, world")));
 
-      controller.add([104, 101, 108, 108, 111, 44]);
+      controller.add(HELLO_BYTES);
       return new Future(() {
         controller
-          ..add([32, 119, 111, 114, 108, 100])
+          ..add(WORLD_BYTES)
           ..close();
       });
     });
@@ -114,14 +120,14 @@
       var controller = new StreamController();
       var request = _createMessage(body: controller.stream);
       expect(request.read().toList(), completion(equals([
-        [104, 101, 108, 108, 111, 44],
-        [32, 119, 111, 114, 108, 100]
+        HELLO_BYTES,
+        WORLD_BYTES
       ])));
 
-      controller.add([104, 101, 108, 108, 111, 44]);
+      controller.add(HELLO_BYTES);
       return new Future(() {
         controller
-          ..add([32, 119, 111, 114, 108, 100])
+          ..add(WORLD_BYTES)
           ..close();
       });
     });
diff --git a/pkg/shelf/test/request_test.dart b/pkg/shelf/test/request_test.dart
index 72a87a6..c48a4f7 100644
--- a/pkg/shelf/test/request_test.dart
+++ b/pkg/shelf/test/request_test.dart
@@ -136,44 +136,35 @@
     });
   });
 
-  group("readAsString", () {
-    test("supports a null body", () {
-      var request = _request();
-      expect(request.readAsString(), completion(equals("")));
-    });
-
-    test("supports a Stream<List<int>> body", () {
+  group('change', () {
+    test('with no arguments returns instance with equal values', () {
       var controller = new StreamController();
-      var request = _request({}, controller.stream);
-      expect(request.readAsString(), completion(equals("hello, world")));
 
-      controller.add([104, 101, 108, 108, 111, 44]);
+      var uri = Uri.parse('https://test.example.com/static/file.html');
+
+      var request = new Request('GET', uri,
+          protocolVersion: '2.0',
+          headers: {'header1': 'header value 1'},
+          url: Uri.parse('/file.html'),
+          scriptName: '/static',
+          body: controller.stream,
+          context: {'context1': 'context value 1'});
+
+      var copy = request.change();
+
+      expect(copy.method, request.method);
+      expect(copy.requestedUri, request.requestedUri);
+      expect(copy.protocolVersion, request.protocolVersion);
+      expect(copy.headers, same(request.headers));
+      expect(copy.url, request.url);
+      expect(copy.scriptName, request.scriptName);
+      expect(copy.context, same(request.context));
+      expect(copy.readAsString(), completion('hello, world'));
+
+      controller.add(HELLO_BYTES);
       return new Future(() {
         controller
-          ..add([32, 119, 111, 114, 108, 100])
-          ..close();
-      });
-    });
-  });
-
-  group("read", () {
-    test("supports a null body", () {
-      var request = _request();
-      expect(request.read().toList(), completion(isEmpty));
-    });
-
-    test("supports a Stream<List<int>> body", () {
-      var controller = new StreamController();
-      var request = _request({}, controller.stream);
-      expect(request.read().toList(), completion(equals([
-        [104, 101, 108, 108, 111, 44],
-        [32, 119, 111, 114, 108, 100]
-      ])));
-
-      controller.add([104, 101, 108, 108, 111, 44]);
-      return new Future(() {
-        controller
-          ..add([32, 119, 111, 114, 108, 100])
+          ..add(WORLD_BYTES)
           ..close();
       });
     });
diff --git a/pkg/shelf/test/response_test.dart b/pkg/shelf/test/response_test.dart
index 9ee47c5..86652c78 100644
--- a/pkg/shelf/test/response_test.dart
+++ b/pkg/shelf/test/response_test.dart
@@ -7,62 +7,23 @@
 import 'dart:async';
 import 'dart:convert';
 
-import 'package:shelf/shelf.dart';
+import 'package:shelf/shelf.dart' hide Request;
 import 'package:unittest/unittest.dart';
 
+import 'test_util.dart';
+
 void main() {
-  group("readAsString", () {
-    test("supports a null body", () {
-      var response = new Response(200);
-      expect(response.readAsString(), completion(equals("")));
-    });
-
-    test("supports a String body", () {
+  group("supports a String body", () {
+    test("readAsString", () {
       var response = new Response.ok("hello, world");
       expect(response.readAsString(), completion(equals("hello, world")));
     });
 
-    test("supports a Stream<List<int>> body", () {
-      var controller = new StreamController();
-      var response = new Response.ok(controller.stream);
-      expect(response.readAsString(), completion(equals("hello, world")));
+    test("read", () {
+      var helloWorldBytes = new List.from(HELLO_BYTES)..addAll(WORLD_BYTES);
 
-      controller.add([104, 101, 108, 108, 111, 44]);
-      return new Future(() {
-        controller
-          ..add([32, 119, 111, 114, 108, 100])
-          ..close();
-      });
-    });
-  });
-
-  group("read", () {
-    test("supports a null body", () {
-      var response = new Response(200);
-      expect(response.read().toList(), completion(isEmpty));
-    });
-
-    test("supports a String body", () {
       var response = new Response.ok("hello, world");
-      expect(response.read().toList(), completion(equals([[
-        104, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100
-      ]])));
-    });
-
-    test("supports a Stream<List<int>> body", () {
-      var controller = new StreamController();
-      var response = new Response.ok(controller.stream);
-      expect(response.read().toList(), completion(equals([
-        [104, 101, 108, 108, 111, 44],
-        [32, 119, 111, 114, 108, 100]
-      ])));
-
-      controller.add([104, 101, 108, 108, 111, 44]);
-      return new Future(() {
-        controller
-          ..add([32, 119, 111, 114, 108, 100])
-          ..close();
-      });
+      expect(response.read().toList(), completion(equals([helloWorldBytes])));
     });
   });
 
@@ -157,4 +118,29 @@
       }).lastModified, equals(DateTime.parse("1994-11-06 08:49:37z")));
     });
   });
+
+  group('change', () {
+    test('with no arguments returns instance with equal values', () {
+      var controller = new StreamController();
+
+      var request = new Response(345, body: 'hèllo, world', encoding: LATIN1,
+          headers: {'header1': 'header value 1'},
+          context: {'context1': 'context value 1'});
+
+      var copy = request.change();
+
+      expect(copy.statusCode, request.statusCode);
+      expect(copy.readAsString(), completion('hèllo, world'));
+      expect(copy.headers, same(request.headers));
+      expect(copy.encoding, request.encoding);
+      expect(copy.context, same(request.context));
+
+      controller.add(HELLO_BYTES);
+      return new Future(() {
+        controller
+          ..add(WORLD_BYTES)
+          ..close();
+      });
+    });
+  });
 }
diff --git a/pkg/shelf/test/shelf_io_test.dart b/pkg/shelf/test/shelf_io_test.dart
index 67cc708..bdece66 100644
--- a/pkg/shelf/test/shelf_io_test.dart
+++ b/pkg/shelf/test/shelf_io_test.dart
@@ -75,7 +75,7 @@
   });
 
   test('Request is populated correctly', () {
-    var path = '/foo/bar?qs=value#anchor';
+    var path = '/foo/bar?qs=value';
 
     _scheduleServer((request) {
       expect(request.contentLength, 0);
diff --git a/pkg/shelf/test/test_util.dart b/pkg/shelf/test/test_util.dart
index 10afe99..281989b 100644
--- a/pkg/shelf/test/test_util.dart
+++ b/pkg/shelf/test/test_util.dart
@@ -9,6 +9,12 @@
 import 'package:shelf/shelf.dart';
 import 'package:shelf/src/util.dart';
 
+// "hello,"
+const HELLO_BYTES = const [104, 101, 108, 108, 111, 44];
+
+// " world"
+const WORLD_BYTES = const [32, 119, 111, 114, 108, 100];
+
 /// A simple, synchronous handler for [Request].
 ///
 /// By default, replies with a status code 200, empty headers, and
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index 435eee5..1d728ca 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -1,5 +1,5 @@
 name: smoke
-version: 0.1.0-pre.3
+version: 0.1.0-pre.4
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: "https://api.dartlang.org/apidocs/channels/be/#smoke"
 description: >
@@ -9,6 +9,7 @@
 dependencies:
   barback: ">=0.9.0 <0.14.0"
   logging: ">=0.9.0 <0.10.0"
+  analyzer: ">=0.13.0 <0.14.0"
 # TODO(sigmund): once we have some easier way to do global app-level
 # transformers, we might want to remove this transformer here and only apply it
 # in apps that need it.
@@ -18,5 +19,6 @@
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
   path: ">=1.0.0 <2.0.0"
+  code_transformers: ">=0.1.3 <0.2.0"
 environment:
   sdk: ">=1.3.0-dev.7.9 <2.0.0"
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index 709f97d..c2de7d0 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -133,7 +133,8 @@
 }
 
 
-SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd) {
+SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd,
+                                                      bool is_listening) {
   ASSERT(fd >= 0);
   HashMap::Entry* entry = socket_map_.Lookup(
       GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd), true);
@@ -142,7 +143,11 @@
   if (sd == NULL) {
     // If there is no data in the hash map for this file descriptor a
     // new SocketData for the file descriptor is inserted.
-    sd = new SocketData(fd);
+    if (is_listening) {
+      sd = new ListeningSocketData(fd);
+    } else {
+      sd = new SocketData(fd);
+    }
     entry->value = sd;
   }
   ASSERT(fd == sd->fd());
@@ -192,36 +197,41 @@
     } else if (msg[i].id == kShutdownId) {
       shutdown_ = true;
     } else {
-      SocketData* sd = GetSocketData(msg[i].id);
+      SocketData* sd = GetSocketData(
+          msg[i].id, (msg[i].data & (1 << kListeningSocket)) != 0);
       if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kShutdownReadCommand));
+        ASSERT(!sd->IsListeningSocket());
         // Close the socket for reading.
         VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_RD));
       } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
+        ASSERT(!sd->IsListeningSocket());
         // Close the socket for writing.
         VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_WR));
       } else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kCloseCommand));
         // Close the socket and free system resources and move on to
         // next message.
-        RemoveFromEpollInstance(epoll_fd_, sd);
-        intptr_t fd = sd->fd();
-        sd->Close();
-        socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
-        delete sd;
+        if (sd->RemovePort(msg[i].dart_port)) {
+          RemoveFromEpollInstance(epoll_fd_, sd);
+          intptr_t fd = sd->fd();
+          sd->Close();
+          socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
+          delete sd;
+        }
         DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
       } else if ((msg[i].data & (1 << kReturnTokenCommand)) != 0) {
         int count = msg[i].data & ((1 << kReturnTokenCommand) - 1);
-        for (int i = 0; i < count; i++) {
-          if (sd->ReturnToken()) {
-            AddToEpollInstance(epoll_fd_, sd);
-          }
+        if (sd->ReturnToken(msg[i].dart_port, count)) {
+          AddToEpollInstance(epoll_fd_, sd);
         }
       } else {
         // Setup events to wait for.
-        sd->SetPortAndMask(msg[i].dart_port, msg[i].data);
-        AddToEpollInstance(epoll_fd_, sd);
+        if (sd->AddPort(msg[i].dart_port)) {
+          sd->SetMask(msg[i].data);
+          AddToEpollInstance(epoll_fd_, sd);
+        }
       }
     }
   }
@@ -282,11 +292,11 @@
       SocketData* sd = reinterpret_cast<SocketData*>(events[i].data.ptr);
       intptr_t event_mask = GetPollEvents(events[i].events, sd);
       if (event_mask != 0) {
+        Dart_Port port = sd->port();
         if (sd->TakeToken()) {
           // Took last token, remove from epoll.
           RemoveFromEpollInstance(epoll_fd_, sd);
         }
-        Dart_Port port = sd->port();
         ASSERT(port != 0);
         DartUtils::PostInt32(port, event_mask);
       }
diff --git a/runtime/bin/eventhandler_linux.h b/runtime/bin/eventhandler_linux.h
index f6f3f9a..1a8d968 100644
--- a/runtime/bin/eventhandler_linux.h
+++ b/runtime/bin/eventhandler_linux.h
@@ -28,13 +28,75 @@
   int64_t data;
 };
 
+template<typename T>
+class CircularLinkedList {
+ public:
+  CircularLinkedList() : head_(NULL) {}
 
+  // Returns true if the list was empty.
+  bool Add(T t) {
+    Entry* e = new Entry(t);
+    if (head_ == NULL) {
+      // Empty list, make e head, and point to itself.
+      e->next_ = e;
+      e->prev_ = e;
+      head_ = e;
+      return true;
+    } else {
+      // Insert e as the last element in the list.
+      e->prev_ = head_->prev_;
+      e->next_ = head_;
+      e->prev_->next_ = e;
+      head_->prev_ = e;
+      return false;
+    }
+  }
+
+  void RemoveHead() {
+    Entry* e = head_;
+    if (e->next_ == e) {
+      head_ = NULL;
+    } else {
+      e->prev_->next_ = e->next_;
+      e->next_->prev_ = e->prev_;
+      head_ = e->next_;
+    }
+    delete e;
+  }
+
+  T head() const { return head_->t; }
+
+  bool HasHead() {
+    return head_ != NULL;
+  }
+
+  void Rotate() {
+    head_ = head_->next_;
+  }
+
+ private:
+  struct Entry {
+    explicit Entry(const T& t) : t(t) {}
+    const T t;
+    Entry* next_;
+    Entry* prev_;
+  };
+
+  Entry* head_;
+};
+
+
+class ListeningSocketData;
 class SocketData {
  public:
-  explicit SocketData(intptr_t fd) : fd_(fd), port_(0), mask_(0), tokens_(16) {
+  explicit SocketData(intptr_t fd)
+      : fd_(fd), port_(0), mask_(0), tokens_(16) {
     ASSERT(fd_ != -1);
   }
 
+  virtual ~SocketData() {
+  }
+
   intptr_t GetPollEvents();
 
   void Close() {
@@ -44,32 +106,46 @@
     fd_ = -1;
   }
 
-  void SetPortAndMask(Dart_Port port, intptr_t mask) {
+  void SetMask(intptr_t mask) {
     ASSERT(fd_ != -1);
-    port_ = port;
     mask_ = mask;
   }
 
   intptr_t fd() { return fd_; }
-  Dart_Port port() { return port_; }
+  virtual Dart_Port port() { return port_; }
 
-  bool IsListeningSocket() { return (mask_ & (1 << kListeningSocket)) != 0; }
+  virtual bool IsListeningSocket() const { return false; }
+
+  virtual bool AddPort(Dart_Port port) {
+    ASSERT(port_ == 0);
+    port_ = port;
+    return true;
+  }
+
+  virtual bool RemovePort(Dart_Port port) {
+    ASSERT(port_ == 0 || port_ == port);
+    return true;
+  }
 
   // Returns true if the last token was taken.
-  bool TakeToken() {
+  virtual bool TakeToken() {
     ASSERT(tokens_ > 0);
     tokens_--;
     return tokens_ == 0;
   }
 
   // Returns true if the tokens was 0 before adding.
-  bool ReturnToken() {
+  virtual bool ReturnToken(Dart_Port port, int count) {
+    ASSERT(port_ == port);
     ASSERT(tokens_ >= 0);
-    tokens_++;
-    return tokens_ == 1;
+    bool was_empty = tokens_ == 0;
+    tokens_ += count;
+    return was_empty;
   }
 
- private:
+  bool HasTokens() const { return tokens_ > 0; }
+
+ protected:
   intptr_t fd_;
   Dart_Port port_;
   intptr_t mask_;
@@ -77,6 +153,108 @@
 };
 
 
+class ListeningSocketData : public SocketData {
+ private:
+  static const int kTokenCount = 4;
+
+  static bool SamePortValue(void* key1, void* key2) {
+    return reinterpret_cast<Dart_Port>(key1) ==
+        reinterpret_cast<Dart_Port>(key2);
+  }
+
+  static uint32_t GetHashmapHashFromPort(Dart_Port port) {
+    return static_cast<uint32_t>(port & 0xFFFFFFFF);
+  }
+
+  static void* GetHashmapKeyFromPort(Dart_Port port) {
+    return reinterpret_cast<void*>(port);
+  }
+
+ public:
+  explicit ListeningSocketData(intptr_t fd)
+      : SocketData(fd),
+        tokens_map_(&SamePortValue, 4) {}
+
+  bool IsListeningSocket() const { return true; }
+
+  bool AddPort(Dart_Port port) {
+    HashMap::Entry* entry = tokens_map_.Lookup(
+        GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), true);
+    entry->value = reinterpret_cast<void*>(kTokenCount);
+    return live_ports_.Add(port);
+  }
+
+  virtual bool RemovePort(Dart_Port port) {
+    HashMap::Entry* entry = tokens_map_.Lookup(
+        GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false);
+    ASSERT(entry != NULL);
+    intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
+    if (tokens == 0) {
+      while (idle_ports_.head() != port) {
+        idle_ports_.Rotate();
+      }
+      idle_ports_.RemoveHead();
+    } else {
+      while (live_ports_.head() != port) {
+        live_ports_.Rotate();
+      }
+      live_ports_.RemoveHead();
+    }
+    tokens_map_.Remove(
+        GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port));
+    return !live_ports_.HasHead();
+  }
+
+  bool TakeToken() {
+    ASSERT(live_ports_.HasHead());
+    Dart_Port port = live_ports_.head();
+    HashMap::Entry* entry = tokens_map_.Lookup(
+        GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false);
+    ASSERT(entry != NULL);
+    intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
+    tokens--;
+    entry->value = reinterpret_cast<void*>(tokens);
+    if (tokens == 0) {
+      live_ports_.RemoveHead();
+      idle_ports_.Add(port);
+      if (!live_ports_.HasHead()) {
+        return true;
+      }
+    } else {
+      live_ports_.Rotate();
+    }
+    return false;
+  }
+
+  Dart_Port port() { return live_ports_.head(); }
+
+  bool ReturnToken(Dart_Port port, int count) {
+    HashMap::Entry* entry = tokens_map_.Lookup(
+        GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false);
+    ASSERT(entry != NULL);
+    intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
+    tokens += count;
+    entry->value = reinterpret_cast<void*>(tokens);
+    if (tokens == count) {
+      // Return to live_ports_.
+      while (idle_ports_.head() != port) {
+        idle_ports_.Rotate();
+      }
+      idle_ports_.RemoveHead();
+      bool was_empty = !live_ports_.HasHead();
+      live_ports_.Add(port);
+      return was_empty;
+    }
+    return false;
+  }
+
+ private:
+  CircularLinkedList<Dart_Port> live_ports_;
+  CircularLinkedList<Dart_Port> idle_ports_;
+  HashMap tokens_map_;
+};
+
+
 class EventHandlerImplementation {
  public:
   EventHandlerImplementation();
@@ -84,7 +262,7 @@
 
   // Gets the socket data structure for a given file
   // descriptor. Creates a new one if one is not found.
-  SocketData* GetSocketData(intptr_t fd);
+  SocketData* GetSocketData(intptr_t fd, bool is_listening);
   void SendData(intptr_t id, Dart_Port dart_port, int64_t data);
   void Start(EventHandler* handler);
   void Shutdown();
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index d32fb1e..fbc5623 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -73,6 +73,11 @@
 }
 
 
+OverlappedBuffer* OverlappedBuffer::AllocateConnectBuffer() {
+  return AllocateBuffer(0, kConnect);
+}
+
+
 void OverlappedBuffer::DisposeBuffer(OverlappedBuffer* buffer) {
   delete buffer;
 }
@@ -327,12 +332,30 @@
 }
 
 
+static void HandleClosed(Handle* handle) {
+  if (!handle->IsClosing()) {
+    int event_mask = 1 << kCloseEvent;
+    DartUtils::PostInt32(handle->port(), event_mask);
+  }
+}
+
+
+static void HandleError(Handle* handle) {
+  handle->set_last_error(WSAGetLastError());
+  handle->MarkError();
+  if (!handle->IsClosing()) {
+    int event_mask = 1 << kErrorEvent;
+    DartUtils::PostInt32(handle->port(), event_mask);
+  }
+}
+
+
 void Handle::HandleIssueError() {
   DWORD error = GetLastError();
   if (error == ERROR_BROKEN_PIPE) {
-    event_handler_->HandleClosed(this);
+    HandleClosed(this);
   } else {
-    event_handler_->HandleError(this);
+    HandleError(this);
   }
   SetLastError(error);
 }
@@ -395,9 +418,9 @@
 void SocketHandle::HandleIssueError() {
   int error = WSAGetLastError();
   if (error == WSAECONNRESET) {
-    event_handler_->HandleClosed(this);
+    HandleClosed(this);
   } else {
-    event_handler_->HandleError(this);
+    HandleError(this);
   }
   WSASetLastError(error);
 }
@@ -474,6 +497,7 @@
     if (rc == NO_ERROR) {
       // Insert the accepted socket into the list.
       ClientSocket* client_socket = new ClientSocket(buffer->client(), 0);
+      client_socket->mark_connected();
       client_socket->CreateCompletionPort(completion_port);
       if (accepted_head_ == NULL) {
         accepted_head_ = client_socket;
@@ -496,6 +520,17 @@
 }
 
 
+static void DeleteIfClosed(Handle* handle) {
+  if (handle->IsClosed()) {
+    Dart_Port port = handle->port();
+    delete handle;
+    if (port != ILLEGAL_PORT) {
+      DartUtils::PostInt32(port, 1 << kDestroyedEvent);
+    }
+  }
+}
+
+
 void ListenSocket::DoClose() {
   closesocket(socket());
   handle_ = INVALID_HANDLE_VALUE;
@@ -504,6 +539,7 @@
     ClientSocket *client = Accept();
     if (client != NULL) {
       client->Close();
+      DeleteIfClosed(client);
     } else {
       break;
     }
@@ -527,7 +563,7 @@
   if (!IsClosing()) {
     while (pending_accept_count() < 5) {
       if (!IssueAccept()) {
-        event_handler_->HandleError(this);
+        HandleError(this);
       }
     }
   }
@@ -811,14 +847,17 @@
 
 
 void ClientSocket::IssueDisconnect() {
-  Dart_Port p = port();
   OverlappedBuffer* buffer = OverlappedBuffer::AllocateDisconnectBuffer();
   BOOL ok = DisconnectEx_(
     socket(), buffer->GetCleanOverlapped(), TF_REUSE_SOCKET, 0);
-  if (!ok && WSAGetLastError() != WSA_IO_PENDING) {
+  // DisconnectEx works like other OverlappedIO APIs, where we can get either an
+  // immediate success or delayed operation by WSA_IO_PENDING being set.
+  if (ok || WSAGetLastError() != WSA_IO_PENDING) {
     DisconnectComplete(buffer);
   }
+  Dart_Port p = port();
   if (p != ILLEGAL_PORT) DartUtils::PostInt32(p, 1 << kDestroyedEvent);
+  port_ = ILLEGAL_PORT;
 }
 
 
@@ -828,8 +867,26 @@
   if (data_ready_ != NULL) {
     OverlappedBuffer::DisposeBuffer(data_ready_);
   }
-  // When disconnect is complete get rid of the object.
-  delete this;
+  closed_ = true;
+}
+
+
+void ClientSocket::ConnectComplete(OverlappedBuffer* buffer) {
+  OverlappedBuffer::DisposeBuffer(buffer);
+  // Update socket to support full socket API, after ConnectEx completed.
+  setsockopt(socket(), SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0);
+  connected_ = true;
+  Dart_Port p = port();
+  if (p != ILLEGAL_PORT) {
+    // If the port is set, we already listen for this socket in Dart.
+    // Handle the cases here.
+    if (!IsClosedRead()) {
+      IssueRead();
+    }
+    if (!IsClosedWrite()) {
+      DartUtils::PostInt32(p, 1 << kOutEvent);
+    }
+  }
 }
 
 
@@ -845,7 +902,7 @@
 
 
 bool ClientSocket::IsClosed() {
-  return false;
+  return closed_;
 }
 
 
@@ -928,16 +985,8 @@
 }
 
 
-static void DeleteIfClosed(Handle* handle) {
-  if (handle->IsClosed()) {
-    Dart_Port port = handle->port();
-    delete handle;
-    DartUtils::PostInt32(port, 1 << kDestroyedEvent);
-  }
-}
-
-
 void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) {
+  ASSERT(this != NULL);
   if (msg->id == kTimeoutId) {
     // Change of timeout request. Just set the new timeout and port as the
     // completion thread will use the new timeout value for its next wait.
@@ -974,10 +1023,6 @@
           }
         }
       }
-
-      if ((msg->data & (1 << kCloseCommand)) != 0) {
-        listen_socket->Close();
-      }
     } else {
       handle->EnsureInitialized(this);
 
@@ -990,9 +1035,12 @@
 
       // Issue a read.
       if ((msg->data & (1 << kInEvent)) != 0) {
-        handle->SetPortAndMask(msg->dart_port, msg->data);
         if (handle->is_datagram_socket()) {
           handle->IssueRecvFrom();
+        } else if (handle->is_client_socket()) {
+          if (reinterpret_cast<ClientSocket*>(handle)->is_connected()) {
+            handle->IssueRead();
+          }
         } else {
           handle->IssueRead();
         }
@@ -1002,10 +1050,14 @@
       // are no pending writes, meaning any writes are already complete,
       // post an out event immediately.
       if ((msg->data & (1 << kOutEvent)) != 0) {
-        handle->SetPortAndMask(msg->dart_port, msg->data);
         if (!handle->HasPendingWrite()) {
-          int event_mask = (1 << kOutEvent);
-          DartUtils::PostInt32(handle->port(), event_mask);
+          if (handle->is_client_socket()) {
+            if (reinterpret_cast<ClientSocket*>(handle)->is_connected()) {
+              DartUtils::PostInt32(handle->port(), 1 << kOutEvent);
+            }
+          } else {
+            DartUtils::PostInt32(handle->port(), 1 << kOutEvent);
+          }
         }
       }
 
@@ -1046,24 +1098,6 @@
 }
 
 
-void EventHandlerImplementation::HandleClosed(Handle* handle) {
-  if (!handle->IsClosing()) {
-    int event_mask = 1 << kCloseEvent;
-    DartUtils::PostInt32(handle->port(), event_mask);
-  }
-}
-
-
-void EventHandlerImplementation::HandleError(Handle* handle) {
-  handle->set_last_error(WSAGetLastError());
-  handle->MarkError();
-  if (!handle->IsClosing()) {
-    int event_mask = 1 << kErrorEvent;
-    DartUtils::PostInt32(handle->port(), event_mask);
-  }
-}
-
-
 void EventHandlerImplementation::HandleRead(Handle* handle,
                                             int bytes,
                                             OverlappedBuffer* buffer) {
@@ -1114,6 +1148,8 @@
   if (bytes >= 0) {
     if (!handle->IsError() && !handle->IsClosing()) {
       int event_mask = 1 << kOutEvent;
+      ASSERT(!handle->is_client_socket() ||
+             reinterpret_cast<ClientSocket*>(handle)->is_connected());
       if ((handle->mask() & event_mask) != 0) {
         DartUtils::PostInt32(handle->port(), event_mask);
       }
@@ -1131,8 +1167,23 @@
     int bytes,
     OverlappedBuffer* buffer) {
   client_socket->DisconnectComplete(buffer);
+  DeleteIfClosed(client_socket);
 }
 
+
+void EventHandlerImplementation::HandleConnect(
+    ClientSocket* client_socket,
+    int bytes,
+    OverlappedBuffer* buffer) {
+  if (bytes < 0) {
+    HandleError(client_socket);
+    OverlappedBuffer::DisposeBuffer(buffer);
+  } else {
+    client_socket->ConnectComplete(buffer);
+  }
+}
+
+
 void EventHandlerImplementation::HandleTimeout() {
   if (!timeout_queue_.HasTimeout()) return;
   DartUtils::PostNull(timeout_queue_.CurrentPort());
@@ -1171,6 +1222,11 @@
       HandleDisconnect(client_socket, bytes, buffer);
       break;
     }
+    case OverlappedBuffer::kConnect: {
+      ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(key);
+      HandleConnect(client_socket, bytes, buffer);
+      break;
+    }
     default:
       UNREACHABLE();
   }
@@ -1235,6 +1291,7 @@
                                         &key,
                                         &overlapped,
                                         static_cast<DWORD>(millis));
+
     if (!ok && overlapped == NULL) {
       if (GetLastError() == ERROR_ABANDONED_WAIT_0) {
         // The completion port should never be closed.
diff --git a/runtime/bin/eventhandler_win.h b/runtime/bin/eventhandler_win.h
index 90e505a..e1f96f7 100644
--- a/runtime/bin/eventhandler_win.h
+++ b/runtime/bin/eventhandler_win.h
@@ -41,7 +41,9 @@
 // socket for the client.
 class OverlappedBuffer {
  public:
-  enum Operation { kAccept, kRead, kRecvFrom, kWrite, kSendTo, kDisconnect };
+  enum Operation {
+    kAccept, kRead, kRecvFrom, kWrite, kSendTo, kDisconnect, kConnect
+  };
 
   static OverlappedBuffer* AllocateAcceptBuffer(int buffer_size);
   static OverlappedBuffer* AllocateReadBuffer(int buffer_size);
@@ -49,6 +51,7 @@
   static OverlappedBuffer* AllocateWriteBuffer(int buffer_size);
   static OverlappedBuffer* AllocateSendToBuffer(int buffer_size);
   static OverlappedBuffer* AllocateDisconnectBuffer();
+  static OverlappedBuffer* AllocateConnectBuffer();
   static void DisposeBuffer(OverlappedBuffer* buffer);
 
   // Find the IO buffer from the OVERLAPPED address.
@@ -221,7 +224,6 @@
 
   HANDLE handle() { return handle_; }
   Dart_Port port() { return port_; }
-  EventHandlerImplementation* event_handler() { return event_handler_; }
 
   void Lock();
   void Unlock();
@@ -415,14 +417,18 @@
  public:
   explicit ClientSocket(SOCKET s) : SocketHandle(s),
                                     DisconnectEx_(NULL),
-                                    next_(NULL) {
+                                    next_(NULL),
+                                    connected_(false),
+                                    closed_(false) {
     LoadDisconnectEx();
     type_ = kClientSocket;
   }
 
   ClientSocket(SOCKET s, Dart_Port port) : SocketHandle(s, port),
                                            DisconnectEx_(NULL),
-                                           next_(NULL) {
+                                           next_(NULL),
+                                           connected_(false),
+                                           closed_(false) {
     LoadDisconnectEx();
     type_ = kClientSocket;
   }
@@ -432,6 +438,7 @@
     ASSERT(!HasPendingRead());
     ASSERT(!HasPendingWrite());
     ASSERT(next_ == NULL);
+    ASSERT(closed_ == true);
   };
 
   void Shutdown(int how);
@@ -442,6 +449,8 @@
   void IssueDisconnect();
   void DisconnectComplete(OverlappedBuffer* buffer);
 
+  void ConnectComplete(OverlappedBuffer* buffer);
+
   virtual void EnsureInitialized(
     EventHandlerImplementation* event_handler);
   virtual void DoClose();
@@ -450,11 +459,18 @@
   ClientSocket* next() { return next_; }
   void set_next(ClientSocket* next) { next_ = next; }
 
+  void mark_connected() {
+    connected_ = true;
+  }
+  bool is_connected() const { return connected_; }
+
  private:
   bool LoadDisconnectEx();
 
   LPFN_DISCONNECTEX DisconnectEx_;
   ClientSocket* next_;
+  bool connected_;
+  bool closed_;
 };
 
 
@@ -495,14 +511,15 @@
   void HandleInterrupt(InterruptMessage* msg);
   void HandleTimeout();
   void HandleAccept(ListenSocket* listen_socket, OverlappedBuffer* buffer);
-  void HandleClosed(Handle* handle);
-  void HandleError(Handle* handle);
   void HandleRead(Handle* handle, int bytes, OverlappedBuffer* buffer);
   void HandleRecvFrom(Handle* handle, int bytes, OverlappedBuffer* buffer);
   void HandleWrite(Handle* handle, int bytes, OverlappedBuffer* buffer);
   void HandleDisconnect(ClientSocket* client_socket,
                         int bytes,
                         OverlappedBuffer* buffer);
+  void HandleConnect(ClientSocket* client_socket,
+                     int bytes,
+                     OverlappedBuffer* buffer);
   void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped);
 
   HANDLE completion_port() { return completion_port_; }
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index bd8d498..5f90f22 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -82,6 +82,7 @@
   V(Socket_SetOption, 4)                                                       \
   V(Socket_JoinMulticast, 4)                                                   \
   V(Socket_LeaveMulticast, 4)                                                  \
+  V(Socket_GetSocketId, 1)                                                     \
   V(Socket_SetSocketId, 2)                                                     \
   V(Stdin_ReadByte, 1)                                                         \
   V(Stdin_GetEchoMode, 0)                                                      \
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 1e7c2ad..c13aa98 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -636,14 +636,15 @@
 
 static Mutex* signal_mutex = new Mutex();
 static SignalInfo* signal_handlers = NULL;
-static const int kSignalsCount = 6;
+static const int kSignalsCount = 7;
 static const int kSignals[kSignalsCount] = {
   SIGHUP,
   SIGINT,
   SIGTERM,
   SIGUSR1,
   SIGUSR2,
-  SIGWINCH
+  SIGWINCH,
+  SIGQUIT  // Allow VMService to listen on SIGQUIT.
 };
 
 
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index 221541a..ef0927a 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -632,14 +632,15 @@
 
 static Mutex* signal_mutex = new Mutex();
 static SignalInfo* signal_handlers = NULL;
-static const int kSignalsCount = 6;
+static const int kSignalsCount = 7;
 static const int kSignals[kSignalsCount] = {
   SIGHUP,
   SIGINT,
   SIGTERM,
   SIGUSR1,
   SIGUSR2,
-  SIGWINCH
+  SIGWINCH,
+  SIGQUIT  // Allow VMService to listen on SIGQUIT.
 };
 
 
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 6e8ed46..e84b115 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -678,14 +678,15 @@
 
 static Mutex* signal_mutex = new Mutex();
 static SignalInfo* signal_handlers = NULL;
-static const int kSignalsCount = 6;
+static const int kSignalsCount = 7;
 static const int kSignals[kSignalsCount] = {
   SIGHUP,
   SIGINT,
   SIGTERM,
   SIGUSR1,
   SIGUSR2,
-  SIGWINCH
+  SIGWINCH,
+  SIGQUIT  // Allow VMService to listen on SIGQUIT.
 };
 
 
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 0f5f8ac..970bb65 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -139,6 +139,10 @@
       throw new SignalException(
           "Listening for signal $signal is not supported");
     }
+    return _watchSignalInternal(signal);
+  }
+
+  static Stream<ProcessSignal> _watchSignalInternal(ProcessSignal signal) {
     if (_signalControllers[signal._signalNumber] == null) {
       _signalControllers[signal._signalNumber] = new _SignalController(signal);
     }
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index cf3b37d..1b61951 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -349,6 +349,13 @@
 }
 
 
+void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) {
+  intptr_t id =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
+  Dart_SetReturnValue(args, Dart_NewInteger(id));
+}
+
+
 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) {
   intptr_t id =
       DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 59faecf..7445562 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -390,6 +390,9 @@
   static const int PROTOCOL_IPV4 = 1 << 0;
   static const int PROTOCOL_IPV6 = 1 << 1;
 
+  static const int NORMAL_TOKEN_BATCH_SIZE = 8;
+  static const int LISTENING_TOKEN_BATCH_SIZE = 2;
+
   // Socket close state
   bool isClosed = false;
   bool isClosing = false;
@@ -481,40 +484,53 @@
   static Future<_NativeSocket> connect(host, int port) {
     return new Future.value(host)
         .then((host) {
-          if (host is _InternetAddress) return host;
+          if (host is _InternetAddress) return [host];
           return lookup(host)
               .then((list) {
                 if (list.length == 0) {
                   throw createError(response, "Failed host lookup: '$host'");
                 }
-                return list[0];
+                return list;
               });
         })
-        .then((address) {
-          var socket = new _NativeSocket.normal();
-          socket.address = address;
-          var result = socket.nativeCreateConnect(
-              address._in_addr, port);
-          if (result is OSError) {
-            throw createError(result, "Connection failed", address, port);
-          } else {
-            socket.port;  // Query the local port, for error messages.
-            var completer = new Completer();
-            // Setup handlers for receiving the first write event which
-            // indicate that the socket is fully connected.
-            socket.setHandlers(
-                write: () {
-                  socket.setListening(read: false, write: false);
-                  completer.complete(socket);
-                },
-                error: (e) {
-                  socket.close();
-                  completer.completeError(e);
-                }
-            );
-            socket.setListening(read: false, write: true);
-            return completer.future;
+        .then((addresses) {
+          assert(addresses is List);
+          var completer = new Completer();
+          var it = addresses.iterator;
+          void run(error) {
+            if (!it.moveNext()) {
+              assert(error != null);
+              completer.completeError(error);
+              return;
+            }
+            var address = it.current;
+            var socket = new _NativeSocket.normal();
+            socket.address = address;
+            var result = socket.nativeCreateConnect(address._in_addr, port);
+            if (result is OSError) {
+              // Keep first error, if present.
+              run(error != null ? error :
+                  createError(result, "Connection failed", address, port));
+            } else {
+              socket.port;  // Query the local port, for error messages.
+              // Setup handlers for receiving the first write event which
+              // indicate that the socket is fully connected.
+              socket.setHandlers(
+                  write: () {
+                    socket.setListening(read: false, write: false);
+                    completer.complete(socket);
+                  },
+                  error: (e) {
+                    socket.close();
+                    // Keep first error, if present.
+                    run(error != null ? error : e);
+                  }
+              );
+              socket.setListening(read: false, write: true);
+            }
           }
+          run(null);
+          return completer.future;
         });
   }
 
@@ -699,7 +715,7 @@
     assert(available > 0);
     available--;
     tokens++;
-    returnTokens();
+    returnTokens(LISTENING_TOKEN_BATCH_SIZE);
     var socket = new _NativeSocket.normal();
     if (nativeAccept(socket) != true) return null;
     socket.localPort = localPort;
@@ -811,6 +827,7 @@
 
         var handler = eventHandlers[i];
         if (i == DESTROYED_EVENT) {
+          assert(isClosing);
           assert(!isClosed);
           isClosed = true;
           closeCompleter.complete();
@@ -832,14 +849,14 @@
     }
     if (!isListening) {
       tokens++;
-      returnTokens();
+      returnTokens(NORMAL_TOKEN_BATCH_SIZE);
     }
   }
 
-  void returnTokens() {
+  void returnTokens(int tokenBatchSize) {
     if (eventPort != null && !isClosing && !isClosed) {
-      if (tokens == 8) {
-        // Return in batches of 8.
+      // Return in batches.
+      if (tokens == tokenBatchSize) {
         assert(tokens < (1 << FIRST_COMMAND));
         sendToEventHandler((1 << RETURN_TOKEN_COMMAND) | tokens);
         tokens = 0;
@@ -860,7 +877,7 @@
     sendWriteEvents = write;
     if (read) issueReadEvent();
     if (write) issueWriteEvent();
-    if (eventPort == null) {
+    if (eventPort == null && !isClosing) {
       int flags = typeFlags & TYPE_TYPE_MASK;
       if (!isClosedRead) flags |= 1 << READ_EVENT;
       if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
@@ -923,6 +940,7 @@
   }
 
   void connectToEventHandler() {
+    assert(!isClosed);
     if (eventPort == null) {
       eventPort = new RawReceivePort(multiplex);
       _SocketsObservatory.add(this);
@@ -1053,6 +1071,7 @@
   nativeAccept(_NativeSocket socket) native "ServerSocket_Accept";
   int nativeGetPort() native "Socket_GetPort";
   List nativeGetRemotePeer() native "Socket_GetRemotePeer";
+  int nativeGetSocketId() native "Socket_GetSocketId";
   OSError nativeGetError() native "Socket_GetError";
   nativeGetOption(int option, int protocol) native "Socket_GetOption";
   bool nativeSetOption(int option, int protocol, value)
@@ -1070,6 +1089,7 @@
                        implements RawServerSocket {
   final _NativeSocket _socket;
   StreamController<RawSocket> _controller;
+  ReceivePort _referencePort;
 
   static Future<_RawServerSocket> bind(address,
                                        int port,
@@ -1110,7 +1130,12 @@
         _controller.addError(e);
         _controller.close();
       }),
-      destroyed: _controller.close);
+      destroyed: () {
+        _controller.close();
+        if (_referencePort != null) {
+          _referencePort.close();
+        }
+      });
     return _controller.stream.listen(
         onData,
         onError: onError,
@@ -1147,6 +1172,44 @@
       _resume();
     }
   }
+
+  RawServerSocketReference get reference {
+    if (_referencePort == null) {
+      _referencePort = new ReceivePort();
+      _referencePort.listen((sendPort) {
+        sendPort.send(
+          [_socket.nativeGetSocketId(),
+           _socket.address,
+           _socket.localPort]);
+      });
+    }
+    return new _RawServerSocketReference(_referencePort.sendPort);
+  }
+}
+
+
+class _RawServerSocketReference implements RawServerSocketReference {
+  final SendPort _sendPort;
+
+  _RawServerSocketReference(this._sendPort);
+
+  Future<RawServerSocket> create() {
+    var port = new ReceivePort();
+    _sendPort.send(port.sendPort);
+    return port.first.then((args) {
+      port.close();
+      var native = new _NativeSocket.listen();
+      native.nativeSetSocketId(args[0]);
+      native.address = args[1];
+      native.localPort = args[2];
+      return new _RawServerSocket(native);
+    });
+  }
+
+  int get hashCode => _sendPort.hashCode;
+
+  bool operator==(Object other)
+    => other is _RawServerSocketReference && _sendPort == other._sendPort;
 }
 
 
@@ -1307,6 +1370,18 @@
   }
 }
 
+
+class _ServerSocketReference implements ServerSocketReference {
+  final RawServerSocketReference _rawReference;
+
+  _ServerSocketReference(this._rawReference);
+
+  Future<ServerSocket> create() {
+    return _rawReference.create().then((raw) => new _ServerSocket(raw));
+  }
+}
+
+
 class _ServerSocket extends Stream<Socket>
                     implements ServerSocket {
   final _socket;
@@ -1337,6 +1412,10 @@
   InternetAddress get address => _socket.address;
 
   Future close() => _socket.close().then((_) => this);
+
+  ServerSocketReference get reference {
+    return new _ServerSocketReference(_socket.reference);
+  }
 }
 
 
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index debff6b..5ec7f1f 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -46,8 +46,11 @@
 }
 
 
+static Mutex* init_mutex = new Mutex();
+static bool socket_initialized = false;
+
 bool Socket::Initialize() {
-  static bool socket_initialized = false;
+  MutexLocker lock(init_mutex);
   if (socket_initialized) return true;
   int err;
   WSADATA winsock_data;
@@ -152,19 +155,73 @@
 
 
 intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
-  ASSERT(reinterpret_cast<Handle*>(fd)->is_socket());
-  SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
+  ASSERT(reinterpret_cast<Handle*>(fd)->is_client_socket());
+  ClientSocket* handle = reinterpret_cast<ClientSocket*>(fd);
   SOCKET s = handle->socket();
-  SocketAddress::SetAddrPort(&addr, port);
-  int status = connect(s, &addr.addr, SocketAddress::GetAddrLength(&addr));
-  if (status == SOCKET_ERROR) {
-    DWORD rc = WSAGetLastError();
-    ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd);
-    client_socket->Close();
+
+  RawAddr bind_addr;
+  memset(&bind_addr, 0, sizeof(bind_addr));
+  bind_addr.ss.ss_family = addr.ss.ss_family;
+  if (addr.ss.ss_family == AF_INET) {
+    bind_addr.in.sin_addr.s_addr = INADDR_ANY;
+  } else {
+    bind_addr.in6.sin6_addr = in6addr_any;
+  }
+  int status = bind(
+      s, &bind_addr.addr, SocketAddress::GetAddrLength(&bind_addr));
+  if (status != NO_ERROR) {
+    int rc = WSAGetLastError();
+    delete handle;
+    closesocket(s);
     SetLastError(rc);
     return -1;
   }
-  return fd;
+
+  SocketAddress::SetAddrPort(&addr, port);
+
+  LPFN_CONNECTEX connectEx = NULL;
+  GUID guid_connect_ex = WSAID_CONNECTEX;
+  DWORD bytes;
+  status = WSAIoctl(s,
+                    SIO_GET_EXTENSION_FUNCTION_POINTER,
+                    &guid_connect_ex,
+                    sizeof(guid_connect_ex),
+                    &connectEx,
+                    sizeof(connectEx),
+                    &bytes,
+                    NULL,
+                    NULL);
+  DWORD rc;
+  if (status != SOCKET_ERROR) {
+    handle->EnsureInitialized(EventHandler::delegate());
+
+    OverlappedBuffer* overlapped = OverlappedBuffer::AllocateConnectBuffer();
+
+    status = connectEx(s,
+                       &addr.addr,
+                       SocketAddress::GetAddrLength(&addr),
+                       NULL,
+                       0,
+                       NULL,
+                       overlapped->GetCleanOverlapped());
+
+
+    if (status == TRUE) {
+      handle->ConnectComplete(overlapped);
+      return fd;
+    } else if (WSAGetLastError() == ERROR_IO_PENDING) {
+      return fd;
+    }
+    rc = WSAGetLastError();
+    // Cleanup in case of error.
+    OverlappedBuffer::DisposeBuffer(overlapped);
+  } else {
+    rc = WSAGetLastError();
+  }
+  handle->Close();
+  delete handle;
+  SetLastError(rc);
+  return -1;
 }
 
 
@@ -219,15 +276,11 @@
 }
 
 
-static Mutex* getaddrinfo_mutex = new Mutex();
 AddressList<SocketAddress>* Socket::LookupAddress(const char* host,
                                                   int type,
                                                   OSError** os_error) {
   Initialize();
 
-  // getaddrinfo is not thread-safe on Windows. Use a mutex to get around it.
-  MutexLocker locker(getaddrinfo_mutex);
-
   // Perform a name lookup for a host name.
   struct addrinfo hints;
   memset(&hints, 0, sizeof(hints));
diff --git a/runtime/bin/vmservice/client/build.sh b/runtime/bin/vmservice/client/build.sh
new file mode 100755
index 0000000..2084b46
--- /dev/null
+++ b/runtime/bin/vmservice/client/build.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+# This script copies the build outputs produced by `pub build` to
+# the deployed directory.
+
+if [ ! -d "deployed" ]; then
+  echo "Run this script from the client directory"
+  exit
+fi
+
+# Fixup polymer breakage
+pushd lib/src
+find . -name "*.html" -exec ../../dotdot.sh {} \;
+popd
+
+# Build JS
+pub build
+
+# Undo polymer breakage fix
+pushd lib/src
+find . -name "*.html" -exec ../../notdotdot.sh {} \;
+popd
+
+# Deploy
+./deploy.sh
+
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 5a88805..dee1033 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -17,6 +17,11 @@
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
+      nav {
+        position: fixed;
+        width: 100%;
+        z-index: 1000;
+      }
       nav ul {
         display: inline-table;
         position: relative;
@@ -24,7 +29,7 @@
         padding-left: 0;
         margin-left: 0;
         width: 100%;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background-color: #0489c3;
@@ -32,12 +37,21 @@
       nav ul:after {
         content: ""; clear: both; display: block;
       }
+      .vertical-spacer {
+        height: 40px;
+        background-color: #0489c3;
+      }
     </style>
     <nav>
       <ul>
         <content></content>
       </ul>
     </nav>
+    <div class="vertical-spacer">
+    </div>
+    <template if="{{ pad }}">
+      <br>
+    </template>
   </template>
 </polymer-element>
 
@@ -64,7 +78,7 @@
         margin: 0;
         padding: 0;
         width: auto;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background: #567;
@@ -107,7 +121,7 @@
         padding: 0;
         margin-left: 0;
         width: auto;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background: #567;
@@ -171,10 +185,10 @@
 
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
+    <nav-menu link="{{ hashLinkWorkaround }}" anchor="{{ isolate.name }}" last="{{ last }}">
       <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="allocation profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}" anchor="heap map"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
@@ -205,7 +219,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ msg.isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <template if="{{ msg['breakpoints'].isEmpty }}">
@@ -276,13 +290,24 @@
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <style>
+      .errorBox {
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: pre;
+      }
+    </style>
     <span>
-      <template if="{{ isUnexpected(ref.serviceType) }}">
-        unexpected reference type &lt;{{ ref.serviceType }}&gt;
+      <template if="{{ isError(ref.serviceType) }}">
+        <pre class="errorBox">{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ isError(ref.serviceType) }}">
-        <pre>{{ ref.message }}</pre>
+      <template if="{{ isUnexpected(ref.serviceType) }}">
+        unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
       <template if="{{ isNull(ref.serviceType) }}">
@@ -378,7 +403,7 @@
         white-space: pre-line;
       }
       .historyExpr a:hover {
-        background-color: #e1f5fe
+        background-color: #fff3e3;
       }
       .historyValue {
         display: block;
@@ -426,6 +451,32 @@
 </polymer-element>
 
 
+<polymer-element name="eval-link">
+  <template>
+    <style>
+      .idle {
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        color: #aaa;
+        cursor: wait;
+      }
+    </style>
+
+    <template if="{{ busy }}">
+      <span class="busy">[evaluate]</span>
+    </template>
+    <template if="{{ !busy }}">
+      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+    </template>
+    <template if="{{ result != null }}">
+      = <instance-ref ref="{{ result }}"></instance-ref>
+    </template>
+
+  </template>
+  
+</polymer-element>
 <polymer-element name="field-ref" extends="service-ref">
   <template>
   <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
@@ -459,10 +510,16 @@
 </polymer-element>
 <polymer-element name="library-ref" extends="service-ref">
 <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-  <a href="{{ url }}">{{ name }}</a>
+  <template if="{{ nameIsEmpty }}">
+    <a href="{{ url }}">unnamed</a>
+  </template>
+  <template if="{{ !nameIsEmpty }}">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
 </template>
 
-</polymer-element><polymer-element name="script-ref" extends="service-ref">
+</polymer-element>
+<polymer-element name="script-ref" extends="service-ref">
 <template>
   <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
@@ -544,6 +601,12 @@
             <div class="memberValue">{{ cls.vmName }}</div>
           </div>
         </template>
+        <div class="memberItem">
+          <div class="memberName">retained size<br>(all instances)</div>
+          <div class="memberValue">
+            <eval-link callback="{{ retainedSize }}"></eval-link>
+          </div>
+        </div>
       </div>
     </div>
 
@@ -557,7 +620,7 @@
     <div class="content">
       <template if="{{ cls['fields'].isNotEmpty }}">
         fields ({{ cls['fields'].length }})
-        <curly-block>
+        <curly-block expand="{{ cls['fields'].length <= 8 }}">
           <div class="memberList">
             <template repeat="{{ field in cls['fields'] }}">
               <div class="memberItem">
@@ -572,12 +635,12 @@
               </div>
             </template>
           </div>
-        </curly-block><br>
+        </curly-block><br><br>
       </template>
 
       <template if="{{ cls['functions'].isNotEmpty }}">
         functions ({{ cls['functions'].length }})
-        <curly-block>
+        <curly-block expand="{{ cls['functions'].length <= 8 }}">
           <div class="memberList">
             <template repeat="{{ function in cls['functions'] }}">
               <div class="memberItem">
@@ -588,7 +651,7 @@
               </div>
             </template>
           </div>
-        </curly-block><br>
+        </curly-block><br><br>
       </template>
     </div>
 
@@ -606,7 +669,12 @@
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ code.isDartCode }}">
-      <a href="{{ url }}">{{ name }}</a>
+        <template if="{{ code.isOptimized }}">
+          <a href="{{ url }}">*{{ name }}</a>
+        </template>
+        <template if="{{ !code.isOptimized }}">
+          <a href="{{ url }}">{{ name }}</a>
+        </template>
     </template>
     <template if="{{ !code.isDartCode }}">
       <span>{{ name }}</span>
@@ -669,14 +737,25 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <div class="content">
-      <h1>Code for {{ code.name }}</h1>
+      <template if="{{ code.isDartCode &amp;&amp; code.isOptimized }}">
+        <h1>Optimized code for {{ code.name }}</h1>
+      </template>
+      <template if="{{ !(code.isDartCode &amp;&amp; code.isOptimized) }}">
+        <h1>Code for {{ code.name }}</h1>
+      </template>
       <div class="memberList">
         <div class="memberItem">
-          <div class="memberName">kind</div>
+          <div class="memberName">Kind</div>
           <div class="memberValue">{{code.kind}}</div>
         </div>
+        <template if="{{ code.isDartCode }}">
+          <div class="memberItem">
+            <div class="memberName">Optimized</div>
+            <div class="memberValue">{{code.isOptimized}}</div>
+          </div>
+        </template>
         <div class="memberItem">
-          <div class="memberName">function</div>
+          <div class="memberName">Function</div>
           <div class="memberValue">
             <function-ref ref="{{code.function}}">
             </function-ref>
@@ -781,39 +860,14 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
-        <h1>{{ error.kind }}</h1>
-        <div class="well">{{ error.message }}</div>
+    <div class="content-centered">
+      <h1>{{ error.kind }}</h1>
+      <br>
+      <div class="well">{{ error.message }}</div>
     </div>
   </template>
   
 </polymer-element>
-<polymer-element name="eval-link">
-  <template>
-    <style>
-      .idle {
-        color: #0489c3;
-        cursor: pointer;
-      }
-      .busy {
-        color: #aaa;
-        cursor: wait;
-      }
-    </style>
-
-    <template if="{{ busy }}">
-      <span class="busy">[evaluate]</span>
-    </template>
-    <template if="{{ !busy }}">
-      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
-    </template>
-    <template if="{{ result != null }}">
-      = <instance-ref ref="{{ result }}"></instance-ref>
-    </template>
-
-  </template>
-  
-</polymer-element>
 <polymer-element name="field-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
@@ -827,7 +881,7 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -957,7 +1011,7 @@
       <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -1059,19 +1113,27 @@
     .hover {
       position: fixed;
       z-index: 999;
+      height: 16px;
       width: 100%;
       background: #ffffff;
     }
+    .spacer {
+      height: 16px;
+      background-color: red;
+    }
   </style>
-  <nav-bar>
+  <nav-bar pad="{{ false }}">
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
-    <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
   </nav-bar>
   <div class="hover">
     <p style="text-align:center">{{ status }}</p>
   </div>
+  <div class="spacer">
+    <!-- Make sure no data is covered by hover bar initially -->
+  </div>
   <div class="flex-row">
     <canvas id="fragmentation" width="1px" height="1px"></canvas>
   </div>
@@ -1242,82 +1304,101 @@
 
     <br>
 
-    <div class="content">
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">root library</div>
-          <div class="memberValue">
-            <function-ref ref="{{ isolate.rootLib }}"></function-ref>
-          </div>
-        </div>
-        <div class="memberItem">
-          <template if="{{ isolate.entry != null }}">
-            <div class="memberName">entry</div>
-            <div class="memberValue">
-              <function-ref ref="{{ isolate.entry }}"></function-ref>
-            </div>
-          </template>
-        </div>
-        <div class="memberItem">
-          <div class="memberName">id</div>
-          <div class="memberValue">{{ isolate.mainPort }}</div>
-        </div>
-        <br>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+    <div class="content-centered">
+      <div class="flex-row">
 
+        <div class="flex-item-fixed-6-12">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">root library</div>
+              <div class="memberValue">
+                <library-ref ref="{{ isolate.rootLib }}"></library-ref>
+              </div>
+            </div>
+            <div class="memberItem">
+              <template if="{{ isolate.entry != null }}">
+                <div class="memberName">entry</div>
+                <div class="memberValue">
+                  <function-ref ref="{{ isolate.entry }}"></function-ref>
+                </div>
+              </template>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">id</div>
+              <div class="memberValue">{{ isolate.mainPort }}</div>
+            </div>
+            <br>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+              </div>
+            </div>
           </div>
         </div>
-      </div>
-    </div>
+
+        <div class="flex-item-fixed-6-12">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">new heap</div>
+              <div class="memberValue">
+                {{ isolate.newHeapUsed | formatSize }}
+                of
+                {{ isolate.newHeapCapacity | formatSize }}
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">old heap</div>
+              <div class="memberValue">
+                {{ isolate.oldHeapUsed | formatSize }}
+                of
+                {{ isolate.oldHeapCapacity | formatSize }}
+              </div>
+            </div>
+          </div>
+          <br>
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+              </div>
+            </div>
+          </div>
+        </div>
+
+      </div> <!-- flex row -->
+    </div> <!-- content -->
 
     <hr>
 
     <div class="content">
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">new heap</div>
-          <div class="memberValue">
-            {{ isolate.newHeapUsed | formatSize }}
-            of
-            {{ isolate.newHeapCapacity | formatSize }}
-          </div>
+      libraries ({{ isolate.libraries.length }})
+      <curly-block expand="{{ isolate.libraries.length <= 8 }}">
+        <div class="memberList">
+          <template repeat="{{ lib in isolate.libraries }}">
+            <div class="memberItem">
+              <div class="memberName">
+                <library-ref ref="{{ lib }}"></library-ref>
+              </div>
+            </div>
+          </template>
         </div>
-        <div class="memberItem">
-          <div class="memberName">old heap</div>
-          <div class="memberValue">
-            {{ isolate.oldHeapUsed | formatSize }}
-            of
-            {{ isolate.oldHeapCapacity | formatSize }}
-          </div>
-        </div>
-      </div>
-
-      <br>
-
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-          </div>
-        </div>
-      </div>
+      </curly-block>
     </div>
 
     <hr>
@@ -1386,6 +1467,12 @@
             <div class="memberName">size</div>
             <div class="memberValue">{{ instance['size'] | formatSize }}</div>
           </div>
+          <div class="memberItem">
+            <div class="memberName">retained size</div>
+            <div class="memberValue">
+              <eval-link callback="{{ retainedSize }}"></eval-link>
+            </div>
+          </div>
           <template if="{{ instance['type_class'] != null }}">
             <div class="memberItem">
               <div class="memberName">type class</div>
@@ -1421,7 +1508,7 @@
       <div class="content">
         <template if="{{ instance['fields'].isNotEmpty }}">
           fields ({{ instance['fields'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['fields'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ field in instance['fields'] }}">
                 <div class="memberItem">
@@ -1434,12 +1521,12 @@
                 </div>
               </template>
             </div>
-          </curly-block>
+          </curly-block><br><br>
         </template>
 
         <template if="{{ instance['nativeFields'].isNotEmpty }}">
           native fields ({{ instance['nativeFields'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ field in instance['nativeFields'] }}">
                 <div class="memberItem">
@@ -1448,12 +1535,12 @@
                 </div>
               </template>
             </div>
-          </curly-block><br>
+          </curly-block><br><br>
         </template>
 
         <template if="{{ instance['elements'].isNotEmpty }}">
           elements ({{ instance['elements'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['elements'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ element in instance['elements'] }}">
                 <div class="memberItem">
@@ -1465,7 +1552,7 @@
                 </div>
               </template>
             </div>
-          </curly-block><br>
+          </curly-block><br><br>
         </template>
       </div>
 
@@ -1508,18 +1595,8 @@
       <div class="memberList">
         <div class="memberItem">
           <div class="memberName">url</div>
-          <div class="memberValue">{{ library['url'] }}</div>
+          <div class="memberValue">{{ library.url }}</div>
         </div>
-        <template if="{{ library['imports'].length > 0 }}">
-          <div class="memberItem">
-            <div class="memberName">imports</div>
-            <div class="memberValue">
-              <template repeat="{{ import in library['imports'] }}">
-                <library-ref ref="{{ import }}"></library-ref>
-              </template>
-            </div>
-          </div>
-        </template>
         <template if="{{ library.name != library.vmName }}">
           <div class="memberItem">
             <div class="memberName">vm name</div>
@@ -1532,11 +1609,27 @@
     <hr>
 
     <div class="content">
-      <template if="{{ library['scripts'].isNotEmpty }}">
-        scripts ({{ library['scripts'].length }})
-        <curly-block>
+      <template if="{{ library.imports.isNotEmpty }}">
+        imports ({{ library.imports.length }})
+        <curly-block expand="{{ library.imports.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ script in library['scripts'] }}">
+            <template repeat="{{ imp in library.imports }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <library-ref ref="{{ imp }}"></library-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+        <br>
+      </template>
+
+      <template if="{{ library.scripts.isNotEmpty }}">
+        scripts ({{ library.scripts.length }})
+        <curly-block expand="{{ library.scripts.length <= 8 }}">
+          <div class="memberList">
+            <template repeat="{{ script in library.scripts }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <script-ref ref="{{ script }}"></script-ref>
@@ -1545,13 +1638,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['classes'].isNotEmpty }}">
-        classes ({{ library['classes'].length }})
-        <curly-block>
+      <template if="{{ library.classes.isNotEmpty }}">
+        classes ({{ library.classes.length }})
+        <curly-block expand="{{ library.classes.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ cls in library['classes'] }}">
+            <template repeat="{{ cls in library.classes }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <class-ref ref="{{ cls }}"></class-ref>
@@ -1560,13 +1654,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['variables'].isNotEmpty }}">
-        variables ({{ library['variables'].length }})
-        <curly-block>
+      <template if="{{ library.variables.isNotEmpty }}">
+        variables ({{ library.variables.length }})
+        <curly-block expand="{{ library.variables.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ field in library['variables'] }}">
+            <template repeat="{{ field in library.variables }}">
               <div class="memberItem">
                 <div class="memberName">
                   <field-ref ref="{{ field }}"></field-ref>
@@ -1580,13 +1675,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['functions'].isNotEmpty }}">
-        functions ({{ library['functions'].length }})
-        <curly-block>
+      <template if="{{ library.functions.isNotEmpty }}">
+        functions ({{ library.functions.length }})
+        <curly-block expand="{{ library.functions.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ function in library['functions'] }}">
+            <template repeat="{{ function in library.functions }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <function-ref ref="{{ function }}"></function-ref>
@@ -1595,6 +1691,7 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
     </div>
 
@@ -1698,7 +1795,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <style>
@@ -1837,7 +1934,7 @@
         <tbody>
           <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
             <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-              <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
+              <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
               <div style="position: relative;display: inline">
                 {{row.columns[0]}}
               </div>
@@ -1911,7 +2008,7 @@
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
     <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -1960,12 +2057,14 @@
       <thead>
         <tr>
           <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Size">{{ classTable.getColumnLabel(3) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Instances">{{ classTable.getColumnLabel(4) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Current Size">{{ classTable.getColumnLabel(5) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Current Instances">{{ classTable.getColumnLabel(6) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
         </tr>
       </thead>
       <tbody>
@@ -1977,6 +2076,8 @@
           <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
           <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
           <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
+          <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
+          <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
         </tr>
       </tbody>
     </table>
@@ -1990,7 +2091,6 @@
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
-    <library-nav-menu library="{{ script.library }}"></library-nav-menu>
     <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
       <li>
         <input type="checkbox" checked="{{ showCoverage }}">
@@ -2047,7 +2147,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ trace.isolate.relativeHashLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <template if="{{ trace['members'].isEmpty }}">
@@ -2134,10 +2234,13 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
-        <h1>{{ exception.kind }}</h1>
-        <div class="well">{{ exception.message }}</div>
+    <div class="content-centered">
+      <h1>{{ exception.kind }}</h1>
+      <br>
+      <div class="well">{{ exception.message }}</div>
+      <template if="{{ exception.response != '' }}">
         <div class="well">{{ exception.response }}</div>
+      </template>
     </div>
   </template>
   
@@ -2148,8 +2251,9 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
+    <div class="content-centered">
       <h1>{{ error.kind }}</h1>
+      <br>
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index d873c4b..959e609 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -53,7 +53,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC",ze:"hitStyleNotExecuted"};(function(a){"use strict"
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDD:"classes",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJJ:"imports",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gMz:"__$pad",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPl:"__$busy",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXR:"scripts",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ3:"variables",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gmu:"functions",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goM:"__$expand",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",VnP:"hitStyleNotExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function(a){"use strict"
 function map(b){b={x:b}
 delete b.x
 return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
@@ -154,9 +154,9 @@
 HT:{
 "^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
 "^":"",
-x:[function(a){return void 0},"$1","Ue",2,0,null,6,[]],
-Qu:[function(a,b,c,d){return{i:a,p:b,e:c,x:d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
-ks:[function(a){var z,y,x,w
+x:function(a){return void 0},
+Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+ks:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -167,57 +167,54 @@
 if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
 if(w==null){y=Object.getPrototypeOf(a)
 if(y==null||y===Object.prototype)return C.ZQ
-else return C.vB}return w},"$1","mz",2,0,null,6,[]],
-e1:[function(a){var z,y,x,w
+else return C.vB}return w},
+e1:function(a){var z,y,x,w
 z=$.Au
 if(z==null)return
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
-if(x.n(a,y[w]))return w}return},"$1","kC",2,0,null,11,[]],
-Xr:[function(a){var z,y,x
+if(x.n(a,y[w]))return w}return},
+Xr:function(a){var z,y,x
 z=J.e1(a)
 if(z==null)return
 y=$.Au
 x=z+1
 if(x>=y.length)return H.e(y,x)
-return y[x]},"$1","Tj",2,0,null,11,[]],
-Nq:[function(a,b){var z,y,x
+return y[x]},
+Nq:function(a,b){var z,y,x
 z=J.e1(a)
 if(z==null)return
 y=$.Au
 x=z+2
 if(x>=y.length)return H.e(y,x)
-return y[x][b]},"$2","BJ",4,0,null,11,[],12,[]],
+return y[x][b]},
 Gv:{
 "^":"a;",
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
 bu:function(a){return H.a5(a)},
-T:function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(a),null)},
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,74,[]],
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-kn:{
-"^":"bool/Gv;",
+yEe:{
+"^":"Gv;",
 bu:function(a){return String(a)},
 giO:function(a){return a?519018:218159},
-gbx:function(a){return C.HL},
-$isbool:true},
+$isa2:true},
 Jh:{
-"^":"Null/Gv;",
+"^":"Gv;",
 n:function(a,b){return null==b},
 bu:function(a){return"null"},
 giO:function(a){return 0},
-gbx:function(a){return C.Qf}},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,74,[]]},
 Ue1:{
 "^":"Gv;",
-giO:function(a){return 0},
-gbx:function(a){return C.CS}},
+giO:function(a){return 0}},
 FP:{
 "^":"Ue1;"},
 is:{
 "^":"Ue1;"},
 Q:{
-"^":"List/Gv;",
+"^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
 KI:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
@@ -233,11 +230,12 @@
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
 return!0}return!1},
 ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")}],
 FV:function(a,b){var z
 for(z=J.GP(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")}],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -310,9 +308,9 @@
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 a[b]=c},
-$isList:true,
-$isList:true,
-$asWO:null,
+$isQ:true,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -326,11 +324,11 @@
 $isnM:true},
 iY:{
 "^":"nM;"},
-Jt:{
+Ib:{
 "^":"nM;",
-$isJt:true},
+$isIb:true},
 P:{
-"^":"num/Gv;",
+"^":"Gv;",
 iM:function(a,b){var z
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a<b)return-1
@@ -405,27 +403,25 @@
 return a<=b},
 F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
-$isnum:true,
-static:{"^":"SAz,N6l"}},
-bU:{
-"^":"int/P;",
-gbx:function(a){return C.yw},
-$isdouble:true,
-$isnum:true,
-$isint:true},
+$islf:true,
+static:{"^":"SAz,yc"}},
+imn:{
+"^":"P;",
+$isCP:true,
+$islf:true,
+$isKN:true},
 Pp:{
-"^":"double/P;",
-gbx:function(a){return C.O4},
-$isdouble:true,
-$isnum:true},
+"^":"P;",
+$isCP:true,
+$islf:true},
 x1:{
-"^":"bU;"},
+"^":"imn;"},
 VP:{
 "^":"x1;"},
 qa:{
 "^":"VP;"},
 O:{
-"^":"String/Gv;",
+"^":"Gv;",
 j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
@@ -522,28 +518,27 @@
 y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
 y^=y>>11
 return 536870911&y+((16383&y)<<15>>>0)},
-gbx:function(a){return C.Db},
 gB:function(a){return a.length},
 t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 return a[b]},
-$isString:true,
-static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
+$isqU:true,
+static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+default:return!1}},mm:function(a,b){var z,y
 for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
 y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
 for(z=a.length;b>0;b=y){y=b-1
 if(y>=z)H.vh(P.N(y))
 x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b},"$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+if(x!==32&&x!==13&&!J.Ga(x))break}return b}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
-zd:[function(a,b){var z=a.vV(0,b)
+zd:function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
-return z},"$2","RTQ",4,0,null,16,[],17,[]],
-ox:[function(){--init.globalState.Xz.GL},"$0","q4",0,0,null],
-oT:[function(a,b){var z,y,x,w,v,u
+return z},
+ox:function(){--init.globalState.Xz.GL},
+oT:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
 b=b
@@ -551,14 +546,14 @@
 if(b==null){b=[]
 z.a=b
 y=b}else y=b
-if(!J.x(y).$isList)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$iszM)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
 y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.i6(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
-x=P.L5(null,null,null,J.bU,H.yo)
-w=P.Ls(null,null,null,J.bU)
+x=P.L5(null,null,null,P.KN,H.yo)
+w=P.Ls(null,null,null,P.KN)
 v=new H.yo(0,null,!1)
 u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 w.h(0,0)
@@ -570,21 +565,21 @@
 if(x)u.vV(0,new H.PK(z,a))
 else{y=H.KT(y,[y,y]).BD(a)
 if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},"$2","wr",4,0,null,18,[],19,[]],
-yl:[function(){var z=init.currentScript
+else u.vV(0,a)}init.globalState.Xz.bL()},
+yl:function(){var z=init.currentScript
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
 if(init.globalState.EF===!0)return H.fU()
-return},"$0","dY",0,0,null],
-fU:[function(){var z,y
+return},
+fU:function(){var z,y
 z=new Error().stack
 if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
 if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
 if(y!=null)return y[1]
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},"$0","mZ",0,0,null],
+throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=H.Hh(b.data)
 y=J.U6(z)
@@ -597,8 +592,8 @@
 s=y.t(z,"startPaused")
 r=H.Hh(y.t(z,"replyTo"))
 y=init.globalState.Hg++
-q=P.L5(null,null,null,J.bU,H.yo)
-p=P.Ls(null,null,null,J.bU)
+q=P.L5(null,null,null,P.KN,H.yo)
+p=P.Ls(null,null,null,P.KN)
 o=new H.yo(0,null,!1)
 n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 p.h(0,0)
@@ -636,15 +631,15 @@
 y.toString
 self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,20,[],21,[]],
-ZF:[function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,6,[],7,[]],
+ZF:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
 x=H.Gy(P.EF(["command","log","msg",a],null,null))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"$1","eR",2,0,null,22,[]],
-Ws:[function(a,b,c,d,e,f){var z,y,x,w
+throw H.b(P.FM(z))}},
+Ws:function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
 $.te=$.te+("_"+y)
@@ -655,24 +650,24 @@
 J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
 x=new H.Vg(a,b,c,d)
 if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},"$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
-Gy:[function(a){var z
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
+Gy:function(a){var z
 if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},"$1","YH",2,0,null,24,[]],
-Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"$1","m6",2,0,null,24,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","lF",2,0,null,28,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","dD",2,0,null,28,[]],
+return z.h7(a)}},
+Hh:function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
+else return a},
+VO:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
+ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 PK:{
-"^":"Tp:126;a,b",
-$0:[function(){this.b.$1(this.a.a)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,b",
+$0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 JO:{
-"^":"Tp:126;a,c",
-$0:[function(){this.c.$2(this.a.a,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,c",
+$0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 f0:{
 "^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2<,vd,XC,w2<",
@@ -686,8 +681,8 @@
 this.ji=y
 this.vu=z&&!x
 this.Xz=new H.cC(P.NZ(null,H.IY),0)
-this.i2=P.L5(null,null,null,J.bU,H.aX)
-this.XC=P.L5(null,null,null,J.bU,null)
+this.i2=P.L5(null,null,null,P.KN,H.aX)
+this.XC=P.L5(null,null,null,P.KN,null)
 if(this.EF===!0){z=new H.JH()
 this.vd=z
 w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
@@ -784,10 +779,10 @@
 init.globalState.i2.Rz(0,this.jO)
 z=this.Jp
 if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)
-this.Jp=null}},"$0","gQb",0,0,125],
+this.Jp=null}},"$0","gQb",0,0,21],
 $isaX:true},
 NY:{
-"^":"Tp:125;a",
+"^":"Tp:21;a",
 $0:[function(){J.Sq(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
@@ -816,23 +811,23 @@
 w.toString
 self.postMessage(v)}}},
 RA:{
-"^":"Tp:125;a",
+"^":"Tp:21;a",
 $0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;F1*,i3,G1*",
 VU:function(){if(this.F1.gRW()){this.F1.gC9().push(this)
-return}J.yn(this.F1,this.i3)},
+return}J.nG(this.F1,this.i3)},
 $isIY:true},
 JH:{
 "^":"a;"},
 jl:{
-"^":"Tp:126;a,b,c,d,e,f",
+"^":"Tp:22;a,b,c,d,e,f",
 $0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Vg:{
-"^":"Tp:125;a,b,c,d",
+"^":"Tp:21;a,b,c,d",
 $0:[function(){var z,y,x
 if(this.d!==!0)this.a.$1(this.c)
 else{z=this.a
@@ -870,7 +865,7 @@
 $isbC:true,
 $ishq:true},
 Ua:{
-"^":"Tp:126;a,b,c",
+"^":"Tp:22;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -886,8 +881,8 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},
 giO:function(a){var z,y,x
-z=J.Eh(this.hQ,16)
-y=J.Eh(this.Jz,8)
+z=J.c1(this.hQ,16)
+y=J.c1(this.Jz,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
@@ -927,7 +922,7 @@
 yf:function(a){if(!!a.$isku)return new H.ku(a.ng)
 throw H.b("Capability not serializable: "+a.bu(0))}},
 II:{
-"^":"Xb;RZ",
+"^":"lY;RZ",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.t(a,1)
@@ -965,7 +960,7 @@
 I8:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
-if(!!z.$isList)return this.wb(a)
+if(!!z.$iszM)return this.wb(a)
 if(!!z.$isZ0)return this.TI(a)
 if(!!z.$isbC)return this.DE(a)
 if(!!z.$ishq)return this.yf(a)
@@ -999,9 +994,9 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"$2",null,4,0,null,49,[],299,[],"call"],
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.b
+J.kW(this.a.a,z.I8(a),z.I8(b))},
 $isEH:true},
 Tf:{
 "^":"BB;",
@@ -1030,7 +1025,7 @@
 x[w]=v}return x},
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
-Xb:{
+lY:{
 "^":"a;",
 QS:function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
@@ -1093,12 +1088,12 @@
 z.Qa(a,b)
 return z}}},
 FA:{
-"^":"Tp:125;a,b",
+"^":"Tp:21;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Av:{
-"^":"Tp:125;c,d",
+"^":"Tp:21;c,d",
 $0:[function(){this.c.p9=null
 H.ox()
 this.d.$0()},"$0",null,0,0,null,"call"],
@@ -1125,23 +1120,23 @@
 $isku:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
-wV:[function(a,b){var z
+wV:function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},"$2","b3",4,0,null,6,[],29,[]],
-d:[function(a){var z
+if(z!=null)return z}return!!J.x(a).$isXj},
+d:function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
 else if(!1===a)return"false"
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},"$1","Sa",2,0,null,30,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"$1","c7",2,0,null,31,[]],
-eQ:[function(a){var z=a.$identityHash
+return z},
+Hz:function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},
+eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},"$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,32,14,[]],
-BU:[function(a,b,c){var z,y,x,w,v,u
+a.$identityHash=z}return z},
+vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,8],
+BU:function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.Rm()
 if(typeof a!=="string")H.vh(P.u(a))
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
@@ -1167,48 +1162,48 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
-return parseInt(a,b)},"$3","Yv",6,0,null,33,[],34,[],35,[]],
-IH:[function(a,b){var z,y
+return parseInt(a,b)},
+IH:function(a,b){var z,y
 if(typeof a!=="string")H.vh(P.u(a))
 if(b==null)b=H.Rm()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.$1(a)}return z},"$2","inc",4,0,null,33,[],35,[]],
-lh:[function(a){var z,y
+return b.$1(a)}return z},
+lh:function(a){var z,y
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
 if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
-return z+H.ia(H.oX(a),0,null)},"$1","Ig",2,0,null,6,[]],
-a5:[function(a){return"Instance of '"+H.lh(a)+"'"},"$1","jb",2,0,null,6,[]],
-RF:[function(a){var z,y,x,w,v,u
+return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
+a5:function(a){return"Instance of '"+H.lh(a)+"'"},
+RF:function(a){var z,y,x,w,v,u
 z=a.length
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
 else{u=w+500
 u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"$1","JG",2,0,null,36,[]],
-YF:[function(a){var z,y,x
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
+YF:function(a){var z,y,x
 z=[]
-z.$builtinTypeInfo=[J.bU]
+z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.Kp(a,0)]
 for(;y.G();){x=y.lo
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},"$1","nE",2,0,null,37,[]],
-eT:[function(a){var z,y
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
+eT:function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.RF(a)},"$1","Wb",2,0,null,38,[]],
-Lw:[function(a){var z
+if(y>65535)return H.YF(a)}return H.RF(a)},
+Lw:function(a){var z
 if(typeof a!=="number")return H.s(a)
 if(0<=a){if(a<=65535)return String.fromCharCode(a)
 if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},"$1","cK",2,0,null,39,[]],
-zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
+return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
+zW:function(a,b,c,d,e,f,g,h){var z,y,x,w
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(P.u(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -1222,14 +1217,14 @@
 if(x.E(a,0)||x.C(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
-return w.valueOf()}return y},"$8","mV",16,0,null,40,[],41,[],42,[],43,[],44,[],45,[],46,[],47,[]],
-o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"$1","j1",2,0,null,48,[]],
-VK:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-return a[b]},"$2","Zl",4,0,null,6,[],49,[]],
-aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-a[b]=c},"$3","WJ",6,0,null,6,[],49,[],30,[]],
-zo:[function(a,b,c){var z,y,x
+return w.valueOf()}return y},
+o2:function(a){if(a.date===void 0)a.date=new Date(a.y3)
+return a.date},
+VK:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+return a[b]},
+aw:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+a[b]=c},
+zo:function(a,b,c){var z,y,x
 z={}
 z.a=0
 y=[]
@@ -1237,8 +1232,8 @@
 if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},"$3","pT",6,0,null,17,[],50,[],51,[]],
-im:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
+im:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
 if(y==null)return H.zo(a,b,c)
@@ -1258,33 +1253,24 @@
 C.Nm.FV(r,b)
 y=a["$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"$3","fl",6,0,null,17,[],50,[],51,[]],
-mN:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.c1
-if(a=="double")return C.yX
-if(a=="num")return C.oD
-if(a=="bool")return C.Fm
-if(a=="List")return C.E3
-if(a=="Null")return C.x0
-return init.allClasses[a]},"$1","JL",2,0,null,52,[]],
-SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"$1","EN",2,0,null,6,[]],
-Pq:[function(){var z={x:0}
+return y.apply(a,r)},
+Pq:function(){var z={x:0}
 delete z.x
-return z},"$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"$1","Ff",2,0,null,53,[]],
-e:[function(a,b){if(a==null)J.q8(a)
+return z},
+s:function(a){throw H.b(P.u(a))},
+e:function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"$2","x3",4,0,null,48,[],15,[]],
-b:[function(a){var z
+throw H.b(P.N(b))},
+b:function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
 z.dartException=a
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.Ju})
 z.name=""}else z.toString=H.Ju
-return z},"$1","Cr",2,0,null,54,[]],
+return z},
 Ju:[function(){return J.AG(this.dartException)},"$0","Eu",0,0,null],
-vh:[function(a){throw H.b(a)},"$1","xE",2,0,null,54,[]],
-Ru:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+vh:function(a){throw H.b(a)},
+Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Am(a)
 if(a==null)return
 if(typeof a!=="object")return a
@@ -1322,29 +1308,29 @@
 return z.$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
 return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
 return z.$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},"$1","v2",2,0,null,54,[]],
-CU:[function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.eQ(a)},"$1","Zs",2,0,null,6,[]],
-B7:[function(a,b){var z,y,x,w
+return a},
+CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
+else return H.eQ(a)},
+B7:function(a,b){var z,y,x,w
 z=a.length
 for(y=0;y<z;y=w){x=y+1
 w=x+1
-b.u(0,a[y],a[x])}return b},"$2","nD",4,0,null,56,[],57,[]],
+b.u(0,a[y],a[x])}return b},
 ft:[function(a,b,c,d,e,f,g){var z=J.x(c)
 if(z.n(c,0))return H.zd(b,new H.dr(a))
 else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
 else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","mD",14,0,null,58,[],16,[],59,[],60,[],61,[],62,[],63,[]],
-tR:[function(a,b){var z
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","kT",14,0,null,9,[],10,[],11,[],12,[],13,[],14,[],15,[]],
+tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
 z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.ft)
 a.$identity=z
-return z},"$2","qN",4,0,null,58,[],64,[]],
-iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return z},
+iA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=b[0]
 z.$stubName
 y=z.$callName
@@ -1373,36 +1359,36 @@
 n=o.$callName
 if(n!=null){m=d?o:H.SD(a,o,t)
 w[n]=m}}w["call*"]=s
-return v},"$6","Xd",12,0,null,48,[],65,[],66,[],67,[],68,[],69,[]],
-vq:[function(a,b,c,d){var z=H.eZ
+return v},
+vq:function(a,b,c,d){var z=H.eZ
 switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
 case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
 case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
 case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
 case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
-default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
-SD:[function(a,b,c){var z,y,x,w,v,u
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
+SD:function(a,b,c){var z,y,x,w,v,u
 if(c)return H.wg(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.bf
+if(y===0){w=$.mJ
 if(w==null){w=H.B3("self")
-$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+$.mJ=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
 $.OK=J.WB(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
-v=$.bf
+v=$.mJ
 if(v==null){v=H.B3("self")
-$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+$.mJ=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
-return new Function(v+H.d(w)+"}")()},"$3","Fw",6,0,null,48,[],17,[],72,[]],
-Z4:[function(a,b,c,d){var z,y
+return new Function(v+H.d(w)+"}")()},
+Z4:function(a,b,c,d){var z,y
 z=H.eZ
 y=H.yS
 switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
@@ -1414,8 +1400,8 @@
 case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
-return e.apply(f(this),h)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
-wg:[function(a,b){var z,y,x,w,v,u,t,s
+return e.apply(f(this),h)}}(d,z,y)}},
+wg:function(a,b){var z,y,x,w,v,u,t,s
 z=H.oN()
 y=$.P4
 if(y==null){y=H.B3("receiver")
@@ -1432,40 +1418,40 @@
 y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
 t=$.OK
 $.OK=J.WB(t,1)
-return new Function(y+H.d(t)+"}")()},"$2","FT",4,0,null,48,[],17,[]],
-qm:[function(a,b,c,d,e,f){b.fixed$length=init
+return new Function(y+H.d(t)+"}")()},
+qm:function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"$6","Rz",12,0,null,48,[],65,[],66,[],67,[],68,[],12,[]],
-SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"$2","H7",4,0,null,30,[],74,[]],
-Go:[function(a,b){var z
+return H.iA(a,b,c,!!d,e,f)},
+SE:function(a,b){var z=J.U6(b)
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},
+Go:function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"$2","CY",4,0,null,30,[],74,[]],
-ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"$1","RK",2,0,null,75,[]],
-KT:[function(a,b,c){return new H.tD(a,b,c,null)},"$3","HN",6,0,null,77,[],78,[],79,[]],
-Og:[function(a,b){var z=a.name
+H.SE(a,b)},
+ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
+KT:function(a,b,c){return new H.tD(a,b,c,null)},
+Og:function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},"$2","ZPJ",4,0,null,80,[],81,[]],
-N7:[function(){return C.KZ},"$0","cI",0,0,null],
-uV:[function(a){return new H.cu(a,null)},"$1","IZ",2,0,null,12,[]],
-VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},"$2","Ub",4,0,null,82,[],83,[]],
-oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"$1","Cb",2,0,null,82,[]],
-IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"$2","PE",4,0,null,82,[],84,[]],
-ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"$3","Cn",6,0,null,82,[],84,[],15,[]],
-Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"$2","tC",4,0,null,82,[],15,[]],
-Ko:[function(a,b){if(a==null)return"dynamic"
+return new H.fw(z,b,null)},
+N7:function(){return C.KZ},
+uV:function(a){return new H.cu(a,null)},
+VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
+return a},
+oX:function(a){if(a==null)return
+return a.$builtinTypeInfo},
+IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
+ip:function(a,b,c){var z=H.IM(a,b)
+return z==null?null:z[c]},
+Kp:function(a,b){var z=H.oX(a)
+return z==null?null:z[b]},
+Ko:function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
 else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
 else return b.$1(a)
-else return},"$2$onTypeVariable","bR",2,3,null,85,11,[],86,[]],
-ia:[function(a,b,c){var z,y,x,w,v,u
+else return},
+ia:function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
 for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
@@ -1473,34 +1459,35 @@
 v=a[y]
 if(v!=null)w=!1
 u=H.Ko(v,c)
-z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},"$3$onTypeVariable","iM",4,3,null,85,87,[],88,[],86,[]],
-dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
-return z+H.ia(a.$builtinTypeInfo,0,null)},"$1","Yx",2,0,null,6,[]],
-Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
+dJ:function(a){var z=J.x(a).constructor.builtin$cls
+if(a==null)return z
+return z+H.ia(a.$builtinTypeInfo,0,null)},
+Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},"$2","zL",4,0,null,89,[],90,[]],
-RB:[function(a,b,c,d){var z,y
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},
+RB:function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},"$4","Ap",8,0,null,6,[],91,[],92,[],93,[]],
-hv:[function(a,b){var z,y
+return H.hv(H.Y9(y[d],z),c)},
+hv:function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},"$2","QY",4,0,null,94,[],95,[]],
-IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"$3","k2",6,0,null,96,[],97,[],98,[]],
-XY:[function(a,b){var z,y
-if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
+return!0},
+IG:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
+XY:function(a,b){var z,y
+if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="L9"
 if(b==null)return!0
 z=H.oX(a)
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"$2","Dk",4,0,null,99,[],95,[]],
-t1:[function(a,b){var z,y,x,w,v,u,t
+return H.t1(y,b)},
+t1:function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
 if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
@@ -1517,8 +1504,8 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},"$2","Mb",4,0,null,94,[],95,[]],
-Hc:[function(a,b,c){var z,y,x,w,v
+return H.hv(H.Y9(t,y),w)},
+Hc:function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
 if(a==null)return!1
@@ -1527,8 +1514,8 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","d1",6,0,null,94,[],95,[],100,[]],
-Vt:[function(a,b){var z,y,x,w,v,u
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
+Vt:function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
 z=Object.getOwnPropertyNames(b)
@@ -1538,8 +1525,8 @@
 if(!Object.hasOwnProperty.call(a,w))return!1
 v=b[w]
 u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"$2","y3",4,0,null,94,[],95,[]],
-Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
+Ly:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(!("func" in a))return!1
 if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
 y=b.ret
@@ -1560,13 +1547,13 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"$2","Sj",4,0,null,94,[],95,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"$3","fW",6,0,null,17,[],48,[],90,[]],
-kj:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","aZ",2,0,null,101,[]],
-wzi:[function(a){return H.eQ(a)},"$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
-w3:[function(a){var z,y,x,w,v,u
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
+ml:function(a,b,c){return a.apply(b,c)},
+kj:function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
+wzi:function(a){return H.eQ(a)},
+iw:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+w3:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.nw[z]
 if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1591,20 +1578,20 @@
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.Lc(a,x)},"$1","eU",2,0,null,101,[]],
-Lc:[function(a,b){var z,y
+return u.i}else return H.Lc(a,x)},
+Lc:function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
 Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},"$2","qF",4,0,null,101,[],7,[]],
-Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"$1","MlJ",2,0,null,7,[]],
-VF:[function(a,b,c){var z=b.prototype
+return b},
+Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
+VF:function(a,b,c){var z=b.prototype
 if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},"$3","vi",6,0,null,102,[],103,[],8,[]],
-XD:[function(){if(!0===$.Bv)return
+else return J.Qu(z,c,null,null)},
+XD:function(){if(!0===$.Bv)return
 $.Bv=!0
-H.Z1()},"$0","Ki",0,0,null],
-Z1:[function(){var z,y,x,w,v,u,t
+H.Z1()},
+Z1:function(){var z,y,x,w,v,u,t
 $.nw=Object.create(null)
 $.vv=Object.create(null)
 H.kO()
@@ -1620,8 +1607,8 @@
 z["~"+w]=t
 z["-"+w]=t
 z["+"+w]=t
-z["*"+w]=t}}},"$0","vU",0,0,null],
-kO:[function(){var z,y,x,w,v,u,t
+z["*"+w]=t}}},
+kO:function(){var z,y,x,w,v,u,t
 z=C.MA()
 z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ur(C.AS),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
@@ -1632,9 +1619,9 @@
 t=z.prototypeForTag
 $.NF=new H.dC(v)
 $.TX=new H.wN(u)
-$.x7=new H.VX(t)},"$0","Hb",0,0,null],
-ud:[function(a,b){return a(b)||b},"$2","rM",4,0,null,104,[],105,[]],
-ZT:[function(a,b){var z,y,x,w,v,u
+$.x7=new H.VX(t)},
+ud:function(a,b){return a(b)||b},
+ZT:function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
 y=b.length
 x=a.length
@@ -1643,25 +1630,25 @@
 z.push(new H.tQ(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},"$2","tl",4,0,null,110,[],111,[]],
-m2:[function(a,b,c){var z,y
+else w=v===u?w+1:u}return z},
+m2:function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
 else{z=J.x(b)
 if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"$3","WL",6,0,null,48,[],112,[],88,[]],
-ys:[function(a,b,c){var z,y,x,w,v
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},
+ys:function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
 y=a.length
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
 w=z.vM+=w
-z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
+z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))
 else if(!!J.x(b).$isVR){v=b.gl9()
 v.lastIndex=0
-return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(P.u(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"$3","uF",6,0,null,48,[],113,[],114,[]],
+return a.replace(v,c.replace(/\$/g,"$$$$"))}else{if(b==null)H.vh(P.u(null))
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},
 Zd:{
 "^":"a;"},
 xQ:{
@@ -1697,12 +1684,12 @@
 $isyN:true},
 LD:{
 "^":"Tp;a,b",
-$1:[function(a){return J.de(a,this.b)},"$1",null,2,0,null,30,[],"call"],
+$1:function(a){return J.de(a,this.b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 jJ:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,49,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,76,[],"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1820,7 +1807,7 @@
 z={}
 if(this.NE==null){y=this.hG
 this.NE=Array(y)
-x=P.Fl(J.O,J.bU)
+x=P.Fl(P.qU,P.KN)
 for(w=this.Rv,v=0;v<y;++v){u=w+v
 x.u(0,this.XL(u),u)}z.a=0
 y=x.gvc()
@@ -1836,36 +1823,35 @@
 H.VM(y,y["<>"])
 return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
 gx5:function(){return this.mr.$reflectionName},
-static:{"^":"vS,FV,C1,H6",zh:function(a){var z,y,x,w
+static:{"^":"qg,FV,C1,bt",zh:function(a){var z,y,x
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
 z=z
 y=z[0]
-x=y>>1
-w=z[1]
-return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
+x=z[1]
+return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 Nv:{
-"^":"Tp:32;a,b,c",
-$1:[function(a){var z,y,x
+"^":"Tp:8;a,b,c",
+$1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
 x=this.c.t(0,a)
 if(y>=z.length)return H.e(z,y)
-z[y]=x},"$1",null,2,0,null,12,[],"call"],
+z[y]=x},
 $isEH:true},
 Cj:{
-"^":"Tp:301;a,b,c",
-$2:[function(a,b){var z=this.a
+"^":"Tp:77;a,b,c",
+$2:function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
-this.b.push(b);++z.a},"$2",null,4,0,null,12,[],53,[],"call"],
+this.b.push(b);++z.a},
 $isEH:true},
 u8:{
-"^":"Tp:301;a,b",
-$2:[function(a,b){var z=this.b
+"^":"Tp:77;a,b",
+$2:function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"$2",null,4,0,null,302,[],30,[],"call"],
+else this.a.a=!0},
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -1884,7 +1870,7 @@
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:function(a){var z,y,x,w,v,u
 a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
 if(z==null)z=[]
@@ -1893,8 +1879,8 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function(b){var $argumentsExpr$='$arguments$'
-try{b.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function(b){try{b.$method$}catch(z){return z.message}}(a)},"$1","cl",2,0,null,55,[]]}},
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
+try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
 W0:{
 "^":"Ge;K9,Ga",
 bu:function(a){var z=this.Ga
@@ -1922,9 +1908,9 @@
 bu:function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Tp:115;a",
-$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"$1",null,2,0,null,171,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+return a},
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
@@ -1937,30 +1923,31 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Tp:126;a",
-$0:[function(){return this.a.$0()},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Tp:126;b,c",
-$0:[function(){return this.b.$1(this.c)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;b,c",
+$0:function(){return this.b.$1(this.c)},
 $isEH:true},
 KX:{
-"^":"Tp:126;d,e,f",
-$0:[function(){return this.d.$2(this.e,this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;d,e,f",
+$0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 uZ:{
-"^":"Tp:126;UI,bK,Gq,Rm",
-$0:[function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;UI,bK,Gq,Rm",
+$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
 OQ:{
-"^":"Tp:126;w3,HZ,mG,xC,cj",
-$0:[function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;w3,HZ,mG,xC,cj",
+$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
 Tp:{
 "^":"a;",
 bu:function(a){return"Closure"},
 $isTp:true,
-$isEH:true},
+$isEH:true,
+gKu:function(){return this}},
 Bp:{
 "^":"Tp;",
 $isBp:true},
@@ -1976,15 +1963,15 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"$1","PR",2,0,null,58,[]],yS:[function(a){return a.EP},"$1","xm",2,0,null,58,[]],oN:[function(){var z=$.bf
+static:{"^":"mJ,P4",eZ:function(a){return a.gnw()},yS:function(a){return a.EP},oN:function(){var z=$.mJ
 if(z==null){z=H.B3("self")
-$.bf=z}return z},"$0","uT",0,0,null],B3:[function(a){var z,y,x,w,v
+$.mJ=z}return z},B3:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}},"$1","ec",2,0,null,73,[]]}},
+if(z[v]===a)return v}}}},
 qq:{
 "^":"a;Jy"},
 va:{
@@ -2038,11 +2025,11 @@
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
 x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
-static:{"^":"Jl",Dz:[function(a){var z,y,x
+static:{"^":"Jl",Dz:function(a){var z,y,x
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"$1","At",2,0,null,76,[]]}},
+return z}}},
 hJ:{
 "^":"q1;",
 bu:function(a){return"dynamic"},
@@ -2077,12 +2064,10 @@
 static:{WE:function(a){return new H.oQ(a)}}},
 cu:{
 "^":"a;LU<,ke",
-bu:function(a){var z,y,x
+bu:function(a){var z,y
 z=this.ke
 if(z!=null)return z
-y=this.LU
-x=init.mangledGlobalNames[y]
-y=x==null?y:x
+y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
 this.ke=y
 return y},
 giO:function(a){return J.v1(this.LU)},
@@ -2090,32 +2075,32 @@
 return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},
 $iscu:true,
 $isuq:true},
-QT:{
+bB:{
 "^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a(a)},
 $isEH:true},
 wN:{
-"^":"Tp:303;b",
-$2:[function(a,b){return this.b(a,b)},"$2",null,4,0,null,99,[],102,[],"call"],
+"^":"Tp:78;b",
+$2:function(a,b){return this.b(a,b)},
 $isEH:true},
 VX:{
-"^":"Tp:32;c",
-$1:[function(a){return this.c(a)},"$1",null,2,0,null,102,[],"call"],
+"^":"Tp:8;c",
+$1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
-"^":"a;Ej,Ii,Ua",
+"^":"a;zO,Ej,Ii,Ua",
 gl9:function(){var z=this.Ii
 if(z!=null)return z
 z=this.Ej
-z=H.v4(z.source,z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
 this.Ii=z
 return z},
 gAT:function(){var z=this.Ua
 if(z!=null)return z
 z=this.Ej
-z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
 this.Ua=z
 return z},
 ej:function(a){var z
@@ -2152,14 +2137,14 @@
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $isSP:true,
-static:{v4:[function(a,b,c,d){var z,y,x,w,v
+static:{v4:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"$4","HU",8,0,null,106,[],107,[],108,[],109,[]]}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
 AX:{
 "^":"a;zO,QK",
 t:function(a,b){var z=this.QK
@@ -2202,11 +2187,11 @@
 N.Jx("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.cM(),"google"),"visualization")
 $.NR=z
-return z},"$1","vN",2,0,115,116,[]],
-G0:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","ez",4,0,null,117,[],118,[]],
-ap:[function(a,b){var z
+return z},"$1","vN",2,0,16,17,[]],
+G0:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},
+ap:function(a,b){var z
 for(z="";b>1;){--b
-if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},"$2","Bn",4,0,null,30,[],119,[]],
+if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
 av:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
@@ -2214,8 +2199,8 @@
 a=z.Z(a,1000)
 x=G.ap(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.ap(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,120,121,[]],
-P0:[function(a){var z,y,x,w
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,18],
+P0:function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
 y=C.jn.cU(z,3600000)
@@ -2225,14 +2210,14 @@
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
 if(y>0)return G.ap(y,2)+":"+G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)
-else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},"$1","DQ",2,0,null,122,[]],
+else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},
 Xz:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
 else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
 else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,120,123,[]],
-mG:[function(a){var z,y,x,w
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,18,19,[]],
+mG:function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
 y=C.jn.cU(z,3600000)
@@ -2242,15 +2227,15 @@
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},"$1","N2",2,0,null,122,[]],
+return""+w+"s"},
 mL:{
-"^":["Pi;Z6<-304,zf>-305,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,306,"isolate",307,308],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,309,30,[],"isolate",307],
-gvJ:[function(a){return this.AJ},null,null,1,0,310,"response",307,308],
-svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,311,30,[],"response",307],
-gKw:[function(){return this.fz},null,null,1,0,312,"args",307,308],
-sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",307],
+"^":["Pi;Z6<-79,zf>-80,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,81,"isolate",82,83],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,84,27,[],"isolate",82],
+gvJ:[function(a){return this.AJ},null,null,1,0,85,"response",82,83],
+svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,86,27,[],"response",82],
+gKw:[function(){return this.fz},null,null,1,0,87,"args",82,83],
+sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,8,27,[],"args",82],
 Da:function(){var z,y
 z=this.Z6
 z.sec(this)
@@ -2261,9 +2246,9 @@
 z=z.gLi()
 H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
 kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gbf",2,0,313,171,[]],
+this.Z6.Mp()},"$1","gbf",2,0,88,30,[]],
 t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gXa",2,0,314,315,[]],
+this.Z6.Mp()},"$1","gXa",2,0,89,90,[]],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
 ig:{
@@ -2282,8 +2267,8 @@
 this.vR.V7("draw",[a.gYb(),z])}},
 dZ:{
 "^":"Pi;ec?,JL,AP,fn",
-gjW:[function(){return this.JL},null,null,1,0,312,"currentHash",307,308],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",307],
+gjW:[function(){return this.JL},null,null,1,0,87,"currentHash",82,83],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,8,27,[],"currentHash",82],
 kI:function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(window.location.hash==="")window.location.hash="#/vm"
@@ -2302,23 +2287,25 @@
 this.ec.zf.cv(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},
 static:{"^":"K3D"}},
 Qe:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.df()},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 GH:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=z.ec
 y.AJ=F.Wi(y,C.mE,y.AJ,a)
 z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,101,[],"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,92,[],"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-317,wd>-318,oH<-319",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
-gyX:[function(a){return this.R7},null,null,1,0,312,"expander",307,308],
+"^":["Pi;eT>,yt<-93,wd>-94,oH<-95",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
+gyX:[function(a){return this.R7},null,null,1,0,87,"expander",82,83],
 Qx:function(a){return this.gyX(this).$0()},
-syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,32,30,[],"expander",307],
+syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,8,27,[],"expander",82],
+grm:[function(){return this.aZ},null,null,1,0,87,"expanderStyle",82,83],
+srm:[function(a){this.aZ=F.Wi(this,C.Jt,this.aZ,a)},null,null,3,0,8,27,[],"expanderStyle",82],
 goE:function(a){return this.z3},
 soE:function(a,b){var z=this.z3
 this.z3=b
@@ -2328,9 +2315,10 @@
 this.o8()}}},
 r8:function(){this.soE(0,!this.z3)
 return this.z3},
+k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Jt,this.aZ,"visibility:hidden;")},
 $isY2:true},
 XN:{
-"^":["Pi;zU>-318,AP,fn",function(){return[C.J19]},null,null],
+"^":["Pi;zU>-94,AP,fn",function(){return[C.J19]},null,null],
 rT:function(a){var z,y
 z=this.zU
 y=J.w1(z)
@@ -2357,7 +2345,7 @@
 w.UZ(z,v,v+y)}},
 Kt:{
 "^":"a;ph>,xy",
-static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,124,121,[]]}},
+static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,20]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
@@ -2368,7 +2356,7 @@
 gxp:function(){return this.pT},
 np:function(a){H.rd(this.tW,new G.Nu(this))
 F.Wi(this,C.AH,0,1)},
-gIN:[function(){return this.tW},null,null,1,0,320,"sortedRows",308],
+gIN:[function(){return this.tW},null,null,1,0,96,"sortedRows",83],
 lb:function(){C.Nm.sB(this.zU,0)
 C.Nm.sB(this.tW,0)},
 aJ:function(a,b){var z=this.zU
@@ -2379,55 +2367,55 @@
 z=this.zU
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.U8(z[a])
-if(b>>>0!==b||b>=7)return H.e(z,b)
+if(b>>>0!==b||b>=9)return H.e(z,b)
 y=z[b]
-return this.oH[b].xy.$1(y)},"$2","gls",4,0,321,322,[],323,[],"getFormattedValue",307],
+return this.oH[b].xy.$1(y)},"$2","gls",4,0,97,98,[],99,[],"getFormattedValue",82],
 Qs:[function(a){var z,y
 if(!J.de(a,this.pT)){z=this.oH
-if(a>>>0!==a||a>=7)return H.e(z,a)
+if(a>>>0!==a||a>=9)return H.e(z,a)
 return z[a].ph+"\u2003"}z=this.oH
-if(a>>>0!==a||a>=7)return H.e(z,a)
+if(a>>>0!==a||a>=9)return H.e(z,a)
 z=z[a]
 y=this.jV?"\u25bc":"\u25b2"
-return z.ph+y},"$1","gpo",2,0,120,323,[],"getColumnLabel",307],
+return z.ph+y},"$1","gpo",2,0,18,99,[],"getColumnLabel",82],
 TK:[function(a,b){var z=this.zU
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.U8(z[a])
-if(b>>>0!==b||b>=7)return H.e(z,b)
-return z[b]},"$2","gyY",4,0,324,322,[],323,[],"getValue",307]},
+if(b>>>0!==b||b>=9)return H.e(z,b)
+return z[b]},"$2","gyY",4,0,100,98,[],99,[],"getValue",82]},
 Nu:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x,w,v,u
+"^":"Tp:75;a",
+$2:function(a,b){var z,y,x,w,v,u
 z=this.a
 y=z.zU
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
 x=J.U8(y[a])
 w=z.pT
-if(w>>>0!==w||w>=7)return H.e(x,w)
+if(w>>>0!==w||w>=9)return H.e(x,w)
 v=x[w]
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 y=J.U8(y[b])
 w=z.pT
-if(w>>>0!==w||w>=7)return H.e(y,w)
+if(w>>>0!==w||w>=9)return H.e(y,w)
 u=y[w]
 if(z.jV)return J.oE(u,v)
-else return J.oE(v,u)},"$2",null,4,0,null,325,[],326,[],"call"],
-$isEH:true}}],["app_bootstrap","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
+else return J.oE(v,u)},
+$isEH:true}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
 "^":"",
-De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
+De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
 $.uP=!1
-F.E2()},"$0","KU",0,0,125]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+F.E2()},"$0","KU",0,0,21]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 pz:{
-"^":["pv;BW%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,329,"msg",307,330],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,331,30,[],"msg",307],
-pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-"@":function(){return[C.jy]},
+"^":["pv;BW%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,103,"msg",82,104],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,105,27,[],"msg",82],
+pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"@":function(){return[C.PT]},
 static:{t4:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -2435,19 +2423,19 @@
 a.X0=w
 C.J0.ZL(a)
 C.J0.oX(a)
-return a},null,null,0,0,126,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[333],
+return a},null,null,0,0,22,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[107],
 pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.tSc]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -2456,20 +2444,21 @@
 a.X0=w
 C.oq.ZL(a)
 C.oq.oX(a)
-return a},null,null,0,0,126,"new ClassRefElement$created"]}},
-"+ClassRefElement":[336]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+return a},null,null,0,0,22,"new ClassRefElement$created"]}},
+"+ClassRefElement":[110]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["Dsd;Om%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Om},null,null,1,0,329,"cls",307,330],
-sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,331,30,[],"cls",307],
-vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["Dsd;Om%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Om},null,null,1,0,103,"cls",82,104],
+sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,105,27,[],"cls",82],
+vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.aQx]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -2477,22 +2466,22 @@
 a.X0=w
 C.ka.ZL(a)
 C.ka.oX(a)
-return a},null,null,0,0,126,"new ClassViewElement$created"]}},
-"+ClassViewElement":[338],
+return a},null,null,0,0,22,"new ClassViewElement$created"]}},
+"+ClassViewElement":[114],
 Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.tY},null,null,1,0,339,"code",308],
-aZ:[function(a,b){Q.xI.prototype.aZ.call(this,a,b)
-this.ct(a,C.b1,0,1)},"$1","gLe",2,0,115,242,[],"refChanged"],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.tY},null,null,1,0,115,"code",83],
+P9:[function(a,b){Q.xI.prototype.P9.call(this,a,b)
+this.ct(a,C.b1,0,1)},"$1","gLe",2,0,16,65,[],"refChanged"],
 "@":function(){return[C.H3]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -2501,80 +2490,80 @@
 a.X0=w
 C.IK.ZL(a)
 C.IK.oX(a)
-return a},null,null,0,0,126,"new CodeRefElement$created"]}},
-"+CodeRefElement":[336]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a},null,null,0,0,22,"new CodeRefElement$created"]}},
+"+CodeRefElement":[110]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["tuj;Xx%-340,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,339,"code",307,330],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,341,30,[],"code",307],
+"^":["tuj;Xx%-116,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,115,"code",82,104],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,117,27,[],"code",82],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.hf())},"$0","gQd",0,0,125,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.SK(z).ml(new F.hf())},"$0","gQd",0,0,21,"enteredView"],
+pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 m2:[function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
 y=H.BU(z,null,null)
 x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
 if(x==null)return
-return x},"$1","gnV",2,0,342,82,[],"_findJumpTarget"],
+return x},"$1","gnV",2,0,118,119,[],"_findJumpTarget"],
 YI:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gff",6,0,343,21,[],344,[],82,[],"mouseOver"],
+J.pP(z).h(0,"highlight")},"$3","gff",6,0,120,7,[],121,[],119,[],"mouseOver"],
 ZC:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,343,21,[],344,[],82,[],"mouseOut"],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,120,7,[],121,[],119,[],"mouseOut"],
 "@":function(){return[C.xW]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
 a.B7=y
 a.X0=w
-C.ux.ZL(a)
-C.ux.oX(a)
-return a},null,null,0,0,126,"new CodeViewElement$created"]}},
-"+CodeViewElement":[345],
+C.YD.ZL(a)
+C.YD.oX(a)
+return a},null,null,0,0,22,"new CodeViewElement$created"]}},
+"+CodeViewElement":[122],
 tuj:{
 "^":"uL+Pi;",
 $isd3:true},
 hf:{
-"^":"Tp:341;",
-$1:[function(a){a.QW()},"$1",null,2,0,341,289,[],"call"],
+"^":"Tp:117;",
+$1:[function(a){a.QW()},"$1",null,2,0,117,123,[],"call"],
 $isEH:true},
-"+ hf":[346]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
+"+ hf":[124]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":["Vct;zh%-347,HX%-347,Uy%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gAQ:[function(a){return a.zh},null,null,1,0,312,"iconClass",307,308],
-sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",307],
-gai:[function(a){return a.HX},null,null,1,0,312,"displayValue",307,308],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",307],
-gxj:[function(a){return a.Uy},null,null,1,0,348,"collapsed"],
+"^":["Vct;zh%-125,HX%-125,Uy%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gAQ:[function(a){return a.zh},null,null,1,0,87,"iconClass",82,83],
+sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,8,27,[],"iconClass",82],
+gai:[function(a){return a.HX},null,null,1,0,87,"displayValue",82,83],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,8,27,[],"displayValue",82],
+gxj:[function(a){return a.Uy},null,null,1,0,126,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,349,350,[],"collapsed"],
+this.SS(a)},null,null,3,0,127,128,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"$0","gQd",0,0,125,"enteredView"],
+this.SS(a)},"$0","gQd",0,0,21,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"$3","gl8",6,0,343,21,[],344,[],82,[],"toggleDisplay"],
+this.SS(a)},"$3","gl8",6,0,120,7,[],121,[],119,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
 if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,125,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,21,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-347,DI<-347",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-125,DI<-125",Hv:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.zh="glyphicon glyphicon-chevron-down"
@@ -2585,47 +2574,52 @@
 a.X0=w
 C.j8.ZL(a)
 C.j8.oX(a)
-return a},null,null,0,0,126,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[351],
+return a},null,null,0,0,22,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[129],
 Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-335,Hu%-335,nx%-85,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,348,"expanded",307,308],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,349,30,[],"expanded",307],
-gO9:[function(a){return a.Hu},null,null,1,0,348,"busy",307,308],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,349,30,[],"busy",307],
-gFR:[function(a){return a.nx},null,null,1,0,126,"callback",307,330],
+"^":["LP;GV%-109,Pl%-109,nx%-29,oM%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,126,"expanded",82,83],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,127,27,[],"expanded",82],
+gO9:[function(a){return a.Pl},null,null,1,0,126,"busy",82,83],
+sO9:[function(a,b){a.Pl=this.ct(a,C.S4,a.Pl,b)},null,null,3,0,127,27,[],"busy",82],
+gFR:[function(a){return a.nx},null,null,1,0,22,"callback",82,104],
 Ki:function(a){return this.gFR(a).$0()},
 AV:function(a,b,c){return this.gFR(a).$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,115,30,[],"callback",307],
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,16,27,[],"callback",82],
+git:[function(a){return a.oM},null,null,1,0,126,"expand",82,104],
+sit:[function(a,b){a.oM=this.ct(a,C.dI,a.oM,b)},null,null,3,0,127,27,[],"expand",82],
+rL:[function(a,b){var z=a.oM
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","gzr",2,0,26,65,[],"expandChanged"],
 Ey:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.Hu=this.ct(a,C.S4,a.Hu,!1)},"$0","goJ",0,0,125,"doneCallback"],
-AZ:[function(a,b,c,d){var z=a.Hu
+a.Pl=this.ct(a,C.S4,a.Pl,!1)},"$0","goJ",0,0,21,"doneCallback"],
+AZ:[function(a,b,c,d){var z=a.Pl
 if(z===!0)return
-if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
+if(a.nx!=null){a.Pl=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,352,117,[],199,[],289,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,130,53,[],57,[],123,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.GV=!1
-a.Hu=!1
+a.Pl=!1
 a.nx=null
+a.oM=!1
 a.SO=z
 a.B7=y
 a.X0=w
 C.O0.ZL(a)
 C.O0.oX(a)
-return a},null,null,0,0,126,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[353],
+return a},null,null,0,0,22,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[131],
 LP:{
 "^":"xc+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -2637,21 +2631,21 @@
 if(y==null)return"registerElement" in document
 return J.de(J.UQ(y,"ready"),!0)},
 wJ:{
-"^":"Tp:126;",
-$0:[function(){if(B.G9())return P.Ab(null,null)
+"^":"Tp:22;",
+$0:function(){if(B.G9())return P.Ab(null,null)
 var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
-return z.gtH(z)},"$0",null,0,0,null,"call"],
+return z.gtH(z)},
 $isEH:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
-bQ:[function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},"$2","Mn",4,0,null,127,[],128,[]],
-Ck:[function(a,b){var z
+bQ:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
+Ck:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
-return!1},"$2","cs",4,0,null,127,[],128,[]],
-n3:[function(a,b,c){var z
+return!1},
+n3:function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},"$3","cS",6,0,null,127,[],129,[],130,[]],
-mx:[function(a,b,c){var z,y,x
+return b},
+mx:function(a,b,c){var z,y,x
 for(y=0;x=$.RM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
 z=P.p9("")
 try{$.RM().push(a)
@@ -2659,24 +2653,24 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"$3","FQ",6,0,null,127,[],131,[],132,[]],
-rd:[function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},"$2","xX",4,0,null,76,[],133,[]],
-K0:[function(a,b,c){var z=J.Wx(b)
+x.pop()}return z.gvM()},
+rd:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},
+K0:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"$3","Ze",6,0,null,76,[],134,[],135,[]],
-qG:[function(a,b,c,d,e){var z,y,x,w
+if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},
+qG:function(a,b,c,d,e){var z,y,x,w
 H.K0(a,b,c)
 z=J.xH(c,b)
 if(J.de(z,0))return
 if(J.u6(e,0))throw H.b(P.u(e))
 y=J.x(d)
-if(!!y.$isList){x=e
+if(!!y.$iszM){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
 x=0}if(J.z8(J.WB(x,z),J.q8(w)))throw H.b(P.w("Not enough elements"))
-H.tb(w,x,a,b,z)},"$5","it",10,0,null,76,[],134,[],135,[],113,[],136,[]],
-IC:[function(a,b,c){var z,y,x,w,v,u
+H.tb(w,x,a,b,z)},
+IC:function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 y=J.x(c)
@@ -2692,37 +2686,37 @@
 H.qG(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"$3","QB",6,0,null,76,[],15,[],127,[]],
-ed:[function(a,b,c){var z,y
+C.Nm.u(a,b,v)}},
+ed:function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 for(z=J.GP(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}},"$3","Y1",6,0,null,76,[],15,[],127,[]],
-tb:[function(a,b,c,d,e){var z,y,x,w,v
+C.Nm.u(a,b,z.gl())}},
+tb:function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"$5","e8",10,0,null,137,[],138,[],139,[],140,[],141,[]],
-TK:[function(a,b,c,d){var z
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},
+TK:function(a,b,c,d){var z
 if(c>=a.length)return-1
 if(c<0)c=0
 for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"$4","vu",8,0,null,117,[],142,[],88,[],143,[]],
-lO:[function(a,b,c){var z,y
+if(J.de(a[z],b))return z}return-1},
+lO:function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"$3","MW",6,0,null,117,[],142,[],88,[]],
-ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
-else H.d4(a,b,c,d)},"$4","UR",8,0,null,117,[],144,[],145,[],133,[]],
-w9:[function(a,b,c,d){var z,y,x,w,v,u
+if(J.de(a[y],b))return y}return-1},
+ZE:function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
+else H.d4(a,b,c,d)},
+w9:function(a,b,c,d){var z,y,x,w,v,u
 for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
 v=z
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"$4","f7",8,0,null,117,[],144,[],145,[],133,[]],
-d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
+v=u.W(v,1)}y.u(a,v,w)}},
+d4:function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
 z=J.Wx(a0)
 y=J.Ts(J.WB(z.W(a0,b),1),6)
 x=J.Qc(b)
@@ -2822,7 +2816,7 @@
 k=e}else{t.u(a,i,t.t(a,j))
 d=x.W(j,1)
 t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"$4","Hm",8,0,null,117,[],144,[],145,[],133,[]],
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},
 aL:{
 "^":"mW;",
 gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
@@ -2866,7 +2860,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")}],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -3102,15 +3096,15 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 w2Y:{
 "^":"ar+Tv;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -3131,99 +3125,95 @@
 bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
 $isGD:true,
 $iswv:true,
-static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:[function(a){var z,y
+static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:function(a){var z,y
 z=J.U6(a)
 if(z.gl0(a)!==!0){y=$.bw().Ej
 if(typeof a!=="string")H.vh(P.u(a))
 y=y.test(a)}else y=!0
 if(y)return a
 if(z.nC(a,"_"))throw H.b(P.u("\""+H.d(a)+"\" is a private identifier"))
-throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))},"$1","kf",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
+throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))}}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
 "^":"",
-TS:[function(a){return J.GL(a)},"$1","DP",2,0,null,146,[]],
-YC:[function(a){if(a==null)return
-return new H.GD(a)},"$1","Rc",2,0,null,12,[]],
+TS:function(a){return J.GL(a)},
+YC:function(a){if(a==null)return
+return new H.GD(a)},
 vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"$1","Yf",2,0,147,148,[]],
-jO:[function(a){var z,y
+else return new H.iu(a,4)},"$1","Yf",2,0,23,24,[]],
+jO:function(a){var z,y
 z=$.Sl().t(0,a)
 y=J.x(a)
 if(y.n(a,"dynamic"))return $.P8()
 if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"$1","vC",2,0,null,149,[]],
-tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=J.U6(b)
-y=z.u8(b,"/")
-if(y>-1)b=z.yn(b,y+1)
+return H.tT(H.YC(z==null?a:z),a)},
+tT:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=$.tY
 if(z==null){z=H.Pq()
-$.tY=z}x=z[b]
-if(x!=null)return x
+$.tY=z}y=z[b]
+if(y!=null)return y
 z=J.U6(b)
-w=z.u8(b,"<")
-if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
-x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
-$.tY[b]=x
-return x}u=H.mN(b)
-if(u==null){t=init.functionAliases[b]
-if(t!=null){x=new H.ng(b,null,a)
-x.CM=new H.Ar(init.metadata[t],null,null,null,x)
-$.tY[b]=x
-return x}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}s=H.SG(u)?u.constructor:u
-r=s["@"]
-if(r==null){q=null
-p=null}else{q=r["^"]
-z=J.x(q)
-if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
-q=z.t(q,0)}else p=null
-if(typeof q!=="string")q=""}z=J.uH(q,";")
+x=z.u8(b,"<")
+if(x!==-1){w=H.jO(z.Nj(b,0,x)).gJi()
+y=new H.bl(w,z.Nj(b,x+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,w.gIf())
+$.tY[b]=y
+return y}v=init.allClasses[b]
+if(v==null){u=init.functionAliases[b]
+if(u!=null){y=new H.ng(b,null,a)
+y.CM=new H.Ar(init.metadata[u],null,null,null,y)
+$.tY[b]=y
+return y}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}t=v["@"]
+if(t==null){s=null
+r=null}else{s=t["^"]
+z=J.x(s)
+if(!!z.$iszM){r=z.Mu(s,1,z.gB(s)).br(0)
+s=z.t(s,0)}else r=null
+if(typeof s!=="string")s=""}z=J.uH(s,";")
 if(0>=z.length)return H.e(z,0)
-o=J.uH(z[0],"+")
-if(o.length>1&&$.Sl().t(0,b)==null)x=H.MJ(o,b)
-else{n=new H.Wf(b,u,q,p,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
-m=s.prototype["<>"]
-if(m==null||m.length===0)x=n
-else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
-x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"$2","ER",4,0,null,146,[],149,[]],
-Vv:[function(a){var z,y,x
+q=J.uH(z[0],"+")
+if(q.length>1&&$.Sl().t(0,b)==null)y=H.MJ(q,b)
+else{p=new H.Wf(b,v,s,r,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
+o=v.prototype["<>"]
+if(o==null||o.length===0)y=p
+else{for(z=o.length,n="dynamic",m=1;m<z;++m)n+=",dynamic"
+y=new H.bl(p,n,null,null,null,null,null,null,null,null,null,null,null,null,null,p.If)}}$.tY[b]=y
+return y},
+Vv:function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"$1","yM",2,0,null,150,[]],
-Fk:[function(a){var z,y,x
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},
+Fk:function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},"$1","Pj",2,0,null,150,[]],
-EK:[function(a,b){var z,y,x,w
+if(x.gxV())z.u(0,x.gIf(),x)}return z},
+EK:function(a,b){var z,y,x,w
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.glT()){w=x.gIf()
-if(b.nb.t(0,w)!=null)continue
-z.u(0,x.gIf(),x)}}return z},"$2","rX",4,0,null,150,[],151,[]],
-vE:[function(a,b){var z,y,x,w,v
+if(b.Fb.t(0,w)!=null)continue
+z.u(0,x.gIf(),x)}}return z},
+vE:function(a,b){var z,y,x,w,v
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.ghB()){w=x.gIf().fN
 v=J.U6(w)
 if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},"$2","un",4,0,null,150,[],152,[]],
-MJ:[function(a,b){var z,y,x,w
+z.to(x.gIf(),new H.YX(x))}return z},
+MJ:function(a,b){var z,y,x,w
 z=[]
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
 x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
 x.G()
 w=x.lo
 for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"$2","R9",4,0,null,153,[],149,[]],
-w2:[function(a,b){var z,y,x
+return w},
+w2:function(a,b){var z,y,x
 z=J.U6(a)
 y=0
 while(!0){x=z.gB(a)
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},"$2","CE",4,0,null,155,[],12,[]],
-Jf:[function(a,b){var z,y,x,w,v,u,t
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},
+Jf:function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
 for(y=a;y!=null;){x=J.x(y)
@@ -3233,27 +3223,27 @@
 else{x=z.a
 if(x==null)w=H.Ko(b,null)
 else if(x.gHA())if(typeof b==="number"){v=init.metadata[b]
-u=x.gNy()
+u=z.a.gNy()
 return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
 else{z=new H.rh(z)
 if(typeof b==="number"){t=z.$1(b)
 if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.iW(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},"$2","xN",4,0,null,156,[],11,[]],
-fb:[function(a,b){if(a==null)return b
-return H.YC(H.d(J.GL(J.Ba(a)))+"."+H.d(b.fN))},"$2","WS",4,0,null,156,[],157,[]],
-pj:[function(a){var z,y,x,w
+return P.re(C.yQ)},
+fb:function(a,b){if(a==null)return b
+return H.YC(H.d(a.gUx(a).fN)+"."+H.d(b.fN))},
+pj:function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
 if(typeof a!="function")return C.xD
 if("$metadataIndex" in a){y=a.$reflectionInfo.splice(a.$metadataIndex)
 y.fixed$length=init
 return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
-w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
+w=C.xB.cn(x,new H.VR("\"[0-9,]*\";?[ \n\r]*}",H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
 if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"$1","C7",2,0,null,158,[]],
-jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},
+jw:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
-if(!!z.$isList){y=H.Mk(z.t(b,0),",")
+if(!!z.$iszM){y=H.Mk(z.t(b,0),",")
 x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
 x=null}for(z=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=x!=null,v=0;z.G();){u=z.lo
 if(w){t=v+1
@@ -3261,18 +3251,18 @@
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"$4","Sv",8,0,null,156,[],159,[],67,[],57,[]],
-Mk:[function(a,b){var z=J.U6(a)
-if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"$2","EO",4,0,null,14,[],106,[]],
-BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
-default:return!1}},"$1","IX",2,0,null,12,[]],
-Y6:[function(a){var z,y
+if(r!=null)d.push(r)}},
+Mk:function(a,b){var z=J.U6(a)
+if(z.gl0(a)===!0)return H.VM([],[P.qU])
+return z.Fr(a,b)},
+BF:function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
+default:return!1}},
+Y6:function(a){var z,y
 z=J.x(a)
 if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
 y=z.t(a,0)
 z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"$1","uG",2,0,null,49,[]],
+return z.n(y,"*")||z.n(y,"+")},
 Sn:{
 "^":"a;L5,F1>",
 gvU:function(){var z,y,x,w
@@ -3280,11 +3270,11 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=$.vK(),z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)for(x=J.GP(z.lo);x.G();){w=x.gl()
-y.u(0,w.gFP(),w)}z=H.VM(new H.Oh(y),[P.iD,P.D4])
+y.u(0,w.gFP(),w)}z=H.VM(new P.Oh(y),[P.iD,P.D4])
 this.L5=z
 return z},
-static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=P.L5(null,null,null,J.O,[J.Q,P.D4])
+static:{"^":"QG,Q3,Ct",dF:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=P.L5(null,null,null,P.qU,[P.zM,P.D4])
 y=init.libraries
 if(y==null)return z
 for(x=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);x.G();){w=x.lo
@@ -3298,10 +3288,10 @@
 o=v.t(w,6)
 n=v.t(w,7)
 m=q==null?C.xD:q()
-J.bi(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"$0","jc",0,0,null]}},
+J.wT(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z}}},
 nI:{
-"^":"Tp:126;",
-$0:[function(){return H.VM([],[P.D4])},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return H.VM([],[P.D4])},
 $isEH:true},
 jU:{
 "^":"a;",
@@ -3311,12 +3301,12 @@
 Lj:{
 "^":"jU;MA",
 gOO:function(){return"Isolate"},
-gcZ:function(){var z=$.Cm().gvU().nb
+gcZ:function(){var z=$.Cm().gvU().Fb
 return z.gUQ(z).XG(0,new H.mb())},
 $isQF:true},
 mb:{
-"^":"Tp:355;",
-$1:[function(a){return a.gGD()},"$1",null,2,0,null,354,[],"call"],
+"^":"Tp:132;",
+$1:function(a){return a.gGD()},
 $isEH:true},
 amu:{
 "^":"jU;If<",
@@ -3356,7 +3346,7 @@
 $isNL:true,
 $isQF:true},
 Uz:{
-"^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
+"^":"uh;FP<,aP,wP,le,LB,GD<,ae,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
 gOO:function(){return"LibraryMirror"},
 gUx:function(a){return this.If},
 gEO:function(){return this.gm8()},
@@ -3367,11 +3357,11 @@
 for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
 if(!!J.x(x).$isMs){x=x.gJi()
 if(!!x.$isWf){y.u(0,x.If,x)
-x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
+x.jE=this}}}z=H.VM(new P.Oh(y),[P.wv,P.Ms])
 this.P8=z
 return z},
 rN:function(a){var z,y
-z=this.gQH().nb.t(0,a)
+z=this.gQH().Fb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
 if(!J.x(z).$isRS)return H.vn(z.IB(this))
 if(z.glT())return H.vn(z.IB(this))
@@ -3379,7 +3369,7 @@
 if(y==null)throw H.b(P.SY(null))
 return H.vn(y())},
 F2:function(a,b,c){var z,y,x
-z=this.gQH().nb.t(0,a)
+z=this.gQH().Fb.t(0,a)
 y=!!J.x(z).$isZk
 if(y&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
 if(z!=null)x=y&&z.hB
@@ -3405,7 +3395,7 @@
 if(r==null||!!s.$getterStub)break c$0
 q=J.rY(r).nC(r,"new ")
 if(q){u=C.xB.yn(r,4)
-r=H.ys(u,"$",".")}p=H.Sd(r,s,!q,q)
+r=H.ys(u,"$",".")}p=H.S5(r,s,!q,q)
 y.push(p)
 p.jE=this}++v}this.SD=y
 return y},
@@ -3421,17 +3411,17 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gm8(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RS])
+if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RS])
 this.mX=z
 return z},
 gF4:function(){var z=this.T1
 if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
 this.T1=z
 return z},
 gM1:function(){var z=this.fX
 if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
 this.fX=z
 return z},
 gcc:function(){var z,y,x
@@ -3439,7 +3429,7 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z,y
@@ -3449,19 +3439,19 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 z=new H.IB(y)
-this.gQn().nb.aN(0,z)
-this.gF4().nb.aN(0,z)
-this.gM1().nb.aN(0,z)
-this.gcc().nb.aN(0,z)
-z=H.VM(new H.Oh(y),[P.wv,P.QF])
+this.gQn().Fb.aN(0,z)
+this.gF4().Fb.aN(0,z)
+this.gM1().Fb.aN(0,z)
+this.gcc().Fb.aN(0,z)
+z=H.VM(new P.Oh(y),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
 z=this.Db
 if(z!=null)return z
 y=P.L5(null,null,null,P.wv,P.NL)
-this.gQH().nb.aN(0,new H.oP(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+this.gQH().Fb.aN(0,new H.oP(y))
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 gc9:function(){var z=this.xO
@@ -3477,16 +3467,16 @@
 "^":"amu+M2;",
 $isQF:true},
 IB:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 oP:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 YX:{
-"^":"Tp:126;a",
-$0:[function(){return this.a},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return this.a},
 $isEH:true},
 BI:{
 "^":"Un;AY<,XW,BB,i1,If",
@@ -3521,7 +3511,9 @@
 $isQF:true},
 iu:{
 "^":"M2;Ax<,xq",
-gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
+gt5:function(a){var z=this.Ax
+if(z==null)return P.re(C.Qf)
+return H.jO(H.dJ(z))},
 F2:function(a,b,c){return this.tu(a,0,b,c==null?C.CM:c)},
 CI:function(a,b){return this.F2(a,b,null)},
 Z7:function(a,b,c){var z,y,x,w,v,u,t,s
@@ -3615,12 +3607,12 @@
 $isvr:true,
 $isQF:true},
 vo:{
-"^":"Tp:357;a",
-$2:[function(a,b){var z,y
+"^":"Tp:134;a",
+$2:function(a,b){var z,y
 z=J.GL(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"$2",null,4,0,null,146,[],30,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},
 $isEH:true},
 bl:{
 "^":"amu;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,yF,If",
@@ -3654,7 +3646,7 @@
 return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
 this.b0=z
 return z},
 gcc:function(){var z,y,x
@@ -3662,12 +3654,12 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.NK.ws(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z=this.uA
 if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
+z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3677,7 +3669,7 @@
 y.FV(0,this.gQH())
 y.FV(0,this.gEz())
 J.kH(this.NK.gNy(),new H.Ax(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 rN:function(a){return this.NK.rN(a)},
@@ -3708,40 +3700,37 @@
 $isX9:true,
 $isNL:true},
 tB:{
-"^":"Tp:32;a",
-$1:[function(a){var z,y,x
+"^":"Tp:8;a",
+$1:function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,358,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},
 $isEH:true},
 Oo:{
-"^":"Tp:115;",
-$1:[function(a){return-1},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return-1},
 $isEH:true},
 Tc:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b.$1(a)},"$1",null,2,0,null,95,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){return this.b.$1(a)},
 $isEH:true},
 Ax:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,359,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){this.a.u(0,a.gIf(),a)
+return a},
 $isEH:true},
 Wf:{
-"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
+"^":"vk;Cr<,aB<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
 gOO:function(){return"ClassMirror"},
-gaB:function(){var z=this.Tx
-if(H.SG(z))return z.constructor
-else return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
 this.b0=z
 return z},
 ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.gaB().prototype
+z=this.aB.prototype
 y=H.kU(z)
 x=H.VM([],[H.Zk])
 for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){v=w.lo
@@ -3750,18 +3739,18 @@
 if(u==null)continue
 t=z[v]
 if(t.$reflectable==2)continue
-s=H.Sd(u,t,!1,!1)
+s=H.S5(u,t,!1,!1)
 x.push(s)
 s.jE=a}y=H.kU(init.statics[this.Cr])
 for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){r=w.lo
 if(H.Y6(r))continue
-q=this.gXP().gae()[r]
+q=this.gXP().ae[r]
 if("$reflectable" in q){p=q.$reflectionName
 if(p==null)continue
 o=C.xB.nC(p,"new ")
 if(o){n=C.xB.yn(p,4)
 p=H.ys(n,"$",".")}}else continue
-s=H.Sd(p,q,!o,o)
+s=H.S5(p,q,!o,o)
 x.push(s)
 s.jE=a}return x},
 gEO:function(){var z=this.qu
@@ -3787,12 +3776,12 @@
 return z},
 ghp:function(){var z=this.FU
 if(z!=null)return z
-z=H.VM(new H.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
 this.FU=z
 return z},
 gF4:function(){var z=this.T1
 if(z!=null)return z
-z=H.VM(new H.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
 this.T1=z
 return z},
 gcc:function(){var z,y,x
@@ -3800,12 +3789,12 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z=this.uA
 if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
+z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3813,41 +3802,41 @@
 if(z!=null)return z
 y=P.L5(null,null,null,P.wv,P.NL)
 z=new H.Ei(y)
-this.gQH().nb.aN(0,z)
-this.gEz().nb.aN(0,z)
+this.gQH().Fb.aN(0,z)
+this.gEz().Fb.aN(0,z)
 J.kH(this.gNy(),new H.Ci(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 Ve:function(a){var z,y
-z=this.gcc().nb.t(0,a)
+z=this.gcc().Fb.t(0,a)
 if(z!=null)return z.gFo()
-y=this.gF4().nb.t(0,a)
+y=this.gF4().Fb.t(0,a)
 return y!=null&&y.gFo()},
 rN:function(a){var z,y,x,w
-z=this.gcc().nb.t(0,a)
+z=this.gcc().Fb.t(0,a)
 if(z!=null&&z.gFo()){y=z.gcK()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}x=this.gF4().nb.t(0,a)
+else return H.vn($[y])}x=this.gF4().Fb.t(0,a)
 if(x!=null&&x.gFo())return H.vn(x.jd(C.xD,C.CM))
-w=this.ghp().nb.t(0,a)
+w=this.ghp().Fb.t(0,a)
 if(w!=null&&w.gFo()){x=w.gdl().$getter
 if(x==null)throw H.b(P.SY(null))
 return H.vn(x())}throw H.b(P.lr(this,a,null,null,null))},
 gXP:function(){var z,y
 z=this.jE
-if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
-else{z=$.vK()
+if(z==null){z=$.vK()
 z=z.gUQ(z)
 y=new H.MH(null,J.GP(z.l6),z.T6)
 y.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.jE
+for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()
+z=this.jE
 if(z==null)throw H.b(P.w("Class \""+H.d(H.TS(this.If))+"\" has no owner"))}return z},
 gc9:function(){var z=this.xO
 if(z!=null)return z
 z=this.le
-if(z==null){z=H.pj(this.gaB().prototype)
+if(z==null){z=H.pj(this.aB.prototype)
 this.le=z}z=H.VM(new P.Yp(J.kl(z,H.Yf())),[P.vr])
 this.xO=z
 return z},
@@ -3867,7 +3856,7 @@
 this.qN=z}else{z=x.n(w,"")?this:H.jO(w)
 this.qN=z}}}return J.de(z,this)?null:this.qN},
 F2:function(a,b,c){var z,y
-z=this.ghp().nb.t(0,a)
+z=this.ghp().Fb.t(0,a)
 y=z==null
 if(y&&this.Ve(a))return this.rN(a).F2(C.Ka,b,c)
 if(y||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
@@ -3889,7 +3878,7 @@
 z=this.UF
 if(z!=null)return z
 y=[]
-x=this.gaB().prototype["<>"]
+x=this.aB.prototype["<>"]
 if(x==null)return y
 for(w=0;w<x.length;++w){z=x[w]
 v=init.metadata[z]
@@ -3908,17 +3897,17 @@
 "^":"EE+M2;",
 $isQF:true},
 Ei:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 Ci:{
-"^":"Tp:115;b",
-$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,359,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){this.b.u(0,a.gIf(),a)
+return a},
 $isEH:true},
 t0:{
-"^":"Tp:360;a",
-$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:136;a",
+$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
 $isEH:true},
 XJ:{
 "^":"amu;cK<,V5>,Fo<,n6,jE,Ay>,le,If",
@@ -3957,10 +3946,10 @@
 v.$builtinTypeInfo=[H.Kp(y,0)]
 for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
 break}}if(1>=z.length)return H.e(z,1)
-return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
-return 0},"$1","Na",2,0,null,154,[]]}},
+return 0}}},
 Sz:{
 "^":"iu;Ax,xq",
 gMj:function(a){var z,y,x,w,v,u,t,s
@@ -3976,7 +3965,7 @@
 H.eZ(y)
 t=$.bx().t(0,w.gRA(y))
 if(t==null)H.Hz(t)
-s=H.Sd(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
+s=H.S5(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
 y.constructor[z]=s
 return s},
 bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
@@ -4003,8 +3992,8 @@
 v=H.zh(z)
 if(v!=null){u=v.AM
 if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
-else{z=this.gXP()
-t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
+else t=this.gXP()!=null&&!!J.x(this.gXP()).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gaB()),null,null,null,this.jE)
+if(this.xV)this.wM=this.jE
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.Rv,q=v.Rn,p=v.hG,o=0;z.G();o=h){n=z.lo
@@ -4029,7 +4018,7 @@
 $isRS:true,
 $isNL:true,
 $isQF:true,
-static:{Sd:function(a,b,c,d){var z,y,x,w,v,u,t
+static:{S5:function(a,b,c,d){var z,y,x,w,v,u,t
 z=a.split(":")
 if(0>=z.length)return H.e(z,0)
 a=z[0]
@@ -4056,8 +4045,8 @@
 $isNL:true,
 $isQF:true},
 wt:{
-"^":"Tp:361;",
-$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:137;",
+$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
 $isEH:true},
 ng:{
 "^":"amu;Cr<,CM,If",
@@ -4112,19 +4101,22 @@
 y.push(new H.fu(this,z.named[u],!1,!1,null,C.iH,H.YC(u)))}z=H.VM(new P.Yp(y),[P.Ys])
 this.zM=z
 return z},
+Hu:function(a){var z=init.mangledGlobalNames[a]
+if(z!=null)return z
+return a},
 bu:function(a){var z,y,x,w,v,u
 z=this.o3
 if(z!=null)return z
 z=this.d9
 if("args" in z)for(y=z.args,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x="FunctionTypeMirror on '(",w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}else{x="FunctionTypeMirror on '("
+x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}else{x="FunctionTypeMirror on '("
 w=""}if("opt" in z){x+=w+"["
 for(y=z.opt,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}x+="]"}if("named" in z){x+=w+"{"
+x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}x+="]"}if("named" in z){x+=w+"{"
 for(y=H.kU(z.named),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){u=y.lo
-x=C.xB.g(x+w+(H.d(u)+": "),H.Ko(z.named[u],null))}x+="}"}x+=") -> "
+x=C.xB.g(x+w+(H.d(u)+": "),this.Hu(H.Ko(z.named[u],null)))}x+="}"}x+=") -> "
 if(!!z.void)x+="void"
-else x="ret" in z?C.xB.g(x,H.Ko(z.ret,null)):x+"dynamic"
+else x="ret" in z?C.xB.g(x,this.Hu(H.Ko(z.ret,null))):x+"dynamic"
 z=x+"'"
 this.o3=z
 return z},
@@ -4136,170 +4128,151 @@
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:362;a",
-$1:[function(a){var z,y,x
+"^":"Tp:138;a",
+$1:function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
 x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"$1",null,2,0,null,15,[],"call"],
+return J.UQ(y.a.gw8(),x)},
 $isEH:true},
 iW:{
-"^":"Tp:120;b",
-$1:[function(a){var z,y
+"^":"Tp:18;b",
+$1:function(a){var z,y
 z=this.b.$1(a)
 y=J.x(z)
 if(!!y.$iscw)return H.d(z.Nz)
 if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
 else if(y.n(z,$.oj()))return"void"
 else return"dynamic"
-return z.gCr()},"$1",null,2,0,null,15,[],"call"],
+return z.gCr()},
 $isEH:true},
 ye:{
-"^":"Tp:361;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:137;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:361;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
-$isEH:true},
-Oh:{
-"^":"a;nb",
-gB:function(a){return this.nb.X5},
-gl0:function(a){return this.nb.X5===0},
-gor:function(a){return this.nb.X5!==0},
-t:function(a,b){return this.nb.t(0,b)},
-x4:function(a){return this.nb.x4(a)},
-di:function(a){return this.nb.di(a)},
-aN:function(a,b){return this.nb.aN(0,b)},
-gvc:function(){var z=this.nb
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gUQ:function(a){var z=this.nb
-return z.gUQ(z)},
-u:function(a,b,c){return H.kT()},
-FV:function(a,b){return H.kT()},
-Rz:function(a,b){H.kT()},
-V1:function(a){return H.kT()},
-$isZ0:true,
-static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lY",0,0,null]}}}],["dart._js_names","dart:_js_names",,H,{
+"^":"Tp:137;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
+$isEH:true}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
-hY:[function(a,b){var z,y,x,w,v,u,t
+hY:function(a,b){var z,y,x,w,v,u,t
 z=H.kU(a)
-y=P.Fl(J.O,J.O)
+y=P.Fl(P.qU,P.qU)
 for(x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),w=!b;x.G();){v=x.lo
 u=a[v]
 y.u(0,v,u)
 if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"$2","BH",4,0,null,160,[],161,[]],
-YK:[function(a){var z=P.Fl(J.O,J.O)
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},
+YK:function(a){var z=P.Fl(P.qU,P.qU)
 a.aN(0,new H.Xh(z))
-return z},"$1","OX",2,0,null,162,[]],
-kU:[function(a){var z=H.VM(function(b,c){var y=[]
+return z},
+kU:function(a){var z=H.VM(function(b,c){var y=[]
 for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z},"$1","DF",2,0,null,158,[]],
+return z},
 Xh:{
-"^":"Tp:364;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],363,[],"call"],
+"^":"Tp:139;a",
+$2:function(a,b){this.a.u(0,b,a)},
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
-Oj:[function(){if($.jk().scheduleImmediate!=null)return P.Sx()
-return P.K7()},"$0","n9",0,0,null],
+Oj:function(){if($.jk().scheduleImmediate!=null)return P.Sx()
+return P.K7()},
 ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,163,164,[]],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,163,164,[]],
-VH:[function(a,b){var z=H.N7()
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,25],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,25],
+VH:function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
-else return b.cR(a)},"$2","zZ",4,0,null,165,[],166,[]],
+else return b.cR(a)},
 e4:function(a,b){var z=P.Dt(b)
 P.rT(C.ny,new P.ZC(a,z))
 return z},
-Cx:[function(){var z=$.S6
+Cx:function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
-$.S6=z}$.k8=null},"$0","BN",0,0,null],
+$.S6=z}$.k8=null},
 BG:[function(){var z
 try{P.Cx()}catch(z){H.Ru(z)
 $.ej().$1(P.qZ())
 $.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,125],
-IA:[function(a){var z,y
+throw z}},"$0","qZ",0,0,21],
+IA:function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
 $.k8=z
 $.S6=z
 $.ej().$1(P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"$1","e6",2,0,null,164,[]],
-rb:[function(a){var z
+$.k8=y}},
+rb:function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,164,[]],
+z.wr(z.xi(a,!0))},
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v
+ot:function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.$0()
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-$.X3.hk(y,x)}},"$1","DC",2,0,null,168,[]],
-YE:[function(a){},"$1","bZ",2,0,169,30,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,170,85,171,[],172,[]],
-dL:[function(){},"$0","v3",0,0,125],
-FE:[function(a,b,c){var z,y,x,w
+$.X3.hk(y,x)}},
+YE:[function(a){},"$1","bZ",2,0,26,27,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,28,29,30,[],31,[]],
+dL:[function(){},"$0","v3",0,0,21],
+FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.$2(z,y)}},"$3","CV",6,0,null,173,[],174,[],175,[]],
-NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"$4","QD",8,0,null,176,[],177,[],171,[],172,[]],
-TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,176,[],177,[]],
-Bb:[function(a,b,c){a.ed()
-b.rX(c)},"$3","E1",6,0,null,176,[],177,[],30,[]],
+c.$2(z,y)}},
+NX:function(a,b,c,d){a.ed()
+b.K5(c,d)},
+TB:function(a,b){return new P.uR(a,b)},
+Bb:function(a,b,c){a.ed()
+b.rX(c)},
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
-jL:[function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},"$2","et",4,0,null,178,[],164,[]],
-PJ:[function(a){var z=$.X3
+jL:function(a,b){var z=a.gVs()
+return H.cy(z<0?0:z,b)},
+PJ:function(a){var z=$.X3
 $.X3=a
-return z},"$1","kb",2,0,null,166,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","xP",10,0,179,180,[],181,[],166,[],171,[],172,[]],
+return z},
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","xP",10,0,32,33,[],34,[],35,[],30,[],31,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.$0()
 z=P.PJ(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","AI",8,0,182,180,[],181,[],166,[],128,[]],
+return y}finally{$.X3=z}},"$4","AI",8,0,36,33,[],34,[],35,[],37,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.$1(e)
 z=P.PJ(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,183,180,[],181,[],166,[],128,[],184,[]],
+return y}finally{$.X3=z}},"$5","MM",10,0,38,33,[],34,[],35,[],37,[],39,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.$2(e,f)
 z=P.PJ(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","l4",12,0,185,180,[],181,[],166,[],128,[],60,[],61,[]],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,186,180,[],181,[],166,[],128,[]],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,187,180,[],181,[],166,[],128,[]],
-VI:[function(a,b,c,d){return d},"$4","uu",8,0,188,180,[],181,[],166,[],128,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,189,180,[],181,[],166,[],128,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,190,180,[],181,[],166,[],178,[],164,[]],
-XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,191,180,[],181,[],166,[],192,[]],
-CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,193,192,[]],
+return y}finally{$.X3=z}},"$6","l4",12,0,40,33,[],34,[],35,[],37,[],12,[],13,[]],
+Ee:[function(a,b,c,d){return d},"$4","EU",8,0,41,33,[],34,[],35,[],37,[]],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,42,33,[],34,[],35,[],37,[]],
+VI:[function(a,b,c,d){return d},"$4","uu",8,0,43,33,[],34,[],35,[],37,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,44],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,45,33,[],34,[],35,[],46,[],47,[]],
+XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,48],
+CI:[function(a){J.O2($.X3,a)},"$1","jt",2,0,49],
 UA:[function(a,b,c,d,e){var z
-$.oK=P.Ib()
+$.oK=P.jt()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","hn",10,0,194,180,[],181,[],166,[],195,[],196,[]],
+return new P.uo(c,d,z)},"$5","hn",10,0,50],
 C6:{
-"^":"Tp:126;a",
+"^":"Tp:22;a",
 $0:[function(){H.ox()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -4326,9 +4299,9 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,125],
-LP:[function(){},"$0","gZ9",0,0,125],
-static:{"^":"FJ,RG,cP"}},
+uO:[function(){},"$0","gp4",0,0,21],
+LP:[function(){},"$0","gZ9",0,0,21],
+static:{"^":"E2b,RG,cP"}},
 WVu:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
@@ -4352,9 +4325,9 @@
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},248,[]],
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},140,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,365,85,171,[],172,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,141,29,30,[],31,[]],
 cO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -4406,19 +4379,19 @@
 else this.Ip.OH(null)}},
 tK:{
 "^":"Tp;a,b",
-$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.Rg(0,this.b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.V8(this.b,this.c)},
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-$1:[function(a){a.Qj()},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.Qj()},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"m6",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"WhE",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:function(a){var z,y
@@ -4434,25 +4407,25 @@
 "^":"a;",
 $isb8:true},
 ZC:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ia:{
+Pf0:{
 "^":"a;"},
 Zf:{
-"^":"Ia;MM",
+"^":"Pf0;MM",
 oo:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,366,85,30,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,142,29,27,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,365,85,171,[],172,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,141,29,30,[],31,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -4509,7 +4482,7 @@
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,170,85,171,[],172,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,28,29,30,[],31,[]],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
@@ -4530,15 +4503,15 @@
 z.L7(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
-return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"$2","KP",4,0,null,33,[],82,[]],A9:[function(a,b){b.swG(!0)
+return z},k3:function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},A9:function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"$2","dd",4,0,null,33,[],82,[]],yE:[function(a,b){var z
+else a.au(b)},yE:function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"$2","cN",4,0,null,33,[],167,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -4576,44 +4549,44 @@
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=q}},"$2","XX",4,0,null,33,[],167,[]]}},
+b=q}}}},
 da:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,30,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,27,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:367;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+"^":"Tp:143;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
 $isEH:true},
 rH:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cX:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:126;a,b,c",
+"^":"Tp:22;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:348;b,d,e,f",
-$0:[function(){var z,y,x,w
+"^":"Tp:126;b,d,e,f",
+$0:function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 this.b.c=new P.Ca(z,y)
-return!1}},"$0",null,0,0,null,"call"],
+return!1}},
 $isEH:true},
 RW:{
-"^":"Tp:125;c,b,UI,bK",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+"^":"Tp:21;c,b,UI,bK",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
 y=r.gyK()
@@ -4645,11 +4618,11 @@
 r.b=!1
 return}this.b.b=!0}else{r=this.b
 r.c=z
-r.b=!1}},"$0",null,0,0,null,"call"],
+r.b=!1}},
 $isEH:true},
 RT:{
-"^":"Tp:125;c,b,Gq,Rm,w3",
-$0:[function(){var z,y,x,w,v,u
+"^":"Tp:21;c,b,Gq,Rm,w3",
+$0:function(){var z,y,x,w,v,u
 z={}
 z.a=null
 try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
@@ -4665,31 +4638,32 @@
 u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
 v.swG(!0)
 this.b.d=!0
-z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"$0",null,0,0,null,"call"],
+z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
 $isEH:true},
 jZ:{
-"^":"Tp:115;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,368,[],"call"],
+"^":"Tp:16;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,144,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:367;a,mG",
+"^":"Tp:143;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},369,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")}],
+Ft:[function(a,b){return H.VM(new P.aW(b,this),[H.ip(this,"qh",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.qh,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"qh")}],
 tg:function(a,b){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gaq())
+z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.YJ(y),y.gaq())
 return y},
 aN:function(a,b){var z,y
 z={}
@@ -4699,25 +4673,25 @@
 return y},
 Vr:function(a,b){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
 z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gaq())
 return y},
 gB:function(a){var z,y
 z={}
-y=P.Dt(J.bU)
+y=P.Dt(P.KN)
 z.a=0
 this.KR(new P.B5(z),!0,new P.PI(z,y),y.gaq())
 return y},
 gl0:function(a){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
 z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gaq())
 return y},
 br:function(a){var z,y
 z=H.VM([],[H.ip(this,"qh",0)])
-y=P.Dt([J.Q,H.ip(this,"qh",0)])
+y=P.Dt([P.zM,H.ip(this,"qh",0)])
 this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gaq())
 return y},
 qZ:function(a,b){var z=H.VM(new P.Zz(b,this),[null])
@@ -4748,41 +4722,41 @@
 z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gaq())
 return y},
 $isqh:true},
-YJ:{
+Sd:{
 "^":"Tp;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.jv(this.c,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 jv:{
-"^":"Tp:126;e,f",
-$0:[function(){return J.de(this.f,this.e)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return J.de(this.f,this.e)},
 $isEH:true},
-LB:{
-"^":"Tp:349;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
+bi:{
+"^":"Tp:127;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-DO:{
-"^":"Tp:126;bK",
+YJ:{
+"^":"Tp:22;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Tp;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,142,[],"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,145,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Rl:{
-"^":"Tp:126;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return this.e.$1(this.f)},
 $isEH:true},
 Jb:{
-"^":"Tp:115;",
-$1:[function(a){},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){},
 $isEH:true},
 M4:{
-"^":"Tp:126;UI",
+"^":"Tp:22;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Jp:{
@@ -4790,64 +4764,64 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 h7:{
-"^":"Tp:126;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return this.e.$1(this.f)},
 $isEH:true},
 pr:{
-"^":"Tp:349;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
+"^":"Tp:127;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 eN:{
-"^":"Tp:126;bK",
+"^":"Tp:22;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 B5:{
-"^":"Tp:115;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 PI:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 j4:{
-"^":"Tp:115;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 i9:{
-"^":"Tp:126;c",
+"^":"Tp:22;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 VV:{
 "^":"Tp;a,b",
-$1:[function(a){this.b.push(a)},"$1",null,2,0,null,248,[],"call"],
+$1:[function(a){this.b.push(a)},"$1",null,2,0,null,140,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
 Dy:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
 $0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,30,[],"call"],
+$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
-"^":"Tp:126;d",
+"^":"Tp:22;d",
 $0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,30,[],"call"],
+z.a=a},"$1",null,2,0,null,27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
-"^":"Tp:126;a,c",
+"^":"Tp:22;a,c",
 $0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
@@ -4856,11 +4830,11 @@
 "^":"Tp;a,b,c",
 $1:[function(a){var z=this.a
 if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,30,[],"call"],
+return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ii:{
-"^":"Tp:126;a,d",
+"^":"Tp:22;a,d",
 $0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
 $isEH:true},
 MO:{
@@ -4893,8 +4867,8 @@
 yU:{
 "^":"KA;Y8<",
 tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8()},"$0","gp4",0,0,125],
-LP:[function(){this.gY8()},"$0","gZ9",0,0,125]},
+uO:[function(){this.gY8()},"$0","gp4",0,0,21],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,21]},
 nP:{
 "^":"a;"},
 KA:{
@@ -4946,8 +4920,8 @@
 this.Gv=z
 if(z<32)this.SY()
 else this.w6(C.Wj)},
-uO:[function(){},"$0","gp4",0,0,125],
-LP:[function(){},"$0","gZ9",0,0,125],
+uO:[function(){},"$0","gp4",0,0,21],
+LP:[function(){},"$0","gZ9",0,0,21],
 tA:function(){},
 w6:function(a){var z,y
 z=this.Ri
@@ -4994,10 +4968,10 @@
 z=(this.Gv&4294967263)>>>0
 this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},
 $isMO:true,
-static:{"^":"ry,bG,Q9,wd,yJ,Dr,HX,GC,bsZ"}},
+static:{"^":"ry,bG,Q9,wd,yJ,lk,HX,GC,bsZ"}},
 Vo:{
-"^":"Tp:125;a,b,c",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:21;a,b,c",
+$0:function(){var z,y,x,w,v,u
 z=this.a
 y=z.Gv
 if((y&8)!==0&&(y&16)===0)return
@@ -5007,19 +4981,20 @@
 else{x=z.o7
 w=H.N7()
 w=H.KT(w,[w,w]).BD(x)
-v=this.b
-if(w)y.z8(x,v,this.c)
-else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+v=z.o7
+u=this.b
+if(w)y.z8(v,u,this.c)
+else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
 qB:{
-"^":"Tp:125;a",
-$0:[function(){var z,y
+"^":"Tp:21;a",
+$0:function(){var z,y
 z=this.a
 y=z.Gv
 if((y&16)===0)return
 z.Gv=(y|42)>>>0
 z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
 aN:{
 "^":"qh;",
@@ -5057,7 +5032,7 @@
 return}P.rb(new P.CR(this,a))
 this.Gv=1}},
 CR:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -5082,16 +5057,16 @@
 this.N6=null
 this.zR=null}},
 v1y:{
-"^":"Tp:126;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,b,c",
+$0:function(){return this.a.K5(this.b,this.c)},
 $isEH:true},
 uR:{
-"^":"Tp:371;a,b",
-$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,171,[],172,[],"call"],
+"^":"Tp:146;a,b",
+$2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
-Q0:{
-"^":"Tp:126;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
+vm:{
+"^":"Tp:22;a,b",
+$0:function(){return this.a.rX(this.b)},
 $isEH:true},
 YR:{
 "^":"qh;",
@@ -5119,16 +5094,16 @@
 P.KA.prototype.V8.call(this,a,b)},
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,125],
+z.yy(0)},"$0","gp4",0,0,21],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,125],
+z.QE(0)},"$0","gZ9",0,0,21],
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},248,[]],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,372,171,[],172,[]],
-nn:[function(){this.Qj()},"$0","gH1",0,0,125],
+vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},140,[]],
+xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,147,30,[],31,[]],
+nn:[function(){this.Qj()},"$0","gH1",0,0,21],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -5157,6 +5132,15 @@
 x=new H.XO(w,null)
 b.V8(y,x)
 return}J.QM(b,z)}},
+aW:{
+"^":"YR;pK,Sb",
+GW:function(a){return this.pK.$1(a)},
+Ml:function(a,b){var z,y,x,w,v
+try{for(w=J.GP(this.GW(a));w.G();){z=w.gl()
+J.QM(b,z)}}catch(v){w=H.Ru(v)
+y=w
+x=new H.XO(v,null)
+b.V8(y,x)}}},
 Zz:{
 "^":"YR;Em,Sb",
 Ml:function(a,b){var z
@@ -5199,52 +5183,45 @@
 Id:{
 "^":"a;oh",
 gLj:function(){return this.oh},
-c1:function(a,b,c){var z,y
+c1:function(a,b,c){var z=this.oh
+for(;z.gWY().gE2()==null;)z=z.geT(z)
+return z.gWY().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
+Vn:function(a,b){var z=this.oh
+for(;z.gWY().gcP()==null;)z=z.geT(z)
+return z.gWY().gcP().$4(z,new P.Id(z.geT(z)),a,b)},
+qG:function(a,b,c){var z=this.oh
+for(;z.gWY().gJl()==null;)z=z.geT(z)
+return z.gWY().gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
+nA:function(a,b,c,d){var z=this.oh
+for(;z.gWY().gpU()==null;)z=z.geT(z)
+return z.gWY().gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
+TE:function(a,b){var z=this.oh
+for(;z.gWY().gFh()==null;)z=z.geT(z)
+return z.gWY().gFh().$4(z,new P.Id(z.geT(z)),a,b)},
+V6:function(a,b){var z=this.oh
+for(;z.gWY().gXp()==null;)z=z.geT(z)
+return z.gWY().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
+mz:function(a,b){var z=this.oh
+for(;z.gWY().gfb()==null;)z=z.geT(z)
+return z.gWY().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
+RK:function(a,b){var z,y
 z=this.oh
-for(;y=z.gWY(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().$4(z,new P.Id(z.geT(z)),a,b)},
-qG:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gFh(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gXp(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gfb(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-RK:function(a,b){var z,y,x
-z=this.oh
-for(;y=z.gWY(),y.grb()==null;)z=z.geT(z)
-x=z.geT(z)
-y.grb().$4(z,new P.Id(x),a,b)},
-dJ:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
+for(;z.gWY().grb()==null;)z=z.geT(z)
+y=z.geT(z)
+z.gWY().grb().$4(z,new P.Id(y),a,b)},
+dJ:function(a,b,c){var z=this.oh
+for(;z.gWY().gZq()==null;)z=z.geT(z)
+return z.gWY().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
 RB:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gWY(),y.gJS(y)==null;)z=z.geT(z)
+y=z.gWY()
 y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y,x
+ld:function(a,b,c){var z,y
 z=this.oh
-for(;y=z.gWY(),y.giq()==null;)z=z.geT(z)
-x=z.geT(z)
-return y.giq().$5(z,new P.Id(x),a,b,c)}},
+for(;z.gWY().giq()==null;)z=z.geT(z)
+y=z.geT(z)
+return z.gWY().giq().$5(z,new P.Id(y),a,b,c)}},
 WH:{
 "^":"a;",
 fC:function(a){return this.gC5()===a.gC5()},
@@ -5277,28 +5254,28 @@
 if(b)return new P.dv(this,z)
 else return new P.ph(this,z)}},
 TF:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,39,[],"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:115;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Tp:16;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,39,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
+"^":"Tp:75;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
 $isEH:true},
 ph:{
-"^":"Tp:300;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
+"^":"Tp:75;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
 $isEH:true},
 uo:{
 "^":"WH;eT>,WY<,R1",
@@ -5321,24 +5298,24 @@
 uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
 Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
 pK:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:126;c,d",
-$0:[function(){var z,y
+"^":"Tp:22;c,d",
+$0:function(){var z,y
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
 y=this.d
 if(y==null&&!!J.x(z).$isGe)y=z.gI4()
 if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
-throw H.b(z)},"$0",null,0,0,null,"call"],
+throw H.b(z)},
 $isEH:true},
-Uez:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+rF:{
+"^":"Tp:75;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
 $isEH:true},
-AHi:{
+nU:{
 "^":"a;",
 gE2:function(){return P.xP()},
 hk:function(a,b){return this.gE2().$2(a,b)},
@@ -5386,12 +5363,12 @@
 "^":"",
 EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-jB:[function(){var z=Object.create(null)
+jB:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},"$0","A5",0,0,null],
-TQ:[function(a,b){return J.de(a,b)},"$2","S5",4,0,198,117,[],199,[]],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,200,117,[]],
+return z},
+TQ:[function(a,b){return J.de(a,b)},"$2","Jo",4,0,51],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,52,53,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -5399,15 +5376,15 @@
 return P.MP(a,b,c,d,e)},
 UD:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
 yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
-FO:[function(a){var z,y
+FO:function(a){var z,y
 if($.xb().tg(0,a))return"(...)"
 $.xb().h(0,a)
 z=[]
 try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
-return y.vM},"$1","Zw",2,0,null,127,[]],
-Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+return y.vM},
+Vr:function(a,b){var z,y,x,w,v,u,t,s,r,q
 z=a.gA(a)
 y=0
 x=0
@@ -5439,10 +5416,10 @@
 if(q==null){y+=5
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
-b.push(v)},"$2","zE",4,0,null,127,[],201,[]],
+b.push(v)},
 L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
 Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
-vW:[function(a){var z,y,x,w
+vW:function(a){var z,y,x,w
 z={}
 for(x=0;w=$.tw(),x<w.length;++x)if(w[x]===a)return"{...}"
 y=P.p9("")
@@ -5452,7 +5429,7 @@
 J.kH(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"$1","DH",2,0,null,202,[]],
+z.pop()}return y.gvM()},
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
@@ -5555,23 +5532,23 @@
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
 return-1},
 $isZ0:true,
-static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"$2","ME",4,0,null,197,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"$3","rn",6,0,null,197,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
+static:{vL:function(a,b){var z=a[b]
+return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},a0:function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
-return z},"$0","l1",0,0,null]}},
+return z}}},
 oi:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
 $isEH:true},
 ce:{
-"^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return J.de(this.a.t(0,a),this.b)},
 $isEH:true},
 DJ:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
@@ -5604,9 +5581,9 @@
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:115;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,121,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){var z=H.XY(a,this.a)
+return z},
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -5749,21 +5726,21 @@
 bu:function(a){return P.vW(this)},
 $isFo:true,
 $isZ0:true,
-static:{Qs:[function(){var z=Object.create(null)
+static:{Qs:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},"$0","Bs",0,0,null]}},
+return z}}},
 a1:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
 $isEH:true},
 ou:{
-"^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return J.de(this.a.t(0,a),this.b)},
 $isEH:true},
 S9:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 db:{
@@ -6035,10 +6012,10 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{T2:[function(){var z=Object.create(null)
+static:{T2:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},"$0","um",0,0,null]}},
+return z}}},
 ef:{
 "^":"a;Gc<,DG@,zQ@"},
 zQ:{
@@ -6073,8 +6050,9 @@
 $asQV:null},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")},128,[]],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")}],
 ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
+Ft:[function(a,b){return H.VM(new H.kV(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")}],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
 return!1},
@@ -6124,8 +6102,8 @@
 $asQV:null},
 ar:{
 "^":"a+lD;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -6164,7 +6142,8 @@
 z.We(a,b)
 return z.vM},
 ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")}],
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")}],
 eR:function(a,b){return H.q9(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -6232,7 +6211,7 @@
 if(J.de(y,0))return
 if(e<0)throw H.b(P.u(e))
 z=J.x(d)
-if(!!z.$isList){x=e
+if(!!z.$iszM){x=e
 w=d}else{w=z.eR(d,e).tt(0,!1)
 x=0}if(typeof y!=="number")return H.s(y)
 z=J.U6(w)
@@ -6281,7 +6260,7 @@
 this.Mh(a,b,c)},
 Mh:function(a,b,c){var z,y
 z=J.x(c)
-if(!!z.$isList){z=z.gB(c)
+if(!!z.$iszM){z=z.gB(c)
 if(typeof z!=="number")return H.s(z)
 this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
 this.u(a,b,z.gl())}},
@@ -6292,20 +6271,49 @@
 z.KF("[")
 z.We(a,", ")
 z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
+KPM:{
+"^":"a;",
+u:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
+FV:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+V1:function(a){throw H.b(P.f("Cannot modify unmodifiable map"))},
+Rz:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+$isZ0:true},
+Bk:{
+"^":"a;",
+t:function(a,b){return this.Fb.t(0,b)},
+u:function(a,b,c){this.Fb.u(0,b,c)},
+FV:function(a,b){this.Fb.FV(0,b)},
+V1:function(a){this.Fb.V1(0)},
+x4:function(a){return this.Fb.x4(a)},
+di:function(a){return this.Fb.di(a)},
+aN:function(a,b){this.Fb.aN(0,b)},
+gl0:function(a){return this.Fb.X5===0},
+gor:function(a){return this.Fb.X5!==0},
+gB:function(a){return this.Fb.X5},
+gvc:function(){var z=this.Fb
+return H.VM(new P.i5(z),[H.Kp(z,0)])},
+Rz:function(a,b){return this.Fb.Rz(0,b)},
+bu:function(a){return P.vW(this.Fb)},
+gUQ:function(a){var z=this.Fb
+return z.gUQ(z)},
+$isZ0:true},
+Oh:{
+"^":"Bk+KPM;Fb",
+$isZ0:true},
 LG:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,374,[],121,[],"call"],
+z.KF(b)},
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -6348,7 +6356,7 @@
 h:function(a,b){this.NZ(0,b)},
 FV:function(a,b){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
-if(!!z.$isList){y=z.gB(b)
+if(!!z.$iszM){y=z.gB(b)
 x=this.gB(this)
 if(typeof y!=="number")return H.s(y)
 z=x+y
@@ -6458,11 +6466,11 @@
 $asQV:null,
 static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
-return z},ua:[function(a){var z
+return z},ua:function(a){var z
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"$1","bD",2,0,null,203,[]]}},
+if(z===0)return a}}}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
@@ -6590,23 +6598,23 @@
 y=new P.An(c)
 return H.VM(new P.Nb(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:115;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,121,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){var z=H.XY(a,this.a)
+return z},
 $isEH:true},
 bF:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
 BW:{
-"^":"Tp:375;a,b,c",
-$1:[function(a){var z,y,x,w
+"^":"Tp:149;a,b,c",
+$1:function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.$1(w)===!0)return!0
-a=a.Bb}return!1},"$1",null,2,0,null,273,[],"call"],
+a=a.Bb}return!1},
 $isEH:true},
 S6B:{
 "^":"a;",
@@ -6667,23 +6675,23 @@
 Wb:function(a){return a},
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
-VQ:[function(a,b){var z=new P.JC()
-return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,204,[],205,[]],
-BS:[function(a,b){var z,y,x,w
+VQ:function(a,b){var z=new P.JC()
+return z.$2(null,new P.f1(z).$1(a))},
+BS:function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(P.u(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"$2","H4",4,0,null,33,[],205,[]],
-tp:[function(a){return a.Lt()},"$1","BC",2,0,206,6,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
+tp:[function(a){return a.Lt()},"$1","BC",2,0,54,55,[]],
 JC:{
-"^":"Tp:300;",
-$2:[function(a,b){return b},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return b},
 $isEH:true},
 f1:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Tp:16;a",
+$1:function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
 for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
@@ -6692,7 +6700,7 @@
 for(y=this.a,x=0;x<w.length;++x){u=w[x]
 v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
 if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},"$1",null,2,0,null,21,[],"call"],
+return v},
 $isEH:true},
 Uk:{
 "^":"a;"},
@@ -6700,7 +6708,7 @@
 "^":"a;"},
 Zi:{
 "^":"Uk;",
-$asUk:function(){return[J.O,[J.Q,J.bU]]}},
+$asUk:function(){return[P.qU,[P.zM,P.KN]]}},
 Ud:{
 "^":"Ge;Ct,FN",
 bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
@@ -6719,13 +6727,13 @@
 KP:function(a){return this.Co(a,null)},
 gZE:function(){return C.cb},
 gHe:function(){return C.A3},
-$asUk:function(){return[P.a,J.O]}},
-dI:{
+$asUk:function(){return[P.a,P.qU]}},
+ze:{
 "^":"zF;UM,Xi",
-$aszF:function(){return[P.a,J.O]}},
+$aszF:function(){return[P.a,P.qU]}},
 Cf:{
 "^":"zF;N5",
-$aszF:function(){return[J.O,P.a]}},
+$aszF:function(){return[P.qU,P.a]}},
 Sh:{
 "^":"a;iY,Vy,bV",
 Wt:function(a){return this.iY.$1(a)},
@@ -6800,7 +6808,7 @@
 this.aK(a)
 z.KF("\"")
 return!0}else{z=J.x(a)
-if(!!z.$isList){this.WD(a)
+if(!!z.$iszM){this.WD(a)
 y=this.Vy
 y.KF("[")
 if(J.z8(z.gB(a),0)){this.rl(z.t(a,0))
@@ -6824,26 +6832,26 @@
 Ei:function(a){var z=this.bV
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"P3,hyY,FC,zf,fc,fg,dH,bz,eJ,Ho,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:[function(a,b,c){var z
+static:{"^":"P3,hyY,FC,zf,fc,fg,Do,bz,eJ,MU,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:function(a,b,c){var z
 b=P.BC()
 z=P.p9("")
 P.uI(z,b,c).rl(a)
-return z.vM},"$3","nB",6,0,null,6,[],207,[],208,[]]}},
+return z.vM}}},
 z0:{
 "^":"Zi;lH",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
+gZE:function(){return new P.E3()}},
+E3:{
 "^":"zF;",
 WJ:function(a){var z,y,x
 z=J.U6(a)
 y=J.vX(z.gB(a),3)
 if(typeof y!=="number")return H.s(y)
-y=H.VM(Array(y),[J.bU])
+y=H.VM(Array(y),[P.KN])
 x=new P.Rw(0,0,y)
 if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
 return C.Nm.D6(y,0,x.ZP)},
-$aszF:function(){return[J.O,[J.Q,J.bU]]}},
+$aszF:function(){return[P.qU,[P.zM,P.KN]]}},
 Rw:{
 "^":"a;WF,ZP,EN",
 Lb:function(a,b){var z,y,x,w,v
@@ -6914,9 +6922,9 @@
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:[function(a){return},"$1","Ex",2,0,null,51,[]],
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,209,117,[],199,[]],
-hl:[function(a){var z,y,x,w,v
+Te:function(a){return},
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,56,53,[],57,[]],
+hl:function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
 z.vM="\""
@@ -6933,11 +6941,11 @@
 else{w=H.Lw(v)
 w=z.vM+=w}}y=w+"\""
 z.vM=y
-return y}return"Instance of '"+H.lh(a)+"'"},"$1","Zx",2,0,null,6,[]],
+return y}return"Instance of '"+H.lh(a)+"'"},
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,212,117,[],199,[]],
-NS:[function(a){return H.CU(a)},"$1","cE",2,0,213,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,214,85,85,33,[],34,[],175,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,58],
+NS:[function(a){return H.CU(a)},"$1","cE",2,0,59],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,60,29,29],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -6948,22 +6956,22 @@
 if(b)return z
 z.fixed$length=init
 return z},
-JS:[function(a){var z,y
+JS:function(a){var z,y
 z=H.d(a)
 y=$.oK
 if(y==null)H.qw(z)
-else y.$1(z)},"$1","Pl",2,0,null,6,[]],
+else y.$1(z)},
 HB:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"$2",null,4,0,null,146,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,a.gfN(a),b)},
 $isEH:true},
 CL:{
-"^":"Tp:357;a",
-$2:[function(a,b){var z=this.a
+"^":"Tp:134;a",
+$2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
 z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},"$2",null,4,0,null,49,[],30,[],"call"],
+z.a.KF(P.hl(b));++z.b},
 $isEH:true},
 p4:{
 "^":"a;OF",
@@ -6971,7 +6979,8 @@
 a2:{
 "^":"a;",
 bu:function(a){return this?"true":"false"},
-$isbool:true},
+$isa2:true},
+"+bool":0,
 Tx:{
 "^":"a;"},
 iP:{
@@ -6996,8 +7005,8 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
+static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
 if(1>=x.length)return H.e(x,1)
@@ -7030,28 +7039,32 @@
 if(typeof l!=="number")return H.s(l)
 s=J.xH(s,n*l)}k=!0}else k=!1
 j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,210,[]],Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
-return z},Gq:[function(a){var z,y
+return z},Gq:function(a){var z,y
 z=Math.abs(a)
 y=a<0?"-":""
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"$1","Cp",2,0,null,211,[]],Vx:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},Vx:function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"$1","Dv",2,0,null,211,[]],h0:[function(a){if(a>=10)return""+a
-return"0"+a},"$1","wI",2,0,null,211,[]]}},
+return"00"+a},h0:function(a){if(a>=10)return""+a
+return"0"+a}}},
 MF:{
-"^":"Tp:377;",
-$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"$1",null,2,0,null,376,[],"call"],
+"^":"Tp:150;",
+$1:function(a){if(a==null)return 0
+return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Tp:378;",
-$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"$1",null,2,0,null,376,[],"call"],
+"^":"Tp:151;",
+$1:function(a){if(a==null)return 0
+return H.IH(a,null)},
 $isEH:true},
+CP:{
+"^":"lf;",
+$isCP:true},
+"+double":0,
 a6:{
 "^":"a;Fq<",
 g:function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},
@@ -7080,20 +7093,20 @@
 v=new P.P7().$1(C.CD.JV(y,1000000))
 return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"Bk,S4d,pk,LoB,zj5,b2,jS,ll,Do,f4,vd,IJZ,iI,Wr,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"SF,S4d,pk,LoB,zj5,b2,jS,ll,DoM,f4,vd,IJ,iI,Wr,fm,yn",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:120;",
-$1:[function(a){if(a>=100000)return H.d(a)
+"^":"Tp:18;",
+$1:function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
 if(a>=100)return"000"+H.d(a)
 if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+return"00000"+H.d(a)},
 $isEH:true},
 DW:{
-"^":"Tp:120;",
-$1:[function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:18;",
+$1:function(a){if(a>=10)return H.d(a)
+return"0"+H.d(a)},
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -7196,31 +7209,51 @@
 EH:{
 "^":"a;",
 $isEH:true},
+KN:{
+"^":"lf;",
+$isKN:true},
+"+int":0,
 QV:{
 "^":"a;",
 $isQV:true,
 $asQV:null},
 AC:{
 "^":"a;"},
+zM:{
+"^":"a;",
+$iszM:true,
+$aszM:null,
+$isyN:true,
+$isQV:true,
+$asQV:null},
+"+List":0,
 Z0:{
 "^":"a;",
 $isZ0:true},
 L9:{
 "^":"a;",
 bu:function(a){return"null"}},
+"+Null":0,
+lf:{
+"^":"a;",
+$islf:true},
+"+num":0,
 a:{
 "^":";",
 n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
 bu:function(a){return H.a5(this)},
 T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
 "^":"a;",
 $isOd:true},
 MN:{
 "^":"a;"},
+qU:{
+"^":"a;",
+$isqU:true},
+"+String":0,
 WU:{
 "^":"a;Qk,SU,Oq,Wn",
 gl:function(){return this.Wn},
@@ -7228,14 +7261,11 @@
 z=this.Oq
 this.SU=z
 y=this.Qk
-x=J.U6(y)
-if(z===x.gB(y)){this.Wn=null
-return!1}w=x.j(y,this.SU)
+x=y.length
+if(z===x){this.Wn=null
+return!1}w=C.xB.j(y,z)
 v=this.SU+1
-if((w&64512)===55296){z=x.gB(y)
-if(typeof z!=="number")return H.s(z)
-z=v<z}else z=!1
-if(z){u=x.j(y,v)
+if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
 if((u&64512)===56320){this.Oq=v+1
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
 return!0}}this.Oq=v
@@ -7288,7 +7318,7 @@
 if(z&&!0)return""
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
+if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
 return y},
 Ky:function(a,b){if(a==="")return"/"+H.d(b)
 return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
@@ -7323,13 +7353,20 @@
 z.KF(y)}y=this.Ka
 if(""!==y){z.KF("#")
 z.KF(y)}return z.vM},
-n:function(a,b){var z,y
+n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isiD)return!1
-if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
+y=this.Fi
+x=b.Fi
+if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
 y=b.r0
-z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
+if(z==null?y==null:z===y){z=this.tP
+y=b.tP
+if(z==null?y==null:z===y){z=this.Ka
+y=b.Ka
+y=z==null?y==null:z===y
+z=y}else z=!1}else z=!1}else z=!1
 else z=!1
 else z=!1
 else z=!1
@@ -7341,7 +7378,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"n2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,Yk,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,za,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"n2,q7,tv,ux,vI,IE,fd,IL,yT,zk,yt,fC,O5,FsP,qf,ML,j3,r5,Yk,qs,Fm,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,za,fbQ",hK:function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -7398,17 +7435,17 @@
 a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
 x=J.Wx(i)
 a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,215,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+return P.R6(a0,c,b,null,z,a,null,g,e)},R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
 z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
 z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:[function(a){var z,y
+return z},L7:function(a){var z,y
 if(a.length===0)return a
 if(C.xB.j(a,0)===91){z=a.length-1
 if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
 P.eg(C.xB.Nj(a,1,z))
 return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
 if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},"$1","jC",2,0,null,216,[]],iy:[function(a){var z,y,x,w,v,u
+return"["+a+"]"}}return a},iy:function(a){var z,y,x,w,v,u
 z=new P.hb()
 if(a==null)return""
 y=a.length
@@ -7422,7 +7459,7 @@
 if(u>=8)return H.e(C.mK,u)
 u=(C.mK[u]&C.jn.W4(1,v&15))!==0}else u=!1
 if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,217,[]],LE:[function(a,b){var z,y,x
+x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -7431,7 +7468,8 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"$2","wF",4,0,null,218,[],219,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,220,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return x.vM},UJ:function(a){if(a==null)return""
+return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z={}
 y=J.U6(a).u8(a,"%")
 z.a=y
@@ -7470,11 +7508,11 @@
 r=m}else{z.a=t
 r=t}}if(z.b==null)return a
 if(z.c!==r)s.$0()
-return J.AG(z.b)},"$1","Sy",2,0,null,221,[]],q5:[function(a){var z,y
+return J.AG(z.b)},q5:function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,216,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},eg:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
@@ -7494,26 +7532,26 @@
 if(t>=J.q8(s))H.vh(P.N(t))
 if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
 w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
-J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
+J.wT(x,-1)
+u=!0}else J.wT(x,y.$2(w,t))
 w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
 q=J.de(w,J.q8(a))
 p=J.de(J.MQ(x),-1)
 if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
+if(!q)try{J.wT(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
 try{v=P.q5(J.ZZ(a,w))
-s=J.Eh(J.UQ(v,0),8)
+s=J.c1(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
-J.bi(x,(s|r)>>>0)
-r=J.Eh(J.UQ(v,2),8)
+J.wT(x,(s|r)>>>0)
+r=J.c1(J.UQ(v,2),8)
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
-J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
+J.wT(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,216,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
+return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -7526,173 +7564,173 @@
 y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
 y.vM+=u}else{u=H.Lw(37)
 y.vM+=u
-z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,222,223,224,[],225,[],226,[],227,[]]}},
+z.$2(v,y)}}return y.vM}}},
 hP:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
 z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
 $isEH:true},
 Uo:{
-"^":"Tp:381;a",
-$1:[function(a){a=J.aK(this.a,"]",a)
+"^":"Tp:153;a",
+$1:function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},"$1",null,2,0,null,15,[],"call"],
+return a+1},
 $isEH:true},
 hb:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
 $isEH:true},
 Kd:{
-"^":"Tp:115;",
-$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return P.jW(C.Wd,a,C.xM,!1)},
 $isEH:true},
 yZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
 z=this.b
 z.KF(P.jW(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"$2",null,4,0,null,49,[],30,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},
 $isEH:true},
 Gs:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"$1",null,2,0,null,382,[],"call"],
+return z},
 $isEH:true},
 pm:{
-"^":"Tp:380;",
-$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,382,[],"call"],
+"^":"Tp:152;",
+$1:function(a){return 97<=a&&a<=102},
 $isEH:true},
 Tw:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
 $isEH:true},
 wm:{
-"^":"Tp:381;b,c,d",
-$1:[function(a){var z,y
+"^":"Tp:153;b,c,d",
+$1:function(a){var z,y
 z=this.b
-y=C.xB.j(z,a)
+y=J.lE(z,a)
 if(this.d.$1(y)===!0)return y-32
 else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},"$1",null,2,0,null,15,[],"call"],
+else return y},
 $isEH:true},
 FB:{
-"^":"Tp:381;e",
-$1:[function(a){var z,y,x,w
-for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
-if(48<=w&&w<=57)y=y*16+w-48
-else{w|=32
-if(97<=w&&w<=102)y=y*16+w-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return y},"$1",null,2,0,null,15,[],"call"],
+"^":"Tp:153;e",
+$1:function(a){var z,y,x,w,v
+for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
+if(48<=v&&v<=57)x=x*16+v-48
+else{v|=32
+if(97<=v&&v<=102)x=x*16+v-97+10
+else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
 $isEH:true},
 Lk:{
-"^":"Tp:125;a,f",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:21;a,f",
+$0:function(){var z,y,x,w,v
 z=this.a
 y=z.b
 x=z.c
 w=this.f
 v=z.a
-if(y==null)z.b=P.p9(C.xB.Nj(w,x,v))
-else y.KF(C.xB.Nj(w,x,v))},"$0",null,0,0,null,"call"],
+if(y==null)z.b=P.p9(J.Nj(w,x,v))
+else y.KF(J.Nj(w,x,v))},
 $isEH:true},
 XZ:{
-"^":"Tp:384;",
-$2:[function(a,b){var z=J.v1(a)
+"^":"Tp:154;",
+$2:function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"$2",null,4,0,null,383,[],254,[],"call"],
+return b*31+z&1073741823},
 $isEH:true},
 Mx:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"$1",null,2,0,null,22,[],"call"],
+"^":"Tp:49;",
+$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
 $isEH:true},
 C9:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,385,[],"call"],
+return z},"$1",null,2,0,null,155,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"$1",null,2,0,null,22,[],"call"],
+"^":"Tp:49;",
+$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
 $isEH:true},
 JT:{
-"^":"Tp:386;a,b",
-$2:[function(a,b){var z,y
+"^":"Tp:156;a,b",
+$2:function(a,b){var z,y
 if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(C.xB.Nj(this.a,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"$2",null,4,0,null,134,[],135,[],"call"],
+return z},
 $isEH:true},
 d9:{
-"^":"Tp:115;c",
-$1:[function(a){var z=J.x(a)
+"^":"Tp:16;c",
+$1:function(a){var z=J.x(a)
 if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},"$1",null,2,0,null,30,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},
 $isEH:true},
 rI:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=J.Wx(a)
+"^":"Tp:75;",
+$2:function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,387,[],388,[],"call"],
+b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"$1","pq",2,0,228,21,[]],
-r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],229,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,230,[],231,[],232,[]],
-lt:[function(a,b,c,d,e,f,g,h){var z,y,x
+return"transitionend"},"$1","pq",2,0,61,7,[]],
+r3:function(a,b){return document.createElement(a)},
+Kn:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+lt:function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
 C.W3.eo(x,"GET",a,!0)
 z=C.fK.aM(x)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.iO(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
+H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,230,[],233,[],231,[],234,[],235,[],236,[],237,[],232,[]],
+return y.MM},
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-C0:[function(a,b){a=536870911&a+b
+C0:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","jx",4,0,null,238,[],30,[]],
-Pv:[function(a){if(a==null)return
-return W.P1(a)},"$1","Ie",2,0,null,239,[]],
-qc:[function(a){var z
+return a^a>>>6},
+Pv:function(a){if(a==null)return
+return W.P1(a)},
+qc:function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
 if(!!J.x(z).$isD0)return z
-return}else return a},"$1","Wq",2,0,null,21,[]],
-qr:[function(a){return a},"$1","Ku",2,0,null,21,[]],
-Pd:[function(a){if(!!J.x(a).$isYN)return a
-return P.o7(a,!0)},"$1","ra",2,0,null,99,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"$2","AD",4,0,null,240,[],7,[]],
-GO:[function(a){return J.TD(a)},"$1","V5",2,0,115,48,[]],
-Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,115,48,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,241,48,[],12,[],242,[],243,[]],
-wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+return}else return a},
+qr:function(a){return a},
+Pd:function(a){if(!!J.x(a).$isYN)return a
+return P.o7(a,!0)},
+YT:function(a,b){return new W.vZ(a,b)},
+GO:[function(a){return J.TD(a)},"$1","V5",2,0,16,62,[]],
+Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,16,62,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,63,62,[],64,[],65,[],66,[]],
+wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
@@ -7714,19 +7752,19 @@
 Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
 q={prototype:s}
 if(!v)q.extends=e
-b.registerElement(c,q)},"$5","uz",10,0,null,97,[],244,[],102,[],11,[],245,[]],
-aF:[function(a){if(J.de($.X3,C.NU))return a
+b.registerElement(c,q)},
+aF:function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},"$1","Rj",2,0,null,164,[]],
-K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"$1","o6",2,0,null,164,[]],
+return $.X3.oj(a,!0)},
+K2:function(a){if(J.de($.X3,C.NU))return a
+return $.X3.PT(a,!0)},
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|rm|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|Mv|V20|oM|V21|iL|V22|F1i|XP|V23|NQ|V24|ov|x4|knI|V25|fI|V26|zMr|V27|nk|V28|ob|Bc|Uj|V29|xT|V30|uwf|I5|V31|en"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|bf|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|V15|F1|V16|aQ|V17|Qa|V18|Ww|V19|tz|V20|Mv|V21|Zt|V22|iL|V23|F1i|XP|V24|NQ|V25|ov|x4|kn|V26|fI|V27|zMr|V28|nk|V29|ob|Bc|Uj|V30|xT|V31|uwf|I5|V32|SC"},
 zw:{
 "^":"Gv;",
-$isList:true,
-$asWO:function(){return[W.nX]},
+$iszM:true,
+$aszM:function(){return[W.nX]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.nX]},
@@ -7793,7 +7831,7 @@
 Kb:function(a,b){return a.getElementById(b)},
 ek:function(a,b,c){return a.importNode(b,c)},
 gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
+gVl:function(a){return C.T1.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 gVY:function(a){return C.DK.aM(a)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
@@ -7801,7 +7839,7 @@
 pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isYN:true,
 "%":"Document|HTMLDocument|XMLDocument"},
-Aj:{
+hN:{
 "^":"KV;",
 gwd:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.e7(a)),[null])
 return a._docChildren},
@@ -7840,6 +7878,9 @@
 Ja:function(a,b){return a.querySelector(b)},
 pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
+sDD:function(a,b){var z=this.gDD(a)
+z.V1(0)
+z.FV(z,b)},
 gwl:function(a){return P.T7(a.clientLeft,a.clientTop,a.clientWidth,a.clientHeight,null)},
 gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
 i4:function(a){},
@@ -7863,7 +7904,7 @@
 PN:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
 gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
+gVl:function(a){return C.T1.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
@@ -7916,8 +7957,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -7969,7 +8010,7 @@
 "^":"qE;mH:href=,t5:type%",
 $isQj:true,
 "%":"HTMLLinkElement"},
-U4:{
+ZD:{
 "^":"Gv;cC:hash%,mH:href=",
 VD:function(a){return a.reload()},
 bu:function(a){return a.toString()},
@@ -8018,7 +8059,7 @@
 tH:{
 "^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
 "%":"MIDIInput;MIDIPort"},
-Wp:{
+Aj:{
 "^":"Mf;",
 nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
 return},
@@ -8029,7 +8070,7 @@
 z=W.qc(a.target)
 y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.AK(z)))
 return H.VM(new P.hL(J.XH(y.x),J.XH(y.y)),[null])}},
-$isWp:true,
+$isAj:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
 "^":"Gv;",
@@ -8087,8 +8128,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -8138,7 +8179,7 @@
 $islp:true,
 "%":"HTMLSelectElement"},
 I0:{
-"^":"Aj;",
+"^":"hN;",
 Kb:function(a,b){return a.getElementById(b)},
 $isI0:true,
 "%":"ShadowRoot"},
@@ -8228,7 +8269,7 @@
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 bu:function(a){return a.toString()},
 gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
+gVl:function(a){return C.T1.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 gVY:function(a){return C.DK.aM(a)},
 $isu9:true,
@@ -8267,7 +8308,7 @@
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
-SC:{
+Wp:{
 "^":"qE;",
 $isD0:true,
 "%":"HTMLFrameSetElement"},
@@ -8284,8 +8325,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -8304,8 +8345,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]},
@@ -8324,8 +8365,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]},
@@ -8368,7 +8409,7 @@
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asar:function(){return[W.cv]},
-$asWO:function(){return[W.cv]},
+$aszM:function(){return[W.cv]},
 $asQV:function(){return[W.cv]}},
 wz:{
 "^":"ar;Sn,Sc",
@@ -8382,14 +8423,15 @@
 np:function(a){return this.GT(a,null)},
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
+sDD:function(a,b){H.bQ(this.Sc,new W.BH(b))},
 gi9:function(a){return C.mt.Uh(this)},
-gVl:function(a){return C.pi.Uh(this)},
+gVl:function(a){return C.T1.Uh(this)},
 gLm:function(a){return C.i3.Uh(this)},
 gVY:function(a){return C.DK.Uh(this)},
 nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -8397,8 +8439,14 @@
 z.nJ(a,b)
 return z}}},
 B1:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$iscv},
+$isEH:true},
+BH:{
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
+J.H2(a,z)
+return z},
 $isEH:true},
 nX:{
 "^":"Gv;"},
@@ -8415,28 +8463,28 @@
 static:{"^":"fD"}},
 RAp:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Gb:{
 "^":"RAp+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:115;",
-$1:[function(a){return J.EC(a)},"$1",null,2,0,null,389,[],"call"],
-$isEH:true},
-Cs:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,390,[],30,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return J.EC(a)},"$1",null,2,0,null,157,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:115;b,c",
+"^":"Tp:75;a",
+$2:function(a,b){this.a.setRequestHeader(a,b)},
+$isEH:true},
+bU:{
+"^":"Tp:16;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -8445,11 +8493,11 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,21,[],"call"],
+y.OH(z)}else x.pm(a)},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(b!=null)this.a[a]=b},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
 e7:{
 "^":"ar;NL",
@@ -8496,61 +8544,61 @@
 return z[b]},
 $ise7:true,
 $asar:function(){return[W.KV]},
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
 nNL:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 ma:{
 "^":"nNL+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 yoo:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 ecX:{
 "^":"yoo+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 zLC:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]}},
 w1p:{
 "^":"zLC+Gm;",
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]}},
 dxW:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]}},
 kEI:{
 "^":"dxW+Gm;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]}},
@@ -8566,23 +8614,23 @@
 b.$2(y,this.t(0,y))}},
 gvc:function(){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[J.O])
+y=H.VM([],[P.qU])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
 if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
 y.push(J.O6(z[w]))}}return y},
 gUQ:function(a){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[J.O])
+y=H.VM([],[P.qU])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
 if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
 y.push(J.Vm(z[w]))}}return y},
 gl0:function(a){return this.gB(this)===0},
 gor:function(a){return this.gB(this)!==0},
 $isZ0:true,
-$asZ0:function(){return[J.O,J.O]}},
+$asZ0:function(){return[P.qU,P.qU]}},
 Zc:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,374,[],121,[],"call"],
+"^":"Tp:75;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,158,[],70,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
@@ -8598,7 +8646,7 @@
 FJ:function(a){return a.namespaceURI==null}},
 nF:{
 "^":"As;QX,Kd",
-lF:function(){var z=P.Ls(null,null,null,J.O)
+lF:function(){var z=P.Ls(null,null,null,P.qU)
 this.Kd.aN(0,new W.Si(z))
 return z},
 p5:function(a){var z,y
@@ -8614,38 +8662,38 @@
 z.yJ(a)
 return z}}},
 FK:{
-"^":"Tp:115;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 Si:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.FV(0,a.lF())},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a.FV(0,a.lF())},
 $isEH:true},
 vf:{
-"^":"Tp:115;a",
-$1:[function(a){return a.OS(this.a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.OS(this.a)},
 $isEH:true},
 Iw:{
-"^":"Tp:115;a,b",
-$1:[function(a){return a.O4(this.a,this.b)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return a.O4(this.a,this.b)},
 $isEH:true},
 Fc:{
-"^":"Tp:115;a",
-$1:[function(a){return J.V1(a,this.a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.V1(a,this.a)},
 $isEH:true},
 hD:{
-"^":"Tp:300;a",
-$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,391,[],142,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
 "^":"As;MW",
 lF:function(){var z,y,x
-z=P.Ls(null,null,null,J.O)
+z=P.Ls(null,null,null,P.qU)
 for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))}},
-UC:{
+e0:{
 "^":"a;Ph",
 zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
 aM:function(a){return this.zc(a,!1)},
@@ -8667,13 +8715,13 @@
 return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},
 $isqh:true},
 ie:{
-"^":"Tp:115;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.eI(J.l2(a),this.a)},
 $isEH:true},
 Ea:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
 $1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+return a},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
@@ -8691,13 +8739,13 @@
 yI:function(a){return this.KR(a,null,null,null)},
 $isqh:true},
 i2:{
-"^":"Tp:115;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.eI(J.l2(a),this.a)},
 $isEH:true},
 b0:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
 $1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+return a},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
@@ -8728,10 +8776,10 @@
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.cO(0)},"$0","gJK",0,0,125],
+this.aV.cO(0)},"$0","gJK",0,0,21],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 bO:{
@@ -8753,8 +8801,8 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -8762,7 +8810,7 @@
 "^":"ar;xa",
 gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
 gB:function(a){return this.xa.length},
-h:function(a,b){J.bi(this.xa,b)},
+h:function(a,b){J.wT(this.xa,b)},
 Rz:function(a,b){return J.V1(this.xa,b)},
 V1:function(a){J.U2(this.xa)},
 t:function(a,b){var z=this.xa
@@ -8798,11 +8846,11 @@
 return!1},
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
 $1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,48,[],"call"],
+return this.a(a)},"$1",null,2,0,null,62,[],"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
@@ -8814,8 +8862,8 @@
 On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isD0:true,
-static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+static:{P1:function(a){if(a===window)return a
+else return new W.dW(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -8870,7 +8918,7 @@
 ca:{
 "^":"d5;x=,y=",
 "%":"SVGFEPointLightElement"},
-zu:{
+zt:{
 "^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 eW:{
@@ -8903,7 +8951,7 @@
 Ac:{
 "^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-MU:{
+jr:{
 "^":"Yz;fg:height=,R:width=,x=,y=",
 "%":"SVGRectElement"},
 nd:{
@@ -8921,7 +8969,7 @@
 J.r4(z.h2.NL)
 z.FV(0,b)},
 gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
+gVl:function(a){return C.T1.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
@@ -8951,7 +8999,7 @@
 "^":"As;LO",
 lF:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,J.O)
+y=P.Ls(null,null,null,P.qU)
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},
@@ -8966,16 +9014,16 @@
 $ishq:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},"$2$captureThis","oo",2,3,null,223,128,[],247,[]],
+xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,164,[],247,[],180,[],90,[]],
-Dm:[function(a,b,c){var z
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,47,[],67,[],33,[],68,[]],
+Dm:function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
-return!0}catch(z){H.Ru(z)}return!1},"$3","Iy",6,0,null,99,[],12,[],30,[]],
-Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"$2","OP",4,0,null,99,[],12,[]],
+return!0}catch(z){H.Ru(z)}return!1},
+Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
+return},
 wY:[function(a){var z
 if(a==null)return
 else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
@@ -8984,10 +9032,10 @@
 else if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,115,99,[]],
-hE:[function(a,b,c){var z=P.Om(a,b)
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,16,69,[]],
+hE:function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","dw",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
@@ -8995,13 +9043,13 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,206,99,[]],
-ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
+else return P.ND(a)}},"$1","Xl",2,0,54,69,[]],
+ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},"$1","ln",2,0,null,99,[]],
-iQ:[function(a,b,c){var z=P.Om(a,b)
+else return P.iQ(a,$.Iq(),new P.QS())},
+iQ:function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","yF",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
 E4:{
 "^":"a;eh",
 t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
@@ -9029,9 +9077,9 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).$1(a)},"$1","Ij",2,0,null,248,[]]}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Gn(P.UD(null,null)).$1(a)}}},
 Gn:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -9042,7 +9090,7 @@
 x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,99,[],"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,69,[],"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh"},
@@ -9081,47 +9129,47 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 GT:function(a,b){this.V7("sort",[b])},
 np:function(a){return this.GT(a,null)},
-static:{BE:[function(a,b,c){var z=J.Wx(a)
+static:{BE:function(a,b,c){var z=J.Wx(a)
 if(z.C(a,0)||z.D(a,c))throw H.b(P.TE(a,0,c))
 z=J.Wx(b)
-if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))},"$3","d6",6,0,null,134,[],135,[],249,[]]}},
+if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))}}},
 Wk:{
 "^":"E4+lD;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"Tp:115;",
-$1:[function(a){var z=P.xZ(a,!1)
+"^":"Tp:16;",
+$1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},"$1",null,2,0,null,99,[],"call"],
+return z},
 $isEH:true},
 Hp:{
-"^":"Tp:115;a",
-$1:[function(a){return new this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"Tp:115;",
-$1:[function(a){return new P.r7(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return new P.r7(a)},
 $isEH:true},
 Jd:{
-"^":"Tp:115;",
-$1:[function(a){return H.VM(new P.Tz(a),[null])},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return H.VM(new P.Tz(a),[null])},
 $isEH:true},
 QS:{
-"^":"Tp:115;",
-$1:[function(a){return new P.E4(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return new P.E4(a)},
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
-VC:[function(a,b){a=536870911&a+b
+VC:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","hj",4,0,null,238,[],30,[]],
-Up:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+return a^a>>>6},
+Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
 a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Hj",2,0,null,238,[]],
-J:[function(a,b){var z
+return 536870911&a+((16383&a)<<15>>>0)},
+J:function(a,b){var z
 if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return b
@@ -9130,15 +9178,15 @@
 if(a===0)z=b===0?1/b<0:b<0
 else z=!1
 if(z||isNaN(b))return b
-return a}return a},"$2","yT",4,0,null,117,[],199,[]],
-y:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return a}return a},
+y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return a
 if(a<b)return b
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"$2","Rb",4,0,null,117,[],199,[]],
+return a},
 mg:{
 "^":"a;",
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
@@ -9240,14 +9288,20 @@
 $ishL:true},
 HDe:{
 "^":"a;",
-gT8:function(a){var z=this.gBb(this)
+gT8:function(a){var z,y
+z=this.gBb(this)
+y=this.R
 if(typeof z!=="number")return z.g()
-return z+this.R},
-gQG:function(a){var z=this.gG6(this)
+if(typeof y!=="number")return H.s(y)
+return z+y},
+gQG:function(a){var z,y
+z=this.gG6(this)
+y=this.fg
 if(typeof z!=="number")return z.g()
-return z+this.fg},
-bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},
-n:function(a,b){var z,y,x
+if(typeof y!=="number")return H.s(y)
+return z+y},
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+H.d(this.R)+" x "+H.d(this.fg)},
+n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$istn)return!1
@@ -9256,20 +9310,26 @@
 if(y==null?x==null:y===x){y=this.G6
 x=z.gG6(b)
 if(y==null?x==null:y===x){x=this.Bb
+w=this.R
 if(typeof x!=="number")return x.g()
-if(x+this.R===z.gT8(b)){if(typeof y!=="number")return y.g()
-z=y+this.fg===z.gQG(b)}else z=!1}else z=!1}else z=!1
+if(typeof w!=="number")return H.s(w)
+if(x+w===z.gT8(b)){x=this.fg
+if(typeof y!=="number")return y.g()
+if(typeof x!=="number")return H.s(x)
+z=y+x===z.gQG(b)}else z=!1}else z=!1}else z=!1
 return z},
-giO:function(a){var z,y,x,w
+giO:function(a){var z,y,x,w,v,u
 z=J.v1(this.gBb(this))
 y=this.G6
 x=J.v1(y)
 w=this.Bb
+v=this.R
 if(typeof w!=="number")return w.g()
-w=w+this.R&0x1FFFFFFF
+if(typeof v!=="number")return H.s(v)
+u=this.fg
 if(typeof y!=="number")return y.g()
-y=y+this.fg&0x1FFFFFFF
-return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w),y))},
+if(typeof u!=="number")return H.s(u)
+return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w+v&0x1FFFFFFF),y+u&0x1FFFFFFF))},
 gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
@@ -9286,14 +9346,14 @@
 else y=d
 return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
-re:[function(a){var z,y
+re:function(a){var z,y
 z=J.x(a)
 if(!z.$isuq||z.n(a,C.HH))throw H.b(P.u(H.d(a)+" does not denote a class"))
 y=P.o1(a)
 if(!J.x(y).$isMs)throw H.b(P.u(H.d(a)+" does not denote a class"))
-return y.gJi()},"$1","vG",2,0,null,49,[]],
-o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"$1","o9",2,0,null,49,[]],
+return y.gJi()},
+o1:function(a){if(J.de(a,C.HH)){$.Cm().toString
+return $.P8()}return H.jO(a.gLU())},
 QF:{
 "^":"a;",
 $isQF:true},
@@ -9343,7 +9403,7 @@
 WS4:{
 "^":"a;ew,oQ,Js,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
-ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","aV",0,0,null],
+ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
 Gj:{
 "^":"mAS;EV"},
 mAS:{
@@ -9373,7 +9433,6 @@
 Rz:function(a,b){return this.EV.Rz(0,b)},
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
-bu:function(a){return P.vW(this.EV)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
 UI:function(a){a.toString
@@ -9384,7 +9443,6 @@
 return a},
 WZ:{
 "^":"Gv;",
-gbx:function(a){return C.PT},
 $isWZ:true,
 "%":"ArrayBuffer"},
 pF:{
@@ -9400,12 +9458,10 @@
 "%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
 df:{
 "^":"pF;",
-gbx:function(a){return C.T1},
 $isHY:true,
 "%":"DataView"},
 Hg:{
 "^":"Dg;",
-gbx:function(a){return C.hN},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9414,16 +9470,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.Pp]},
+$asQV:function(){return[P.CP]},
 $isHY:true,
 "%":"Float32Array"},
 fS:{
 "^":"Dg;",
-gbx:function(a){return C.lk},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9432,16 +9487,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.Pp]},
+$asQV:function(){return[P.CP]},
 $isHY:true,
 "%":"Float64Array"},
 PS:{
 "^":"Pg;",
-gbx:function(a){return C.jV},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9450,16 +9504,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"Int16Array"},
 dE:{
 "^":"Pg;",
-gbx:function(a){return C.Im},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9468,16 +9521,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"Int32Array"},
-IJ:{
+Eb:{
 "^":"Pg;",
-gbx:function(a){return C.la},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9486,16 +9538,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"Int8Array"},
 us:{
 "^":"Pg;",
-gbx:function(a){return C.iG},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9504,16 +9555,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"Uint16Array"},
 qe:{
 "^":"Pg;",
-gbx:function(a){return C.Vh},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9522,16 +9572,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"Uint32Array"},
 eE:{
 "^":"Pg;",
-gbx:function(a){return C.nG},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
@@ -9541,16 +9590,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
 "^":"Pg;",
-gbx:function(a){return C.eY},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
@@ -9560,11 +9608,11 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":";Uint8Array"},
 b0B:{
@@ -9589,18 +9637,18 @@
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true,
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.Pp]}},
+$asQV:function(){return[P.CP]}},
 Ui:{
 "^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.Pp]}},
+$asQV:function(){return[P.CP]}},
 Ip:{
 "^":"Ui+SU7;"},
 Pg:{
@@ -9609,36 +9657,36 @@
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isPg:true,
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]}},
+$asQV:function(){return[P.KN]}},
 ObS:{
 "^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]}},
+$asQV:function(){return[P.KN]}},
 nA:{
 "^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
 "^":"",
-qw:[function(a){if(typeof dartPrint=="function"){dartPrint(a)
+qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 Ir:{
-"^":["D13;Py%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,310,"error",307,330],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,311,30,[],"error",307],
+"^":["D13;Py%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,85,"error",82,104],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,86,27,[],"error",82],
 "@":function(){return[C.uW]},
 static:{hG:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9646,29 +9694,29 @@
 a.X0=w
 C.OD.ZL(a)
 C.OD.oX(a)
-return a},null,null,0,0,126,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[392],
+return a},null,null,0,0,22,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[159],
 D13:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
-rm:{
-"^":["WZq;a3%-347,Ab%-347,Ln%-393,y4%-394,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.a3},null,null,1,0,312,"text",307,308],
-sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",307],
-gzW:[function(a){return a.Ab},null,null,1,0,312,"lineMode",307,308],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",307],
-gFR:[function(a){return a.Ln},null,null,1,0,395,"callback",307,330],
+bf:{
+"^":["WZq;a3%-125,Ab%-125,Ln%-160,y4%-161,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.a3},null,null,1,0,87,"text",82,83],
+sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,8,27,[],"text",82],
+gzW:[function(a){return a.Ab},null,null,1,0,87,"lineMode",82,83],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,8,27,[],"lineMode",82],
+gFR:[function(a){return a.Ln},null,null,1,0,162,"callback",82,104],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,396,30,[],"callback",307],
-gPK:[function(a){return a.y4},null,null,1,0,397,"results",307,308],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,398,30,[],"results",307],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,163,27,[],"callback",82],
+gPK:[function(a){return a.y4},null,null,1,0,164,"results",82,83],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,165,27,[],"results",82],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
 if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,343,21,[],344,[],82,[],"updateLineMode"],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,120,7,[],121,[],119,[],"updateLineMode"],
 kk:[function(a,b,c,d){var z,y,x
 J.zJ(b)
 z=a.a3
@@ -9677,15 +9725,15 @@
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,343,21,[],344,[],82,[],"eval"],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,120,7,[],121,[],119,[],"eval"],
 A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,399,21,[],"selectExpr"],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,166,7,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
 y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.Ab="1-line"
@@ -9695,39 +9743,39 @@
 a.X0=v
 C.Gh.ZL(a)
 C.Gh.oX(a)
-return a},null,null,0,0,126,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[400],
+return a},null,null,0,0,22,"new EvalBoxElement$created"]}},
+"+EvalBoxElement":[167],
 WZq:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Tp:115;a-85",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,115,57,[],"call"],
+"^":"Tp:16;a-29",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,16,168,[],"call"],
 $isEH:true},
-"+ YW":[346]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"+ YW":[124]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Lt:{
-"^":["Nr;TS%-335,bY%-85,jv%-347,oy%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.TS},null,null,1,0,348,"busy",307,308],
-sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,349,30,[],"busy",307],
-gFR:[function(a){return a.bY},null,null,1,0,126,"callback",307,330],
+"^":["Nr;TS%-109,bY%-29,jv%-125,oy%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.TS},null,null,1,0,126,"busy",82,83],
+sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,127,27,[],"busy",82],
+gFR:[function(a){return a.bY},null,null,1,0,22,"callback",82,104],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,115,30,[],"callback",307],
-gNW:[function(a){return a.jv},null,null,1,0,312,"expr",307,330],
-sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,32,30,[],"expr",307],
-gyG:[function(a){return a.oy},null,null,1,0,310,"result",307,330],
-syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,311,30,[],"result",307],
-hT:[function(a,b,c,d){var z=a.TS
+sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,16,27,[],"callback",82],
+gNW:[function(a){return a.jv},null,null,1,0,87,"expr",82,104],
+sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,8,27,[],"expr",82],
+gyG:[function(a){return a.oy},null,null,1,0,85,"result",82,104],
+syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,86,27,[],"result",82],
+wB:[function(a,b,c,d){var z=a.TS
 if(z===!0)return
 if(a.bY!=null){a.TS=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,352,117,[],199,[],289,[],"evalNow"],
+this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,130,53,[],57,[],123,[],"evalNow"],
 "@":function(){return[C.Vn]},
 static:{fL:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.TS=!1
@@ -9739,35 +9787,35 @@
 a.X0=w
 C.UF.ZL(a)
 C.UF.oX(a)
-return a},null,null,0,0,126,"new EvalLinkElement$created"]}},
-"+EvalLinkElement":[401],
+return a},null,null,0,0,22,"new EvalLinkElement$created"]}},
+"+EvalLinkElement":[169],
 Nr:{
 "^":"xc+Pi;",
 $isd3:true},
 Kz:{
-"^":"Tp:311;a-85",
+"^":"Tp:86;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,311,101,[],"call"],
+y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,86,92,[],"call"],
 $isEH:true},
-"+ Kz":[346],
+"+ Kz":[124],
 Ou:{
-"^":"Tp:126;b-85",
+"^":"Tp:22;b-29",
 $0:[function(){var z,y
 z=this.b
 y=J.RE(z)
-y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,126,"call"],
+y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,22,"call"],
 $isEH:true},
-"+ Ou":[346]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ Ou":[124]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 UL:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
 static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -9776,19 +9824,19 @@
 a.X0=w
 C.MC.ZL(a)
 C.MC.oX(a)
-return a},null,null,0,0,126,"new FieldRefElement$created"]}},
-"+FieldRefElement":[336]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a},null,null,0,0,22,"new FieldRefElement$created"]}},
+"+FieldRefElement":[110]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 jM:{
-"^":["pva;vt%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,329,"field",307,330],
-st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,331,30,[],"field",307],
-pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["pva;vt%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,103,"field",82,104],
+st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,105,27,[],"field",82],
+pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.vc]},
-static:{bH:[function(a){var z,y,x,w
+static:{Sy:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9796,18 +9844,18 @@
 a.X0=w
 C.LT.ZL(a)
 C.LT.oX(a)
-return a},null,null,0,0,126,"new FieldViewElement$created"]}},
-"+FieldViewElement":[402],
+return a},null,null,0,0,22,"new FieldViewElement$created"]}},
+"+FieldViewElement":[170],
 pva:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 qW:{
-"^":["rs;lh%-335,qe%-335,zg%-335,Fs%-335,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,348,"qualified",307,330],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,349,30,[],"qualified",307],
-aZ:[function(a,b){var z,y,x
-Q.xI.prototype.aZ.call(this,a,b)
+"^":["rs;lh%-109,qe%-109,zg%-109,Fs%-109,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,126,"qualified",82,104],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,127,27,[],"qualified",82],
+P9:[function(a,b){var z,y,x
+Q.xI.prototype.P9.call(this,a,b)
 this.ct(a,C.D2,0,1)
 this.ct(a,C.mP,0,1)
 z=a.tY
@@ -9819,18 +9867,18 @@
 a.qe=this.ct(a,C.D2,a.qe,x)
 if(y){y=J.U6(z)
 y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,169,242,[],"refChanged"],
-gSY4:[function(a){return a.qe},null,null,1,0,348,"hasParent",307,308],
-sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,349,30,[],"hasParent",307],
-gE7:[function(a){return a.zg},null,null,1,0,348,"hasClass",307,308],
-sE7:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,349,30,[],"hasClass",307],
-gmN:[function(a){return a.Fs},null,null,1,0,348,"isDart",307,308],
-smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,349,30,[],"isDart",307],
+a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,26,65,[],"refChanged"],
+gSY4:[function(a){return a.qe},null,null,1,0,126,"hasParent",82,83],
+sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,127,27,[],"hasParent",82],
+gIO:[function(a){return a.zg},null,null,1,0,126,"hasClass",82,83],
+sIO:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,127,27,[],"hasClass",82],
+gmN:[function(a){return a.Fs},null,null,1,0,126,"isDart",82,83],
+smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,127,27,[],"isDart",82],
 "@":function(){return[C.o3]},
 static:{Wz:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.lh=!0
@@ -9843,20 +9891,20 @@
 a.X0=w
 C.Xo.ZL(a)
 C.Xo.oX(a)
-return a},null,null,0,0,126,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[403],
+return a},null,null,0,0,22,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[171],
 rs:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["cda;De%-327,Iu%-347,Ru%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.De},null,null,1,0,329,"function",307,330],
-sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,331,30,[],"function",307],
-gUx:[function(a){return a.Iu},null,null,1,0,312,"qualifiedName",307,330],
-sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,32,30,[],"qualifiedName",307],
-gfY:[function(a){return a.Ru},null,null,1,0,312,"kind",307,330],
-sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,32,30,[],"kind",307],
+"^":["cda;De%-101,Iu%-125,Ru%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.De},null,null,1,0,103,"function",82,104],
+sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,105,27,[],"function",82],
+gUx:[function(a){return a.Iu},null,null,1,0,87,"qualifiedName",82,104],
+sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,8,27,[],"qualifiedName",82],
+gfY:[function(a){return a.Ru},null,null,1,0,87,"kind",82,104],
+sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,8,27,[],"kind",82],
 FW:[function(a,b){var z,y,x
 z=b!=null
 y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
@@ -9865,7 +9913,7 @@
 z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
 x=z?J.UQ(b,"owner"):null
 if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,404,17,[],"_getQualifiedName"],
+return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,172,173,[],"_getQualifiedName"],
 ql:[function(a,b){var z,y
 this.ct(a,C.AO,0,1)
 this.ct(a,C.fy,0,1)
@@ -9898,13 +9946,13 @@
 case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
 break
 default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
-break}},"$1","gNC",2,0,169,242,[],"functionChanged"],
-pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+break}},"$1","gNC",2,0,26,65,[],"functionChanged"],
+pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9912,43 +9960,43 @@
 a.X0=w
 C.h4.ZL(a)
 C.h4.oX(a)
-return a},null,null,0,0,126,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[405],
+return a},null,null,0,0,22,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[174],
 cda:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
 Qb:{
 "^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,406],
+F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,175],
 gvH:function(a){return J.Ts(this.mS,4)},
-static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
-return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
+static:{"^":"Q0",x6:function(a,b){var z=J.RE(b)
+return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.eY(a)),z.gx(b)),4))}}},
 uc:{
 "^":"a;Yu<,tL"},
 pL:{
-"^":["waa;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-347,Oh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gys:[function(a){return a.PA},null,null,1,0,312,"status",307,308],
-sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",307],
-gyw:[function(a){return a.Oh},null,null,1,0,329,"fragmentation",307,330],
-syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,331,30,[],"fragmentation",307],
+"^":["waa;hi%-29,An%-29,dW%-29,rM%-29,Ge%-29,UL%-29,PA%-125,Oh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,87,"status",82,83],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,8,27,[],"status",82],
+gyw:[function(a){return a.Oh},null,null,1,0,103,"fragmentation",82,104],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,105,27,[],"fragmentation",82],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
 J.oL(z).yI(this.gmo(a))
-J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,125,"enteredView"],
+J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,21,"enteredView"],
 LV:[function(a,b){var z,y,x
 for(z=J.GP(b),y=0;z.G();){x=z.gl()
 if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"$1","gzK",2,0,407,408,[],"_packColor"],
+y=y*256+x}return y},"$1","gzK",2,0,176,177,[],"_packColor"],
 tn:[function(a,b,c,d){var z,y
 z=a.UL
 y=J.uH(c,"@")
 if(0>=y.length)return H.e(y,0)
 J.kW(z,b,y[0])
 J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,409,410,[],12,[],408,[],"_addClass"],
+J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,178,179,[],64,[],177,[],"_addClass"],
 an:[function(a,b,c){var z,y,x,w,v,u,t
 for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
 x=J.U6(y)
@@ -9963,16 +10011,16 @@
 J.kW(t,w,x[0])
 J.kW(a.rM,w,u)
 J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.eK())},"$2","gUw",4,0,411,412,[],413,[],"_updateClassList"],
+this.tn(a,0,"",$.eK())},"$2","gUw",4,0,180,181,[],182,[],"_updateClassList"],
 LI:[function(a,b){var z=b==null?C.vT:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,414,410,[],"_classIdToRGBA"],
+return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,183,179,[],"_classIdToRGBA"],
 Ic:[function(a,b){var z,y,x
 z=O.x6(a.An,b)
 y=z.mS
 x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,415,416,[],"_classNameAt"],
+return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,184,185,[],"_classNameAt"],
 WE:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.vX(a.dW,J.YD(a.An))
+z=J.vX(a.dW,J.eY(a.An))
 y=J.Ts(O.x6(a.An,b).mS,4)
 x=J.Wx(y)
 w=x.Z(y,z)
@@ -9997,7 +10045,7 @@
 break}o+=2}x=H.BU(x.t(t,"object_start"),null,null)
 r=J.UQ(a.Oh,"unit_size_bytes")
 if(typeof r!=="number")return H.s(r)
-return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,417,416,[],"_objectAt"],
+return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,186,185,[],"_objectAt"],
 U8:[function(a,b){var z,y,x,w,v,u
 z=J.RE(b)
 y=this.WE(a,z.gD7(b))
@@ -10008,9 +10056,9 @@
 v=J.Cl(J.Qd(z.HW),w,J.WB(w,4))
 u=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,v)))
 z=J.de(u,"")?"-":H.d(u)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,399,316,[],"_handleMouseMove"],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,166,91,[],"_handleMouseMove"],
 f1:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,399,316,[],"_handleClick"],
+window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,166,91,[],"_handleClick"],
 My:[function(a){var z,y,x,w
 z=a.Oh
 if(z==null||a.hi==null)return
@@ -10026,9 +10074,9 @@
 if(typeof w!=="number")return H.s(w)
 w=P.f9(J.Vf(a.hi).createImageData(x,z*w))
 a.An=w
-J.No(a.hi,J.YD(w))
+J.No(a.hi,J.eY(w))
 J.OE(a.hi,J.kd(a.An))
-this.ps(a,0)},"$0","gCT",0,0,125,"_updateFragmentationData"],
+this.ps(a,0)},"$0","gCT",0,0,21,"_updateFragmentationData"],
 ps:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.UQ(a.Oh,"pages")
 y=J.U6(z)
@@ -10064,20 +10112,20 @@
 J.wp(n.gRn(o),y,x.g(y,4),l)
 v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
 x=a.An
-J.J4(y,x,0,0,0,w,J.YD(x),m)
-P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,418,419,[],"_renderPages"],
+J.J4(y,x,0,0,0,w,J.eY(x),m)
+P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,187,188,[],"_renderPages"],
 pA:[function(a,b){var z=a.Oh
 if(z==null)return
-J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,169,242,[],"fragmentationChanged"],
+J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,26,65,[],"fragmentationChanged"],
 "@":function(){return[C.Cu]},
-static:{"^":"nK<-85,RD<-85,SoT<-85",pn:[function(a){var z,y,x,w,v,u,t
+static:{"^":"nK<-29,RD<-29,SoT<-29",pn:[function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
 w=$.Nd()
-v=P.Py(null,null,null,J.O,W.I0)
-u=J.O
+v=P.Py(null,null,null,P.qU,W.I0)
+u=P.qU
 t=W.cv
 t=H.VM(new V.qC(P.Py(null,null,null,u,t),null,null),[u,t])
 a.rM=z
@@ -10088,41 +10136,41 @@
 a.X0=t
 C.pJ.ZL(a)
 C.pJ.oX(a)
-return a},null,null,0,0,126,"new HeapMapElement$created"]}},
-"+HeapMapElement":[420],
+return a},null,null,0,0,22,"new HeapMapElement$created"]}},
+"+HeapMapElement":[189],
 waa:{
 "^":"uL+Pi;",
 $isd3:true},
 WQ:{
-"^":"Tp:126;a-85,b-317",
-$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,126,"call"],
+"^":"Tp:22;a-29,b-93",
+$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,22,"call"],
 $isEH:true},
-"+ WQ":[346],
+"+ WQ":[124],
 aG:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,105,190,[],"call"],
 $isEH:true},
-"+ aG":[346],
+"+ aG":[124],
 aO:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
 $isEH:true},
-"+ aO":[346],
+"+ aO":[124],
 oc:{
-"^":"Tp:126;a-85",
-$0:[function(){J.vP(this.a)},"$0",null,0,0,126,"call"],
+"^":"Tp:22;a-29",
+$0:[function(){J.vP(this.a)},"$0",null,0,0,22,"call"],
 $isEH:true},
-"+ oc":[346]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"+ oc":[124]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["V4;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-423,Ol%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gLF:[function(a){return a.nc},null,null,1,0,424,"classTable",307,308],
-sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,425,30,[],"classTable",307],
-gB1:[function(a){return a.Ol},null,null,1,0,329,"profile",307,330],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,331,30,[],"profile",307],
+"^":["V4;GQ%-29,J0%-29,Oc%-29,CO%-29,nc%-192,Ol%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gLF:[function(a){return a.nc},null,null,1,0,193,"classTable",82,83],
+sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,194,27,[],"classTable",82],
+gB1:[function(a){return a.Ol},null,null,1,0,103,"profile",82,104],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,105,27,[],"profile",82],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
@@ -10135,10 +10183,10 @@
 z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
 a.CO=z
 z.bG.u(0,"title","Old Space")
-this.uB(a)},"$0","gQd",0,0,125,"enteredView"],
-hZ:[function(a){var z,y,x,w,v,u,t,s,r,q
+this.uB(a)},"$0","gQd",0,0,21,"enteredView"],
+hZ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=a.Ol
-if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+if(z==null||!J.x(J.UQ(z,"members")).$iszM||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
 a.nc.lb()
 for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 if(this.K1(a,y))continue
@@ -10149,81 +10197,85 @@
 t=this.VI(a,y,4)
 s=this.VI(a,y,5)
 r=this.VI(a,y,6)
-J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r]))}J.Yl(a.nc)
+q=this.VI(a,y,7)
+p=this.VI(a,y,8)
+J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.Yl(a.nc)
 a.GQ.lb()
-q=J.UQ(J.UQ(a.Ol,"heaps"),"new")
-z=J.U6(q)
-J.qK(a.GQ,["Used",z.t(q,"used")])
-J.qK(a.GQ,["Free",J.xH(z.t(q,"capacity"),z.t(q,"used"))])
-J.qK(a.GQ,["External",z.t(q,"external")])
+o=J.UQ(J.UQ(a.Ol,"heaps"),"new")
+z=J.U6(o)
+J.qK(a.GQ,["Used",z.t(o,"used")])
+J.qK(a.GQ,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
+J.qK(a.GQ,["External",z.t(o,"external")])
 a.Oc.lb()
-q=J.UQ(J.UQ(a.Ol,"heaps"),"old")
-z=J.U6(q)
-J.qK(a.Oc,["Used",z.t(q,"used")])
-J.qK(a.Oc,["Free",J.xH(z.t(q,"capacity"),z.t(q,"used"))])
-J.qK(a.Oc,["External",z.t(q,"external")])
-this.uB(a)},"$0","gYs",0,0,125,"_updateChartData"],
+o=J.UQ(J.UQ(a.Ol,"heaps"),"old")
+z=J.U6(o)
+J.qK(a.Oc,["Used",z.t(o,"used")])
+J.qK(a.Oc,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
+J.qK(a.Oc,["External",z.t(o,"external")])
+this.uB(a)},"$0","gYs",0,0,21,"_updateChartData"],
 uB:[function(a){var z=a.J0
 if(z==null)return
 z.W2(a.GQ)
-a.CO.W2(a.Oc)},"$0","goI",0,0,125,"_draw"],
+a.CO.W2(a.Oc)},"$0","goI",0,0,21,"_draw"],
 AE:[function(a,b,c,d){var z,y
 if(!!J.x(d).$isqk){z=a.nc.gxp()
 y=d.cellIndex
 if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.Yl(a.nc)}}},"$3","gQq",6,0,426,21,[],344,[],82,[],"changeSort",308],
+J.Yl(a.nc)}}},"$3","gQq",6,0,195,7,[],121,[],119,[],"changeSort",83],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"$1","gbU",2,0,427,121,[],"_classHasNoAllocations"],
+return!0},"$1","gbU",2,0,196,70,[],"_classHasNoAllocations"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
-case 1:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),7),J.UQ(z.t(b,"old"),7))
-case 2:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),6),J.UQ(z.t(b,"old"),6))
-case 3:return J.UQ(J.UQ(b,"old"),7)
-case 4:return J.UQ(J.UQ(b,"old"),6)
-case 5:z=J.U6(b)
-return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5)),J.UQ(z.t(b,"old"),3)),J.UQ(z.t(b,"old"),5))
-case 6:z=J.U6(b)
-return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4)),J.UQ(z.t(b,"old"),2)),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,428,121,[],15,[],"_combinedTableColumnValue"],
+case 1:return J.UQ(J.UQ(b,"new"),7)
+case 2:return J.UQ(J.UQ(b,"new"),6)
+case 3:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5))
+case 4:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4))
+case 5:return J.UQ(J.UQ(b,"old"),7)
+case 6:return J.UQ(J.UQ(b,"old"),6)
+case 7:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
+case 8:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,197,70,[],73,[],"_combinedTableColumnValue"],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 cQ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,169,332,[],"refreshGC"],
+J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,26,106,[],"refreshGC"],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,169,332,[],"resetAccumulator"],
+J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,26,106,[],"resetAccumulator"],
 pM:[function(a,b){var z,y,x,w
 try{this.hZ(a)}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 N.Jx("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,169,242,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,26,65,[],"profileChanged"],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,429,430,[],"formattedAverage",308],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,198,199,[],"formattedAverage",83],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,429,430,[],"formattedCollections",308],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,198,199,[],"formattedCollections",83],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,429,430,[],"formattedTotalCollectionTime",308],
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,198,199,[],"formattedTotalCollectionTime",83],
 Dd:[function(a){var z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
@@ -10233,14 +10285,14 @@
 z.Gl("string","Type")
 a.Oc.Gl("number","Size")
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator",G.AF()),new G.Kt("Accumulator",G.Vj()),new G.Kt("Accumulator (Old space)",G.AF()),new G.Kt("Accumulator (Old space)",G.Vj()),new G.Kt("Current",G.AF()),new G.Kt("Current",G.Vj())],z,[],0,!0,null,null))
+z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator Size (New)",G.AF()),new G.Kt("Accumulator (New)",G.Vj()),new G.Kt("Current Size (New)",G.AF()),new G.Kt("Current (New)",G.Vj()),new G.Kt("Accumulator Size (Old)",G.AF()),new G.Kt("Accumulator (Old)",G.Vj()),new G.Kt("Current Size (Old)",G.AF()),new G.Kt("Current (Old)",G.Vj())],z,[],0,!0,null,null))
 a.nc=z
-z.sxp(1)},null,null,0,0,126,"created"],
+z.sxp(1)},null,null,0,0,22,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-85,bQj<-85,xK<-85,V1g<-85,r1K<-85,qEV<-85,pC<-85,DY2<-85",Lz:[function(a){var z,y,x,w
+static:{"^":"BO<-29,bQj<-29,xK<-29,V1g<-29,r1K<-29,qEV<-29,pC<-29,DY2<-29",Lz:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10249,65 +10301,65 @@
 C.Vc.ZL(a)
 C.Vc.oX(a)
 C.Vc.Dd(a)
-return a},null,null,0,0,126,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[431],
+return a},null,null,0,0,22,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[200],
 V4:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
 $isEH:true},
-"+ nx":[346],
+"+ nx":[124],
 jm:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
 $isEH:true},
-"+ jm":[346],
+"+ jm":[124],
 AN:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
 $isEH:true},
-"+ AN":[346],
+"+ AN":[124],
 Ao:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
 $isEH:true},
-"+ Ao":[346],
+"+ Ao":[124],
 xj:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
 $isEH:true},
-"+ xj":[346],
+"+ xj":[124],
 VB:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
 $isEH:true},
-"+ VB":[346]}],["html_common","dart:html_common",,P,{
+"+ VB":[124]}],["html_common","dart:html_common",,P,{
 "^":"",
-bL:[function(a){var z,y
+bL:function(a){var z,y
 z=[]
 y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).$1(a)
 new P.wO().$0()
-return y},"$1","Lq",2,0,null,30,[]],
-o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,223,6,[],251,[]],
-f9:[function(a){var z,y
+return y},
+o7:function(a,b){var z=[]
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},
+f9:function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"$1","D3",2,0,null,252,[]],
-QO:[function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
-return a},"$1","Gg",2,0,null,253,[]],
+y.BYTES_PER_ELEMENT=1}return a}return new P.la(a.data,a.height,a.width)},
+QO:function(a){if(!!J.x(a).$isla)return{data:a.Rn,height:a.fg,width:a.R}
+return a},
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -10315,34 +10367,34 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:200;b,c",
-$1:[function(a){var z,y,x
+"^":"Tp:52;b,c",
+$1:function(a){var z,y,x
 z=this.b
 y=z.length
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
 $isEH:true},
 rG:{
-"^":"Tp:361;d",
-$1:[function(a){var z=this.d
+"^":"Tp:137;d",
+$1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,325,[],"call"],
+return z[a]},
 $isEH:true},
 yh:{
-"^":"Tp:432;e",
-$2:[function(a,b){var z=this.e
+"^":"Tp:201;e",
+$2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
+z[a]=b},
 $isEH:true},
 wO:{
-"^":"Tp:126;",
-$0:[function(){},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){},
 $isEH:true},
 Tm:{
-"^":"Tp:115;f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u
+"^":"Tp:16;f,UI,bK",
+$1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -10364,7 +10416,7 @@
 z.a=w
 this.bK.$2(x,w)
 y.aN(a,new P.ib(z,this))
-return z.a}if(!!y.$isList){v=y.gB(a)
+return z.a}if(!!y.$iszM){v=y.gB(a)
 x=this.f.$1(a)
 w=this.UI.$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
@@ -10374,37 +10426,37 @@
 u=0
 for(;u<v;++u){z=this.$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"$1",null,2,0,null,21,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
 ib:{
-"^":"Tp:300;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a,Gq",
+$2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
 $isEH:true},
 CA:{
-"^":"Tp:200;a,b",
-$1:[function(a){var z,y,x,w
+"^":"Tp:52;a,b",
+$1:function(a){var z,y,x,w
 z=this.a
 y=z.length
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
 $isEH:true},
 YL:{
-"^":"Tp:361;c",
-$1:[function(a){var z=this.c
+"^":"Tp:137;c",
+$1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,325,[],"call"],
+return z[a]},
 $isEH:true},
 KC:{
-"^":"Tp:432;d",
-$2:[function(a,b){var z=this.d
+"^":"Tp:201;d",
+$2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
+z[a]=b},
 $isEH:true},
 xL:{
-"^":"Tp:115;e,f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Tp:16;e,f,UI,bK",
+$1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
 if(typeof a==="number")return a
@@ -10428,11 +10480,11 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},"$1",null,2,0,null,21,[],"call"],
+return y}return a},
 $isEH:true},
-qS:{
+la:{
 "^":"a;Rn>,fg>,R>",
-$isqS:true,
+$isla:true,
 $isSg:true},
 As:{
 "^":"a;",
@@ -10451,9 +10503,11 @@
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
 ez:[function(a,b){var z=this.lF()
-return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,433,128,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,202],
 ev:function(a,b){var z=this.lF()
 return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
+Ft:[function(a,b){var z=this.lF()
+return H.VM(new H.kV(z,b),[H.ip(z,"mW",0),null])},"$1","git",2,0,203],
 Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -10482,24 +10536,24 @@
 this.p5(z)
 return y},
 $isz5:true,
-$asz5:function(){return[J.O]},
+$asz5:function(){return[P.qU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.O]}},
+$asQV:function(){return[P.qU]}},
 GE:{
-"^":"Tp:115;a",
-$1:[function(a){return a.h(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.h(0,this.a)},
 $isEH:true},
 rl:{
-"^":"Tp:115;a",
-$1:[function(a){return a.FV(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.FV(0,this.a)},
 $isEH:true},
 uQ:{
-"^":"Tp:115;",
-$1:[function(a){return a.V1(0)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return a.V1(0)},
 $isEH:true},
 D7:{
-"^":"ar;qt,h2",
+"^":"ar;ndS,h2",
 gzT:function(){var z=this.h2
 return P.F(z.ev(z,new P.hT()),!0,W.cv)},
 aN:function(a,b){H.bQ(this.gzT(),b)},
@@ -10536,36 +10590,36 @@
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$iscv},
 $isEH:true},
 GS:{
-"^":"Tp:115;",
-$1:[function(a){return J.QC(a)},"$1",null,2,0,null,295,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.QC(a)},
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 pR:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
 else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
 else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,312,"hoverText"],
-Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,126,"expander"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,87,"hoverText"],
+Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,22,"expander"],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,434,435,[],332,[],"expandEvent"],
+c.$0()}},"$2","gus",4,0,204,205,[],106,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{lu:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -10574,31 +10628,32 @@
 a.X0=w
 C.cp.ZL(a)
 C.cp.oX(a)
-return a},null,null,0,0,126,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[336],
+return a},null,null,0,0,22,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[110],
 Js:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
 a.szz(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
-y.ct(z,C.kY,0,1)},"$1",null,2,0,115,57,[],"call"],
+y.ct(z,C.kY,0,1)},"$1",null,2,0,16,168,[],"call"],
 $isEH:true},
-"+ Js":[346]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[124]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["V9;Xh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,329,"instance",307,330],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,331,30,[],"instance",307],
-vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-"@":function(){return[C.qlk]},
+"^":["V9;Xh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,103,"instance",82,104],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,105,27,[],"instance",82],
+vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"@":function(){return[C.be]},
 static:{Co:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10606,15 +10661,15 @@
 a.X0=w
 C.pU.ZL(a)
 C.pU.oX(a)
-return a},null,null,0,0,126,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[436],
+return a},null,null,0,0,22,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[206],
 V9:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
-"^":["Y2;B1>,SF<-437,H<-437,Zn@-347,vs@-347,ki@-347,Vh@-347,LH@-347,eT,yt-317,wd-318,oH-319,R7,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
-gtT:[function(a){return J.on(this.H)},null,null,1,0,339,"code",307],
+"^":["Y2;B1>,SF<-207,H<-207,Zn@-125,vs@-125,ki@-125,Vh@-125,LH@-125,eT,yt-93,wd-94,oH-95,R7,aZ,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,115,"code",82],
 C4:function(a){var z,y,x,w,v,u,t,s,r
 z=this.B1
 y=J.UQ(z,"threshold")
@@ -10627,6 +10682,7 @@
 if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
 w.h(x,X.SJ(z,t,s,this))}},
 o8:function(){},
+Nh:function(){return J.z8(J.q8(J.uw(this.H)),0)},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
@@ -10646,29 +10702,30 @@
 static:{SJ:function(a,b,c,d){var z,y
 z=H.VM([],[G.Y2])
 y=d!=null?J.WB(d.yt,1):0
-z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192",!1,null,null)
+z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
+z.k7(d)
 z.mW(a,b,c,d)
 return z}}},
 E7:{
-"^":["V10;pD%-327,zt%-335,eH%-347,NT%-347,Xv%-347,M5%-347,ik%-347,jS%-347,XX%-438,BJ%-347,qO=-85,Hm%-439,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,329,"profile",307,330],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,331,30,[],"profile",307],
-gPL:[function(a){return a.zt},null,null,1,0,348,"hideTagsChecked",307,308],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,349,30,[],"hideTagsChecked",307],
-gEW:[function(a){return a.eH},null,null,1,0,312,"sampleCount",307,308],
-sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",307],
-gUo:[function(a){return a.NT},null,null,1,0,312,"refreshTime",307,308],
-sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,32,30,[],"refreshTime",307],
-gEly:[function(a){return a.Xv},null,null,1,0,312,"sampleRate",307,308],
-sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",307],
-gIZ:[function(a){return a.M5},null,null,1,0,312,"sampleDepth",307,308],
-sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",307],
-gNG:[function(a){return a.ik},null,null,1,0,312,"displayCutoff",307,308],
-sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",307],
-gQl:[function(a){return a.jS},null,null,1,0,312,"timeSpan",307,308],
-sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,32,30,[],"timeSpan",307],
-gib:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",307,308],
-sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",307],
+"^":["V10;pD%-101,zt%-109,eH%-125,NT%-125,Xv%-125,M5%-125,ik%-125,jS%-125,XX%-208,BJ%-125,qO=-29,Hm%-209,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,103,"profile",82,104],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,105,27,[],"profile",82],
+gPL:[function(a){return a.zt},null,null,1,0,126,"hideTagsChecked",82,83],
+sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,127,27,[],"hideTagsChecked",82],
+gEW:[function(a){return a.eH},null,null,1,0,87,"sampleCount",82,83],
+sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,8,27,[],"sampleCount",82],
+gUo:[function(a){return a.NT},null,null,1,0,87,"refreshTime",82,83],
+sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,8,27,[],"refreshTime",82],
+gEly:[function(a){return a.Xv},null,null,1,0,87,"sampleRate",82,83],
+sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,8,27,[],"sampleRate",82],
+gIZ:[function(a){return a.M5},null,null,1,0,87,"sampleDepth",82,83],
+sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,8,27,[],"sampleDepth",82],
+gNG:[function(a){return a.ik},null,null,1,0,87,"displayCutoff",82,83],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,8,27,[],"displayCutoff",82],
+gQl:[function(a){return a.jS},null,null,1,0,87,"timeSpan",82,83],
+sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,8,27,[],"timeSpan",82],
+gib:[function(a){return a.BJ},null,null,1,0,87,"tagSelector",82,83],
+sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,8,27,[],"tagSelector",82],
 pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
@@ -10691,27 +10748,27 @@
 a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
 J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"$1","gwm",2,0,169,242,[],"profileChanged"],
+this.Cx(a)},"$1","gwm",2,0,26,65,[],"profileChanged"],
 i4:[function(a){var z=R.Jk([])
 a.Hm=new G.XN(z,null,null)
-this.Cx(a)},"$0","gQd",0,0,125,"enteredView"],
-m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,169,242,[],"tagSelectorChanged"],
+this.Cx(a)},"$0","gQd",0,0,21,"enteredView"],
+m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,26,65,[],"tagSelectorChanged"],
 pA:[function(a,b){var z="profile?tags="+H.d(a.BJ)
-J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 Cx:[function(a){if(a.pD==null)return
-this.EX(a)},"$0","gBn",0,0,125,"_update"],
+this.EX(a)},"$0","gBn",0,0,21,"_update"],
 EX:[function(a){var z,y,x,w,v
 z=J.QP(a.pD).gBC()
 if(z==null)return
 try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,125,"_buildStackTree"],
-ba:[function(a){this.EX(a)},"$0","gvr",0,0,125,"_buildTree"],
-ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,440,322,[],"padding",308],
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,21,"_buildStackTree"],
+ba:[function(a){this.EX(a)},"$0","gvr",0,0,21,"_buildTree"],
+ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,210,98,[],"padding",83],
 ZZ:[function(a,b){var z=J.bY(J.xH(b.gyt(),1),9)
 if(z>>>0!==z||z>=9)return H.e(C.Ym,z)
-return C.Ym[z]},"$1","gth",2,0,440,322,[],"coloring",308],
+return C.Ym[z]},"$1","gth",2,0,210,98,[],"coloring",83],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.de(J.F8(w.gN(b)),"expand")&&!J.de(w.gN(b),d))return
@@ -10722,12 +10779,12 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,426,21,[],344,[],82,[],"toggleExpanded",308],
+N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,195,7,[],121,[],119,[],"toggleExpanded",83],
 "@":function(){return[C.jR]},
-static:{"^":"B6<-85",jD:[function(a){var z,y,x,w
+static:{"^":"B6<-29",jD:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.eH=""
@@ -10744,27 +10801,27 @@
 a.X0=w
 C.kS.ZL(a)
 C.kS.oX(a)
-return a},null,null,0,0,126,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[441],
+return a},null,null,0,0,22,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[211],
 V10:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,331,202,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,105,212,[],"call"],
 $isEH:true},
-"+ SV":[346]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"+ SV":[124]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oO:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.j6]},
 static:{Zgg:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -10773,18 +10830,18 @@
 a.X0=w
 C.LN.ZL(a)
 C.LN.oX(a)
-return a},null,null,0,0,126,"new IsolateRefElement$created"]}},
-"+IsolateRefElement":[336]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a},null,null,0,0,22,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[110]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 Stq:{
-"^":["V11;Pw%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,306,"isolate",307,330],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,309,30,[],"isolate",307],
+"^":["V11;Pw%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,84,27,[],"isolate",82],
 "@":function(){return[C.aM]},
 static:{N5:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10792,14 +10849,14 @@
 a.X0=w
 C.Qt.ZL(a)
 C.Qt.oX(a)
-return a},null,null,0,0,126,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[443],
+return a},null,null,0,0,22,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[214],
 V11:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
 Lr:{
-"^":"a;hO,Pl",
+"^":"a;hO,YT",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.hO.Yb
 if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
@@ -10838,36 +10895,36 @@
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}},
 W2:function(a){var z,y
-if(this.Pl==null){z=P.L5(null,null,null,null,null)
+if(this.YT==null){z=P.L5(null,null,null,null,null)
 y=new G.qu(null,z)
 y.vR=P.zV(J.UQ($.NR,"SteppedAreaChart"),[a])
-this.Pl=y
+this.YT=y
 z.u(0,"isStacked",!0)
-this.Pl.bG.u(0,"connectSteps",!1)
-this.Pl.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.Pl.W2(this.hO)}},
+this.YT.bG.u(0,"connectSteps",!1)
+this.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.YT.W2(this.hO)}},
 qkb:{
-"^":["V12;oY%-442,ts%-444,e6%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.oY},null,null,1,0,306,"isolate",307,330],
-sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,309,30,[],"isolate",307],
+"^":["V12;oY%-213,ts%-215,e6%-216,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,84,27,[],"isolate",82],
 vV:[function(a,b){var z=a.oY
-return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,125,"_updateTagProfile"],
+return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,21,"_updateTagProfile"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,125,"enteredView"],
+a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,21,"enteredView"],
 xo:[function(a){var z
 Z.uL.prototype.xo.call(this,a)
 z=a.ts
-if(z!=null)z.ed()},"$0","gbt",0,0,125,"leftView"],
+if(z!=null)z.ed()},"$0","gbt",0,0,21,"leftView"],
 Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
-if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,125,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,352,117,[],199,[],289,[],"resume"],
+if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,21,"_drawTagProfileChart"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,130,53,[],57,[],123,[],"resume"],
 "@":function(){return[C.NG]},
 static:{uD:[function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.NR,"DataTable"),null)
 y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.e6=new L.Lr(new G.ig(z),null)
@@ -10876,27 +10933,27 @@
 a.X0=v
 C.Xe.ZL(a)
 C.Xe.oX(a)
-return a},null,null,0,0,126,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[446],
+return a},null,null,0,0,22,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[217],
 V12:{
 "^":"uL+Pi;",
 $isd3:true},
 BQ:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
 $1:[function(a){var z,y,x
 z=this.a
 y=J.RE(z)
 y.ge6(z).eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,115,447,[],"call"],
+y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,16,218,[],"call"],
 $isEH:true},
-"+ BQ":[346],
+"+ BQ":[124],
 IT:{
-"^":"Tp:115;a-85",
-$1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,115,57,[],"call"],
+"^":"Tp:16;a-29",
+$1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,16,168,[],"call"],
 $isEH:true},
-"+ IT":[346]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"+ IT":[124]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 fM:{
 "^":"a;Fv,lp",
@@ -10915,7 +10972,7 @@
 x.vM+=q
 this.KN(t,v)
 q=x.vM+=s?r:H.d(r)
-x.vM=q+"}\n"}else if(!!s.$isList){if(typeof "  "!=="number")return H.s("  ")
+x.vM=q+"}\n"}else if(!!s.$iszM){if(typeof "  "!=="number")return H.s("  ")
 r=b*"  "
 s=typeof r==="string"
 x.vM+=s?r:H.d(r)
@@ -10942,7 +10999,7 @@
 x.vM=s+"{\n"
 this.KN(v,w)
 s=x.vM+=u?t:H.d(t)
-x.vM=s+"}\n"}else if(!!u.$isList){if(typeof "  "!=="number")return H.s("  ")
+x.vM=s+"}\n"}else if(!!u.$iszM){if(typeof "  "!=="number")return H.s("  ")
 t=b*"  "
 u=typeof t==="string"
 s=x.vM+=u?t:H.d(t)
@@ -10955,12 +11012,12 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":["V13;OZ%-327,X7%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gIr:[function(a){return a.OZ},null,null,1,0,329,"map",307,330],
+"^":["V13;OZ%-101,X7%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gIr:[function(a){return a.OZ},null,null,1,0,103,"map",82,104],
 ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,331,30,[],"map",307],
-gdQ:[function(a){return a.X7},null,null,1,0,312,"mapAsString",307,308],
-sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,32,30,[],"mapAsString",307],
+sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,105,27,[],"map",82],
+gdQ:[function(a){return a.X7},null,null,1,0,87,"mapAsString",82,83],
+sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,8,27,[],"mapAsString",82],
 oC:[function(a,b){var z,y,x
 z=P.p9("")
 y=P.Ls(null,null,null,null)
@@ -10970,12 +11027,12 @@
 new Z.fM(z,y).KN(x,0)
 z.KF("}\n")
 z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,169,242,[],"mapChanged"],
+a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,26,65,[],"mapChanged"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10983,19 +11040,19 @@
 a.X0=w
 C.Yt.ZL(a)
 C.Yt.oX(a)
-return a},null,null,0,0,126,"new JsonViewElement$created"]}},
-"+JsonViewElement":[448],
+return a},null,null,0,0,22,"new JsonViewElement$created"]}},
+"+JsonViewElement":[219],
 V13:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -11004,20 +11061,20 @@
 a.X0=w
 C.Z3.ZL(a)
 C.Z3.oX(a)
-return a},null,null,0,0,126,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[336]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a},null,null,0,0,22,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[110]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V14;a1%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.a1},null,null,1,0,329,"library",307,330],
-stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,331,30,[],"library",307],
-vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["V14;a1%-220,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.a1},null,null,1,0,221,"library",82,104],
+stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,222,27,[],"library",82],
+vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -11025,8 +11082,8 @@
 a.X0=w
 C.MG.ZL(a)
 C.MG.oX(a)
-return a},null,null,0,0,126,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[449],
+return a},null,null,0,0,22,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[223],
 V14:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
@@ -11063,7 +11120,7 @@
 J4:function(a){return this.dL(a,null,null)},
 ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.ZG(a,null,null)},
-xH:function(a,b,c){return this.Y6(C.UP,a,b,c)},
+xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
 j2:function(a){return this.xH(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.cV,a,b,c)},
 hh:function(a){return this.WB(a,null,null)},
@@ -11079,17 +11136,17 @@
 $isTJ:true,
 static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:126;a",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:22;a",
+$0:function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
 y=C.xB.cn(z,".")
 if(y===-1)x=z!==""?N.Jx(""):null
 else{x=N.Jx(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,J.O,N.TJ)
+z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
 v=new N.TJ(z,x,null,w,H.VM(new Q.Gj(w),[null,null]),null)
 v.QL(z,x,w)
-return v},"$0",null,0,0,null,"call"],
+return v},
 $isEH:true},
 qV:{
 "^":"a;oc>,P>",
@@ -11113,34 +11170,39 @@
 giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isqV:true,
-static:{"^":"K9,tmj,EL,LkO,reI,pd,dc,MHK,ow,lM,B9"}},
+static:{"^":"K9,tmj,EL,LkO,reI,pd,EN,MHK,ow,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
 $isHV:true,
-static:{"^":"xO"}}}],["","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
+static:{"^":"xO"}}}],["","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
 "^":"",
-E2:[function(){N.Jx("").sOR(C.IF)
+E2:function(){N.Jx("").sOR(C.IF)
 N.Jx("").gSZ().yI(new F.em())
 N.Jx("").To("Starting Observatory")
 var z=H.VM(new P.Zf(P.Dt(null)),[null])
 N.Jx("").To("Loading Google Charts API")
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],null,null))])
-z.MM.ml(G.vN()).ml(new F.Lb())},"$0","qg",0,0,null],
+z.MM.ml(G.vN()).ml(new F.Lb())},
 em:{
-"^":"Tp:451;",
-$1:[function(a){P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,450,[],"call"],
+"^":"Tp:225;",
+$1:[function(a){var z
+if(J.de(a.gOR(),C.nT)){z=J.RE(a)
+if(J.co(z.gG1(a),"Error evaluating expression"))z=J.kE(z.gG1(a),"Can't assign to null: ")===!0||J.kE(z.gG1(a),"Expression is not assignable: ")===!0
+else z=!1}else z=!1
+if(z)return
+P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,224,[],"call"],
 $isEH:true},
 Lb:{
-"^":"Tp:115;",
+"^":"Tp:16;",
 $1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"$1",null,2,0,null,116,[],"call"],
-$isEH:true}}],["metadata","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
+A.Ok()},"$1",null,2,0,null,17,[],"call"],
+$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
 jh:{
 "^":"a;T9,Ym",
-static:{"^":"n4I,ziq,pjg,nq,xa"}},
-tzK:{
+static:{"^":"LB,en,pjg,nq,xa"}},
+WO:{
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
@@ -11150,34 +11212,40 @@
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V15;Mz%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gqW:[function(a){return a.Mz},null,null,1,0,126,"pad",82,104],
+sqW:[function(a,b){a.Mz=this.ct(a,C.ZU,a.Mz,b)},null,null,3,0,127,27,[],"pad",82],
 "@":function(){return[C.nW]},
 static:{aD:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.Mz=!0
 a.SO=z
 a.B7=y
 a.X0=w
 C.kD.ZL(a)
 C.kD.oX(a)
-return a},null,null,0,0,126,"new NavBarElement$created"]}},
-"+NavBarElement":[452],
+return a},null,null,0,0,22,"new NavBarElement$created"]}},
+"+NavBarElement":[226],
+V15:{
+"^":"uL+Pi;",
+$isd3:true},
 aQ:{
-"^":["V15;KU%-347,V4%-347,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+"^":["V16;KU%-125,V4%-125,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
+gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
 "@":function(){return[C.u7]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.KU="#"
@@ -11188,22 +11256,22 @@
 a.X0=w
 C.SU.ZL(a)
 C.SU.oX(a)
-return a},null,null,0,0,126,"new NavMenuElement$created"]}},
-"+NavMenuElement":[453],
-V15:{
+return a},null,null,0,0,22,"new NavMenuElement$created"]}},
+"+NavMenuElement":[227],
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V16;KU%-347,V4%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
+"^":["V17;KU%-125,V4%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
+gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
 "@":function(){return[C.qT]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.KU="#"
@@ -11213,31 +11281,31 @@
 a.X0=w
 C.nn.ZL(a)
 C.nn.oX(a)
-return a},null,null,0,0,126,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[454],
-V16:{
+return a},null,null,0,0,22,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[228],
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V17;rU%-85,SB%-335,Hq%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,126,"callback",307,330],
+"^":["V18;rU%-29,SB%-109,Hq%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,22,"callback",82,104],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,115,30,[],"callback",307],
-gxw:[function(a){return a.SB},null,null,1,0,348,"active",307,330],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,349,30,[],"active",307],
-gph:[function(a){return a.Hq},null,null,1,0,312,"label",307,330],
-sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,32,30,[],"label",307],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,16,27,[],"callback",82],
+gxw:[function(a){return a.SB},null,null,1,0,126,"active",82,104],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,127,27,[],"active",82],
+gph:[function(a){return a.Hq},null,null,1,0,87,"label",82,104],
+sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,8,27,[],"label",82],
 Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,343,21,[],344,[],82,[],"buttonClick"],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,125,"refreshDone"],
+if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,120,7,[],121,[],119,[],"buttonClick"],
+ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,21,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{zN:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SB=!1
@@ -11247,20 +11315,20 @@
 a.X0=w
 C.J7.ZL(a)
 C.J7.oX(a)
-return a},null,null,0,0,126,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[455],
-V17:{
+return a},null,null,0,0,22,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[229],
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V18;Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+"^":["V19;Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
 "@":function(){return[C.hr]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11269,22 +11337,27 @@
 a.X0=w
 C.lx.ZL(a)
 C.lx.oX(a)
-return a},null,null,0,0,126,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[456],
-V18:{
+return a},null,null,0,0,22,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[230],
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 Mv:{
-"^":["V19;Jo%-335,iy%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
-gF1:[function(a){return a.iy},null,null,1,0,306,"isolate",307,330],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,309,30,[],"isolate",307],
-"@":function(){return[C.zaS]},
+"^":["V20;Jo%-109,iy%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+gF1:[function(a){return a.iy},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,84,27,[],"isolate",82],
+vD:[function(a,b){this.ct(a,C.Ia,0,1)},"$1","gQ1",2,0,26,65,[],"isolateChanged"],
+gu6:[function(a){var z=a.iy
+if(z!=null)return z.gHP()
+else return""},null,null,1,0,87,"hashLinkWorkaround",82],
+su6:[function(a,b){},null,null,3,0,16,231,[],"hashLinkWorkaround",82],
+"@":function(){return[C.oD]},
 static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11293,22 +11366,22 @@
 a.X0=w
 C.RR.ZL(a)
 C.RR.oX(a)
-return a},null,null,0,0,126,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[457],
-V19:{
+return a},null,null,0,0,22,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[232],
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
-oM:{
-"^":["V20;Ap%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,329,"library",307,330],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,331,30,[],"library",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+Zt:{
+"^":["V21;Ap%-220,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,221,"library",82,104],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,222,27,[],"library",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11317,22 +11390,22 @@
 a.X0=w
 C.ct.ZL(a)
 C.ct.oX(a)
-return a},null,null,0,0,126,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[458],
-V20:{
+return a},null,null,0,0,22,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[233],
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 iL:{
-"^":["V21;Au%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Au},null,null,1,0,329,"cls",307,330],
-sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,331,30,[],"cls",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
-"@":function(){return[C.qJ]},
+"^":["V22;Au%-101,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Au},null,null,1,0,103,"cls",82,104],
+sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,105,27,[],"cls",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+"@":function(){return[C.iF]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11341,35 +11414,35 @@
 a.X0=w
 C.ae.ZL(a)
 C.ae.oX(a)
-return a},null,null,0,0,126,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[459],
-V21:{
+return a},null,null,0,0,22,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[234],
+V22:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 F1i:{
-"^":["V22;k5%-335,Oe%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,348,"devtools",307,330],
-szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,349,30,[],"devtools",307],
-guw:[function(a){return a.Oe},null,null,1,0,461,"app",307,308],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,462,30,[],"app",307],
+"^":["V23;k5%-109,Oe%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,126,"devtools",82,104],
+szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,127,27,[],"devtools",82],
+guw:[function(a){return a.Oe},null,null,1,0,236,"app",82,83],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,237,27,[],"app",82],
 ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.hq()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.SC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.US()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,126,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,22,"created"],
 "@":function(){return[C.kR]},
 static:{fv:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.k5=!1
@@ -11379,43 +11452,43 @@
 C.k0.ZL(a)
 C.k0.oX(a)
 C.k0.ZB(a)
-return a},null,null,0,0,126,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[463],
-V22:{
+return a},null,null,0,0,22,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[238],
+V23:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,125,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,125,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,464,12,[],242,[],243,[],"attributeChanged"],
-b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,465,122,[],"formatTimePrecise"],
-nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,465,122,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,465,28,[],"formatSeconds"],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,120,123,[],"formatSize"],
+"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,21,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,21,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,239,64,[],65,[],66,[],"attributeChanged"],
+b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,240,241,[],"formatTimePrecise"],
+nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,240,241,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,240,231,[],"formatSeconds"],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,18,19,[],"formatSize"],
 at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","gNh",2,0,466,467,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,468,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,468,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","guT",2,0,242,243,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,244,245,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,244,245,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,468,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,468,11,[],"isBool"],
-ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,468,11,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,468,11,[],"isInstance"],
-JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,468,11,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,244,245,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,244,245,[],"isBool"],
+ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,244,245,[],"isString"],
+rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,244,245,[],"isInstance"],
+JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,244,245,[],"isDouble"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,468,11,[],"isList"],
-tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,468,11,[],"isType"],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,468,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,244,245,[],"isList"],
+tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,244,245,[],"isType"],
+AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,244,245,[],"isUnexpected"],
 "@":function(){return[C.Br]},
 static:{Hx:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -11423,8 +11496,8 @@
 a.X0=w
 C.Pf.ZL(a)
 C.Pf.oX(a)
-return a},null,null,0,0,126,"new ObservatoryElement$created"]}},
-"+ObservatoryElement":[469]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+return a},null,null,0,0,22,"new ObservatoryElement$created"]}},
+"+ObservatoryElement":[246]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -11433,8 +11506,8 @@
 z=P.bK(this.gl1(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,125],
-ni:[function(a){a.AP=null},"$0","gl1",0,0,125],
+k0:[function(a){},"$0","gqw",0,0,21],
+ni:[function(a){a.AP=null},"$0","gl1",0,0,21],
 BN:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -11442,7 +11515,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,348],
+return!0}return!1},"$0","gDx",0,0,126],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -11466,7 +11539,7 @@
 "^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
 kb:function(a){return this.rk.$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,126,"value",307],
+gP:[function(a){return this.Sv},null,null,1,0,22,"value",82],
 wE:function(a){var z,y,x,w,v
 if(this.YX)return
 this.YX=!0
@@ -11479,14 +11552,14 @@
 x.push(w)}this.Ow()},
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"$1","geu",2,0,169,116,[]],
+P.rb(this.gMc())},"$1","geu",2,0,26,17,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
 if(z.length===0)return
 y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
 if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,125],
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,21],
 cO:function(a){var z,y
 z=this.b9
 if(z.length===0)return
@@ -11494,15 +11567,15 @@
 C.Nm.sB(z,0)
 C.Nm.sB(this.kK,0)
 this.Sv=null},
-k0:[function(a){return this.wE(0)},"$0","gqw",0,0,126],
-ni:[function(a){return this.cO(0)},"$0","gl1",0,0,126],
+k0:[function(a){return this.wE(0)},"$0","gqw",0,0,22],
+ni:[function(a){return this.cO(0)},"$0","gl1",0,0,22],
 $isJ3:true},
 E5:{
-"^":"Tp:115;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,69,[],"call"],
 $isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
-Y3:[function(){var z,y,x,w,v,u,t,s,r,q
+Y3:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
 if($.tW==null)return
 $.Td=!0
@@ -11524,45 +11597,45 @@
 for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
 q=J.U6(r)
 w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
-$.Td=!1},"$0","D6",0,0,null],
-Ht:[function(){var z={}
+$.Td=!1},
+Ht:function(){var z={}
 z.a=!1
 z=new O.o5(z)
-return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"$0","Zq",0,0,null],
+return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},
 o5:{
-"^":"Tp:470;a",
-$2:[function(a,b){var z=this.a
+"^":"Tp:247;a",
+$2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},"$2",null,4,0,null,181,[],166,[],"call"],
+a.RK(b,new O.b5(z))},
 $isEH:true},
 b5:{
-"^":"Tp:126;a",
+"^":"Tp:22;a",
 $0:[function(){this.a.a=!1
 O.Y3()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:182;b",
+"^":"Tp:36;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
+return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
 $isEH:true},
 Zb:{
-"^":"Tp:126;c,d,e,f",
+"^":"Tp:22;c,d,e,f",
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:471;UI",
+"^":"Tp:248;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
+return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
 $isEH:true},
 iV:{
-"^":"Tp:115;bK,Gq,Rm,w3",
+"^":"Tp:16;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,28,[],"call"],
+return this.w3.$1(a)},"$1",null,2,0,null,231,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
-f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+f6:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=J.WB(J.xH(f,e),1)
 y=J.WB(J.xH(c,b),1)
 if(typeof z!=="number")return H.s(z)
@@ -11597,8 +11670,8 @@
 if(typeof n!=="number")return n.g()
 n=P.J(o+1,n+1)
 if(t>=l)return H.e(m,t)
-m[t]=n}}return x},"$6","cL",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+m[t]=n}}return x},
+Mw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
 if(0>=z)return H.e(a,0)
@@ -11632,11 +11705,11 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"$1","fZ",2,0,null,260,[]],
-rB:[function(a,b,c){var z,y,x
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},
+rB:function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"$3","QI",6,0,null,261,[],262,[],263,[]],
-xU:[function(a,b,c){var z,y,x,w,v,u
+return c},
+xU:function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
 x=J.U6(b)
@@ -11646,8 +11719,8 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"$3","M9",6,0,null,261,[],262,[],263,[]],
-jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+if(!u)break;++v}return v},
+jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
 x=P.J(z.W(c,b),y.W(f,e))
@@ -11667,7 +11740,7 @@
 if(typeof f!=="number")return H.s(f)
 z=J.U6(d)
 for(;e<f;e=r){r=e+1
-J.bi(s.Il,z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
+J.wT(s.Il,z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
 t=[]
 y=new P.Yp(t)
 y.$builtinTypeInfo=[null]
@@ -11682,7 +11755,7 @@
 y.$builtinTypeInfo=[null]
 s=new G.DA(a,y,t,n,0)}s.dM=J.WB(s.dM,1)
 n=J.WB(n,1)
-J.bi(s.Il,z.t(d,o));++o
+J.wT(s.Il,z.t(d,o));++o
 break
 case 2:if(s==null){t=[]
 y=new P.Yp(t)
@@ -11693,10 +11766,10 @@
 case 3:if(s==null){t=[]
 y=new P.Yp(t)
 y.$builtinTypeInfo=[null]
-s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
+s=new G.DA(a,y,t,n,0)}J.wT(s.Il,z.t(d,o));++o
 break}if(s!=null)p.push(s)
-return p},"$6","mu",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return p},
+m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
@@ -11735,12 +11808,12 @@
 q.jr=J.WB(q.jr,m)
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"$2","pE",4,0,null,264,[],29,[]],
-xl:[function(a,b){var z,y
+t=!0}else t=!1}if(!t)a.push(u)},
+xl:function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"$2","l0",4,0,null,76,[],265,[]],
-u2:[function(a,b){var z,y,x,w,v,u
+return z},
+u2:function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
 for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
@@ -11749,7 +11822,7 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"$2","W5",4,0,null,76,[],265,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},
 DA:{
 "^":"a;WA>,ok,Il<,jr,dM",
 gvH:function(a){return this.jr},
@@ -11780,15 +11853,15 @@
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
-Wi:[function(a,b,c,d){var z=J.RE(a)
+Wi:function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"$4","Ha",8,0,null,101,[],266,[],242,[],243,[]],
+return d},
 d3:{
 "^":"a;",
 $isd3:true},
-lS:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y,x,w,v
+X6:{
+"^":"Tp:75;a,b",
+$2:function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
 if(!J.de(b,y)){x=this.a
@@ -11797,14 +11870,14 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},"$2",null,4,0,null,12,[],242,[],"call"],
+z.V2.u(0,a,y)}},
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
 xh:{
 "^":"Pi;L1,AP,fn",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",307],
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},243,[],"value",307],
-bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",82],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},66,[],"value",82],
+bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
 "^":"er;b3,xg,ao,AP,fn",
@@ -11812,7 +11885,7 @@
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.ao.length},null,null,1,0,472,"length",307],
+gB:[function(a){return this.ao.length},null,null,1,0,249,"length",82],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.ao
 y=z.length
@@ -11840,10 +11913,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,361,30,[],"length",307],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,137,27,[],"length",82],
 t:[function(a,b){var z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.bU]}},this.$receiver,"wn")},15,[],"[]",307],
+return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[P.KN]}},this.$receiver,"wn")},73,[],"[]",82],
 u:[function(a,b,c){var z,y,x,w
 z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -11855,12 +11928,12 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.bU,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",307],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,348,"isEmpty",307],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,348,"isNotEmpty",307],
+z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[P.KN,a]}},this.$receiver,"wn")},73,[],27,[],"[]=",82],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,126,"isEmpty",82],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,126,"isNotEmpty",82],
 Mh:function(a,b,c){var z,y,x
 z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$iszM&&!z.$isz5)c=z.br(c)
 y=J.q8(c)
 z=this.xg
 if(z!=null){x=z.iE
@@ -11921,7 +11994,7 @@
 oF:function(a,b,c){var z,y,x,w
 if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$iszM&&!z.$isz5)c=z.br(c)
 y=J.q8(c)
 z=this.ao
 x=z.length
@@ -11975,7 +12048,7 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,348],
+return!0}return!1},"$0","gL6",0,0,126],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -11983,8 +12056,8 @@
 "^":"ar+Pi;",
 $isd3:true},
 Bj:{
-"^":"Tp:126;a",
-$0:[function(){this.a.xg=null},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){this.a.xg=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
 HA:{
@@ -11996,18 +12069,18 @@
 $isHA:true},
 qC:{
 "^":"Pi;Zp,AP,fn",
-gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",307],
+gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",82],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",307],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",82],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,472,"length",307],
+return z.gB(z)},null,null,1,0,249,"length",82],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,348,"isEmpty",307],
+return z.gB(z)===0},null,null,1,0,126,"isEmpty",82],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,348,"isNotEmpty",307],
-di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,473,30,[],"containsValue",307],
-x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,473,49,[],"containsKey",307],
-t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},49,[],"[]",307],
+return z.gB(z)!==0},null,null,1,0,126,"isNotEmpty",82],
+di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,250,27,[],"containsValue",82],
+x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,250,76,[],"containsKey",82],
+t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},76,[],"[]",82],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -12016,9 +12089,8 @@
 w=this.AP
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
-if(w){z=z.gB(z)
-if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},49,[],30,[],"[]=",307],
+if(w)if(y!==z.gB(z)){F.Wi(this,C.Wn,y,z.gB(z))
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},76,[],27,[],"[]=",82],
 FV:function(a,b){J.kH(b,new V.zT(this))},
 Rz:function(a,b){var z,y,x,w,v
 z=this.Zp
@@ -12050,68 +12122,68 @@
 return y}}},
 zT:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){var z=this.a
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
-Wa:[function(a,b){var z=J.x(a)
+Wa:function(a,b){var z=J.x(a)
 if(!!z.$isqI)return J.de(a.oc,b)
 if(!!z.$isHA){z=J.x(b)
 if(!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"$2","Uv",4,0,null,29,[],49,[]],
-yf:[function(a,b){var z,y,x,w
+return J.de(a.G3,b)}return!1},
+yf:function(a,b){var z,y,x,w
 if(a==null)return
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=H.jO(J.bB(z.gAx()).LU)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
+y=J.zH(z)
 try{if(L.TH(y,b)){x=z.rN(b).gAx()
 return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
 return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.Ek))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},"$2","MT",4,0,null,6,[],74,[]],
-ir:[function(a,b,c){var z,y,x,w
+return},
+ir:function(a,b,c){var z,y,x,w
 if(a==null)return!1
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
 return!0}}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=H.jO(J.bB(z.gAx()).LU)
+y=J.zH(z)
 try{if(L.dR(y,b)){x=c
 z.tu(b,2,[x],C.CM)
 H.vn(x)
 return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
 return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.Ek))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"$3","J6",6,0,null,6,[],74,[],30,[]],
-TH:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb
+return!1},
+TH:function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().Fb
 if(z.x4(b))return!0
 if(z.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y
+a=L.pY(a)}return!1},
+dR:function(a,b){var z,y
 z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
-for(;!J.de(a,$.aA());){y=a.gYK().nb
+for(;!J.de(a,$.aA());){y=a.gYK().Fb
 if(!!J.x(y.t(0,b)).$isRY)return!0
 if(y.x4(z))return!0
 if(y.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
+a=L.pY(a)}return!1},
+M6:function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().Fb.t(0,b)
 if(!!J.x(z).$isRS&&z.guU())return!0
-a=L.pY(a)}return!1},"$2","Wt",4,0,null,11,[],12,[]],
-pY:[function(a){var z,y
+a=L.pY(a)}return!1},
+pY:function(a){var z,y
 try{z=a.gAY()
 return z}catch(y){H.Ru(y)
-return $.aA()}},"$1","WV",2,0,null,11,[]],
-cB:[function(a){a=J.JA(a,$.c3(),"")
+return $.aA()}},
+cB:function(a){a=J.JA(a,$.c3(),"")
 if(a==="")return!0
 if(0>=a.length)return H.e(a,0)
 if(a[0]===".")return!1
-return $.tN().zD(a)},"$1","wf",2,0,null,94,[]],
+return $.tN().zD(a)},
 WR:{
 "^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
 E4:function(a){return this.cT.$1(a)},
@@ -12124,7 +12196,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,126,"value",307],
+return C.Nm.grZ(this.kN)},null,null,1,0,22,"value",82],
 sP:[function(a,b){var z,y,x,w
 z=this.BK
 y=z.length
@@ -12140,16 +12212,16 @@
 if(w>=z.length)return H.e(z,w)
 if(L.ir(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,474,243,[],"value",307],
+z[y]=b}},null,null,3,0,251,66,[],"value",82],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
-this.XI()},"$0","gqw",0,0,125],
+this.XI()},"$0","gqw",0,0,21],
 ni:[function(a){var z,y
 for(z=0;y=this.cs,z<y.length;++z){y=y[z]
 if(y!=null){y.ed()
 y=this.cs
 if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,125],
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,21],
 Zy:function(a){var z,y,x,w,v,u
 if(a==null)a=this.BK.length
 z=this.BK
@@ -12235,24 +12307,24 @@
 z.d4(a,b,c)
 return z}}},
 qL:{
-"^":"Tp:115;",
-$1:[function(a){return},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return},
 $isEH:true},
 Px:{
-"^":"Tp:475;a,b,c",
+"^":"Tp:253;a,b,c",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"$1",null,2,0,null,265,[],"call"],
+return}},"$1",null,2,0,null,252,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:476;d,e,f",
+"^":"Tp:254;d,e,f",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"$1",null,2,0,null,265,[],"call"],
+return}},"$1",null,2,0,null,252,[],"call"],
 $isEH:true},
 Md:{
-"^":"Tp:126;",
-$0:[function(){return new H.VR(H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
 Jk:[function(a){var z,y,x
@@ -12263,46 +12335,46 @@
 return y}if(!!z.$isQV){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"$1","np",2,0,115,30,[]],
+return x}return a},"$1","np",2,0,16,27,[]],
 km:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,374,[],121,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
-JX:[function(){var z,y
+JX:function(){var z,y
 z=document.createElement("style",null)
 J.c9(z,".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n")
 y=document.querySelector("head")
 y.insertBefore(z,y.firstChild)
 A.B2()
-$.mC().MM.ml(new A.Zj())},"$0","Ti",0,0,null],
-B2:[function(){var z,y,x
+$.mC().MM.ml(new A.Zj())},
+B2:function(){var z,y,x
 for(z=$.IN(),z=H.VM(new H.a7(z,1,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.pP(x.lo).h(0,"polymer-veiled")}},"$0","r8",0,0,null],
-yV:[function(a){var z,y
+for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.wT(J.pP(x.lo),"polymer-veiled")}},
+yV:function(a){var z,y
 z=$.xY().Rz(0,a)
-if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w
+if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},
+oF:function(a,b){var z,y,x,w
 if(J.de(a,$.H8()))return b
 b=A.oF(a.gAY(),b)
-for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
+for(z=a.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(y.gFo()||y.gq4())continue
 x=J.x(y)
 if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
 else w=!0
 if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=P.Fl(null,null)
-b.u(0,y.gIf(),y)}break}}return b},"$2","Cd",4,0,null,267,[],268,[]],
-Oy:[function(a,b){var z,y
-do{z=a.gYK().nb.t(0,b)
+b.u(0,y.gIf(),y)}break}}return b},
+yX:function(a,b){var z,y
+do{z=a.gYK().Fb.t(0,b)
 y=J.x(z)
 if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
 a=a.gAY()}while(!J.de(a,$.H8()))
-return},"$2","il",4,0,null,267,[],74,[]],
-bc:[function(a,b){var z,y
+return},
+bc:function(a,b){var z,y
 z=H.u1(H.d(b.gIf().fN)+"=")
-y=a.gYK().nb.t(0,new H.GD(z))
-return!!J.x(y).$isRS&&y.ghB()},"$2","i8",4,0,null,267,[],269,[]],
-YG:[function(a,b,c){var z,y,x
+y=a.gYK().Fb.t(0,new H.GD(z))
+return!!J.x(y).$isRS&&y.ghB()},
+YG:function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
 if(!z.Bm("ShadowDOMPolyfill"))return
@@ -12310,8 +12382,8 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},"$3","OA",6,0,null,270,[],12,[],271,[]],
-Hl:[function(a){var z,y,x,w,v,u
+x.V7("shimStyling",[a,b,c])},
+Hl:function(a){var z,y,x,w,v,u
 if(a==null)return""
 w=J.RE(a)
 z=w.gmH(a)
@@ -12329,67 +12401,68 @@
 if(!!J.x(w).$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"$1","NI",2,0,null,272,[]],
-Ad:[function(a,b){var z
+return""}else throw u}},
+Ad:function(a,b){var z
 if(b==null)b=C.Tu
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},"$2","ZK",2,2,null,85,12,[],11,[]],
-xv:[function(a){A.pb(a,new A.Mq())},"$1","N1",2,0,null,273,[]],
-pb:[function(a,b){var z
+if(z!=null)J.Or(z)},
+xv:function(a){A.om(a,new A.Mq())},
+om:function(a,b){var z
 if(a==null)return
 b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],164,[]],
-lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
-return new A.L6(a,b)},"$4","y4",8,0,null,274,[],12,[],273,[],275,[]],
-z9:[function(a){var z
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},
+lJ:function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
+return new A.L6(a,b)},
+z9:function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"$1","b4",2,0,null,273,[]],
-HR:[function(a,b,c){var z,y,x
+return $.od().t(0,a)},
+HR:function(a,b,c){var z,y,x
 z=H.vn(a)
-y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
+y=A.Rk(z.gt5(z),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"$3","xi",6,0,null,48,[],276,[],19,[]],
-Rk:[function(a,b){var z
-do{z=a.gYK().nb.t(0,b)
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},
+Rk:function(a,b){var z
+do{z=a.gYK().Fb.t(0,b)
 if(!!J.x(z).$isRS)return z
-a=a.gAY()}while(a!=null)},"$2","Uy",4,0,null,11,[],12,[]],
-ZI:[function(a,b){var z,y
+a=a.gAY()}while(a!=null)},
+ZI:function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
 J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"$2","tO",4,0,null,277,[],278,[]],
-pX:[function(){var z=window
+b.appendChild(z)},
+pX:function(){var z=window
 C.ol.hr(z)
-C.ol.oB(z,W.aF(new A.hm()))},"$0","ji",0,0,null],
-al:[function(a,b){var z,y,x
+C.ol.oB(z,W.aF(new A.hm()))},
+al:function(a,b){var z,y,x
 z=J.x(b)
 y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
 z=J.RE(y)
 if(J.de(z.gUx(y),C.PU)||J.de(z.gUx(y),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"$2","bP",4,0,null,30,[],74,[]],
-h5:[function(a){if(a==null)return C.Qf
+z=H.vn(a)
+return z.gt5(z)}return y},
+h5:function(a){if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
 if(typeof a==="boolean")return C.HL
 if(typeof a==="string")return C.Db
 if(!!J.x(a).$isiP)return C.Yc
-return},"$1","v9",2,0,null,30,[]],
-Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
+return},
+Ok:function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
-return $.X3},"$0","ym",0,0,null],
+return $.X3},
 ei:[function(){var z=document
 W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
-$.ax().ml(new A.rD())},"$0","PB",0,0,125],
-Jv:[function(){var z,y,x,w,v,u,t
-for(w=$.nT(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
+$.ax().ml(new A.rD())},"$0","PB",0,0,21],
+Jv:function(){var z,y,x,w,v,u,t
+for(w=$.UP(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
 try{A.pw(z)}catch(v){u=H.Ru(v)
 y=u
 x=new H.XO(v,null)
@@ -12399,11 +12472,11 @@
 t=y
 if(t==null)H.vh(P.u("Error must not be null"))
 if(u.Gv!==0)H.vh(P.w("Future already completed"))
-u.CG(t,x)}}},"$0","vH",0,0,null],
-GA:[function(a,b,c,d){var z,y,x,w,v,u
+u.CG(t,x)}}},
+GA:function(a,b,c,d){var z,y,x,w,v,u
 if(c==null)c=P.Ls(null,null,null,W.YN)
 if(d==null){d=[]
-d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
+d.$builtinTypeInfo=[P.qU]}if(a==null){z="warning: "+H.d(b)+" not found."
 y=$.oK
 if(y==null)H.qw(z)
 else y.$1(z)
@@ -12417,8 +12490,8 @@
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.$1(z)}}return d},"$4","fE",4,4,null,85,85,279,[],280,[],281,[],282,[]],
-pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+else v.$1(z)}}return d},
+pw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
 y=P.hK(a)
@@ -12440,17 +12513,19 @@
 s=y.tP}w=z.ku
 v=z.gJf(z)
 u=z.gtp(z)}x=z.Fi}p=P.R6(y.Ka,v,t,null,u,s,null,x,w)
-y=$.UG().nb
+y=$.UG().Fb
 o=y.t(0,p)
 n=p.r0
-if(p.Fi===z.Fi)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
+r=p.Fi
+q=z.Fi
+if(r==null?q==null:r===q)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
 else z=!1
 else z=!1
 else z=!1
 if(z){z=p.r0
 m=y.t(0,P.hK("package:"+C.xB.yn(z,J.U6(z).cn(z,"packages/")+9)))
 if(m!=null)o=m}if(o==null){$.M7().To(p.bu(0)+" library not found")
-return}z=o.gYK().nb
+return}z=o.gYK().Fb
 z=z.gUQ(z)
 y=new A.Fn()
 r=new H.U5(z,y)
@@ -12459,7 +12534,7 @@
 y=new H.SO(z,y)
 y.$builtinTypeInfo=[H.Kp(r,0)]
 for(;y.G();)A.ZB(o,z.gl())
-z=o.gYK().nb
+z=o.gYK().Fb
 z=z.gUQ(z)
 y=new A.e3()
 r=new H.U5(z,y)
@@ -12473,8 +12548,8 @@
 j=l.gYj()
 $.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"$1","qt",2,0,null,283,[]],
-ZB:[function(a,b){var z,y,x
+if(i!=null)J.Or(i)}}}},
+ZB:function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
 if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+J.AG(b.gIf())+" is not."
@@ -12487,10 +12562,10 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.$1(x)
-return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],233,[]],
+return}a.CI(b.gIf(),C.xD)},
 Zj:{
-"^":"Tp:115;",
-$1:[function(a){A.pX()},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){A.pX()},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 XP:{
 "^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,lk",
@@ -12526,7 +12601,7 @@
 A.ZI(this.J3(a,this.kO(a,"global"),"global"),document.head)
 A.YG(this.gZf(a),y,z)
 w=P.re(a.zx)
-v=w.gYK().nb.t(0,C.c8)
+v=w.gYK().Fb.t(0,C.c8)
 if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
 this.Ba(a,y)
 A.yV(a.RT)},
@@ -12534,7 +12609,7 @@
 $.p2().u(0,b,a)
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
 return!0},
-PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
+PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.wT($.xY().to(b,new A.q6()),a)
 return!0}return!1},
 Ba:function(a,b){var z,y,x,w
 for(z=a,y=null;z!=null;){x=J.RE(z)
@@ -12555,7 +12630,7 @@
 y=y!=null&&y.x4(w)}else y=!1
 if(y)continue
 v=new H.GD(H.u1(w))
-u=A.Oy(b,v)
+u=A.yX(b,v)
 if(u==null){window
 y="property for attribute "+w+" of polymer-element name="+H.d(a.RT)+" not found."
 if(typeof console!="undefined")console.warn(y)
@@ -12563,7 +12638,7 @@
 if(y==null){y=P.Fl(null,null)
 a.Q7=y}y.u(0,v,u)}}},
 Vk:function(a){var z,y
-z=P.L5(null,null,null,J.O,P.a)
+z=P.L5(null,null,null,P.qU,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
@@ -12611,14 +12686,14 @@
 q1:function(a,b){var z,y,x,w
 if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
-for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
+for(z=b.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
 x=y.gIf().fN
 w=J.rY(x)
 if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
 x=w.Nj(x,0,J.xH(w.gB(x),7))
 a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},
-qC:function(a,b){var z=P.L5(null,null,null,J.O,null)
+qC:function(a,b){var z=P.L5(null,null,null,P.qU,null)
 b.aN(0,new A.MX(z))
 return z},
 du:function(a){a.RT=a.getAttribute("name")
@@ -12629,48 +12704,48 @@
 C.zb.du(a)
 return a}}},
 q6:{
-"^":"Tp:126;",
-$0:[function(){return[]},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return[]},
 $isEH:true},
 CK:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"$2",null,4,0,null,12,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},
 $isEH:true},
 LJ:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x
+"^":"Tp:75;a",
+$2:function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"$2",null,4,0,null,12,[],30,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
 $isEH:true},
 ZG:{
-"^":"Tp:115;",
-$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
 Oc:{
-"^":"Tp:115;a",
-$1:[function(a){return J.Kf(a,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.Kf(a,this.a)},
 $isEH:true},
 MX:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"$2",null,4,0,null,12,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},
 $isEH:true},
-w13:{
-"^":"Tp:126;",
-$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
+w12:{
+"^":"Tp:22;",
+$0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
 C.FS.aN(0,new A.r3y(z))
-return z},"$0",null,0,0,null,"call"],
+return z},
 $isEH:true},
 r3y:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,477,[],478,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,b,a)},
 $isEH:true},
 yL:{
 "^":"ndx;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-328",function(){return[C.Nw]}],
+"^":["a;KM:X0=-102",function(){return[C.Nw]}],
 Pa:function(a){var z
 if(W.Pv(this.gM0(a).defaultView)==null)z=$.Bh>0
 else z=!0
@@ -12735,7 +12810,7 @@
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
 if(w==null?x!=null:w!==x){y.tu(z.gIf(),2,[w],C.CM)
-H.vn(w)}},"$2","ghW",4,0,479,12,[],30,[]],
+H.vn(w)}},"$2","ghW",4,0,255],
 B2:function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},
@@ -12787,14 +12862,14 @@
 J.AA(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,125],
+y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,21],
 BT:function(a,b){var z
 if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
 return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.pb(this.gIW(a),new A.TV())},
+A.om(this.gIW(a),new A.TV())},
 oW:function(a){return this.BT(a,null)},
 Xl:function(a){var z,y,x,w,v
 z=J.xR(a.dZ)
@@ -12807,7 +12882,7 @@
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
 if(!J.x(v).$isqI)continue
-J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,480,481,[]],
+J.Pz(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,256,257,[]],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
@@ -12824,7 +12899,7 @@
 w.Bd=x.Al(P.v3())
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
-if(v==null){v=P.L5(null,null,null,J.O,P.MO)
+if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
 a.Sa=v}v.u(0,x,w)}},
 l5:function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
@@ -12861,7 +12936,7 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,482,316,[]],
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,258,91,[]],
 ea:function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
@@ -12877,31 +12952,31 @@
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=J.Vs(this.a)
+"^":"Tp:75;a",
+$2:function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
-z.t(0,a)},"$2",null,4,0,null,12,[],30,[],"call"],
+z.t(0,a)},
 $isEH:true},
 Xi:{
-"^":"Tp:126;b",
-$0:[function(){return this.b},"$0",null,0,0,null,"call"],
+"^":"Tp:22;b",
+$0:function(){return this.b},
 $isEH:true},
 TV:{
-"^":"Tp:115;",
-$1:[function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:16;",
+$1:function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},
 $isEH:true},
 Mq:{
-"^":"Tp:115;",
-$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"$1",null,2,0,null,273,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},
 $isEH:true},
 Oa:{
-"^":"Tp:126;a",
-$0:[function(){return new A.bS(this.a.jL,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return new A.bS(this.a.jL,null)},
 $isEH:true},
 n1:{
-"^":"Tp:300;b,c,d,e",
-$2:[function(a,b){var z,y,x
+"^":"Tp:75;b,c,d,e",
+$2:function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
 z=this.d
@@ -12910,14 +12985,14 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"$2",null,4,0,null,12,[],483,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},
 $isEH:true},
 xf:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:300;a,b",
+"^":"Tp:75;a,b",
 $2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -12926,10 +13001,10 @@
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,292,[],273,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,259,[],260,[],"call"],
 $isEH:true},
 Rs:{
-"^":"Tp:115;c,d,e",
+"^":"Tp:16;c,d,e",
 $1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.z9(z)
@@ -12941,25 +13016,26 @@
 u=L.Sk(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
 u=J.x(a)
-x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,316,[],"call"],
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 uJ:{
-"^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!a.gQ2()},
 $isEH:true},
 hm:{
-"^":"Tp:115;",
-$1:[function(a){var z,y,x
+"^":"Tp:16;",
+$1:[function(a){var z,y,x,w
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
 for(y=z.gA(z);y.G();){x=J.pP(y.lo)
-x.h(0,"polymer-unveil")
-x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,116,[],"call"],
+w=J.w1(x)
+w.h(x,"polymer-unveil")
+w.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
+y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 Ji:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"$1",null,2,0,null,116,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.V1(J.pP(z.lo),"polymer-unveil")},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 Bf:{
 "^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
@@ -12974,15 +13050,15 @@
 if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
 if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"$1","giz",2,0,485,265,[]],
+return}}},"$1","giz",2,0,261,252,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 xc:{
-"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 oX:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -12992,7 +13068,7 @@
 C.Iv.oX(a)
 return a}}},
 jpR:{
-"^":["qE+zs;KM:X0=-328",function(){return[C.Nw]}],
+"^":["qE+zs;KM:X0=-102",function(){return[C.Nw]}],
 $iszs:true,
 $isTU:true,
 $isd3:true,
@@ -13014,105 +13090,104 @@
 if(z!=null){z.ed()
 this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,125]},
+this.Ws()}},"$0","gv6",0,0,21]},
 V3:{
 "^":"a;ns",
 $isV3:true},
 rD:{
-"^":"Tp:115;",
+"^":"Tp:16;",
 $1:[function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
-return},"$1",null,2,0,null,116,[],"call"],
+return},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 Fn:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,486,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$isRS},
 $isEH:true},
 e3:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,486,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$isMs},
 $isEH:true},
 pM:{
-"^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!a.gQ2()},
 $isEH:true},
 Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
-Zh:[function(a,b,c){var z,y,x
+Zh:function(a,b,c){var z,y,x
 z=J.UQ($.CT(),J.Ba(c))
 if(z!=null)return z.$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"$3","jo",6,0,null,30,[],284,[],11,[]],
+return a}},
 W6:{
-"^":"Tp:126;",
-$0:[function(){var z=P.L5(null,null,null,null,null)
+"^":"Tp:22;",
+$0:function(){var z=P.L5(null,null,null,null,null)
 z.u(0,C.AZ,new Z.Lf())
 z.u(0,C.ok,new Z.fT())
 z.u(0,C.N4,new Z.pp())
 z.u(0,C.Kc,new Z.nl())
 z.u(0,C.PC,new Z.ik())
 z.u(0,C.md,new Z.LfS())
-return z},"$0",null,0,0,null,"call"],
+return z},
 $isEH:true},
 Lf:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:300;",
+"^":"Tp:75;",
 $2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"$2",null,4,0,null,28,[],487,[],"call"],
+return b}},"$2",null,4,0,null,231,[],262,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,231,[],17,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],487,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,231,[],262,[],"call"],
 $isEH:true},
 mf:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a},
 $isEH:true},
 LfS:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],487,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,231,[],262,[],"call"],
 $isEH:true},
 HK:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){return this.b},
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","qP",2,0,206,121,[]],
+return z},"$1","qP",2,0,54,70,[]],
 PX:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Fx",2,0,206,121,[]],
+return z},"$1","Fx",2,0,54,70,[]],
 o8:{
-"^":"Tp:115;a",
-$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,374,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.de(this.a.t(0,a),!0)},
 $isEH:true},
 ex:{
-"^":"Tp:115;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,374,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,158,[],"call"],
 $isEH:true},
 e9:{
 "^":"T4p;",
 op:[function(a,b,c){var z,y,x
-if(a==null)return
 z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
 y=new U.tc()
 y=new T.FX(y,z,null,null)
@@ -13124,23 +13199,23 @@
 if(M.wR(c)){z=J.x(b)
 z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"$3","gca",6,0,488,274,[],12,[],273,[]],
+return new T.Xy(this,b,x)},"$3","gca",6,0,263],
 CE:function(a){return new T.uK(this)}},
 Xy:{
-"^":"Tp:300;a,b,c",
+"^":"Tp:75;a,b,c",
 $2:[function(a,b){var z
 if(!J.x(a).$isz6){z=this.a.nF
 a=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}z=!!J.x(b).$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"$2",null,4,0,null,292,[],273,[],"call"],
+return T.FL(this.c,a,null)},"$2",null,4,0,null,259,[],260,[],"call"],
 $isEH:true},
 uK:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z
 if(!!J.x(a).$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,292,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,259,[],"call"],
 $isEH:true},
 mY:{
 "^":"Pi;a9,Cu,uI,Y7,AP,fn",
@@ -13149,12 +13224,12 @@
 z=this.Y7
 if(!!J.x(a).$isfk){y=J.OS(J.kl(a.bm,new T.mB(this,a)),!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,115,121,[]],
-gP:[function(a){return this.Y7},null,null,1,0,126,"value",307],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,16,70,[]],
+gP:[function(a){return this.Y7},null,null,1,0,22,"value",82],
 sP:[function(a,b){var z,y,x
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
 if(!!J.x(x).$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,115,121,[],"value",307],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,16,70,[],"value",82],
 yB:function(a,b,c){var z,y,x,w
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -13167,14 +13242,14 @@
 z.yB(a,b,c)
 return z}}},
 GX:{
-"^":"Tp:115;a",
-$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 mB:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
 $1:[function(a){var z=P.L5(null,null,null,null,null)
 z.u(0,this.b.F5,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,325,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,135,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
@@ -13187,14 +13262,14 @@
 bX:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,325,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,135,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CV",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
-OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
+OH:function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"$2","tk",4,0,null,285,[],278,[]],
-jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+return z.gLv()},
+jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
@@ -13222,79 +13297,79 @@
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
 else{H.vn(p).tu(new H.GD(H.u1(u)),2,[b],C.CM)
-H.vn(b)}},"$3","wA",6,0,null,285,[],30,[],278,[]],
-ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
-return a},"$1","W1",2,0,null,121,[]],
+H.vn(b)}},
+ci:function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},
+Uf:{
+"^":"Tp:75;",
+$2:function(a,b){return J.WB(a,b)},
+$isEH:true},
 wJY:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.xH(a,b)},
 $isEH:true},
 zOQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 W6o:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.FW(a,b)},
 $isEH:true},
 MdQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.de(a,b)},
 $isEH:true},
 YJG:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return!J.de(a,b)},
 $isEH:true},
 DOe:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.z8(a,b)},
 $isEH:true},
 lPa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 Ufa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 Raa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
 w0:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return a===!0||b===!0},
 $isEH:true},
 w4:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
 w5:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
-$isEH:true},
-w7:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=H.Og(P.a)
+"^":"Tp:75;",
+$2:function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"$2",null,4,0,null,117,[],128,[],"call"],
+throw H.b(K.kG("Filters must be a one-argument function."))},
+$isEH:true},
+w7:{
+"^":"Tp:16;",
+$1:function(a){return a},
 $isEH:true},
 w10:{
-"^":"Tp:115;",
-$1:[function(a){return a},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.Z7(a)},
 $isEH:true},
 w11:{
-"^":"Tp:115;",
-$1:[function(a){return J.Z7(a)},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
-w12:{
-"^":"Tp:115;",
-$1:[function(a){return a!==!0},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return a!==!0},
 $isEH:true},
 c4:{
-"^":"Tp:126;a",
-$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},
 $isEH:true},
 z6:{
 "^":"a;eT>,k8<,bq,G9",
@@ -13308,7 +13383,8 @@
 else{z=this.bq.Zp
 if(z.x4(b))return K.ci(z.t(0,b))
 else if(this.k8!=null){y=new H.GD(H.u1(b))
-x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
+z=this.gCH()
+x=Z.y1(z.gt5(z),y)
 z=J.x(x)
 if(!z.$isRY)w=!!z.$isRS&&x.glT()
 else w=!0
@@ -13316,17 +13392,19 @@
 else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(0,b))
 else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
-tI:function(a){var z
+tI:function(a){var z,y
 if(J.de(a,"this"))return
 else{z=this.bq
 if(z.Zp.x4(a))return z
 else{z=H.u1(a)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
+y=this.gCH()
+if(Z.y1(y.gt5(y),new H.GD(z))!=null)return this.k8}}z=this.eT
 if(z!=null)return z.tI(a)},
-tg:function(a,b){var z
+tg:function(a,b){var z,y
 if(this.bq.Zp.x4(b))return!0
 else{z=H.u1(b)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
+y=this.gCH()
+if(Z.y1(y.gt5(y),new H.GD(z))!=null)return!0}z=this.eT
 if(z!=null)return z.tg(0,b)
 return!1},
 $isz6:true},
@@ -13375,13 +13453,13 @@
 return x},
 ZR:function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
-y=a.gre()
-if(y==null)x=null
-else{w=this.gnG()
-y.toString
-x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
+if(a.gre()==null)y=null
+else{x=a.gre()
+w=this.gnG()
+x.toString
+y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.fa(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
-if(x!=null)H.bQ(x,new K.Os(v))
+if(y!=null)H.bQ(y,new K.Os(v))
 return v},
 ti:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 o0:function(a){var z,y
@@ -13392,7 +13470,7 @@
 YV:function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
-x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.jV(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
@@ -13416,16 +13494,16 @@
 y.sbO(x)
 return x}},
 Os:{
-"^":"Tp:115;a",
-$1:[function(a){var z=this.a
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
 a.sbO(z)
-return z},"$1",null,2,0,null,117,[],"call"],
+return z},
 $isEH:true},
 B8:{
-"^":"Tp:115;a",
-$1:[function(a){var z=this.a
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
 a.sbO(z)
-return z},"$1",null,2,0,null,21,[],"call"],
+return z},
 $isEH:true},
 Wh:{
 "^":"Ay;KL,bO,tj,Lv,k6",
@@ -13453,11 +13531,11 @@
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:300;",
-$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"$2",null,4,0,null,202,[],21,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
+return a},
 $isEH:true},
-qR:{
+jV:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
 RR:function(a,b){return b.YV(this)},
 $asAy:function(){return[U.wk]},
@@ -13479,12 +13557,12 @@
 $isw6:true,
 $ishw:true},
 Qv:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 Xm:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
 $isEH:true},
 mv:{
 "^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -13520,8 +13598,8 @@
 $isuk:true,
 $ishw:true},
 uA:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 vl:{
 "^":"Ay;hP<,KL,bO,tj,Lv,k6",
@@ -13541,12 +13619,12 @@
 $isx9:true,
 $ishw:true},
 Li:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 WK:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
 $isEH:true},
 iT:{
 "^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -13556,18 +13634,18 @@
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
-tE:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+ja:{
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 ey:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},
 $isEH:true},
 fa:{
 "^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -13591,16 +13669,16 @@
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:115;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,53,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:476;a,b,c",
-$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:254;a,b,c",
+$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 a9:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
 $isEH:true},
 VA:{
 "^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
@@ -13618,15 +13696,15 @@
 $isX7:true,
 $ishw:true},
 J1:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 fk:{
 "^":"a;F5,bm",
 $isfk:true},
 wL:{
-"^":"a:115;lR,ex",
-$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,489,[]],
+"^":"a:16;lR,ex",
+$1:function(a){return this.lR.F2(this.ex,[a],null).Ax},
 $iswL:true,
 $isEH:true},
 B0:{
@@ -13635,27 +13713,27 @@
 $isB0:true,
 static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
-Pu:[function(a,b){var z,y
+Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
 if(a==null||b==null)return!1
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,117,[],199,[]],
-au:[function(a){a.toString
-return U.xk(H.n3(a,0,new U.xs()))},"$1","bT",2,0,null,286,[]],
-Zm:[function(a,b){var z=J.WB(a,b)
+if(!J.de(y,b[z]))return!1}return!0},
+au:function(a){a.toString
+return U.xk(H.n3(a,0,new U.xs()))},
+Zm:function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","uN",4,0,null,238,[],30,[]],
-xk:[function(a){if(typeof a!=="number")return H.s(a)
+return a^a>>>6},
+xk:function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Zy",2,0,null,238,[]],
+return 536870911&a+((16383&a)<<15>>>0)},
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,490,21,[],117,[]],
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,264,7,[],53,[]],
 F2:function(a,b,c){return new U.Jy(a,b,c)}},
 hw:{
 "^":"a;",
@@ -13796,8 +13874,8 @@
 return U.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:300;",
-$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,491,[],492,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return U.Zm(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -13823,9 +13901,12 @@
 this.w5()
 w=this.o9()
 this.Sk.toString
-a=new U.X7(a,w)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
-else break
-return a},
+a=new U.X7(a,w)}else{if(J.de(J.Iz(this.fL.lo),8)){z=this.fL.lo.gG8()
+if(typeof z!=="number")return z.F()
+if(typeof b!=="number")return H.s(b)
+z=z>=b}else z=!1
+if(z)a=this.Tw(a)
+else break}return a},
 qL:function(a,b){var z,y
 z=J.x(b)
 if(!!z.$isw6){z=z.gP(b)
@@ -13834,12 +13915,17 @@
 y=b.gre()
 this.Sk.toString
 return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-Tw:function(a){var z,y,x
+Tw:function(a){var z,y,x,w
 z=this.fL.lo
 this.w5()
 y=this.WT()
 while(!0){x=this.fL.lo
-if(x!=null)x=(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9))&&J.z8(this.fL.lo.gG8(),z.gG8())
+if(x!=null)if(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9)){x=this.fL.lo.gG8()
+w=z.gG8()
+if(typeof x!=="number")return x.D()
+if(typeof w!=="number")return H.s(w)
+w=x>w
+x=w}else x=!1
 else x=!1
 if(!x)break
 y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
@@ -13949,17 +14035,17 @@
 return y},
 tw:function(){return this.yj("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,287,127,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,71,72,[]],
 Ae:{
-"^":"a;vH>-317,P>-493",
+"^":"a;vH>-93,P>-265",
 n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,115,99,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,472,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,312,"toString"],
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,16,69,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,249,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,87,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
 "<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.bU,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[P.KN,a]}},this.$receiver,"Ae")},73,[],27,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;ty",
@@ -13988,19 +14074,19 @@
 return!1},
 $asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
 "^":"",
-y1:[function(a,b){var z,y,x
-if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
+y1:function(a,b){var z,y,x
+if(a.gYK().Fb.x4(b))return a.gYK().Fb.t(0,b)
 z=a.gAY()
 if(z!=null&&!J.de(J.Ba(z),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"$2","rz",4,0,null,288,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
-wX:[function(a){switch(a){case 102:return 12
+wX:function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"$1","uO",2,0,null,289,[]],
+default:return a}},
 Pn:{
 "^":"a;fY>,P>,G8<",
 bu:function(a){return"("+this.fY+", '"+this.P+"')"},
@@ -14098,7 +14184,7 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,494,94,[]]},
+DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,266,267,[]]},
 d2:{
 "^":"fr;",
 W9:function(a){return this.xn(a)},
@@ -14111,8 +14197,7 @@
 this.xn(a)},
 ZR:function(a){var z
 J.UK(a.ghP(),this)
-z=a.gre()
-if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
 this.xn(a)},
 ti:function(a){return this.xn(a)},
 o0:function(a){var z
@@ -14132,14 +14217,14 @@
 this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 NQ:{
-"^":["V23;kW%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,461,"app",307,330],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,462,30,[],"app",307],
+"^":["V24;kW%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,236,"app",82,104],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,237,27,[],"app",82],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -14147,36 +14232,36 @@
 a.X0=w
 C.Cc.ZL(a)
 C.Cc.oX(a)
-return a},null,null,0,0,126,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[495],
-V23:{
+return a},null,null,0,0,22,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[268],
+V24:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
 ov:{
-"^":["V24;QV%-496,t7%-317,hX%-317,FZ%-335,Bs%-497,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.QV},null,null,1,0,498,"script",307,330],
-sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,499,30,[],"script",307],
-gBV:[function(a){return a.t7},null,null,1,0,472,"pos",307,330],
-sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,361,30,[],"pos",307],
-giX:[function(a){return a.hX},null,null,1,0,472,"endPos",307,330],
-siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,361,30,[],"endPos",307],
-gHp:[function(a){return a.FZ},null,null,1,0,348,"coverage",307,330],
-sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,349,30,[],"coverage",307],
-gSw:[function(a){return a.Bs},null,null,1,0,500,"lines",307,308],
-sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,501,30,[],"lines",307],
+"^":["V25;QV%-269,t7%-93,hX%-93,FZ%-109,Bs%-270,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.QV},null,null,1,0,271,"script",82,104],
+sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,272,27,[],"script",82],
+gBV:[function(a){return a.t7},null,null,1,0,249,"pos",82,104],
+sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,137,27,[],"pos",82],
+giX:[function(a){return a.hX},null,null,1,0,249,"endPos",82,104],
+siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,137,27,[],"endPos",82],
+gHp:[function(a){return a.FZ},null,null,1,0,126,"coverage",82,104],
+sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,127,27,[],"coverage",82],
+gSw:[function(a){return a.Bs},null,null,1,0,273,"lines",82,83],
+sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,274,27,[],"lines",82],
 rh:[function(a,b){this.VH(a)
-this.ct(a,C.du,0,1)},"$1","grO",2,0,169,242,[],"scriptChanged"],
-Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,169,242,[],"posChanged"],
+this.ct(a,C.du,0,1)},"$1","grO",2,0,26,65,[],"scriptChanged"],
+Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,26,65,[],"posChanged"],
 OM:[function(a,b){this.ct(a,C.Cv,0,1)
-this.ct(a,C.du,0,1)},"$1","gTA",2,0,115,242,[],"coverageChanged"],
+this.ct(a,C.du,0,1)},"$1","gTA",2,0,16,65,[],"coverageChanged"],
 qEQ:[function(a,b){var z,y
 z=a.QV
 if(z==null||a.FZ!==!0)return"min-width:32px;"
 y=J.UQ(z.gu9(),b.gRd())
 if(y==null)return"min-width:32px;"
 if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,502,192,[],"hitStyle",308],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,275,276,[],"hitStyle",83],
 VH:[function(a){var z,y,x,w,v
 if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
 return}this.ct(a,C.Cv,0,1)
@@ -14184,15 +14269,15 @@
 z=a.QV.q6(a.t7)
 y=a.hX
 x=a.QV
-if(y==null)J.bi(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
+if(y==null)J.wT(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
 else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"$0","gI2",0,0,125,"_updateProperties"],
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.wT(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"$0","gI2",0,0,21,"_updateProperties"],
 "@":function(){return[C.OLi]},
-static:{"^":"bN<-85,JP<-85,ze<-85",T5:[function(a){var z,y,x,w,v
+static:{"^":"bN<-29,JP<-29,VnP<-29",T5:[function(a){var z,y,x,w,v
 z=R.Jk([])
 y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.FZ=!1
@@ -14202,48 +14287,48 @@
 a.X0=v
 C.HD.ZL(a)
 C.HD.oX(a)
-return a},null,null,0,0,126,"new ScriptInsetElement$created"]}},
-"+ScriptInsetElement":[503],
-V24:{
+return a},null,null,0,0,22,"new ScriptInsetElement$created"]}},
+"+ScriptInsetElement":[277],
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 ZJ:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,115,116,[],"call"],
+if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,16,17,[],"call"],
 $isEH:true},
-"+ ZJ":[346]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+"+ ZJ":[124]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
-knI:{
-"^":["x4;jJ%-317,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gBV:[function(a){return a.jJ},null,null,1,0,472,"pos",307,330],
-sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,361,30,[],"pos",307],
+kn:{
+"^":["x4;jJ%-93,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gBV:[function(a){return a.jJ},null,null,1,0,249,"pos",82,104],
+sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,137,27,[],"pos",82],
 gD5:[function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gD5.call(this,a)
-return z.gzz()},null,null,1,0,312,"hoverText"],
-Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,169,242,[],"posChanged"],
+return z.gzz()},null,null,1,0,87,"hoverText"],
+Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,26,65,[],"posChanged"],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,169,116,[],"_updateProperties"],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,26,17,[],"_updateProperties"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,312,"name"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,87,"name"],
 gO3:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,312,"url"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,87,"url"],
 "@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.jJ=-1
@@ -14253,31 +14338,31 @@
 a.X0=w
 C.c0.ZL(a)
 C.c0.oX(a)
-return a},null,null,0,0,126,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[504],
+return a},null,null,0,0,22,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[278],
 x4:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V25;Uz%-496,HJ%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,498,"script",307,330],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,499,30,[],"script",307],
-gjG:[function(a){return a.HJ},null,null,1,0,348,"showCoverage",307,330],
-sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,349,30,[],"showCoverage",307],
+"^":["V26;Uz%-269,HJ%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,271,"script",82,104],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,272,27,[],"script",82],
+gjG:[function(a){return a.HJ},null,null,1,0,126,"showCoverage",82,104],
+sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,127,27,[],"showCoverage",82],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
 if(z==null)return
-J.SK(z)},"$0","gQd",0,0,125,"enteredView"],
-ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,115,242,[],"showCoverageChanged"],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,169,332,[],"refreshCoverage"],
+J.SK(z)},"$0","gQd",0,0,21,"enteredView"],
+ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,16,65,[],"showCoverageChanged"],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,26,106,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{Ry:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.HJ=!1
@@ -14286,9 +14371,9 @@
 a.X0=w
 C.cJ.ZL(a)
 C.cJ.oX(a)
-return a},null,null,0,0,126,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[505],
-V25:{
+return a},null,null,0,0,22,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[279],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
@@ -14308,25 +14393,57 @@
 v.$builtinTypeInfo=[w]
 v=new Q.wn(null,null,v,null,null)
 v.$builtinTypeInfo=[w]
-w=J.bU
+w=P.KN
 u=D.N8
 t=new V.qC(P.Py(null,null,null,w,u),null,null)
 t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Isolate":z=new V.qC(P.Py(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
 z=R.Jk(z)
-x=P.L5(null,null,null,J.O,D.af)
+x=P.L5(null,null,null,P.qU,D.af)
 w=[]
-w.$builtinTypeInfo=[J.O]
+w.$builtinTypeInfo=[P.qU]
 v=[]
 v.$builtinTypeInfo=[D.e5]
-u=P.L5(null,null,null,J.O,J.Pp)
+u=D.U4
+t=[]
+t.$builtinTypeInfo=[u]
+t=new Q.wn(null,null,t,null,null)
+t.$builtinTypeInfo=[u]
+u=P.L5(null,null,null,P.qU,P.CP)
 u=R.Jk(u)
-s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+break
+case"Library":z=D.U4
+x=[]
+x.$builtinTypeInfo=[z]
+x=new Q.wn(null,null,x,null,null)
+x.$builtinTypeInfo=[z]
+z=D.rj
+w=[]
+w.$builtinTypeInfo=[z]
+w=new Q.wn(null,null,w,null,null)
+w.$builtinTypeInfo=[z]
+z=D.SI
+v=[]
+v.$builtinTypeInfo=[z]
+v=new Q.wn(null,null,v,null,null)
+v.$builtinTypeInfo=[z]
+z=D.SI
+u=[]
+u.$builtinTypeInfo=[z]
+u=new Q.wn(null,null,u,null,null)
+u.$builtinTypeInfo=[z]
+z=D.SI
+t=[]
+t.$builtinTypeInfo=[z]
+t=new Q.wn(null,null,t,null,null)
+t.$builtinTypeInfo=[z]
+s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"ServiceError":s=new D.fJ(null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
@@ -14337,26 +14454,26 @@
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-z=J.bU
-w=J.bU
+z=P.KN
+w=P.KN
 v=new V.qC(P.Py(null,null,null,z,w),null,null)
 v.$builtinTypeInfo=[z,w]
-s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 default:z=new V.qC(P.Py(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
 s=new D.SI(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
-D5:[function(a){var z
+D5:function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},"$1","SSc",2,0,null,202,[]],
-ES:[function(a,b){var z=J.x(a)
+return z},
+ES:function(a,b){var z=J.x(a)
 if(!!z.$isSI)return
 if(!!z.$isqC)D.Gf(a,b)
-else if(!!z.$iswn)D.f3(a,b)},"$2","Ja",4,0,null,290,[],156,[]],
-Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"$2","nV",4,0,null,162,[],156,[]],
-f3:[function(a,b){var z,y,x,w,v,u
+else if(!!z.$iswn)D.f3(a,b)},
+Gf:function(a,b){a.aN(0,new D.UZ(a,b))},
+f3:function(a,b){var z,y,x,w,v,u
 for(z=a.ao,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
@@ -14364,29 +14481,29 @@
 else u=!1
 if(u)a.u(0,y,b.Zr(x))
 else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},"$2","PV",4,0,null,76,[],156,[]],
+else if(v)D.Gf(x,b)}},
 af:{
 "^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,506,"owner",307],
+gXP:[function(){return this.P3},null,null,1,0,280,"owner",82],
 gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,507,"vm",307],
+return z.gzf(z)},null,null,1,0,281,"vm",82],
 gF1:[function(a){var z=this.P3
-return z.gF1(z)},null,null,1,0,306,"isolate",307],
-gjO:[function(a){return this.KG},null,null,1,0,312,"id",307],
-gzS:[function(){return this.mQ},null,null,1,0,312,"serviceType",307],
+return z.gF1(z)},null,null,1,0,81,"isolate",82],
+gjO:[function(a){return this.KG},null,null,1,0,87,"id",82],
+gzS:[function(){return this.mQ},null,null,1,0,87,"serviceType",82],
 gPj:[function(a){var z,y
 z=this.gF1(this)
 y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,312,"link",307],
-gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,312,"hashLink",307],
-sHP:[function(a){},null,null,3,0,115,99,[],"hashLink",307],
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,87,"link",82],
+gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,87,"hashLink",82],
+sHP:[function(a){},null,null,3,0,16,69,[],"hashLink",82],
 gox:function(a){return this.kT},
 gUm:function(){return!1},
 gM8:function(){return!1},
-goc:[function(a){return this.gbN()},null,null,1,0,312,"name",307,308],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",307],
-gzz:[function(){return this.gGR()},null,null,1,0,312,"vmName",307,308],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",307],
+goc:[function(a){return this.gbN()},null,null,1,0,87,"name",82,83],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,8,27,[],"name",82],
+gzz:[function(){return this.gGR()},null,null,1,0,87,"vmName",82,83],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,8,27,[],"vmName",82],
 xW:function(a){if(this.kT)return P.Ab(this,null)
 return this.VD(0)},
 VD:function(a){var z
@@ -14407,7 +14524,7 @@
 this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Tp:508;a",
+"^":"Tp:283;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -14415,31 +14532,31 @@
 y=this.a
 if(!J.de(z,y.mQ))return D.ac(y.P3,a)
 y.eC(a)
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 jI:{
-"^":"Tp:126;b",
+"^":"Tp:22;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 u0g:{
 "^":"af;"},
-zM:{
+H6:{
 "^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,507,"vm",307],
-gF1:[function(a){return},null,null,1,0,306,"isolate",307],
+gzf:[function(a){return this},null,null,1,0,281,"vm",82],
+gF1:[function(a){return},null,null,1,0,81,"isolate",82],
 gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,509,"isolates",307],
-gPj:[function(a){return H.d(this.KG)},null,null,1,0,312,"link",307],
-gYe:[function(a){return this.Ox},null,null,1,0,312,"version",307,308],
-sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",307],
-gF6:[function(){return this.GY},null,null,1,0,312,"architecture",307,308],
-sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",307],
-gUn:[function(){return this.Rp},null,null,1,0,510,"uptime",307,308],
-sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,511,30,[],"uptime",307],
-gC3:[function(){return this.Ts},null,null,1,0,348,"assertsEnabled",307,308],
-sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,349,30,[],"assertsEnabled",307],
-gPV:[function(){return this.Va},null,null,1,0,348,"typeChecksEnabled",307,308],
-sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,349,30,[],"typeChecksEnabled",307],
+return z.gUQ(z)},null,null,1,0,284,"isolates",82],
+gPj:[function(a){return H.d(this.KG)},null,null,1,0,87,"link",82],
+gYe:[function(a){return this.Ox},null,null,1,0,87,"version",82,83],
+sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,8,27,[],"version",82],
+gF6:[function(){return this.GY},null,null,1,0,87,"architecture",82,83],
+sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,8,27,[],"architecture",82],
+gUn:[function(){return this.Rp},null,null,1,0,285,"uptime",82,83],
+sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,286,27,[],"uptime",82],
+gC3:[function(){return this.Ts},null,null,1,0,126,"assertsEnabled",82,83],
+sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,127,27,[],"assertsEnabled",82],
+gPV:[function(){return this.Va},null,null,1,0,126,"typeChecksEnabled",82,83],
+sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,127,27,[],"typeChecksEnabled",82],
 bZ:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
@@ -14477,7 +14594,13 @@
 return this.Tn(x).ml(new D.oe(this,w))}v=this.A4.t(0,z.a)
 if(v!=null)return J.am(v)
 return this.jU(z.a).ml(new D.kk(z,this))},
-jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},
+N7:function(a){var z
+if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+return P.Vu(D.ac(this,R.Jk(z)),null,null)}z=J.U6(a)
+if(J.de(z.t(a,"type"),"ServiceError"))return P.Vu(D.ac(this,a),null,null)
+else if(J.de(z.t(a,"type"),"ServiceException"))return P.Vu(D.ac(this,a),null,null)
+return P.Ab(a,null)},
+jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.I2(this),new D.mR())},
 bF:function(a,b,c){var z,y
 if(c)return
 this.kT=!0
@@ -14495,7 +14618,7 @@
 this.xA(z.t(b,"isolates"))},
 xA:function(a){var z,y,x,w,v,u
 z=this.z7
-y=P.L5(null,null,null,J.O,D.bv)
+y=P.L5(null,null,null,P.qU,D.bv)
 for(x=J.GP(a);x.G();){w=x.gl()
 v=J.UQ(w,"id")
 u=z.t(0,v)
@@ -14509,79 +14632,72 @@
 this.A4.u(0,"vm",this)
 var z=P.EF(["id","vm","type","@VM"],null,null)
 this.eC(R.Jk(z))},
-$iszM:true},
+$isH6:true},
 O1w:{
 "^":"u0g+Pi;",
 $isd3:true},
 MZ:{
-"^":"Tp:115;a,b",
-$1:[function(a){if(!J.x(a).$iszM)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,57,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){if(!J.x(a).$isH6)return
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,168,[],"call"],
 $isEH:true},
 oe:{
-"^":"Tp:115;b,c",
+"^":"Tp:16;b,c",
 $1:[function(a){var z
 if(a==null)return this.b
 z=this.c
 if(z==null)return J.am(a)
-else return a.cv(z)},"$1",null,2,0,null,16,[],"call"],
+else return a.cv(z)},"$1",null,2,0,null,10,[],"call"],
 $isEH:true},
 kk:{
-"^":"Tp:508;a,d",
+"^":"Tp:283;a,d",
 $1:[function(a){var z,y
 z=this.d
 y=D.ac(z,a)
 if(y.gUm())z.A4.to(this.a.a,new D.QZ(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 QZ:{
-"^":"Tp:126;e",
-$0:[function(){return this.e},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e",
+$0:function(){return this.e},
 $isEH:true},
 Ey:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y,x,w,v
-try{w=C.xr.kV(a)
-z=R.Jk(w)
-if(!D.D5(z)){w=P.EF(["type","ServiceException","id","","kind","FormatException","response",z,"message","Top level service responses must be service maps."],null,null)
-w=R.Jk(w)
-w=P.Vu(D.ac(this.a,w),null,null)
-return w}if(J.de(J.UQ(z,"type"),"ServiceError")){w=P.Vu(D.ac(this.a,z),null,null)
-return w}else if(J.de(J.UQ(z,"type"),"ServiceException")){w=P.Vu(D.ac(this.a,z),null,null)
-return w}return z}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-P.JS(y)
-P.JS(x)
-w=P.EF(["type","ServiceException","id","","kind","DecodeException","response",a,"message","Could not decode JSON: "+H.d(y)],null,null)
-w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}},"$1",null,2,0,null,421,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){var z,y,x,w
+try{x=C.xr.kV(a)
+z=R.Jk(x)
+x=this.a.N7(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
+x=R.Jk(x)
+return P.Vu(D.ac(this.a,x),null,null)}},"$1",null,2,0,null,190,[],"call"],
 $isEH:true},
 tm:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,171,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 Gk:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
-mR:{
-"^":"Tp:115;c",
+I2:{
+"^":"Tp:16;c",
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,315,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,90,[],"call"],
 $isEH:true},
-bp:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,21,[],"call"],
+mR:{
+"^":"Tp:16;",
+$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 Yu:{
-"^":"Tp:300;",
-$2:[function(a,b){J.am(b)},"$2",null,4,0,null,512,[],16,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){J.am(b)},
 $isEH:true},
 e5:{
 "^":"a;SP,hw<,wZ",
@@ -14627,43 +14743,43 @@
 for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
-v.$builtinTypeInfo=[J.bU]
+v.$builtinTypeInfo=[P.KN]
 u=new D.e5(0,v,0)
 u.CJ()
 x.push(u)}if(typeof v!=="number")return H.s(v)
 z=Array(v)
 z.fixed$length=init
-z=new D.e5(0,H.VM(z,[J.bU]),0)
+z=new D.e5(0,H.VM(z,[P.KN]),0)
 this.yP=z
 z.Bv(y)
 return}z=this.RP
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
 z.fixed$length=init
-u=new D.e5(a,H.VM(z,[J.bU]),0)
+u=new D.e5(a,H.VM(z,[P.KN]),0)
 u.nZ(y,this.yP.hw)
 this.yP.wY(0,y)
 z=this.lI
 z.push(u)
 if(z.length>this.hD)C.Nm.KI(z,0)}},
 bv:{
-"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-513,Cf,W1,p2,Hw,S9,yv,BC@-437,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,507,"vm",307],
-gF1:[function(a){return this},null,null,1,0,306,"isolate",307],
-ghw:[function(){return this.V3},null,null,1,0,514,"counters",307,308],
-shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,508,30,[],"counters",307],
+"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,DC,zb,bN:KT@,GR:f5@,Er,cL,LE<-287,Cf,W1,p2,Hw,S9,yv,BC@-207,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gzf:[function(a){return this.P3},null,null,1,0,281,"vm",82],
+gF1:[function(a){return this},null,null,1,0,81,"isolate",82],
+ghw:[function(){return this.V3},null,null,1,0,288,"counters",82,83],
+shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,283,27,[],"counters",82],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
-gko:[function(){return this.l2},null,null,1,0,348,"pausedOnStart",307,308],
-sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,349,30,[],"pausedOnStart",307],
-geB:[function(){return this.No},null,null,1,0,348,"pausedOnExit",307,308],
-seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,349,30,[],"pausedOnExit",307],
-gLd:[function(){return this.EY},null,null,1,0,348,"running",307,308],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,349,30,[],"running",307],
-gaj:[function(){return this.eU},null,null,1,0,348,"idle",307,308],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,349,30,[],"idle",307],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,515,516,[],"relativeLink",307],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,515,516,[],"relativeHashLink",307],
+gko:[function(){return this.l2},null,null,1,0,126,"pausedOnStart",82,83],
+sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,127,27,[],"pausedOnStart",82],
+geB:[function(){return this.No},null,null,1,0,126,"pausedOnExit",82,83],
+seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,127,27,[],"pausedOnExit",82],
+gLd:[function(){return this.EY},null,null,1,0,126,"running",82,83],
+sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,127,27,[],"running",82],
+gaj:[function(){return this.eU},null,null,1,0,126,"idle",82,83],
+saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,127,27,[],"idle",82],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,289,290,[],"relativeLink",82],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,289,290,[],"relativeHashLink",82],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -14680,8 +14796,8 @@
 x=z.t(a,"samples")
 for(z=J.GP(y);z.G();){w=z.gl()
 J.UQ(w,"code").eL(w,b,x)}},
-Ms:function(a){return this.cv("coverage").ml(this.gJJ())},
-Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gJJ",2,0,517,518,[]],
+Ms:function(a){return this.cv("coverage").ml(this.gm6())},
+Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gm6",2,0,291,292,[]],
 Zr:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -14694,35 +14810,37 @@
 cv:function(a){var z=this.A4.t(0,a)
 if(z!=null)return J.am(z)
 return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gVc:[function(){return this.v9},null,null,1,0,329,"rootLib",307,308],
-sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,331,30,[],"rootLib",307],
-gf4:[function(){return this.zb},null,null,1,0,514,"topFrame",307,308],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,508,30,[],"topFrame",307],
-goc:[function(a){return this.KT},null,null,1,0,312,"name",307,308],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",307],
-gzz:[function(){return this.f5},null,null,1,0,312,"vmName",307,308],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",307],
-gQ9:[function(){return this.Er},null,null,1,0,312,"mainPort",307,308],
-sQ9:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",307],
-gw2:[function(){return this.cL},null,null,1,0,519,"entry",307,308],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,520,30,[],"entry",307],
-gCi:[function(){return this.Cf},null,null,1,0,472,"newHeapUsed",307,308],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,361,30,[],"newHeapUsed",307],
-gcu:[function(){return this.W1},null,null,1,0,472,"oldHeapUsed",307,308],
-scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,361,30,[],"oldHeapUsed",307],
-gab:[function(){return this.p2},null,null,1,0,472,"newHeapCapacity",307,308],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,361,30,[],"newHeapCapacity",307],
-gfi:[function(){return this.Hw},null,null,1,0,472,"oldHeapCapacity",307,308],
-sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,361,30,[],"oldHeapCapacity",307],
-gNh:[function(a){return this.S9},null,null,1,0,312,"fileAndLine",307,308],
-at:function(a,b){return this.gNh(this).$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",307],
-gkc:[function(a){return this.yv},null,null,1,0,521,"error",307,308],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,522,30,[],"error",307],
-bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+gVc:[function(){return this.v9},null,null,1,0,221,"rootLib",82,83],
+sVc:[function(a){this.v9=F.Wi(this,C.iG,this.v9,a)},null,null,3,0,222,27,[],"rootLib",82],
+gvU:[function(){return this.DC},null,null,1,0,293,"libraries",82,83],
+svU:[function(a){this.DC=F.Wi(this,C.Ij,this.DC,a)},null,null,3,0,294,27,[],"libraries",82],
+gf4:[function(){return this.zb},null,null,1,0,288,"topFrame",82,83],
+sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,283,27,[],"topFrame",82],
+goc:[function(a){return this.KT},null,null,1,0,87,"name",82,83],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,8,27,[],"name",82],
+gzz:[function(){return this.f5},null,null,1,0,87,"vmName",82,83],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,8,27,[],"vmName",82],
+gQ9:[function(){return this.Er},null,null,1,0,87,"mainPort",82,83],
+sQ9:[function(a){this.Er=F.Wi(this,C.dH,this.Er,a)},null,null,3,0,8,27,[],"mainPort",82],
+gw2:[function(){return this.cL},null,null,1,0,295,"entry",82,83],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,296,27,[],"entry",82],
+gCi:[function(){return this.Cf},null,null,1,0,249,"newHeapUsed",82,83],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,137,27,[],"newHeapUsed",82],
+gcu:[function(){return this.W1},null,null,1,0,249,"oldHeapUsed",82,83],
+scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,137,27,[],"oldHeapUsed",82],
+gab:[function(){return this.p2},null,null,1,0,249,"newHeapCapacity",82,83],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,137,27,[],"newHeapCapacity",82],
+gfi:[function(){return this.Hw},null,null,1,0,249,"oldHeapCapacity",82,83],
+sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,137,27,[],"oldHeapCapacity",82],
+guT:[function(a){return this.S9},null,null,1,0,87,"fileAndLine",82,83],
+at:function(a,b){return this.guT(this).$1(b)},
+suT:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,8,27,[],"fileAndLine",82],
+gkc:[function(a){return this.yv},null,null,1,0,297,"error",82,83],
+skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,298,27,[],"error",82],
+bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z=J.U6(b)
 y=z.t(b,"mainPort")
-this.Er=F.Wi(this,C.wT,this.Er,y)
+this.Er=F.Wi(this,C.dH,this.Er,y)
 y=z.t(b,"name")
 this.KT=F.Wi(this,C.YS,this.KT,y)
 y=z.t(b,"name")
@@ -14732,7 +14850,7 @@
 D.ES(b,this)
 if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
 return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.xe,this.v9,y)
+this.v9=F.Wi(this,C.iG,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
 this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
 this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
@@ -14787,8 +14905,11 @@
 this.EY=y
 y=this.l2!==!0&&this.No!==!0&&y!==!0
 this.eU=F.Wi(this,C.q2,this.eU,y)
-z=z.t(b,"error")
-this.yv=F.Wi(this,C.YU,this.yv,z)},
+y=z.t(b,"error")
+this.yv=F.Wi(this,C.YU,this.yv,y)
+J.U2(this.DC)
+for(z=J.GP(z.t(b,"libraries"));z.G();){p=z.gl()
+J.wT(this.DC,p)}J.LH(this.DC,new D.Yn())},
 m7:function(){return this.P3.jU(H.d(this.KG)+"/profile/tag").ml(new D.AP(this))},
 KQ:function(a,b){this.FF=0
 this.bj=a
@@ -14830,51 +14951,55 @@
 "^":"u0g+Pi;",
 $isd3:true},
 iz:{
-"^":"Tp:115;",
-$1:[function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
+"^":"Tp:16;",
+$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
 a.Du=0
 a.fF=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.qH=F.Wi(a,C.uU,a.qH,"")
 J.U2(a.VS)
 J.U2(a.ci)
-J.U2(a.Oo)}},"$1",null,2,0,null,30,[],"call"],
+J.U2(a.Oo)}},
 $isEH:true},
 oa:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,523,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,299,[],"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:508;a,b",
+"^":"Tp:283;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.ac(z,a)
 if(y.gUm())z.A4.to(this.b,new D.Ai(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 Ai:{
-"^":"Tp:126;c",
-$0:[function(){return this.c},"$0",null,0,0,null,"call"],
+"^":"Tp:22;c",
+$0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,524,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,300,[],"call"],
+$isEH:true},
+Yn:{
+"^":"Tp:75;",
+$2:[function(a,b){return J.oE(J.O6(a),J.O6(b))},"$2",null,4,0,null,53,[],57,[],"call"],
 $isEH:true},
 AP:{
-"^":"Tp:508;a",
+"^":"Tp:283;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.KJ
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,202,[],"call"],
+return y},"$1",null,2,0,null,212,[],"call"],
 $isEH:true},
 SI:{
 "^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Library"))&&!J.co(this.KG,$.VZ)},
-gM8:function(){return this.gUm()},
+gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Field"))&&!J.co(this.KG,$.VZ)},
+gM8:function(){return!1},
 bu:function(a){return P.vW(this.RF)},
 bF:function(a,b,c){var z,y,x
 this.kT=!c
@@ -14906,13 +15031,13 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"$0","gDx",0,0,348],
+return z.BN(z)},"$0","gDx",0,0,126],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,125],
+k0:[function(a){return},"$0","gqw",0,0,21],
 ni:[function(a){this.RF.AP=null
-return},"$0","gl1",0,0,125],
+return},"$0","gl1",0,0,21],
 gUj:function(a){var z=this.RF
 return z.gUj(z)},
 gnz:function(a){var z,y
@@ -14929,14 +15054,14 @@
 static:{"^":"VZ"}},
 pD:{
 "^":"wVq;J6,LD,jo,Ne,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
-gFA:[function(a){return this.jo},null,null,1,0,329,"exception",307,308],
-sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,331,30,[],"exception",307],
-gK7:[function(){return this.Ne},null,null,1,0,329,"stacktrace",307,308],
-sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,331,30,[],"stacktrace",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
+gFA:[function(a){return this.jo},null,null,1,0,103,"exception",82,83],
+sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,105,27,[],"exception",82],
+gur:[function(){return this.Ne},null,null,1,0,103,"stacktrace",82,83],
+sur:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,105,27,[],"stacktrace",82],
 bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -14957,10 +15082,10 @@
 $isd3:true},
 fJ:{
 "^":"dZL;J6,LD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
 bF:function(a,b,c){var z,y
 this.kT=!0
 z=J.U6(b)
@@ -14978,12 +15103,12 @@
 $isd3:true},
 hR:{
 "^":"w8F;J6,LD,IV,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
-gvJ:[function(a){return this.IV},null,null,1,0,126,"response",307,308],
-svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,115,30,[],"response",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
+gvJ:[function(a){return this.IV},null,null,1,0,22,"response",82,83],
+svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,16,27,[],"response",82],
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -15000,25 +15125,70 @@
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
+U4:{
+"^":["V4b;dj,JJ<-29,XR<-29,DD>-29,Z3<-29,mu<-29,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null],
+gO3:[function(a){return this.dj},null,null,1,0,87,"url",82,83],
+sO3:[function(a,b){this.dj=F.Wi(this,C.Fh,this.dj,b)},null,null,3,0,8,27,[],"url",82],
+gUm:function(){return!0},
+gM8:function(){return!1},
+bF:function(a,b,c){var z,y,x,w
+z=J.U6(b)
+y=z.t(b,"url")
+x=F.Wi(this,C.Fh,this.dj,y)
+this.dj=x
+if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
+w=J.U6(y)
+x=w.yn(y,J.WB(w.cn(y,"/"),1))}y=z.t(b,"user_name")
+y=this.ct(this,C.YS,this.bN,y)
+this.bN=y
+if(J.FN(y)===!0)this.bN=this.ct(this,C.YS,this.bN,x)
+y=z.t(b,"name")
+this.GR=this.ct(this,C.KS,this.GR,y)
+if(c)return
+this.kT=!0
+y=this.P3
+D.ES(b,y.gF1(y))
+y=this.JJ
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"imports"))
+y=this.XR
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"scripts"))
+y=this.DD
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"classes"))
+y=this.Z3
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"variables"))
+y=this.mu
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"functions"))},
+$isU4:true},
+V4b:{
+"^":"af+Pi;",
+$isd3:true},
 c2:{
-"^":["a;Rd<-317,a4>-347",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd<-93,a4>-125",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
-"^":["V4b;Sw>-85,u9<-85,Gz,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,310,"library",307,308],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,311,30,[],"library",307],
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gVB:[function(){return this.wJ},null,null,1,0,472,"firstTokenPos",307,308],
+"^":["Zqa;Sw>-29,u9<-29,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gVB:[function(){return this.wJ},null,null,1,0,249,"firstTokenPos",82,83],
 sVB:[function(a){var z=this.wJ
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.wJ=a},null,null,3,0,361,30,[],"firstTokenPos",307],
-gug:[function(){return this.lx},null,null,1,0,472,"lastTokenPos",307,308],
+this.nq(this,z)}this.wJ=a},null,null,3,0,137,27,[],"firstTokenPos",82],
+gug:[function(){return this.lx},null,null,1,0,249,"lastTokenPos",82,83],
 sug:[function(a){var z=this.lx
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.lx=a},null,null,3,0,361,30,[],"lastTokenPos",307],
+this.nq(this,z)}this.lx=a},null,null,3,0,137,27,[],"lastTokenPos",82],
 gUm:function(){return!0},
 gM8:function(){return!0},
 rK:function(a){return J.UQ(this.Sw,J.xH(a,1))},
@@ -15092,29 +15262,30 @@
 x.V1(y)
 N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
 for(w=0;w<z.length;w=v){v=w+1
-x.h(y,new D.c2(v,z[w]))}}},
-V4b:{
+x.h(y,new D.c2(v,z[w]))}},
+$isrj:true},
+Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 N8:{
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
 Z9:{
-"^":["Pi;Yu<,LR<-317,VF<-317,KO<-317,fY>-347,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
-gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
-gUE:[function(){return this.MT},null,null,1,0,312,"formattedLine",307,308],
-sUE:[function(a){this.MT=F.Wi(this,C.Zt,this.MT,a)},null,null,3,0,32,30,[],"formattedLine",307],
+"^":["Pi;Yu<,LR<-93,VF<-93,KO<-93,fY>-125,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
+gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
+gUE:[function(){return this.MT},null,null,1,0,87,"formattedLine",82,83],
+sUE:[function(a){this.MT=F.Wi(this,C.oI,this.MT,a)},null,null,3,0,8,27,[],"formattedLine",82],
 Nw:[function(){var z,y
 z=this.LR
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","guV",0,0,312,"formattedDeoptId",307],
+return y.bu(z)},"$0","guV",0,0,87,"formattedDeoptId",82],
 M2Y:[function(){var z,y
 z=this.VF
 y=J.x(z)
 if(y.n(z,-1))return""
-return y.bu(z)},"$0","gZO",0,0,312,"formattedTokenPos",307],
+return y.bu(z)},"$0","gZO",0,0,87,"formattedTokenPos",82],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.fX,this.ar,null)
 z=this.VF
@@ -15123,33 +15294,33 @@
 if(y==null)return
 this.ar=F.Wi(this,C.fX,this.ar,a)
 z=J.nJ(a.rK(y))
-this.MT=F.Wi(this,C.Zt,this.MT,z)},
+this.MT=F.Wi(this,C.oI,this.MT,z)},
 $isZ9:true},
 Q4:{
-"^":["Pi;Yu<-317,Fm<-347,L4<-347,dh,uH@-525,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
-gPO:[function(){return this.dh},null,null,1,0,526,"jumpTarget",307,308],
+"^":["Pi;Yu<-93,Fm<-125,L4<-125,dh,uH@-301,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
+gPO:[function(){return this.dh},null,null,1,0,302,"jumpTarget",82,83],
 sPO:[function(a){var z=this.dh
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Qn,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=a},null,null,3,0,527,30,[],"jumpTarget",307],
-gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,348,"isComment",307],
-ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,348,"hasDescriptors",307],
+this.nq(this,z)}this.dh=a},null,null,3,0,303,27,[],"jumpTarget",82],
+gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,126,"isComment",82],
+ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,126,"hasDescriptors",82],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,312,"formattedAddress",307],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,87,"formattedAddress",82],
 Io:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,528,154,[],"formattedInclusive",307],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,304,305,[],"formattedInclusive",82],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,528,154,[],"formattedExclusive",307],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,304,305,[],"formattedExclusive",82],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -15178,18 +15349,18 @@
 this.nq(this,z)}this.dh=u
 return}++w}P.JS("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","I9",4,0,null,117,[],118,[]]}},
+static:{Tn:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
 bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.nj
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
 else if(z.n(a,"Reused"))return C.yP
 else if(z.n(a,"Tag"))return C.oA
 N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"$1","Ma",2,0,null,94,[]]}},
+throw H.b(P.hS())}}},
 Vi:{
 "^":"a;tT>,Av<",
 $isVi:true},
@@ -15197,26 +15368,28 @@
 "^":"a;tT>,Av<,wd>,Jv",
 $ist9:true},
 kx:{
-"^":["Zqa;J6,xM,Du@-317,fF@-317,vg@-317,Mb@-317,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,ar,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,529,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,530,30,[],"kind",307],
-glt:[function(){return this.xM},null,null,1,0,472,"totalSamplesInProfile",307,308],
-slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,361,30,[],"totalSamplesInProfile",307],
-gS7:[function(){return this.mM},null,null,1,0,312,"formattedInclusiveTicks",307,308],
-sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",307],
-gN8:[function(){return this.qH},null,null,1,0,312,"formattedExclusiveTicks",307,308],
-sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",307],
-gL1E:[function(){return this.Ni},null,null,1,0,329,"objectPool",307,308],
-sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,331,30,[],"objectPool",307],
-gMj:[function(a){return this.MO},null,null,1,0,329,"function",307,308],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,331,30,[],"function",307],
-gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
+"^":["D3i;J6,xM,Du@-93,fF@-93,vg@-93,Mb@-93,VS<-29,ci<-29,va<-29,Oo<-29,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,306,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,307,27,[],"kind",82],
+glt:[function(){return this.xM},null,null,1,0,249,"totalSamplesInProfile",82,83],
+slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,137,27,[],"totalSamplesInProfile",82],
+gS7:[function(){return this.mM},null,null,1,0,87,"formattedInclusiveTicks",82,83],
+sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,8,27,[],"formattedInclusiveTicks",82],
+gN8:[function(){return this.qH},null,null,1,0,87,"formattedExclusiveTicks",82,83],
+sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,8,27,[],"formattedExclusiveTicks",82],
+gL1E:[function(){return this.Ni},null,null,1,0,103,"objectPool",82,83],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,105,27,[],"objectPool",82],
+gMj:[function(a){return this.MO},null,null,1,0,103,"function",82,83],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,105,27,[],"function",82],
+gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
+gla:[function(){return this.MH},null,null,1,0,126,"isOptimized",82,83],
+sla:[function(a){this.MH=F.Wi(this,C.FQ,this.MH,a)},null,null,3,0,127,27,[],"isOptimized",82],
 gUm:function(){return!0},
 gM8:function(){return!0},
 tx:[function(a){var z,y
 this.ar=F.Wi(this,C.fX,this.ar,a)
-for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,531,532,[]],
+for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,308,309,[]],
 QW:function(){if(this.ar!=null)return
 if(!J.de(this.J6,C.l8))return
 var z=this.MO
@@ -15254,15 +15427,16 @@
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
 this.zz=z.t(b,"name")
+y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
+this.MH=F.Wi(this,C.FQ,this.MH,y)
 y=D.CQ(z.t(b,"kind"))
 this.J6=F.Wi(this,C.fy,this.J6,y)
 this.vg=H.BU(z.t(b,"start"),16,null)
 this.Mb=H.BU(z.t(b,"end"),16,null)
 y=this.P3
-y=y.gF1(y)
-x=y.Zr(z.t(b,"function"))
+x=y.gF1(y).Zr(z.t(b,"function"))
 this.MO=F.Wi(this,C.nf,this.MO,x)
-y=y.Zr(z.t(b,"object_pool"))
+y=y.gF1(y).Zr(z.t(b,"object_pool"))
 this.Ni=F.Wi(this,C.xG,this.Ni,y)
 w=z.t(b,"disassembly")
 if(w!=null)this.xs(w)
@@ -15273,8 +15447,8 @@
 this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
-gvS:[function(){return this.TD},null,null,1,0,348,"hasDisassembly",307,308],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,349,30,[],"hasDisassembly",307],
+gvS:[function(){return this.TD},null,null,1,0,126,"hasDisassembly",82,83],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,127,27,[],"hasDisassembly",82],
 xs:function(a){var z,y,x,w,v,u,t,s,r
 z=this.va
 y=J.w1(z)
@@ -15302,7 +15476,7 @@
 v=z.t(a,"tryIndex")
 u=J.rr(z.t(a,"kind"))
 for(z=J.GP(this.va);z.G();){t=z.gl()
-if(J.de(t.gYu(),y)){J.bi(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
+if(J.de(t.gYu(),y)){J.wT(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
 return}}N.Jx("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
 DZ:function(a){var z
 for(z=J.GP(a);z.G();)this.Ry(z.gl())},
@@ -15319,43 +15493,43 @@
 w+=3}},
 tg:function(a,b){J.J5(b,this.vg)
 return!1},
-gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,348,"isDartCode",307],
+gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,126,"isDartCode",82],
 $iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","Mr",4,0,null,117,[],118,[]]}},
-Zqa:{
+static:{Vb:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
+D3i:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.gKn())},"$1",null,2,0,null,533,[],"call"],
+J.SK(y).ml(z.gKn())},"$1",null,2,0,null,310,[],"call"],
 $isEH:true},
 fx:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,53,[],57,[],"call"],
 $isEH:true},
 UZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y
+"^":"Tp:75;a,b",
+$2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
 if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
 else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},"$2",null,4,0,null,374,[],121,[],"call"],
+else if(y)D.Gf(b,this.b)},
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
 zMr:{
-"^":["V26;jA%-534,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,535,"error",307,330],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,536,30,[],"error",307],
+"^":["V27;jA%-311,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.jA},null,null,1,0,312,"error",82,104],
+skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,313,27,[],"error",82],
 "@":function(){return[C.uvO]},
 static:{hp:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15363,21 +15537,21 @@
 a.X0=w
 C.SX.ZL(a)
 C.SX.oX(a)
-return a},null,null,0,0,126,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[537],
-V26:{
+return a},null,null,0,0,22,"new ServiceErrorViewElement$created"]}},
+"+ServiceErrorViewElement":[314],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 nk:{
-"^":["V27;Xc%-538,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,539,"exception",307,330],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,540,30,[],"exception",307],
+"^":["V28;Xc%-315,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFA:[function(a){return a.Xc},null,null,1,0,316,"exception",82,104],
+sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,317,27,[],"exception",82],
 "@":function(){return[C.vr3]},
 static:{dS:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15385,30 +15559,30 @@
 a.X0=w
 C.Vd.ZL(a)
 C.Vd.oX(a)
-return a},null,null,0,0,126,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[541],
-V27:{
+return a},null,null,0,0,22,"new ServiceExceptionViewElement$created"]}},
+"+ServiceExceptionViewElement":[318],
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":"zM;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"H6;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 z6:function(a,b){var z
 N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
-return W.It(J.WB(z,b),null,null).OA(new U.dT())},
+return W.Kn(J.WB(z,b),null,null).OA(new U.dT())},
 SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
 dT:{
-"^":"Tp:115;",
+"^":"Tp:16;",
 $1:[function(a){var z
 N.Jx("").hh("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,171,[],"call"],
+return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 ho:{
-"^":"zM;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"H6;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 q3:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -15418,7 +15592,7 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"$1","gVx",2,0,169,22,[]],
+J.Xf(v,w)},"$1","gVx",2,0,26,319,[]],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -15434,9 +15608,9 @@
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V28;mC%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,310,"object",307,330],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,311,30,[],"object",307],
+"^":["V29;mC%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,85,"object",82,104],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,86,27,[],"object",82],
 hu:[function(a){var z
 switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.mC)
@@ -15462,7 +15636,7 @@
 case"HeapMap":z=W.r3("heap-map",null)
 J.Nf(z,a.mC)
 return z
-case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"String":case"Type":z=W.r3("instance-view",null)
+case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Bigint":case"String":z=W.r3("instance-view",null)
 J.ti(z,a.mC)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
@@ -15491,8 +15665,8 @@
 return z
 default:z=W.r3("json-view",null)
 J.wD(z,a.mC)
-return z}},"$0","gbs",0,0,542,"_constructElementForObject"],
-fa:[function(a,b){var z,y,x
+return z}},"$0","gbs",0,0,320,"_constructElementForObject"],
+xJ:[function(a,b){var z,y,x
 this.pj(a)
 z=a.mC
 if(z==null){N.Jx("").To("Viewing null object.")
@@ -15500,12 +15674,12 @@
 x=this.hu(a)
 if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,115,242,[],"objectChanged"],
+N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,16,65,[],"objectChanged"],
 "@":function(){return[C.Tl]},
 static:{zy:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15513,38 +15687,40 @@
 a.X0=w
 C.ZO.ZL(a)
 C.ZO.oX(a)
-return a},null,null,0,0,126,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[543],
-V28:{
+return a},null,null,0,0,22,"new ServiceObjectViewElement$created"]}},
+"+ServiceObjectViewElement":[321],
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Vfx;tY%-334,Pe%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,310,"ref",307,330],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,311,30,[],"ref",307],
-gjT:[function(a){return a.Pe},null,null,1,0,348,"internal",307,330],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,349,30,[],"internal",307],
-aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
+"^":["Vfx;tY%-108,Pe%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,85,"ref",82,104],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,86,27,[],"ref",82],
+gjT:[function(a){return a.Pe},null,null,1,0,126,"internal",82,104],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,127,27,[],"internal",82],
+P9:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,169,242,[],"refChanged"],
+this.ct(a,C.KG,0,1)
+this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,26,65,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,312,"url"],
+return z.gHP()},null,null,1,0,87,"url"],
 gOL:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,312,"serviceId"],
+return J.F8(z)},null,null,1,0,87,"serviceId"],
 gD5:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,312,"hoverText"],
+return z.gzz()},null,null,1,0,87,"hoverText"],
 goc:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,312,"name"],
+return J.O6(z)},null,null,1,0,87,"name"],
+gRw:[function(a){return J.FN(this.goc(a))},null,null,1,0,126,"nameIsEmpty"],
 "@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -15553,27 +15729,27 @@
 a.X0=w
 C.wU.ZL(a)
 C.wU.oX(a)
-return a},null,null,0,0,126,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[544],
+return a},null,null,0,0,22,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[322],
 Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
 Uj:{
-"^":["Bc;kF%-335,IK%-347,Qt%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gTq:[function(a){return a.kF},null,null,1,0,348,"checked",307,330],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,349,30,[],"checked",307],
-gEu:[function(a){return a.IK},null,null,1,0,312,"checkedText",307,330],
-sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",307],
-gRY:[function(a){return a.Qt},null,null,1,0,312,"uncheckedText",307,330],
-sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,32,30,[],"uncheckedText",307],
+"^":["Bc;kF%-109,IK%-125,Qt%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,126,"checked",82,104],
+sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,127,27,[],"checked",82],
+gEu:[function(a){return a.IK},null,null,1,0,87,"checkedText",82,104],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,8,27,[],"checkedText",82],
+gRY:[function(a){return a.Qt},null,null,1,0,87,"uncheckedText",82,104],
+sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,8,27,[],"uncheckedText",82],
 RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,343,21,[],545,[],82,[],"change"],
+a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,120,7,[],323,[],119,[],"change"],
 "@":function(){return[C.mS]},
 static:{Al:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15581,21 +15757,21 @@
 a.X0=w
 C.fA.ZL(a)
 C.fA.oX(a)
-return a},null,null,0,0,126,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[546],
+return a},null,null,0,0,22,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[324],
 Bc:{
 "^":"xc+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 xT:{
-"^":["V29;rd%-547,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.rd},null,null,1,0,514,"frame",307,330],
-sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,508,30,[],"frame",307],
+"^":["V30;rd%-325,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.rd},null,null,1,0,288,"frame",82,104],
+sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,283,27,[],"frame",82],
 "@":function(){return[C.Xv]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15603,22 +15779,22 @@
 a.X0=w
 C.dX.ZL(a)
 C.dX.oX(a)
-return a},null,null,0,0,126,"new StackFrameElement$created"]}},
-"+StackFrameElement":[548],
-V29:{
+return a},null,null,0,0,22,"new StackFrameElement$created"]}},
+"+StackFrameElement":[326],
+V30:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uwf:{
-"^":["V30;B3%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,329,"trace",307,330],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,331,30,[],"trace",307],
-pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["V31;B3%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,103,"trace",82,104],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,105,27,[],"trace",82],
+pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15626,18 +15802,18 @@
 a.X0=w
 C.bg.ZL(a)
 C.bg.oX(a)
-return a},null,null,0,0,126,"new StackTraceElement$created"]}},
-"+StackTraceElement":[549],
-V30:{
+return a},null,null,0,0,22,"new StackTraceElement$created"]}},
+"+StackTraceElement":[327],
+V31:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
-IP:[function(a){var z=J.x(a)
+IP:function(a){var z=J.x(a)
 if(!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},"$1","tF",2,0,null,142,[]],
-iX:[function(a,b){var z,y,x,w,v,u,t,s
+default:return z.gLm(a)}},
+iX:function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
 if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
@@ -15648,8 +15824,8 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"$2","Nc",4,0,null,273,[],291,[]],
-HP:[function(a,b,c,d,e){var z,y,x
+return new M.K6(z,u,w,t)},
+HP:function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
 M.Ky(a).wh(z)
@@ -15658,17 +15834,17 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"$5","K4",10,0,null,273,[],162,[],292,[],291,[],293,[]],
-bM:[function(a){var z
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},
+bM:function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
 if(!!z.$isYN||!!z.$isI0||!!z.$ishy)return a
-return},"$1","ay",2,0,null,273,[]],
-pN:[function(a,b){var z,y
+return},
+pN:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$iscv)return M.F5(a,b)
 if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"$2","vw",4,0,null,273,[],291,[]],
-F5:[function(a,b){var z,y,x
+if(y!=null)return["text",y]}return},
+F5:function(a,b){var z,y,x
 z={}
 z.a=null
 z.b=!1
@@ -15678,8 +15854,8 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"$2","OT",4,0,null,142,[],291,[]],
-Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+y.push(M.F4("{{}}","bind",a,b))}return z.a},
+Iu:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
 t=u.gEJ()
@@ -15708,8 +15884,8 @@
 t.push(L.Sk(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"$4","NJ",6,2,null,85,298,[],273,[],292,[],293,[]],
-F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(y)d.push(i)}},
+F4:function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=a.length
 if(z===0)return
 for(y=d==null,x=J.U6(a),w=null,v=0;v<z;){u=x.XU(a,"{{",v)
@@ -15724,14 +15900,14 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"$4","jF",8,0,null,94,[],12,[],273,[],291,[]],
-SH:[function(a,b){var z,y
+return z},
+SH:function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"$2","St",4,0,null,220,[],292,[]],
-Ky:[function(a){var z,y,x,w
+z=z.nextSibling}},
+Ky:function(a){var z,y,x,w
 z=$.rw()
 z.toString
 y=H.VK(a,"expando$values")
@@ -15745,12 +15921,12 @@
 else w=!0
 x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},"$1","La",2,0,null,273,[]],
-wR:[function(a){var z=J.x(a)
+return x},
+wR:function(a){var z=J.x(a)
 if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
-return z},"$1","xS",2,0,null,211,[]],
+return z},
 V2:{
 "^":"TU;N1,mD,Ck",
 Z1:function(a,b,c,d){var z,y,x,w,v
@@ -15793,14 +15969,14 @@
 v=null}}else{w=null
 v=null}M.NP.prototype.EC.call(this,a)
 if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)}},
-H2:{
+b2i:{
 "^":"TR;",
 cO:function(a){if(this.qP==null)return
 this.Ca.ed()
 X.TR.prototype.cO.call(this,this)}},
-lP:{
-"^":"Tp:126;",
-$0:[function(){var z,y,x,w,v
+DO:{
+"^":"Tp:22;",
+$0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
 y.st5(z,"checkbox")
@@ -15813,26 +15989,26 @@
 v=document.createEvent("MouseEvent")
 J.e2(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.mt:C.Nm.gtH(x)},"$0",null,0,0,null,"call"],
+return x.length===1?C.mt:C.Nm.gtH(x)},
 $isEH:true},
 fTP:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.push(C.pi)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 ppY:{
-"^":"Tp:115;b",
-$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;b",
+$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 NP:{
-"^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:function(a){var z=this.gH()
 J.ta(z,a==null?"":H.d(a))},
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"$1","gqf",2,0,169,21,[]]},
-jt:{
-"^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+O.Y3()},"$1","gqf",2,0,26,7,[]]},
+Vh:{
+"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:function(a){var z=X.TR.prototype.gH.call(this)
 J.rP(z,null!=a&&!1!==a)},
@@ -15841,8 +16017,8 @@
 J.ta(this.xS,z)
 if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
 x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,169,21,[]],
-static:{kv:[function(a){var z,y,x
+if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,26,7,[]],
+static:{kv:function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
 z.toString
@@ -15850,10 +16026,10 @@
 return z.ev(z,new M.r0(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"$1","VE",2,0,null,142,[]]}},
+return x.ev(x,new M.jz(a))}}}},
 r0:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y
+"^":"Tp:16;a",
+$1:function(a){var z,y
 z=this.a
 y=J.x(a)
 if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
@@ -15861,15 +16037,15 @@
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"$1",null,2,0,null,295,[],"call"],
+return z},
 $isEH:true},
 jz:{
-"^":"Tp:115;b",
-$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"$1",null,2,0,null,295,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){var z=J.x(a)
+return!z.n(a,this.b)&&z.gMB(a)==null},
 $isEH:true},
 SA:{
-"^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
+"^":"b2i;Dh,Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:function(a){var z
 this.C7()
@@ -15895,18 +16071,18 @@
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"$1","gqf",2,0,169,21,[]],
+J.ta(this.xS,z)}},"$1","gqf",2,0,26,7,[]],
 $isSA:true,
-static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"$1","v7",2,0,null,30,[]]}},
+static:{qb:function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
+return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 hB:{
-"^":"Tp:300;a",
+"^":"Tp:75;a",
 $2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],550,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,231,[],328,[],"call"],
 $isEH:true},
 nv:{
-"^":"Tp:115;",
-$1:[function(a){return 0},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return 0},
 $isEH:true},
 ee:{
 "^":"V2;N1,mD,Ck",
@@ -15914,8 +16090,7 @@
 Z1:function(a,b,c,d){var z,y,x
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-y=this.gN1()
-J.MV(!!J.x(y).$isTU?y:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
 J.Vs(this.N1).Rz(0,b)
 y=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
@@ -15925,7 +16100,7 @@
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}else{z=this.N1
 x=d!=null?d:""
-x=new M.jt(null,z,c,null,null,"checked",x)
+x=new M.Vh(null,z,c,null,null,"checked",x)
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
@@ -15947,13 +16122,12 @@
 for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 if(y!=null)J.wC(y)}this.mD=null},
 gCd:function(a){var z=this.mD
-if(z==null){z=P.L5(null,null,null,J.O,X.TR)
+if(z==null){z=P.L5(null,null,null,P.qU,X.TR)
 this.mD=z}return z},
-glN:function(){var z=this.gN1()
-return!!J.x(z).$isTU?z:this},
+glN:function(){return!!J.x(this.gN1()).$isTU?this.gN1():this},
 $isTU:true},
 yp:{
-"^":"a;rg,qW,k8<"},
+"^":"a;rg,Ug,k8<"},
 ug:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
@@ -15961,8 +16135,7 @@
 if(J.de(b,"selectedindex"))b="selectedIndex"
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 y=this.N1
@@ -16085,7 +16258,7 @@
 return!0},
 Sy:function(){return this.wh(null)},
 $isDT:true,
-static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
+static:{"^":"mn,EW,Sf,To",Fz:function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
 y=J.x(z)
 if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
@@ -16093,13 +16266,13 @@
 else y=!1
 if(y)return z
 for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"$2","Tkw",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
+return z},TA:function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"$1","lA",2,0,null,270,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},eX:function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
@@ -16113,25 +16286,25 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},"$1","Bw",2,0,null,295,[]],KE:[function(a,b,c){var z,y,x,w
+break}}return y},KE:function(a,b,c){var z,y,x,w
 z=J.G6(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"$3","BZ",6,0,null,270,[],295,[],296,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},GM:function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.$1(a)
-y.aN(y,z)},"$1","DR",2,0,null,297,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},oR:function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 J.c9(z,H.d($.cz())+" { display: none; }")
-document.head.appendChild(z)},"$0","Lv",0,0,null]}},
+document.head.appendChild(z)}}},
 OB:{
-"^":"Tp:169;",
-$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"$1",null,2,0,null,270,[],"call"],
+"^":"Tp:26;",
+$1:function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},
 $isEH:true},
-Uf:{
-"^":"Tp:115;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,374,[],"call"],
+lP:{
+"^":"Tp:16;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,158,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
@@ -16151,8 +16324,8 @@
 this.ud=null},
 $isTR:true},
 NW:{
-"^":"Tp:300;a,b,c,d",
-$2:[function(a,b){var z,y,x,w
+"^":"Tp:75;a,b,c,d",
+$2:function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
 if(b==="")b="{{}}"}else if(z.n(a,"bind")||z.n(a,"repeat")){this.a.c=!0
@@ -16163,7 +16336,7 @@
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},"$2",null,4,0,null,12,[],30,[],"call"],
+z.push(y)}},
 $isEH:true},
 HS:{
 "^":"a;EJ<,PU",
@@ -16182,7 +16355,7 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"$1","gBg",2,0,551,30,[]],
+return y+H.d(z[3])},"$1","gBg",2,0,329,27,[]],
 DJ:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -16192,7 +16365,7 @@
 u=w+2
 if(u>=z.length)return H.e(z,u)
 t=z[u]
-y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,552,553,[]],
+y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,330,331,[]],
 Yn:function(a){this.PU=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -16213,12 +16386,12 @@
 u=this.eD
 v.push(L.Sk(z,u,null))
 w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
-this.Az(w.gP(w))},"$0","gjM",0,0,126],
+this.Az(w.gP(w))},"$0","gjM",0,0,22],
 Az:function(a){var z,y,x,w
 z=this.xG
 this.Gb()
 y=J.x(a)
-if(!!y.$isList){this.xG=a
+if(!!y.$iszM){this.xG=a
 x=a}else if(!!y.$isQV){x=y.br(a)
 this.xG=x}else{this.xG=null
 x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
@@ -16293,7 +16466,7 @@
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
 k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,554,264,[]],
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,332,333,[]],
 uS:function(a){var z
 for(z=J.GP(a);z.G();)J.wC(z.gl())},
 Gb:function(){var z=this.IY
@@ -16310,21 +16483,21 @@
 this.FS=null}this.e9.kr=null
 this.pq=!0}},
 VU:{
-"^":"Tp:115;",
-$1:[function(a){return[a]},"$1",null,2,0,null,28,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return[a]},"$1",null,2,0,null,231,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:555;a",
+"^":"Tp:334;a",
 $1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"$1",null,2,0,null,553,[],"call"],
+return this.a?y:[y]},"$1",null,2,0,null,331,[],"call"],
 $isEH:true},
 R7:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,350,[],"call"],
+"^":"Tp:16;b",
+$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,128,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -16350,8 +16523,7 @@
 gN1:function(){return this.N1},
 Z1:function(a,b,c,d){var z,y,x
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 y=this.N1
@@ -16389,18 +16561,18 @@
 this.EC(J.Vm(this.xS))},
 $isTR:true},
 VD:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,350,[],"call"],
+return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,128,[],"call"],
 $isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.Ye]},
 static:{cF:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -16409,21 +16581,21 @@
 a.X0=w
 C.V8.ZL(a)
 C.V8.oX(a)
-return a},null,null,0,0,126,"new VMRefElement$created"]}},
-"+VMRefElement":[336]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+return a},null,null,0,0,22,"new VMRefElement$created"]}},
+"+VMRefElement":[110]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
-en:{
-"^":["V31;ID%-305,lc%-556,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,507,"vm",307,330],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,557,30,[],"vm",307],
-gkc:[function(a){return a.lc},null,null,1,0,521,"error",307,330],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,522,30,[],"error",307],
-pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+SC:{
+"^":["V32;ID%-80,lc%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzf:[function(a){return a.ID},null,null,1,0,281,"vm",82,104],
+szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,336,27,[],"vm",82],
+gkc:[function(a){return a.lc},null,null,1,0,297,"error",82,104],
+skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,298,27,[],"error",82],
+pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.Hk]},
 static:{oH:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -16431,34 +16603,28 @@
 a.X0=w
 C.nt.ZL(a)
 C.nt.oX(a)
-return a},null,null,0,0,126,"new VMViewElement$created"]}},
-"+VMViewElement":[558],
-V31:{
+return a},null,null,0,0,22,"new VMViewElement$created"]}},
+"+VMViewElement":[337],
+V32:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
-J.O.$isString=true
-J.O.$isTx=true
-J.O.$asTx=[J.O]
-J.O.$isa=true
-J.P.$isTx=true
-J.P.$asTx=[J.P]
-J.P.$isa=true
-J.bU.$isint=true
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isa=true
-J.Pp.$isdouble=true
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isa=true
+P.qU.$isqU=true
+P.qU.$isTx=true
+P.qU.$asTx=[P.qU]
+P.qU.$isa=true
+P.lf.$isTx=true
+P.lf.$asTx=[P.lf]
+P.lf.$isa=true
+P.KN.$isKN=true
+P.KN.$isTx=true
+P.KN.$asTx=[P.lf]
+P.KN.$isa=true
+P.CP.$isCP=true
+P.CP.$isTx=true
+P.CP.$asTx=[P.lf]
+P.CP.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
@@ -16472,9 +16638,9 @@
 P.a6.$isTx=true
 P.a6.$asTx=[P.a6]
 P.a6.$isa=true
-J.Q.$isList=true
-J.Q.$isQV=true
-J.Q.$isa=true
+P.zM.$iszM=true
+P.zM.$isQV=true
+P.zM.$isa=true
 P.Od.$isa=true
 P.a.$isa=true
 W.cv.$iscv=true
@@ -16514,8 +16680,8 @@
 P.wv.$isa=true
 T.yj.$isyj=true
 T.yj.$isa=true
-J.kn.$isbool=true
-J.kn.$isa=true
+P.a2.$isa2=true
+P.a2.$isa=true
 W.OJ.$isea=true
 W.OJ.$isa=true
 A.XP.$isXP=true
@@ -16564,9 +16730,9 @@
 W.ea.$isa=true
 P.qh.$isqh=true
 P.qh.$isa=true
-W.Wp.$isWp=true
-W.Wp.$isea=true
-W.Wp.$isa=true
+W.Aj.$isAj=true
+W.Aj.$isea=true
+W.Aj.$isa=true
 G.DA.$isDA=true
 G.DA.$isa=true
 M.Ya.$isa=true
@@ -16604,6 +16770,18 @@
 D.e5.$isa=true
 D.Q4.$isa=true
 D.N8.$isa=true
+D.U4.$isaf=true
+D.U4.$isa=true
+D.rj.$isrj=true
+D.rj.$isaf=true
+D.rj.$isa=true
+D.SI.$isSI=true
+D.SI.$isaf=true
+D.SI.$isqC=true
+D.SI.$asqC=[null,null]
+D.SI.$isZ0=true
+D.SI.$asZ0=[null,null]
+D.SI.$isa=true
 D.c2.$isa=true
 W.zU.$isD0=true
 W.zU.$isa=true
@@ -16646,13 +16824,6 @@
 V.qC.$isqC=true
 V.qC.$isZ0=true
 V.qC.$isa=true
-D.SI.$isSI=true
-D.SI.$isaf=true
-D.SI.$isqC=true
-D.SI.$asqC=[null,null]
-D.SI.$isZ0=true
-D.SI.$asZ0=[null,null]
-D.SI.$isa=true
 P.jp.$isjp=true
 P.jp.$isa=true
 P.Tx.$isTx=true
@@ -16687,9 +16858,6 @@
 D.hR.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
-D.rj.$isrj=true
-D.rj.$isaf=true
-D.rj.$isa=true
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
@@ -16718,10 +16886,10 @@
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
 return J.ks(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.Jh.prototype
-if(typeof a=="boolean")return J.kn.prototype
+if(typeof a=="boolean")return J.yEe.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
@@ -16743,7 +16911,6 @@
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
-J.Eh=function(a,b){return J.Wx(a).O(a,b)}
 J.Ew=function(a){return J.RE(a).gSw(a)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
 J.F6=function(a,b){return J.RE(a).stD(a,b)}
@@ -16756,6 +16923,7 @@
 J.GL=function(a){return J.RE(a).gfN(a)}
 J.GP=function(a){return J.w1(a).gA(a)}
 J.GW=function(a){return J.RE(a).gVY(a)}
+J.H2=function(a,b){return J.RE(a).sDD(a,b)}
 J.HF=function(a){return J.RE(a).gD7(a)}
 J.Hf=function(a){return J.RE(a).gTq(a)}
 J.IQ=function(a){return J.RE(a).Ms(a)}
@@ -16795,6 +16963,7 @@
 J.OS=function(a,b){return J.w1(a).tt(a,b)}
 J.Or=function(a){return J.RE(a).yx(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
+J.Pz=function(a,b){return J.RE(a).szZ(a,b)}
 J.Q5=function(a){return J.RE(a).gwl(a)}
 J.Q8=function(a){return J.RE(a).gp8(a)}
 J.QC=function(a){return J.w1(a).wg(a)}
@@ -16835,7 +17004,6 @@
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
 J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.YD=function(a){return J.RE(a).gR(a)}
 J.YP=function(a){return J.RE(a).gQ7(a)}
 J.YV=function(a){return J.RE(a).goE(a)}
 J.Yl=function(a){return J.w1(a).np(a)}
@@ -16847,12 +17015,11 @@
 J.aK=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.ak=function(a){return J.RE(a).gNF(a)}
 J.am=function(a){return J.RE(a).VD(a)}
-J.bB=function(a){return J.x(a).gbx(a)}
 J.bY=function(a,b){return J.Wx(a).Y(a,b)}
 J.bd=function(a,b){return J.RE(a).sBu(a,b)}
-J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
 J.bs=function(a){return J.RE(a).JP(a)}
+J.c1=function(a,b){return J.Wx(a).O(a,b)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
@@ -16865,15 +17032,14 @@
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
 J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
 J.eI=function(a,b){return J.RE(a).bA(a,b)}
+J.eY=function(a){return J.RE(a).gR(a)}
 J.f5=function(a){return J.RE(a).gI(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
-J.iF=function(a,b){return J.RE(a).szZ(a,b)}
 J.iS=function(a){return J.RE(a).gox(a)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
-J.ja=function(a,b){return J.w1(a).Vr(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
@@ -16889,6 +17055,7 @@
 J.m4=function(a){return J.RE(a).gig(a)}
 J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
 return J.Wx(a).i(a,b)}
+J.nG=function(a,b){return J.RE(a).vV(a,b)}
 J.nJ=function(a){return J.RE(a).ga4(a)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
@@ -16896,6 +17063,7 @@
 J.on=function(a){return J.RE(a).gtT(a)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
+J.pb=function(a,b){return J.w1(a).Vr(a,b)}
 J.pe=function(a,b){return J.RE(a).pr(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
@@ -16926,13 +17094,13 @@
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wC=function(a){return J.RE(a).cO(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
+J.wT=function(a,b){return J.w1(a).h(a,b)}
 J.wp=function(a,b,c,d){return J.w1(a).zB(a,b,c,d)}
 J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yn=function(a,b){return J.RE(a).vV(a,b)}
 J.yxg=function(a){return J.RE(a).gGd(a)}
 J.z2=function(a){return J.RE(a).gG1(a)}
 J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
@@ -16945,11 +17113,11 @@
 C.oq=Q.Tg.prototype
 C.ka=Z.Jc.prototype
 C.IK=O.CN.prototype
-C.ux=F.Be.prototype
+C.YD=F.Be.prototype
 C.j8=R.i6.prototype
 C.O0=R.lw.prototype
 C.OD=F.Ir.prototype
-C.Gh=L.rm.prototype
+C.Gh=L.bf.prototype
 C.UF=R.Lt.prototype
 C.MC=D.UL.prototype
 C.LT=A.jM.prototype
@@ -16967,12 +17135,12 @@
 C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
 C.ON=J.Pp.prototype
-C.jn=J.bU.prototype
+C.jn=J.imn.prototype
 C.jN=J.Jh.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
-C.ct=A.oM.prototype
+C.ct=A.Zt.prototype
 C.Z3=R.LU.prototype
 C.MG=M.KL.prototype
 C.S2=W.H9.prototype
@@ -16988,7 +17156,7 @@
 C.Iv=A.xc.prototype
 C.Cc=Q.NQ.prototype
 C.HD=T.ov.prototype
-C.c0=A.knI.prototype
+C.c0=A.kn.prototype
 C.cJ=U.fI.prototype
 C.SX=R.zMr.prototype
 C.Vd=D.nk.prototype
@@ -17000,18 +17168,11 @@
 C.lx=A.tz.prototype
 C.vB=J.is.prototype
 C.V8=X.I5.prototype
-C.nt=U.en.prototype
+C.nt=U.SC.prototype
 C.ol=W.u9.prototype
 C.KZ=new H.hJ()
 C.OL=new U.EZ()
 C.Gw=new H.yq()
-C.E3=new J.Q()
-C.Fm=new J.kn()
-C.yX=new J.Pp()
-C.c1=new J.bU()
-C.x0=new J.Jh()
-C.oD=new J.P()
-C.Kn=new J.O()
 C.J19=new K.ndx()
 C.IU=new P.TO()
 C.Us=new A.yL()
@@ -17020,7 +17181,7 @@
 C.xd=new A.Mh()
 C.vT=new P.mg()
 C.NU=new P.R8()
-C.v8=new P.AHi()
+C.v8=new P.nU()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.nj=new D.WAE("Native")
@@ -17053,7 +17214,7 @@
 C.js=new A.V3("stack-trace")
 C.Ur=new A.V3("script-ref")
 C.tSc=new A.V3("class-ref")
-C.jy=new A.V3("breakpoint-list")
+C.PT=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Ye=new A.V3("vm-ref")
 C.Gu=new A.V3("collapsible-content")
@@ -17061,8 +17222,8 @@
 C.kR=new A.V3("observatory-application")
 C.uvO=new A.V3("service-error-view")
 C.Qz=new A.V3("eval-box")
-C.zaS=new A.V3("isolate-nav-menu")
-C.qJ=new A.V3("class-nav-menu")
+C.oD=new A.V3("isolate-nav-menu")
+C.iF=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
 C.u7=new A.V3("nav-menu")
 C.KH=new A.V3("json-view")
@@ -17073,17 +17234,17 @@
 C.JD=new A.V3("service-ref")
 C.nW=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
-C.qlk=new A.V3("instance-view")
+C.be=new A.V3("instance-view")
 C.ny=new P.a6(0)
-C.mt=H.VM(new W.UC("change"),[W.ea])
-C.pi=H.VM(new W.UC("click"),[W.Wp])
-C.MD=H.VM(new W.UC("error"),[W.ew])
-C.PP=H.VM(new W.UC("hashchange"),[W.ea])
-C.i3=H.VM(new W.UC("input"),[W.ea])
-C.fK=H.VM(new W.UC("load"),[W.ew])
-C.Ns=H.VM(new W.UC("message"),[W.cx])
-C.DK=H.VM(new W.UC("mousedown"),[W.Wp])
-C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
+C.mt=H.VM(new W.e0("change"),[W.ea])
+C.T1=H.VM(new W.e0("click"),[W.Aj])
+C.MD=H.VM(new W.e0("error"),[W.ew])
+C.PP=H.VM(new W.e0("hashchange"),[W.ea])
+C.i3=H.VM(new W.e0("input"),[W.ea])
+C.fK=H.VM(new W.e0("load"),[W.ew])
+C.Ns=H.VM(new W.e0("message"),[W.cx])
+C.DK=H.VM(new W.e0("mousedown"),[W.Aj])
+C.W2=H.VM(new W.e0("mousemove"),[W.Aj])
 C.Mc=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -17217,12 +17378,12 @@
 }
 C.xr=new P.by(null,null)
 C.A3=new P.Cf(null)
-C.cb=new P.dI(null,null)
+C.cb=new P.ze(null,null)
 C.Ek=new N.qV("FINER",400)
 C.R5=new N.qV("FINE",500)
 C.IF=new N.qV("INFO",800)
 C.cV=new N.qV("SEVERE",1000)
-C.UP=new N.qV("WARNING",900)
+C.nT=new N.qV("WARNING",900)
 I.makeConstantList = function(list) {
   list.immutable$list = init;
   list.fixed$length = init;
@@ -17236,7 +17397,7 @@
 C.Me=H.VM(I.makeConstantList([]),[P.Ms])
 C.dn=H.VM(I.makeConstantList([]),[P.tg])
 C.hU=H.VM(I.makeConstantList([]),[P.X9])
-C.iH=H.VM(I.makeConstantList([]),[J.bU])
+C.iH=H.VM(I.makeConstantList([]),[P.KN])
 C.xD=I.makeConstantList([])
 C.Qy=I.makeConstantList(["in","this"])
 C.Ym=I.makeConstantList(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
@@ -17248,8 +17409,8 @@
 C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
 C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
+C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
 C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
 C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.CM=new H.LPe(0,{},C.xD)
@@ -17284,8 +17445,10 @@
 C.tP=new H.GD("entry")
 C.YU=new H.GD("error")
 C.ne=new H.GD("exception")
+C.dI=new H.GD("expand")
 C.mr=new H.GD("expanded")
 C.Of=new H.GD("expander")
+C.Jt=new H.GD("expanderStyle")
 C.Yy=new H.GD("expr")
 C.Gx=new H.GD("field")
 C.CX=new H.GD("fileAndLine")
@@ -17294,7 +17457,7 @@
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
 C.eF=new H.GD("formattedInclusiveTicks")
-C.Zt=new H.GD("formattedLine")
+C.oI=new H.GD("formattedLine")
 C.ST=new H.GD("formattedTotalCollectionTime")
 C.QH=new H.GD("fragmentation")
 C.rE=new H.GD("frame")
@@ -17303,6 +17466,7 @@
 C.mP=new H.GD("hasClass")
 C.zS=new H.GD("hasDisassembly")
 C.D2=new H.GD("hasParent")
+C.Ia=new H.GD("hashLinkWorkaround")
 C.lb=new H.GD("hideTagsChecked")
 C.du=new H.GD("hitStyle")
 C.bA=new H.GD("hoverText")
@@ -17314,6 +17478,7 @@
 C.P9=new H.GD("isDart")
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
+C.FQ=new H.GD("isOptimized")
 C.Z8=new H.GD("isolate")
 C.Qn=new H.GD("jumpTarget")
 C.fy=new H.GD("kind")
@@ -17321,17 +17486,19 @@
 C.QL=new H.GD("last")
 C.kA=new H.GD("lastTokenPos")
 C.Wn=new H.GD("length")
+C.Ij=new H.GD("libraries")
 C.EV=new H.GD("library")
 C.eh=new H.GD("lineMode")
 C.Cv=new H.GD("lines")
 C.dB=new H.GD("link")
-C.wT=new H.GD("mainPort")
+C.dH=new H.GD("mainPort")
 C.p3=new H.GD("map")
 C.t6=new H.GD("mapAsString")
 C.PC=new H.GD("dart.core.int")
 C.ch=new H.GD("message")
 C.UX=new H.GD("msg")
 C.YS=new H.GD("name")
+C.KG=new H.GD("nameIsEmpty")
 C.So=new H.GD("newHeapCapacity")
 C.IO=new H.GD("newHeapUsed")
 C.OV=new H.GD("noSuchMethod")
@@ -17339,6 +17506,7 @@
 C.xG=new H.GD("objectPool")
 C.Le=new H.GD("oldHeapCapacity")
 C.SW=new H.GD("oldHeapUsed")
+C.ZU=new H.GD("pad")
 C.wq=new H.GD("pausedOnExit")
 C.NT=new H.GD("pausedOnStart")
 C.Kl=new H.GD("pos")
@@ -17351,7 +17519,7 @@
 C.mE=new H.GD("response")
 C.UY=new H.GD("result")
 C.Aa=new H.GD("results")
-C.xe=new H.GD("rootLib")
+C.iG=new H.GD("rootLib")
 C.X8=new H.GD("running")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
@@ -17381,55 +17549,47 @@
 C.KS=new H.GD("vmName")
 C.v6=new H.GD("void")
 C.n8=H.uV('qC')
-C.WP=new H.QT(C.n8,"K",0)
+C.WP=new H.bB(C.n8,"K",0)
 C.SL=H.uV('Ae')
-C.xC=new H.QT(C.SL,"V",0)
+C.xC=new H.bB(C.SL,"V",0)
 C.QJ=H.uV('xh')
-C.wW=new H.QT(C.QJ,"T",0)
+C.wW=new H.bB(C.QJ,"T",0)
 C.Gsc=H.uV('wn')
-C.io=new H.QT(C.Gsc,"E",0)
-C.nz=new H.QT(C.n8,"V",0)
+C.io=new H.bB(C.Gsc,"E",0)
+C.nz=new H.bB(C.n8,"V",0)
 C.RP=H.uV('hx')
+C.I7=H.uV('bf')
 C.q0S=H.uV('Dg')
 C.z6Y=H.uV('Tg')
-C.xFi=H.uV('rm')
-C.eY=H.uV('n6')
 C.J9=H.uV('zMr')
-C.Vh=H.uV('Pz')
 C.zq=H.uV('Qa')
+C.tf=H.uV('Zt')
 C.qfw=H.uV('qW')
 C.GTO=H.uV('F1')
+C.wc=H.uV('kn')
 C.nY=H.uV('a')
 C.Yc=H.uV('iP')
 C.Pt=H.uV('ov')
 C.jRs=H.uV('Be')
 C.Ow=H.uV('oO')
-C.PT=H.uV('I2')
-C.p8F=H.uV('NQ')
-C.xLI=H.uV('pz')
+C.xF=H.uV('NQ')
+C.Xb=H.uV('pz')
 C.xz=H.uV('Stq')
-C.T1=H.uV('Wy')
 C.aj=H.uV('fI')
 C.Kh=H.uV('I5')
-C.la=H.uV('ZX')
 C.G4=H.uV('CN')
-C.O4=H.uV('double')
-C.yw=H.uV('int')
+C.O4=H.uV('CP')
+C.yw=H.uV('KN')
 C.b7=H.uV('uwf')
 C.RcY=H.uV('aQ')
 C.KJ=H.uV('mk')
-C.ST4=H.uV('en')
 C.X6M=H.uV('jM')
-C.yiu=H.uV('knI')
 C.dUi=H.uV('Uj')
 C.U9=H.uV('UL')
-C.iG=H.uV('yc')
 C.HI=H.uV('Pg')
 C.ab=H.uV('xI')
-C.lk=H.uV('mJ')
 C.lpG=H.uV('LU')
 C.Ch=H.uV('KL')
-C.jV=H.uV('rF')
 C.OdR=H.uV('pL')
 C.cj=H.uV('E7')
 C.eB=H.uV('F1i')
@@ -17439,32 +17599,28 @@
 C.qo=H.uV('jY')
 C.l49=H.uV('uL')
 C.yQ=H.uV('EH')
-C.Im=H.uV('X6')
 C.FU=H.uV('lw')
-C.p5=H.uV('oM')
-C.nG=H.uV('zt')
 C.px=H.uV('tz')
 C.epC=H.uV('Jc')
-C.JA3=H.uV('b0B')
+C.Xd=H.uV('b0B')
 C.PF=H.uV('nk')
-C.Db=H.uV('String')
+C.Db=H.uV('qU')
 C.BP=H.uV('qkb')
 C.Tu=H.uV('xc')
 C.bh=H.uV('i6')
 C.Bm=H.uV('XP')
+C.wDw=H.uV('SC')
 C.hg=H.uV('hd')
 C.Fv=H.uV('ob')
 C.Wza=H.uV('pR')
 C.leN=H.uV('Lt')
-C.HL=H.uV('bool')
-C.Qf=H.uV('Null')
+C.HL=H.uV('a2')
+C.Qf=H.uV('L9')
 C.HH=H.uV('dynamic')
 C.vVv=H.uV('iL')
 C.Gp=H.uV('cw')
 C.ri=H.uV('yy')
 C.X0=H.uV('Ir')
-C.CS=H.uV('vm')
-C.hN=H.uV('oI')
 C.R4R=H.uV('xT')
 C.xM=new P.z0(!1)
 C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
@@ -17472,7 +17628,7 @@
 $.te="$cachedFunction"
 $.eb="$cachedInvocation"
 $.OK=0
-$.bf=null
+$.mJ=null
 $.P4=null
 $.Jl=!1
 $.NF=null
@@ -17500,14 +17656,14 @@
 $.uP=!0
 $.VZ="objects/"
 $.To=null
-$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fa","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE7","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gNF","gNG","gNT","gNW","gNh","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hT","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDe","sE7","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sN","sNF","sNG","sNT","sNW","sNh","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soY","soc","sox","soy","sp8","spD","sph","sqO","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","suD","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vQ","vV","w","wE","wL","wY","wg","x3","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
-$.Au=[C.RP,Z.hx,{created:Z.Co},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.p8F,Q.NQ,{created:Q.Zo},C.xLI,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.IV},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
+$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","Ft","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","P9","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xe","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gI","gID","gIF","gIK","gIO","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gMz","gN","gNF","gNG","gNT","gNW","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPl","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gRw","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","git","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goM","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqW","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","gu6","guD","guT","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rL","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDD","sDe","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sID","sIF","sIK","sIO","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sMz","sN","sNF","sNG","sNT","sNW","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPl","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","sit","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soM","soY","soc","sox","soy","sp8","spD","sph","sqO","sqW","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","su6","suD","suT","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vD","vQ","vV","w","wB","wE","wL","wY","wg","x3","xJ","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
+$.Au=[C.RP,Z.hx,{created:Z.Co},C.I7,L.bf,{created:L.Rp},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.IV},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.wc,A.kn,{created:A.Th},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.xF,Q.NQ,{created:Q.Zo},C.Xb,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.X6M,A.jM,{created:A.Sy},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Xd,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.wDw,U.SC,{created:U.oH},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
 I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
 I.$lazy($,"globalWindow","cO","C5",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
 I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
 I.$lazy($,"thisScript","Kb","Ak",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[J.bU])})
+I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({toString:function(){return"$receiver$"}}))})
 I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.LX(H.S7(null))})
@@ -17522,7 +17678,7 @@
 I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
-I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
+I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
 I.$lazy($,"_dynamicType","QG","P8",function(){return new H.EE(C.nN)})
 I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.v6)})
 I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
@@ -17540,21 +17696,21 @@
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(J.O,N.TJ)})
+I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(P.qU,N.TJ)})
 I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
 I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
 I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().$0()})
-I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
+I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR("\\s",H.v4("\\s",!1,!0,!1),null,null)})
 I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
-I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
-I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,J.O,A.XP)})
-I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,J.O,[J.Q,A.XP])})
-I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
+I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
+I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,P.qU,A.XP)})
+I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,P.qU,[P.zM,A.XP])})
+I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,P.qU,A.XP)})
 I.$lazy($,"_objectType","p0","H8",function(){return P.re(C.nY)})
 I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
-I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w13().$0()})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
+I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w12().$0()})
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,P.qU,P.a)
 z.FV(0,C.eu)
 return new A.HJ(z)})
 I.$lazy($,"_ready","tS","mC",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
@@ -17564,24 +17720,24 @@
 I.$lazy($,"_unbindLog","fV","P5",function(){return N.Jx("polymer.unbind")})
 I.$lazy($,"_bindLog","Q6","ZH",function(){return N.Jx("polymer.bind")})
 I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
-I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,window.location.href,null,null)})
+I.$lazy($,"_librariesToLoad","x2","UP",function(){return A.GA(document,window.location.href,null,null)})
 I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
 I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
 I.$lazy($,"_typeHandlers","lq","CT",function(){return new Z.W6().$0()})
 I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.wJY(),"-",new K.zOQ(),"*",new K.W6o(),"/",new K.MdQ(),"==",new K.YJG(),"!=",new K.DOe(),">",new K.lPa(),">=",new K.Ufa(),"<",new K.Raa(),"<=",new K.w0(),"||",new K.w4(),"&&",new K.w5(),"|",new K.w7()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w10(),"-",new K.w11(),"!",new K.w12()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR(H.v4("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR(H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().$0()})
+I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.Uf(),"-",new K.wJY(),"*",new K.zOQ(),"/",new K.W6o(),"==",new K.MdQ(),"!=",new K.YJG(),">",new K.DOe(),">=",new K.lPa(),"<",new K.Ufa(),"<=",new K.Raa(),"||",new K.w0(),"&&",new K.w4(),"|",new K.w5()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w7(),"-",new K.w10(),"!",new K.w11()],null,null)})
+I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.Uf()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.lP()).zV(0,", ")})
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},{func:"ny"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map",{func:"n9",void:true,args:[{func:"kl",void:true}]},"callback","errorHandler","zone","listeners","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"Gm",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,H.Tp,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.Pp,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.WZq,R.Nr,A.pva,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.V4,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V9,D.t9,J.Pp,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V10,D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,M.V14,"rec",{func:"IM",args:[N.HV]},Z.uL,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,A.V21,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V22,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.Pp]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"TB",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"oe",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Nt",args:[U.hw]},Q.V23,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"mRV",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V24,A.x4,U.V25,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.Pp},{func:"mV",args:[J.Pp]},"isolateId",[P.Z0,J.O,J.Pp],{func:"c7",ret:V.qC},{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[J.Q,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V26,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V27,{func:"nR",ret:Z.uL},U.V28,Q.Vfx,"details",Q.Bc,V.qC,K.V29,X.V30,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"UxH",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V31,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"Dv",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"ny"},{func:"pB",ret:P.vr,args:[P.a]},"reflectee",{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.MN]},,"error","stackTrace",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent","zone",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},"f",{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},{func:"Ib",ret:P.a2,args:[null,null]},{func:"bX",ret:P.KN,args:[null]},"a",{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Tx,P.Tx]},"b",{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"Gm",ret:P.KN,args:[P.a]},{func:"K4",ret:P.KN,args:[P.qU],named:{onError:{func:"Tl",ret:P.KN,args:[P.qU]},radix:P.KN}},{func:"Tf",ret:P.qU,args:[W.D0]},"receiver",{func:"jn",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o","v",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"iterable","index","invocation",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"hF",args:[null,P.qU]},G.dZ,D.H6,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:P.qU},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event","obj",P.KN,[P.zM,G.Y2],[P.zM,P.qU],{func:"r5",ret:[P.zM,P.KN]},{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"wI",args:[P.KN,P.KN]},D.SI,[P.Z0,P.qU,W.cv],{func:"Eg",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,P.a2,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},"target",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,"c",H.Tp,P.qU,{func:"Uf",ret:P.a2},{func:"zk",args:[P.a2]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"i",{func:"VG",ret:P.Ms,args:[P.KN]},{func:"Z5",args:[P.KN]},{func:"UC",ret:P.X9,args:[P.KN]},{func:"ag",args:[P.qU,P.qU]},"data",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","element",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each",{func:"Yz",ret:P.a2,args:[P.jp]},{func:"Tl",ret:P.KN,args:[P.qU]},{func:"Zh",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"GF",ret:P.KN,args:[null,null]},"byteString",{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"xhr","k",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[P.qU]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Aj]},L.WZq,"result",R.Nr,A.pva,U.rs,{func:"fO",ret:P.qU,args:[D.SI]},"function",N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:P.KN,args:[[P.QV,P.KN]]},"color",{func:"S1",void:true,args:[P.KN,P.qU,[P.QV,P.KN]]},"classId",{func:"D8",void:true,args:[null,P.KN]},"classList","freeClassId",{func:"XK",ret:[P.QV,P.KN],args:[P.KN]},{func:"D9",ret:P.qU,args:[[P.hL,P.KN]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,P.KN]]},{func:"j4",void:true,args:[P.KN]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:P.a2,args:[P.Z0]},{func:"Xb",args:[P.Z0,P.KN]},{func:"Na",ret:P.qU,args:[P.a2]},"newSpace",K.V4,{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[P.qU]}]},{func:"uj",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[P.qU]}]},{func:"pw",void:true,args:[P.a2,null]},"expand",Z.V9,D.t9,P.CP,G.XN,{func:"nzZ",ret:P.qU,args:[G.Y2]},X.V10,"m",D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,D.U4,{func:"ax",ret:D.U4},{func:"SN",args:[D.U4]},M.V14,"rec",{func:"IM",args:[N.HV]},A.V15,A.V16,A.V17,A.V18,A.V19,"x",A.V20,A.V21,A.V22,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V23,{func:"Z8",void:true,args:[P.qU,null,null]},{func:"Pz",ret:P.qU,args:[P.CP]},"time",{func:"vI",ret:P.qU,args:[P.Z0]},"frame",{func:"h6",ret:P.a2,args:[P.qU]},"type",A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"kG",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:P.KN},{func:"Lc",ret:P.a2,args:[P.a]},{func:"DF",void:true,args:[P.a]},"records",{func:"ZD",args:[[P.zM,G.DA]]},{func:"oe",args:[[P.zM,T.yj]]},{func:"rj",void:true,args:[P.qU,P.qU]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"model","node",{func:"K7",void:true,args:[[P.zM,T.yj]]},"def",{func:"Zu",args:[P.qU,null,null]},{func:"pp",ret:U.zX,args:[U.hw,U.hw]},3,{func:"Nt",args:[U.hw]},"s",Q.V24,D.rj,[P.zM,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[P.zM,D.c2]},{func:"mRV",args:[[P.zM,D.c2]]},{func:"Yg",ret:P.qU,args:[D.c2]},"line",T.V25,A.x4,U.V26,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.H6},"map",{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:P.CP},{func:"mV",args:[P.CP]},[P.Z0,P.qU,P.CP],{func:"c7",ret:V.qC},{func:"zs",ret:P.qU,args:[P.qU]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"EIX",ret:[Q.wn,D.U4]},{func:"P5",args:[[Q.wn,D.U4]]},{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[P.zM,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:P.qU,args:[D.kx]},"code",{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V27,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V28,"msg",{func:"nR",ret:Z.uL},U.V29,Q.Vfx,"details",Q.Bc,V.qC,K.V30,X.V31,"y",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.zM,P.a]]},"values",{func:"PzC",void:true,args:[[P.zM,G.DA]]},"splices",{func:"UxH",args:[P.zM]},D.pD,{func:"Af",args:[D.H6]},U.V32,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index 463c10c..6fbc01e 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -17,6 +17,11 @@
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
+      nav {
+        position: fixed;
+        width: 100%;
+        z-index: 1000;
+      }
       nav ul {
         display: inline-table;
         position: relative;
@@ -24,7 +29,7 @@
         padding-left: 0;
         margin-left: 0;
         width: 100%;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background-color: #0489c3;
@@ -32,12 +37,21 @@
       nav ul:after {
         content: ""; clear: both; display: block;
       }
+      .vertical-spacer {
+        height: 40px;
+        background-color: #0489c3;
+      }
     </style>
     <nav>
       <ul>
         <content></content>
       </ul>
     </nav>
+    <div class="vertical-spacer">
+    </div>
+    <template if="{{ pad }}">
+      <br>
+    </template>
   </template>
 </polymer-element>
 
@@ -64,7 +78,7 @@
         margin: 0;
         padding: 0;
         width: auto;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background: #567;
@@ -107,7 +121,7 @@
         padding: 0;
         margin-left: 0;
         width: auto;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background: #567;
@@ -171,10 +185,10 @@
 
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
+    <nav-menu link="{{ hashLinkWorkaround }}" anchor="{{ isolate.name }}" last="{{ last }}">
       <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="allocation profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}" anchor="heap map"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
@@ -205,7 +219,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ msg.isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <template if="{{ msg['breakpoints'].isEmpty }}">
@@ -276,13 +290,24 @@
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <style>
+      .errorBox {
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: pre;
+      }
+    </style>
     <span>
-      <template if="{{ isUnexpected(ref.serviceType) }}">
-        unexpected reference type &lt;{{ ref.serviceType }}&gt;
+      <template if="{{ isError(ref.serviceType) }}">
+        <pre class="errorBox">{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ isError(ref.serviceType) }}">
-        <pre>{{ ref.message }}</pre>
+      <template if="{{ isUnexpected(ref.serviceType) }}">
+        unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
       <template if="{{ isNull(ref.serviceType) }}">
@@ -378,7 +403,7 @@
         white-space: pre-line;
       }
       .historyExpr a:hover {
-        background-color: #e1f5fe
+        background-color: #fff3e3;
       }
       .historyValue {
         display: block;
@@ -426,6 +451,32 @@
 </polymer-element>
 
 
+<polymer-element name="eval-link">
+  <template>
+    <style>
+      .idle {
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        color: #aaa;
+        cursor: wait;
+      }
+    </style>
+
+    <template if="{{ busy }}">
+      <span class="busy">[evaluate]</span>
+    </template>
+    <template if="{{ !busy }}">
+      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+    </template>
+    <template if="{{ result != null }}">
+      = <instance-ref ref="{{ result }}"></instance-ref>
+    </template>
+
+  </template>
+  
+</polymer-element>
 <polymer-element name="field-ref" extends="service-ref">
   <template>
   <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
@@ -459,10 +510,16 @@
 </polymer-element>
 <polymer-element name="library-ref" extends="service-ref">
 <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-  <a href="{{ url }}">{{ name }}</a>
+  <template if="{{ nameIsEmpty }}">
+    <a href="{{ url }}">unnamed</a>
+  </template>
+  <template if="{{ !nameIsEmpty }}">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
 </template>
 
-</polymer-element><polymer-element name="script-ref" extends="service-ref">
+</polymer-element>
+<polymer-element name="script-ref" extends="service-ref">
 <template>
   <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
@@ -544,6 +601,12 @@
             <div class="memberValue">{{ cls.vmName }}</div>
           </div>
         </template>
+        <div class="memberItem">
+          <div class="memberName">retained size<br>(all instances)</div>
+          <div class="memberValue">
+            <eval-link callback="{{ retainedSize }}"></eval-link>
+          </div>
+        </div>
       </div>
     </div>
 
@@ -557,7 +620,7 @@
     <div class="content">
       <template if="{{ cls['fields'].isNotEmpty }}">
         fields ({{ cls['fields'].length }})
-        <curly-block>
+        <curly-block expand="{{ cls['fields'].length <= 8 }}">
           <div class="memberList">
             <template repeat="{{ field in cls['fields'] }}">
               <div class="memberItem">
@@ -572,12 +635,12 @@
               </div>
             </template>
           </div>
-        </curly-block><br>
+        </curly-block><br><br>
       </template>
 
       <template if="{{ cls['functions'].isNotEmpty }}">
         functions ({{ cls['functions'].length }})
-        <curly-block>
+        <curly-block expand="{{ cls['functions'].length <= 8 }}">
           <div class="memberList">
             <template repeat="{{ function in cls['functions'] }}">
               <div class="memberItem">
@@ -588,7 +651,7 @@
               </div>
             </template>
           </div>
-        </curly-block><br>
+        </curly-block><br><br>
       </template>
     </div>
 
@@ -606,7 +669,12 @@
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ code.isDartCode }}">
-      <a href="{{ url }}">{{ name }}</a>
+        <template if="{{ code.isOptimized }}">
+          <a href="{{ url }}">*{{ name }}</a>
+        </template>
+        <template if="{{ !code.isOptimized }}">
+          <a href="{{ url }}">{{ name }}</a>
+        </template>
     </template>
     <template if="{{ !code.isDartCode }}">
       <span>{{ name }}</span>
@@ -669,14 +737,25 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <div class="content">
-      <h1>Code for {{ code.name }}</h1>
+      <template if="{{ code.isDartCode &amp;&amp; code.isOptimized }}">
+        <h1>Optimized code for {{ code.name }}</h1>
+      </template>
+      <template if="{{ !(code.isDartCode &amp;&amp; code.isOptimized) }}">
+        <h1>Code for {{ code.name }}</h1>
+      </template>
       <div class="memberList">
         <div class="memberItem">
-          <div class="memberName">kind</div>
+          <div class="memberName">Kind</div>
           <div class="memberValue">{{code.kind}}</div>
         </div>
+        <template if="{{ code.isDartCode }}">
+          <div class="memberItem">
+            <div class="memberName">Optimized</div>
+            <div class="memberValue">{{code.isOptimized}}</div>
+          </div>
+        </template>
         <div class="memberItem">
-          <div class="memberName">function</div>
+          <div class="memberName">Function</div>
           <div class="memberValue">
             <function-ref ref="{{code.function}}">
             </function-ref>
@@ -781,39 +860,14 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
-        <h1>{{ error.kind }}</h1>
-        <div class="well">{{ error.message }}</div>
+    <div class="content-centered">
+      <h1>{{ error.kind }}</h1>
+      <br>
+      <div class="well">{{ error.message }}</div>
     </div>
   </template>
   
 </polymer-element>
-<polymer-element name="eval-link">
-  <template>
-    <style>
-      .idle {
-        color: #0489c3;
-        cursor: pointer;
-      }
-      .busy {
-        color: #aaa;
-        cursor: wait;
-      }
-    </style>
-
-    <template if="{{ busy }}">
-      <span class="busy">[evaluate]</span>
-    </template>
-    <template if="{{ !busy }}">
-      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
-    </template>
-    <template if="{{ result != null }}">
-      = <instance-ref ref="{{ result }}"></instance-ref>
-    </template>
-
-  </template>
-  
-</polymer-element>
 <polymer-element name="field-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
@@ -827,7 +881,7 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -957,7 +1011,7 @@
       <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -1059,19 +1113,27 @@
     .hover {
       position: fixed;
       z-index: 999;
+      height: 16px;
       width: 100%;
       background: #ffffff;
     }
+    .spacer {
+      height: 16px;
+      background-color: red;
+    }
   </style>
-  <nav-bar>
+  <nav-bar pad="{{ false }}">
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
-    <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
   </nav-bar>
   <div class="hover">
     <p style="text-align:center">{{ status }}</p>
   </div>
+  <div class="spacer">
+    <!-- Make sure no data is covered by hover bar initially -->
+  </div>
   <div class="flex-row">
     <canvas id="fragmentation" width="1px" height="1px"></canvas>
   </div>
@@ -1242,82 +1304,101 @@
 
     <br>
 
-    <div class="content">
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">root library</div>
-          <div class="memberValue">
-            <function-ref ref="{{ isolate.rootLib }}"></function-ref>
-          </div>
-        </div>
-        <div class="memberItem">
-          <template if="{{ isolate.entry != null }}">
-            <div class="memberName">entry</div>
-            <div class="memberValue">
-              <function-ref ref="{{ isolate.entry }}"></function-ref>
-            </div>
-          </template>
-        </div>
-        <div class="memberItem">
-          <div class="memberName">id</div>
-          <div class="memberValue">{{ isolate.mainPort }}</div>
-        </div>
-        <br>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+    <div class="content-centered">
+      <div class="flex-row">
 
+        <div class="flex-item-fixed-6-12">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">root library</div>
+              <div class="memberValue">
+                <library-ref ref="{{ isolate.rootLib }}"></library-ref>
+              </div>
+            </div>
+            <div class="memberItem">
+              <template if="{{ isolate.entry != null }}">
+                <div class="memberName">entry</div>
+                <div class="memberValue">
+                  <function-ref ref="{{ isolate.entry }}"></function-ref>
+                </div>
+              </template>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">id</div>
+              <div class="memberValue">{{ isolate.mainPort }}</div>
+            </div>
+            <br>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+              </div>
+            </div>
           </div>
         </div>
-      </div>
-    </div>
+
+        <div class="flex-item-fixed-6-12">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">new heap</div>
+              <div class="memberValue">
+                {{ isolate.newHeapUsed | formatSize }}
+                of
+                {{ isolate.newHeapCapacity | formatSize }}
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">old heap</div>
+              <div class="memberValue">
+                {{ isolate.oldHeapUsed | formatSize }}
+                of
+                {{ isolate.oldHeapCapacity | formatSize }}
+              </div>
+            </div>
+          </div>
+          <br>
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+              </div>
+            </div>
+          </div>
+        </div>
+
+      </div> <!-- flex row -->
+    </div> <!-- content -->
 
     <hr>
 
     <div class="content">
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">new heap</div>
-          <div class="memberValue">
-            {{ isolate.newHeapUsed | formatSize }}
-            of
-            {{ isolate.newHeapCapacity | formatSize }}
-          </div>
+      libraries ({{ isolate.libraries.length }})
+      <curly-block expand="{{ isolate.libraries.length <= 8 }}">
+        <div class="memberList">
+          <template repeat="{{ lib in isolate.libraries }}">
+            <div class="memberItem">
+              <div class="memberName">
+                <library-ref ref="{{ lib }}"></library-ref>
+              </div>
+            </div>
+          </template>
         </div>
-        <div class="memberItem">
-          <div class="memberName">old heap</div>
-          <div class="memberValue">
-            {{ isolate.oldHeapUsed | formatSize }}
-            of
-            {{ isolate.oldHeapCapacity | formatSize }}
-          </div>
-        </div>
-      </div>
-
-      <br>
-
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-          </div>
-        </div>
-      </div>
+      </curly-block>
     </div>
 
     <hr>
@@ -1386,6 +1467,12 @@
             <div class="memberName">size</div>
             <div class="memberValue">{{ instance['size'] | formatSize }}</div>
           </div>
+          <div class="memberItem">
+            <div class="memberName">retained size</div>
+            <div class="memberValue">
+              <eval-link callback="{{ retainedSize }}"></eval-link>
+            </div>
+          </div>
           <template if="{{ instance['type_class'] != null }}">
             <div class="memberItem">
               <div class="memberName">type class</div>
@@ -1421,7 +1508,7 @@
       <div class="content">
         <template if="{{ instance['fields'].isNotEmpty }}">
           fields ({{ instance['fields'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['fields'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ field in instance['fields'] }}">
                 <div class="memberItem">
@@ -1434,12 +1521,12 @@
                 </div>
               </template>
             </div>
-          </curly-block>
+          </curly-block><br><br>
         </template>
 
         <template if="{{ instance['nativeFields'].isNotEmpty }}">
           native fields ({{ instance['nativeFields'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ field in instance['nativeFields'] }}">
                 <div class="memberItem">
@@ -1448,12 +1535,12 @@
                 </div>
               </template>
             </div>
-          </curly-block><br>
+          </curly-block><br><br>
         </template>
 
         <template if="{{ instance['elements'].isNotEmpty }}">
           elements ({{ instance['elements'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['elements'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ element in instance['elements'] }}">
                 <div class="memberItem">
@@ -1465,7 +1552,7 @@
                 </div>
               </template>
             </div>
-          </curly-block><br>
+          </curly-block><br><br>
         </template>
       </div>
 
@@ -1508,18 +1595,8 @@
       <div class="memberList">
         <div class="memberItem">
           <div class="memberName">url</div>
-          <div class="memberValue">{{ library['url'] }}</div>
+          <div class="memberValue">{{ library.url }}</div>
         </div>
-        <template if="{{ library['imports'].length > 0 }}">
-          <div class="memberItem">
-            <div class="memberName">imports</div>
-            <div class="memberValue">
-              <template repeat="{{ import in library['imports'] }}">
-                <library-ref ref="{{ import }}"></library-ref>
-              </template>
-            </div>
-          </div>
-        </template>
         <template if="{{ library.name != library.vmName }}">
           <div class="memberItem">
             <div class="memberName">vm name</div>
@@ -1532,11 +1609,27 @@
     <hr>
 
     <div class="content">
-      <template if="{{ library['scripts'].isNotEmpty }}">
-        scripts ({{ library['scripts'].length }})
-        <curly-block>
+      <template if="{{ library.imports.isNotEmpty }}">
+        imports ({{ library.imports.length }})
+        <curly-block expand="{{ library.imports.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ script in library['scripts'] }}">
+            <template repeat="{{ imp in library.imports }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <library-ref ref="{{ imp }}"></library-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+        <br>
+      </template>
+
+      <template if="{{ library.scripts.isNotEmpty }}">
+        scripts ({{ library.scripts.length }})
+        <curly-block expand="{{ library.scripts.length <= 8 }}">
+          <div class="memberList">
+            <template repeat="{{ script in library.scripts }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <script-ref ref="{{ script }}"></script-ref>
@@ -1545,13 +1638,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['classes'].isNotEmpty }}">
-        classes ({{ library['classes'].length }})
-        <curly-block>
+      <template if="{{ library.classes.isNotEmpty }}">
+        classes ({{ library.classes.length }})
+        <curly-block expand="{{ library.classes.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ cls in library['classes'] }}">
+            <template repeat="{{ cls in library.classes }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <class-ref ref="{{ cls }}"></class-ref>
@@ -1560,13 +1654,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['variables'].isNotEmpty }}">
-        variables ({{ library['variables'].length }})
-        <curly-block>
+      <template if="{{ library.variables.isNotEmpty }}">
+        variables ({{ library.variables.length }})
+        <curly-block expand="{{ library.variables.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ field in library['variables'] }}">
+            <template repeat="{{ field in library.variables }}">
               <div class="memberItem">
                 <div class="memberName">
                   <field-ref ref="{{ field }}"></field-ref>
@@ -1580,13 +1675,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['functions'].isNotEmpty }}">
-        functions ({{ library['functions'].length }})
-        <curly-block>
+      <template if="{{ library.functions.isNotEmpty }}">
+        functions ({{ library.functions.length }})
+        <curly-block expand="{{ library.functions.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ function in library['functions'] }}">
+            <template repeat="{{ function in library.functions }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <function-ref ref="{{ function }}"></function-ref>
@@ -1595,6 +1691,7 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
     </div>
 
@@ -1698,7 +1795,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <style>
@@ -1837,7 +1934,7 @@
         <tbody>
           <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
             <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-              <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
+              <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
               <div style="position: relative;display: inline">
                 {{row.columns[0]}}
               </div>
@@ -1911,7 +2008,7 @@
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
     <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -1960,12 +2057,14 @@
       <thead>
         <tr>
           <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Size">{{ classTable.getColumnLabel(3) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Instances">{{ classTable.getColumnLabel(4) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Current Size">{{ classTable.getColumnLabel(5) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Current Instances">{{ classTable.getColumnLabel(6) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
         </tr>
       </thead>
       <tbody>
@@ -1977,6 +2076,8 @@
           <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
           <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
           <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
+          <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
+          <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
         </tr>
       </tbody>
     </table>
@@ -1990,7 +2091,6 @@
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
-    <library-nav-menu library="{{ script.library }}"></library-nav-menu>
     <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
       <li>
         <input type="checkbox" checked="{{ showCoverage }}">
@@ -2047,7 +2147,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ trace.isolate.relativeHashLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <template if="{{ trace['members'].isEmpty }}">
@@ -2134,10 +2234,13 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
-        <h1>{{ exception.kind }}</h1>
-        <div class="well">{{ exception.message }}</div>
+    <div class="content-centered">
+      <h1>{{ exception.kind }}</h1>
+      <br>
+      <div class="well">{{ exception.message }}</div>
+      <template if="{{ exception.response != '' }}">
         <div class="well">{{ exception.response }}</div>
+      </template>
     </div>
   </template>
   
@@ -2148,8 +2251,9 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
+    <div class="content-centered">
       <h1>{{ error.kind }}</h1>
+      <br>
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
index 7c6ca18..4a2c2f9 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -53,7 +53,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC",ze:"hitStyleNotExecuted"};(function(a){"use strict"
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDD:"classes",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJJ:"imports",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gMz:"__$pad",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPl:"__$busy",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXR:"scripts",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ3:"variables",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gmu:"functions",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goM:"__$expand",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",VnP:"hitStyleNotExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function(a){"use strict"
 function map(b){b={x:b}
 delete b.x
 return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
@@ -154,9 +154,9 @@
 HT:{
 "^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
 "^":"",
-x:[function(a){return void 0},"$1","Ue",2,0,null,6,[]],
-Qu:[function(a,b,c,d){return{i:a,p:b,e:c,x:d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
-ks:[function(a){var z,y,x,w
+x:function(a){return void 0},
+Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+ks:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -167,57 +167,54 @@
 if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
 if(w==null){y=Object.getPrototypeOf(a)
 if(y==null||y===Object.prototype)return C.ZQ
-else return C.vB}return w},"$1","mz",2,0,null,6,[]],
-e1:[function(a){var z,y,x,w
+else return C.vB}return w},
+e1:function(a){var z,y,x,w
 z=$.Au
 if(z==null)return
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
-if(x.n(a,y[w]))return w}return},"$1","kC",2,0,null,11,[]],
-Xr:[function(a){var z,y,x
+if(x.n(a,y[w]))return w}return},
+Xr:function(a){var z,y,x
 z=J.e1(a)
 if(z==null)return
 y=$.Au
 x=z+1
 if(x>=y.length)return H.e(y,x)
-return y[x]},"$1","Tj",2,0,null,11,[]],
-Nq:[function(a,b){var z,y,x
+return y[x]},
+Nq:function(a,b){var z,y,x
 z=J.e1(a)
 if(z==null)return
 y=$.Au
 x=z+2
 if(x>=y.length)return H.e(y,x)
-return y[x][b]},"$2","BJ",4,0,null,11,[],12,[]],
+return y[x][b]},
 Gv:{
 "^":"a;",
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
 bu:function(a){return H.a5(a)},
-T:function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(a),null)},
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,74,[]],
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-kn:{
-"^":"bool/Gv;",
+yEe:{
+"^":"Gv;",
 bu:function(a){return String(a)},
 giO:function(a){return a?519018:218159},
-gbx:function(a){return C.HL},
-$isbool:true},
+$isa2:true},
 Jh:{
-"^":"Null/Gv;",
+"^":"Gv;",
 n:function(a,b){return null==b},
 bu:function(a){return"null"},
 giO:function(a){return 0},
-gbx:function(a){return C.Qf}},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,74,[]]},
 Ue1:{
 "^":"Gv;",
-giO:function(a){return 0},
-gbx:function(a){return C.CS}},
+giO:function(a){return 0}},
 FP:{
 "^":"Ue1;"},
 is:{
 "^":"Ue1;"},
 Q:{
-"^":"List/Gv;",
+"^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
 KI:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
@@ -233,11 +230,12 @@
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
 return!0}return!1},
 ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")}],
 FV:function(a,b){var z
 for(z=J.GP(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")}],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -310,9 +308,9 @@
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 a[b]=c},
-$isList:true,
-$isList:true,
-$asWO:null,
+$isQ:true,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -326,11 +324,11 @@
 $isnM:true},
 iY:{
 "^":"nM;"},
-Jt:{
+Ib:{
 "^":"nM;",
-$isJt:true},
+$isIb:true},
 P:{
-"^":"num/Gv;",
+"^":"Gv;",
 iM:function(a,b){var z
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a<b)return-1
@@ -405,27 +403,25 @@
 return a<=b},
 F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
-$isnum:true,
-static:{"^":"SAz,N6l"}},
-bU:{
-"^":"int/P;",
-gbx:function(a){return C.yw},
-$isdouble:true,
-$isnum:true,
-$isint:true},
+$islf:true,
+static:{"^":"SAz,yc"}},
+imn:{
+"^":"P;",
+$isCP:true,
+$islf:true,
+$isKN:true},
 Pp:{
-"^":"double/P;",
-gbx:function(a){return C.O4},
-$isdouble:true,
-$isnum:true},
+"^":"P;",
+$isCP:true,
+$islf:true},
 x1:{
-"^":"bU;"},
+"^":"imn;"},
 VP:{
 "^":"x1;"},
 qa:{
 "^":"VP;"},
 O:{
-"^":"String/Gv;",
+"^":"Gv;",
 j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
@@ -522,28 +518,27 @@
 y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
 y^=y>>11
 return 536870911&y+((16383&y)<<15>>>0)},
-gbx:function(a){return C.Db},
 gB:function(a){return a.length},
 t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 return a[b]},
-$isString:true,
-static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
+$isqU:true,
+static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+default:return!1}},mm:function(a,b){var z,y
 for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
 y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
 for(z=a.length;b>0;b=y){y=b-1
 if(y>=z)H.vh(P.N(y))
 x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b},"$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+if(x!==32&&x!==13&&!J.Ga(x))break}return b}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
-zd:[function(a,b){var z=a.vV(0,b)
+zd:function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
-return z},"$2","RTQ",4,0,null,16,[],17,[]],
-ox:[function(){--init.globalState.Xz.GL},"$0","q4",0,0,null],
-oT:[function(a,b){var z,y,x,w,v,u
+return z},
+ox:function(){--init.globalState.Xz.GL},
+oT:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
 b=b
@@ -551,14 +546,14 @@
 if(b==null){b=[]
 z.a=b
 y=b}else y=b
-if(!J.x(y).$isList)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$iszM)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
 y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.i6(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
-x=P.L5(null,null,null,J.bU,H.yo)
-w=P.Ls(null,null,null,J.bU)
+x=P.L5(null,null,null,P.KN,H.yo)
+w=P.Ls(null,null,null,P.KN)
 v=new H.yo(0,null,!1)
 u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 w.h(0,0)
@@ -570,21 +565,21 @@
 if(x)u.vV(0,new H.PK(z,a))
 else{y=H.KT(y,[y,y]).BD(a)
 if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},"$2","wr",4,0,null,18,[],19,[]],
-yl:[function(){var z=init.currentScript
+else u.vV(0,a)}init.globalState.Xz.bL()},
+yl:function(){var z=init.currentScript
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
 if(init.globalState.EF===!0)return H.fU()
-return},"$0","dY",0,0,null],
-fU:[function(){var z,y
+return},
+fU:function(){var z,y
 z=new Error().stack
 if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
 if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
 if(y!=null)return y[1]
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},"$0","mZ",0,0,null],
+throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=H.Hh(b.data)
 y=J.U6(z)
@@ -597,8 +592,8 @@
 s=y.t(z,"startPaused")
 r=H.Hh(y.t(z,"replyTo"))
 y=init.globalState.Hg++
-q=P.L5(null,null,null,J.bU,H.yo)
-p=P.Ls(null,null,null,J.bU)
+q=P.L5(null,null,null,P.KN,H.yo)
+p=P.Ls(null,null,null,P.KN)
 o=new H.yo(0,null,!1)
 n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 p.h(0,0)
@@ -636,15 +631,15 @@
 y.toString
 self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,20,[],21,[]],
-ZF:[function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,6,[],7,[]],
+ZF:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
 x=H.Gy(P.EF(["command","log","msg",a],null,null))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"$1","eR",2,0,null,22,[]],
-Ws:[function(a,b,c,d,e,f){var z,y,x,w
+throw H.b(P.FM(z))}},
+Ws:function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
 $.te=$.te+("_"+y)
@@ -655,24 +650,24 @@
 J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
 x=new H.Vg(a,b,c,d)
 if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},"$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
-Gy:[function(a){var z
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
+Gy:function(a){var z
 if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},"$1","YH",2,0,null,24,[]],
-Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"$1","m6",2,0,null,24,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","lF",2,0,null,28,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","dD",2,0,null,28,[]],
+return z.h7(a)}},
+Hh:function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
+else return a},
+VO:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
+ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 PK:{
-"^":"Tp:126;a,b",
-$0:[function(){this.b.$1(this.a.a)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,b",
+$0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 JO:{
-"^":"Tp:126;a,c",
-$0:[function(){this.c.$2(this.a.a,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,c",
+$0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 f0:{
 "^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2<,vd,XC,w2<",
@@ -686,8 +681,8 @@
 this.ji=y
 this.vu=z&&!x
 this.Xz=new H.cC(P.NZ(null,H.IY),0)
-this.i2=P.L5(null,null,null,J.bU,H.aX)
-this.XC=P.L5(null,null,null,J.bU,null)
+this.i2=P.L5(null,null,null,P.KN,H.aX)
+this.XC=P.L5(null,null,null,P.KN,null)
 if(this.EF===!0){z=new H.JH()
 this.vd=z
 w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
@@ -784,10 +779,10 @@
 init.globalState.i2.Rz(0,this.jO)
 z=this.Jp
 if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)
-this.Jp=null}},"$0","gQb",0,0,125],
+this.Jp=null}},"$0","gQb",0,0,21],
 $isaX:true},
 NY:{
-"^":"Tp:125;a",
+"^":"Tp:21;a",
 $0:[function(){J.Sq(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
@@ -816,23 +811,23 @@
 w.toString
 self.postMessage(v)}}},
 RA:{
-"^":"Tp:125;a",
+"^":"Tp:21;a",
 $0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;F1*,i3,G1*",
 VU:function(){if(this.F1.gRW()){this.F1.gC9().push(this)
-return}J.yn(this.F1,this.i3)},
+return}J.nG(this.F1,this.i3)},
 $isIY:true},
 JH:{
 "^":"a;"},
 jl:{
-"^":"Tp:126;a,b,c,d,e,f",
+"^":"Tp:22;a,b,c,d,e,f",
 $0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Vg:{
-"^":"Tp:125;a,b,c,d",
+"^":"Tp:21;a,b,c,d",
 $0:[function(){var z,y,x
 if(this.d!==!0)this.a.$1(this.c)
 else{z=this.a
@@ -870,7 +865,7 @@
 $isbC:true,
 $ishq:true},
 Ua:{
-"^":"Tp:126;a,b,c",
+"^":"Tp:22;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -886,8 +881,8 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},
 giO:function(a){var z,y,x
-z=J.Eh(this.hQ,16)
-y=J.Eh(this.Jz,8)
+z=J.c1(this.hQ,16)
+y=J.c1(this.Jz,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
@@ -927,7 +922,7 @@
 yf:function(a){if(!!a.$isku)return new H.ku(a.ng)
 throw H.b("Capability not serializable: "+a.bu(0))}},
 II:{
-"^":"Xb;RZ",
+"^":"lY;RZ",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.t(a,1)
@@ -965,7 +960,7 @@
 I8:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
-if(!!z.$isList)return this.wb(a)
+if(!!z.$iszM)return this.wb(a)
 if(!!z.$isZ0)return this.TI(a)
 if(!!z.$isbC)return this.DE(a)
 if(!!z.$ishq)return this.yf(a)
@@ -999,9 +994,9 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"$2",null,4,0,null,49,[],299,[],"call"],
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.b
+J.kW(this.a.a,z.I8(a),z.I8(b))},
 $isEH:true},
 Tf:{
 "^":"BB;",
@@ -1030,7 +1025,7 @@
 x[w]=v}return x},
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
-Xb:{
+lY:{
 "^":"a;",
 QS:function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
@@ -1093,12 +1088,12 @@
 z.Qa(a,b)
 return z}}},
 FA:{
-"^":"Tp:125;a,b",
+"^":"Tp:21;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Av:{
-"^":"Tp:125;c,d",
+"^":"Tp:21;c,d",
 $0:[function(){this.c.p9=null
 H.ox()
 this.d.$0()},"$0",null,0,0,null,"call"],
@@ -1125,23 +1120,23 @@
 $isku:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
-wV:[function(a,b){var z
+wV:function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},"$2","b3",4,0,null,6,[],29,[]],
-d:[function(a){var z
+if(z!=null)return z}return!!J.x(a).$isXj},
+d:function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
 else if(!1===a)return"false"
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},"$1","Sa",2,0,null,30,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"$1","c7",2,0,null,31,[]],
-eQ:[function(a){var z=a.$identityHash
+return z},
+Hz:function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},
+eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},"$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,32,14,[]],
-BU:[function(a,b,c){var z,y,x,w,v,u
+a.$identityHash=z}return z},
+vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,8],
+BU:function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.Rm()
 if(typeof a!=="string")H.vh(P.u(a))
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
@@ -1167,48 +1162,48 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
-return parseInt(a,b)},"$3","Yv",6,0,null,33,[],34,[],35,[]],
-IH:[function(a,b){var z,y
+return parseInt(a,b)},
+IH:function(a,b){var z,y
 if(typeof a!=="string")H.vh(P.u(a))
 if(b==null)b=H.Rm()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.$1(a)}return z},"$2","inc",4,0,null,33,[],35,[]],
-lh:[function(a){var z,y
+return b.$1(a)}return z},
+lh:function(a){var z,y
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
 if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
-return z+H.ia(H.oX(a),0,null)},"$1","Ig",2,0,null,6,[]],
-a5:[function(a){return"Instance of '"+H.lh(a)+"'"},"$1","jb",2,0,null,6,[]],
-RF:[function(a){var z,y,x,w,v,u
+return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
+a5:function(a){return"Instance of '"+H.lh(a)+"'"},
+RF:function(a){var z,y,x,w,v,u
 z=a.length
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
 else{u=w+500
 u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"$1","JG",2,0,null,36,[]],
-YF:[function(a){var z,y,x
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
+YF:function(a){var z,y,x
 z=[]
-z.$builtinTypeInfo=[J.bU]
+z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.Kp(a,0)]
 for(;y.G();){x=y.lo
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},"$1","nE",2,0,null,37,[]],
-eT:[function(a){var z,y
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
+eT:function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.RF(a)},"$1","Wb",2,0,null,38,[]],
-Lw:[function(a){var z
+if(y>65535)return H.YF(a)}return H.RF(a)},
+Lw:function(a){var z
 if(typeof a!=="number")return H.s(a)
 if(0<=a){if(a<=65535)return String.fromCharCode(a)
 if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},"$1","cK",2,0,null,39,[]],
-zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
+return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
+zW:function(a,b,c,d,e,f,g,h){var z,y,x,w
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(P.u(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -1222,14 +1217,14 @@
 if(x.E(a,0)||x.C(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
-return w.valueOf()}return y},"$8","mV",16,0,null,40,[],41,[],42,[],43,[],44,[],45,[],46,[],47,[]],
-o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"$1","j1",2,0,null,48,[]],
-VK:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-return a[b]},"$2","Zl",4,0,null,6,[],49,[]],
-aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-a[b]=c},"$3","WJ",6,0,null,6,[],49,[],30,[]],
-zo:[function(a,b,c){var z,y,x
+return w.valueOf()}return y},
+o2:function(a){if(a.date===void 0)a.date=new Date(a.y3)
+return a.date},
+VK:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+return a[b]},
+aw:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+a[b]=c},
+zo:function(a,b,c){var z,y,x
 z={}
 z.a=0
 y=[]
@@ -1237,8 +1232,8 @@
 if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},"$3","pT",6,0,null,17,[],50,[],51,[]],
-im:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
+im:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
 if(y==null)return H.zo(a,b,c)
@@ -1258,33 +1253,24 @@
 C.Nm.FV(r,b)
 y=a["$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"$3","fl",6,0,null,17,[],50,[],51,[]],
-mN:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.c1
-if(a=="double")return C.yX
-if(a=="num")return C.oD
-if(a=="bool")return C.Fm
-if(a=="List")return C.E3
-if(a=="Null")return C.x0
-return init.allClasses[a]},"$1","JL",2,0,null,52,[]],
-SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"$1","EN",2,0,null,6,[]],
-Pq:[function(){var z={x:0}
+return y.apply(a,r)},
+Pq:function(){var z={x:0}
 delete z.x
-return z},"$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"$1","Ff",2,0,null,53,[]],
-e:[function(a,b){if(a==null)J.q8(a)
+return z},
+s:function(a){throw H.b(P.u(a))},
+e:function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"$2","x3",4,0,null,48,[],15,[]],
-b:[function(a){var z
+throw H.b(P.N(b))},
+b:function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
 z.dartException=a
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.Ju})
 z.name=""}else z.toString=H.Ju
-return z},"$1","Cr",2,0,null,54,[]],
+return z},
 Ju:[function(){return J.AG(this.dartException)},"$0","Eu",0,0,null],
-vh:[function(a){throw H.b(a)},"$1","xE",2,0,null,54,[]],
-Ru:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+vh:function(a){throw H.b(a)},
+Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Am(a)
 if(a==null)return
 if(typeof a!=="object")return a
@@ -1322,29 +1308,29 @@
 return z.$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
 return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
 return z.$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},"$1","v2",2,0,null,54,[]],
-CU:[function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.eQ(a)},"$1","Zs",2,0,null,6,[]],
-B7:[function(a,b){var z,y,x,w
+return a},
+CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
+else return H.eQ(a)},
+B7:function(a,b){var z,y,x,w
 z=a.length
 for(y=0;y<z;y=w){x=y+1
 w=x+1
-b.u(0,a[y],a[x])}return b},"$2","nD",4,0,null,56,[],57,[]],
+b.u(0,a[y],a[x])}return b},
 ft:[function(a,b,c,d,e,f,g){var z=J.x(c)
 if(z.n(c,0))return H.zd(b,new H.dr(a))
 else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
 else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","mD",14,0,null,58,[],16,[],59,[],60,[],61,[],62,[],63,[]],
-tR:[function(a,b){var z
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","kT",14,0,null,9,[],10,[],11,[],12,[],13,[],14,[],15,[]],
+tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
 z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.ft)
 a.$identity=z
-return z},"$2","qN",4,0,null,58,[],64,[]],
-iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return z},
+iA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=b[0]
 z.$stubName
 y=z.$callName
@@ -1373,36 +1359,36 @@
 n=o.$callName
 if(n!=null){m=d?o:H.SD(a,o,t)
 w[n]=m}}w["call*"]=s
-return v},"$6","Xd",12,0,null,48,[],65,[],66,[],67,[],68,[],69,[]],
-vq:[function(a,b,c,d){var z=H.eZ
+return v},
+vq:function(a,b,c,d){var z=H.eZ
 switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
 case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
 case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
 case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
 case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
-default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
-SD:[function(a,b,c){var z,y,x,w,v,u
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
+SD:function(a,b,c){var z,y,x,w,v,u
 if(c)return H.wg(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.bf
+if(y===0){w=$.mJ
 if(w==null){w=H.B3("self")
-$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+$.mJ=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
 $.OK=J.WB(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
-v=$.bf
+v=$.mJ
 if(v==null){v=H.B3("self")
-$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+$.mJ=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
-return new Function(v+H.d(w)+"}")()},"$3","Fw",6,0,null,48,[],17,[],72,[]],
-Z4:[function(a,b,c,d){var z,y
+return new Function(v+H.d(w)+"}")()},
+Z4:function(a,b,c,d){var z,y
 z=H.eZ
 y=H.yS
 switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
@@ -1414,8 +1400,8 @@
 case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
-return e.apply(f(this),h)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
-wg:[function(a,b){var z,y,x,w,v,u,t,s
+return e.apply(f(this),h)}}(d,z,y)}},
+wg:function(a,b){var z,y,x,w,v,u,t,s
 z=H.oN()
 y=$.P4
 if(y==null){y=H.B3("receiver")
@@ -1432,40 +1418,40 @@
 y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
 t=$.OK
 $.OK=J.WB(t,1)
-return new Function(y+H.d(t)+"}")()},"$2","FT",4,0,null,48,[],17,[]],
-qm:[function(a,b,c,d,e,f){b.fixed$length=init
+return new Function(y+H.d(t)+"}")()},
+qm:function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"$6","Rz",12,0,null,48,[],65,[],66,[],67,[],68,[],12,[]],
-SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"$2","H7",4,0,null,30,[],74,[]],
-Go:[function(a,b){var z
+return H.iA(a,b,c,!!d,e,f)},
+SE:function(a,b){var z=J.U6(b)
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},
+Go:function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"$2","CY",4,0,null,30,[],74,[]],
-ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"$1","RK",2,0,null,75,[]],
-KT:[function(a,b,c){return new H.tD(a,b,c,null)},"$3","HN",6,0,null,77,[],78,[],79,[]],
-Og:[function(a,b){var z=a.name
+H.SE(a,b)},
+ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
+KT:function(a,b,c){return new H.tD(a,b,c,null)},
+Og:function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},"$2","ZPJ",4,0,null,80,[],81,[]],
-N7:[function(){return C.KZ},"$0","cI",0,0,null],
-uV:[function(a){return new H.cu(a,null)},"$1","IZ",2,0,null,12,[]],
-VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},"$2","Ub",4,0,null,82,[],83,[]],
-oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"$1","Cb",2,0,null,82,[]],
-IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"$2","PE",4,0,null,82,[],84,[]],
-ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"$3","Cn",6,0,null,82,[],84,[],15,[]],
-Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"$2","tC",4,0,null,82,[],15,[]],
-Ko:[function(a,b){if(a==null)return"dynamic"
+return new H.fw(z,b,null)},
+N7:function(){return C.KZ},
+uV:function(a){return new H.cu(a,null)},
+VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
+return a},
+oX:function(a){if(a==null)return
+return a.$builtinTypeInfo},
+IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
+ip:function(a,b,c){var z=H.IM(a,b)
+return z==null?null:z[c]},
+Kp:function(a,b){var z=H.oX(a)
+return z==null?null:z[b]},
+Ko:function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
 else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
 else return b.$1(a)
-else return},"$2$onTypeVariable","bR",2,3,null,85,11,[],86,[]],
-ia:[function(a,b,c){var z,y,x,w,v,u
+else return},
+ia:function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
 for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
@@ -1473,34 +1459,35 @@
 v=a[y]
 if(v!=null)w=!1
 u=H.Ko(v,c)
-z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},"$3$onTypeVariable","iM",4,3,null,85,87,[],88,[],86,[]],
-dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
-return z+H.ia(a.$builtinTypeInfo,0,null)},"$1","Yx",2,0,null,6,[]],
-Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
+dJ:function(a){var z=J.x(a).constructor.builtin$cls
+if(a==null)return z
+return z+H.ia(a.$builtinTypeInfo,0,null)},
+Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},"$2","zL",4,0,null,89,[],90,[]],
-RB:[function(a,b,c,d){var z,y
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},
+RB:function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},"$4","Ap",8,0,null,6,[],91,[],92,[],93,[]],
-hv:[function(a,b){var z,y
+return H.hv(H.Y9(y[d],z),c)},
+hv:function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},"$2","QY",4,0,null,94,[],95,[]],
-IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"$3","k2",6,0,null,96,[],97,[],98,[]],
-XY:[function(a,b){var z,y
-if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
+return!0},
+IG:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
+XY:function(a,b){var z,y
+if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="L9"
 if(b==null)return!0
 z=H.oX(a)
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"$2","Dk",4,0,null,99,[],95,[]],
-t1:[function(a,b){var z,y,x,w,v,u,t
+return H.t1(y,b)},
+t1:function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
 if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
@@ -1517,8 +1504,8 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},"$2","Mb",4,0,null,94,[],95,[]],
-Hc:[function(a,b,c){var z,y,x,w,v
+return H.hv(H.Y9(t,y),w)},
+Hc:function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
 if(a==null)return!1
@@ -1527,8 +1514,8 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","d1",6,0,null,94,[],95,[],100,[]],
-Vt:[function(a,b){var z,y,x,w,v,u
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
+Vt:function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
 z=Object.getOwnPropertyNames(b)
@@ -1538,8 +1525,8 @@
 if(!Object.hasOwnProperty.call(a,w))return!1
 v=b[w]
 u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"$2","y3",4,0,null,94,[],95,[]],
-Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
+Ly:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(!("func" in a))return!1
 if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
 y=b.ret
@@ -1560,13 +1547,13 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"$2","Sj",4,0,null,94,[],95,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"$3","fW",6,0,null,17,[],48,[],90,[]],
-kj:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","aZ",2,0,null,101,[]],
-wzi:[function(a){return H.eQ(a)},"$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
-w3:[function(a){var z,y,x,w,v,u
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
+ml:function(a,b,c){return a.apply(b,c)},
+kj:function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
+wzi:function(a){return H.eQ(a)},
+iw:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+w3:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.nw[z]
 if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1591,20 +1578,20 @@
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.Lc(a,x)},"$1","eU",2,0,null,101,[]],
-Lc:[function(a,b){var z,y
+return u.i}else return H.Lc(a,x)},
+Lc:function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
 Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},"$2","qF",4,0,null,101,[],7,[]],
-Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"$1","MlJ",2,0,null,7,[]],
-VF:[function(a,b,c){var z=b.prototype
+return b},
+Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
+VF:function(a,b,c){var z=b.prototype
 if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},"$3","vi",6,0,null,102,[],103,[],8,[]],
-XD:[function(){if(!0===$.Bv)return
+else return J.Qu(z,c,null,null)},
+XD:function(){if(!0===$.Bv)return
 $.Bv=!0
-H.Z1()},"$0","Ki",0,0,null],
-Z1:[function(){var z,y,x,w,v,u,t
+H.Z1()},
+Z1:function(){var z,y,x,w,v,u,t
 $.nw=Object.create(null)
 $.vv=Object.create(null)
 H.kO()
@@ -1620,8 +1607,8 @@
 z["~"+w]=t
 z["-"+w]=t
 z["+"+w]=t
-z["*"+w]=t}}},"$0","vU",0,0,null],
-kO:[function(){var z,y,x,w,v,u,t
+z["*"+w]=t}}},
+kO:function(){var z,y,x,w,v,u,t
 z=C.MA()
 z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ur(C.AS),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
@@ -1632,9 +1619,9 @@
 t=z.prototypeForTag
 $.NF=new H.dC(v)
 $.TX=new H.wN(u)
-$.x7=new H.VX(t)},"$0","Hb",0,0,null],
-ud:[function(a,b){return a(b)||b},"$2","rM",4,0,null,104,[],105,[]],
-ZT:[function(a,b){var z,y,x,w,v,u
+$.x7=new H.VX(t)},
+ud:function(a,b){return a(b)||b},
+ZT:function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
 y=b.length
 x=a.length
@@ -1643,25 +1630,25 @@
 z.push(new H.tQ(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},"$2","tl",4,0,null,110,[],111,[]],
-m2:[function(a,b,c){var z,y
+else w=v===u?w+1:u}return z},
+m2:function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
 else{z=J.x(b)
 if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"$3","WL",6,0,null,48,[],112,[],88,[]],
-ys:[function(a,b,c){var z,y,x,w,v
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},
+ys:function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
 y=a.length
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
 w=z.vM+=w
-z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
+z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))
 else if(!!J.x(b).$isVR){v=b.gl9()
 v.lastIndex=0
-return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(P.u(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"$3","uF",6,0,null,48,[],113,[],114,[]],
+return a.replace(v,c.replace(/\$/g,"$$$$"))}else{if(b==null)H.vh(P.u(null))
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},
 Zd:{
 "^":"a;"},
 xQ:{
@@ -1697,12 +1684,12 @@
 $isyN:true},
 LD:{
 "^":"Tp;a,b",
-$1:[function(a){return J.de(a,this.b)},"$1",null,2,0,null,30,[],"call"],
+$1:function(a){return J.de(a,this.b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 jJ:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,49,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,76,[],"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1819,7 +1806,7 @@
 z={}
 if(this.NE==null){y=this.hG
 this.NE=Array(y)
-x=P.Fl(J.O,J.bU)
+x=P.Fl(P.qU,P.KN)
 for(w=this.Rv,v=0;v<y;++v){u=w+v
 x.u(0,this.XL(u),u)}z.a=0
 y=x.gvc()
@@ -1835,36 +1822,35 @@
 H.VM(y,y["<>"])
 return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
 gx5:function(){return this.mr.$reflectionName},
-static:{"^":"vS,FV,C1,H6",zh:function(a){var z,y,x,w
+static:{"^":"qg,FV,C1,bt",zh:function(a){var z,y,x
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
 z=z
 y=z[0]
-x=y>>1
-w=z[1]
-return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
+x=z[1]
+return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 Nv:{
-"^":"Tp:32;a,b,c",
-$1:[function(a){var z,y,x
+"^":"Tp:8;a,b,c",
+$1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
 x=this.c.t(0,a)
 if(y>=z.length)return H.e(z,y)
-z[y]=x},"$1",null,2,0,null,12,[],"call"],
+z[y]=x},
 $isEH:true},
 Cj:{
-"^":"Tp:301;a,b,c",
-$2:[function(a,b){var z=this.a
+"^":"Tp:77;a,b,c",
+$2:function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
-this.b.push(b);++z.a},"$2",null,4,0,null,12,[],53,[],"call"],
+this.b.push(b);++z.a},
 $isEH:true},
 u8:{
-"^":"Tp:301;a,b",
-$2:[function(a,b){var z=this.b
+"^":"Tp:77;a,b",
+$2:function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"$2",null,4,0,null,302,[],30,[],"call"],
+else this.a.a=!0},
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -1883,7 +1869,7 @@
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:function(a){var z,y,x,w,v,u
 a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
 if(z==null)z=[]
@@ -1892,8 +1878,8 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function(b){var $argumentsExpr$='$arguments$'
-try{b.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function(b){try{b.$method$}catch(z){return z.message}}(a)},"$1","cl",2,0,null,55,[]]}},
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
+try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
 W0:{
 "^":"Ge;K9,Ga",
 bu:function(a){var z=this.Ga
@@ -1921,9 +1907,9 @@
 bu:function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Tp:115;a",
-$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"$1",null,2,0,null,171,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+return a},
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
@@ -1936,30 +1922,31 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Tp:126;a",
-$0:[function(){return this.a.$0()},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Tp:126;b,c",
-$0:[function(){return this.b.$1(this.c)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;b,c",
+$0:function(){return this.b.$1(this.c)},
 $isEH:true},
 KX:{
-"^":"Tp:126;d,e,f",
-$0:[function(){return this.d.$2(this.e,this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;d,e,f",
+$0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 uZ:{
-"^":"Tp:126;UI,bK,Gq,Rm",
-$0:[function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;UI,bK,Gq,Rm",
+$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
 OQ:{
-"^":"Tp:126;w3,HZ,mG,xC,cj",
-$0:[function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;w3,HZ,mG,xC,cj",
+$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
 Tp:{
 "^":"a;",
 bu:function(a){return"Closure"},
 $isTp:true,
-$isEH:true},
+$isEH:true,
+gKu:function(){return this}},
 Bp:{
 "^":"Tp;",
 $isBp:true},
@@ -1975,15 +1962,15 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"$1","PR",2,0,null,58,[]],yS:[function(a){return a.EP},"$1","xm",2,0,null,58,[]],oN:[function(){var z=$.bf
+static:{"^":"mJ,P4",eZ:function(a){return a.gnw()},yS:function(a){return a.EP},oN:function(){var z=$.mJ
 if(z==null){z=H.B3("self")
-$.bf=z}return z},"$0","uT",0,0,null],B3:[function(a){var z,y,x,w,v
+$.mJ=z}return z},B3:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}},"$1","ec",2,0,null,73,[]]}},
+if(z[v]===a)return v}}}},
 qq:{
 "^":"a;Jy"},
 va:{
@@ -2037,11 +2024,11 @@
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
 x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
-static:{"^":"Jl",Dz:[function(a){var z,y,x
+static:{"^":"Jl",Dz:function(a){var z,y,x
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"$1","At",2,0,null,76,[]]}},
+return z}}},
 hJ:{
 "^":"q1;",
 bu:function(a){return"dynamic"},
@@ -2076,12 +2063,10 @@
 static:{WE:function(a){return new H.oQ(a)}}},
 cu:{
 "^":"a;LU<,ke",
-bu:function(a){var z,y,x
+bu:function(a){var z,y
 z=this.ke
 if(z!=null)return z
-y=this.LU
-x=init.mangledGlobalNames[y]
-y=x==null?y:x
+y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
 this.ke=y
 return y},
 giO:function(a){return J.v1(this.LU)},
@@ -2089,32 +2074,32 @@
 return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},
 $iscu:true,
 $isuq:true},
-QT:{
+bB:{
 "^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a(a)},
 $isEH:true},
 wN:{
-"^":"Tp:303;b",
-$2:[function(a,b){return this.b(a,b)},"$2",null,4,0,null,99,[],102,[],"call"],
+"^":"Tp:78;b",
+$2:function(a,b){return this.b(a,b)},
 $isEH:true},
 VX:{
-"^":"Tp:32;c",
-$1:[function(a){return this.c(a)},"$1",null,2,0,null,102,[],"call"],
+"^":"Tp:8;c",
+$1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
-"^":"a;Ej,Ii,Ua",
+"^":"a;zO,Ej,Ii,Ua",
 gl9:function(){var z=this.Ii
 if(z!=null)return z
 z=this.Ej
-z=H.v4(z.source,z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
 this.Ii=z
 return z},
 gAT:function(){var z=this.Ua
 if(z!=null)return z
 z=this.Ej
-z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
 this.Ua=z
 return z},
 ej:function(a){var z
@@ -2151,14 +2136,14 @@
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $isSP:true,
-static:{v4:[function(a,b,c,d){var z,y,x,w,v
+static:{v4:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"$4","HU",8,0,null,106,[],107,[],108,[],109,[]]}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
 AX:{
 "^":"a;zO,QK",
 t:function(a,b){var z=this.QK
@@ -2201,11 +2186,11 @@
 N.Jx("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.cM(),"google"),"visualization")
 $.NR=z
-return z},"$1","vN",2,0,115,116,[]],
-G0:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","ez",4,0,null,117,[],118,[]],
-ap:[function(a,b){var z
+return z},"$1","vN",2,0,16,17,[]],
+G0:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},
+ap:function(a,b){var z
 for(z="";b>1;){--b
-if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},"$2","Bn",4,0,null,30,[],119,[]],
+if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
 av:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
@@ -2213,8 +2198,8 @@
 a=z.Z(a,1000)
 x=G.ap(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.ap(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,120,121,[]],
-P0:[function(a){var z,y,x,w
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,18],
+P0:function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
 y=C.jn.cU(z,3600000)
@@ -2224,14 +2209,14 @@
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
 if(y>0)return G.ap(y,2)+":"+G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)
-else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},"$1","DQ",2,0,null,122,[]],
+else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},
 Xz:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
 else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
 else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,120,123,[]],
-mG:[function(a){var z,y,x,w
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,18,19,[]],
+mG:function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
 y=C.jn.cU(z,3600000)
@@ -2241,15 +2226,15 @@
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},"$1","N2",2,0,null,122,[]],
+return""+w+"s"},
 mL:{
-"^":["Pi;Z6<-304,zf>-305,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,306,"isolate",307,308],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,309,30,[],"isolate",307],
-gvJ:[function(a){return this.AJ},null,null,1,0,310,"response",307,308],
-svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,311,30,[],"response",307],
-gKw:[function(){return this.fz},null,null,1,0,312,"args",307,308],
-sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",307],
+"^":["Pi;Z6<-79,zf>-80,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,81,"isolate",82,83],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,84,27,[],"isolate",82],
+gvJ:[function(a){return this.AJ},null,null,1,0,85,"response",82,83],
+svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,86,27,[],"response",82],
+gKw:[function(){return this.fz},null,null,1,0,87,"args",82,83],
+sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,8,27,[],"args",82],
 Da:function(){var z,y
 z=this.Z6
 z.sec(this)
@@ -2260,9 +2245,9 @@
 z=z.gLi()
 H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
 kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gbf",2,0,313,171,[]],
+this.Z6.Mp()},"$1","gbf",2,0,88,30,[]],
 t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gXa",2,0,314,315,[]],
+this.Z6.Mp()},"$1","gXa",2,0,89,90,[]],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
 ig:{
@@ -2281,8 +2266,8 @@
 this.vR.V7("draw",[a.gYb(),z])}},
 dZ:{
 "^":"Pi;ec?,JL,AP,fn",
-gjW:[function(){return this.JL},null,null,1,0,312,"currentHash",307,308],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",307],
+gjW:[function(){return this.JL},null,null,1,0,87,"currentHash",82,83],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,8,27,[],"currentHash",82],
 kI:function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(window.location.hash==="")window.location.hash="#/vm"
@@ -2301,23 +2286,25 @@
 this.ec.zf.cv(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},
 static:{"^":"K3D"}},
 Qe:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.df()},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 GH:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=z.ec
 y.AJ=F.Wi(y,C.mE,y.AJ,a)
 z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,101,[],"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,92,[],"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-317,wd>-318,oH<-319",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
-gyX:[function(a){return this.R7},null,null,1,0,312,"expander",307,308],
+"^":["Pi;eT>,yt<-93,wd>-94,oH<-95",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
+gyX:[function(a){return this.R7},null,null,1,0,87,"expander",82,83],
 Qx:function(a){return this.gyX(this).$0()},
-syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,32,30,[],"expander",307],
+syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,8,27,[],"expander",82],
+grm:[function(){return this.aZ},null,null,1,0,87,"expanderStyle",82,83],
+srm:[function(a){this.aZ=F.Wi(this,C.Jt,this.aZ,a)},null,null,3,0,8,27,[],"expanderStyle",82],
 goE:function(a){return this.z3},
 soE:function(a,b){var z=this.z3
 this.z3=b
@@ -2327,9 +2314,10 @@
 this.o8()}}},
 r8:function(){this.soE(0,!this.z3)
 return this.z3},
+k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Jt,this.aZ,"visibility:hidden;")},
 $isY2:true},
 XN:{
-"^":["Pi;zU>-318,AP,fn",function(){return[C.J19]},null,null],
+"^":["Pi;zU>-94,AP,fn",function(){return[C.J19]},null,null],
 rT:function(a){var z,y
 z=this.zU
 y=J.w1(z)
@@ -2356,7 +2344,7 @@
 w.UZ(z,v,v+y)}},
 Kt:{
 "^":"a;ph>,xy<",
-static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,124,121,[]]}},
+static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,20]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
@@ -2367,7 +2355,7 @@
 gxp:function(){return this.pT},
 np:function(a){H.rd(this.tW,new G.Nu(this))
 F.Wi(this,C.AH,0,1)},
-gIN:[function(){return this.tW},null,null,1,0,320,"sortedRows",308],
+gIN:[function(){return this.tW},null,null,1,0,96,"sortedRows",83],
 lb:function(){C.Nm.sB(this.zU,0)
 C.Nm.sB(this.tW,0)},
 aJ:function(a,b){var z=this.zU
@@ -2379,21 +2367,21 @@
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 y=J.UQ(J.U8(z[a]),b)
 z=this.oH
-if(b>>>0!==b||b>=7)return H.e(z,b)
-return z[b].gxy().$1(y)},"$2","gls",4,0,321,322,[],323,[],"getFormattedValue",307],
+if(b>>>0!==b||b>=9)return H.e(z,b)
+return z[b].gxy().$1(y)},"$2","gls",4,0,97,98,[],99,[],"getFormattedValue",82],
 Qs:[function(a){var z
 if(!J.de(a,this.pT)){z=this.oH
-if(a>>>0!==a||a>=7)return H.e(z,a)
+if(a>>>0!==a||a>=9)return H.e(z,a)
 return J.WB(J.Kz(z[a]),"\u2003")}z=this.oH
-if(a>>>0!==a||a>=7)return H.e(z,a)
+if(a>>>0!==a||a>=9)return H.e(z,a)
 z=J.Kz(z[a])
-return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gpo",2,0,120,323,[],"getColumnLabel",307],
+return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gpo",2,0,18,99,[],"getColumnLabel",82],
 TK:[function(a,b){var z=this.zU
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8(z[a]),b)},"$2","gyY",4,0,324,322,[],323,[],"getValue",307]},
+return J.UQ(J.U8(z[a]),b)},"$2","gyY",4,0,100,98,[],99,[],"getValue",82]},
 Nu:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x,w
+"^":"Tp:75;a",
+$2:function(a,b){var z,y,x,w
 z=this.a
 y=z.zU
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
@@ -2401,23 +2389,23 @@
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 w=J.UQ(J.U8(y[b]),z.pT)
 if(z.jV)return J.oE(w,x)
-else return J.oE(x,w)},"$2",null,4,0,null,325,[],326,[],"call"],
-$isEH:true}}],["app_bootstrap","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
+else return J.oE(x,w)},
+$isEH:true}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
 "^":"",
-De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
+De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
 $.uP=!1
-F.E2()},"$0","KU",0,0,125]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+F.E2()},"$0","KU",0,0,21]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 pz:{
-"^":["pv;BW%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,329,"msg",307,330],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,331,30,[],"msg",307],
-pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-"@":function(){return[C.jy]},
+"^":["pv;BW%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,103,"msg",82,104],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,105,27,[],"msg",82],
+pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"@":function(){return[C.PT]},
 static:{t4:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -2425,19 +2413,19 @@
 a.X0=w
 C.J0.ZL(a)
 C.J0.oX(a)
-return a},null,null,0,0,126,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[333],
+return a},null,null,0,0,22,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[107],
 pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.tSc]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -2446,20 +2434,21 @@
 a.X0=w
 C.oq.ZL(a)
 C.oq.oX(a)
-return a},null,null,0,0,126,"new ClassRefElement$created"]}},
-"+ClassRefElement":[336]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+return a},null,null,0,0,22,"new ClassRefElement$created"]}},
+"+ClassRefElement":[110]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["Dsd;Om%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Om},null,null,1,0,329,"cls",307,330],
-sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,331,30,[],"cls",307],
-vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["Dsd;Om%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Om},null,null,1,0,103,"cls",82,104],
+sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,105,27,[],"cls",82],
+vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.aQx]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -2467,22 +2456,22 @@
 a.X0=w
 C.ka.ZL(a)
 C.ka.oX(a)
-return a},null,null,0,0,126,"new ClassViewElement$created"]}},
-"+ClassViewElement":[338],
+return a},null,null,0,0,22,"new ClassViewElement$created"]}},
+"+ClassViewElement":[114],
 Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.tY},null,null,1,0,339,"code",308],
-aZ:[function(a,b){Q.xI.prototype.aZ.call(this,a,b)
-this.ct(a,C.b1,0,1)},"$1","gLe",2,0,115,242,[],"refChanged"],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.tY},null,null,1,0,115,"code",83],
+P9:[function(a,b){Q.xI.prototype.P9.call(this,a,b)
+this.ct(a,C.b1,0,1)},"$1","gLe",2,0,16,65,[],"refChanged"],
 "@":function(){return[C.H3]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -2491,80 +2480,80 @@
 a.X0=w
 C.IK.ZL(a)
 C.IK.oX(a)
-return a},null,null,0,0,126,"new CodeRefElement$created"]}},
-"+CodeRefElement":[336]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a},null,null,0,0,22,"new CodeRefElement$created"]}},
+"+CodeRefElement":[110]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["tuj;Xx%-340,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,339,"code",307,330],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,341,30,[],"code",307],
+"^":["tuj;Xx%-116,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,115,"code",82,104],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,117,27,[],"code",82],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.hf())},"$0","gQd",0,0,125,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.SK(z).ml(new F.hf())},"$0","gQd",0,0,21,"enteredView"],
+pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 m2:[function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
 y=H.BU(z,null,null)
 x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
 if(x==null)return
-return x},"$1","gnV",2,0,342,82,[],"_findJumpTarget"],
+return x},"$1","gnV",2,0,118,119,[],"_findJumpTarget"],
 YI:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gff",6,0,343,21,[],344,[],82,[],"mouseOver"],
+J.pP(z).h(0,"highlight")},"$3","gff",6,0,120,7,[],121,[],119,[],"mouseOver"],
 ZC:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,343,21,[],344,[],82,[],"mouseOut"],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,120,7,[],121,[],119,[],"mouseOut"],
 "@":function(){return[C.xW]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
 a.B7=y
 a.X0=w
-C.ux.ZL(a)
-C.ux.oX(a)
-return a},null,null,0,0,126,"new CodeViewElement$created"]}},
-"+CodeViewElement":[345],
+C.YD.ZL(a)
+C.YD.oX(a)
+return a},null,null,0,0,22,"new CodeViewElement$created"]}},
+"+CodeViewElement":[122],
 tuj:{
 "^":"uL+Pi;",
 $isd3:true},
 hf:{
-"^":"Tp:341;",
-$1:[function(a){a.QW()},"$1",null,2,0,341,289,[],"call"],
+"^":"Tp:117;",
+$1:[function(a){a.QW()},"$1",null,2,0,117,123,[],"call"],
 $isEH:true},
-"+ hf":[346]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
+"+ hf":[124]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":["Vct;zh%-347,HX%-347,Uy%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gAQ:[function(a){return a.zh},null,null,1,0,312,"iconClass",307,308],
-sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",307],
-gai:[function(a){return a.HX},null,null,1,0,312,"displayValue",307,308],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",307],
-gxj:[function(a){return a.Uy},null,null,1,0,348,"collapsed"],
+"^":["Vct;zh%-125,HX%-125,Uy%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gAQ:[function(a){return a.zh},null,null,1,0,87,"iconClass",82,83],
+sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,8,27,[],"iconClass",82],
+gai:[function(a){return a.HX},null,null,1,0,87,"displayValue",82,83],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,8,27,[],"displayValue",82],
+gxj:[function(a){return a.Uy},null,null,1,0,126,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,349,350,[],"collapsed"],
+this.SS(a)},null,null,3,0,127,128,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"$0","gQd",0,0,125,"enteredView"],
+this.SS(a)},"$0","gQd",0,0,21,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"$3","gl8",6,0,343,21,[],344,[],82,[],"toggleDisplay"],
+this.SS(a)},"$3","gl8",6,0,120,7,[],121,[],119,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
 if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,125,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,21,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-347,DI<-347",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-125,DI<-125",Hv:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.zh="glyphicon glyphicon-chevron-down"
@@ -2575,47 +2564,52 @@
 a.X0=w
 C.j8.ZL(a)
 C.j8.oX(a)
-return a},null,null,0,0,126,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[351],
+return a},null,null,0,0,22,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[129],
 Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-335,Hu%-335,nx%-85,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,348,"expanded",307,308],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,349,30,[],"expanded",307],
-gO9:[function(a){return a.Hu},null,null,1,0,348,"busy",307,308],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,349,30,[],"busy",307],
-gFR:[function(a){return a.nx},null,null,1,0,126,"callback",307,330],
+"^":["LP;GV%-109,Pl%-109,nx%-29,oM%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,126,"expanded",82,83],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,127,27,[],"expanded",82],
+gO9:[function(a){return a.Pl},null,null,1,0,126,"busy",82,83],
+sO9:[function(a,b){a.Pl=this.ct(a,C.S4,a.Pl,b)},null,null,3,0,127,27,[],"busy",82],
+gFR:[function(a){return a.nx},null,null,1,0,22,"callback",82,104],
 Ki:function(a){return this.gFR(a).$0()},
 AV:function(a,b,c){return this.gFR(a).$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,115,30,[],"callback",307],
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,16,27,[],"callback",82],
+git:[function(a){return a.oM},null,null,1,0,126,"expand",82,104],
+sit:[function(a,b){a.oM=this.ct(a,C.dI,a.oM,b)},null,null,3,0,127,27,[],"expand",82],
+rL:[function(a,b){var z=a.oM
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","gzr",2,0,26,65,[],"expandChanged"],
 Ey:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.Hu=this.ct(a,C.S4,a.Hu,!1)},"$0","goJ",0,0,125,"doneCallback"],
-AZ:[function(a,b,c,d){var z=a.Hu
+a.Pl=this.ct(a,C.S4,a.Pl,!1)},"$0","goJ",0,0,21,"doneCallback"],
+AZ:[function(a,b,c,d){var z=a.Pl
 if(z===!0)return
-if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
+if(a.nx!=null){a.Pl=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,352,117,[],199,[],289,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,130,53,[],57,[],123,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.GV=!1
-a.Hu=!1
+a.Pl=!1
 a.nx=null
+a.oM=!1
 a.SO=z
 a.B7=y
 a.X0=w
 C.O0.ZL(a)
 C.O0.oX(a)
-return a},null,null,0,0,126,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[353],
+return a},null,null,0,0,22,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[131],
 LP:{
 "^":"xc+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -2627,21 +2621,21 @@
 if(y==null)return"registerElement" in document
 return J.de(J.UQ(y,"ready"),!0)},
 wJ:{
-"^":"Tp:126;",
-$0:[function(){if(B.G9())return P.Ab(null,null)
+"^":"Tp:22;",
+$0:function(){if(B.G9())return P.Ab(null,null)
 var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
-return z.gtH(z)},"$0",null,0,0,null,"call"],
+return z.gtH(z)},
 $isEH:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
-bQ:[function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},"$2","Mn",4,0,null,127,[],128,[]],
-Ck:[function(a,b){var z
+bQ:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
+Ck:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
-return!1},"$2","cs",4,0,null,127,[],128,[]],
-n3:[function(a,b,c){var z
+return!1},
+n3:function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},"$3","cS",6,0,null,127,[],129,[],130,[]],
-mx:[function(a,b,c){var z,y,x,w
+return b},
+mx:function(a,b,c){var z,y,x,w
 for(y=0;x=$.RM(),y<x.length;++y){x=x[y]
 w=a
 if(x==null?w==null:x===w)return H.d(b)+"..."+H.d(c)}z=P.p9("")
@@ -2650,24 +2644,24 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"$3","FQ",6,0,null,127,[],131,[],132,[]],
-rd:[function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},"$2","xX",4,0,null,76,[],133,[]],
-K0:[function(a,b,c){var z=J.Wx(b)
+x.pop()}return z.gvM()},
+rd:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},
+K0:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"$3","Ze",6,0,null,76,[],134,[],135,[]],
-qG:[function(a,b,c,d,e){var z,y,x,w
+if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},
+qG:function(a,b,c,d,e){var z,y,x,w
 H.K0(a,b,c)
 z=J.xH(c,b)
 if(J.de(z,0))return
 if(J.u6(e,0))throw H.b(P.u(e))
 y=J.x(d)
-if(!!y.$isList){x=e
+if(!!y.$iszM){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
 x=0}if(J.z8(J.WB(x,z),J.q8(w)))throw H.b(P.w("Not enough elements"))
-H.tb(w,x,a,b,z)},"$5","it",10,0,null,76,[],134,[],135,[],113,[],136,[]],
-IC:[function(a,b,c){var z,y,x,w,v,u
+H.tb(w,x,a,b,z)},
+IC:function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 y=J.x(c)
@@ -2683,37 +2677,37 @@
 H.qG(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"$3","QB",6,0,null,76,[],15,[],127,[]],
-ed:[function(a,b,c){var z,y
+C.Nm.u(a,b,v)}},
+ed:function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 for(z=J.GP(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}},"$3","Y1",6,0,null,76,[],15,[],127,[]],
-tb:[function(a,b,c,d,e){var z,y,x,w,v
+C.Nm.u(a,b,z.gl())}},
+tb:function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"$5","e8",10,0,null,137,[],138,[],139,[],140,[],141,[]],
-TK:[function(a,b,c,d){var z
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},
+TK:function(a,b,c,d){var z
 if(c>=a.length)return-1
 if(c<0)c=0
 for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"$4","vu",8,0,null,117,[],142,[],88,[],143,[]],
-lO:[function(a,b,c){var z,y
+if(J.de(a[z],b))return z}return-1},
+lO:function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"$3","MW",6,0,null,117,[],142,[],88,[]],
-ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
-else H.d4(a,b,c,d)},"$4","UR",8,0,null,117,[],144,[],145,[],133,[]],
-w9:[function(a,b,c,d){var z,y,x,w,v,u
+if(J.de(a[y],b))return y}return-1},
+ZE:function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
+else H.d4(a,b,c,d)},
+w9:function(a,b,c,d){var z,y,x,w,v,u
 for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
 v=z
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"$4","f7",8,0,null,117,[],144,[],145,[],133,[]],
-d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
+v=u.W(v,1)}y.u(a,v,w)}},
+d4:function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
 z=J.Wx(a0)
 y=J.Ts(J.WB(z.W(a0,b),1),6)
 x=J.Qc(b)
@@ -2813,7 +2807,7 @@
 k=e}else{t.u(a,i,t.t(a,j))
 d=x.W(j,1)
 t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"$4","Hm",8,0,null,117,[],144,[],145,[],133,[]],
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},
 aL:{
 "^":"mW;",
 gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
@@ -2857,7 +2851,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")}],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -3093,15 +3087,15 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 w2Y:{
 "^":"ar+Tv;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -3122,99 +3116,95 @@
 bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
 $isGD:true,
 $iswv:true,
-static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:[function(a){var z,y
+static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:function(a){var z,y
 z=J.U6(a)
 if(z.gl0(a)!==!0){y=$.bw().Ej
 if(typeof a!=="string")H.vh(P.u(a))
 y=y.test(a)}else y=!0
 if(y)return a
 if(z.nC(a,"_"))throw H.b(P.u("\""+H.d(a)+"\" is a private identifier"))
-throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))},"$1","kf",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
+throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))}}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
 "^":"",
-TS:[function(a){return J.GL(a)},"$1","DP",2,0,null,146,[]],
-YC:[function(a){if(a==null)return
-return new H.GD(a)},"$1","Rc",2,0,null,12,[]],
+TS:function(a){return J.GL(a)},
+YC:function(a){if(a==null)return
+return new H.GD(a)},
 vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"$1","Yf",2,0,147,148,[]],
-jO:[function(a){var z,y
+else return new H.iu(a,4)},"$1","Yf",2,0,23,24,[]],
+jO:function(a){var z,y
 z=$.Sl().t(0,a)
 y=J.x(a)
 if(y.n(a,"dynamic"))return $.P8()
 if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"$1","vC",2,0,null,149,[]],
-tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=J.U6(b)
-y=z.u8(b,"/")
-if(y>-1)b=z.yn(b,y+1)
+return H.tT(H.YC(z==null?a:z),a)},
+tT:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=$.tY
 if(z==null){z=H.Pq()
-$.tY=z}x=z[b]
-if(x!=null)return x
+$.tY=z}y=z[b]
+if(y!=null)return y
 z=J.U6(b)
-w=z.u8(b,"<")
-if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
-x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
-$.tY[b]=x
-return x}u=H.mN(b)
-if(u==null){t=init.functionAliases[b]
-if(t!=null){x=new H.ng(b,null,a)
-x.CM=new H.Ar(init.metadata[t],null,null,null,x)
-$.tY[b]=x
-return x}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}s=H.SG(u)?u.constructor:u
-r=s["@"]
-if(r==null){q=null
-p=null}else{q=r["^"]
-z=J.x(q)
-if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
-q=z.t(q,0)}else p=null
-if(typeof q!=="string")q=""}z=J.uH(q,";")
+x=z.u8(b,"<")
+if(x!==-1){w=H.jO(z.Nj(b,0,x)).gJi()
+y=new H.bl(w,z.Nj(b,x+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,w.gIf())
+$.tY[b]=y
+return y}v=init.allClasses[b]
+if(v==null){u=init.functionAliases[b]
+if(u!=null){y=new H.ng(b,null,a)
+y.CM=new H.Ar(init.metadata[u],null,null,null,y)
+$.tY[b]=y
+return y}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}t=v["@"]
+if(t==null){s=null
+r=null}else{s=t["^"]
+z=J.x(s)
+if(!!z.$iszM){r=z.Mu(s,1,z.gB(s)).br(0)
+s=z.t(s,0)}else r=null
+if(typeof s!=="string")s=""}z=J.uH(s,";")
 if(0>=z.length)return H.e(z,0)
-o=J.uH(z[0],"+")
-if(o.length>1&&$.Sl().t(0,b)==null)x=H.MJ(o,b)
-else{n=new H.Wf(b,u,q,p,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
-m=s.prototype["<>"]
-if(m==null||m.length===0)x=n
-else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
-x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"$2","ER",4,0,null,146,[],149,[]],
-Vv:[function(a){var z,y,x
+q=J.uH(z[0],"+")
+if(q.length>1&&$.Sl().t(0,b)==null)y=H.MJ(q,b)
+else{p=new H.Wf(b,v,s,r,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
+o=v.prototype["<>"]
+if(o==null||o.length===0)y=p
+else{for(z=o.length,n="dynamic",m=1;m<z;++m)n+=",dynamic"
+y=new H.bl(p,n,null,null,null,null,null,null,null,null,null,null,null,null,null,p.If)}}$.tY[b]=y
+return y},
+Vv:function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"$1","yM",2,0,null,150,[]],
-Fk:[function(a){var z,y,x
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},
+Fk:function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},"$1","Pj",2,0,null,150,[]],
-EK:[function(a,b){var z,y,x,w
+if(x.gxV())z.u(0,x.gIf(),x)}return z},
+EK:function(a,b){var z,y,x,w
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.glT()){w=x.gIf()
-if(b.nb.t(0,w)!=null)continue
-z.u(0,x.gIf(),x)}}return z},"$2","rX",4,0,null,150,[],151,[]],
-vE:[function(a,b){var z,y,x,w,v
+if(b.Fb.t(0,w)!=null)continue
+z.u(0,x.gIf(),x)}}return z},
+vE:function(a,b){var z,y,x,w,v
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.ghB()){w=x.gIf().fN
 v=J.U6(w)
 if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},"$2","un",4,0,null,150,[],152,[]],
-MJ:[function(a,b){var z,y,x,w
+z.to(x.gIf(),new H.YX(x))}return z},
+MJ:function(a,b){var z,y,x,w
 z=[]
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
 x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
 x.G()
 w=x.lo
 for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"$2","R9",4,0,null,153,[],149,[]],
-w2:[function(a,b){var z,y,x
+return w},
+w2:function(a,b){var z,y,x
 z=J.U6(a)
 y=0
 while(!0){x=z.gB(a)
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},"$2","CE",4,0,null,155,[],12,[]],
-Jf:[function(a,b){var z,y,x,w,v,u,t
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},
+Jf:function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
 for(y=a;y!=null;){x=J.x(y)
@@ -3224,27 +3214,27 @@
 else{x=z.a
 if(x==null)w=H.Ko(b,null)
 else if(x.gHA())if(typeof b==="number"){v=init.metadata[b]
-u=x.gNy()
+u=z.a.gNy()
 return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
 else{z=new H.rh(z)
 if(typeof b==="number"){t=z.$1(b)
 if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.iW(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},"$2","xN",4,0,null,156,[],11,[]],
-fb:[function(a,b){if(a==null)return b
-return H.YC(H.d(J.GL(J.Ba(a)))+"."+H.d(b.fN))},"$2","WS",4,0,null,156,[],157,[]],
-pj:[function(a){var z,y,x,w
+return P.re(C.yQ)},
+fb:function(a,b){if(a==null)return b
+return H.YC(H.d(a.gUx(a).fN)+"."+H.d(b.fN))},
+pj:function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
 if(typeof a!="function")return C.xD
 if("$metadataIndex" in a){y=a.$reflectionInfo.splice(a.$metadataIndex)
 y.fixed$length=init
 return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
-w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
+w=C.xB.cn(x,new H.VR("\"[0-9,]*\";?[ \n\r]*}",H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
 if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"$1","C7",2,0,null,158,[]],
-jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},
+jw:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
-if(!!z.$isList){y=H.Mk(z.t(b,0),",")
+if(!!z.$iszM){y=H.Mk(z.t(b,0),",")
 x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
 x=null}for(z=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=x!=null,v=0;z.G();){u=z.lo
 if(w){t=v+1
@@ -3252,18 +3242,18 @@
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"$4","Sv",8,0,null,156,[],159,[],67,[],57,[]],
-Mk:[function(a,b){var z=J.U6(a)
-if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"$2","EO",4,0,null,14,[],106,[]],
-BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
-default:return!1}},"$1","IX",2,0,null,12,[]],
-Y6:[function(a){var z,y
+if(r!=null)d.push(r)}},
+Mk:function(a,b){var z=J.U6(a)
+if(z.gl0(a)===!0)return H.VM([],[P.qU])
+return z.Fr(a,b)},
+BF:function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
+default:return!1}},
+Y6:function(a){var z,y
 z=J.x(a)
 if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
 y=z.t(a,0)
 z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"$1","uG",2,0,null,49,[]],
+return z.n(y,"*")||z.n(y,"+")},
 Sn:{
 "^":"a;L5,F1>",
 gvU:function(){var z,y,x,w
@@ -3271,11 +3261,11 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=$.vK(),z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)for(x=J.GP(z.lo);x.G();){w=x.gl()
-y.u(0,w.gFP(),w)}z=H.VM(new H.Oh(y),[P.iD,P.D4])
+y.u(0,w.gFP(),w)}z=H.VM(new P.Oh(y),[P.iD,P.D4])
 this.L5=z
 return z},
-static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=P.L5(null,null,null,J.O,[J.Q,P.D4])
+static:{"^":"QG,Q3,Ct",dF:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=P.L5(null,null,null,P.qU,[P.zM,P.D4])
 y=init.libraries
 if(y==null)return z
 for(x=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);x.G();){w=x.lo
@@ -3289,10 +3279,10 @@
 o=v.t(w,6)
 n=v.t(w,7)
 m=q==null?C.xD:q()
-J.bi(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"$0","jc",0,0,null]}},
+J.wT(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z}}},
 nI:{
-"^":"Tp:126;",
-$0:[function(){return H.VM([],[P.D4])},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return H.VM([],[P.D4])},
 $isEH:true},
 jU:{
 "^":"a;",
@@ -3302,12 +3292,12 @@
 Lj:{
 "^":"jU;MA",
 gOO:function(){return"Isolate"},
-gcZ:function(){var z=$.Cm().gvU().nb
+gcZ:function(){var z=$.Cm().gvU().Fb
 return z.gUQ(z).XG(0,new H.mb())},
 $isQF:true},
 mb:{
-"^":"Tp:355;",
-$1:[function(a){return a.gGD()},"$1",null,2,0,null,354,[],"call"],
+"^":"Tp:132;",
+$1:function(a){return a.gGD()},
 $isEH:true},
 amu:{
 "^":"jU;If<",
@@ -3347,7 +3337,7 @@
 $isNL:true,
 $isQF:true},
 Uz:{
-"^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
+"^":"uh;FP<,aP,wP,le,LB,GD<,ae,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
 gOO:function(){return"LibraryMirror"},
 gUx:function(a){return this.If},
 gEO:function(){return this.gm8()},
@@ -3358,11 +3348,11 @@
 for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
 if(!!J.x(x).$isMs){x=x.gJi()
 if(!!x.$isWf){y.u(0,x.If,x)
-x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
+x.jE=this}}}z=H.VM(new P.Oh(y),[P.wv,P.Ms])
 this.P8=z
 return z},
 rN:function(a){var z,y
-z=this.gQH().nb.t(0,a)
+z=this.gQH().Fb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
 if(!J.x(z).$isRS)return H.vn(z.IB(this))
 if(z.glT())return H.vn(z.IB(this))
@@ -3370,7 +3360,7 @@
 if(y==null)throw H.b(P.SY(null))
 return H.vn(y())},
 F2:function(a,b,c){var z,y,x
-z=this.gQH().nb.t(0,a)
+z=this.gQH().Fb.t(0,a)
 y=!!J.x(z).$isZk
 if(y&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
 if(z!=null)x=y&&z.hB
@@ -3396,7 +3386,7 @@
 if(r==null||!!s.$getterStub)break c$0
 q=J.rY(r).nC(r,"new ")
 if(q){u=C.xB.yn(r,4)
-r=H.ys(u,"$",".")}p=H.Sd(r,s,!q,q)
+r=H.ys(u,"$",".")}p=H.S5(r,s,!q,q)
 y.push(p)
 p.jE=this}++v}this.SD=y
 return y},
@@ -3412,17 +3402,17 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gm8(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RS])
+if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RS])
 this.mX=z
 return z},
 gF4:function(){var z=this.T1
 if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
 this.T1=z
 return z},
 gM1:function(){var z=this.fX
 if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
 this.fX=z
 return z},
 gcc:function(){var z,y,x
@@ -3430,7 +3420,7 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z,y
@@ -3440,19 +3430,19 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 z=new H.IB(y)
-this.gQn().nb.aN(0,z)
-this.gF4().nb.aN(0,z)
-this.gM1().nb.aN(0,z)
-this.gcc().nb.aN(0,z)
-z=H.VM(new H.Oh(y),[P.wv,P.QF])
+this.gQn().Fb.aN(0,z)
+this.gF4().Fb.aN(0,z)
+this.gM1().Fb.aN(0,z)
+this.gcc().Fb.aN(0,z)
+z=H.VM(new P.Oh(y),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
 z=this.Db
 if(z!=null)return z
 y=P.L5(null,null,null,P.wv,P.NL)
-this.gQH().nb.aN(0,new H.oP(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+this.gQH().Fb.aN(0,new H.oP(y))
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 gc9:function(){var z=this.xO
@@ -3468,16 +3458,16 @@
 "^":"amu+M2;",
 $isQF:true},
 IB:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 oP:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 YX:{
-"^":"Tp:126;a",
-$0:[function(){return this.a},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return this.a},
 $isEH:true},
 BI:{
 "^":"Un;AY<,XW,BB,i1,If",
@@ -3512,7 +3502,9 @@
 $isQF:true},
 iu:{
 "^":"M2;Ax<,xq",
-gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
+gt5:function(a){var z=this.Ax
+if(z==null)return P.re(C.Qf)
+return H.jO(H.dJ(z))},
 F2:function(a,b,c){return this.tu(a,0,b,c==null?C.CM:c)},
 CI:function(a,b){return this.F2(a,b,null)},
 Z7:function(a,b,c){var z,y,x,w,v,u,t,s
@@ -3606,12 +3598,12 @@
 $isvr:true,
 $isQF:true},
 vo:{
-"^":"Tp:357;a",
-$2:[function(a,b){var z,y
+"^":"Tp:134;a",
+$2:function(a,b){var z,y
 z=J.GL(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"$2",null,4,0,null,146,[],30,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},
 $isEH:true},
 bl:{
 "^":"amu;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,yF,If",
@@ -3645,7 +3637,7 @@
 return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
 this.b0=z
 return z},
 gcc:function(){var z,y,x
@@ -3653,12 +3645,12 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.NK.ws(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z=this.uA
 if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
+z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3668,7 +3660,7 @@
 y.FV(0,this.gQH())
 y.FV(0,this.gEz())
 J.kH(this.NK.gNy(),new H.Ax(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 rN:function(a){return this.NK.rN(a)},
@@ -3699,40 +3691,37 @@
 $isX9:true,
 $isNL:true},
 tB:{
-"^":"Tp:32;a",
-$1:[function(a){var z,y,x
+"^":"Tp:8;a",
+$1:function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,358,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},
 $isEH:true},
 Oo:{
-"^":"Tp:115;",
-$1:[function(a){return-1},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return-1},
 $isEH:true},
 Tc:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b.$1(a)},"$1",null,2,0,null,95,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){return this.b.$1(a)},
 $isEH:true},
 Ax:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,359,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){this.a.u(0,a.gIf(),a)
+return a},
 $isEH:true},
 Wf:{
-"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
+"^":"vk;Cr<,aB<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
 gOO:function(){return"ClassMirror"},
-gaB:function(){var z=this.Tx
-if(H.SG(z))return z.constructor
-else return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
 this.b0=z
 return z},
 ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.gaB().prototype
+z=this.aB.prototype
 y=H.kU(z)
 x=H.VM([],[H.Zk])
 for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){v=w.lo
@@ -3741,18 +3730,18 @@
 if(u==null)continue
 t=z[v]
 if(t.$reflectable==2)continue
-s=H.Sd(u,t,!1,!1)
+s=H.S5(u,t,!1,!1)
 x.push(s)
 s.jE=a}y=H.kU(init.statics[this.Cr])
 for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){r=w.lo
 if(H.Y6(r))continue
-q=this.gXP().gae()[r]
+q=this.gXP().ae[r]
 if("$reflectable" in q){p=q.$reflectionName
 if(p==null)continue
 o=C.xB.nC(p,"new ")
 if(o){n=C.xB.yn(p,4)
 p=H.ys(n,"$",".")}}else continue
-s=H.Sd(p,q,!o,o)
+s=H.S5(p,q,!o,o)
 x.push(s)
 s.jE=a}return x},
 gEO:function(){var z=this.qu
@@ -3778,12 +3767,12 @@
 return z},
 ghp:function(){var z=this.FU
 if(z!=null)return z
-z=H.VM(new H.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
 this.FU=z
 return z},
 gF4:function(){var z=this.T1
 if(z!=null)return z
-z=H.VM(new H.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
 this.T1=z
 return z},
 gcc:function(){var z,y,x
@@ -3791,12 +3780,12 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z=this.uA
 if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
+z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3804,41 +3793,41 @@
 if(z!=null)return z
 y=P.L5(null,null,null,P.wv,P.NL)
 z=new H.Ei(y)
-this.gQH().nb.aN(0,z)
-this.gEz().nb.aN(0,z)
+this.gQH().Fb.aN(0,z)
+this.gEz().Fb.aN(0,z)
 J.kH(this.gNy(),new H.Ci(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 Ve:function(a){var z,y
-z=this.gcc().nb.t(0,a)
+z=this.gcc().Fb.t(0,a)
 if(z!=null)return z.gFo()
-y=this.gF4().nb.t(0,a)
+y=this.gF4().Fb.t(0,a)
 return y!=null&&y.gFo()},
 rN:function(a){var z,y,x,w
-z=this.gcc().nb.t(0,a)
+z=this.gcc().Fb.t(0,a)
 if(z!=null&&z.gFo()){y=z.gcK()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}x=this.gF4().nb.t(0,a)
+else return H.vn($[y])}x=this.gF4().Fb.t(0,a)
 if(x!=null&&x.gFo())return H.vn(x.jd(C.xD,C.CM))
-w=this.ghp().nb.t(0,a)
+w=this.ghp().Fb.t(0,a)
 if(w!=null&&w.gFo()){x=w.gdl().$getter
 if(x==null)throw H.b(P.SY(null))
 return H.vn(x())}throw H.b(P.lr(this,a,null,null,null))},
 gXP:function(){var z,y
 z=this.jE
-if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
-else{z=$.vK()
+if(z==null){z=$.vK()
 z=z.gUQ(z)
 y=new H.MH(null,J.GP(z.l6),z.T6)
 y.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.jE
+for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()
+z=this.jE
 if(z==null)throw H.b(P.w("Class \""+H.d(H.TS(this.If))+"\" has no owner"))}return z},
 gc9:function(){var z=this.xO
 if(z!=null)return z
 z=this.le
-if(z==null){z=H.pj(this.gaB().prototype)
+if(z==null){z=H.pj(this.aB.prototype)
 this.le=z}z=H.VM(new P.Yp(J.kl(z,H.Yf())),[P.vr])
 this.xO=z
 return z},
@@ -3858,7 +3847,7 @@
 this.qN=z}else{z=x.n(w,"")?this:H.jO(w)
 this.qN=z}}}return J.de(z,this)?null:this.qN},
 F2:function(a,b,c){var z,y
-z=this.ghp().nb.t(0,a)
+z=this.ghp().Fb.t(0,a)
 y=z==null
 if(y&&this.Ve(a))return this.rN(a).F2(C.Ka,b,c)
 if(y||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
@@ -3880,7 +3869,7 @@
 z=this.UF
 if(z!=null)return z
 y=[]
-x=this.gaB().prototype["<>"]
+x=this.aB.prototype["<>"]
 if(x==null)return y
 for(w=0;w<x.length;++w){z=x[w]
 v=init.metadata[z]
@@ -3899,17 +3888,17 @@
 "^":"EE+M2;",
 $isQF:true},
 Ei:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 Ci:{
-"^":"Tp:115;b",
-$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,359,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){this.b.u(0,a.gIf(),a)
+return a},
 $isEH:true},
 t0:{
-"^":"Tp:360;a",
-$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:136;a",
+$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
 $isEH:true},
 XJ:{
 "^":"amu;cK<,V5>,Fo<,n6,jE,Ay>,le,If",
@@ -3948,10 +3937,10 @@
 v.$builtinTypeInfo=[H.Kp(y,0)]
 for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
 break}}if(1>=z.length)return H.e(z,1)
-return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
-return 0},"$1","Na",2,0,null,154,[]]}},
+return 0}}},
 Sz:{
 "^":"iu;Ax,xq",
 gMj:function(a){var z,y,x,w,v,u,t,s
@@ -3967,7 +3956,7 @@
 H.eZ(y)
 t=$.bx().t(0,w.gRA(y))
 if(t==null)H.Hz(t)
-s=H.Sd(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
+s=H.S5(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
 y.constructor[z]=s
 return s},
 bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
@@ -3994,8 +3983,8 @@
 v=H.zh(z)
 if(v!=null){u=v.AM
 if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
-else{z=this.gXP()
-t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
+else t=this.gXP()!=null&&!!J.x(this.gXP()).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gaB()),null,null,null,this.jE)
+if(this.xV)this.wM=this.jE
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.Rv,q=v.Rn,p=v.hG,o=0;z.G();o=h){n=z.lo
@@ -4020,7 +4009,7 @@
 $isRS:true,
 $isNL:true,
 $isQF:true,
-static:{Sd:function(a,b,c,d){var z,y,x,w,v,u,t
+static:{S5:function(a,b,c,d){var z,y,x,w,v,u,t
 z=a.split(":")
 if(0>=z.length)return H.e(z,0)
 a=z[0]
@@ -4047,8 +4036,8 @@
 $isNL:true,
 $isQF:true},
 wt:{
-"^":"Tp:361;",
-$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:137;",
+$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
 $isEH:true},
 ng:{
 "^":"amu;Cr<,CM,If",
@@ -4103,19 +4092,22 @@
 y.push(new H.fu(this,z.named[u],!1,!1,null,C.iH,H.YC(u)))}z=H.VM(new P.Yp(y),[P.Ys])
 this.zM=z
 return z},
+Hu:function(a){var z=init.mangledGlobalNames[a]
+if(z!=null)return z
+return a},
 bu:function(a){var z,y,x,w,v,u
 z=this.o3
 if(z!=null)return z
 z=this.d9
 if("args" in z)for(y=z.args,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x="FunctionTypeMirror on '(",w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}else{x="FunctionTypeMirror on '("
+x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}else{x="FunctionTypeMirror on '("
 w=""}if("opt" in z){x+=w+"["
 for(y=z.opt,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}x+="]"}if("named" in z){x+=w+"{"
+x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}x+="]"}if("named" in z){x+=w+"{"
 for(y=H.kU(z.named),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){u=y.lo
-x=C.xB.g(x+w+(H.d(u)+": "),H.Ko(z.named[u],null))}x+="}"}x+=") -> "
+x=C.xB.g(x+w+(H.d(u)+": "),this.Hu(H.Ko(z.named[u],null)))}x+="}"}x+=") -> "
 if(!!z.void)x+="void"
-else x="ret" in z?C.xB.g(x,H.Ko(z.ret,null)):x+"dynamic"
+else x="ret" in z?C.xB.g(x,this.Hu(H.Ko(z.ret,null))):x+"dynamic"
 z=x+"'"
 this.o3=z
 return z},
@@ -4127,170 +4119,151 @@
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:362;a",
-$1:[function(a){var z,y,x
+"^":"Tp:138;a",
+$1:function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
 x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"$1",null,2,0,null,15,[],"call"],
+return J.UQ(y.a.gw8(),x)},
 $isEH:true},
 iW:{
-"^":"Tp:120;b",
-$1:[function(a){var z,y
+"^":"Tp:18;b",
+$1:function(a){var z,y
 z=this.b.$1(a)
 y=J.x(z)
 if(!!y.$iscw)return H.d(z.Nz)
 if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
 else if(y.n(z,$.oj()))return"void"
 else return"dynamic"
-return z.gCr()},"$1",null,2,0,null,15,[],"call"],
+return z.gCr()},
 $isEH:true},
 ye:{
-"^":"Tp:361;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:137;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:361;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
-$isEH:true},
-Oh:{
-"^":"a;nb",
-gB:function(a){return this.nb.X5},
-gl0:function(a){return this.nb.X5===0},
-gor:function(a){return this.nb.X5!==0},
-t:function(a,b){return this.nb.t(0,b)},
-x4:function(a){return this.nb.x4(a)},
-di:function(a){return this.nb.di(a)},
-aN:function(a,b){return this.nb.aN(0,b)},
-gvc:function(){var z=this.nb
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gUQ:function(a){var z=this.nb
-return z.gUQ(z)},
-u:function(a,b,c){return H.kT()},
-FV:function(a,b){return H.kT()},
-Rz:function(a,b){H.kT()},
-V1:function(a){return H.kT()},
-$isZ0:true,
-static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lY",0,0,null]}}}],["dart._js_names","dart:_js_names",,H,{
+"^":"Tp:137;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
+$isEH:true}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
-hY:[function(a,b){var z,y,x,w,v,u,t
+hY:function(a,b){var z,y,x,w,v,u,t
 z=H.kU(a)
-y=P.Fl(J.O,J.O)
+y=P.Fl(P.qU,P.qU)
 for(x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),w=!b;x.G();){v=x.lo
 u=a[v]
 y.u(0,v,u)
 if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"$2","BH",4,0,null,160,[],161,[]],
-YK:[function(a){var z=P.Fl(J.O,J.O)
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},
+YK:function(a){var z=P.Fl(P.qU,P.qU)
 a.aN(0,new H.Xh(z))
-return z},"$1","OX",2,0,null,162,[]],
-kU:[function(a){var z=H.VM(function(b,c){var y=[]
+return z},
+kU:function(a){var z=H.VM(function(b,c){var y=[]
 for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z},"$1","DF",2,0,null,158,[]],
+return z},
 Xh:{
-"^":"Tp:364;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],363,[],"call"],
+"^":"Tp:139;a",
+$2:function(a,b){this.a.u(0,b,a)},
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
-Oj:[function(){if($.jk().scheduleImmediate!=null)return P.Sx()
-return P.K7()},"$0","n9",0,0,null],
+Oj:function(){if($.jk().scheduleImmediate!=null)return P.Sx()
+return P.K7()},
 ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,163,164,[]],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,163,164,[]],
-VH:[function(a,b){var z=H.N7()
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,25],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,25],
+VH:function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
-else return b.cR(a)},"$2","zZ",4,0,null,165,[],166,[]],
+else return b.cR(a)},
 e4:function(a,b){var z=P.Dt(b)
 P.rT(C.ny,new P.ZC(a,z))
 return z},
-Cx:[function(){var z=$.S6
+Cx:function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
-$.S6=z}$.k8=null},"$0","BN",0,0,null],
+$.S6=z}$.k8=null},
 BG:[function(){var z
 try{P.Cx()}catch(z){H.Ru(z)
 $.ej().$1(P.qZ())
 $.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,125],
-IA:[function(a){var z,y
+throw z}},"$0","qZ",0,0,21],
+IA:function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
 $.k8=z
 $.S6=z
 $.ej().$1(P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"$1","e6",2,0,null,164,[]],
-rb:[function(a){var z
+$.k8=y}},
+rb:function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,164,[]],
+z.wr(z.xi(a,!0))},
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v
+ot:function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.$0()
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-$.X3.hk(y,x)}},"$1","DC",2,0,null,168,[]],
-YE:[function(a){},"$1","bZ",2,0,169,30,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,170,85,171,[],172,[]],
-dL:[function(){},"$0","v3",0,0,125],
-FE:[function(a,b,c){var z,y,x,w
+$.X3.hk(y,x)}},
+YE:[function(a){},"$1","bZ",2,0,26,27,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,28,29,30,[],31,[]],
+dL:[function(){},"$0","v3",0,0,21],
+FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.$2(z,y)}},"$3","CV",6,0,null,173,[],174,[],175,[]],
-NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"$4","QD",8,0,null,176,[],177,[],171,[],172,[]],
-TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,176,[],177,[]],
-Bb:[function(a,b,c){a.ed()
-b.rX(c)},"$3","E1",6,0,null,176,[],177,[],30,[]],
+c.$2(z,y)}},
+NX:function(a,b,c,d){a.ed()
+b.K5(c,d)},
+TB:function(a,b){return new P.uR(a,b)},
+Bb:function(a,b,c){a.ed()
+b.rX(c)},
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
-jL:[function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},"$2","et",4,0,null,178,[],164,[]],
-PJ:[function(a){var z=$.X3
+jL:function(a,b){var z=a.gVs()
+return H.cy(z<0?0:z,b)},
+PJ:function(a){var z=$.X3
 $.X3=a
-return z},"$1","kb",2,0,null,166,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","Gx",10,0,179,180,[],181,[],166,[],171,[],172,[]],
+return z},
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","Gx",10,0,32,33,[],34,[],35,[],30,[],31,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.$0()
 z=P.PJ(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","AI",8,0,182,180,[],181,[],166,[],128,[]],
+return y}finally{$.X3=z}},"$4","AI",8,0,36,33,[],34,[],35,[],37,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.$1(e)
 z=P.PJ(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,183,180,[],181,[],166,[],128,[],184,[]],
+return y}finally{$.X3=z}},"$5","MM",10,0,38,33,[],34,[],35,[],37,[],39,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.$2(e,f)
 z=P.PJ(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","l4",12,0,185,180,[],181,[],166,[],128,[],60,[],61,[]],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,186,180,[],181,[],166,[],128,[]],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,187,180,[],181,[],166,[],128,[]],
-VI:[function(a,b,c,d){return d},"$4","uu",8,0,188,180,[],181,[],166,[],128,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,189,180,[],181,[],166,[],128,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,190,180,[],181,[],166,[],178,[],164,[]],
-XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,191,180,[],181,[],166,[],192,[]],
-CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,193,192,[]],
+return y}finally{$.X3=z}},"$6","l4",12,0,40,33,[],34,[],35,[],37,[],12,[],13,[]],
+Ee:[function(a,b,c,d){return d},"$4","EU",8,0,41,33,[],34,[],35,[],37,[]],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,42,33,[],34,[],35,[],37,[]],
+VI:[function(a,b,c,d){return d},"$4","uu",8,0,43,33,[],34,[],35,[],37,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,44],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,45,33,[],34,[],35,[],46,[],47,[]],
+XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,48],
+CI:[function(a){J.O2($.X3,a)},"$1","jt",2,0,49],
 UA:[function(a,b,c,d,e){var z
-$.oK=P.Ib()
+$.oK=P.jt()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","hn",10,0,194,180,[],181,[],166,[],195,[],196,[]],
+return new P.uo(c,d,z)},"$5","hn",10,0,50],
 C6:{
-"^":"Tp:126;a",
+"^":"Tp:22;a",
 $0:[function(){H.ox()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -4317,9 +4290,9 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,125],
-LP:[function(){},"$0","gZ9",0,0,125],
-static:{"^":"FJ,RG,cP"}},
+uO:[function(){},"$0","gp4",0,0,21],
+LP:[function(){},"$0","gZ9",0,0,21],
+static:{"^":"E2b,RG,cP"}},
 WVu:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
@@ -4343,9 +4316,9 @@
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},248,[]],
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},140,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,365,85,171,[],172,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,141,29,30,[],31,[]],
 cO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -4397,19 +4370,19 @@
 else this.Ip.OH(null)}},
 tK:{
 "^":"Tp;a,b",
-$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.Rg(0,this.b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.V8(this.b,this.c)},
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-$1:[function(a){a.Qj()},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.Qj()},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"m6",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"WhE",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:function(a){var z,y
@@ -4425,25 +4398,25 @@
 "^":"a;",
 $isb8:true},
 ZC:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ia:{
+Pf0:{
 "^":"a;"},
 Zf:{
-"^":"Ia;MM",
+"^":"Pf0;MM",
 oo:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,366,85,30,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,142,29,27,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,365,85,171,[],172,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,141,29,30,[],31,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -4500,7 +4473,7 @@
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,170,85,171,[],172,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,28,29,30,[],31,[]],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
@@ -4521,15 +4494,15 @@
 z.L7(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
-return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"$2","KP",4,0,null,33,[],82,[]],A9:[function(a,b){b.swG(!0)
+return z},k3:function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},A9:function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"$2","dd",4,0,null,33,[],82,[]],yE:[function(a,b){var z
+else a.au(b)},yE:function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"$2","cN",4,0,null,33,[],167,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -4567,44 +4540,44 @@
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=q}},"$2","XX",4,0,null,33,[],167,[]]}},
+b=q}}}},
 da:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,30,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,27,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:367;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+"^":"Tp:143;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
 $isEH:true},
 rH:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cX:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:126;a,b,c",
+"^":"Tp:22;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:348;b,d,e,f",
-$0:[function(){var z,y,x,w
+"^":"Tp:126;b,d,e,f",
+$0:function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 this.b.c=new P.Ca(z,y)
-return!1}},"$0",null,0,0,null,"call"],
+return!1}},
 $isEH:true},
 RW:{
-"^":"Tp:125;c,b,UI,bK",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+"^":"Tp:21;c,b,UI,bK",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
 y=r.gyK()
@@ -4636,11 +4609,11 @@
 r.b=!1
 return}this.b.b=!0}else{r=this.b
 r.c=z
-r.b=!1}},"$0",null,0,0,null,"call"],
+r.b=!1}},
 $isEH:true},
 RT:{
-"^":"Tp:125;c,b,Gq,Rm,w3",
-$0:[function(){var z,y,x,w,v,u
+"^":"Tp:21;c,b,Gq,Rm,w3",
+$0:function(){var z,y,x,w,v,u
 z={}
 z.a=null
 try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
@@ -4656,31 +4629,32 @@
 u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
 v.swG(!0)
 this.b.d=!0
-z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"$0",null,0,0,null,"call"],
+z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
 $isEH:true},
 jZ:{
-"^":"Tp:115;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,368,[],"call"],
+"^":"Tp:16;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,144,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:367;a,mG",
+"^":"Tp:143;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},369,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")}],
+Ft:[function(a,b){return H.VM(new P.aW(b,this),[H.ip(this,"qh",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.qh,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"qh")}],
 tg:function(a,b){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gaq())
+z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.YJ(y),y.gaq())
 return y},
 aN:function(a,b){var z,y
 z={}
@@ -4690,25 +4664,25 @@
 return y},
 Vr:function(a,b){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
 z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gaq())
 return y},
 gB:function(a){var z,y
 z={}
-y=P.Dt(J.bU)
+y=P.Dt(P.KN)
 z.a=0
 this.KR(new P.B5(z),!0,new P.PI(z,y),y.gaq())
 return y},
 gl0:function(a){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
 z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gaq())
 return y},
 br:function(a){var z,y
 z=H.VM([],[H.ip(this,"qh",0)])
-y=P.Dt([J.Q,H.ip(this,"qh",0)])
+y=P.Dt([P.zM,H.ip(this,"qh",0)])
 this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gaq())
 return y},
 qZ:function(a,b){var z=H.VM(new P.Zz(b,this),[null])
@@ -4739,41 +4713,41 @@
 z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gaq())
 return y},
 $isqh:true},
-YJ:{
+Sd:{
 "^":"Tp;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.jv(this.c,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 jv:{
-"^":"Tp:126;e,f",
-$0:[function(){return J.de(this.f,this.e)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return J.de(this.f,this.e)},
 $isEH:true},
-LB:{
-"^":"Tp:349;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
+bi:{
+"^":"Tp:127;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-DO:{
-"^":"Tp:126;bK",
+YJ:{
+"^":"Tp:22;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Tp;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,142,[],"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,145,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Rl:{
-"^":"Tp:126;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return this.e.$1(this.f)},
 $isEH:true},
 Jb:{
-"^":"Tp:115;",
-$1:[function(a){},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){},
 $isEH:true},
 M4:{
-"^":"Tp:126;UI",
+"^":"Tp:22;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Jp:{
@@ -4781,64 +4755,64 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 h7:{
-"^":"Tp:126;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return this.e.$1(this.f)},
 $isEH:true},
 pr:{
-"^":"Tp:349;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
+"^":"Tp:127;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 eN:{
-"^":"Tp:126;bK",
+"^":"Tp:22;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 B5:{
-"^":"Tp:115;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 PI:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 j4:{
-"^":"Tp:115;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 i9:{
-"^":"Tp:126;c",
+"^":"Tp:22;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 VV:{
 "^":"Tp;a,b",
-$1:[function(a){this.b.push(a)},"$1",null,2,0,null,248,[],"call"],
+$1:[function(a){this.b.push(a)},"$1",null,2,0,null,140,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
 Dy:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
 $0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,30,[],"call"],
+$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
-"^":"Tp:126;d",
+"^":"Tp:22;d",
 $0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,30,[],"call"],
+z.a=a},"$1",null,2,0,null,27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
-"^":"Tp:126;a,c",
+"^":"Tp:22;a,c",
 $0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
@@ -4847,11 +4821,11 @@
 "^":"Tp;a,b,c",
 $1:[function(a){var z=this.a
 if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,30,[],"call"],
+return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ii:{
-"^":"Tp:126;a,d",
+"^":"Tp:22;a,d",
 $0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
 $isEH:true},
 MO:{
@@ -4884,8 +4858,8 @@
 yU:{
 "^":"KA;Y8<",
 tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8()},"$0","gp4",0,0,125],
-LP:[function(){this.gY8()},"$0","gZ9",0,0,125]},
+uO:[function(){this.gY8()},"$0","gp4",0,0,21],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,21]},
 nP:{
 "^":"a;"},
 KA:{
@@ -4937,8 +4911,8 @@
 this.Gv=z
 if(z<32)this.SY()
 else this.w6(C.Wj)},
-uO:[function(){},"$0","gp4",0,0,125],
-LP:[function(){},"$0","gZ9",0,0,125],
+uO:[function(){},"$0","gp4",0,0,21],
+LP:[function(){},"$0","gZ9",0,0,21],
 tA:function(){},
 w6:function(a){var z,y
 z=this.Ri
@@ -4985,10 +4959,10 @@
 z=(this.Gv&4294967263)>>>0
 this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},
 $isMO:true,
-static:{"^":"ry,bG,Q9,wd,yJ,Dr,HX,GC,bsZ"}},
+static:{"^":"ry,bG,Q9,wd,yJ,lk,HX,GC,bsZ"}},
 Vo:{
-"^":"Tp:125;a,b,c",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:21;a,b,c",
+$0:function(){var z,y,x,w,v,u
 z=this.a
 y=z.Gv
 if((y&8)!==0&&(y&16)===0)return
@@ -4998,19 +4972,20 @@
 else{x=z.o7
 w=H.N7()
 w=H.KT(w,[w,w]).BD(x)
-v=this.b
-if(w)y.z8(x,v,this.c)
-else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+v=z.o7
+u=this.b
+if(w)y.z8(v,u,this.c)
+else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
 qB:{
-"^":"Tp:125;a",
-$0:[function(){var z,y
+"^":"Tp:21;a",
+$0:function(){var z,y
 z=this.a
 y=z.Gv
 if((y&16)===0)return
 z.Gv=(y|42)>>>0
 z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
 aN:{
 "^":"qh;",
@@ -5048,7 +5023,7 @@
 return}P.rb(new P.CR(this,a))
 this.Gv=1}},
 CR:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -5073,16 +5048,16 @@
 this.N6=null
 this.zR=null}},
 v1y:{
-"^":"Tp:126;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,b,c",
+$0:function(){return this.a.K5(this.b,this.c)},
 $isEH:true},
 uR:{
-"^":"Tp:371;a,b",
-$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,171,[],172,[],"call"],
+"^":"Tp:146;a,b",
+$2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
-Q0:{
-"^":"Tp:126;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
+vm:{
+"^":"Tp:22;a,b",
+$0:function(){return this.a.rX(this.b)},
 $isEH:true},
 YR:{
 "^":"qh;",
@@ -5110,16 +5085,16 @@
 P.KA.prototype.V8.call(this,a,b)},
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,125],
+z.yy(0)},"$0","gp4",0,0,21],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,125],
+z.QE(0)},"$0","gZ9",0,0,21],
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},248,[]],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,372,171,[],172,[]],
-nn:[function(){this.Qj()},"$0","gH1",0,0,125],
+vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},140,[]],
+xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,147,30,[],31,[]],
+nn:[function(){this.Qj()},"$0","gH1",0,0,21],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -5148,6 +5123,15 @@
 x=new H.XO(w,null)
 b.V8(y,x)
 return}J.QM(b,z)}},
+aW:{
+"^":"YR;pK,Sb",
+GW:function(a){return this.pK.$1(a)},
+Ml:function(a,b){var z,y,x,w,v
+try{for(w=J.GP(this.GW(a));w.G();){z=w.gl()
+J.QM(b,z)}}catch(v){w=H.Ru(v)
+y=w
+x=new H.XO(v,null)
+b.V8(y,x)}}},
 Zz:{
 "^":"YR;Em,Sb",
 Ml:function(a,b){var z
@@ -5190,52 +5174,45 @@
 Id:{
 "^":"a;oh",
 gLj:function(){return this.oh},
-c1:function(a,b,c){var z,y
+c1:function(a,b,c){var z=this.oh
+for(;z.gWY().gE2()==null;)z=z.geT(z)
+return z.gWY().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
+Vn:function(a,b){var z=this.oh
+for(;z.gWY().gcP()==null;)z=z.geT(z)
+return z.gWY().gcP().$4(z,new P.Id(z.geT(z)),a,b)},
+qG:function(a,b,c){var z=this.oh
+for(;z.gWY().gJl()==null;)z=z.geT(z)
+return z.gWY().gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
+nA:function(a,b,c,d){var z=this.oh
+for(;z.gWY().gpU()==null;)z=z.geT(z)
+return z.gWY().gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
+TE:function(a,b){var z=this.oh
+for(;z.gWY().gFh()==null;)z=z.geT(z)
+return z.gWY().gFh().$4(z,new P.Id(z.geT(z)),a,b)},
+V6:function(a,b){var z=this.oh
+for(;z.gWY().gXp()==null;)z=z.geT(z)
+return z.gWY().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
+mz:function(a,b){var z=this.oh
+for(;z.gWY().gfb()==null;)z=z.geT(z)
+return z.gWY().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
+RK:function(a,b){var z,y
 z=this.oh
-for(;y=z.gWY(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().$4(z,new P.Id(z.geT(z)),a,b)},
-qG:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gFh(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gXp(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gfb(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-RK:function(a,b){var z,y,x
-z=this.oh
-for(;y=z.gWY(),y.grb()==null;)z=z.geT(z)
-x=z.geT(z)
-y.grb().$4(z,new P.Id(x),a,b)},
-dJ:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
+for(;z.gWY().grb()==null;)z=z.geT(z)
+y=z.geT(z)
+z.gWY().grb().$4(z,new P.Id(y),a,b)},
+dJ:function(a,b,c){var z=this.oh
+for(;z.gWY().gZq()==null;)z=z.geT(z)
+return z.gWY().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
 RB:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gWY(),y.gJS(y)==null;)z=z.geT(z)
+y=z.gWY()
 y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y,x
+ld:function(a,b,c){var z,y
 z=this.oh
-for(;y=z.gWY(),y.giq()==null;)z=z.geT(z)
-x=z.geT(z)
-return y.giq().$5(z,new P.Id(x),a,b,c)}},
+for(;z.gWY().giq()==null;)z=z.geT(z)
+y=z.geT(z)
+return z.gWY().giq().$5(z,new P.Id(y),a,b,c)}},
 WH:{
 "^":"a;",
 fC:function(a){return this.gC5()===a.gC5()},
@@ -5268,28 +5245,28 @@
 if(b)return new P.dv(this,z)
 else return new P.ph(this,z)}},
 TF:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,39,[],"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:115;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Tp:16;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,39,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
+"^":"Tp:75;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
 $isEH:true},
 ph:{
-"^":"Tp:300;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
+"^":"Tp:75;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
 $isEH:true},
 uo:{
 "^":"WH;eT>,WY<,R1",
@@ -5312,24 +5289,24 @@
 uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
 Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
 pK:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:126;c,d",
-$0:[function(){var z,y
+"^":"Tp:22;c,d",
+$0:function(){var z,y
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
 y=this.d
 if(y==null&&!!J.x(z).$isGe)y=z.gI4()
 if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
-throw H.b(z)},"$0",null,0,0,null,"call"],
+throw H.b(z)},
 $isEH:true},
-Uez:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+rF:{
+"^":"Tp:75;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
 $isEH:true},
-AHi:{
+nU:{
 "^":"a;",
 gE2:function(){return P.Gx()},
 hk:function(a,b){return this.gE2().$2(a,b)},
@@ -5377,12 +5354,12 @@
 "^":"",
 EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-jB:[function(){var z=Object.create(null)
+jB:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},"$0","A5",0,0,null],
-TQ:[function(a,b){return J.de(a,b)},"$2","S5",4,0,198,117,[],199,[]],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,200,117,[]],
+return z},
+TQ:[function(a,b){return J.de(a,b)},"$2","Jo",4,0,51],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,52,53,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -5390,15 +5367,15 @@
 return P.MP(a,b,c,d,e)},
 UD:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
 yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
-FO:[function(a){var z,y
+FO:function(a){var z,y
 if($.xb().tg(0,a))return"(...)"
 $.xb().h(0,a)
 z=[]
 try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
-return y.vM},"$1","Zw",2,0,null,127,[]],
-Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+return y.vM},
+Vr:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=a.gA(a)
 y=0
 x=0
@@ -5434,10 +5411,10 @@
 if(p==null){y+=5
 p="..."}}if(p!=null)b.push(p)
 b.push(u)
-b.push(v)},"$2","zE",4,0,null,127,[],201,[]],
+b.push(v)},
 L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
 Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
-vW:[function(a){var z,y,x,w,v
+vW:function(a){var z,y,x,w,v
 z={}
 for(x=0;w=$.tw(),x<w.length;++x){w=w[x]
 v=a
@@ -5448,7 +5425,7 @@
 J.kH(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"$1","DH",2,0,null,202,[]],
+z.pop()}return y.gvM()},
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
@@ -5551,23 +5528,23 @@
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
 return-1},
 $isZ0:true,
-static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"$2","ME",4,0,null,197,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"$3","rn",6,0,null,197,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
+static:{vL:function(a,b){var z=a[b]
+return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},a0:function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
-return z},"$0","l1",0,0,null]}},
+return z}}},
 oi:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
 $isEH:true},
 ce:{
-"^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return J.de(this.a.t(0,a),this.b)},
 $isEH:true},
 DJ:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
@@ -5600,9 +5577,9 @@
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:115;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,121,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){var z=H.XY(a,this.a)
+return z},
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -5745,21 +5722,21 @@
 bu:function(a){return P.vW(this)},
 $isFo:true,
 $isZ0:true,
-static:{Qs:[function(){var z=Object.create(null)
+static:{Qs:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},"$0","Bs",0,0,null]}},
+return z}}},
 a1:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
 $isEH:true},
 ou:{
-"^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return J.de(this.a.t(0,a),this.b)},
 $isEH:true},
 S9:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 db:{
@@ -6031,10 +6008,10 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{T2:[function(){var z=Object.create(null)
+static:{T2:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},"$0","um",0,0,null]}},
+return z}}},
 ef:{
 "^":"a;Gc<,DG@,zQ@"},
 zQ:{
@@ -6069,8 +6046,9 @@
 $asQV:null},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")},128,[]],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")}],
 ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
+Ft:[function(a,b){return H.VM(new H.kV(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")}],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
 return!1},
@@ -6120,8 +6098,8 @@
 $asQV:null},
 ar:{
 "^":"a+lD;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -6160,7 +6138,8 @@
 z.We(a,b)
 return z.vM},
 ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")}],
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")}],
 eR:function(a,b){return H.q9(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -6228,7 +6207,7 @@
 if(J.de(y,0))return
 if(e<0)throw H.b(P.u(e))
 z=J.x(d)
-if(!!z.$isList){x=e
+if(!!z.$iszM){x=e
 w=d}else{w=z.eR(d,e).tt(0,!1)
 x=0}if(typeof y!=="number")return H.s(y)
 z=J.U6(w)
@@ -6277,7 +6256,7 @@
 this.Mh(a,b,c)},
 Mh:function(a,b,c){var z,y
 z=J.x(c)
-if(!!z.$isList){z=z.gB(c)
+if(!!z.$iszM){z=z.gB(c)
 if(typeof z!=="number")return H.s(z)
 this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
 this.u(a,b,z.gl())}},
@@ -6288,20 +6267,49 @@
 z.KF("[")
 z.We(a,", ")
 z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
+KPM:{
+"^":"a;",
+u:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
+FV:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+V1:function(a){throw H.b(P.f("Cannot modify unmodifiable map"))},
+Rz:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+$isZ0:true},
+Bk:{
+"^":"a;",
+t:function(a,b){return this.Fb.t(0,b)},
+u:function(a,b,c){this.Fb.u(0,b,c)},
+FV:function(a,b){this.Fb.FV(0,b)},
+V1:function(a){this.Fb.V1(0)},
+x4:function(a){return this.Fb.x4(a)},
+di:function(a){return this.Fb.di(a)},
+aN:function(a,b){this.Fb.aN(0,b)},
+gl0:function(a){return this.Fb.X5===0},
+gor:function(a){return this.Fb.X5!==0},
+gB:function(a){return this.Fb.X5},
+gvc:function(){var z=this.Fb
+return H.VM(new P.i5(z),[H.Kp(z,0)])},
+Rz:function(a,b){return this.Fb.Rz(0,b)},
+bu:function(a){return P.vW(this.Fb)},
+gUQ:function(a){var z=this.Fb
+return z.gUQ(z)},
+$isZ0:true},
+Oh:{
+"^":"Bk+KPM;Fb",
+$isZ0:true},
 LG:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,374,[],121,[],"call"],
+z.KF(b)},
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -6344,7 +6352,7 @@
 h:function(a,b){this.NZ(0,b)},
 FV:function(a,b){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
-if(!!z.$isList){y=z.gB(b)
+if(!!z.$iszM){y=z.gB(b)
 x=this.gB(this)
 if(typeof y!=="number")return H.s(y)
 z=x+y
@@ -6454,11 +6462,11 @@
 $asQV:null,
 static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
-return z},ua:[function(a){var z
+return z},ua:function(a){var z
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"$1","bD",2,0,null,203,[]]}},
+if(z===0)return a}}}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
@@ -6586,23 +6594,23 @@
 y=new P.An(c)
 return H.VM(new P.Nb(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:115;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,121,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){var z=H.XY(a,this.a)
+return z},
 $isEH:true},
 bF:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
 BW:{
-"^":"Tp:375;a,b,c",
-$1:[function(a){var z,y,x,w
+"^":"Tp:149;a,b,c",
+$1:function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.$1(w)===!0)return!0
-a=a.Bb}return!1},"$1",null,2,0,null,273,[],"call"],
+a=a.Bb}return!1},
 $isEH:true},
 S6B:{
 "^":"a;",
@@ -6663,23 +6671,23 @@
 Wb:function(a){return a},
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
-VQ:[function(a,b){var z=new P.JC()
-return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,204,[],205,[]],
-BS:[function(a,b){var z,y,x,w
+VQ:function(a,b){var z=new P.JC()
+return z.$2(null,new P.f1(z).$1(a))},
+BS:function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(P.u(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"$2","H4",4,0,null,33,[],205,[]],
-tp:[function(a){return a.Lt()},"$1","BC",2,0,206,6,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
+tp:[function(a){return a.Lt()},"$1","BC",2,0,54,55,[]],
 JC:{
-"^":"Tp:300;",
-$2:[function(a,b){return b},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return b},
 $isEH:true},
 f1:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Tp:16;a",
+$1:function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
 for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
@@ -6688,7 +6696,7 @@
 for(y=this.a,x=0;x<w.length;++x){u=w[x]
 v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
 if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},"$1",null,2,0,null,21,[],"call"],
+return v},
 $isEH:true},
 Uk:{
 "^":"a;"},
@@ -6696,7 +6704,7 @@
 "^":"a;"},
 Zi:{
 "^":"Uk;",
-$asUk:function(){return[J.O,[J.Q,J.bU]]}},
+$asUk:function(){return[P.qU,[P.zM,P.KN]]}},
 Ud:{
 "^":"Ge;Ct,FN",
 bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
@@ -6715,13 +6723,13 @@
 KP:function(a){return this.Co(a,null)},
 gZE:function(){return C.cb},
 gHe:function(){return C.A3},
-$asUk:function(){return[P.a,J.O]}},
-dI:{
+$asUk:function(){return[P.a,P.qU]}},
+ze:{
 "^":"zF;UM,Xi",
-$aszF:function(){return[P.a,J.O]}},
+$aszF:function(){return[P.a,P.qU]}},
 Cf:{
 "^":"zF;N5",
-$aszF:function(){return[J.O,P.a]}},
+$aszF:function(){return[P.qU,P.a]}},
 Sh:{
 "^":"a;iY,Vy,bV",
 Wt:function(a){return this.iY.$1(a)},
@@ -6796,7 +6804,7 @@
 this.aK(a)
 z.KF("\"")
 return!0}else{z=J.x(a)
-if(!!z.$isList){this.WD(a)
+if(!!z.$iszM){this.WD(a)
 y=this.Vy
 y.KF("[")
 if(J.z8(z.gB(a),0)){this.rl(z.t(a,0))
@@ -6820,26 +6828,26 @@
 Ei:function(a){var z=this.bV
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"P3,hyY,FC,zf,fc,fg,dH,bz,eJ,Ho,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:[function(a,b,c){var z
+static:{"^":"P3,hyY,FC,zf,fc,fg,Do,bz,eJ,MU,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:function(a,b,c){var z
 b=P.BC()
 z=P.p9("")
 P.uI(z,b,c).rl(a)
-return z.vM},"$3","nB",6,0,null,6,[],207,[],208,[]]}},
+return z.vM}}},
 z0:{
 "^":"Zi;lH",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
+gZE:function(){return new P.E3()}},
+E3:{
 "^":"zF;",
 WJ:function(a){var z,y,x
 z=J.U6(a)
 y=J.vX(z.gB(a),3)
 if(typeof y!=="number")return H.s(y)
-y=H.VM(Array(y),[J.bU])
+y=H.VM(Array(y),[P.KN])
 x=new P.Rw(0,0,y)
 if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
 return C.Nm.D6(y,0,x.ZP)},
-$aszF:function(){return[J.O,[J.Q,J.bU]]}},
+$aszF:function(){return[P.qU,[P.zM,P.KN]]}},
 Rw:{
 "^":"a;WF,ZP,EN",
 Lb:function(a,b){var z,y,x,w,v
@@ -6910,9 +6918,9 @@
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:[function(a){return},"$1","Ex",2,0,null,51,[]],
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,209,117,[],199,[]],
-hl:[function(a){var z,y,x,w,v
+Te:function(a){return},
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,56,53,[],57,[]],
+hl:function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
 z.vM="\""
@@ -6929,11 +6937,11 @@
 else{w=H.Lw(v)
 w=z.vM+=w}}y=w+"\""
 z.vM=y
-return y}return"Instance of '"+H.lh(a)+"'"},"$1","Zx",2,0,null,6,[]],
+return y}return"Instance of '"+H.lh(a)+"'"},
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,212,117,[],199,[]],
-NS:[function(a){return H.CU(a)},"$1","cE",2,0,213,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,214,85,85,33,[],34,[],175,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,58],
+NS:[function(a){return H.CU(a)},"$1","cE",2,0,59],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,60,29,29],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -6944,22 +6952,22 @@
 if(b)return z
 z.fixed$length=init
 return z},
-JS:[function(a){var z,y
+JS:function(a){var z,y
 z=H.d(a)
 y=$.oK
 if(y==null)H.qw(z)
-else y.$1(z)},"$1","Pl",2,0,null,6,[]],
+else y.$1(z)},
 HB:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"$2",null,4,0,null,146,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,a.gfN(a),b)},
 $isEH:true},
 CL:{
-"^":"Tp:357;a",
-$2:[function(a,b){var z=this.a
+"^":"Tp:134;a",
+$2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
 z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},"$2",null,4,0,null,49,[],30,[],"call"],
+z.a.KF(P.hl(b));++z.b},
 $isEH:true},
 p4:{
 "^":"a;OF",
@@ -6967,7 +6975,8 @@
 a2:{
 "^":"a;",
 bu:function(a){return this?"true":"false"},
-$isbool:true},
+$isa2:true},
+"+bool":0,
 Tx:{
 "^":"a;"},
 iP:{
@@ -6992,8 +7001,8 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
+static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
 if(1>=x.length)return H.e(x,1)
@@ -7026,28 +7035,32 @@
 if(typeof l!=="number")return H.s(l)
 s=J.xH(s,n*l)}k=!0}else k=!1
 j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,210,[]],Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
-return z},Gq:[function(a){var z,y
+return z},Gq:function(a){var z,y
 z=Math.abs(a)
 y=a<0?"-":""
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"$1","Cp",2,0,null,211,[]],Vx:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},Vx:function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"$1","Dv",2,0,null,211,[]],h0:[function(a){if(a>=10)return""+a
-return"0"+a},"$1","wI",2,0,null,211,[]]}},
+return"00"+a},h0:function(a){if(a>=10)return""+a
+return"0"+a}}},
 MF:{
-"^":"Tp:377;",
-$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"$1",null,2,0,null,376,[],"call"],
+"^":"Tp:150;",
+$1:function(a){if(a==null)return 0
+return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Tp:378;",
-$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"$1",null,2,0,null,376,[],"call"],
+"^":"Tp:151;",
+$1:function(a){if(a==null)return 0
+return H.IH(a,null)},
 $isEH:true},
+CP:{
+"^":"lf;",
+$isCP:true},
+"+double":0,
 a6:{
 "^":"a;Fq<",
 g:function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},
@@ -7076,20 +7089,20 @@
 v=new P.P7().$1(C.CD.JV(y,1000000))
 return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"Bk,S4d,pk,LoB,zj5,b2,jS,ll,Do,f4,za,IJZ,iI,Wr,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"SF,S4d,pk,LoB,zj5,b2,jS,ll,DoM,f4,za,IJ,iI,Wr,fm,yn",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:120;",
-$1:[function(a){if(a>=100000)return H.d(a)
+"^":"Tp:18;",
+$1:function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
 if(a>=100)return"000"+H.d(a)
 if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+return"00000"+H.d(a)},
 $isEH:true},
 DW:{
-"^":"Tp:120;",
-$1:[function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:18;",
+$1:function(a){if(a>=10)return H.d(a)
+return"0"+H.d(a)},
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -7192,31 +7205,51 @@
 EH:{
 "^":"a;",
 $isEH:true},
+KN:{
+"^":"lf;",
+$isKN:true},
+"+int":0,
 QV:{
 "^":"a;",
 $isQV:true,
 $asQV:null},
 AC:{
 "^":"a;"},
+zM:{
+"^":"a;",
+$iszM:true,
+$aszM:null,
+$isyN:true,
+$isQV:true,
+$asQV:null},
+"+List":0,
 Z0:{
 "^":"a;",
 $isZ0:true},
 L9:{
 "^":"a;",
 bu:function(a){return"null"}},
+"+Null":0,
+lf:{
+"^":"a;",
+$islf:true},
+"+num":0,
 a:{
 "^":";",
 n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
 bu:function(a){return H.a5(this)},
 T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
 "^":"a;",
 $isOd:true},
 MN:{
 "^":"a;"},
+qU:{
+"^":"a;",
+$isqU:true},
+"+String":0,
 WU:{
 "^":"a;Qk,SU,Oq,Wn",
 gl:function(){return this.Wn},
@@ -7224,14 +7257,11 @@
 z=this.Oq
 this.SU=z
 y=this.Qk
-x=J.U6(y)
-if(z===x.gB(y)){this.Wn=null
-return!1}w=x.j(y,this.SU)
+x=y.length
+if(z===x){this.Wn=null
+return!1}w=C.xB.j(y,z)
 v=this.SU+1
-if((w&64512)===55296){z=x.gB(y)
-if(typeof z!=="number")return H.s(z)
-z=v<z}else z=!1
-if(z){u=x.j(y,v)
+if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
 if((u&64512)===56320){this.Oq=v+1
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
 return!0}}this.Oq=v
@@ -7284,7 +7314,7 @@
 if(z&&!0)return""
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
+if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
 return y},
 Ky:function(a,b){if(a==="")return"/"+H.d(b)
 return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
@@ -7319,13 +7349,20 @@
 z.KF(y)}y=this.Ka
 if(""!==y){z.KF("#")
 z.KF(y)}return z.vM},
-n:function(a,b){var z,y
+n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isiD)return!1
-if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
+y=this.Fi
+x=b.Fi
+if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
 y=b.r0
-z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
+if(z==null?y==null:z===y){z=this.tP
+y=b.tP
+if(z==null?y==null:z===y){z=this.Ka
+y=b.Ka
+y=z==null?y==null:z===y
+z=y}else z=!1}else z=!1}else z=!1
 else z=!1
 else z=!1
 else z=!1
@@ -7337,7 +7374,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"n2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,Yk,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,SQU,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"n2,q7,tv,ux,vI,IE,fd,IL,yT,zk,yt,fC,O5,FsP,qf,ML,j3,r5,Yk,qs,Fm,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,SQU,fbQ",hK:function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -7394,17 +7431,17 @@
 a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
 x=J.Wx(i)
 a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,215,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+return P.R6(a0,c,b,null,z,a,null,g,e)},R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
 z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
 z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:[function(a){var z,y
+return z},L7:function(a){var z,y
 if(a.length===0)return a
 if(C.xB.j(a,0)===91){z=a.length-1
 if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
 P.eg(C.xB.Nj(a,1,z))
 return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
 if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},"$1","jC",2,0,null,216,[]],iy:[function(a){var z,y,x,w,v,u
+return"["+a+"]"}}return a},iy:function(a){var z,y,x,w,v,u
 z=new P.hb()
 if(a==null)return""
 y=a.length
@@ -7418,7 +7455,7 @@
 if(u>=8)return H.e(C.mK,u)
 u=J.mQ(C.mK[u],C.jn.W4(1,v&15))!==0}else u=!1
 if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,217,[]],LE:[function(a,b){var z,y,x
+x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -7427,7 +7464,8 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"$2","wF",4,0,null,218,[],219,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,220,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return x.vM},UJ:function(a){if(a==null)return""
+return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z={}
 y=J.U6(a).u8(a,"%")
 z.a=y
@@ -7466,11 +7504,11 @@
 r=m}else{z.a=t
 r=t}}if(z.b==null)return a
 if(z.c!==r)s.$0()
-return J.AG(z.b)},"$1","Sy",2,0,null,221,[]],q5:[function(a){var z,y
+return J.AG(z.b)},q5:function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,216,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},eg:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
@@ -7490,26 +7528,26 @@
 if(t>=J.q8(s))H.vh(P.N(t))
 if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
 w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
-J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
+J.wT(x,-1)
+u=!0}else J.wT(x,y.$2(w,t))
 w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
 q=J.de(w,J.q8(a))
 p=J.de(J.MQ(x),-1)
 if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
+if(!q)try{J.wT(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
 try{v=P.q5(J.ZZ(a,w))
-s=J.Eh(J.UQ(v,0),8)
+s=J.c1(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
-J.bi(x,(s|r)>>>0)
-r=J.Eh(J.UQ(v,2),8)
+J.wT(x,(s|r)>>>0)
+r=J.c1(J.UQ(v,2),8)
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
-J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
+J.wT(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,216,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
+return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -7522,173 +7560,173 @@
 y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
 y.vM+=u}else{u=H.Lw(37)
 y.vM+=u
-z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,222,223,224,[],225,[],226,[],227,[]]}},
+z.$2(v,y)}}return y.vM}}},
 hP:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
 z=J.mQ(C.aa[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
 $isEH:true},
 Uo:{
-"^":"Tp:381;a",
-$1:[function(a){a=J.aK(this.a,"]",a)
+"^":"Tp:153;a",
+$1:function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},"$1",null,2,0,null,15,[],"call"],
+return a+1},
 $isEH:true},
 hb:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=J.mQ(C.HE[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
 $isEH:true},
 Kd:{
-"^":"Tp:115;",
-$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return P.jW(C.Wd,a,C.xM,!1)},
 $isEH:true},
 yZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
 z=this.b
 z.KF(P.jW(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"$2",null,4,0,null,49,[],30,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},
 $isEH:true},
 Gs:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"$1",null,2,0,null,382,[],"call"],
+return z},
 $isEH:true},
 pm:{
-"^":"Tp:380;",
-$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,382,[],"call"],
+"^":"Tp:152;",
+$1:function(a){return 97<=a&&a<=102},
 $isEH:true},
 Tw:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=J.mQ(C.kg[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
 $isEH:true},
 wm:{
-"^":"Tp:381;b,c,d",
-$1:[function(a){var z,y
+"^":"Tp:153;b,c,d",
+$1:function(a){var z,y
 z=this.b
-y=C.xB.j(z,a)
+y=J.lE(z,a)
 if(this.d.$1(y)===!0)return y-32
 else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},"$1",null,2,0,null,15,[],"call"],
+else return y},
 $isEH:true},
 FB:{
-"^":"Tp:381;e",
-$1:[function(a){var z,y,x,w
-for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
-if(48<=w&&w<=57)y=y*16+w-48
-else{w|=32
-if(97<=w&&w<=102)y=y*16+w-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return y},"$1",null,2,0,null,15,[],"call"],
+"^":"Tp:153;e",
+$1:function(a){var z,y,x,w,v
+for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
+if(48<=v&&v<=57)x=x*16+v-48
+else{v|=32
+if(97<=v&&v<=102)x=x*16+v-97+10
+else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
 $isEH:true},
 Lk:{
-"^":"Tp:125;a,f",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:21;a,f",
+$0:function(){var z,y,x,w,v
 z=this.a
 y=z.b
 x=z.c
 w=this.f
 v=z.a
-if(y==null)z.b=P.p9(C.xB.Nj(w,x,v))
-else y.KF(C.xB.Nj(w,x,v))},"$0",null,0,0,null,"call"],
+if(y==null)z.b=P.p9(J.Nj(w,x,v))
+else y.KF(J.Nj(w,x,v))},
 $isEH:true},
 XZ:{
-"^":"Tp:384;",
-$2:[function(a,b){var z=J.v1(a)
+"^":"Tp:154;",
+$2:function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"$2",null,4,0,null,383,[],254,[],"call"],
+return b*31+z&1073741823},
 $isEH:true},
 Mx:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"$1",null,2,0,null,22,[],"call"],
+"^":"Tp:49;",
+$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
 $isEH:true},
 C9:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,385,[],"call"],
+return z},"$1",null,2,0,null,155,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"$1",null,2,0,null,22,[],"call"],
+"^":"Tp:49;",
+$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
 $isEH:true},
 JT:{
-"^":"Tp:386;a,b",
-$2:[function(a,b){var z,y
+"^":"Tp:156;a,b",
+$2:function(a,b){var z,y
 if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(C.xB.Nj(this.a,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"$2",null,4,0,null,134,[],135,[],"call"],
+return z},
 $isEH:true},
 d9:{
-"^":"Tp:115;c",
-$1:[function(a){var z=J.x(a)
+"^":"Tp:16;c",
+$1:function(a){var z=J.x(a)
 if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},"$1",null,2,0,null,30,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},
 $isEH:true},
 rI:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=J.Wx(a)
+"^":"Tp:75;",
+$2:function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,387,[],388,[],"call"],
+b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"$1","pq",2,0,228,21,[]],
-r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],229,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,230,[],231,[],232,[]],
-lt:[function(a,b,c,d,e,f,g,h){var z,y,x
+return"transitionend"},"$1","pq",2,0,61,7,[]],
+r3:function(a,b){return document.createElement(a)},
+Kn:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+lt:function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
 C.W3.eo(x,"GET",a,!0)
 z=C.fK.aM(x)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.iO(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
+H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,230,[],233,[],231,[],234,[],235,[],236,[],237,[],232,[]],
+return y.MM},
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-C0:[function(a,b){a=536870911&a+b
+C0:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","jx",4,0,null,238,[],30,[]],
-Pv:[function(a){if(a==null)return
-return W.P1(a)},"$1","Ie",2,0,null,239,[]],
-qc:[function(a){var z
+return a^a>>>6},
+Pv:function(a){if(a==null)return
+return W.P1(a)},
+qc:function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
 if(!!J.x(z).$isD0)return z
-return}else return a},"$1","Wq",2,0,null,21,[]],
-qr:[function(a){return a},"$1","Ku",2,0,null,21,[]],
-Pd:[function(a){if(!!J.x(a).$isYN)return a
-return P.o7(a,!0)},"$1","ra",2,0,null,99,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"$2","AD",4,0,null,240,[],7,[]],
-GO:[function(a){return J.TD(a)},"$1","V5",2,0,115,48,[]],
-Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,115,48,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,241,48,[],12,[],242,[],243,[]],
-wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+return}else return a},
+qr:function(a){return a},
+Pd:function(a){if(!!J.x(a).$isYN)return a
+return P.o7(a,!0)},
+YT:function(a,b){return new W.vZ(a,b)},
+GO:[function(a){return J.TD(a)},"$1","V5",2,0,16,62,[]],
+Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,16,62,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,63,62,[],64,[],65,[],66,[]],
+wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
@@ -7710,19 +7748,19 @@
 Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
 q={prototype:s}
 if(!v)q.extends=e
-b.registerElement(c,q)},"$5","uz",10,0,null,97,[],244,[],102,[],11,[],245,[]],
-aF:[function(a){if(J.de($.X3,C.NU))return a
+b.registerElement(c,q)},
+aF:function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},"$1","Rj",2,0,null,164,[]],
-K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"$1","o6",2,0,null,164,[]],
+return $.X3.oj(a,!0)},
+K2:function(a){if(J.de($.X3,C.NU))return a
+return $.X3.PT(a,!0)},
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|rm|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|Mv|V20|oM|V21|iL|V22|F1i|XP|V23|NQ|V24|ov|x4|knI|V25|fI|V26|zMr|V27|nk|V28|ob|Bc|Uj|V29|xT|V30|uwf|I5|V31|en"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|bf|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|V15|F1|V16|aQ|V17|Qa|V18|Ww|V19|tz|V20|Mv|V21|Zt|V22|iL|V23|F1i|XP|V24|NQ|V25|ov|x4|kn|V26|fI|V27|zMr|V28|nk|V29|ob|Bc|Uj|V30|xT|V31|uwf|I5|V32|SC"},
 zw:{
 "^":"Gv;",
-$isList:true,
-$asWO:function(){return[W.nX]},
+$iszM:true,
+$aszM:function(){return[W.nX]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.nX]},
@@ -7789,7 +7827,7 @@
 Kb:function(a,b){return a.getElementById(b)},
 ek:function(a,b,c){return a.importNode(b,c)},
 gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
+gVl:function(a){return C.T1.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 gVY:function(a){return C.DK.aM(a)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
@@ -7797,7 +7835,7 @@
 pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isYN:true,
 "%":"Document|HTMLDocument|XMLDocument"},
-Aj:{
+hN:{
 "^":"KV;",
 gwd:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.e7(a)),[null])
 return a._docChildren},
@@ -7836,6 +7874,9 @@
 Ja:function(a,b){return a.querySelector(b)},
 pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
+sDD:function(a,b){var z=this.gDD(a)
+z.V1(0)
+z.FV(z,b)},
 gwl:function(a){return P.T7(a.clientLeft,a.clientTop,a.clientWidth,a.clientHeight,null)},
 gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
 i4:function(a){},
@@ -7859,7 +7900,7 @@
 PN:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
 gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
+gVl:function(a){return C.T1.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
@@ -7912,8 +7953,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -7965,7 +8006,7 @@
 "^":"qE;mH:href=,t5:type%",
 $isQj:true,
 "%":"HTMLLinkElement"},
-U4:{
+ZD:{
 "^":"Gv;cC:hash%,mH:href=",
 VD:function(a){return a.reload()},
 bu:function(a){return a.toString()},
@@ -8014,7 +8055,7 @@
 tH:{
 "^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
 "%":"MIDIInput;MIDIPort"},
-Wp:{
+Aj:{
 "^":"Mf;",
 nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
 return},
@@ -8025,7 +8066,7 @@
 z=W.qc(a.target)
 y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.AK(z)))
 return H.VM(new P.hL(J.XH(y.x),J.XH(y.y)),[null])}},
-$isWp:true,
+$isAj:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
 "^":"Gv;",
@@ -8083,8 +8124,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -8134,7 +8175,7 @@
 $islp:true,
 "%":"HTMLSelectElement"},
 I0:{
-"^":"Aj;",
+"^":"hN;",
 Kb:function(a,b){return a.getElementById(b)},
 $isI0:true,
 "%":"ShadowRoot"},
@@ -8224,7 +8265,7 @@
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 bu:function(a){return a.toString()},
 gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
+gVl:function(a){return C.T1.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 gVY:function(a){return C.DK.aM(a)},
 $isu9:true,
@@ -8263,7 +8304,7 @@
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
-SC:{
+Wp:{
 "^":"qE;",
 $isD0:true,
 "%":"HTMLFrameSetElement"},
@@ -8280,8 +8321,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -8300,8 +8341,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]},
@@ -8320,8 +8361,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]},
@@ -8364,7 +8405,7 @@
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asar:function(){return[W.cv]},
-$asWO:function(){return[W.cv]},
+$aszM:function(){return[W.cv]},
 $asQV:function(){return[W.cv]}},
 wz:{
 "^":"ar;Sn,Sc",
@@ -8378,14 +8419,15 @@
 np:function(a){return this.GT(a,null)},
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
+sDD:function(a,b){H.bQ(this.Sc,new W.BH(b))},
 gi9:function(a){return C.mt.Uh(this)},
-gVl:function(a){return C.pi.Uh(this)},
+gVl:function(a){return C.T1.Uh(this)},
 gLm:function(a){return C.i3.Uh(this)},
 gVY:function(a){return C.DK.Uh(this)},
 nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -8393,8 +8435,14 @@
 z.nJ(a,b)
 return z}}},
 B1:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$iscv},
+$isEH:true},
+BH:{
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
+J.H2(a,z)
+return z},
 $isEH:true},
 nX:{
 "^":"Gv;"},
@@ -8411,28 +8459,28 @@
 static:{"^":"fD"}},
 RAp:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Gb:{
 "^":"RAp+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:115;",
-$1:[function(a){return J.EC(a)},"$1",null,2,0,null,389,[],"call"],
-$isEH:true},
-Cs:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,390,[],30,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return J.EC(a)},"$1",null,2,0,null,157,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:115;b,c",
+"^":"Tp:75;a",
+$2:function(a,b){this.a.setRequestHeader(a,b)},
+$isEH:true},
+bU:{
+"^":"Tp:16;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -8441,11 +8489,11 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,21,[],"call"],
+y.OH(z)}else x.pm(a)},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(b!=null)this.a[a]=b},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
 e7:{
 "^":"ar;NL",
@@ -8492,61 +8540,61 @@
 return z[b]},
 $ise7:true,
 $asar:function(){return[W.KV]},
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
 nNL:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 ma:{
 "^":"nNL+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 yoo:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 ecX:{
 "^":"yoo+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 zLC:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]}},
 w1p:{
 "^":"zLC+Gm;",
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]}},
 dxW:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]}},
 kEI:{
 "^":"dxW+Gm;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]}},
@@ -8562,23 +8610,23 @@
 b.$2(y,this.t(0,y))}},
 gvc:function(){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[J.O])
+y=H.VM([],[P.qU])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
 if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
 y.push(J.O6(z[w]))}}return y},
 gUQ:function(a){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[J.O])
+y=H.VM([],[P.qU])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
 if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
 y.push(J.Vm(z[w]))}}return y},
 gl0:function(a){return this.gB(this)===0},
 gor:function(a){return this.gB(this)!==0},
 $isZ0:true,
-$asZ0:function(){return[J.O,J.O]}},
+$asZ0:function(){return[P.qU,P.qU]}},
 Zc:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,374,[],121,[],"call"],
+"^":"Tp:75;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,158,[],70,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
@@ -8594,7 +8642,7 @@
 FJ:function(a){return a.namespaceURI==null}},
 nF:{
 "^":"As;QX,Kd",
-lF:function(){var z=P.Ls(null,null,null,J.O)
+lF:function(){var z=P.Ls(null,null,null,P.qU)
 this.Kd.aN(0,new W.Si(z))
 return z},
 p5:function(a){var z,y
@@ -8610,38 +8658,38 @@
 z.yJ(a)
 return z}}},
 FK:{
-"^":"Tp:115;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 Si:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.FV(0,a.lF())},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a.FV(0,a.lF())},
 $isEH:true},
 vf:{
-"^":"Tp:115;a",
-$1:[function(a){return a.OS(this.a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.OS(this.a)},
 $isEH:true},
 Iw:{
-"^":"Tp:115;a,b",
-$1:[function(a){return a.O4(this.a,this.b)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return a.O4(this.a,this.b)},
 $isEH:true},
 Fc:{
-"^":"Tp:115;a",
-$1:[function(a){return J.V1(a,this.a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.V1(a,this.a)},
 $isEH:true},
 hD:{
-"^":"Tp:300;a",
-$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,391,[],142,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
 "^":"As;MW",
 lF:function(){var z,y,x
-z=P.Ls(null,null,null,J.O)
+z=P.Ls(null,null,null,P.qU)
 for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))}},
-UC:{
+e0:{
 "^":"a;Ph",
 zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
 aM:function(a){return this.zc(a,!1)},
@@ -8663,13 +8711,13 @@
 return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},
 $isqh:true},
 ie:{
-"^":"Tp:115;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.eI(J.l2(a),this.a)},
 $isEH:true},
 Ea:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
 $1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+return a},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
@@ -8687,13 +8735,13 @@
 yI:function(a){return this.KR(a,null,null,null)},
 $isqh:true},
 i2:{
-"^":"Tp:115;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.eI(J.l2(a),this.a)},
 $isEH:true},
 b0:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
 $1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+return a},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
@@ -8724,10 +8772,10 @@
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.cO(0)},"$0","gJK",0,0,125],
+this.aV.cO(0)},"$0","gJK",0,0,21],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 bO:{
@@ -8749,8 +8797,8 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -8758,7 +8806,7 @@
 "^":"ar;xa",
 gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
 gB:function(a){return this.xa.length},
-h:function(a,b){J.bi(this.xa,b)},
+h:function(a,b){J.wT(this.xa,b)},
 Rz:function(a,b){return J.V1(this.xa,b)},
 V1:function(a){J.U2(this.xa)},
 t:function(a,b){var z=this.xa
@@ -8794,11 +8842,11 @@
 return!1},
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
 $1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,48,[],"call"],
+return this.a(a)},"$1",null,2,0,null,62,[],"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
@@ -8810,8 +8858,8 @@
 On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isD0:true,
-static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+static:{P1:function(a){if(a===window)return a
+else return new W.dW(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -8866,7 +8914,7 @@
 ca:{
 "^":"d5;x=,y=",
 "%":"SVGFEPointLightElement"},
-zu:{
+zt:{
 "^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 eW:{
@@ -8899,7 +8947,7 @@
 Ac:{
 "^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-MU:{
+jr:{
 "^":"Yz;fg:height=,R:width=,x=,y=",
 "%":"SVGRectElement"},
 nd:{
@@ -8917,7 +8965,7 @@
 J.r4(z.h2.NL)
 z.FV(0,b)},
 gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
+gVl:function(a){return C.T1.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
@@ -8947,7 +8995,7 @@
 "^":"As;LO",
 lF:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,J.O)
+y=P.Ls(null,null,null,P.qU)
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},
@@ -8962,16 +9010,16 @@
 $ishq:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},"$2$captureThis","oo",2,3,null,223,128,[],247,[]],
+xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,164,[],247,[],180,[],90,[]],
-Dm:[function(a,b,c){var z
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,47,[],67,[],33,[],68,[]],
+Dm:function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
-return!0}catch(z){H.Ru(z)}return!1},"$3","Iy",6,0,null,99,[],12,[],30,[]],
-Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"$2","OP",4,0,null,99,[],12,[]],
+return!0}catch(z){H.Ru(z)}return!1},
+Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
+return},
 wY:[function(a){var z
 if(a==null)return
 else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
@@ -8980,10 +9028,10 @@
 else if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,115,99,[]],
-hE:[function(a,b,c){var z=P.Om(a,b)
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,16,69,[]],
+hE:function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","dw",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
@@ -8991,13 +9039,13 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,206,99,[]],
-ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
+else return P.ND(a)}},"$1","Xl",2,0,54,69,[]],
+ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},"$1","ln",2,0,null,99,[]],
-iQ:[function(a,b,c){var z=P.Om(a,b)
+else return P.iQ(a,$.Iq(),new P.QS())},
+iQ:function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","yF",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
 E4:{
 "^":"a;eh",
 t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
@@ -9025,9 +9073,9 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).$1(a)},"$1","Ij",2,0,null,248,[]]}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Gn(P.UD(null,null)).$1(a)}}},
 Gn:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -9038,7 +9086,7 @@
 x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,99,[],"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,69,[],"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh"},
@@ -9077,61 +9125,61 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 GT:function(a,b){this.V7("sort",[b])},
 np:function(a){return this.GT(a,null)},
-static:{BE:[function(a,b,c){var z=J.Wx(a)
+static:{BE:function(a,b,c){var z=J.Wx(a)
 if(z.C(a,0)||z.D(a,c))throw H.b(P.TE(a,0,c))
 z=J.Wx(b)
-if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))},"$3","d6",6,0,null,134,[],135,[],249,[]]}},
+if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))}}},
 Wk:{
 "^":"E4+lD;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"Tp:115;",
-$1:[function(a){var z=P.xZ(a,!1)
+"^":"Tp:16;",
+$1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},"$1",null,2,0,null,99,[],"call"],
+return z},
 $isEH:true},
 Hp:{
-"^":"Tp:115;a",
-$1:[function(a){return new this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"Tp:115;",
-$1:[function(a){return new P.r7(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return new P.r7(a)},
 $isEH:true},
 Jd:{
-"^":"Tp:115;",
-$1:[function(a){return H.VM(new P.Tz(a),[null])},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return H.VM(new P.Tz(a),[null])},
 $isEH:true},
 QS:{
-"^":"Tp:115;",
-$1:[function(a){return new P.E4(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return new P.E4(a)},
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
-VC:[function(a,b){a=536870911&a+b
+VC:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","hj",4,0,null,238,[],30,[]],
-Up:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+return a^a>>>6},
+Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
 a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Hj",2,0,null,238,[]],
-J:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return 536870911&a+((16383&a)<<15>>>0)},
+J:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return b
 if(a<b)return a
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
 if(a===0&&C.ON.gzP(b)||C.ON.gG0(b))return b
-return a}return a},"$2","yT",4,0,null,117,[],199,[]],
-y:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return a}return a},
+y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return a
 if(a<b)return b
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"$2","Rb",4,0,null,117,[],199,[]],
+return a},
 mg:{
 "^":"a;",
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
@@ -9233,14 +9281,20 @@
 $ishL:true},
 HDe:{
 "^":"a;",
-gT8:function(a){var z=this.gBb(this)
+gT8:function(a){var z,y
+z=this.gBb(this)
+y=this.R
 if(typeof z!=="number")return z.g()
-return z+this.R},
-gQG:function(a){var z=this.gG6(this)
+if(typeof y!=="number")return H.s(y)
+return z+y},
+gQG:function(a){var z,y
+z=this.gG6(this)
+y=this.fg
 if(typeof z!=="number")return z.g()
-return z+this.fg},
-bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},
-n:function(a,b){var z,y,x
+if(typeof y!=="number")return H.s(y)
+return z+y},
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+H.d(this.R)+" x "+H.d(this.fg)},
+n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$istn)return!1
@@ -9249,20 +9303,26 @@
 if(y==null?x==null:y===x){y=this.G6
 x=z.gG6(b)
 if(y==null?x==null:y===x){x=this.Bb
+w=this.R
 if(typeof x!=="number")return x.g()
-if(x+this.R===z.gT8(b)){if(typeof y!=="number")return y.g()
-z=y+this.fg===z.gQG(b)}else z=!1}else z=!1}else z=!1
+if(typeof w!=="number")return H.s(w)
+if(x+w===z.gT8(b)){x=this.fg
+if(typeof y!=="number")return y.g()
+if(typeof x!=="number")return H.s(x)
+z=y+x===z.gQG(b)}else z=!1}else z=!1}else z=!1
 return z},
-giO:function(a){var z,y,x,w
+giO:function(a){var z,y,x,w,v,u
 z=J.v1(this.gBb(this))
 y=this.G6
 x=J.v1(y)
 w=this.Bb
+v=this.R
 if(typeof w!=="number")return w.g()
-w=w+this.R&0x1FFFFFFF
+if(typeof v!=="number")return H.s(v)
+u=this.fg
 if(typeof y!=="number")return y.g()
-y=y+this.fg&0x1FFFFFFF
-return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w),y))},
+if(typeof u!=="number")return H.s(u)
+return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w+v&0x1FFFFFFF),y+u&0x1FFFFFFF))},
 gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
@@ -9279,14 +9339,14 @@
 else y=d
 return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
-re:[function(a){var z,y
+re:function(a){var z,y
 z=J.x(a)
 if(!z.$isuq||z.n(a,C.HH))throw H.b(P.u(H.d(a)+" does not denote a class"))
 y=P.o1(a)
 if(!J.x(y).$isMs)throw H.b(P.u(H.d(a)+" does not denote a class"))
-return y.gJi()},"$1","vG",2,0,null,49,[]],
-o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"$1","o9",2,0,null,49,[]],
+return y.gJi()},
+o1:function(a){if(J.de(a,C.HH)){$.Cm().toString
+return $.P8()}return H.jO(a.gLU())},
 QF:{
 "^":"a;",
 $isQF:true},
@@ -9336,7 +9396,7 @@
 WS4:{
 "^":"a;ew,oQ,Js,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
-ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","aV",0,0,null],
+ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
 Gj:{
 "^":"mAS;EV"},
 mAS:{
@@ -9366,7 +9426,6 @@
 Rz:function(a,b){return this.EV.Rz(0,b)},
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
-bu:function(a){return P.vW(this.EV)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
 UI:function(a){a.toString
@@ -9377,7 +9436,6 @@
 return a},
 WZ:{
 "^":"Gv;",
-gbx:function(a){return C.PT},
 $isWZ:true,
 "%":"ArrayBuffer"},
 pF:{
@@ -9393,12 +9451,10 @@
 "%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
 df:{
 "^":"pF;",
-gbx:function(a){return C.T1},
 $isHY:true,
 "%":"DataView"},
 Hg:{
 "^":"Dg;",
-gbx:function(a){return C.hN},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9407,16 +9463,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.Pp]},
+$asQV:function(){return[P.CP]},
 $isHY:true,
 "%":"Float32Array"},
 fS:{
 "^":"Dg;",
-gbx:function(a){return C.lk},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9425,16 +9480,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.Pp]},
+$asQV:function(){return[P.CP]},
 $isHY:true,
 "%":"Float64Array"},
 PS:{
 "^":"Pg;",
-gbx:function(a){return C.jV},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9443,16 +9497,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"Int16Array"},
 dE:{
 "^":"Pg;",
-gbx:function(a){return C.Im},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9461,16 +9514,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"Int32Array"},
-IJ:{
+Eb:{
 "^":"Pg;",
-gbx:function(a){return C.la},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9479,16 +9531,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"Int8Array"},
 us:{
 "^":"Pg;",
-gbx:function(a){return C.iG},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9497,16 +9548,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"Uint16Array"},
 qe:{
 "^":"Pg;",
-gbx:function(a){return C.Vh},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9515,16 +9565,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"Uint32Array"},
 eE:{
 "^":"Pg;",
-gbx:function(a){return C.nG},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
@@ -9534,16 +9583,15 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
 "^":"Pg;",
-gbx:function(a){return C.eY},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
@@ -9553,11 +9601,11 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
 $isHY:true,
 "%":";Uint8Array"},
 b0B:{
@@ -9582,18 +9630,18 @@
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true,
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.Pp]}},
+$asQV:function(){return[P.CP]}},
 Ui:{
 "^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.Pp]}},
+$asQV:function(){return[P.CP]}},
 Ip:{
 "^":"Ui+SU7;"},
 Pg:{
@@ -9602,36 +9650,36 @@
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isPg:true,
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]}},
+$asQV:function(){return[P.KN]}},
 ObS:{
 "^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.bU]}},
+$asQV:function(){return[P.KN]}},
 nA:{
 "^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
 "^":"",
-qw:[function(a){if(typeof dartPrint=="function"){dartPrint(a)
+qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 Ir:{
-"^":["D13;Py%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,310,"error",307,330],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,311,30,[],"error",307],
+"^":["D13;Py%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,85,"error",82,104],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,86,27,[],"error",82],
 "@":function(){return[C.uW]},
 static:{hG:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9639,29 +9687,29 @@
 a.X0=w
 C.OD.ZL(a)
 C.OD.oX(a)
-return a},null,null,0,0,126,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[392],
+return a},null,null,0,0,22,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[159],
 D13:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
-rm:{
-"^":["WZq;a3%-347,Ab%-347,Ln%-393,y4%-394,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.a3},null,null,1,0,312,"text",307,308],
-sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",307],
-gzW:[function(a){return a.Ab},null,null,1,0,312,"lineMode",307,308],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",307],
-gFR:[function(a){return a.Ln},null,null,1,0,395,"callback",307,330],
+bf:{
+"^":["WZq;a3%-125,Ab%-125,Ln%-160,y4%-161,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.a3},null,null,1,0,87,"text",82,83],
+sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,8,27,[],"text",82],
+gzW:[function(a){return a.Ab},null,null,1,0,87,"lineMode",82,83],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,8,27,[],"lineMode",82],
+gFR:[function(a){return a.Ln},null,null,1,0,162,"callback",82,104],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,396,30,[],"callback",307],
-gPK:[function(a){return a.y4},null,null,1,0,397,"results",307,308],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,398,30,[],"results",307],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,163,27,[],"callback",82],
+gPK:[function(a){return a.y4},null,null,1,0,164,"results",82,83],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,165,27,[],"results",82],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
 if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,343,21,[],344,[],82,[],"updateLineMode"],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,120,7,[],121,[],119,[],"updateLineMode"],
 kk:[function(a,b,c,d){var z,y,x
 J.zJ(b)
 z=a.a3
@@ -9670,15 +9718,15 @@
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,343,21,[],344,[],82,[],"eval"],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,120,7,[],121,[],119,[],"eval"],
 A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,399,21,[],"selectExpr"],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,166,7,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
 y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.Ab="1-line"
@@ -9688,39 +9736,39 @@
 a.X0=v
 C.Gh.ZL(a)
 C.Gh.oX(a)
-return a},null,null,0,0,126,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[400],
+return a},null,null,0,0,22,"new EvalBoxElement$created"]}},
+"+EvalBoxElement":[167],
 WZq:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Tp:115;a-85",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,115,57,[],"call"],
+"^":"Tp:16;a-29",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,16,168,[],"call"],
 $isEH:true},
-"+ YW":[346]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"+ YW":[124]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Lt:{
-"^":["Nr;TS%-335,bY%-85,jv%-347,oy%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.TS},null,null,1,0,348,"busy",307,308],
-sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,349,30,[],"busy",307],
-gFR:[function(a){return a.bY},null,null,1,0,126,"callback",307,330],
+"^":["Nr;TS%-109,bY%-29,jv%-125,oy%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.TS},null,null,1,0,126,"busy",82,83],
+sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,127,27,[],"busy",82],
+gFR:[function(a){return a.bY},null,null,1,0,22,"callback",82,104],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,115,30,[],"callback",307],
-gNW:[function(a){return a.jv},null,null,1,0,312,"expr",307,330],
-sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,32,30,[],"expr",307],
-gyG:[function(a){return a.oy},null,null,1,0,310,"result",307,330],
-syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,311,30,[],"result",307],
-hT:[function(a,b,c,d){var z=a.TS
+sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,16,27,[],"callback",82],
+gNW:[function(a){return a.jv},null,null,1,0,87,"expr",82,104],
+sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,8,27,[],"expr",82],
+gyG:[function(a){return a.oy},null,null,1,0,85,"result",82,104],
+syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,86,27,[],"result",82],
+wB:[function(a,b,c,d){var z=a.TS
 if(z===!0)return
 if(a.bY!=null){a.TS=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Ou(a)).YM(new R.tM(a))}},"$3","gDf",6,0,352,117,[],199,[],289,[],"evalNow"],
+this.LY(a,a.jv).ml(new R.Ou(a)).YM(new R.tM(a))}},"$3","gDf",6,0,130,53,[],57,[],123,[],"evalNow"],
 "@":function(){return[C.Vn]},
 static:{fL:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.TS=!1
@@ -9732,35 +9780,35 @@
 a.X0=w
 C.UF.ZL(a)
 C.UF.oX(a)
-return a},null,null,0,0,126,"new EvalLinkElement$created"]}},
-"+EvalLinkElement":[401],
+return a},null,null,0,0,22,"new EvalLinkElement$created"]}},
+"+EvalLinkElement":[169],
 Nr:{
 "^":"xc+Pi;",
 $isd3:true},
 Ou:{
-"^":"Tp:311;a-85",
+"^":"Tp:86;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,311,101,[],"call"],
+y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,86,92,[],"call"],
 $isEH:true},
-"+ Ou":[346],
+"+ Ou":[124],
 tM:{
-"^":"Tp:126;b-85",
+"^":"Tp:22;b-29",
 $0:[function(){var z,y
 z=this.b
 y=J.RE(z)
-y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,126,"call"],
+y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,22,"call"],
 $isEH:true},
-"+ tM":[346]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ tM":[124]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 UL:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
 static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -9769,19 +9817,19 @@
 a.X0=w
 C.MC.ZL(a)
 C.MC.oX(a)
-return a},null,null,0,0,126,"new FieldRefElement$created"]}},
-"+FieldRefElement":[336]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a},null,null,0,0,22,"new FieldRefElement$created"]}},
+"+FieldRefElement":[110]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 jM:{
-"^":["pva;vt%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,329,"field",307,330],
-st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,331,30,[],"field",307],
-pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["pva;vt%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,103,"field",82,104],
+st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,105,27,[],"field",82],
+pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.vc]},
-static:{bH:[function(a){var z,y,x,w
+static:{Sy:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9789,18 +9837,18 @@
 a.X0=w
 C.LT.ZL(a)
 C.LT.oX(a)
-return a},null,null,0,0,126,"new FieldViewElement$created"]}},
-"+FieldViewElement":[402],
+return a},null,null,0,0,22,"new FieldViewElement$created"]}},
+"+FieldViewElement":[170],
 pva:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 qW:{
-"^":["rs;lh%-335,qe%-335,zg%-335,Fs%-335,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,348,"qualified",307,330],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,349,30,[],"qualified",307],
-aZ:[function(a,b){var z,y,x
-Q.xI.prototype.aZ.call(this,a,b)
+"^":["rs;lh%-109,qe%-109,zg%-109,Fs%-109,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,126,"qualified",82,104],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,127,27,[],"qualified",82],
+P9:[function(a,b){var z,y,x
+Q.xI.prototype.P9.call(this,a,b)
 this.ct(a,C.D2,0,1)
 this.ct(a,C.mP,0,1)
 z=a.tY
@@ -9812,18 +9860,18 @@
 a.qe=this.ct(a,C.D2,a.qe,x)
 if(y){y=J.U6(z)
 y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,169,242,[],"refChanged"],
-gSY4:[function(a){return a.qe},null,null,1,0,348,"hasParent",307,308],
-sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,349,30,[],"hasParent",307],
-gE7:[function(a){return a.zg},null,null,1,0,348,"hasClass",307,308],
-sE7:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,349,30,[],"hasClass",307],
-gmN:[function(a){return a.Fs},null,null,1,0,348,"isDart",307,308],
-smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,349,30,[],"isDart",307],
+a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,26,65,[],"refChanged"],
+gSY4:[function(a){return a.qe},null,null,1,0,126,"hasParent",82,83],
+sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,127,27,[],"hasParent",82],
+gIO:[function(a){return a.zg},null,null,1,0,126,"hasClass",82,83],
+sIO:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,127,27,[],"hasClass",82],
+gmN:[function(a){return a.Fs},null,null,1,0,126,"isDart",82,83],
+smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,127,27,[],"isDart",82],
 "@":function(){return[C.o3]},
 static:{Wz:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.lh=!0
@@ -9836,20 +9884,20 @@
 a.X0=w
 C.Xo.ZL(a)
 C.Xo.oX(a)
-return a},null,null,0,0,126,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[403],
+return a},null,null,0,0,22,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[171],
 rs:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["cda;De%-327,Iu%-347,Ru%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.De},null,null,1,0,329,"function",307,330],
-sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,331,30,[],"function",307],
-gUx:[function(a){return a.Iu},null,null,1,0,312,"qualifiedName",307,330],
-sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,32,30,[],"qualifiedName",307],
-gfY:[function(a){return a.Ru},null,null,1,0,312,"kind",307,330],
-sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,32,30,[],"kind",307],
+"^":["cda;De%-101,Iu%-125,Ru%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.De},null,null,1,0,103,"function",82,104],
+sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,105,27,[],"function",82],
+gUx:[function(a){return a.Iu},null,null,1,0,87,"qualifiedName",82,104],
+sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,8,27,[],"qualifiedName",82],
+gfY:[function(a){return a.Ru},null,null,1,0,87,"kind",82,104],
+sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,8,27,[],"kind",82],
 FW:[function(a,b){var z,y,x
 z=b!=null
 y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
@@ -9858,7 +9906,7 @@
 z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
 x=z?J.UQ(b,"owner"):null
 if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,404,17,[],"_getQualifiedName"],
+return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,172,173,[],"_getQualifiedName"],
 ql:[function(a,b){var z,y
 this.ct(a,C.AO,0,1)
 this.ct(a,C.fy,0,1)
@@ -9891,13 +9939,13 @@
 case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
 break
 default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
-break}},"$1","gNC",2,0,169,242,[],"functionChanged"],
-pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+break}},"$1","gNC",2,0,26,65,[],"functionChanged"],
+pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9905,43 +9953,43 @@
 a.X0=w
 C.h4.ZL(a)
 C.h4.oX(a)
-return a},null,null,0,0,126,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[405],
+return a},null,null,0,0,22,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[174],
 cda:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
 Qb:{
 "^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,406],
+F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,175],
 gvH:function(a){return J.Ts(this.mS,4)},
-static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
-return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
+static:{"^":"Q0",x6:function(a,b){var z=J.RE(b)
+return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.eY(a)),z.gx(b)),4))}}},
 uc:{
 "^":"a;Yu<,tL"},
 pL:{
-"^":["waa;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-347,Oh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gys:[function(a){return a.PA},null,null,1,0,312,"status",307,308],
-sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",307],
-gyw:[function(a){return a.Oh},null,null,1,0,329,"fragmentation",307,330],
-syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,331,30,[],"fragmentation",307],
+"^":["waa;hi%-29,An%-29,dW%-29,rM%-29,Ge%-29,UL%-29,PA%-125,Oh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,87,"status",82,83],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,8,27,[],"status",82],
+gyw:[function(a){return a.Oh},null,null,1,0,103,"fragmentation",82,104],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,105,27,[],"fragmentation",82],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
 J.oL(z).yI(this.gmo(a))
-J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,125,"enteredView"],
+J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,21,"enteredView"],
 LV:[function(a,b){var z,y,x
 for(z=J.GP(b),y=0;z.G();){x=z.gl()
 if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"$1","gzK",2,0,407,408,[],"_packColor"],
+y=y*256+x}return y},"$1","gzK",2,0,176,177,[],"_packColor"],
 tn:[function(a,b,c,d){var z,y
 z=a.UL
 y=J.uH(c,"@")
 if(0>=y.length)return H.e(y,0)
 J.kW(z,b,y[0])
 J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,409,410,[],12,[],408,[],"_addClass"],
+J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,178,179,[],64,[],177,[],"_addClass"],
 an:[function(a,b,c){var z,y,x,w,v,u,t
 for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
 x=J.U6(y)
@@ -9956,16 +10004,16 @@
 J.kW(t,w,x[0])
 J.kW(a.rM,w,u)
 J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.eK())},"$2","gUw",4,0,411,412,[],413,[],"_updateClassList"],
+this.tn(a,0,"",$.eK())},"$2","gUw",4,0,180,181,[],182,[],"_updateClassList"],
 LI:[function(a,b){var z=b==null?C.vT:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,414,410,[],"_classIdToRGBA"],
+return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,183,179,[],"_classIdToRGBA"],
 Ic:[function(a,b){var z,y,x
 z=O.x6(a.An,b)
 y=z.mS
 x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,415,416,[],"_classNameAt"],
+return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,184,185,[],"_classNameAt"],
 WE:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.vX(a.dW,J.YD(a.An))
+z=J.vX(a.dW,J.eY(a.An))
 y=J.Ts(O.x6(a.An,b).mS,4)
 x=J.Wx(y)
 w=x.Z(y,z)
@@ -9990,7 +10038,7 @@
 break}o+=2}x=H.BU(x.t(t,"object_start"),null,null)
 r=J.UQ(a.Oh,"unit_size_bytes")
 if(typeof r!=="number")return H.s(r)
-return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,417,416,[],"_objectAt"],
+return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,186,185,[],"_objectAt"],
 U8:[function(a,b){var z,y,x,w,v,u
 z=J.RE(b)
 y=this.WE(a,z.gD7(b))
@@ -10001,9 +10049,9 @@
 v=J.Cl(J.Qd(z.HW),w,J.WB(w,4))
 u=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,v)))
 z=J.de(u,"")?"-":H.d(u)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,399,316,[],"_handleMouseMove"],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,166,91,[],"_handleMouseMove"],
 f1:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,399,316,[],"_handleClick"],
+window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,166,91,[],"_handleClick"],
 My:[function(a){var z,y,x,w
 z=a.Oh
 if(z==null||a.hi==null)return
@@ -10019,9 +10067,9 @@
 if(typeof w!=="number")return H.s(w)
 w=P.f9(J.Vf(a.hi).createImageData(x,z*w))
 a.An=w
-J.No(a.hi,J.YD(w))
+J.No(a.hi,J.eY(w))
 J.OE(a.hi,J.kd(a.An))
-this.ps(a,0)},"$0","gCT",0,0,125,"_updateFragmentationData"],
+this.ps(a,0)},"$0","gCT",0,0,21,"_updateFragmentationData"],
 ps:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.UQ(a.Oh,"pages")
 y=J.U6(z)
@@ -10057,20 +10105,20 @@
 J.wp(n.gRn(o),y,x.g(y,4),l)
 v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
 x=a.An
-J.J4(y,x,0,0,0,w,J.YD(x),m)
-P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,418,419,[],"_renderPages"],
+J.J4(y,x,0,0,0,w,J.eY(x),m)
+P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,187,188,[],"_renderPages"],
 pA:[function(a,b){var z=a.Oh
 if(z==null)return
-J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,169,242,[],"fragmentationChanged"],
+J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,26,65,[],"fragmentationChanged"],
 "@":function(){return[C.Cu]},
-static:{"^":"nK<-85,RD<-85,SoT<-85",pn:[function(a){var z,y,x,w,v,u,t
+static:{"^":"nK<-29,RD<-29,SoT<-29",pn:[function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
 w=$.Nd()
-v=P.Py(null,null,null,J.O,W.I0)
-u=J.O
+v=P.Py(null,null,null,P.qU,W.I0)
+u=P.qU
 t=W.cv
 t=H.VM(new V.qC(P.Py(null,null,null,u,t),null,null),[u,t])
 a.rM=z
@@ -10081,41 +10129,41 @@
 a.X0=t
 C.pJ.ZL(a)
 C.pJ.oX(a)
-return a},null,null,0,0,126,"new HeapMapElement$created"]}},
-"+HeapMapElement":[420],
+return a},null,null,0,0,22,"new HeapMapElement$created"]}},
+"+HeapMapElement":[189],
 waa:{
 "^":"uL+Pi;",
 $isd3:true},
 WQ:{
-"^":"Tp:126;a-85,b-317",
-$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,126,"call"],
+"^":"Tp:22;a-29,b-93",
+$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,22,"call"],
 $isEH:true},
-"+ WQ":[346],
+"+ WQ":[124],
 aG:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,105,190,[],"call"],
 $isEH:true},
-"+ aG":[346],
+"+ aG":[124],
 aO:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
 $isEH:true},
-"+ aO":[346],
+"+ aO":[124],
 oc:{
-"^":"Tp:126;a-85",
-$0:[function(){J.vP(this.a)},"$0",null,0,0,126,"call"],
+"^":"Tp:22;a-29",
+$0:[function(){J.vP(this.a)},"$0",null,0,0,22,"call"],
 $isEH:true},
-"+ oc":[346]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"+ oc":[124]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["V4;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-423,Ol%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gLF:[function(a){return a.nc},null,null,1,0,424,"classTable",307,308],
-sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,425,30,[],"classTable",307],
-gB1:[function(a){return a.Ol},null,null,1,0,329,"profile",307,330],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,331,30,[],"profile",307],
+"^":["V4;GQ%-29,J0%-29,Oc%-29,CO%-29,nc%-192,Ol%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gLF:[function(a){return a.nc},null,null,1,0,193,"classTable",82,83],
+sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,194,27,[],"classTable",82],
+gB1:[function(a){return a.Ol},null,null,1,0,103,"profile",82,104],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,105,27,[],"profile",82],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
@@ -10128,10 +10176,10 @@
 z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
 a.CO=z
 z.bG.u(0,"title","Old Space")
-this.uB(a)},"$0","gQd",0,0,125,"enteredView"],
-hZ:[function(a){var z,y,x,w,v,u,t,s,r,q
+this.uB(a)},"$0","gQd",0,0,21,"enteredView"],
+hZ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=a.Ol
-if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+if(z==null||!J.x(J.UQ(z,"members")).$iszM||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
 a.nc.lb()
 for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 if(this.K1(a,y))continue
@@ -10142,81 +10190,85 @@
 t=this.VI(a,y,4)
 s=this.VI(a,y,5)
 r=this.VI(a,y,6)
-J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r]))}J.Yl(a.nc)
+q=this.VI(a,y,7)
+p=this.VI(a,y,8)
+J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.Yl(a.nc)
 a.GQ.lb()
-q=J.UQ(J.UQ(a.Ol,"heaps"),"new")
-z=J.U6(q)
-J.qK(a.GQ,["Used",z.t(q,"used")])
-J.qK(a.GQ,["Free",J.xH(z.t(q,"capacity"),z.t(q,"used"))])
-J.qK(a.GQ,["External",z.t(q,"external")])
+o=J.UQ(J.UQ(a.Ol,"heaps"),"new")
+z=J.U6(o)
+J.qK(a.GQ,["Used",z.t(o,"used")])
+J.qK(a.GQ,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
+J.qK(a.GQ,["External",z.t(o,"external")])
 a.Oc.lb()
-q=J.UQ(J.UQ(a.Ol,"heaps"),"old")
-z=J.U6(q)
-J.qK(a.Oc,["Used",z.t(q,"used")])
-J.qK(a.Oc,["Free",J.xH(z.t(q,"capacity"),z.t(q,"used"))])
-J.qK(a.Oc,["External",z.t(q,"external")])
-this.uB(a)},"$0","gYs",0,0,125,"_updateChartData"],
+o=J.UQ(J.UQ(a.Ol,"heaps"),"old")
+z=J.U6(o)
+J.qK(a.Oc,["Used",z.t(o,"used")])
+J.qK(a.Oc,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
+J.qK(a.Oc,["External",z.t(o,"external")])
+this.uB(a)},"$0","gYs",0,0,21,"_updateChartData"],
 uB:[function(a){var z=a.J0
 if(z==null)return
 z.W2(a.GQ)
-a.CO.W2(a.Oc)},"$0","goI",0,0,125,"_draw"],
+a.CO.W2(a.Oc)},"$0","goI",0,0,21,"_draw"],
 AE:[function(a,b,c,d){var z,y
 if(!!J.x(d).$isqk){z=a.nc.gxp()
 y=d.cellIndex
 if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.Yl(a.nc)}}},"$3","gQq",6,0,426,21,[],344,[],82,[],"changeSort",308],
+J.Yl(a.nc)}}},"$3","gQq",6,0,195,7,[],121,[],119,[],"changeSort",83],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"$1","gbU",2,0,427,121,[],"_classHasNoAllocations"],
+return!0},"$1","gbU",2,0,196,70,[],"_classHasNoAllocations"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
-case 1:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),7),J.UQ(z.t(b,"old"),7))
-case 2:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),6),J.UQ(z.t(b,"old"),6))
-case 3:return J.UQ(J.UQ(b,"old"),7)
-case 4:return J.UQ(J.UQ(b,"old"),6)
-case 5:z=J.U6(b)
-return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5)),J.UQ(z.t(b,"old"),3)),J.UQ(z.t(b,"old"),5))
-case 6:z=J.U6(b)
-return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4)),J.UQ(z.t(b,"old"),2)),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,428,121,[],15,[],"_combinedTableColumnValue"],
+case 1:return J.UQ(J.UQ(b,"new"),7)
+case 2:return J.UQ(J.UQ(b,"new"),6)
+case 3:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5))
+case 4:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4))
+case 5:return J.UQ(J.UQ(b,"old"),7)
+case 6:return J.UQ(J.UQ(b,"old"),6)
+case 7:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
+case 8:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,197,70,[],73,[],"_combinedTableColumnValue"],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 cQ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,169,332,[],"refreshGC"],
+J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,26,106,[],"refreshGC"],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,169,332,[],"resetAccumulator"],
+J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,26,106,[],"resetAccumulator"],
 pM:[function(a,b){var z,y,x,w
 try{this.hZ(a)}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 N.Jx("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,169,242,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,26,65,[],"profileChanged"],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,429,430,[],"formattedAverage",308],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,198,199,[],"formattedAverage",83],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,429,430,[],"formattedCollections",308],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,198,199,[],"formattedCollections",83],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,429,430,[],"formattedTotalCollectionTime",308],
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,198,199,[],"formattedTotalCollectionTime",83],
 Dd:[function(a){var z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
@@ -10226,14 +10278,14 @@
 z.Gl("string","Type")
 a.Oc.Gl("number","Size")
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator",G.AF()),new G.Kt("Accumulator",G.Vj()),new G.Kt("Accumulator (Old space)",G.AF()),new G.Kt("Accumulator (Old space)",G.Vj()),new G.Kt("Current",G.AF()),new G.Kt("Current",G.Vj())],z,[],0,!0,null,null))
+z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator Size (New)",G.AF()),new G.Kt("Accumulator (New)",G.Vj()),new G.Kt("Current Size (New)",G.AF()),new G.Kt("Current (New)",G.Vj()),new G.Kt("Accumulator Size (Old)",G.AF()),new G.Kt("Accumulator (Old)",G.Vj()),new G.Kt("Current Size (Old)",G.AF()),new G.Kt("Current (Old)",G.Vj())],z,[],0,!0,null,null))
 a.nc=z
-z.sxp(1)},null,null,0,0,126,"created"],
+z.sxp(1)},null,null,0,0,22,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-85,bQj<-85,xK<-85,V1g<-85,r1K<-85,qEV<-85,pC<-85,DY2<-85",Lz:[function(a){var z,y,x,w
+static:{"^":"BO<-29,bQj<-29,xK<-29,V1g<-29,r1K<-29,qEV<-29,pC<-29,DY2<-29",Lz:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10242,65 +10294,65 @@
 C.Vc.ZL(a)
 C.Vc.oX(a)
 C.Vc.Dd(a)
-return a},null,null,0,0,126,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[431],
+return a},null,null,0,0,22,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[200],
 V4:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
 $isEH:true},
-"+ nx":[346],
+"+ nx":[124],
 jm:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
 $isEH:true},
-"+ jm":[346],
+"+ jm":[124],
 AN:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
 $isEH:true},
-"+ AN":[346],
+"+ AN":[124],
 Ao:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
 $isEH:true},
-"+ Ao":[346],
+"+ Ao":[124],
 xj:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
 $isEH:true},
-"+ xj":[346],
+"+ xj":[124],
 VB:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
 $isEH:true},
-"+ VB":[346]}],["html_common","dart:html_common",,P,{
+"+ VB":[124]}],["html_common","dart:html_common",,P,{
 "^":"",
-bL:[function(a){var z,y
+bL:function(a){var z,y
 z=[]
 y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).$1(a)
 new P.wO().$0()
-return y},"$1","Lq",2,0,null,30,[]],
-o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,223,6,[],251,[]],
-f9:[function(a){var z,y
+return y},
+o7:function(a,b){var z=[]
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},
+f9:function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"$1","D3",2,0,null,252,[]],
-QO:[function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
-return a},"$1","Gg",2,0,null,253,[]],
+y.BYTES_PER_ELEMENT=1}return a}return new P.la(a.data,a.height,a.width)},
+QO:function(a){if(!!J.x(a).$isla)return{data:a.Rn,height:a.fg,width:a.R}
+return a},
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -10308,34 +10360,34 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:200;b,c",
-$1:[function(a){var z,y,x
+"^":"Tp:52;b,c",
+$1:function(a){var z,y,x
 z=this.b
 y=z.length
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
 $isEH:true},
 rG:{
-"^":"Tp:361;d",
-$1:[function(a){var z=this.d
+"^":"Tp:137;d",
+$1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,325,[],"call"],
+return z[a]},
 $isEH:true},
 yh:{
-"^":"Tp:432;e",
-$2:[function(a,b){var z=this.e
+"^":"Tp:201;e",
+$2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
+z[a]=b},
 $isEH:true},
 wO:{
-"^":"Tp:126;",
-$0:[function(){},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){},
 $isEH:true},
 Tm:{
-"^":"Tp:115;f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u
+"^":"Tp:16;f,UI,bK",
+$1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -10357,7 +10409,7 @@
 z.a=w
 this.bK.$2(x,w)
 y.aN(a,new P.ib(z,this))
-return z.a}if(!!y.$isList){v=y.gB(a)
+return z.a}if(!!y.$iszM){v=y.gB(a)
 x=this.f.$1(a)
 w=this.UI.$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
@@ -10367,37 +10419,37 @@
 u=0
 for(;u<v;++u){z=this.$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"$1",null,2,0,null,21,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
 ib:{
-"^":"Tp:300;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a,Gq",
+$2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
 $isEH:true},
 CA:{
-"^":"Tp:200;a,b",
-$1:[function(a){var z,y,x,w
+"^":"Tp:52;a,b",
+$1:function(a){var z,y,x,w
 z=this.a
 y=z.length
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
 $isEH:true},
 YL:{
-"^":"Tp:361;c",
-$1:[function(a){var z=this.c
+"^":"Tp:137;c",
+$1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,325,[],"call"],
+return z[a]},
 $isEH:true},
 KC:{
-"^":"Tp:432;d",
-$2:[function(a,b){var z=this.d
+"^":"Tp:201;d",
+$2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
+z[a]=b},
 $isEH:true},
 xL:{
-"^":"Tp:115;e,f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Tp:16;e,f,UI,bK",
+$1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
 if(typeof a==="number")return a
@@ -10421,11 +10473,11 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},"$1",null,2,0,null,21,[],"call"],
+return y}return a},
 $isEH:true},
-qS:{
+la:{
 "^":"a;Rn>,fg>,R>",
-$isqS:true,
+$isla:true,
 $isSg:true},
 As:{
 "^":"a;",
@@ -10444,9 +10496,11 @@
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
 ez:[function(a,b){var z=this.lF()
-return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,433,128,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,202],
 ev:function(a,b){var z=this.lF()
 return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
+Ft:[function(a,b){var z=this.lF()
+return H.VM(new H.kV(z,b),[H.ip(z,"mW",0),null])},"$1","git",2,0,203],
 Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -10475,24 +10529,24 @@
 this.p5(z)
 return y},
 $isz5:true,
-$asz5:function(){return[J.O]},
+$asz5:function(){return[P.qU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.O]}},
+$asQV:function(){return[P.qU]}},
 GE:{
-"^":"Tp:115;a",
-$1:[function(a){return a.h(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.h(0,this.a)},
 $isEH:true},
 rl:{
-"^":"Tp:115;a",
-$1:[function(a){return a.FV(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.FV(0,this.a)},
 $isEH:true},
 uQ:{
-"^":"Tp:115;",
-$1:[function(a){return a.V1(0)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return a.V1(0)},
 $isEH:true},
 D7:{
-"^":"ar;qt,h2",
+"^":"ar;ndS,h2",
 gzT:function(){var z=this.h2
 return P.F(z.ev(z,new P.hT()),!0,W.cv)},
 aN:function(a,b){H.bQ(this.gzT(),b)},
@@ -10529,36 +10583,36 @@
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$iscv},
 $isEH:true},
 GS:{
-"^":"Tp:115;",
-$1:[function(a){return J.QC(a)},"$1",null,2,0,null,295,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.QC(a)},
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 pR:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
 else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
 else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,312,"hoverText"],
-Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,126,"expander"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,87,"hoverText"],
+Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,22,"expander"],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,434,435,[],332,[],"expandEvent"],
+c.$0()}},"$2","gus",4,0,204,205,[],106,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{lu:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -10567,31 +10621,32 @@
 a.X0=w
 C.cp.ZL(a)
 C.cp.oX(a)
-return a},null,null,0,0,126,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[336],
+return a},null,null,0,0,22,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[110],
 Js:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
 a.szz(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
-y.ct(z,C.kY,0,1)},"$1",null,2,0,115,57,[],"call"],
+y.ct(z,C.kY,0,1)},"$1",null,2,0,16,168,[],"call"],
 $isEH:true},
-"+ Js":[346]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[124]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["V9;Xh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,329,"instance",307,330],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,331,30,[],"instance",307],
-vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-"@":function(){return[C.qlk]},
+"^":["V9;Xh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,103,"instance",82,104],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,105,27,[],"instance",82],
+vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"@":function(){return[C.be]},
 static:{Co:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10599,15 +10654,15 @@
 a.X0=w
 C.pU.ZL(a)
 C.pU.oX(a)
-return a},null,null,0,0,126,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[436],
+return a},null,null,0,0,22,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[206],
 V9:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
-"^":["Y2;B1>,SF<-437,H<-437,Zn@-347,vs@-347,ki@-347,Vh@-347,LH@-347,eT,yt-317,wd-318,oH-319,R7,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
-gtT:[function(a){return J.on(this.H)},null,null,1,0,339,"code",307],
+"^":["Y2;B1>,SF<-207,H<-207,Zn@-125,vs@-125,ki@-125,Vh@-125,LH@-125,eT,yt-93,wd-94,oH-95,R7,aZ,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,115,"code",82],
 C4:function(a){var z,y,x,w,v,u,t,s,r
 z=this.B1
 y=J.UQ(z,"threshold")
@@ -10620,6 +10675,7 @@
 if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
 w.h(x,X.SJ(z,t,s,this))}},
 o8:function(){},
+Nh:function(){return J.z8(J.q8(J.uw(this.H)),0)},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
@@ -10639,29 +10695,30 @@
 static:{SJ:function(a,b,c,d){var z,y
 z=H.VM([],[G.Y2])
 y=d!=null?J.WB(d.yt,1):0
-z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192",!1,null,null)
+z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
+z.k7(d)
 z.mW(a,b,c,d)
 return z}}},
 E7:{
-"^":["V10;pD%-327,zt%-335,eH%-347,NT%-347,Xv%-347,M5%-347,ik%-347,jS%-347,XX%-438,BJ%-347,qO=-85,Hm%-439,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,329,"profile",307,330],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,331,30,[],"profile",307],
-gPL:[function(a){return a.zt},null,null,1,0,348,"hideTagsChecked",307,308],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,349,30,[],"hideTagsChecked",307],
-gEW:[function(a){return a.eH},null,null,1,0,312,"sampleCount",307,308],
-sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",307],
-gUo:[function(a){return a.NT},null,null,1,0,312,"refreshTime",307,308],
-sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,32,30,[],"refreshTime",307],
-gEly:[function(a){return a.Xv},null,null,1,0,312,"sampleRate",307,308],
-sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",307],
-gIZ:[function(a){return a.M5},null,null,1,0,312,"sampleDepth",307,308],
-sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",307],
-gNG:[function(a){return a.ik},null,null,1,0,312,"displayCutoff",307,308],
-sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",307],
-gQl:[function(a){return a.jS},null,null,1,0,312,"timeSpan",307,308],
-sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,32,30,[],"timeSpan",307],
-gib:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",307,308],
-sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",307],
+"^":["V10;pD%-101,zt%-109,eH%-125,NT%-125,Xv%-125,M5%-125,ik%-125,jS%-125,XX%-208,BJ%-125,qO=-29,Hm%-209,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,103,"profile",82,104],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,105,27,[],"profile",82],
+gPL:[function(a){return a.zt},null,null,1,0,126,"hideTagsChecked",82,83],
+sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,127,27,[],"hideTagsChecked",82],
+gEW:[function(a){return a.eH},null,null,1,0,87,"sampleCount",82,83],
+sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,8,27,[],"sampleCount",82],
+gUo:[function(a){return a.NT},null,null,1,0,87,"refreshTime",82,83],
+sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,8,27,[],"refreshTime",82],
+gEly:[function(a){return a.Xv},null,null,1,0,87,"sampleRate",82,83],
+sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,8,27,[],"sampleRate",82],
+gIZ:[function(a){return a.M5},null,null,1,0,87,"sampleDepth",82,83],
+sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,8,27,[],"sampleDepth",82],
+gNG:[function(a){return a.ik},null,null,1,0,87,"displayCutoff",82,83],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,8,27,[],"displayCutoff",82],
+gQl:[function(a){return a.jS},null,null,1,0,87,"timeSpan",82,83],
+sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,8,27,[],"timeSpan",82],
+gib:[function(a){return a.BJ},null,null,1,0,87,"tagSelector",82,83],
+sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,8,27,[],"tagSelector",82],
 pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
@@ -10684,27 +10741,27 @@
 a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
 J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"$1","gwm",2,0,169,242,[],"profileChanged"],
+this.Cx(a)},"$1","gwm",2,0,26,65,[],"profileChanged"],
 i4:[function(a){var z=R.Jk([])
 a.Hm=new G.XN(z,null,null)
-this.Cx(a)},"$0","gQd",0,0,125,"enteredView"],
-m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,169,242,[],"tagSelectorChanged"],
+this.Cx(a)},"$0","gQd",0,0,21,"enteredView"],
+m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,26,65,[],"tagSelectorChanged"],
 pA:[function(a,b){var z="profile?tags="+H.d(a.BJ)
-J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 Cx:[function(a){if(a.pD==null)return
-this.EX(a)},"$0","gBn",0,0,125,"_update"],
+this.EX(a)},"$0","gBn",0,0,21,"_update"],
 EX:[function(a){var z,y,x,w,v
 z=J.QP(a.pD).gBC()
 if(z==null)return
 try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,125,"_buildStackTree"],
-ba:[function(a){this.EX(a)},"$0","gvr",0,0,125,"_buildTree"],
-ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,440,322,[],"padding",308],
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,21,"_buildStackTree"],
+ba:[function(a){this.EX(a)},"$0","gvr",0,0,21,"_buildTree"],
+ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,210,98,[],"padding",83],
 ZZ:[function(a,b){var z=J.bY(J.xH(b.gyt(),1),9)
 if(z>>>0!==z||z>=9)return H.e(C.Ym,z)
-return C.Ym[z]},"$1","gth",2,0,440,322,[],"coloring",308],
+return C.Ym[z]},"$1","gth",2,0,210,98,[],"coloring",83],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.de(J.F8(w.gN(b)),"expand")&&!J.de(w.gN(b),d))return
@@ -10715,12 +10772,12 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,426,21,[],344,[],82,[],"toggleExpanded",308],
+N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,195,7,[],121,[],119,[],"toggleExpanded",83],
 "@":function(){return[C.jR]},
-static:{"^":"B6<-85",jD:[function(a){var z,y,x,w
+static:{"^":"B6<-29",jD:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.eH=""
@@ -10737,27 +10794,27 @@
 a.X0=w
 C.kS.ZL(a)
 C.kS.oX(a)
-return a},null,null,0,0,126,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[441],
+return a},null,null,0,0,22,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[211],
 V10:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,331,202,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,105,212,[],"call"],
 $isEH:true},
-"+ SV":[346]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"+ SV":[124]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oO:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.j6]},
 static:{Zgg:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -10766,18 +10823,18 @@
 a.X0=w
 C.LN.ZL(a)
 C.LN.oX(a)
-return a},null,null,0,0,126,"new IsolateRefElement$created"]}},
-"+IsolateRefElement":[336]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a},null,null,0,0,22,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[110]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 Stq:{
-"^":["V11;Pw%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,306,"isolate",307,330],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,309,30,[],"isolate",307],
+"^":["V11;Pw%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,84,27,[],"isolate",82],
 "@":function(){return[C.aM]},
 static:{N5:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10785,14 +10842,14 @@
 a.X0=w
 C.Qt.ZL(a)
 C.Qt.oX(a)
-return a},null,null,0,0,126,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[443],
+return a},null,null,0,0,22,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[214],
 V11:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
 Lr:{
-"^":"a;hO,Pl",
+"^":"a;hO,YT",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.hO.Yb
 if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
@@ -10833,36 +10890,36 @@
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}},
 W2:function(a){var z,y
-if(this.Pl==null){z=P.L5(null,null,null,null,null)
+if(this.YT==null){z=P.L5(null,null,null,null,null)
 y=new G.qu(null,z)
 y.vR=P.zV(J.UQ($.NR,"SteppedAreaChart"),[a])
-this.Pl=y
+this.YT=y
 z.u(0,"isStacked",!0)
-this.Pl.bG.u(0,"connectSteps",!1)
-this.Pl.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.Pl.W2(this.hO)}},
+this.YT.bG.u(0,"connectSteps",!1)
+this.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.YT.W2(this.hO)}},
 qkb:{
-"^":["V12;oY%-442,ts%-444,e6%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.oY},null,null,1,0,306,"isolate",307,330],
-sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,309,30,[],"isolate",307],
+"^":["V12;oY%-213,ts%-215,e6%-216,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,84,27,[],"isolate",82],
 vV:[function(a,b){var z=a.oY
-return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,125,"_updateTagProfile"],
+return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,21,"_updateTagProfile"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,125,"enteredView"],
+a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,21,"enteredView"],
 xo:[function(a){var z
 Z.uL.prototype.xo.call(this,a)
 z=a.ts
-if(z!=null)z.ed()},"$0","gbt",0,0,125,"leftView"],
+if(z!=null)z.ed()},"$0","gbt",0,0,21,"leftView"],
 Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
-if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,125,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,352,117,[],199,[],289,[],"resume"],
+if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,21,"_drawTagProfileChart"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,130,53,[],57,[],123,[],"resume"],
 "@":function(){return[C.NG]},
 static:{uD:[function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.NR,"DataTable"),null)
 y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.e6=new L.Lr(new G.ig(z),null)
@@ -10871,27 +10928,27 @@
 a.X0=v
 C.Xe.ZL(a)
 C.Xe.oX(a)
-return a},null,null,0,0,126,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[446],
+return a},null,null,0,0,22,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[217],
 V12:{
 "^":"uL+Pi;",
 $isd3:true},
 BQ:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
 $1:[function(a){var z,y,x
 z=this.a
 y=J.RE(z)
 y.ge6(z).eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,115,447,[],"call"],
+y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,16,218,[],"call"],
 $isEH:true},
-"+ BQ":[346],
+"+ BQ":[124],
 IT:{
-"^":"Tp:115;a-85",
-$1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,115,57,[],"call"],
+"^":"Tp:16;a-29",
+$1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,16,168,[],"call"],
 $isEH:true},
-"+ IT":[346]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"+ IT":[124]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 fM:{
 "^":"a;Fv,lp",
@@ -10910,7 +10967,7 @@
 x.vM+=q
 this.KN(t,v)
 q=x.vM+=s?r:H.d(r)
-x.vM=q+"}\n"}else if(!!s.$isList){if(typeof "  "!=="number")return H.s("  ")
+x.vM=q+"}\n"}else if(!!s.$iszM){if(typeof "  "!=="number")return H.s("  ")
 r=b*"  "
 s=typeof r==="string"
 x.vM+=s?r:H.d(r)
@@ -10937,7 +10994,7 @@
 x.vM=s+"{\n"
 this.KN(v,w)
 s=x.vM+=u?t:H.d(t)
-x.vM=s+"}\n"}else if(!!u.$isList){if(typeof "  "!=="number")return H.s("  ")
+x.vM=s+"}\n"}else if(!!u.$iszM){if(typeof "  "!=="number")return H.s("  ")
 t=b*"  "
 u=typeof t==="string"
 s=x.vM+=u?t:H.d(t)
@@ -10950,12 +11007,12 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":["V13;OZ%-327,X7%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gIr:[function(a){return a.OZ},null,null,1,0,329,"map",307,330],
+"^":["V13;OZ%-101,X7%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gIr:[function(a){return a.OZ},null,null,1,0,103,"map",82,104],
 ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,331,30,[],"map",307],
-gdQ:[function(a){return a.X7},null,null,1,0,312,"mapAsString",307,308],
-sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,32,30,[],"mapAsString",307],
+sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,105,27,[],"map",82],
+gdQ:[function(a){return a.X7},null,null,1,0,87,"mapAsString",82,83],
+sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,8,27,[],"mapAsString",82],
 oC:[function(a,b){var z,y,x
 z=P.p9("")
 y=P.Ls(null,null,null,null)
@@ -10965,12 +11022,12 @@
 new Z.fM(z,y).KN(x,0)
 z.KF("}\n")
 z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,169,242,[],"mapChanged"],
+a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,26,65,[],"mapChanged"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10978,19 +11035,19 @@
 a.X0=w
 C.Yt.ZL(a)
 C.Yt.oX(a)
-return a},null,null,0,0,126,"new JsonViewElement$created"]}},
-"+JsonViewElement":[448],
+return a},null,null,0,0,22,"new JsonViewElement$created"]}},
+"+JsonViewElement":[219],
 V13:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -10999,20 +11056,20 @@
 a.X0=w
 C.Z3.ZL(a)
 C.Z3.oX(a)
-return a},null,null,0,0,126,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[336]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a},null,null,0,0,22,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[110]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V14;a1%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.a1},null,null,1,0,329,"library",307,330],
-stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,331,30,[],"library",307],
-vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["V14;a1%-220,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.a1},null,null,1,0,221,"library",82,104],
+stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,222,27,[],"library",82],
+vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -11020,8 +11077,8 @@
 a.X0=w
 C.MG.ZL(a)
 C.MG.oX(a)
-return a},null,null,0,0,126,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[449],
+return a},null,null,0,0,22,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[223],
 V14:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
@@ -11058,7 +11115,7 @@
 J4:function(a){return this.dL(a,null,null)},
 ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.ZG(a,null,null)},
-xH:function(a,b,c){return this.Y6(C.UP,a,b,c)},
+xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
 j2:function(a){return this.xH(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.cV,a,b,c)},
 hh:function(a){return this.WB(a,null,null)},
@@ -11074,17 +11131,17 @@
 $isTJ:true,
 static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:126;a",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:22;a",
+$0:function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
 y=C.xB.cn(z,".")
 if(y===-1)x=z!==""?N.Jx(""):null
 else{x=N.Jx(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,J.O,N.TJ)
+z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
 v=new N.TJ(z,x,null,w,H.VM(new Q.Gj(w),[null,null]),null)
 v.QL(z,x,w)
-return v},"$0",null,0,0,null,"call"],
+return v},
 $isEH:true},
 qV:{
 "^":"a;oc>,P>",
@@ -11108,34 +11165,39 @@
 giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isqV:true,
-static:{"^":"K9,tmj,EL,LkO,reI,pd,dc,MHK,ow,lM,B9"}},
+static:{"^":"K9,tmj,EL,LkO,reI,pd,EN,MHK,ow,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
 $isHV:true,
-static:{"^":"xO"}}}],["","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
+static:{"^":"xO"}}}],["","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
 "^":"",
-E2:[function(){N.Jx("").sOR(C.IF)
+E2:function(){N.Jx("").sOR(C.IF)
 N.Jx("").gSZ().yI(new F.em())
 N.Jx("").To("Starting Observatory")
 var z=H.VM(new P.Zf(P.Dt(null)),[null])
 N.Jx("").To("Loading Google Charts API")
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],null,null))])
-z.MM.ml(G.vN()).ml(new F.Lb())},"$0","qg",0,0,null],
+z.MM.ml(G.vN()).ml(new F.Lb())},
 em:{
-"^":"Tp:451;",
-$1:[function(a){P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,450,[],"call"],
+"^":"Tp:225;",
+$1:[function(a){var z
+if(J.de(a.gOR(),C.nT)){z=J.RE(a)
+if(J.co(z.gG1(a),"Error evaluating expression"))z=J.kE(z.gG1(a),"Can't assign to null: ")===!0||J.kE(z.gG1(a),"Expression is not assignable: ")===!0
+else z=!1}else z=!1
+if(z)return
+P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,224,[],"call"],
 $isEH:true},
 Lb:{
-"^":"Tp:115;",
+"^":"Tp:16;",
 $1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"$1",null,2,0,null,116,[],"call"],
-$isEH:true}}],["metadata","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
+A.Ok()},"$1",null,2,0,null,17,[],"call"],
+$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
 jh:{
 "^":"a;T9,Ym",
-static:{"^":"n4I,ziq,pjg,nq,xa"}},
-tzK:{
+static:{"^":"LB,en,pjg,nq,xa"}},
+WO:{
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
@@ -11145,34 +11207,40 @@
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V15;Mz%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gqW:[function(a){return a.Mz},null,null,1,0,126,"pad",82,104],
+sqW:[function(a,b){a.Mz=this.ct(a,C.ZU,a.Mz,b)},null,null,3,0,127,27,[],"pad",82],
 "@":function(){return[C.nW]},
 static:{aD:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.Mz=!0
 a.SO=z
 a.B7=y
 a.X0=w
 C.kD.ZL(a)
 C.kD.oX(a)
-return a},null,null,0,0,126,"new NavBarElement$created"]}},
-"+NavBarElement":[452],
+return a},null,null,0,0,22,"new NavBarElement$created"]}},
+"+NavBarElement":[226],
+V15:{
+"^":"uL+Pi;",
+$isd3:true},
 aQ:{
-"^":["V15;KU%-347,V4%-347,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+"^":["V16;KU%-125,V4%-125,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
+gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
 "@":function(){return[C.u7]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.KU="#"
@@ -11183,22 +11251,22 @@
 a.X0=w
 C.SU.ZL(a)
 C.SU.oX(a)
-return a},null,null,0,0,126,"new NavMenuElement$created"]}},
-"+NavMenuElement":[453],
-V15:{
+return a},null,null,0,0,22,"new NavMenuElement$created"]}},
+"+NavMenuElement":[227],
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V16;KU%-347,V4%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
+"^":["V17;KU%-125,V4%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
+gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
 "@":function(){return[C.qT]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.KU="#"
@@ -11208,31 +11276,31 @@
 a.X0=w
 C.nn.ZL(a)
 C.nn.oX(a)
-return a},null,null,0,0,126,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[454],
-V16:{
+return a},null,null,0,0,22,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[228],
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V17;rU%-85,SB%-335,Hq%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,126,"callback",307,330],
+"^":["V18;rU%-29,SB%-109,Hq%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,22,"callback",82,104],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,115,30,[],"callback",307],
-gxw:[function(a){return a.SB},null,null,1,0,348,"active",307,330],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,349,30,[],"active",307],
-gph:[function(a){return a.Hq},null,null,1,0,312,"label",307,330],
-sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,32,30,[],"label",307],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,16,27,[],"callback",82],
+gxw:[function(a){return a.SB},null,null,1,0,126,"active",82,104],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,127,27,[],"active",82],
+gph:[function(a){return a.Hq},null,null,1,0,87,"label",82,104],
+sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,8,27,[],"label",82],
 Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,343,21,[],344,[],82,[],"buttonClick"],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,125,"refreshDone"],
+if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,120,7,[],121,[],119,[],"buttonClick"],
+ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,21,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{zN:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SB=!1
@@ -11242,20 +11310,20 @@
 a.X0=w
 C.J7.ZL(a)
 C.J7.oX(a)
-return a},null,null,0,0,126,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[455],
-V17:{
+return a},null,null,0,0,22,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[229],
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V18;Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+"^":["V19;Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
 "@":function(){return[C.hr]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11264,22 +11332,27 @@
 a.X0=w
 C.lx.ZL(a)
 C.lx.oX(a)
-return a},null,null,0,0,126,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[456],
-V18:{
+return a},null,null,0,0,22,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[230],
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 Mv:{
-"^":["V19;Jo%-335,iy%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
-gF1:[function(a){return a.iy},null,null,1,0,306,"isolate",307,330],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,309,30,[],"isolate",307],
-"@":function(){return[C.zaS]},
+"^":["V20;Jo%-109,iy%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+gF1:[function(a){return a.iy},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,84,27,[],"isolate",82],
+vD:[function(a,b){this.ct(a,C.Ia,0,1)},"$1","gQ1",2,0,26,65,[],"isolateChanged"],
+gu6:[function(a){var z=a.iy
+if(z!=null)return z.gHP()
+else return""},null,null,1,0,87,"hashLinkWorkaround",82],
+su6:[function(a,b){},null,null,3,0,16,231,[],"hashLinkWorkaround",82],
+"@":function(){return[C.oD]},
 static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11288,22 +11361,22 @@
 a.X0=w
 C.RR.ZL(a)
 C.RR.oX(a)
-return a},null,null,0,0,126,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[457],
-V19:{
+return a},null,null,0,0,22,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[232],
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
-oM:{
-"^":["V20;Ap%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,329,"library",307,330],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,331,30,[],"library",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+Zt:{
+"^":["V21;Ap%-220,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,221,"library",82,104],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,222,27,[],"library",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
 "@":function(){return[C.KI]},
 static:{PQ:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11312,22 +11385,22 @@
 a.X0=w
 C.ct.ZL(a)
 C.ct.oX(a)
-return a},null,null,0,0,126,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[458],
-V20:{
+return a},null,null,0,0,22,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[233],
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 iL:{
-"^":["V21;Au%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Au},null,null,1,0,329,"cls",307,330],
-sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,331,30,[],"cls",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
-"@":function(){return[C.qJ]},
+"^":["V22;Au%-101,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Au},null,null,1,0,103,"cls",82,104],
+sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,105,27,[],"cls",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+"@":function(){return[C.iF]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11336,35 +11409,35 @@
 a.X0=w
 C.ae.ZL(a)
 C.ae.oX(a)
-return a},null,null,0,0,126,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[459],
-V21:{
+return a},null,null,0,0,22,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[234],
+V22:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 F1i:{
-"^":["V22;k5%-335,Oe%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,348,"devtools",307,330],
-szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,349,30,[],"devtools",307],
-guw:[function(a){return a.Oe},null,null,1,0,461,"app",307,308],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,462,30,[],"app",307],
+"^":["V23;k5%-109,Oe%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,126,"devtools",82,104],
+szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,127,27,[],"devtools",82],
+guw:[function(a){return a.Oe},null,null,1,0,236,"app",82,83],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,237,27,[],"app",82],
 ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.hq()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.SC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.US()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,126,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,22,"created"],
 "@":function(){return[C.kR]},
 static:{fv:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.k5=!1
@@ -11374,43 +11447,43 @@
 C.k0.ZL(a)
 C.k0.oX(a)
 C.k0.ZB(a)
-return a},null,null,0,0,126,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[463],
-V22:{
+return a},null,null,0,0,22,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[238],
+V23:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,125,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,125,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,464,12,[],242,[],243,[],"attributeChanged"],
-b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,465,122,[],"formatTimePrecise"],
-nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,465,122,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,465,28,[],"formatSeconds"],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,120,123,[],"formatSize"],
+"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,21,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,21,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,239,64,[],65,[],66,[],"attributeChanged"],
+b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,240,241,[],"formatTimePrecise"],
+nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,240,241,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,240,231,[],"formatSeconds"],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,18,19,[],"formatSize"],
 at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","gNh",2,0,466,467,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,468,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,468,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","guT",2,0,242,243,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,244,245,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,244,245,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,468,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,468,11,[],"isBool"],
-ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,468,11,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,468,11,[],"isInstance"],
-JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,468,11,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,244,245,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,244,245,[],"isBool"],
+ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,244,245,[],"isString"],
+rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,244,245,[],"isInstance"],
+JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,244,245,[],"isDouble"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,468,11,[],"isList"],
-tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,468,11,[],"isType"],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,468,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,244,245,[],"isList"],
+tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,244,245,[],"isType"],
+AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,244,245,[],"isUnexpected"],
 "@":function(){return[C.Br]},
 static:{Hx:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -11418,8 +11491,8 @@
 a.X0=w
 C.Pf.ZL(a)
 C.Pf.oX(a)
-return a},null,null,0,0,126,"new ObservatoryElement$created"]}},
-"+ObservatoryElement":[469]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+return a},null,null,0,0,22,"new ObservatoryElement$created"]}},
+"+ObservatoryElement":[246]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -11428,8 +11501,8 @@
 z=P.bK(this.gl1(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,125],
-ni:[function(a){a.AP=null},"$0","gl1",0,0,125],
+k0:[function(a){},"$0","gqw",0,0,21],
+ni:[function(a){a.AP=null},"$0","gl1",0,0,21],
 BN:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -11437,7 +11510,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,348],
+return!0}return!1},"$0","gDx",0,0,126],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -11461,7 +11534,7 @@
 "^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
 kb:function(a){return this.rk.$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,126,"value",307],
+gP:[function(a){return this.Sv},null,null,1,0,22,"value",82],
 wE:function(a){var z,y,x,w,v
 if(this.YX)return
 this.YX=!0
@@ -11474,14 +11547,14 @@
 x.push(w)}this.Ow()},
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"$1","geu",2,0,169,116,[]],
+P.rb(this.gMc())},"$1","geu",2,0,26,17,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
 if(z.length===0)return
 y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
 if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,125],
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,21],
 cO:function(a){var z,y
 z=this.b9
 if(z.length===0)return
@@ -11489,15 +11562,15 @@
 C.Nm.sB(z,0)
 C.Nm.sB(this.kK,0)
 this.Sv=null},
-k0:[function(a){return this.wE(0)},"$0","gqw",0,0,126],
-ni:[function(a){return this.cO(0)},"$0","gl1",0,0,126],
+k0:[function(a){return this.wE(0)},"$0","gqw",0,0,22],
+ni:[function(a){return this.cO(0)},"$0","gl1",0,0,22],
 $isJ3:true},
 E5:{
-"^":"Tp:115;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,69,[],"call"],
 $isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
-Y3:[function(){var z,y,x,w,v,u,t,s,r,q
+Y3:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
 if($.tW==null)return
 $.Td=!0
@@ -11518,45 +11591,45 @@
 for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
 q=J.U6(r)
 w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
-$.Td=!1},"$0","D6",0,0,null],
-Ht:[function(){var z={}
+$.Td=!1},
+Ht:function(){var z={}
 z.a=!1
 z=new O.o5(z)
-return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"$0","Zq",0,0,null],
+return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},
 o5:{
-"^":"Tp:470;a",
-$2:[function(a,b){var z=this.a
+"^":"Tp:247;a",
+$2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},"$2",null,4,0,null,181,[],166,[],"call"],
+a.RK(b,new O.b5(z))},
 $isEH:true},
 b5:{
-"^":"Tp:126;a",
+"^":"Tp:22;a",
 $0:[function(){this.a.a=!1
 O.Y3()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:182;b",
+"^":"Tp:36;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
+return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
 $isEH:true},
 Zb:{
-"^":"Tp:126;c,d,e,f",
+"^":"Tp:22;c,d,e,f",
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:471;UI",
+"^":"Tp:248;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
+return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
 $isEH:true},
 iV:{
-"^":"Tp:115;bK,Gq,Rm,w3",
+"^":"Tp:16;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,28,[],"call"],
+return this.w3.$1(a)},"$1",null,2,0,null,231,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
-f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+f6:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.WB(J.xH(f,e),1)
 y=J.WB(J.xH(c,b),1)
 if(typeof z!=="number")return H.s(z)
@@ -11580,8 +11653,8 @@
 l=J.WB(J.UQ(m,t),1)
 if(v>=w)return H.e(x,v)
 k=J.WB(J.UQ(x[v],n),1)
-J.kW(x[v],t,P.J(l,k))}}return x},"$6","cL",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+J.kW(x[v],t,P.J(l,k))}}return x},
+Mw:function(a){var z,y,x,w,v,u,t,s,r,q,p
 z=a.length
 y=z-1
 if(0>=z)return H.e(a,0)
@@ -11608,11 +11681,11 @@
 w=r
 y=t}else{v.push(2)
 x=u.W(x,1)
-w=q}}}return H.VM(new H.iK(v),[null]).br(0)},"$1","fZ",2,0,null,260,[]],
-rB:[function(a,b,c){var z,y,x
+w=q}}}return H.VM(new H.iK(v),[null]).br(0)},
+rB:function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"$3","QI",6,0,null,261,[],262,[],263,[]],
-xU:[function(a,b,c){var z,y,x,w,v,u
+return c},
+xU:function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
 x=J.U6(b)
@@ -11622,8 +11695,8 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"$3","M9",6,0,null,261,[],262,[],263,[]],
-jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+if(!u)break;++v}return v},
+jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
 x=P.J(z.W(c,b),y.W(f,e))
@@ -11643,7 +11716,7 @@
 if(typeof f!=="number")return H.s(f)
 z=J.U6(d)
 for(;e<f;e=r){r=e+1
-J.bi(s.Il,z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
+J.wT(s.Il,z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
 t=[]
 y=new P.Yp(t)
 y.$builtinTypeInfo=[null]
@@ -11658,7 +11731,7 @@
 y.$builtinTypeInfo=[null]
 s=new G.DA(a,y,t,n,0)}s.dM=J.WB(s.dM,1)
 n=J.WB(n,1)
-J.bi(s.Il,z.t(d,o));++o
+J.wT(s.Il,z.t(d,o));++o
 break
 case 2:if(s==null){t=[]
 y=new P.Yp(t)
@@ -11669,10 +11742,10 @@
 case 3:if(s==null){t=[]
 y=new P.Yp(t)
 y.$builtinTypeInfo=[null]
-s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
+s=new G.DA(a,y,t,n,0)}J.wT(s.Il,z.t(d,o));++o
 break}if(s!=null)p.push(s)
-return p},"$6","mu",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return p},
+m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
@@ -11712,12 +11785,12 @@
 q.sjr(J.WB(q.gjr(),m))
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"$2","pE",4,0,null,264,[],29,[]],
-xl:[function(a,b){var z,y
+t=!0}else t=!1}if(!t)a.push(u)},
+xl:function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"$2","l0",4,0,null,76,[],265,[]],
-u2:[function(a,b){var z,y,x,w,v,u
+return z},
+u2:function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
 for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
@@ -11726,7 +11799,7 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"$2","W5",4,0,null,76,[],265,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},
 DA:{
 "^":"a;WA>,ok<,Il<,jr@,dM",
 gvH:function(a){return this.jr},
@@ -11757,15 +11830,15 @@
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
-Wi:[function(a,b,c,d){var z=J.RE(a)
+Wi:function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"$4","Ha",8,0,null,101,[],266,[],242,[],243,[]],
+return d},
 d3:{
 "^":"a;",
 $isd3:true},
-lS:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y,x,w,v
+X6:{
+"^":"Tp:75;a,b",
+$2:function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
 if(!J.de(b,y)){x=this.a
@@ -11774,14 +11847,14 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},"$2",null,4,0,null,12,[],242,[],"call"],
+z.V2.u(0,a,y)}},
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
 xh:{
 "^":"Pi;L1,AP,fn",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",307],
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},243,[],"value",307],
-bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",82],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},66,[],"value",82],
+bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
 "^":"er;b3,xg,ao,AP,fn",
@@ -11789,7 +11862,7 @@
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.ao.length},null,null,1,0,472,"length",307],
+gB:[function(a){return this.ao.length},null,null,1,0,249,"length",82],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.ao
 y=z.length
@@ -11817,10 +11890,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,361,30,[],"length",307],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,137,27,[],"length",82],
 t:[function(a,b){var z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.bU]}},this.$receiver,"wn")},15,[],"[]",307],
+return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[P.KN]}},this.$receiver,"wn")},73,[],"[]",82],
 u:[function(a,b,c){var z,y,x,w
 z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -11832,12 +11905,12 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.bU,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",307],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,348,"isEmpty",307],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,348,"isNotEmpty",307],
+z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[P.KN,a]}},this.$receiver,"wn")},73,[],27,[],"[]=",82],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,126,"isEmpty",82],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,126,"isNotEmpty",82],
 Mh:function(a,b,c){var z,y,x
 z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$iszM&&!z.$isz5)c=z.br(c)
 y=J.q8(c)
 z=this.xg
 if(z!=null){x=z.iE
@@ -11898,7 +11971,7 @@
 oF:function(a,b,c){var z,y,x,w
 if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$iszM&&!z.$isz5)c=z.br(c)
 y=J.q8(c)
 z=this.ao
 x=z.length
@@ -11952,7 +12025,7 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,348],
+return!0}return!1},"$0","gL6",0,0,126],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -11960,8 +12033,8 @@
 "^":"ar+Pi;",
 $isd3:true},
 Bj:{
-"^":"Tp:126;a",
-$0:[function(){this.a.xg=null},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){this.a.xg=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
 HA:{
@@ -11973,18 +12046,18 @@
 $isHA:true},
 qC:{
 "^":"Pi;Zp,AP,fn",
-gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",307],
+gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",82],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",307],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",82],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,472,"length",307],
+return z.gB(z)},null,null,1,0,249,"length",82],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,348,"isEmpty",307],
+return z.gB(z)===0},null,null,1,0,126,"isEmpty",82],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,348,"isNotEmpty",307],
-di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,473,30,[],"containsValue",307],
-x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,473,49,[],"containsKey",307],
-t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},49,[],"[]",307],
+return z.gB(z)!==0},null,null,1,0,126,"isNotEmpty",82],
+di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,250,27,[],"containsValue",82],
+x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,250,76,[],"containsKey",82],
+t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},76,[],"[]",82],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -11993,9 +12066,8 @@
 w=this.AP
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
-if(w){z=z.gB(z)
-if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},49,[],30,[],"[]=",307],
+if(w)if(y!==z.gB(z)){F.Wi(this,C.Wn,y,z.gB(z))
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},76,[],27,[],"[]=",82],
 FV:function(a,b){J.kH(b,new V.zT(this))},
 Rz:function(a,b){var z,y,x,w,v
 z=this.Zp
@@ -12027,68 +12099,68 @@
 return y}}},
 zT:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){var z=this.a
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
-Wa:[function(a,b){var z=J.x(a)
+Wa:function(a,b){var z=J.x(a)
 if(!!z.$isqI)return J.de(a.oc,b)
 if(!!z.$isHA){z=J.x(b)
 if(!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"$2","Uv",4,0,null,29,[],49,[]],
-yf:[function(a,b){var z,y,x,w
+return J.de(a.G3,b)}return!1},
+yf:function(a,b){var z,y,x,w
 if(a==null)return
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=H.jO(J.bB(z.gAx()).LU)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
+y=J.zH(z)
 try{if(L.TH(y,b)){x=z.rN(b).gAx()
 return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
 return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.Ek))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},"$2","MT",4,0,null,6,[],74,[]],
-ir:[function(a,b,c){var z,y,x,w
+return},
+ir:function(a,b,c){var z,y,x,w
 if(a==null)return!1
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
 return!0}}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=H.jO(J.bB(z.gAx()).LU)
+y=J.zH(z)
 try{if(L.dR(y,b)){x=c
 z.tu(b,2,[x],C.CM)
 H.vn(x)
 return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
 return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.Ek))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"$3","J6",6,0,null,6,[],74,[],30,[]],
-TH:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb
+return!1},
+TH:function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().Fb
 if(z.x4(b))return!0
 if(z.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y
+a=L.pY(a)}return!1},
+dR:function(a,b){var z,y
 z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
-for(;!J.de(a,$.aA());){y=a.gYK().nb
+for(;!J.de(a,$.aA());){y=a.gYK().Fb
 if(!!J.x(y.t(0,b)).$isRY)return!0
 if(y.x4(z))return!0
 if(y.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
+a=L.pY(a)}return!1},
+M6:function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().Fb.t(0,b)
 if(!!J.x(z).$isRS&&z.guU())return!0
-a=L.pY(a)}return!1},"$2","Wt",4,0,null,11,[],12,[]],
-pY:[function(a){var z,y
+a=L.pY(a)}return!1},
+pY:function(a){var z,y
 try{z=a.gAY()
 return z}catch(y){H.Ru(y)
-return $.aA()}},"$1","WV",2,0,null,11,[]],
-cB:[function(a){a=J.JA(a,$.c3(),"")
+return $.aA()}},
+cB:function(a){a=J.JA(a,$.c3(),"")
 if(a==="")return!0
 if(0>=a.length)return H.e(a,0)
 if(a[0]===".")return!1
-return $.tN().zD(a)},"$1","wf",2,0,null,94,[]],
+return $.tN().zD(a)},
 WR:{
 "^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
 E4:function(a){return this.cT.$1(a)},
@@ -12101,7 +12173,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,126,"value",307],
+return C.Nm.grZ(this.kN)},null,null,1,0,22,"value",82],
 sP:[function(a,b){var z,y,x,w
 z=this.BK
 y=z.length
@@ -12117,16 +12189,16 @@
 if(w>=z.length)return H.e(z,w)
 if(L.ir(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,474,243,[],"value",307],
+z[y]=b}},null,null,3,0,251,66,[],"value",82],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
-this.XI()},"$0","gqw",0,0,125],
+this.XI()},"$0","gqw",0,0,21],
 ni:[function(a){var z,y
 for(z=0;y=this.cs,z<y.length;++z){y=y[z]
 if(y!=null){y.ed()
 y=this.cs
 if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,125],
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,21],
 Zy:function(a){var z,y,x,w,v,u
 if(a==null)a=this.BK.length
 z=this.BK
@@ -12212,24 +12284,24 @@
 z.d4(a,b,c)
 return z}}},
 qL:{
-"^":"Tp:115;",
-$1:[function(a){return},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return},
 $isEH:true},
 Px:{
-"^":"Tp:475;a,b,c",
+"^":"Tp:253;a,b,c",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"$1",null,2,0,null,265,[],"call"],
+return}},"$1",null,2,0,null,252,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:476;d,e,f",
+"^":"Tp:254;d,e,f",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"$1",null,2,0,null,265,[],"call"],
+return}},"$1",null,2,0,null,252,[],"call"],
 $isEH:true},
 Md:{
-"^":"Tp:126;",
-$0:[function(){return new H.VR(H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
 Jk:[function(a){var z,y,x
@@ -12240,46 +12312,46 @@
 return y}if(!!z.$isQV){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"$1","np",2,0,115,30,[]],
+return x}return a},"$1","np",2,0,16,27,[]],
 km:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,374,[],121,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
-JX:[function(){var z,y
+JX:function(){var z,y
 z=document.createElement("style",null)
 J.c9(z,".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n")
 y=document.querySelector("head")
 y.insertBefore(z,y.firstChild)
 A.B2()
-$.mC().MM.ml(new A.Zj())},"$0","Ti",0,0,null],
-B2:[function(){var z,y,x
+$.mC().MM.ml(new A.Zj())},
+B2:function(){var z,y,x
 for(z=$.IN(),z=H.VM(new H.a7(z,1,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.pP(x.lo).h(0,"polymer-veiled")}},"$0","r8",0,0,null],
-yV:[function(a){var z,y
+for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.wT(J.pP(x.lo),"polymer-veiled")}},
+yV:function(a){var z,y
 z=$.xY().Rz(0,a)
-if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w
+if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},
+oF:function(a,b){var z,y,x,w
 if(J.de(a,$.H8()))return b
 b=A.oF(a.gAY(),b)
-for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
+for(z=a.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(y.gFo()||y.gq4())continue
 x=J.x(y)
 if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
 else w=!0
 if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=P.Fl(null,null)
-b.u(0,y.gIf(),y)}break}}return b},"$2","Cd",4,0,null,267,[],268,[]],
-Oy:[function(a,b){var z,y
-do{z=a.gYK().nb.t(0,b)
+b.u(0,y.gIf(),y)}break}}return b},
+yX:function(a,b){var z,y
+do{z=a.gYK().Fb.t(0,b)
 y=J.x(z)
 if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
 a=a.gAY()}while(!J.de(a,$.H8()))
-return},"$2","il",4,0,null,267,[],74,[]],
-bc:[function(a,b){var z,y
+return},
+bc:function(a,b){var z,y
 z=H.u1(H.d(b.gIf().fN)+"=")
-y=a.gYK().nb.t(0,new H.GD(z))
-return!!J.x(y).$isRS&&y.ghB()},"$2","i8",4,0,null,267,[],269,[]],
-YG:[function(a,b,c){var z,y,x
+y=a.gYK().Fb.t(0,new H.GD(z))
+return!!J.x(y).$isRS&&y.ghB()},
+YG:function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
 if(!z.Bm("ShadowDOMPolyfill"))return
@@ -12287,8 +12359,8 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},"$3","OA",6,0,null,270,[],12,[],271,[]],
-Hl:[function(a){var z,y,x,w,v,u
+x.V7("shimStyling",[a,b,c])},
+Hl:function(a){var z,y,x,w,v,u
 if(a==null)return""
 w=J.RE(a)
 z=w.gmH(a)
@@ -12306,67 +12378,68 @@
 if(!!J.x(w).$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"$1","BV",2,0,null,272,[]],
-Ad:[function(a,b){var z
+return""}else throw u}},
+Ad:function(a,b){var z
 if(b==null)b=C.Tu
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},"$2","ZK",2,2,null,85,12,[],11,[]],
-xv:[function(a){A.pb(a,new A.Mq())},"$1","N1",2,0,null,273,[]],
-pb:[function(a,b){var z
+if(z!=null)J.Or(z)},
+xv:function(a){A.om(a,new A.Mq())},
+om:function(a,b){var z
 if(a==null)return
 b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],164,[]],
-lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
-return new A.L6(a,b)},"$4","y4",8,0,null,274,[],12,[],273,[],275,[]],
-z9:[function(a){var z
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},
+lJ:function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
+return new A.L6(a,b)},
+z9:function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"$1","b4",2,0,null,273,[]],
-HR:[function(a,b,c){var z,y,x
+return $.od().t(0,a)},
+HR:function(a,b,c){var z,y,x
 z=H.vn(a)
-y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
+y=A.Rk(z.gt5(z),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"$3","xi",6,0,null,48,[],276,[],19,[]],
-Rk:[function(a,b){var z
-do{z=a.gYK().nb.t(0,b)
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},
+Rk:function(a,b){var z
+do{z=a.gYK().Fb.t(0,b)
 if(!!J.x(z).$isRS)return z
-a=a.gAY()}while(a!=null)},"$2","Uy",4,0,null,11,[],12,[]],
-ZI:[function(a,b){var z,y
+a=a.gAY()}while(a!=null)},
+ZI:function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
 J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"$2","tO",4,0,null,277,[],278,[]],
-pX:[function(){var z=window
+b.appendChild(z)},
+pX:function(){var z=window
 C.ol.hr(z)
-C.ol.oB(z,W.aF(new A.hm()))},"$0","ji",0,0,null],
-al:[function(a,b){var z,y,x
+C.ol.oB(z,W.aF(new A.hm()))},
+al:function(a,b){var z,y,x
 z=J.x(b)
 y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
 z=J.RE(y)
 if(J.de(z.gUx(y),C.PU)||J.de(z.gUx(y),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"$2","bP",4,0,null,30,[],74,[]],
-h5:[function(a){if(a==null)return C.Qf
+z=H.vn(a)
+return z.gt5(z)}return y},
+h5:function(a){if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
 if(typeof a==="boolean")return C.HL
 if(typeof a==="string")return C.Db
 if(!!J.x(a).$isiP)return C.Yc
-return},"$1","v9",2,0,null,30,[]],
-Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
+return},
+Ok:function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
-return $.X3},"$0","ym",0,0,null],
+return $.X3},
 ei:[function(){var z=document
 W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
-$.ax().ml(new A.rD())},"$0","PB",0,0,125],
-Jv:[function(){var z,y,x,w,v,u,t
-for(w=$.nT(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
+$.ax().ml(new A.rD())},"$0","PB",0,0,21],
+Jv:function(){var z,y,x,w,v,u,t
+for(w=$.UP(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
 try{A.pw(z)}catch(v){u=H.Ru(v)
 y=u
 x=new H.XO(v,null)
@@ -12376,11 +12449,11 @@
 t=y
 if(t==null)H.vh(P.u("Error must not be null"))
 if(u.Gv!==0)H.vh(P.w("Future already completed"))
-u.CG(t,x)}}},"$0","vH",0,0,null],
-GA:[function(a,b,c,d){var z,y,x,w,v,u
+u.CG(t,x)}}},
+GA:function(a,b,c,d){var z,y,x,w,v,u
 if(c==null)c=P.Ls(null,null,null,W.YN)
 if(d==null){d=[]
-d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
+d.$builtinTypeInfo=[P.qU]}if(a==null){z="warning: "+H.d(b)+" not found."
 y=$.oK
 if(y==null)H.qw(z)
 else y.$1(z)
@@ -12394,8 +12467,8 @@
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.$1(z)}}return d},"$4","fE",4,4,null,85,85,279,[],280,[],281,[],282,[]],
-pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+else v.$1(z)}}return d},
+pw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
 y=P.hK(a)
@@ -12417,17 +12490,19 @@
 s=y.tP}w=z.ku
 v=z.gJf(z)
 u=z.gtp(z)}x=z.Fi}p=P.R6(y.Ka,v,t,null,u,s,null,x,w)
-y=$.UG().nb
+y=$.UG().Fb
 o=y.t(0,p)
 n=p.r0
-if(p.Fi===z.Fi)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
+r=p.Fi
+q=z.Fi
+if(r==null?q==null:r===q)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
 else z=!1
 else z=!1
 else z=!1
 if(z){z=p.r0
 m=y.t(0,P.hK("package:"+C.xB.yn(z,J.U6(z).cn(z,"packages/")+9)))
 if(m!=null)o=m}if(o==null){$.M7().To(p.bu(0)+" library not found")
-return}z=o.gYK().nb
+return}z=o.gYK().Fb
 z=z.gUQ(z)
 y=new A.Fn()
 r=new H.U5(z,y)
@@ -12436,7 +12511,7 @@
 y=new H.SO(z,y)
 y.$builtinTypeInfo=[H.Kp(r,0)]
 for(;y.G();)A.ZB(o,z.gl())
-z=o.gYK().nb
+z=o.gYK().Fb
 z=z.gUQ(z)
 y=new A.e3()
 r=new H.U5(z,y)
@@ -12450,8 +12525,8 @@
 j=l.gYj()
 $.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"$1","qt",2,0,null,283,[]],
-ZB:[function(a,b){var z,y,x
+if(i!=null)J.Or(i)}}}},
+ZB:function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
 if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+J.AG(b.gIf())+" is not."
@@ -12464,10 +12539,10 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.$1(x)
-return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],233,[]],
+return}a.CI(b.gIf(),C.xD)},
 Zj:{
-"^":"Tp:115;",
-$1:[function(a){A.pX()},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){A.pX()},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 XP:{
 "^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,lk",
@@ -12503,7 +12578,7 @@
 A.ZI(this.J3(a,this.kO(a,"global"),"global"),document.head)
 A.YG(this.gZf(a),y,z)
 w=P.re(a.zx)
-v=w.gYK().nb.t(0,C.c8)
+v=w.gYK().Fb.t(0,C.c8)
 if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
 this.Ba(a,y)
 A.yV(a.RT)},
@@ -12511,7 +12586,7 @@
 $.p2().u(0,b,a)
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
 return!0},
-PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
+PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.wT($.xY().to(b,new A.q6()),a)
 return!0}return!1},
 Ba:function(a,b){var z,y,x,w
 for(z=a,y=null;z!=null;){x=J.RE(z)
@@ -12532,7 +12607,7 @@
 y=y!=null&&y.x4(w)}else y=!1
 if(y)continue
 v=new H.GD(H.u1(w))
-u=A.Oy(b,v)
+u=A.yX(b,v)
 if(u==null){window
 y="property for attribute "+w+" of polymer-element name="+H.d(a.RT)+" not found."
 if(typeof console!="undefined")console.warn(y)
@@ -12540,7 +12615,7 @@
 if(y==null){y=P.Fl(null,null)
 a.Q7=y}y.u(0,v,u)}}},
 Vk:function(a){var z,y
-z=P.L5(null,null,null,J.O,P.a)
+z=P.L5(null,null,null,P.qU,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
@@ -12588,14 +12663,14 @@
 q1:function(a,b){var z,y,x,w
 if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
-for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
+for(z=b.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
 x=y.gIf().fN
 w=J.rY(x)
 if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
 x=w.Nj(x,0,J.xH(w.gB(x),7))
 a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},
-qC:function(a,b){var z=P.L5(null,null,null,J.O,null)
+qC:function(a,b){var z=P.L5(null,null,null,P.qU,null)
 b.aN(0,new A.MX(z))
 return z},
 du:function(a){a.RT=a.getAttribute("name")
@@ -12606,48 +12681,48 @@
 C.zb.du(a)
 return a}}},
 q6:{
-"^":"Tp:126;",
-$0:[function(){return[]},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return[]},
 $isEH:true},
 CK:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"$2",null,4,0,null,12,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},
 $isEH:true},
 LJ:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x
+"^":"Tp:75;a",
+$2:function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"$2",null,4,0,null,12,[],30,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
 $isEH:true},
 ZG:{
-"^":"Tp:115;",
-$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
 Oc:{
-"^":"Tp:115;a",
-$1:[function(a){return J.Kf(a,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.Kf(a,this.a)},
 $isEH:true},
 MX:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"$2",null,4,0,null,12,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},
 $isEH:true},
-w13:{
-"^":"Tp:126;",
-$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
+w12:{
+"^":"Tp:22;",
+$0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
 C.FS.aN(0,new A.r3y(z))
-return z},"$0",null,0,0,null,"call"],
+return z},
 $isEH:true},
 r3y:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,477,[],478,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,b,a)},
 $isEH:true},
 yL:{
 "^":"ndx;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-328",function(){return[C.Nw]}],
+"^":["a;KM:X0=-102",function(){return[C.Nw]}],
 Pa:function(a){var z
 if(W.Pv(this.gM0(a).defaultView)==null)z=$.Bh>0
 else z=!0
@@ -12712,7 +12787,7 @@
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
 if(w==null?x!=null:w!==x){y.tu(z.gIf(),2,[w],C.CM)
-H.vn(w)}},"$2","ghW",4,0,479,12,[],30,[]],
+H.vn(w)}},"$2","ghW",4,0,255],
 B2:function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},
@@ -12764,14 +12839,14 @@
 J.AA(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,125],
+y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,21],
 BT:function(a,b){var z
 if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
 return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.pb(this.gIW(a),new A.TV())},
+A.om(this.gIW(a),new A.TV())},
 oW:function(a){return this.BT(a,null)},
 Xl:function(a){var z,y,x,w,v
 z=J.xR(a.dZ)
@@ -12784,7 +12859,7 @@
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
 if(!J.x(v).$isqI)continue
-J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,480,481,[]],
+J.Pz(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,256,257,[]],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
@@ -12801,7 +12876,7 @@
 w.Bd=x.Al(P.v3())
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
-if(v==null){v=P.L5(null,null,null,J.O,P.MO)
+if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
 a.Sa=v}v.u(0,x,w)}},
 l5:function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
@@ -12838,7 +12913,7 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,482,316,[]],
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,258,91,[]],
 ea:function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
@@ -12854,31 +12929,31 @@
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=J.Vs(this.a)
+"^":"Tp:75;a",
+$2:function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
-z.t(0,a)},"$2",null,4,0,null,12,[],30,[],"call"],
+z.t(0,a)},
 $isEH:true},
 Xi:{
-"^":"Tp:126;b",
-$0:[function(){return this.b},"$0",null,0,0,null,"call"],
+"^":"Tp:22;b",
+$0:function(){return this.b},
 $isEH:true},
 TV:{
-"^":"Tp:115;",
-$1:[function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:16;",
+$1:function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},
 $isEH:true},
 Mq:{
-"^":"Tp:115;",
-$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"$1",null,2,0,null,273,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},
 $isEH:true},
 Oa:{
-"^":"Tp:126;a",
-$0:[function(){return new A.bS(this.a.jL,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return new A.bS(this.a.jL,null)},
 $isEH:true},
 n1:{
-"^":"Tp:300;b,c,d,e",
-$2:[function(a,b){var z,y,x
+"^":"Tp:75;b,c,d,e",
+$2:function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
 z=this.d
@@ -12887,14 +12962,14 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"$2",null,4,0,null,12,[],483,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},
 $isEH:true},
 xf:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:300;a,b",
+"^":"Tp:75;a,b",
 $2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -12903,10 +12978,10 @@
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,292,[],273,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,259,[],260,[],"call"],
 $isEH:true},
 Rs:{
-"^":"Tp:115;c,d,e",
+"^":"Tp:16;c,d,e",
 $1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.z9(z)
@@ -12918,25 +12993,26 @@
 u=L.Sk(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
 u=J.x(a)
-x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,316,[],"call"],
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 uJ:{
-"^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!a.gQ2()},
 $isEH:true},
 hm:{
-"^":"Tp:115;",
-$1:[function(a){var z,y,x
+"^":"Tp:16;",
+$1:[function(a){var z,y,x,w
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
 for(y=z.gA(z);y.G();){x=J.pP(y.lo)
-x.h(0,"polymer-unveil")
-x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,116,[],"call"],
+w=J.w1(x)
+w.h(x,"polymer-unveil")
+w.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
+y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 Ji:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"$1",null,2,0,null,116,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.V1(J.pP(z.lo),"polymer-unveil")},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 Bf:{
 "^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
@@ -12951,15 +13027,15 @@
 if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
 if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"$1","giz",2,0,485,265,[]],
+return}}},"$1","giz",2,0,261,252,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 xc:{
-"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 oX:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -12969,7 +13045,7 @@
 C.Iv.oX(a)
 return a}}},
 jpR:{
-"^":["qE+zs;KM:X0=-328",function(){return[C.Nw]}],
+"^":["qE+zs;KM:X0=-102",function(){return[C.Nw]}],
 $iszs:true,
 $isTU:true,
 $isd3:true,
@@ -12991,105 +13067,104 @@
 if(z!=null){z.ed()
 this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,125]},
+this.Ws()}},"$0","gv6",0,0,21]},
 V3:{
 "^":"a;ns",
 $isV3:true},
 rD:{
-"^":"Tp:115;",
+"^":"Tp:16;",
 $1:[function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
-return},"$1",null,2,0,null,116,[],"call"],
+return},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 Fn:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,486,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$isRS},
 $isEH:true},
 e3:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,486,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$isMs},
 $isEH:true},
 pM:{
-"^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!a.gQ2()},
 $isEH:true},
 Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
-Zh:[function(a,b,c){var z,y,x
+Zh:function(a,b,c){var z,y,x
 z=J.UQ($.CT(),J.Ba(c))
 if(z!=null)return z.$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"$3","jo",6,0,null,30,[],284,[],11,[]],
+return a}},
 W6:{
-"^":"Tp:126;",
-$0:[function(){var z=P.L5(null,null,null,null,null)
+"^":"Tp:22;",
+$0:function(){var z=P.L5(null,null,null,null,null)
 z.u(0,C.AZ,new Z.Lf())
 z.u(0,C.ok,new Z.fT())
 z.u(0,C.N4,new Z.pp())
 z.u(0,C.Kc,new Z.nl())
 z.u(0,C.PC,new Z.ik())
 z.u(0,C.md,new Z.LfS())
-return z},"$0",null,0,0,null,"call"],
+return z},
 $isEH:true},
 Lf:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:300;",
+"^":"Tp:75;",
 $2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"$2",null,4,0,null,28,[],487,[],"call"],
+return b}},"$2",null,4,0,null,231,[],262,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,231,[],17,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],487,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,231,[],262,[],"call"],
 $isEH:true},
 mf:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a},
 $isEH:true},
 LfS:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],487,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,231,[],262,[],"call"],
 $isEH:true},
 HK:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){return this.b},
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","qP",2,0,206,121,[]],
+return z},"$1","qP",2,0,54,70,[]],
 PX:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Fx",2,0,206,121,[]],
+return z},"$1","Fx",2,0,54,70,[]],
 o8:{
-"^":"Tp:115;a",
-$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,374,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.de(this.a.t(0,a),!0)},
 $isEH:true},
 ex:{
-"^":"Tp:115;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,374,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,158,[],"call"],
 $isEH:true},
 e9:{
 "^":"T4p;",
 op:[function(a,b,c){var z,y,x
-if(a==null)return
 z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
 y=new U.tc()
 y=new T.FX(y,z,null,null)
@@ -13101,23 +13176,23 @@
 if(M.wR(c)){z=J.x(b)
 z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"$3","gca",6,0,488,274,[],12,[],273,[]],
+return new T.Xy(this,b,x)},"$3","gca",6,0,263],
 CE:function(a){return new T.uK(this)}},
 Xy:{
-"^":"Tp:300;a,b,c",
+"^":"Tp:75;a,b,c",
 $2:[function(a,b){var z
 if(!J.x(a).$isz6){z=this.a.nF
 a=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}z=!!J.x(b).$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"$2",null,4,0,null,292,[],273,[],"call"],
+return T.FL(this.c,a,null)},"$2",null,4,0,null,259,[],260,[],"call"],
 $isEH:true},
 uK:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z
 if(!!J.x(a).$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,292,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,259,[],"call"],
 $isEH:true},
 mY:{
 "^":"Pi;a9,Cu,uI,Y7,AP,fn",
@@ -13126,12 +13201,12 @@
 z=this.Y7
 if(!!J.x(a).$isfk){y=J.OS(J.kl(a.bm,new T.mB(this,a)),!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,115,121,[]],
-gP:[function(a){return this.Y7},null,null,1,0,126,"value",307],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,16,70,[]],
+gP:[function(a){return this.Y7},null,null,1,0,22,"value",82],
 sP:[function(a,b){var z,y,x
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
 if(!!J.x(x).$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,115,121,[],"value",307],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,16,70,[],"value",82],
 yB:function(a,b,c){var z,y,x,w
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -13144,14 +13219,14 @@
 z.yB(a,b,c)
 return z}}},
 GX:{
-"^":"Tp:115;a",
-$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 mB:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
 $1:[function(a){var z=P.L5(null,null,null,null,null)
 z.u(0,this.b.F5,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,325,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,135,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
@@ -13164,14 +13239,14 @@
 bX:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,325,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,135,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CV",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
-OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
+OH:function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"$2","tk",4,0,null,285,[],278,[]],
-jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+return z.gLv()},
+jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
@@ -13199,79 +13274,79 @@
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
 else{H.vn(p).tu(new H.GD(H.u1(u)),2,[b],C.CM)
-H.vn(b)}},"$3","wA",6,0,null,285,[],30,[],278,[]],
-ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
-return a},"$1","W1",2,0,null,121,[]],
+H.vn(b)}},
+ci:function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},
+Uf:{
+"^":"Tp:75;",
+$2:function(a,b){return J.WB(a,b)},
+$isEH:true},
 wJY:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.xH(a,b)},
 $isEH:true},
 zOQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 W6o:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.FW(a,b)},
 $isEH:true},
 MdQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.de(a,b)},
 $isEH:true},
 YJG:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return!J.de(a,b)},
 $isEH:true},
 DOe:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.z8(a,b)},
 $isEH:true},
 lPa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 Ufa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 Raa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
 w0:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return a===!0||b===!0},
 $isEH:true},
 w4:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
 w5:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
-$isEH:true},
-w7:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=H.Og(P.a)
+"^":"Tp:75;",
+$2:function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"$2",null,4,0,null,117,[],128,[],"call"],
+throw H.b(K.kG("Filters must be a one-argument function."))},
+$isEH:true},
+w7:{
+"^":"Tp:16;",
+$1:function(a){return a},
 $isEH:true},
 w10:{
-"^":"Tp:115;",
-$1:[function(a){return a},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.Z7(a)},
 $isEH:true},
 w11:{
-"^":"Tp:115;",
-$1:[function(a){return J.Z7(a)},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
-w12:{
-"^":"Tp:115;",
-$1:[function(a){return a!==!0},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return a!==!0},
 $isEH:true},
 c4:{
-"^":"Tp:126;a",
-$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},
 $isEH:true},
 z6:{
 "^":"a;eT>,k8<,bq,G9",
@@ -13285,7 +13360,8 @@
 else{z=this.bq.Zp
 if(z.x4(b))return K.ci(z.t(0,b))
 else if(this.k8!=null){y=new H.GD(H.u1(b))
-x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
+z=this.gCH()
+x=Z.y1(z.gt5(z),y)
 z=J.x(x)
 if(!z.$isRY)w=!!z.$isRS&&x.glT()
 else w=!0
@@ -13293,17 +13369,19 @@
 else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(0,b))
 else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
-tI:function(a){var z
+tI:function(a){var z,y
 if(J.de(a,"this"))return
 else{z=this.bq
 if(z.Zp.x4(a))return z
 else{z=H.u1(a)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
+y=this.gCH()
+if(Z.y1(y.gt5(y),new H.GD(z))!=null)return this.k8}}z=this.eT
 if(z!=null)return z.tI(a)},
-tg:function(a,b){var z
+tg:function(a,b){var z,y
 if(this.bq.Zp.x4(b))return!0
 else{z=H.u1(b)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
+y=this.gCH()
+if(Z.y1(y.gt5(y),new H.GD(z))!=null)return!0}z=this.eT
 if(z!=null)return z.tg(0,b)
 return!1},
 $isz6:true},
@@ -13352,13 +13430,13 @@
 return x},
 ZR:function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
-y=a.gre()
-if(y==null)x=null
-else{w=this.gnG()
-y.toString
-x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
+if(a.gre()==null)y=null
+else{x=a.gre()
+w=this.gnG()
+x.toString
+y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.fa(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
-if(x!=null)H.bQ(x,new K.Os(v))
+if(y!=null)H.bQ(y,new K.Os(v))
 return v},
 ti:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 o0:function(a){var z,y
@@ -13369,7 +13447,7 @@
 YV:function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
-x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.jV(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
@@ -13393,16 +13471,16 @@
 y.sbO(x)
 return x}},
 Os:{
-"^":"Tp:115;a",
-$1:[function(a){var z=this.a
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
 a.sbO(z)
-return z},"$1",null,2,0,null,117,[],"call"],
+return z},
 $isEH:true},
 B8:{
-"^":"Tp:115;a",
-$1:[function(a){var z=this.a
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
 a.sbO(z)
-return z},"$1",null,2,0,null,21,[],"call"],
+return z},
 $isEH:true},
 Wh:{
 "^":"Ay;KL,bO,tj,Lv,k6",
@@ -13430,11 +13508,11 @@
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:300;",
-$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"$2",null,4,0,null,202,[],21,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
+return a},
 $isEH:true},
-qR:{
+jV:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
 RR:function(a,b){return b.YV(this)},
 $asAy:function(){return[U.wk]},
@@ -13456,12 +13534,12 @@
 $isw6:true,
 $ishw:true},
 Qv:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 Xm:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
 $isEH:true},
 mv:{
 "^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -13497,8 +13575,8 @@
 $isuk:true,
 $ishw:true},
 uA:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 vl:{
 "^":"Ay;hP<,KL,bO,tj,Lv,k6",
@@ -13518,12 +13596,12 @@
 $isx9:true,
 $ishw:true},
 Li:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 WK:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
 $isEH:true},
 iT:{
 "^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -13533,18 +13611,18 @@
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
-tE:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+ja:{
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 ey:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},
 $isEH:true},
 fa:{
 "^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -13568,16 +13646,16 @@
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:115;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,53,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:476;a,b,c",
-$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:254;a,b,c",
+$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 a9:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
 $isEH:true},
 VA:{
 "^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
@@ -13595,15 +13673,15 @@
 $isX7:true,
 $ishw:true},
 J1:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
 $isEH:true},
 fk:{
 "^":"a;F5,bm",
 $isfk:true},
 wL:{
-"^":"a:115;lR,ex",
-$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,489,[]],
+"^":"a:16;lR,ex",
+$1:function(a){return this.lR.F2(this.ex,[a],null).Ax},
 $iswL:true,
 $isEH:true},
 B0:{
@@ -13612,27 +13690,27 @@
 $isB0:true,
 static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
-Pu:[function(a,b){var z,y
+Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
 if(a==null||b==null)return!1
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,117,[],199,[]],
-au:[function(a){a.toString
-return U.xk(H.n3(a,0,new U.xs()))},"$1","bT",2,0,null,286,[]],
-Zm:[function(a,b){var z=J.WB(a,b)
+if(!J.de(y,b[z]))return!1}return!0},
+au:function(a){a.toString
+return U.xk(H.n3(a,0,new U.xs()))},
+Zm:function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","uN",4,0,null,238,[],30,[]],
-xk:[function(a){if(typeof a!=="number")return H.s(a)
+return a^a>>>6},
+xk:function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Zy",2,0,null,238,[]],
+return 536870911&a+((16383&a)<<15>>>0)},
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,490,21,[],117,[]],
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,264,7,[],53,[]],
 F2:function(a,b,c){return new U.Jy(a,b,c)}},
 hw:{
 "^":"a;",
@@ -13773,8 +13851,8 @@
 return U.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:300;",
-$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,491,[],492,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return U.Zm(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -13800,9 +13878,12 @@
 this.w5()
 w=this.o9()
 this.Sk.toString
-a=new U.X7(a,w)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
-else break
-return a},
+a=new U.X7(a,w)}else{if(J.de(J.Iz(this.fL.lo),8)){z=this.fL.lo.gG8()
+if(typeof z!=="number")return z.F()
+if(typeof b!=="number")return H.s(b)
+z=z>=b}else z=!1
+if(z)a=this.Tw(a)
+else break}return a},
 qL:function(a,b){var z,y
 z=J.x(b)
 if(!!z.$isw6){z=z.gP(b)
@@ -13811,12 +13892,17 @@
 y=b.gre()
 this.Sk.toString
 return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-Tw:function(a){var z,y,x
+Tw:function(a){var z,y,x,w
 z=this.fL.lo
 this.w5()
 y=this.WT()
 while(!0){x=this.fL.lo
-if(x!=null)x=(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9))&&J.z8(this.fL.lo.gG8(),z.gG8())
+if(x!=null)if(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9)){x=this.fL.lo.gG8()
+w=z.gG8()
+if(typeof x!=="number")return x.D()
+if(typeof w!=="number")return H.s(w)
+w=x>w
+x=w}else x=!1
 else x=!1
 if(!x)break
 y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
@@ -13926,17 +14012,17 @@
 return y},
 tw:function(){return this.yj("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,287,127,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,71,72,[]],
 Ae:{
-"^":"a;vH>-317,P>-493",
+"^":"a;vH>-93,P>-265",
 n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,115,99,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,472,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,312,"toString"],
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,16,69,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,249,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,87,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
 "<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.bU,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[P.KN,a]}},this.$receiver,"Ae")},73,[],27,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;ty",
@@ -13965,19 +14051,19 @@
 return!1},
 $asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
 "^":"",
-y1:[function(a,b){var z,y,x
-if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
+y1:function(a,b){var z,y,x
+if(a.gYK().Fb.x4(b))return a.gYK().Fb.t(0,b)
 z=a.gAY()
 if(z!=null&&!J.de(J.Ba(z),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"$2","rz",4,0,null,288,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
-wX:[function(a){switch(a){case 102:return 12
+wX:function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"$1","uO",2,0,null,289,[]],
+default:return a}},
 Pn:{
 "^":"a;fY>,P>,G8<",
 bu:function(a){return"("+this.fY+", '"+this.P+"')"},
@@ -14075,7 +14161,7 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,494,94,[]]},
+DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,266,267,[]]},
 d2:{
 "^":"fr;",
 W9:function(a){return this.xn(a)},
@@ -14088,8 +14174,7 @@
 this.xn(a)},
 ZR:function(a){var z
 J.UK(a.ghP(),this)
-z=a.gre()
-if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
 this.xn(a)},
 ti:function(a){return this.xn(a)},
 o0:function(a){var z
@@ -14109,14 +14194,14 @@
 this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 NQ:{
-"^":["V23;kW%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,461,"app",307,330],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,462,30,[],"app",307],
+"^":["V24;kW%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,236,"app",82,104],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,237,27,[],"app",82],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -14124,36 +14209,36 @@
 a.X0=w
 C.Cc.ZL(a)
 C.Cc.oX(a)
-return a},null,null,0,0,126,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[495],
-V23:{
+return a},null,null,0,0,22,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[268],
+V24:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
 ov:{
-"^":["V24;QV%-496,t7%-317,hX%-317,FZ%-335,Bs%-497,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.QV},null,null,1,0,498,"script",307,330],
-sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,499,30,[],"script",307],
-gBV:[function(a){return a.t7},null,null,1,0,472,"pos",307,330],
-sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,361,30,[],"pos",307],
-giX:[function(a){return a.hX},null,null,1,0,472,"endPos",307,330],
-siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,361,30,[],"endPos",307],
-gHp:[function(a){return a.FZ},null,null,1,0,348,"coverage",307,330],
-sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,349,30,[],"coverage",307],
-gSw:[function(a){return a.Bs},null,null,1,0,500,"lines",307,308],
-sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,501,30,[],"lines",307],
+"^":["V25;QV%-269,t7%-93,hX%-93,FZ%-109,Bs%-270,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.QV},null,null,1,0,271,"script",82,104],
+sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,272,27,[],"script",82],
+gBV:[function(a){return a.t7},null,null,1,0,249,"pos",82,104],
+sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,137,27,[],"pos",82],
+giX:[function(a){return a.hX},null,null,1,0,249,"endPos",82,104],
+siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,137,27,[],"endPos",82],
+gHp:[function(a){return a.FZ},null,null,1,0,126,"coverage",82,104],
+sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,127,27,[],"coverage",82],
+gSw:[function(a){return a.Bs},null,null,1,0,273,"lines",82,83],
+sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,274,27,[],"lines",82],
 rh:[function(a,b){this.VH(a)
-this.ct(a,C.du,0,1)},"$1","grO",2,0,169,242,[],"scriptChanged"],
-Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,169,242,[],"posChanged"],
+this.ct(a,C.du,0,1)},"$1","grO",2,0,26,65,[],"scriptChanged"],
+Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,26,65,[],"posChanged"],
 OM:[function(a,b){this.ct(a,C.Cv,0,1)
-this.ct(a,C.du,0,1)},"$1","gTA",2,0,115,242,[],"coverageChanged"],
+this.ct(a,C.du,0,1)},"$1","gTA",2,0,16,65,[],"coverageChanged"],
 qEQ:[function(a,b){var z,y
 z=a.QV
 if(z==null||a.FZ!==!0)return"min-width:32px;"
 y=J.UQ(z.gu9(),b.gRd())
 if(y==null)return"min-width:32px;"
 if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,502,192,[],"hitStyle",308],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,275,276,[],"hitStyle",83],
 VH:[function(a){var z,y,x,w,v
 if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
 return}this.ct(a,C.Cv,0,1)
@@ -14161,15 +14246,15 @@
 z=a.QV.q6(a.t7)
 y=a.hX
 x=a.QV
-if(y==null)J.bi(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
+if(y==null)J.wT(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
 else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"$0","gI2",0,0,125,"_updateProperties"],
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.wT(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"$0","gI2",0,0,21,"_updateProperties"],
 "@":function(){return[C.OLi]},
-static:{"^":"bN<-85,JP<-85,ze<-85",T5:[function(a){var z,y,x,w,v
+static:{"^":"bN<-29,JP<-29,VnP<-29",T5:[function(a){var z,y,x,w,v
 z=R.Jk([])
 y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.FZ=!1
@@ -14179,48 +14264,48 @@
 a.X0=v
 C.HD.ZL(a)
 C.HD.oX(a)
-return a},null,null,0,0,126,"new ScriptInsetElement$created"]}},
-"+ScriptInsetElement":[503],
-V24:{
+return a},null,null,0,0,22,"new ScriptInsetElement$created"]}},
+"+ScriptInsetElement":[277],
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 ZJ:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,115,116,[],"call"],
+if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,16,17,[],"call"],
 $isEH:true},
-"+ ZJ":[346]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+"+ ZJ":[124]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
-knI:{
-"^":["x4;jJ%-317,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gBV:[function(a){return a.jJ},null,null,1,0,472,"pos",307,330],
-sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,361,30,[],"pos",307],
+kn:{
+"^":["x4;jJ%-93,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gBV:[function(a){return a.jJ},null,null,1,0,249,"pos",82,104],
+sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,137,27,[],"pos",82],
 gD5:[function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gD5.call(this,a)
-return z.gzz()},null,null,1,0,312,"hoverText"],
-Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,169,242,[],"posChanged"],
+return z.gzz()},null,null,1,0,87,"hoverText"],
+Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,26,65,[],"posChanged"],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,169,116,[],"_updateProperties"],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,26,17,[],"_updateProperties"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,312,"name"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,87,"name"],
 gO3:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,312,"url"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,87,"url"],
 "@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.jJ=-1
@@ -14230,31 +14315,31 @@
 a.X0=w
 C.c0.ZL(a)
 C.c0.oX(a)
-return a},null,null,0,0,126,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[504],
+return a},null,null,0,0,22,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[278],
 x4:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V25;Uz%-496,HJ%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,498,"script",307,330],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,499,30,[],"script",307],
-gjG:[function(a){return a.HJ},null,null,1,0,348,"showCoverage",307,330],
-sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,349,30,[],"showCoverage",307],
+"^":["V26;Uz%-269,HJ%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,271,"script",82,104],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,272,27,[],"script",82],
+gjG:[function(a){return a.HJ},null,null,1,0,126,"showCoverage",82,104],
+sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,127,27,[],"showCoverage",82],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
 if(z==null)return
-J.SK(z)},"$0","gQd",0,0,125,"enteredView"],
-ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,115,242,[],"showCoverageChanged"],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,169,332,[],"refreshCoverage"],
+J.SK(z)},"$0","gQd",0,0,21,"enteredView"],
+ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,16,65,[],"showCoverageChanged"],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,26,106,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{Ry:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.HJ=!1
@@ -14263,9 +14348,9 @@
 a.X0=w
 C.cJ.ZL(a)
 C.cJ.oX(a)
-return a},null,null,0,0,126,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[505],
-V25:{
+return a},null,null,0,0,22,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[279],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
@@ -14285,25 +14370,57 @@
 v.$builtinTypeInfo=[w]
 v=new Q.wn(null,null,v,null,null)
 v.$builtinTypeInfo=[w]
-w=J.bU
+w=P.KN
 u=D.N8
 t=new V.qC(P.Py(null,null,null,w,u),null,null)
 t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Isolate":z=new V.qC(P.Py(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
 z=R.Jk(z)
-x=P.L5(null,null,null,J.O,D.af)
+x=P.L5(null,null,null,P.qU,D.af)
 w=[]
-w.$builtinTypeInfo=[J.O]
+w.$builtinTypeInfo=[P.qU]
 v=[]
 v.$builtinTypeInfo=[D.e5]
-u=P.L5(null,null,null,J.O,J.Pp)
+u=D.U4
+t=[]
+t.$builtinTypeInfo=[u]
+t=new Q.wn(null,null,t,null,null)
+t.$builtinTypeInfo=[u]
+u=P.L5(null,null,null,P.qU,P.CP)
 u=R.Jk(u)
-s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+break
+case"Library":z=D.U4
+x=[]
+x.$builtinTypeInfo=[z]
+x=new Q.wn(null,null,x,null,null)
+x.$builtinTypeInfo=[z]
+z=D.rj
+w=[]
+w.$builtinTypeInfo=[z]
+w=new Q.wn(null,null,w,null,null)
+w.$builtinTypeInfo=[z]
+z=D.SI
+v=[]
+v.$builtinTypeInfo=[z]
+v=new Q.wn(null,null,v,null,null)
+v.$builtinTypeInfo=[z]
+z=D.SI
+u=[]
+u.$builtinTypeInfo=[z]
+u=new Q.wn(null,null,u,null,null)
+u.$builtinTypeInfo=[z]
+z=D.SI
+t=[]
+t.$builtinTypeInfo=[z]
+t=new Q.wn(null,null,t,null,null)
+t.$builtinTypeInfo=[z]
+s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"ServiceError":s=new D.fJ(null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
@@ -14314,26 +14431,26 @@
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-z=J.bU
-w=J.bU
+z=P.KN
+w=P.KN
 v=new V.qC(P.Py(null,null,null,z,w),null,null)
 v.$builtinTypeInfo=[z,w]
-s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 default:z=new V.qC(P.Py(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
 s=new D.SI(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
-D5:[function(a){var z
+D5:function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},"$1","SSc",2,0,null,202,[]],
-ES:[function(a,b){var z=J.x(a)
+return z},
+ES:function(a,b){var z=J.x(a)
 if(!!z.$isSI)return
 if(!!z.$isqC)D.Gf(a,b)
-else if(!!z.$iswn)D.f3(a,b)},"$2","Ja",4,0,null,290,[],156,[]],
-Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"$2","nV",4,0,null,162,[],156,[]],
-f3:[function(a,b){var z,y,x,w,v,u
+else if(!!z.$iswn)D.f3(a,b)},
+Gf:function(a,b){a.aN(0,new D.UZ(a,b))},
+f3:function(a,b){var z,y,x,w,v,u
 for(z=a.ao,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
@@ -14341,29 +14458,29 @@
 else u=!1
 if(u)a.u(0,y,b.Zr(x))
 else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},"$2","PV",4,0,null,76,[],156,[]],
+else if(v)D.Gf(x,b)}},
 af:{
 "^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,506,"owner",307],
+gXP:[function(){return this.P3},null,null,1,0,280,"owner",82],
 gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,507,"vm",307],
+return z.gzf(z)},null,null,1,0,281,"vm",82],
 gF1:[function(a){var z=this.P3
-return z.gF1(z)},null,null,1,0,306,"isolate",307],
-gjO:[function(a){return this.KG},null,null,1,0,312,"id",307],
-gzS:[function(){return this.mQ},null,null,1,0,312,"serviceType",307],
+return z.gF1(z)},null,null,1,0,81,"isolate",82],
+gjO:[function(a){return this.KG},null,null,1,0,87,"id",82],
+gzS:[function(){return this.mQ},null,null,1,0,87,"serviceType",82],
 gPj:[function(a){var z,y
 z=this.gF1(this)
 y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,312,"link",307],
-gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,312,"hashLink",307],
-sHP:[function(a){},null,null,3,0,115,99,[],"hashLink",307],
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,87,"link",82],
+gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,87,"hashLink",82],
+sHP:[function(a){},null,null,3,0,16,69,[],"hashLink",82],
 gox:function(a){return this.kT},
 gUm:function(){return!1},
 gM8:function(){return!1},
-goc:[function(a){return this.gbN()},null,null,1,0,312,"name",307,308],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",307],
-gzz:[function(){return this.gGR()},null,null,1,0,312,"vmName",307,308],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",307],
+goc:[function(a){return this.gbN()},null,null,1,0,87,"name",82,83],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,8,27,[],"name",82],
+gzz:[function(){return this.gGR()},null,null,1,0,87,"vmName",82,83],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,8,27,[],"vmName",82],
 xW:function(a){if(this.kT)return P.Ab(this,null)
 return this.VD(0)},
 VD:function(a){var z
@@ -14384,7 +14501,7 @@
 this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Tp:508;a",
+"^":"Tp:283;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -14392,31 +14509,31 @@
 y=this.a
 if(!J.de(z,y.mQ))return D.ac(y.P3,a)
 y.eC(a)
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 jI:{
-"^":"Tp:126;b",
+"^":"Tp:22;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 u0g:{
 "^":"af;"},
-zM:{
+H6:{
 "^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,507,"vm",307],
-gF1:[function(a){return},null,null,1,0,306,"isolate",307],
+gzf:[function(a){return this},null,null,1,0,281,"vm",82],
+gF1:[function(a){return},null,null,1,0,81,"isolate",82],
 gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,509,"isolates",307],
-gPj:[function(a){return H.d(this.KG)},null,null,1,0,312,"link",307],
-gYe:[function(a){return this.Ox},null,null,1,0,312,"version",307,308],
-sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",307],
-gF6:[function(){return this.GY},null,null,1,0,312,"architecture",307,308],
-sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",307],
-gUn:[function(){return this.Rp},null,null,1,0,510,"uptime",307,308],
-sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,511,30,[],"uptime",307],
-gC3:[function(){return this.Ts},null,null,1,0,348,"assertsEnabled",307,308],
-sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,349,30,[],"assertsEnabled",307],
-gPV:[function(){return this.Va},null,null,1,0,348,"typeChecksEnabled",307,308],
-sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,349,30,[],"typeChecksEnabled",307],
+return z.gUQ(z)},null,null,1,0,284,"isolates",82],
+gPj:[function(a){return H.d(this.KG)},null,null,1,0,87,"link",82],
+gYe:[function(a){return this.Ox},null,null,1,0,87,"version",82,83],
+sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,8,27,[],"version",82],
+gF6:[function(){return this.GY},null,null,1,0,87,"architecture",82,83],
+sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,8,27,[],"architecture",82],
+gUn:[function(){return this.Rp},null,null,1,0,285,"uptime",82,83],
+sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,286,27,[],"uptime",82],
+gC3:[function(){return this.Ts},null,null,1,0,126,"assertsEnabled",82,83],
+sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,127,27,[],"assertsEnabled",82],
+gPV:[function(){return this.Va},null,null,1,0,126,"typeChecksEnabled",82,83],
+sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,127,27,[],"typeChecksEnabled",82],
 bZ:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
@@ -14454,7 +14571,13 @@
 return this.Tn(x).ml(new D.oe(this,w))}v=this.A4.t(0,z.a)
 if(v!=null)return J.am(v)
 return this.jU(z.a).ml(new D.kk(z,this))},
-jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},
+N7:function(a){var z
+if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+return P.Vu(D.ac(this,R.Jk(z)),null,null)}z=J.U6(a)
+if(J.de(z.t(a,"type"),"ServiceError"))return P.Vu(D.ac(this,a),null,null)
+else if(J.de(z.t(a,"type"),"ServiceException"))return P.Vu(D.ac(this,a),null,null)
+return P.Ab(a,null)},
+jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.I2(this),new D.mR())},
 bF:function(a,b,c){var z,y
 if(c)return
 this.kT=!0
@@ -14472,7 +14595,7 @@
 this.xA(z.t(b,"isolates"))},
 xA:function(a){var z,y,x,w,v,u
 z=this.z7
-y=P.L5(null,null,null,J.O,D.bv)
+y=P.L5(null,null,null,P.qU,D.bv)
 for(x=J.GP(a);x.G();){w=x.gl()
 v=J.UQ(w,"id")
 u=z.t(0,v)
@@ -14486,79 +14609,72 @@
 this.A4.u(0,"vm",this)
 var z=P.EF(["id","vm","type","@VM"],null,null)
 this.eC(R.Jk(z))},
-$iszM:true},
+$isH6:true},
 O1w:{
 "^":"u0g+Pi;",
 $isd3:true},
 MZ:{
-"^":"Tp:115;a,b",
-$1:[function(a){if(!J.x(a).$iszM)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,57,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){if(!J.x(a).$isH6)return
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,168,[],"call"],
 $isEH:true},
 oe:{
-"^":"Tp:115;b,c",
+"^":"Tp:16;b,c",
 $1:[function(a){var z
 if(a==null)return this.b
 z=this.c
 if(z==null)return J.am(a)
-else return a.cv(z)},"$1",null,2,0,null,16,[],"call"],
+else return a.cv(z)},"$1",null,2,0,null,10,[],"call"],
 $isEH:true},
 kk:{
-"^":"Tp:508;a,d",
+"^":"Tp:283;a,d",
 $1:[function(a){var z,y
 z=this.d
 y=D.ac(z,a)
 if(y.gUm())z.A4.to(this.a.a,new D.QZ(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 QZ:{
-"^":"Tp:126;e",
-$0:[function(){return this.e},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e",
+$0:function(){return this.e},
 $isEH:true},
 Ey:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y,x,w,v
-try{w=C.xr.kV(a)
-z=R.Jk(w)
-if(!D.D5(z)){w=P.EF(["type","ServiceException","id","","kind","FormatException","response",z,"message","Top level service responses must be service maps."],null,null)
-w=R.Jk(w)
-w=P.Vu(D.ac(this.a,w),null,null)
-return w}if(J.de(J.UQ(z,"type"),"ServiceError")){w=P.Vu(D.ac(this.a,z),null,null)
-return w}else if(J.de(J.UQ(z,"type"),"ServiceException")){w=P.Vu(D.ac(this.a,z),null,null)
-return w}return z}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-P.JS(y)
-P.JS(x)
-w=P.EF(["type","ServiceException","id","","kind","DecodeException","response",a,"message","Could not decode JSON: "+H.d(y)],null,null)
-w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}},"$1",null,2,0,null,421,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){var z,y,x,w
+try{x=C.xr.kV(a)
+z=R.Jk(x)
+x=this.a.N7(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
+x=R.Jk(x)
+return P.Vu(D.ac(this.a,x),null,null)}},"$1",null,2,0,null,190,[],"call"],
 $isEH:true},
 tm:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,171,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 Gk:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
-mR:{
-"^":"Tp:115;c",
+I2:{
+"^":"Tp:16;c",
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,315,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,90,[],"call"],
 $isEH:true},
-bp:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,21,[],"call"],
+mR:{
+"^":"Tp:16;",
+$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 Yu:{
-"^":"Tp:300;",
-$2:[function(a,b){J.am(b)},"$2",null,4,0,null,512,[],16,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){J.am(b)},
 $isEH:true},
 e5:{
 "^":"a;SP<,hw<,wZ",
@@ -14605,43 +14721,43 @@
 for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
-v.$builtinTypeInfo=[J.bU]
+v.$builtinTypeInfo=[P.KN]
 u=new D.e5(0,v,0)
 u.CJ()
 x.push(u)}if(typeof v!=="number")return H.s(v)
 z=Array(v)
 z.fixed$length=init
-z=new D.e5(0,H.VM(z,[J.bU]),0)
+z=new D.e5(0,H.VM(z,[P.KN]),0)
 this.yP=z
 z.Bv(y)
 return}z=this.RP
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
 z.fixed$length=init
-u=new D.e5(a,H.VM(z,[J.bU]),0)
+u=new D.e5(a,H.VM(z,[P.KN]),0)
 u.nZ(y,this.yP.hw)
 this.yP.wY(0,y)
 z=this.lI
 z.push(u)
 if(z.length>this.hD)C.Nm.KI(z,0)}},
 bv:{
-"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-513,Cf,W1,p2,Hw,S9,yv,BC@-437,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,507,"vm",307],
-gF1:[function(a){return this},null,null,1,0,306,"isolate",307],
-ghw:[function(){return this.V3},null,null,1,0,514,"counters",307,308],
-shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,508,30,[],"counters",307],
+"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,DC,zb,bN:KT@,GR:f5@,Er,cL,LE<-287,Cf,W1,p2,Hw,S9,yv,BC@-207,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gzf:[function(a){return this.P3},null,null,1,0,281,"vm",82],
+gF1:[function(a){return this},null,null,1,0,81,"isolate",82],
+ghw:[function(){return this.V3},null,null,1,0,288,"counters",82,83],
+shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,283,27,[],"counters",82],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
-gko:[function(){return this.l2},null,null,1,0,348,"pausedOnStart",307,308],
-sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,349,30,[],"pausedOnStart",307],
-geB:[function(){return this.No},null,null,1,0,348,"pausedOnExit",307,308],
-seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,349,30,[],"pausedOnExit",307],
-gLd:[function(){return this.EY},null,null,1,0,348,"running",307,308],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,349,30,[],"running",307],
-gaj:[function(){return this.eU},null,null,1,0,348,"idle",307,308],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,349,30,[],"idle",307],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,515,516,[],"relativeLink",307],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,515,516,[],"relativeHashLink",307],
+gko:[function(){return this.l2},null,null,1,0,126,"pausedOnStart",82,83],
+sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,127,27,[],"pausedOnStart",82],
+geB:[function(){return this.No},null,null,1,0,126,"pausedOnExit",82,83],
+seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,127,27,[],"pausedOnExit",82],
+gLd:[function(){return this.EY},null,null,1,0,126,"running",82,83],
+sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,127,27,[],"running",82],
+gaj:[function(){return this.eU},null,null,1,0,126,"idle",82,83],
+saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,127,27,[],"idle",82],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,289,290,[],"relativeLink",82],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,289,290,[],"relativeHashLink",82],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -14658,8 +14774,8 @@
 x=z.t(a,"samples")
 for(z=J.GP(y);z.G();){w=z.gl()
 J.UQ(w,"code").eL(w,b,x)}},
-Ms:function(a){return this.cv("coverage").ml(this.gJJ())},
-Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gJJ",2,0,517,518,[]],
+Ms:function(a){return this.cv("coverage").ml(this.gm6())},
+Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gm6",2,0,291,292,[]],
 Zr:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -14672,35 +14788,37 @@
 cv:function(a){var z=this.A4.t(0,a)
 if(z!=null)return J.am(z)
 return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gVc:[function(){return this.v9},null,null,1,0,329,"rootLib",307,308],
-sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,331,30,[],"rootLib",307],
-gf4:[function(){return this.zb},null,null,1,0,514,"topFrame",307,308],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,508,30,[],"topFrame",307],
-goc:[function(a){return this.KT},null,null,1,0,312,"name",307,308],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",307],
-gzz:[function(){return this.f5},null,null,1,0,312,"vmName",307,308],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",307],
-gQ9:[function(){return this.Er},null,null,1,0,312,"mainPort",307,308],
-sQ9:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",307],
-gw2:[function(){return this.cL},null,null,1,0,519,"entry",307,308],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,520,30,[],"entry",307],
-gCi:[function(){return this.Cf},null,null,1,0,472,"newHeapUsed",307,308],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,361,30,[],"newHeapUsed",307],
-gcu:[function(){return this.W1},null,null,1,0,472,"oldHeapUsed",307,308],
-scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,361,30,[],"oldHeapUsed",307],
-gab:[function(){return this.p2},null,null,1,0,472,"newHeapCapacity",307,308],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,361,30,[],"newHeapCapacity",307],
-gfi:[function(){return this.Hw},null,null,1,0,472,"oldHeapCapacity",307,308],
-sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,361,30,[],"oldHeapCapacity",307],
-gNh:[function(a){return this.S9},null,null,1,0,312,"fileAndLine",307,308],
-at:function(a,b){return this.gNh(this).$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",307],
-gkc:[function(a){return this.yv},null,null,1,0,521,"error",307,308],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,522,30,[],"error",307],
-bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+gVc:[function(){return this.v9},null,null,1,0,221,"rootLib",82,83],
+sVc:[function(a){this.v9=F.Wi(this,C.iG,this.v9,a)},null,null,3,0,222,27,[],"rootLib",82],
+gvU:[function(){return this.DC},null,null,1,0,293,"libraries",82,83],
+svU:[function(a){this.DC=F.Wi(this,C.Ij,this.DC,a)},null,null,3,0,294,27,[],"libraries",82],
+gf4:[function(){return this.zb},null,null,1,0,288,"topFrame",82,83],
+sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,283,27,[],"topFrame",82],
+goc:[function(a){return this.KT},null,null,1,0,87,"name",82,83],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,8,27,[],"name",82],
+gzz:[function(){return this.f5},null,null,1,0,87,"vmName",82,83],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,8,27,[],"vmName",82],
+gQ9:[function(){return this.Er},null,null,1,0,87,"mainPort",82,83],
+sQ9:[function(a){this.Er=F.Wi(this,C.dH,this.Er,a)},null,null,3,0,8,27,[],"mainPort",82],
+gw2:[function(){return this.cL},null,null,1,0,295,"entry",82,83],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,296,27,[],"entry",82],
+gCi:[function(){return this.Cf},null,null,1,0,249,"newHeapUsed",82,83],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,137,27,[],"newHeapUsed",82],
+gcu:[function(){return this.W1},null,null,1,0,249,"oldHeapUsed",82,83],
+scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,137,27,[],"oldHeapUsed",82],
+gab:[function(){return this.p2},null,null,1,0,249,"newHeapCapacity",82,83],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,137,27,[],"newHeapCapacity",82],
+gfi:[function(){return this.Hw},null,null,1,0,249,"oldHeapCapacity",82,83],
+sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,137,27,[],"oldHeapCapacity",82],
+guT:[function(a){return this.S9},null,null,1,0,87,"fileAndLine",82,83],
+at:function(a,b){return this.guT(this).$1(b)},
+suT:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,8,27,[],"fileAndLine",82],
+gkc:[function(a){return this.yv},null,null,1,0,297,"error",82,83],
+skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,298,27,[],"error",82],
+bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z=J.U6(b)
 y=z.t(b,"mainPort")
-this.Er=F.Wi(this,C.wT,this.Er,y)
+this.Er=F.Wi(this,C.dH,this.Er,y)
 y=z.t(b,"name")
 this.KT=F.Wi(this,C.YS,this.KT,y)
 y=z.t(b,"name")
@@ -14710,7 +14828,7 @@
 D.ES(b,this)
 if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
 return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.xe,this.v9,y)
+this.v9=F.Wi(this,C.iG,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
 this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
 this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
@@ -14765,8 +14883,11 @@
 this.EY=y
 y=this.l2!==!0&&this.No!==!0&&y!==!0
 this.eU=F.Wi(this,C.q2,this.eU,y)
-z=z.t(b,"error")
-this.yv=F.Wi(this,C.YU,this.yv,z)},
+y=z.t(b,"error")
+this.yv=F.Wi(this,C.YU,this.yv,y)
+J.U2(this.DC)
+for(z=J.GP(z.t(b,"libraries"));z.G();){p=z.gl()
+J.wT(this.DC,p)}J.LH(this.DC,new D.Yn())},
 m7:function(){return this.P3.jU(H.d(this.KG)+"/profile/tag").ml(new D.AP(this))},
 KQ:function(a,b){this.FF=0
 this.bj=a
@@ -14808,51 +14929,55 @@
 "^":"u0g+Pi;",
 $isd3:true},
 iz:{
-"^":"Tp:115;",
-$1:[function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
+"^":"Tp:16;",
+$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
 a.Du=0
 a.fF=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.qH=F.Wi(a,C.uU,a.qH,"")
 J.U2(a.VS)
 J.U2(a.ci)
-J.U2(a.Oo)}},"$1",null,2,0,null,30,[],"call"],
+J.U2(a.Oo)}},
 $isEH:true},
 oa:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,523,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,299,[],"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:508;a,b",
+"^":"Tp:283;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.ac(z,a)
 if(y.gUm())z.A4.to(this.b,new D.Ai(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 Ai:{
-"^":"Tp:126;c",
-$0:[function(){return this.c},"$0",null,0,0,null,"call"],
+"^":"Tp:22;c",
+$0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,524,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,300,[],"call"],
+$isEH:true},
+Yn:{
+"^":"Tp:75;",
+$2:[function(a,b){return J.oE(J.O6(a),J.O6(b))},"$2",null,4,0,null,53,[],57,[],"call"],
 $isEH:true},
 AP:{
-"^":"Tp:508;a",
+"^":"Tp:283;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.KJ
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,202,[],"call"],
+return y},"$1",null,2,0,null,212,[],"call"],
 $isEH:true},
 SI:{
 "^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Library"))&&!J.co(this.KG,$.VZ)},
-gM8:function(){return this.gUm()},
+gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Field"))&&!J.co(this.KG,$.VZ)},
+gM8:function(){return!1},
 bu:function(a){return P.vW(this.RF)},
 bF:function(a,b,c){var z,y,x
 this.kT=!c
@@ -14884,13 +15009,13 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"$0","gDx",0,0,348],
+return z.BN(z)},"$0","gDx",0,0,126],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,125],
+k0:[function(a){return},"$0","gqw",0,0,21],
 ni:[function(a){this.RF.AP=null
-return},"$0","gl1",0,0,125],
+return},"$0","gl1",0,0,21],
 gUj:function(a){var z=this.RF
 return z.gUj(z)},
 gnz:function(a){var z,y
@@ -14907,14 +15032,14 @@
 static:{"^":"VZ"}},
 pD:{
 "^":"wVq;J6,LD,jo,Ne,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
-gFA:[function(a){return this.jo},null,null,1,0,329,"exception",307,308],
-sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,331,30,[],"exception",307],
-gK7:[function(){return this.Ne},null,null,1,0,329,"stacktrace",307,308],
-sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,331,30,[],"stacktrace",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
+gFA:[function(a){return this.jo},null,null,1,0,103,"exception",82,83],
+sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,105,27,[],"exception",82],
+gur:[function(){return this.Ne},null,null,1,0,103,"stacktrace",82,83],
+sur:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,105,27,[],"stacktrace",82],
 bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -14935,10 +15060,10 @@
 $isd3:true},
 fJ:{
 "^":"dZL;J6,LD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
 bF:function(a,b,c){var z,y
 this.kT=!0
 z=J.U6(b)
@@ -14956,12 +15081,12 @@
 $isd3:true},
 hR:{
 "^":"w8F;J6,LD,IV,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
-gvJ:[function(a){return this.IV},null,null,1,0,126,"response",307,308],
-svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,115,30,[],"response",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
+gvJ:[function(a){return this.IV},null,null,1,0,22,"response",82,83],
+svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,16,27,[],"response",82],
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -14978,25 +15103,70 @@
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
+U4:{
+"^":["V4b;dj,JJ<-29,XR<-29,DD>-29,Z3<-29,mu<-29,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null],
+gO3:[function(a){return this.dj},null,null,1,0,87,"url",82,83],
+sO3:[function(a,b){this.dj=F.Wi(this,C.Fh,this.dj,b)},null,null,3,0,8,27,[],"url",82],
+gUm:function(){return!0},
+gM8:function(){return!1},
+bF:function(a,b,c){var z,y,x,w
+z=J.U6(b)
+y=z.t(b,"url")
+x=F.Wi(this,C.Fh,this.dj,y)
+this.dj=x
+if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
+w=J.U6(y)
+x=w.yn(y,J.WB(w.cn(y,"/"),1))}y=z.t(b,"user_name")
+y=this.ct(this,C.YS,this.bN,y)
+this.bN=y
+if(J.FN(y)===!0)this.bN=this.ct(this,C.YS,this.bN,x)
+y=z.t(b,"name")
+this.GR=this.ct(this,C.KS,this.GR,y)
+if(c)return
+this.kT=!0
+y=this.P3
+D.ES(b,y.gF1(y))
+y=this.JJ
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"imports"))
+y=this.XR
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"scripts"))
+y=this.DD
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"classes"))
+y=this.Z3
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"variables"))
+y=this.mu
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"functions"))},
+$isU4:true},
+V4b:{
+"^":"af+Pi;",
+$isd3:true},
 c2:{
-"^":["a;Rd<-317,a4>-347",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd<-93,a4>-125",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
-"^":["V4b;Sw>-85,u9<-85,Gz,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,310,"library",307,308],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,311,30,[],"library",307],
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gVB:[function(){return this.wJ},null,null,1,0,472,"firstTokenPos",307,308],
+"^":["Zqa;Sw>-29,u9<-29,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gVB:[function(){return this.wJ},null,null,1,0,249,"firstTokenPos",82,83],
 sVB:[function(a){var z=this.wJ
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.wJ=a},null,null,3,0,361,30,[],"firstTokenPos",307],
-gug:[function(){return this.lx},null,null,1,0,472,"lastTokenPos",307,308],
+this.nq(this,z)}this.wJ=a},null,null,3,0,137,27,[],"firstTokenPos",82],
+gug:[function(){return this.lx},null,null,1,0,249,"lastTokenPos",82,83],
 sug:[function(a){var z=this.lx
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.lx=a},null,null,3,0,361,30,[],"lastTokenPos",307],
+this.nq(this,z)}this.lx=a},null,null,3,0,137,27,[],"lastTokenPos",82],
 gUm:function(){return!0},
 gM8:function(){return!0},
 rK:function(a){return J.UQ(this.Sw,J.xH(a,1))},
@@ -15070,29 +15240,30 @@
 x.V1(y)
 N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
 for(w=0;w<z.length;w=v){v=w+1
-x.h(y,new D.c2(v,z[w]))}}},
-V4b:{
+x.h(y,new D.c2(v,z[w]))}},
+$isrj:true},
+Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 N8:{
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
 Z9:{
-"^":["Pi;Yu<,LR<-317,VF<-317,KO<-317,fY>-347,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
-gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
-gUE:[function(){return this.MT},null,null,1,0,312,"formattedLine",307,308],
-sUE:[function(a){this.MT=F.Wi(this,C.Zt,this.MT,a)},null,null,3,0,32,30,[],"formattedLine",307],
+"^":["Pi;Yu<,LR<-93,VF<-93,KO<-93,fY>-125,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
+gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
+gUE:[function(){return this.MT},null,null,1,0,87,"formattedLine",82,83],
+sUE:[function(a){this.MT=F.Wi(this,C.oI,this.MT,a)},null,null,3,0,8,27,[],"formattedLine",82],
 Nw:[function(){var z,y
 z=this.LR
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","guV",0,0,312,"formattedDeoptId",307],
+return y.bu(z)},"$0","guV",0,0,87,"formattedDeoptId",82],
 M2Y:[function(){var z,y
 z=this.VF
 y=J.x(z)
 if(y.n(z,-1))return""
-return y.bu(z)},"$0","gZO",0,0,312,"formattedTokenPos",307],
+return y.bu(z)},"$0","gZO",0,0,87,"formattedTokenPos",82],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.fX,this.ar,null)
 z=this.VF
@@ -15101,33 +15272,33 @@
 if(y==null)return
 this.ar=F.Wi(this,C.fX,this.ar,a)
 z=J.nJ(a.rK(y))
-this.MT=F.Wi(this,C.Zt,this.MT,z)},
+this.MT=F.Wi(this,C.oI,this.MT,z)},
 $isZ9:true},
 Q4:{
-"^":["Pi;Yu<-317,Fm<-347,L4<-347,dh,uH@-525,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
-gPO:[function(){return this.dh},null,null,1,0,526,"jumpTarget",307,308],
+"^":["Pi;Yu<-93,Fm<-125,L4<-125,dh,uH@-301,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
+gPO:[function(){return this.dh},null,null,1,0,302,"jumpTarget",82,83],
 sPO:[function(a){var z=this.dh
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Qn,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=a},null,null,3,0,527,30,[],"jumpTarget",307],
-gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,348,"isComment",307],
-ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,348,"hasDescriptors",307],
+this.nq(this,z)}this.dh=a},null,null,3,0,303,27,[],"jumpTarget",82],
+gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,126,"isComment",82],
+ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,126,"hasDescriptors",82],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,312,"formattedAddress",307],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,87,"formattedAddress",82],
 Io:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,528,154,[],"formattedInclusive",307],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,304,305,[],"formattedInclusive",82],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,528,154,[],"formattedExclusive",307],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,304,305,[],"formattedExclusive",82],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -15156,18 +15327,18 @@
 this.nq(this,z)}this.dh=u
 return}++w}P.JS("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","I9",4,0,null,117,[],118,[]]}},
+static:{Tn:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
 bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.nj
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
 else if(z.n(a,"Reused"))return C.yP
 else if(z.n(a,"Tag"))return C.oA
 N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"$1","Ma",2,0,null,94,[]]}},
+throw H.b(P.hS())}}},
 Vi:{
 "^":"a;tT>,Av<",
 $isVi:true},
@@ -15175,26 +15346,28 @@
 "^":"a;tT>,Av<,wd>,Jv",
 $ist9:true},
 kx:{
-"^":["Zqa;J6,xM,Du@-317,fF@-317,vg@-317,Mb@-317,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,ar,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,529,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,530,30,[],"kind",307],
-glt:[function(){return this.xM},null,null,1,0,472,"totalSamplesInProfile",307,308],
-slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,361,30,[],"totalSamplesInProfile",307],
-gS7:[function(){return this.mM},null,null,1,0,312,"formattedInclusiveTicks",307,308],
-sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",307],
-gN8:[function(){return this.qH},null,null,1,0,312,"formattedExclusiveTicks",307,308],
-sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",307],
-gL1E:[function(){return this.Ni},null,null,1,0,329,"objectPool",307,308],
-sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,331,30,[],"objectPool",307],
-gMj:[function(a){return this.MO},null,null,1,0,329,"function",307,308],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,331,30,[],"function",307],
-gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
+"^":["D3i;J6,xM,Du@-93,fF@-93,vg@-93,Mb@-93,VS<-29,ci<-29,va<-29,Oo<-29,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,306,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,307,27,[],"kind",82],
+glt:[function(){return this.xM},null,null,1,0,249,"totalSamplesInProfile",82,83],
+slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,137,27,[],"totalSamplesInProfile",82],
+gS7:[function(){return this.mM},null,null,1,0,87,"formattedInclusiveTicks",82,83],
+sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,8,27,[],"formattedInclusiveTicks",82],
+gN8:[function(){return this.qH},null,null,1,0,87,"formattedExclusiveTicks",82,83],
+sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,8,27,[],"formattedExclusiveTicks",82],
+gL1E:[function(){return this.Ni},null,null,1,0,103,"objectPool",82,83],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,105,27,[],"objectPool",82],
+gMj:[function(a){return this.MO},null,null,1,0,103,"function",82,83],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,105,27,[],"function",82],
+gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
+gla:[function(){return this.MH},null,null,1,0,126,"isOptimized",82,83],
+sla:[function(a){this.MH=F.Wi(this,C.FQ,this.MH,a)},null,null,3,0,127,27,[],"isOptimized",82],
 gUm:function(){return!0},
 gM8:function(){return!0},
 tx:[function(a){var z,y
 this.ar=F.Wi(this,C.fX,this.ar,a)
-for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,531,532,[]],
+for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,308,309,[]],
 QW:function(){if(this.ar!=null)return
 if(!J.de(this.J6,C.l8))return
 var z=this.MO
@@ -15232,15 +15405,16 @@
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
 this.zz=z.t(b,"name")
+y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
+this.MH=F.Wi(this,C.FQ,this.MH,y)
 y=D.CQ(z.t(b,"kind"))
 this.J6=F.Wi(this,C.fy,this.J6,y)
 this.vg=H.BU(z.t(b,"start"),16,null)
 this.Mb=H.BU(z.t(b,"end"),16,null)
 y=this.P3
-y=y.gF1(y)
-x=y.Zr(z.t(b,"function"))
+x=y.gF1(y).Zr(z.t(b,"function"))
 this.MO=F.Wi(this,C.nf,this.MO,x)
-y=y.Zr(z.t(b,"object_pool"))
+y=y.gF1(y).Zr(z.t(b,"object_pool"))
 this.Ni=F.Wi(this,C.xG,this.Ni,y)
 w=z.t(b,"disassembly")
 if(w!=null)this.xs(w)
@@ -15251,8 +15425,8 @@
 this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
-gvS:[function(){return this.TD},null,null,1,0,348,"hasDisassembly",307,308],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,349,30,[],"hasDisassembly",307],
+gvS:[function(){return this.TD},null,null,1,0,126,"hasDisassembly",82,83],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,127,27,[],"hasDisassembly",82],
 xs:function(a){var z,y,x,w,v,u,t,s,r
 z=this.va
 y=J.w1(z)
@@ -15280,7 +15454,7 @@
 v=z.t(a,"tryIndex")
 u=J.rr(z.t(a,"kind"))
 for(z=J.GP(this.va);z.G();){t=z.gl()
-if(J.de(t.gYu(),y)){J.bi(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
+if(J.de(t.gYu(),y)){J.wT(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
 return}}N.Jx("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
 DZ:function(a){var z
 for(z=J.GP(a);z.G();)this.Ry(z.gl())},
@@ -15297,43 +15471,43 @@
 w+=3}},
 tg:function(a,b){J.J5(b,this.vg)
 return!1},
-gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,348,"isDartCode",307],
+gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,126,"isDartCode",82],
 $iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","Mr",4,0,null,117,[],118,[]]}},
-Zqa:{
+static:{Vb:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
+D3i:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.gKn())},"$1",null,2,0,null,533,[],"call"],
+J.SK(y).ml(z.gKn())},"$1",null,2,0,null,310,[],"call"],
 $isEH:true},
 fx:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,53,[],57,[],"call"],
 $isEH:true},
 UZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y
+"^":"Tp:75;a,b",
+$2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
 if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
 else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},"$2",null,4,0,null,374,[],121,[],"call"],
+else if(y)D.Gf(b,this.b)},
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
 zMr:{
-"^":["V26;jA%-534,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,535,"error",307,330],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,536,30,[],"error",307],
+"^":["V27;jA%-311,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.jA},null,null,1,0,312,"error",82,104],
+skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,313,27,[],"error",82],
 "@":function(){return[C.uvO]},
 static:{hp:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15341,21 +15515,21 @@
 a.X0=w
 C.SX.ZL(a)
 C.SX.oX(a)
-return a},null,null,0,0,126,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[537],
-V26:{
+return a},null,null,0,0,22,"new ServiceErrorViewElement$created"]}},
+"+ServiceErrorViewElement":[314],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 nk:{
-"^":["V27;Xc%-538,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,539,"exception",307,330],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,540,30,[],"exception",307],
+"^":["V28;Xc%-315,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFA:[function(a){return a.Xc},null,null,1,0,316,"exception",82,104],
+sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,317,27,[],"exception",82],
 "@":function(){return[C.vr3]},
 static:{dS:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15363,30 +15537,30 @@
 a.X0=w
 C.Vd.ZL(a)
 C.Vd.oX(a)
-return a},null,null,0,0,126,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[541],
-V27:{
+return a},null,null,0,0,22,"new ServiceExceptionViewElement$created"]}},
+"+ServiceExceptionViewElement":[318],
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":"zM;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"H6;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 z6:function(a,b){var z
 N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
-return W.It(J.WB(z,b),null,null).OA(new U.dT())},
+return W.Kn(J.WB(z,b),null,null).OA(new U.dT())},
 SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
 dT:{
-"^":"Tp:115;",
+"^":"Tp:16;",
 $1:[function(a){var z
 N.Jx("").hh("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,171,[],"call"],
+return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 ho:{
-"^":"zM;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"H6;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 q3:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -15396,7 +15570,7 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"$1","gVx",2,0,169,22,[]],
+J.Xf(v,w)},"$1","gVx",2,0,26,319,[]],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -15412,9 +15586,9 @@
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V28;mC%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,310,"object",307,330],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,311,30,[],"object",307],
+"^":["V29;mC%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,85,"object",82,104],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,86,27,[],"object",82],
 hu:[function(a){var z
 switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.mC)
@@ -15440,7 +15614,7 @@
 case"HeapMap":z=W.r3("heap-map",null)
 J.Nf(z,a.mC)
 return z
-case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"String":case"Type":z=W.r3("instance-view",null)
+case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Bigint":case"String":z=W.r3("instance-view",null)
 J.ti(z,a.mC)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
@@ -15469,8 +15643,8 @@
 return z
 default:z=W.r3("json-view",null)
 J.wD(z,a.mC)
-return z}},"$0","gbs",0,0,542,"_constructElementForObject"],
-fa:[function(a,b){var z,y,x
+return z}},"$0","gbs",0,0,320,"_constructElementForObject"],
+xJ:[function(a,b){var z,y,x
 this.pj(a)
 z=a.mC
 if(z==null){N.Jx("").To("Viewing null object.")
@@ -15478,12 +15652,12 @@
 x=this.hu(a)
 if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,115,242,[],"objectChanged"],
+N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,16,65,[],"objectChanged"],
 "@":function(){return[C.Tl]},
 static:{zy:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15491,38 +15665,40 @@
 a.X0=w
 C.ZO.ZL(a)
 C.ZO.oX(a)
-return a},null,null,0,0,126,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[543],
-V28:{
+return a},null,null,0,0,22,"new ServiceObjectViewElement$created"]}},
+"+ServiceObjectViewElement":[321],
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Vfx;tY%-334,Pe%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,310,"ref",307,330],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,311,30,[],"ref",307],
-gjT:[function(a){return a.Pe},null,null,1,0,348,"internal",307,330],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,349,30,[],"internal",307],
-aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
+"^":["Vfx;tY%-108,Pe%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,85,"ref",82,104],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,86,27,[],"ref",82],
+gjT:[function(a){return a.Pe},null,null,1,0,126,"internal",82,104],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,127,27,[],"internal",82],
+P9:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,169,242,[],"refChanged"],
+this.ct(a,C.KG,0,1)
+this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,26,65,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,312,"url"],
+return z.gHP()},null,null,1,0,87,"url"],
 gOL:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,312,"serviceId"],
+return J.F8(z)},null,null,1,0,87,"serviceId"],
 gD5:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,312,"hoverText"],
+return z.gzz()},null,null,1,0,87,"hoverText"],
 goc:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,312,"name"],
+return J.O6(z)},null,null,1,0,87,"name"],
+gRw:[function(a){return J.FN(this.goc(a))},null,null,1,0,126,"nameIsEmpty"],
 "@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -15531,27 +15707,27 @@
 a.X0=w
 C.wU.ZL(a)
 C.wU.oX(a)
-return a},null,null,0,0,126,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[544],
+return a},null,null,0,0,22,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[322],
 Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
 Uj:{
-"^":["Bc;kF%-335,IK%-347,Qt%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gTq:[function(a){return a.kF},null,null,1,0,348,"checked",307,330],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,349,30,[],"checked",307],
-gEu:[function(a){return a.IK},null,null,1,0,312,"checkedText",307,330],
-sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",307],
-gRY:[function(a){return a.Qt},null,null,1,0,312,"uncheckedText",307,330],
-sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,32,30,[],"uncheckedText",307],
+"^":["Bc;kF%-109,IK%-125,Qt%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,126,"checked",82,104],
+sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,127,27,[],"checked",82],
+gEu:[function(a){return a.IK},null,null,1,0,87,"checkedText",82,104],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,8,27,[],"checkedText",82],
+gRY:[function(a){return a.Qt},null,null,1,0,87,"uncheckedText",82,104],
+sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,8,27,[],"uncheckedText",82],
 RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,343,21,[],545,[],82,[],"change"],
+a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,120,7,[],323,[],119,[],"change"],
 "@":function(){return[C.mS]},
 static:{Al:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15559,21 +15735,21 @@
 a.X0=w
 C.fA.ZL(a)
 C.fA.oX(a)
-return a},null,null,0,0,126,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[546],
+return a},null,null,0,0,22,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[324],
 Bc:{
 "^":"xc+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 xT:{
-"^":["V29;rd%-547,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.rd},null,null,1,0,514,"frame",307,330],
-sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,508,30,[],"frame",307],
+"^":["V30;rd%-325,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.rd},null,null,1,0,288,"frame",82,104],
+sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,283,27,[],"frame",82],
 "@":function(){return[C.Xv]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15581,22 +15757,22 @@
 a.X0=w
 C.dX.ZL(a)
 C.dX.oX(a)
-return a},null,null,0,0,126,"new StackFrameElement$created"]}},
-"+StackFrameElement":[548],
-V29:{
+return a},null,null,0,0,22,"new StackFrameElement$created"]}},
+"+StackFrameElement":[326],
+V30:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uwf:{
-"^":["V30;B3%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,329,"trace",307,330],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,331,30,[],"trace",307],
-pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["V31;B3%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,103,"trace",82,104],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,105,27,[],"trace",82],
+pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15604,18 +15780,18 @@
 a.X0=w
 C.bg.ZL(a)
 C.bg.oX(a)
-return a},null,null,0,0,126,"new StackTraceElement$created"]}},
-"+StackTraceElement":[549],
-V30:{
+return a},null,null,0,0,22,"new StackTraceElement$created"]}},
+"+StackTraceElement":[327],
+V31:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
-IP:[function(a){var z=J.x(a)
+IP:function(a){var z=J.x(a)
 if(!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},"$1","tF",2,0,null,142,[]],
-iX:[function(a,b){var z,y,x,w,v,u,t,s
+default:return z.gLm(a)}},
+iX:function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
 if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
@@ -15626,8 +15802,8 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"$2","Nc",4,0,null,273,[],291,[]],
-HP:[function(a,b,c,d,e){var z,y,x
+return new M.K6(z,u,w,t)},
+HP:function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
 M.Ky(a).wh(z)
@@ -15636,17 +15812,17 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"$5","K4",10,0,null,273,[],162,[],292,[],291,[],293,[]],
-bM:[function(a){var z
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},
+bM:function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
 if(!!z.$isYN||!!z.$isI0||!!z.$ishy)return a
-return},"$1","ay",2,0,null,273,[]],
-pN:[function(a,b){var z,y
+return},
+pN:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$iscv)return M.F5(a,b)
 if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"$2","vw",4,0,null,273,[],291,[]],
-F5:[function(a,b){var z,y,x
+if(y!=null)return["text",y]}return},
+F5:function(a,b){var z,y,x
 z={}
 z.a=null
 z.b=!1
@@ -15656,8 +15832,8 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"$2","OT",4,0,null,142,[],291,[]],
-Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+y.push(M.F4("{{}}","bind",a,b))}return z.a},
+Iu:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
 t=u.gEJ()
@@ -15686,8 +15862,8 @@
 t.push(L.Sk(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"$4","NJ",6,2,null,85,298,[],273,[],292,[],293,[]],
-F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(y)d.push(i)}},
+F4:function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=a.length
 if(z===0)return
 for(y=d==null,x=J.U6(a),w=null,v=0;v<z;){u=x.XU(a,"{{",v)
@@ -15702,14 +15878,14 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"$4","jF",8,0,null,94,[],12,[],273,[],291,[]],
-SH:[function(a,b){var z,y
+return z},
+SH:function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"$2","St",4,0,null,220,[],292,[]],
-Ky:[function(a){var z,y,x,w
+z=z.nextSibling}},
+Ky:function(a){var z,y,x,w
 z=$.rw()
 z.toString
 y=H.VK(a,"expando$values")
@@ -15723,12 +15899,12 @@
 else w=!0
 x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},"$1","La",2,0,null,273,[]],
-wR:[function(a){var z=J.x(a)
+return x},
+wR:function(a){var z=J.x(a)
 if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
-return z},"$1","xS",2,0,null,211,[]],
+return z},
 V2:{
 "^":"TU;N1,mD,Ck",
 Z1:function(a,b,c,d){var z,y,x,w,v
@@ -15771,14 +15947,14 @@
 v=null}}else{w=null
 v=null}M.NP.prototype.EC.call(this,a)
 if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)}},
-H2:{
+b2i:{
 "^":"TR;",
 cO:function(a){if(this.qP==null)return
 this.Ca.ed()
 X.TR.prototype.cO.call(this,this)}},
-lP:{
-"^":"Tp:126;",
-$0:[function(){var z,y,x,w,v
+DO:{
+"^":"Tp:22;",
+$0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
 y.st5(z,"checkbox")
@@ -15791,26 +15967,26 @@
 v=document.createEvent("MouseEvent")
 J.e2(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.mt:C.Nm.gtH(x)},"$0",null,0,0,null,"call"],
+return x.length===1?C.mt:C.Nm.gtH(x)},
 $isEH:true},
 fTP:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.push(C.pi)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 ppY:{
-"^":"Tp:115;b",
-$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;b",
+$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,7,[],"call"],
 $isEH:true},
 NP:{
-"^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:function(a){var z=this.gH()
 J.ta(z,a==null?"":H.d(a))},
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"$1","gqf",2,0,169,21,[]]},
-jt:{
-"^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+O.Y3()},"$1","gqf",2,0,26,7,[]]},
+Vh:{
+"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:function(a){var z=X.TR.prototype.gH.call(this)
 J.rP(z,null!=a&&!1!==a)},
@@ -15819,8 +15995,8 @@
 J.ta(this.xS,z)
 if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
 x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,169,21,[]],
-static:{kv:[function(a){var z,y,x
+if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,26,7,[]],
+static:{kv:function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
 z.toString
@@ -15828,10 +16004,10 @@
 return z.ev(z,new M.r0(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"$1","VE",2,0,null,142,[]]}},
+return x.ev(x,new M.jz(a))}}}},
 r0:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y
+"^":"Tp:16;a",
+$1:function(a){var z,y
 z=this.a
 y=J.x(a)
 if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
@@ -15839,15 +16015,15 @@
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"$1",null,2,0,null,295,[],"call"],
+return z},
 $isEH:true},
 jz:{
-"^":"Tp:115;b",
-$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"$1",null,2,0,null,295,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){var z=J.x(a)
+return!z.n(a,this.b)&&z.gMB(a)==null},
 $isEH:true},
 SA:{
-"^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
+"^":"b2i;Dh,Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:function(a){var z
 this.C7()
@@ -15873,18 +16049,18 @@
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"$1","gqf",2,0,169,21,[]],
+J.ta(this.xS,z)}},"$1","gqf",2,0,26,7,[]],
 $isSA:true,
-static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"$1","v7",2,0,null,30,[]]}},
+static:{qb:function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
+return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 hB:{
-"^":"Tp:300;a",
+"^":"Tp:75;a",
 $2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],550,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,231,[],328,[],"call"],
 $isEH:true},
 nv:{
-"^":"Tp:115;",
-$1:[function(a){return 0},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return 0},
 $isEH:true},
 ee:{
 "^":"V2;N1,mD,Ck",
@@ -15892,8 +16068,7 @@
 Z1:function(a,b,c,d){var z,y,x
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-y=this.gN1()
-J.MV(!!J.x(y).$isTU?y:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
 J.Vs(this.N1).Rz(0,b)
 y=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
@@ -15903,7 +16078,7 @@
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}else{z=this.N1
 x=d!=null?d:""
-x=new M.jt(null,z,c,null,null,"checked",x)
+x=new M.Vh(null,z,c,null,null,"checked",x)
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
@@ -15925,13 +16100,12 @@
 for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 if(y!=null)J.wC(y)}this.mD=null},
 gCd:function(a){var z=this.mD
-if(z==null){z=P.L5(null,null,null,J.O,X.TR)
+if(z==null){z=P.L5(null,null,null,P.qU,X.TR)
 this.mD=z}return z},
-glN:function(){var z=this.gN1()
-return!!J.x(z).$isTU?z:this},
+glN:function(){return!!J.x(this.gN1()).$isTU?this.gN1():this},
 $isTU:true},
 yp:{
-"^":"a;rg,qW,k8<"},
+"^":"a;rg,Ug,k8<"},
 ug:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
@@ -15939,8 +16113,7 @@
 if(J.de(b,"selectedindex"))b="selectedIndex"
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 y=this.N1
@@ -16063,7 +16236,7 @@
 return!0},
 Sy:function(){return this.wh(null)},
 $isDT:true,
-static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
+static:{"^":"mn,EW,Sf,To",Fz:function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
 y=J.x(z)
 if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
@@ -16071,13 +16244,13 @@
 else y=!1
 if(y)return z
 for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"$2","Tkw",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
+return z},TA:function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"$1","lA",2,0,null,270,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},eX:function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
@@ -16091,25 +16264,25 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},"$1","Bw",2,0,null,295,[]],KE:[function(a,b,c){var z,y,x,w
+break}}return y},KE:function(a,b,c){var z,y,x,w
 z=J.G6(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"$3","BZ",6,0,null,270,[],295,[],296,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},GM:function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.$1(a)
-y.aN(y,z)},"$1","DR",2,0,null,297,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},oR:function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 J.c9(z,H.d($.cz())+" { display: none; }")
-document.head.appendChild(z)},"$0","Lv",0,0,null]}},
+document.head.appendChild(z)}}},
 OB:{
-"^":"Tp:169;",
-$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"$1",null,2,0,null,270,[],"call"],
+"^":"Tp:26;",
+$1:function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},
 $isEH:true},
-Uf:{
-"^":"Tp:115;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,374,[],"call"],
+lP:{
+"^":"Tp:16;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,158,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
@@ -16129,8 +16302,8 @@
 this.ud=null},
 $isTR:true},
 NW:{
-"^":"Tp:300;a,b,c,d",
-$2:[function(a,b){var z,y,x,w
+"^":"Tp:75;a,b,c,d",
+$2:function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
 if(b==="")b="{{}}"}else if(z.n(a,"bind")||z.n(a,"repeat")){this.a.c=!0
@@ -16141,7 +16314,7 @@
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},"$2",null,4,0,null,12,[],30,[],"call"],
+z.push(y)}},
 $isEH:true},
 HS:{
 "^":"a;EJ<,PU",
@@ -16160,7 +16333,7 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"$1","gBg",2,0,551,30,[]],
+return y+H.d(z[3])},"$1","gBg",2,0,329,27,[]],
 DJ:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -16170,7 +16343,7 @@
 u=w+2
 if(u>=z.length)return H.e(z,u)
 t=z[u]
-y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,552,553,[]],
+y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,330,331,[]],
 Yn:function(a){this.PU=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -16191,12 +16364,12 @@
 u=this.eD
 v.push(L.Sk(z,u,null))
 w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
-this.Az(w.gP(w))},"$0","gjM",0,0,126],
+this.Az(w.gP(w))},"$0","gjM",0,0,22],
 Az:function(a){var z,y,x,w
 z=this.xG
 this.Gb()
 y=J.x(a)
-if(!!y.$isList){this.xG=a
+if(!!y.$iszM){this.xG=a
 x=a}else if(!!y.$isQV){x=y.br(a)
 this.xG=x}else{this.xG=null
 x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
@@ -16271,7 +16444,7 @@
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
 k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,554,264,[]],
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,332,333,[]],
 uS:function(a){var z
 for(z=J.GP(a);z.G();)J.wC(z.gl())},
 Gb:function(){var z=this.IY
@@ -16288,21 +16461,21 @@
 this.FS=null}this.e9.kr=null
 this.pq=!0}},
 VU:{
-"^":"Tp:115;",
-$1:[function(a){return[a]},"$1",null,2,0,null,28,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return[a]},"$1",null,2,0,null,231,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:555;a",
+"^":"Tp:334;a",
 $1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"$1",null,2,0,null,553,[],"call"],
+return this.a?y:[y]},"$1",null,2,0,null,331,[],"call"],
 $isEH:true},
 R7:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,350,[],"call"],
+"^":"Tp:16;b",
+$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,128,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -16328,8 +16501,7 @@
 gN1:function(){return this.N1},
 Z1:function(a,b,c,d){var z,y,x
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 y=this.N1
@@ -16367,18 +16539,18 @@
 this.EC(J.Vm(this.xS))},
 $isTR:true},
 VD:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
 $1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,350,[],"call"],
+return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,128,[],"call"],
 $isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.Ye]},
 static:{cF:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -16387,21 +16559,21 @@
 a.X0=w
 C.V8.ZL(a)
 C.V8.oX(a)
-return a},null,null,0,0,126,"new VMRefElement$created"]}},
-"+VMRefElement":[336]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+return a},null,null,0,0,22,"new VMRefElement$created"]}},
+"+VMRefElement":[110]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
-en:{
-"^":["V31;ID%-305,lc%-556,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,507,"vm",307,330],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,557,30,[],"vm",307],
-gkc:[function(a){return a.lc},null,null,1,0,521,"error",307,330],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,522,30,[],"error",307],
-pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+SC:{
+"^":["V32;ID%-80,lc%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzf:[function(a){return a.ID},null,null,1,0,281,"vm",82,104],
+szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,336,27,[],"vm",82],
+gkc:[function(a){return a.lc},null,null,1,0,297,"error",82,104],
+skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,298,27,[],"error",82],
+pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
 "@":function(){return[C.Hk]},
 static:{oH:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -16409,34 +16581,28 @@
 a.X0=w
 C.nt.ZL(a)
 C.nt.oX(a)
-return a},null,null,0,0,126,"new VMViewElement$created"]}},
-"+VMViewElement":[558],
-V31:{
+return a},null,null,0,0,22,"new VMViewElement$created"]}},
+"+VMViewElement":[337],
+V32:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
-J.O.$isString=true
-J.O.$isTx=true
-J.O.$asTx=[J.O]
-J.O.$isa=true
-J.P.$isTx=true
-J.P.$asTx=[J.P]
-J.P.$isa=true
-J.bU.$isint=true
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isa=true
-J.Pp.$isdouble=true
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isa=true
+P.qU.$isqU=true
+P.qU.$isTx=true
+P.qU.$asTx=[P.qU]
+P.qU.$isa=true
+P.lf.$isTx=true
+P.lf.$asTx=[P.lf]
+P.lf.$isa=true
+P.KN.$isKN=true
+P.KN.$isTx=true
+P.KN.$asTx=[P.lf]
+P.KN.$isa=true
+P.CP.$isCP=true
+P.CP.$isTx=true
+P.CP.$asTx=[P.lf]
+P.CP.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
@@ -16450,9 +16616,9 @@
 P.a6.$isTx=true
 P.a6.$asTx=[P.a6]
 P.a6.$isa=true
-J.Q.$isList=true
-J.Q.$isQV=true
-J.Q.$isa=true
+P.zM.$iszM=true
+P.zM.$isQV=true
+P.zM.$isa=true
 P.Od.$isa=true
 P.a.$isa=true
 W.cv.$iscv=true
@@ -16492,8 +16658,8 @@
 P.wv.$isa=true
 T.yj.$isyj=true
 T.yj.$isa=true
-J.kn.$isbool=true
-J.kn.$isa=true
+P.a2.$isa2=true
+P.a2.$isa=true
 W.OJ.$isea=true
 W.OJ.$isa=true
 A.XP.$isXP=true
@@ -16542,9 +16708,9 @@
 W.ea.$isa=true
 P.qh.$isqh=true
 P.qh.$isa=true
-W.Wp.$isWp=true
-W.Wp.$isea=true
-W.Wp.$isa=true
+W.Aj.$isAj=true
+W.Aj.$isea=true
+W.Aj.$isa=true
 G.DA.$isDA=true
 G.DA.$isa=true
 M.Ya.$isa=true
@@ -16582,6 +16748,18 @@
 D.e5.$isa=true
 D.Q4.$isa=true
 D.N8.$isa=true
+D.U4.$isaf=true
+D.U4.$isa=true
+D.rj.$isrj=true
+D.rj.$isaf=true
+D.rj.$isa=true
+D.SI.$isSI=true
+D.SI.$isaf=true
+D.SI.$isqC=true
+D.SI.$asqC=[null,null]
+D.SI.$isZ0=true
+D.SI.$asZ0=[null,null]
+D.SI.$isa=true
 D.c2.$isa=true
 W.zU.$isD0=true
 W.zU.$isa=true
@@ -16624,13 +16802,6 @@
 V.qC.$isqC=true
 V.qC.$isZ0=true
 V.qC.$isa=true
-D.SI.$isSI=true
-D.SI.$isaf=true
-D.SI.$isqC=true
-D.SI.$asqC=[null,null]
-D.SI.$isZ0=true
-D.SI.$asZ0=[null,null]
-D.SI.$isa=true
 P.jp.$isjp=true
 P.jp.$isa=true
 P.Tx.$isTx=true
@@ -16665,9 +16836,6 @@
 D.hR.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
-D.rj.$isrj=true
-D.rj.$isaf=true
-D.rj.$isa=true
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
@@ -16696,10 +16864,10 @@
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
 return J.ks(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.Jh.prototype
-if(typeof a=="boolean")return J.kn.prototype
+if(typeof a=="boolean")return J.yEe.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
@@ -16721,7 +16889,6 @@
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
-J.Eh=function(a,b){return J.Wx(a).O(a,b)}
 J.Ew=function(a){return J.RE(a).gSw(a)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
 J.F6=function(a,b){return J.RE(a).stD(a,b)}
@@ -16734,6 +16901,7 @@
 J.GL=function(a){return J.RE(a).gfN(a)}
 J.GP=function(a){return J.w1(a).gA(a)}
 J.GW=function(a){return J.RE(a).gVY(a)}
+J.H2=function(a,b){return J.RE(a).sDD(a,b)}
 J.HF=function(a){return J.RE(a).gD7(a)}
 J.Hf=function(a){return J.RE(a).gTq(a)}
 J.IQ=function(a){return J.RE(a).Ms(a)}
@@ -16775,6 +16943,7 @@
 J.OS=function(a,b){return J.w1(a).tt(a,b)}
 J.Or=function(a){return J.RE(a).yx(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
+J.Pz=function(a,b){return J.RE(a).szZ(a,b)}
 J.Q5=function(a){return J.RE(a).gwl(a)}
 J.Q8=function(a){return J.RE(a).gp8(a)}
 J.QC=function(a){return J.w1(a).wg(a)}
@@ -16815,7 +16984,6 @@
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
 J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.YD=function(a){return J.RE(a).gR(a)}
 J.YP=function(a){return J.RE(a).gQ7(a)}
 J.YV=function(a){return J.RE(a).goE(a)}
 J.Yl=function(a){return J.w1(a).np(a)}
@@ -16827,12 +16995,11 @@
 J.aK=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.ak=function(a){return J.RE(a).gNF(a)}
 J.am=function(a){return J.RE(a).VD(a)}
-J.bB=function(a){return J.x(a).gbx(a)}
 J.bY=function(a,b){return J.Wx(a).Y(a,b)}
 J.bd=function(a,b){return J.RE(a).sBu(a,b)}
-J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
 J.bs=function(a){return J.RE(a).JP(a)}
+J.c1=function(a,b){return J.Wx(a).O(a,b)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
@@ -16845,15 +17012,14 @@
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
 J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
 J.eI=function(a,b){return J.RE(a).bA(a,b)}
+J.eY=function(a){return J.RE(a).gR(a)}
 J.f5=function(a){return J.RE(a).gI(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
-J.iF=function(a,b){return J.RE(a).szZ(a,b)}
 J.iS=function(a){return J.RE(a).gox(a)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
-J.ja=function(a,b){return J.w1(a).Vr(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
@@ -16869,6 +17035,7 @@
 J.m4=function(a){return J.RE(a).gig(a)}
 J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
 return J.Wx(a).i(a,b)}
+J.nG=function(a,b){return J.RE(a).vV(a,b)}
 J.nJ=function(a){return J.RE(a).ga4(a)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
@@ -16876,6 +17043,7 @@
 J.on=function(a){return J.RE(a).gtT(a)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
+J.pb=function(a,b){return J.w1(a).Vr(a,b)}
 J.pe=function(a,b){return J.RE(a).pr(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
@@ -16906,6 +17074,7 @@
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wC=function(a){return J.RE(a).cO(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
+J.wT=function(a,b){return J.w1(a).h(a,b)}
 J.wp=function(a,b,c,d){return J.w1(a).zB(a,b,c,d)}
 J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
@@ -16913,7 +17082,6 @@
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yn=function(a,b){return J.RE(a).vV(a,b)}
 J.yxg=function(a){return J.RE(a).gGd(a)}
 J.z2=function(a){return J.RE(a).gG1(a)}
 J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
@@ -16926,11 +17094,11 @@
 C.oq=Q.Tg.prototype
 C.ka=Z.Jc.prototype
 C.IK=O.CN.prototype
-C.ux=F.Be.prototype
+C.YD=F.Be.prototype
 C.j8=R.i6.prototype
 C.O0=R.lw.prototype
 C.OD=F.Ir.prototype
-C.Gh=L.rm.prototype
+C.Gh=L.bf.prototype
 C.UF=R.Lt.prototype
 C.MC=D.UL.prototype
 C.LT=A.jM.prototype
@@ -16948,12 +17116,12 @@
 C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
 C.ON=J.Pp.prototype
-C.jn=J.bU.prototype
+C.jn=J.imn.prototype
 C.jN=J.Jh.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
-C.ct=A.oM.prototype
+C.ct=A.Zt.prototype
 C.Z3=R.LU.prototype
 C.MG=M.KL.prototype
 C.S2=W.H9.prototype
@@ -16969,7 +17137,7 @@
 C.Iv=A.xc.prototype
 C.Cc=Q.NQ.prototype
 C.HD=T.ov.prototype
-C.c0=A.knI.prototype
+C.c0=A.kn.prototype
 C.cJ=U.fI.prototype
 C.SX=R.zMr.prototype
 C.Vd=D.nk.prototype
@@ -16981,18 +17149,11 @@
 C.lx=A.tz.prototype
 C.vB=J.is.prototype
 C.V8=X.I5.prototype
-C.nt=U.en.prototype
+C.nt=U.SC.prototype
 C.ol=W.u9.prototype
 C.KZ=new H.hJ()
 C.OL=new U.EZ()
 C.Gw=new H.yq()
-C.E3=new J.Q()
-C.Fm=new J.kn()
-C.yX=new J.Pp()
-C.c1=new J.bU()
-C.x0=new J.Jh()
-C.oD=new J.P()
-C.Kn=new J.O()
 C.J19=new K.ndx()
 C.IU=new P.TO()
 C.Us=new A.yL()
@@ -17001,7 +17162,7 @@
 C.xd=new A.Mh()
 C.vT=new P.mg()
 C.NU=new P.R8()
-C.v8=new P.AHi()
+C.v8=new P.nU()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.nj=new D.WAE("Native")
@@ -17034,7 +17195,7 @@
 C.js=new A.V3("stack-trace")
 C.Ur=new A.V3("script-ref")
 C.tSc=new A.V3("class-ref")
-C.jy=new A.V3("breakpoint-list")
+C.PT=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Ye=new A.V3("vm-ref")
 C.Gu=new A.V3("collapsible-content")
@@ -17042,8 +17203,8 @@
 C.kR=new A.V3("observatory-application")
 C.uvO=new A.V3("service-error-view")
 C.Qz=new A.V3("eval-box")
-C.zaS=new A.V3("isolate-nav-menu")
-C.qJ=new A.V3("class-nav-menu")
+C.oD=new A.V3("isolate-nav-menu")
+C.iF=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
 C.u7=new A.V3("nav-menu")
 C.KH=new A.V3("json-view")
@@ -17054,17 +17215,17 @@
 C.JD=new A.V3("service-ref")
 C.nW=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
-C.qlk=new A.V3("instance-view")
+C.be=new A.V3("instance-view")
 C.ny=new P.a6(0)
-C.mt=H.VM(new W.UC("change"),[W.ea])
-C.pi=H.VM(new W.UC("click"),[W.Wp])
-C.MD=H.VM(new W.UC("error"),[W.ew])
-C.PP=H.VM(new W.UC("hashchange"),[W.ea])
-C.i3=H.VM(new W.UC("input"),[W.ea])
-C.fK=H.VM(new W.UC("load"),[W.ew])
-C.Ns=H.VM(new W.UC("message"),[W.cx])
-C.DK=H.VM(new W.UC("mousedown"),[W.Wp])
-C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
+C.mt=H.VM(new W.e0("change"),[W.ea])
+C.T1=H.VM(new W.e0("click"),[W.Aj])
+C.MD=H.VM(new W.e0("error"),[W.ew])
+C.PP=H.VM(new W.e0("hashchange"),[W.ea])
+C.i3=H.VM(new W.e0("input"),[W.ea])
+C.fK=H.VM(new W.e0("load"),[W.ew])
+C.Ns=H.VM(new W.e0("message"),[W.cx])
+C.DK=H.VM(new W.e0("mousedown"),[W.Aj])
+C.W2=H.VM(new W.e0("mousemove"),[W.Aj])
 C.Mc=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -17198,12 +17359,12 @@
 }
 C.xr=new P.by(null,null)
 C.A3=new P.Cf(null)
-C.cb=new P.dI(null,null)
+C.cb=new P.ze(null,null)
 C.Ek=new N.qV("FINER",400)
 C.R5=new N.qV("FINE",500)
 C.IF=new N.qV("INFO",800)
 C.cV=new N.qV("SEVERE",1000)
-C.UP=new N.qV("WARNING",900)
+C.nT=new N.qV("WARNING",900)
 I.makeConstantList = function(list) {
   list.immutable$list = init;
   list.fixed$length = init;
@@ -17217,7 +17378,7 @@
 C.Me=H.VM(I.makeConstantList([]),[P.Ms])
 C.dn=H.VM(I.makeConstantList([]),[P.tg])
 C.hU=H.VM(I.makeConstantList([]),[P.X9])
-C.iH=H.VM(I.makeConstantList([]),[J.bU])
+C.iH=H.VM(I.makeConstantList([]),[P.KN])
 C.xD=I.makeConstantList([])
 C.Qy=I.makeConstantList(["in","this"])
 C.Ym=I.makeConstantList(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
@@ -17229,8 +17390,8 @@
 C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
 C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
+C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
 C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
 C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.CM=new H.LPe(0,{},C.xD)
@@ -17265,8 +17426,10 @@
 C.tP=new H.GD("entry")
 C.YU=new H.GD("error")
 C.ne=new H.GD("exception")
+C.dI=new H.GD("expand")
 C.mr=new H.GD("expanded")
 C.Of=new H.GD("expander")
+C.Jt=new H.GD("expanderStyle")
 C.Yy=new H.GD("expr")
 C.IV=new H.GD("field")
 C.CX=new H.GD("fileAndLine")
@@ -17275,7 +17438,7 @@
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
 C.eF=new H.GD("formattedInclusiveTicks")
-C.Zt=new H.GD("formattedLine")
+C.oI=new H.GD("formattedLine")
 C.ST=new H.GD("formattedTotalCollectionTime")
 C.QH=new H.GD("fragmentation")
 C.rE=new H.GD("frame")
@@ -17284,6 +17447,7 @@
 C.mP=new H.GD("hasClass")
 C.zS=new H.GD("hasDisassembly")
 C.D2=new H.GD("hasParent")
+C.Ia=new H.GD("hashLinkWorkaround")
 C.lb=new H.GD("hideTagsChecked")
 C.du=new H.GD("hitStyle")
 C.bA=new H.GD("hoverText")
@@ -17295,6 +17459,7 @@
 C.P9=new H.GD("isDart")
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
+C.FQ=new H.GD("isOptimized")
 C.Z8=new H.GD("isolate")
 C.Qn=new H.GD("jumpTarget")
 C.fy=new H.GD("kind")
@@ -17302,17 +17467,19 @@
 C.QL=new H.GD("last")
 C.kA=new H.GD("lastTokenPos")
 C.Wn=new H.GD("length")
+C.Ij=new H.GD("libraries")
 C.EV=new H.GD("library")
 C.eh=new H.GD("lineMode")
 C.Cv=new H.GD("lines")
 C.dB=new H.GD("link")
-C.wT=new H.GD("mainPort")
+C.dH=new H.GD("mainPort")
 C.p3=new H.GD("map")
 C.t6=new H.GD("mapAsString")
 C.PC=new H.GD("dart.core.int")
 C.ch=new H.GD("message")
 C.UX=new H.GD("msg")
 C.YS=new H.GD("name")
+C.KG=new H.GD("nameIsEmpty")
 C.So=new H.GD("newHeapCapacity")
 C.IO=new H.GD("newHeapUsed")
 C.OV=new H.GD("noSuchMethod")
@@ -17320,6 +17487,7 @@
 C.xG=new H.GD("objectPool")
 C.Le=new H.GD("oldHeapCapacity")
 C.SW=new H.GD("oldHeapUsed")
+C.ZU=new H.GD("pad")
 C.wq=new H.GD("pausedOnExit")
 C.NT=new H.GD("pausedOnStart")
 C.Kl=new H.GD("pos")
@@ -17332,7 +17500,7 @@
 C.mE=new H.GD("response")
 C.UY=new H.GD("result")
 C.Aa=new H.GD("results")
-C.xe=new H.GD("rootLib")
+C.iG=new H.GD("rootLib")
 C.X8=new H.GD("running")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
@@ -17362,55 +17530,47 @@
 C.KS=new H.GD("vmName")
 C.v6=new H.GD("void")
 C.n8=H.uV('qC')
-C.WP=new H.QT(C.n8,"K",0)
+C.WP=new H.bB(C.n8,"K",0)
 C.SL=H.uV('Ae')
-C.xC=new H.QT(C.SL,"V",0)
+C.xC=new H.bB(C.SL,"V",0)
 C.QJ=H.uV('xh')
-C.wW=new H.QT(C.QJ,"T",0)
+C.wW=new H.bB(C.QJ,"T",0)
 C.Gsc=H.uV('wn')
-C.io=new H.QT(C.Gsc,"E",0)
-C.nz=new H.QT(C.n8,"V",0)
+C.io=new H.bB(C.Gsc,"E",0)
+C.nz=new H.bB(C.n8,"V",0)
 C.RP=H.uV('hx')
+C.I7=H.uV('bf')
 C.q0S=H.uV('Dg')
 C.z6Y=H.uV('Tg')
-C.xFi=H.uV('rm')
-C.eY=H.uV('n6')
 C.J9=H.uV('zMr')
-C.Vh=H.uV('Pz')
 C.zq=H.uV('Qa')
+C.tf=H.uV('Zt')
 C.qfw=H.uV('qW')
 C.GTO=H.uV('F1')
+C.wc=H.uV('kn')
 C.nY=H.uV('a')
 C.Yc=H.uV('iP')
 C.Pt=H.uV('ov')
 C.jRs=H.uV('Be')
 C.Ow=H.uV('oO')
-C.PT=H.uV('I2')
-C.p8F=H.uV('NQ')
-C.xLI=H.uV('pz')
+C.xF=H.uV('NQ')
+C.Xb=H.uV('pz')
 C.xz=H.uV('Stq')
-C.T1=H.uV('Wy')
 C.aj=H.uV('fI')
 C.Kh=H.uV('I5')
-C.la=H.uV('ZX')
 C.G4=H.uV('CN')
-C.O4=H.uV('double')
-C.yw=H.uV('int')
+C.O4=H.uV('CP')
+C.yw=H.uV('KN')
 C.b7=H.uV('uwf')
 C.RcY=H.uV('aQ')
 C.KJ=H.uV('mk')
-C.ST4=H.uV('en')
 C.X6M=H.uV('jM')
-C.yiu=H.uV('knI')
 C.dUi=H.uV('Uj')
 C.U9=H.uV('UL')
-C.iG=H.uV('yc')
 C.HI=H.uV('Pg')
 C.ab=H.uV('xI')
-C.lk=H.uV('mJ')
 C.lpG=H.uV('LU')
 C.Ch=H.uV('KL')
-C.jV=H.uV('rF')
 C.OdR=H.uV('pL')
 C.cj=H.uV('E7')
 C.eB=H.uV('F1i')
@@ -17420,32 +17580,28 @@
 C.qo=H.uV('jY')
 C.l49=H.uV('uL')
 C.yQ=H.uV('EH')
-C.Im=H.uV('X6')
 C.FU=H.uV('lw')
-C.p5=H.uV('oM')
-C.nG=H.uV('zt')
 C.px=H.uV('tz')
 C.epC=H.uV('Jc')
-C.JA3=H.uV('b0B')
+C.Xd=H.uV('b0B')
 C.PF=H.uV('nk')
-C.Db=H.uV('String')
+C.Db=H.uV('qU')
 C.BP=H.uV('qkb')
 C.Tu=H.uV('xc')
 C.bh=H.uV('i6')
 C.Bm=H.uV('XP')
+C.wDw=H.uV('SC')
 C.hg=H.uV('hd')
 C.Fv=H.uV('ob')
 C.Wza=H.uV('pR')
 C.leN=H.uV('Lt')
-C.HL=H.uV('bool')
-C.Qf=H.uV('Null')
+C.HL=H.uV('a2')
+C.Qf=H.uV('L9')
 C.HH=H.uV('dynamic')
 C.vVv=H.uV('iL')
 C.Gp=H.uV('cw')
 C.ri=H.uV('yy')
 C.X0=H.uV('Ir')
-C.CS=H.uV('vm')
-C.hN=H.uV('oI')
 C.R4R=H.uV('xT')
 C.xM=new P.z0(!1)
 C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
@@ -17453,7 +17609,7 @@
 $.te="$cachedFunction"
 $.eb="$cachedInvocation"
 $.OK=0
-$.bf=null
+$.mJ=null
 $.P4=null
 $.Jl=!1
 $.NF=null
@@ -17481,14 +17637,14 @@
 $.uP=!0
 $.VZ="objects/"
 $.To=null
-$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fa","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE7","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gNF","gNG","gNT","gNW","gNh","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hT","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDe","sE7","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sN","sNF","sNG","sNT","sNW","sNh","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soY","soc","sox","soy","sp8","spD","sph","sqO","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","suD","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vQ","vV","w","wE","wL","wY","wg","x3","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
-$.Au=[C.RP,Z.hx,{created:Z.Co},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.p8F,Q.NQ,{created:Q.Zo},C.xLI,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.PQ},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
+$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","Ft","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","P9","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xe","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gI","gID","gIF","gIK","gIO","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gMz","gN","gNF","gNG","gNT","gNW","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPl","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gRw","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","git","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goM","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqW","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","gu6","guD","guT","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rL","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDD","sDe","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sID","sIF","sIK","sIO","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sMz","sN","sNF","sNG","sNT","sNW","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPl","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","sit","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soM","soY","soc","sox","soy","sp8","spD","sph","sqO","sqW","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","su6","suD","suT","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vD","vQ","vV","w","wB","wE","wL","wY","wg","x3","xJ","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
+$.Au=[C.RP,Z.hx,{created:Z.Co},C.I7,L.bf,{created:L.Rp},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.PQ},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.wc,A.kn,{created:A.Th},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.xF,Q.NQ,{created:Q.Zo},C.Xb,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.X6M,A.jM,{created:A.Sy},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Xd,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.wDw,U.SC,{created:U.oH},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
 I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
 I.$lazy($,"globalWindow","cO","C5",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
 I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
 I.$lazy($,"thisScript","Kb","Ak",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[J.bU])})
+I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({toString:function(){return"$receiver$"}}))})
 I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.LX(H.S7(null))})
@@ -17503,7 +17659,7 @@
 I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
-I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
+I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
 I.$lazy($,"_dynamicType","QG","P8",function(){return new H.EE(C.nN)})
 I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.v6)})
 I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
@@ -17521,21 +17677,21 @@
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(J.O,N.TJ)})
+I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(P.qU,N.TJ)})
 I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
 I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
 I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().$0()})
-I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
+I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR("\\s",H.v4("\\s",!1,!0,!1),null,null)})
 I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
-I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
-I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,J.O,A.XP)})
-I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,J.O,[J.Q,A.XP])})
-I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
+I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
+I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,P.qU,A.XP)})
+I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,P.qU,[P.zM,A.XP])})
+I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,P.qU,A.XP)})
 I.$lazy($,"_objectType","p0","H8",function(){return P.re(C.nY)})
 I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
-I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w13().$0()})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
+I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w12().$0()})
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,P.qU,P.a)
 z.FV(0,C.eu)
 return new A.HJ(z)})
 I.$lazy($,"_ready","tS","mC",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
@@ -17545,24 +17701,24 @@
 I.$lazy($,"_unbindLog","fV","P5",function(){return N.Jx("polymer.unbind")})
 I.$lazy($,"_bindLog","Q6","ZH",function(){return N.Jx("polymer.bind")})
 I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
-I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,window.location.href,null,null)})
+I.$lazy($,"_librariesToLoad","x2","UP",function(){return A.GA(document,window.location.href,null,null)})
 I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
 I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
 I.$lazy($,"_typeHandlers","lq","CT",function(){return new Z.W6().$0()})
 I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.wJY(),"-",new K.zOQ(),"*",new K.W6o(),"/",new K.MdQ(),"==",new K.YJG(),"!=",new K.DOe(),">",new K.lPa(),">=",new K.Ufa(),"<",new K.Raa(),"<=",new K.w0(),"||",new K.w4(),"&&",new K.w5(),"|",new K.w7()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w10(),"-",new K.w11(),"!",new K.w12()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR(H.v4("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR(H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().$0()})
+I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.Uf(),"-",new K.wJY(),"*",new K.zOQ(),"/",new K.W6o(),"==",new K.MdQ(),"!=",new K.YJG(),">",new K.DOe(),">=",new K.lPa(),"<",new K.Ufa(),"<=",new K.Raa(),"||",new K.w0(),"&&",new K.w4(),"|",new K.w5()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w7(),"-",new K.w10(),"!",new K.w11()],null,null)})
+I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.Uf()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.lP()).zV(0,", ")})
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},{func:"ny"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map",{func:"n9",void:true,args:[{func:"kl",void:true}]},"callback","errorHandler","zone","listeners","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"Gm",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,H.Tp,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.Pp,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.WZq,R.Nr,A.pva,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.V4,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V9,D.t9,J.Pp,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V10,D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,M.V14,"rec",{func:"IM",args:[N.HV]},Z.uL,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,A.V21,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V22,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.Pp]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"TB",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"oe",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Nt",args:[U.hw]},Q.V23,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"mRV",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V24,A.x4,U.V25,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.Pp},{func:"mV",args:[J.Pp]},"isolateId",[P.Z0,J.O,J.Pp],{func:"c7",ret:V.qC},{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[J.Q,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V26,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V27,{func:"nR",ret:Z.uL},U.V28,Q.Vfx,"details",Q.Bc,V.qC,K.V29,X.V30,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"UxH",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V31,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"Dv",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"ny"},{func:"pB",ret:P.vr,args:[P.a]},"reflectee",{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.MN]},,"error","stackTrace",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent","zone",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},"f",{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},{func:"Ib",ret:P.a2,args:[null,null]},{func:"bX",ret:P.KN,args:[null]},"a",{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Tx,P.Tx]},"b",{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"Gm",ret:P.KN,args:[P.a]},{func:"K4",ret:P.KN,args:[P.qU],named:{onError:{func:"Tl",ret:P.KN,args:[P.qU]},radix:P.KN}},{func:"Tf",ret:P.qU,args:[W.D0]},"receiver",{func:"jn",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o","v",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"iterable","index","invocation",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"hF",args:[null,P.qU]},G.dZ,D.H6,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:P.qU},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event","obj",P.KN,[P.zM,G.Y2],[P.zM,P.qU],{func:"r5",ret:[P.zM,P.KN]},{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"wI",args:[P.KN,P.KN]},D.SI,[P.Z0,P.qU,W.cv],{func:"Eg",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,P.a2,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},"target",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,"c",H.Tp,P.qU,{func:"Uf",ret:P.a2},{func:"zk",args:[P.a2]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"i",{func:"VG",ret:P.Ms,args:[P.KN]},{func:"Z5",args:[P.KN]},{func:"UC",ret:P.X9,args:[P.KN]},{func:"ag",args:[P.qU,P.qU]},"data",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","element",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each",{func:"Yz",ret:P.a2,args:[P.jp]},{func:"Tl",ret:P.KN,args:[P.qU]},{func:"Zh",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"GF",ret:P.KN,args:[null,null]},"byteString",{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"xhr","k",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[P.qU]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Aj]},L.WZq,"result",R.Nr,A.pva,U.rs,{func:"fO",ret:P.qU,args:[D.SI]},"function",N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:P.KN,args:[[P.QV,P.KN]]},"color",{func:"S1",void:true,args:[P.KN,P.qU,[P.QV,P.KN]]},"classId",{func:"D8",void:true,args:[null,P.KN]},"classList","freeClassId",{func:"XK",ret:[P.QV,P.KN],args:[P.KN]},{func:"D9",ret:P.qU,args:[[P.hL,P.KN]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,P.KN]]},{func:"j4",void:true,args:[P.KN]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:P.a2,args:[P.Z0]},{func:"Xb",args:[P.Z0,P.KN]},{func:"Na",ret:P.qU,args:[P.a2]},"newSpace",K.V4,{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[P.qU]}]},{func:"uj",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[P.qU]}]},{func:"pw",void:true,args:[P.a2,null]},"expand",Z.V9,D.t9,P.CP,G.XN,{func:"nzZ",ret:P.qU,args:[G.Y2]},X.V10,"m",D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,D.U4,{func:"ax",ret:D.U4},{func:"SN",args:[D.U4]},M.V14,"rec",{func:"IM",args:[N.HV]},A.V15,A.V16,A.V17,A.V18,A.V19,"x",A.V20,A.V21,A.V22,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V23,{func:"Z8",void:true,args:[P.qU,null,null]},{func:"Pz",ret:P.qU,args:[P.CP]},"time",{func:"vI",ret:P.qU,args:[P.Z0]},"frame",{func:"h6",ret:P.a2,args:[P.qU]},"type",A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"kG",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:P.KN},{func:"Lc",ret:P.a2,args:[P.a]},{func:"DF",void:true,args:[P.a]},"records",{func:"ZD",args:[[P.zM,G.DA]]},{func:"oe",args:[[P.zM,T.yj]]},{func:"rj",void:true,args:[P.qU,P.qU]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"model","node",{func:"K7",void:true,args:[[P.zM,T.yj]]},"def",{func:"Zu",args:[P.qU,null,null]},{func:"pp",ret:U.zX,args:[U.hw,U.hw]},3,{func:"Nt",args:[U.hw]},"s",Q.V24,D.rj,[P.zM,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[P.zM,D.c2]},{func:"mRV",args:[[P.zM,D.c2]]},{func:"Yg",ret:P.qU,args:[D.c2]},"line",T.V25,A.x4,U.V26,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.H6},"map",{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:P.CP},{func:"mV",args:[P.CP]},[P.Z0,P.qU,P.CP],{func:"c7",ret:V.qC},{func:"zs",ret:P.qU,args:[P.qU]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"EIX",ret:[Q.wn,D.U4]},{func:"P5",args:[[Q.wn,D.U4]]},{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[P.zM,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:P.qU,args:[D.kx]},"code",{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V27,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V28,"msg",{func:"nR",ret:Z.uL},U.V29,Q.Vfx,"details",Q.Bc,V.qC,K.V30,X.V31,"y",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.zM,P.a]]},"values",{func:"PzC",void:true,args:[[P.zM,G.DA]]},"splices",{func:"UxH",args:[P.zM]},D.pD,{func:"Af",args:[D.H6]},U.V32,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
index 400ab2c..5068ea7 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
@@ -8,7 +8,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ msg.isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <template if="{{ msg['breakpoints'].isEmpty }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
index 97897d9..89e557c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
@@ -1,6 +1,7 @@
 <head>
   <link rel="import" href="curly_block.html">
   <link rel="import" href="eval_box.html">
+  <link rel="import" href="eval_link.html">
   <link rel="import" href="field_ref.html">
   <link rel="import" href="function_ref.html">
   <link rel="import" href="instance_ref.html">
@@ -84,6 +85,12 @@
             <div class="memberValue">{{ cls.vmName }}</div>
           </div>
         </template>
+        <div class="memberItem">
+          <div class="memberName">retained size<br>(all instances)</div>
+          <div class="memberValue">
+            <eval-link callback="{{ retainedSize }}"></eval-link>
+          </div>
+        </div>
       </div>
     </div>
 
@@ -97,7 +104,7 @@
     <div class="content">
       <template if="{{ cls['fields'].isNotEmpty }}">
         fields ({{ cls['fields'].length }})
-        <curly-block>
+        <curly-block expand="{{ cls['fields'].length <= 8 }}">
           <div class="memberList">
             <template repeat="{{ field in cls['fields'] }}">
               <div class="memberItem">
@@ -112,12 +119,12 @@
               </div>
             </template>
           </div>
-        </curly-block><br>
+        </curly-block><br><br>
       </template>
 
       <template if="{{ cls['functions'].isNotEmpty }}">
         functions ({{ cls['functions'].length }})
-        <curly-block>
+        <curly-block expand="{{ cls['functions'].length <= 8 }}">
           <div class="memberList">
             <template repeat="{{ function in cls['functions'] }}">
               <div class="memberItem">
@@ -128,7 +135,7 @@
               </div>
             </template>
           </div>
-        </curly-block><br>
+        </curly-block><br><br>
       </template>
     </div>
 
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
index 71daf57..368a0ac 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
@@ -5,7 +5,12 @@
   <template>
     <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <template if="{{ code.isDartCode }}">
-      <a href="{{ url }}">{{ name }}</a>
+        <template if="{{ code.isOptimized }}">
+          <a href="{{ url }}">*{{ name }}</a>
+        </template>
+        <template if="{{ !code.isOptimized }}">
+          <a href="{{ url }}">{{ name }}</a>
+        </template>
     </template>
     <template if="{{ !code.isDartCode }}">
       <span>{{ name }}</span>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
index 0a91d71..a0a7297 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
@@ -59,14 +59,25 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <div class="content">
-      <h1>Code for {{ code.name }}</h1>
+      <template if="{{ code.isDartCode && code.isOptimized }}">
+        <h1>Optimized code for {{ code.name }}</h1>
+      </template>
+      <template if="{{ !(code.isDartCode && code.isOptimized) }}">
+        <h1>Code for {{ code.name }}</h1>
+      </template>
       <div class="memberList">
         <div class="memberItem">
-          <div class="memberName">kind</div>
+          <div class="memberName">Kind</div>
           <div class="memberValue">{{code.kind}}</div>
         </div>
+        <template if="{{ code.isDartCode }}">
+          <div class="memberItem">
+            <div class="memberName">Optimized</div>
+            <div class="memberValue">{{code.isOptimized}}</div>
+          </div>
+        </template>
         <div class="memberItem">
-          <div class="memberName">function</div>
+          <div class="memberName">Function</div>
           <div class="memberValue">
             <function-ref ref="{{code.function}}">
             </function-ref>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
index 105907c..3245eb2 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
@@ -13,6 +13,12 @@
   font: 400 14px 'Montserrat', sans-serif;
 }
 
+.content-centered {
+  padding-left: 10%;
+  padding-right: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
 h1 {
   font: 400 18px 'Montserrat', sans-serif;
 }
@@ -73,7 +79,6 @@
   padding: 10px 15px;
   margin-bottom: -1px;
   background-color: #fff;
-  border:1px solid #ddd;
 }
 
 .list-group-item:first-child {
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
index 41c4566..878a0ec 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
@@ -8,9 +8,10 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
-        <h1>{{ error.kind }}</h1>
-        <div class="well">{{ error.message }}</div>
+    <div class="content-centered">
+      <h1>{{ error.kind }}</h1>
+      <br>
+      <div class="well">{{ error.message }}</div>
     </div>
   </template>
   <script type="application/dart" src="error_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
index b6dde44..7d4d50b 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
@@ -34,7 +34,7 @@
         white-space: pre-line;
       }
       .historyExpr a:hover {
-        background-color: #e1f5fe
+        background-color: #fff3e3;
       }
       .historyValue {
         display: block;
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
index d41fd07..7058f36 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
@@ -19,7 +19,7 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
index 5280336..aba3443 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
@@ -21,7 +21,7 @@
       <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
index 21b89b2..984ce06 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
@@ -10,19 +10,27 @@
     .hover {
       position: fixed;
       z-index: 999;
+      height: 16px;
       width: 100%;
       background: #ffffff;
     }
+    .spacer {
+      height: 16px;
+      background-color: red;
+    }
   </style>
-  <nav-bar>
+  <nav-bar pad="{{ false }}">
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
-    <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
   </nav-bar>
   <div class="hover">
     <p style="text-align:center">{{ status }}</p>
   </div>
+  <div class="spacer">
+    <!-- Make sure no data is covered by hover bar initially -->
+  </div>
   <div class="flex-row">
     <canvas id="fragmentation" width="1px" height="1px"></canvas>
   </div>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
index 6cc8c1b..087849b 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
@@ -41,7 +41,7 @@
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
     <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -90,12 +90,14 @@
       <thead>
         <tr>
           <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Size">{{ classTable.getColumnLabel(3) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Instances">{{ classTable.getColumnLabel(4) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Current Size">{{ classTable.getColumnLabel(5) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Current Instances">{{ classTable.getColumnLabel(6) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
         </tr>
       </thead>
       <tbody>
@@ -107,6 +109,8 @@
           <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
           <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
           <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
+          <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
+          <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
         </tr>
       </tbody>
     </table>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
index 8aedfc1..e74dfdb 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
@@ -6,13 +6,24 @@
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <style>
+      .errorBox {
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: pre;
+      }
+    </style>
     <span>
-      <template if="{{ isUnexpected(ref.serviceType) }}">
-        unexpected reference type &lt;{{ ref.serviceType }}&gt;
+      <template if="{{ isError(ref.serviceType) }}">
+        <pre class="errorBox">{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ isError(ref.serviceType) }}">
-        <pre>{{ ref.message }}</pre>
+      <template if="{{ isUnexpected(ref.serviceType) }}">
+        unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
       <template if="{{ isNull(ref.serviceType) }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
index 4d1fb2d..3ff1251 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
@@ -52,6 +52,12 @@
             <div class="memberName">size</div>
             <div class="memberValue">{{ instance['size'] | formatSize }}</div>
           </div>
+          <div class="memberItem">
+            <div class="memberName">retained size</div>
+            <div class="memberValue">
+              <eval-link callback="{{ retainedSize }}"></eval-link>
+            </div>
+          </div>
           <template if="{{ instance['type_class'] != null }}">
             <div class="memberItem">
               <div class="memberName">type class</div>
@@ -87,7 +93,7 @@
       <div class="content">
         <template if="{{ instance['fields'].isNotEmpty }}">
           fields ({{ instance['fields'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['fields'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ field in instance['fields'] }}">
                 <div class="memberItem">
@@ -100,12 +106,12 @@
                 </div>
               </template>
             </div>
-          </curly-block>
+          </curly-block><br><br>
         </template>
 
         <template if="{{ instance['nativeFields'].isNotEmpty }}">
           native fields ({{ instance['nativeFields'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ field in instance['nativeFields'] }}">
                 <div class="memberItem">
@@ -114,12 +120,12 @@
                 </div>
               </template>
             </div>
-          </curly-block><br>
+          </curly-block><br><br>
         </template>
 
         <template if="{{ instance['elements'].isNotEmpty }}">
           elements ({{ instance['elements'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['elements'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ element in instance['elements'] }}">
                 <div class="memberItem">
@@ -131,7 +137,7 @@
                 </div>
               </template>
             </div>
-          </curly-block><br>
+          </curly-block><br><br>
         </template>
       </div>
 
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
index 99d85d3..fe8ddb9 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
@@ -11,7 +11,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <style>
@@ -152,7 +152,7 @@
             <td on-click="{{toggleExpanded}}"
                 class="{{ coloring(row) }}"
                 style="{{ padding(row) }}">
-              <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
+              <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
               <div style="position: relative;display: inline">
                 {{row.columns[0]}}
               </div>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
index c7f1a64c..44bc2f8 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
@@ -107,82 +107,101 @@
 
     <br>
 
-    <div class="content">
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">root library</div>
-          <div class="memberValue">
-            <function-ref ref="{{ isolate.rootLib }}"></function-ref>
-          </div>
-        </div>
-        <div class="memberItem">
-          <template if="{{ isolate.entry != null }}">
-            <div class="memberName">entry</div>
-            <div class="memberValue">
-              <function-ref ref="{{ isolate.entry }}"></function-ref>
-            </div>
-          </template>
-        </div>
-        <div class="memberItem">
-          <div class="memberName">id</div>
-          <div class="memberValue">{{ isolate.mainPort }}</div>
-        </div>
-        <br>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+    <div class="content-centered">
+      <div class="flex-row">
 
+        <div class="flex-item-fixed-6-12">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">root library</div>
+              <div class="memberValue">
+                <library-ref ref="{{ isolate.rootLib }}"></library-ref>
+              </div>
+            </div>
+            <div class="memberItem">
+              <template if="{{ isolate.entry != null }}">
+                <div class="memberName">entry</div>
+                <div class="memberValue">
+                  <function-ref ref="{{ isolate.entry }}"></function-ref>
+                </div>
+              </template>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">id</div>
+              <div class="memberValue">{{ isolate.mainPort }}</div>
+            </div>
+            <br>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+              </div>
+            </div>
           </div>
         </div>
-      </div>
-    </div>
+
+        <div class="flex-item-fixed-6-12">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">new heap</div>
+              <div class="memberValue">
+                {{ isolate.newHeapUsed | formatSize }}
+                of
+                {{ isolate.newHeapCapacity | formatSize }}
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">old heap</div>
+              <div class="memberValue">
+                {{ isolate.oldHeapUsed | formatSize }}
+                of
+                {{ isolate.oldHeapCapacity | formatSize }}
+              </div>
+            </div>
+          </div>
+          <br>
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+              </div>
+            </div>
+          </div>
+        </div>
+
+      </div> <!-- flex row -->
+    </div> <!-- content -->
 
     <hr>
 
     <div class="content">
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">new heap</div>
-          <div class="memberValue">
-            {{ isolate.newHeapUsed | formatSize }}
-            of
-            {{ isolate.newHeapCapacity | formatSize }}
-          </div>
+      libraries ({{ isolate.libraries.length }})
+      <curly-block expand="{{ isolate.libraries.length <= 8 }}">
+        <div class="memberList">
+          <template repeat="{{ lib in isolate.libraries }}">
+            <div class="memberItem">
+              <div class="memberName">
+                <library-ref ref="{{ lib }}"></library-ref>
+              </div>
+            </div>
+          </template>
         </div>
-        <div class="memberItem">
-          <div class="memberName">old heap</div>
-          <div class="memberValue">
-            {{ isolate.oldHeapUsed | formatSize }}
-            of
-            {{ isolate.oldHeapCapacity | formatSize }}
-          </div>
-        </div>
-      </div>
-
-      <br>
-
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-          </div>
-        </div>
-      </div>
+      </curly-block>
     </div>
 
     <hr>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
index 4866eea..74e2d29 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
@@ -3,7 +3,12 @@
 </head>
 <polymer-element name="library-ref" extends="service-ref">
 <template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
-  <a href="{{ url }}">{{ name }}</a>
+  <template if="{{ nameIsEmpty }}">
+    <a href="{{ url }}">unnamed</a>
+  </template>
+  <template if="{{ !nameIsEmpty }}">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
 </template>
 <script type="application/dart" src="library_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
index 75f316c..6abf998 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
@@ -29,18 +29,8 @@
       <div class="memberList">
         <div class="memberItem">
           <div class="memberName">url</div>
-          <div class="memberValue">{{ library['url'] }}</div>
+          <div class="memberValue">{{ library.url }}</div>
         </div>
-        <template if="{{ library['imports'].length > 0 }}">
-          <div class="memberItem">
-            <div class="memberName">imports</div>
-            <div class="memberValue">
-              <template repeat="{{ import in library['imports'] }}">
-                <library-ref ref="{{ import }}"></library-ref>
-              </template>
-            </div>
-          </div>
-        </template>
         <template if="{{ library.name != library.vmName }}">
           <div class="memberItem">
             <div class="memberName">vm name</div>
@@ -53,11 +43,27 @@
     <hr>
 
     <div class="content">
-      <template if="{{ library['scripts'].isNotEmpty }}">
-        scripts ({{ library['scripts'].length }})
-        <curly-block>
+      <template if="{{ library.imports.isNotEmpty }}">
+        imports ({{ library.imports.length }})
+        <curly-block expand="{{ library.imports.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ script in library['scripts'] }}">
+            <template repeat="{{ imp in library.imports }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <library-ref ref="{{ imp }}"></library-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+        <br>
+      </template>
+
+      <template if="{{ library.scripts.isNotEmpty }}">
+        scripts ({{ library.scripts.length }})
+        <curly-block expand="{{ library.scripts.length <= 8 }}">
+          <div class="memberList">
+            <template repeat="{{ script in library.scripts }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <script-ref ref="{{ script }}"></script-ref>
@@ -66,13 +72,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['classes'].isNotEmpty }}">
-        classes ({{ library['classes'].length }})
-        <curly-block>
+      <template if="{{ library.classes.isNotEmpty }}">
+        classes ({{ library.classes.length }})
+        <curly-block expand="{{ library.classes.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ cls in library['classes'] }}">
+            <template repeat="{{ cls in library.classes }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <class-ref ref="{{ cls }}"></class-ref>
@@ -81,13 +88,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['variables'].isNotEmpty }}">
-        variables ({{ library['variables'].length }})
-        <curly-block>
+      <template if="{{ library.variables.isNotEmpty }}">
+        variables ({{ library.variables.length }})
+        <curly-block expand="{{ library.variables.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ field in library['variables'] }}">
+            <template repeat="{{ field in library.variables }}">
               <div class="memberItem">
                 <div class="memberName">
                   <field-ref ref="{{ field }}"></field-ref>
@@ -101,13 +109,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['functions'].isNotEmpty }}">
-        functions ({{ library['functions'].length }})
-        <curly-block>
+      <template if="{{ library.functions.isNotEmpty }}">
+        functions ({{ library.functions.length }})
+        <curly-block expand="{{ library.functions.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ function in library['functions'] }}">
+            <template repeat="{{ function in library.functions }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <function-ref ref="{{ function }}"></function-ref>
@@ -116,6 +125,7 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
     </div>
 
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
index 5efe4bf..3817c7f 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
@@ -6,6 +6,11 @@
   <template>
     <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <style>
+      nav {
+        position: fixed;
+        width: 100%;
+        z-index: 1000;
+      }
       nav ul {
         display: inline-table;
         position: relative;
@@ -13,7 +18,7 @@
         padding-left: 0;
         margin-left: 0;
         width: 100%;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background-color: #0489c3;
@@ -21,12 +26,21 @@
       nav ul:after {
         content: ""; clear: both; display: block;
       }
+      .vertical-spacer {
+        height: 40px;
+        background-color: #0489c3;
+      }
     </style>
     <nav>
       <ul>
         <content></content>
       </ul>
     </nav>
+    <div class="vertical-spacer">
+    </div>
+    <template if="{{ pad }}">
+      <br>
+    </template>
   </template>
 </polymer-element>
 
@@ -53,7 +67,7 @@
         margin: 0;
         padding: 0;
         width: auto;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background: #567;
@@ -96,7 +110,7 @@
         padding: 0;
         margin-left: 0;
         width: auto;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background: #567;
@@ -160,13 +174,13 @@
 
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
+    <nav-menu link="{{ hashLinkWorkaround }}" anchor="{{ isolate.name }}" last="{{ last }}">
       <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}"
                      anchor="stack trace"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}"
                      anchor="cpu profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}"
-                     anchor="heap profile"></nav-menu-item>
+                     anchor="allocation profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}"
                      anchor="heap map"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}"
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
index c251423..2c2c64a 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
@@ -9,7 +9,6 @@
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
-    <library-nav-menu library="{{ script.library }}"></library-nav-menu>
     <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
       <li>
         <input type="checkbox" checked="{{ showCoverage }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
index c69df68..a45c081 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
@@ -8,8 +8,9 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
+    <div class="content-centered">
       <h1>{{ error.kind }}</h1>
+      <br>
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
index 111eabf..b3d9c62 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
@@ -8,10 +8,13 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
-        <h1>{{ exception.kind }}</h1>
-        <div class="well">{{ exception.message }}</div>
+    <div class="content-centered">
+      <h1>{{ exception.kind }}</h1>
+      <br>
+      <div class="well">{{ exception.message }}</div>
+      <template if="{{ exception.response != '' }}">
         <div class="well">{{ exception.response }}</div>
+      </template>
     </div>
   </template>
   <script type="application/dart" src="service_exception_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
index d196e1f..13ad0a5 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
@@ -9,7 +9,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ trace.isolate.relativeHashLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <template if="{{ trace['members'].isEmpty }}">
diff --git a/runtime/bin/vmservice/client/lib/src/app/view_model.dart b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
index 993ff72..0b90a99 100644
--- a/runtime/bin/vmservice/client/lib/src/app/view_model.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
@@ -11,13 +11,21 @@
   @observable final List<String> columns = [];
   static const arrowRight = '\u2192';
   static const arrowDownRight = '\u21b3';
+  static const showExpanderStyle = 'cursor: pointer;';
+  static const hideExpanderStyle = 'visibility:hidden;';
+
   // TODO(johnmccutchan): Move expander display decisions into html once
   // tables and templates are better supported.
   @observable String expander = arrowRight;
+  @observable String expanderStyle = showExpanderStyle;
 
   TableTreeRow(TableTreeRow parent) :
       parent = parent,
-      depth = parent != null ? parent.depth+1 : 0;
+      depth = parent != null ? parent.depth+1 : 0 {
+    if (!hasChildren()) {
+      expanderStyle = hideExpanderStyle;
+    }
+  }
 
   bool _expanded = false;
   bool get expanded => _expanded;
@@ -41,6 +49,8 @@
     return expanded;
   }
 
+  bool hasChildren();
+
   /// Fired when the tree row is expanded. Add children rows here.
   void onShow();
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
index 40dd7ff..2e5c4bb 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
@@ -8,7 +8,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ msg.isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <template if="{{ msg['breakpoints'].isEmpty }}">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
index 8c35168..b55f8ae 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
@@ -18,6 +18,11 @@
     return cls.isolate.get(
         cls.id + "/eval?expr=${Uri.encodeComponent(text)}");
   }
+  
+  // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
+  Future<ServiceObject> retainedSize(String dummy) {
+    return cls.isolate.get(cls.id + "/retained");
+  }
 
   void refresh(var done) {
     cls.reload().whenComplete(done);
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.html b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
index 7bcb3e2..46ae269 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -1,6 +1,7 @@
 <head>
   <link rel="import" href="curly_block.html">
   <link rel="import" href="eval_box.html">
+  <link rel="import" href="eval_link.html">
   <link rel="import" href="field_ref.html">
   <link rel="import" href="function_ref.html">
   <link rel="import" href="instance_ref.html">
@@ -84,6 +85,12 @@
             <div class="memberValue">{{ cls.vmName }}</div>
           </div>
         </template>
+        <div class="memberItem">
+          <div class="memberName">retained size<br>(all instances)</div>
+          <div class="memberValue">
+            <eval-link callback="{{ retainedSize }}"></eval-link>
+          </div>
+        </div>
       </div>
     </div>
 
@@ -97,7 +104,7 @@
     <div class="content">
       <template if="{{ cls['fields'].isNotEmpty }}">
         fields ({{ cls['fields'].length }})
-        <curly-block>
+        <curly-block expand="{{ cls['fields'].length <= 8 }}">
           <div class="memberList">
             <template repeat="{{ field in cls['fields'] }}">
               <div class="memberItem">
@@ -112,12 +119,12 @@
               </div>
             </template>
           </div>
-        </curly-block><br>
+        </curly-block><br><br>
       </template>
 
       <template if="{{ cls['functions'].isNotEmpty }}">
         functions ({{ cls['functions'].length }})
-        <curly-block>
+        <curly-block expand="{{ cls['functions'].length <= 8 }}">
           <div class="memberList">
             <template repeat="{{ function in cls['functions'] }}">
               <div class="memberItem">
@@ -128,7 +135,7 @@
               </div>
             </template>
           </div>
-        </curly-block><br>
+        </curly-block><br><br>
       </template>
     </div>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
index 16800a8..6e83e03 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
@@ -5,7 +5,12 @@
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ code.isDartCode }}">
-      <a href="{{ url }}">{{ name }}</a>
+        <template if="{{ code.isOptimized }}">
+          <a href="{{ url }}">*{{ name }}</a>
+        </template>
+        <template if="{{ !code.isOptimized }}">
+          <a href="{{ url }}">{{ name }}</a>
+        </template>
     </template>
     <template if="{{ !code.isDartCode }}">
       <span>{{ name }}</span>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.html b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
index 4973b61..91bbb5c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -59,14 +59,25 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <div class="content">
-      <h1>Code for {{ code.name }}</h1>
+      <template if="{{ code.isDartCode && code.isOptimized }}">
+        <h1>Optimized code for {{ code.name }}</h1>
+      </template>
+      <template if="{{ !(code.isDartCode && code.isOptimized) }}">
+        <h1>Code for {{ code.name }}</h1>
+      </template>
       <div class="memberList">
         <div class="memberItem">
-          <div class="memberName">kind</div>
+          <div class="memberName">Kind</div>
           <div class="memberValue">{{code.kind}}</div>
         </div>
+        <template if="{{ code.isDartCode }}">
+          <div class="memberItem">
+            <div class="memberName">Optimized</div>
+            <div class="memberValue">{{code.isOptimized}}</div>
+          </div>
+        </template>
         <div class="memberItem">
-          <div class="memberName">function</div>
+          <div class="memberName">Function</div>
           <div class="memberValue">
             <function-ref ref="{{code.function}}">
             </function-ref>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
index 105907c..3245eb2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
@@ -13,6 +13,12 @@
   font: 400 14px 'Montserrat', sans-serif;
 }
 
+.content-centered {
+  padding-left: 10%;
+  padding-right: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
 h1 {
   font: 400 18px 'Montserrat', sans-serif;
 }
@@ -73,7 +79,6 @@
   padding: 10px 15px;
   margin-bottom: -1px;
   background-color: #fff;
-  border:1px solid #ddd;
 }
 
 .list-group-item:first-child {
diff --git a/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart b/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
index 9b76ef6..b0dafb8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
@@ -13,6 +13,11 @@
   @observable bool expanded = false;
   @observable bool busy = false;
   @published var callback = null;
+  @published bool expand = false;
+
+  void expandChanged(oldValue) {
+    expanded = expand;
+  }
 
   void doneCallback() {
     expanded = !expanded;
@@ -20,6 +25,7 @@
   }
 
   void toggleExpand(var a, var b, var c) {
+    assert(callback == null || expand == false);
     if (busy) {
       return;
     }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/error_view.html b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
index 092d042..22aaa59 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
@@ -8,9 +8,10 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
-        <h1>{{ error.kind }}</h1>
-        <div class="well">{{ error.message }}</div>
+    <div class="content-centered">
+      <h1>{{ error.kind }}</h1>
+      <br>
+      <div class="well">{{ error.message }}</div>
     </div>
   </template>
   <script type="application/dart" src="error_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
index b6dde44..7d4d50b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
@@ -34,7 +34,7 @@
         white-space: pre-line;
       }
       .historyExpr a:hover {
-        background-color: #e1f5fe
+        background-color: #fff3e3;
       }
       .historyValue {
         display: block;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_view.html b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
index 8b55068..1fbb75d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -19,7 +19,7 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
index bd12295..1528938 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -21,7 +21,7 @@
       <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
index efe7712..65e56d8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -10,19 +10,27 @@
     .hover {
       position: fixed;
       z-index: 999;
+      height: 16px;
       width: 100%;
       background: #ffffff;
     }
+    .spacer {
+      height: 16px;
+      background-color: red;
+    }
   </style>
-  <nav-bar>
+  <nav-bar pad="{{ false }}">
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
-    <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
   </nav-bar>
   <div class="hover">
     <p style="text-align:center">{{ status }}</p>
   </div>
+  <div class="spacer">
+    <!-- Make sure no data is covered by hover bar initially -->
+  </div>
   <div class="flex-row">
     <canvas id="fragmentation" width="1px" height="1px"></canvas>
   </div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
index 7901dee..8980ae8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
@@ -45,17 +45,21 @@
     _oldPieDataTable.addColumn('number', 'Size');
     var columns = [
       new SortedTableColumn('Class'),
-      new SortedTableColumn.withFormatter('Accumulator',
+      new SortedTableColumn.withFormatter('Accumulator Size (New)',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Accumulator',
+      new SortedTableColumn.withFormatter('Accumulator (New)',
                                           Utils.formatCommaSeparated),
-      new SortedTableColumn.withFormatter('Accumulator (Old space)',
+      new SortedTableColumn.withFormatter('Current Size (New)',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Accumulator (Old space)',
+      new SortedTableColumn.withFormatter('Current (New)',
                                           Utils.formatCommaSeparated),
-      new SortedTableColumn.withFormatter('Current',
+      new SortedTableColumn.withFormatter('Accumulator Size (Old)',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Current',
+      new SortedTableColumn.withFormatter('Accumulator (Old)',
+                                          Utils.formatCommaSeparated),
+      new SortedTableColumn.withFormatter('Current Size (Old)',
+                                          Utils.formatSize),
+      new SortedTableColumn.withFormatter('Current (Old)',
                                           Utils.formatCommaSeparated)
     ];
     classTable = new SortedTable(columns);
@@ -91,7 +95,9 @@
                  _combinedTableColumnValue(cls, 3),
                  _combinedTableColumnValue(cls, 4),
                  _combinedTableColumnValue(cls, 5),
-                 _combinedTableColumnValue(cls, 6)];
+                 _combinedTableColumnValue(cls, 6),
+                 _combinedTableColumnValue(cls, 7),
+                 _combinedTableColumnValue(cls, 8)];
       classTable.addRow(new SortedTableRow(row));
     }
     classTable.sort();
@@ -143,29 +149,29 @@
 
   dynamic _combinedTableColumnValue(Map v, int index) {
     assert(index >= 0);
-    assert(index < 7);
+    assert(index < 9);
     switch (index) {
       case 0:
         return v['class']['user_name'];
       case 1:
-        return v['new'][ACCUMULATED_SIZE] +
-               v['old'][ACCUMULATED_SIZE];
+        return v['new'][ACCUMULATED_SIZE];
       case 2:
-        return v['new'][ACCUMULATED] +
-               v['old'][ACCUMULATED];
+        return v['new'][ACCUMULATED];
       case 3:
-        return v['old'][ACCUMULATED_SIZE];
-      case 4:
-        return v['old'][ACCUMULATED];
-      case 5:
         return v['new'][LIVE_AFTER_GC_SIZE] +
-               v['new'][ALLOCATED_SINCE_GC_SIZE] +
-               v['old'][LIVE_AFTER_GC_SIZE] +
-               v['old'][ALLOCATED_SINCE_GC_SIZE];
-      case 6:
+               v['new'][ALLOCATED_SINCE_GC_SIZE];
+      case 4:
         return v['new'][LIVE_AFTER_GC] +
-               v['new'][ALLOCATED_SINCE_GC] +
-               v['old'][LIVE_AFTER_GC] +
+               v['new'][ALLOCATED_SINCE_GC];
+      case 5:
+        return v['old'][ACCUMULATED_SIZE];
+      case 6:
+        return v['old'][ACCUMULATED];
+      case 7:
+        return v['old'][LIVE_AFTER_GC_SIZE] +
+               v['old'][ALLOCATED_SINCE_GC_SIZE];
+      case 8:
+        return  v['old'][LIVE_AFTER_GC] +
                v['old'][ALLOCATED_SINCE_GC];
     }
     throw new FallThroughError();
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
index aa97123..b5c006d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
@@ -41,7 +41,7 @@
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
     <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -90,12 +90,14 @@
       <thead>
         <tr>
           <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Size">{{ classTable.getColumnLabel(3) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Instances">{{ classTable.getColumnLabel(4) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Current Size">{{ classTable.getColumnLabel(5) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Total Current Instances">{{ classTable.getColumnLabel(6) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
         </tr>
       </thead>
       <tbody>
@@ -107,6 +109,8 @@
           <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
           <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
           <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
+          <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
+          <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
         </tr>
       </tbody>
     </table>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
index 8e73c8a..7ef469a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -6,13 +6,24 @@
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <style>
+      .errorBox {
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: pre;
+      }
+    </style>
     <span>
-      <template if="{{ isUnexpected(ref.serviceType) }}">
-        unexpected reference type &lt;{{ ref.serviceType }}&gt;
+      <template if="{{ isError(ref.serviceType) }}">
+        <pre class="errorBox">{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ isError(ref.serviceType) }}">
-        <pre>{{ ref.message }}</pre>
+      <template if="{{ isUnexpected(ref.serviceType) }}">
+        unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
       <template if="{{ isNull(ref.serviceType) }}">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
index 295dddf..6189f19 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
@@ -20,6 +20,11 @@
         instance.id + "/eval?expr=${Uri.encodeComponent(text)}");
   }
 
+  // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
+  Future<ServiceObject> retainedSize(String dummy) {
+    return instance.isolate.get(instance.id + "/retained");
+  }
+
   void refresh(var done) {
     instance.reload().whenComplete(done);
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index 759e7ae..ad41d44 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -52,6 +52,12 @@
             <div class="memberName">size</div>
             <div class="memberValue">{{ instance['size'] | formatSize }}</div>
           </div>
+          <div class="memberItem">
+            <div class="memberName">retained size</div>
+            <div class="memberValue">
+              <eval-link callback="{{ retainedSize }}"></eval-link>
+            </div>
+          </div>
           <template if="{{ instance['type_class'] != null }}">
             <div class="memberItem">
               <div class="memberName">type class</div>
@@ -87,7 +93,7 @@
       <div class="content">
         <template if="{{ instance['fields'].isNotEmpty }}">
           fields ({{ instance['fields'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['fields'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ field in instance['fields'] }}">
                 <div class="memberItem">
@@ -100,12 +106,12 @@
                 </div>
               </template>
             </div>
-          </curly-block>
+          </curly-block><br><br>
         </template>
 
         <template if="{{ instance['nativeFields'].isNotEmpty }}">
           native fields ({{ instance['nativeFields'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ field in instance['nativeFields'] }}">
                 <div class="memberItem">
@@ -114,12 +120,12 @@
                 </div>
               </template>
             </div>
-          </curly-block><br>
+          </curly-block><br><br>
         </template>
 
         <template if="{{ instance['elements'].isNotEmpty }}">
           elements ({{ instance['elements'].length }})
-          <curly-block>
+          <curly-block expand="{{ instance['elements'].length <= 8 }}">
             <div class="memberList">
               <template repeat="{{ element in instance['elements'] }}">
                 <div class="memberItem">
@@ -131,7 +137,7 @@
                 </div>
               </template>
             </div>
-          </curly-block><br>
+          </curly-block><br><br>
         </template>
       </div>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
index 5cec638..dafa994 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -81,6 +81,10 @@
 
   void onHide() {
   }
+
+  bool hasChildren() {
+    return node.children.length > 0;
+  }
 }
 
 /// Displays an IsolateProfile
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
index 676a8dc..94d4d3e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -11,7 +11,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <style>
@@ -152,7 +152,7 @@
             <td on-click="{{toggleExpanded}}"
                 class="{{ coloring(row) }}"
                 style="{{ padding(row) }}">
-              <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
+              <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
               <div style="position: relative;display: inline">
                 {{row.columns[0]}}
               </div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
index a6ccef6..91e573b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -107,82 +107,101 @@
 
     <br>
 
-    <div class="content">
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">root library</div>
-          <div class="memberValue">
-            <function-ref ref="{{ isolate.rootLib }}"></function-ref>
-          </div>
-        </div>
-        <div class="memberItem">
-          <template if="{{ isolate.entry != null }}">
-            <div class="memberName">entry</div>
-            <div class="memberValue">
-              <function-ref ref="{{ isolate.entry }}"></function-ref>
-            </div>
-          </template>
-        </div>
-        <div class="memberItem">
-          <div class="memberName">id</div>
-          <div class="memberValue">{{ isolate.mainPort }}</div>
-        </div>
-        <br>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+    <div class="content-centered">
+      <div class="flex-row">
 
+        <div class="flex-item-fixed-6-12">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">root library</div>
+              <div class="memberValue">
+                <library-ref ref="{{ isolate.rootLib }}"></library-ref>
+              </div>
+            </div>
+            <div class="memberItem">
+              <template if="{{ isolate.entry != null }}">
+                <div class="memberName">entry</div>
+                <div class="memberValue">
+                  <function-ref ref="{{ isolate.entry }}"></function-ref>
+                </div>
+              </template>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">id</div>
+              <div class="memberValue">{{ isolate.mainPort }}</div>
+            </div>
+            <br>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+              </div>
+            </div>
           </div>
         </div>
-      </div>
-    </div>
+
+        <div class="flex-item-fixed-6-12">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">new heap</div>
+              <div class="memberValue">
+                {{ isolate.newHeapUsed | formatSize }}
+                of
+                {{ isolate.newHeapCapacity | formatSize }}
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">old heap</div>
+              <div class="memberValue">
+                {{ isolate.oldHeapUsed | formatSize }}
+                of
+                {{ isolate.oldHeapCapacity | formatSize }}
+              </div>
+            </div>
+          </div>
+          <br>
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+              </div>
+            </div>
+          </div>
+        </div>
+
+      </div> <!-- flex row -->
+    </div> <!-- content -->
 
     <hr>
 
     <div class="content">
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">new heap</div>
-          <div class="memberValue">
-            {{ isolate.newHeapUsed | formatSize }}
-            of
-            {{ isolate.newHeapCapacity | formatSize }}
-          </div>
+      libraries ({{ isolate.libraries.length }})
+      <curly-block expand="{{ isolate.libraries.length <= 8 }}">
+        <div class="memberList">
+          <template repeat="{{ lib in isolate.libraries }}">
+            <div class="memberItem">
+              <div class="memberName">
+                <library-ref ref="{{ lib }}"></library-ref>
+              </div>
+            </div>
+          </template>
         </div>
-        <div class="memberItem">
-          <div class="memberName">old heap</div>
-          <div class="memberValue">
-            {{ isolate.oldHeapUsed | formatSize }}
-            of
-            {{ isolate.oldHeapCapacity | formatSize }}
-          </div>
-        </div>
-      </div>
-
-      <br>
-
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-          </div>
-        </div>
-        <div class="memberItem">
-          <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-          </div>
-        </div>
-      </div>
+      </curly-block>
     </div>
 
     <hr>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
index d1e356e..4d04a0b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
@@ -3,7 +3,12 @@
 </head>
 <polymer-element name="library-ref" extends="service-ref">
 <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-  <a href="{{ url }}">{{ name }}</a>
+  <template if="{{ nameIsEmpty }}">
+    <a href="{{ url }}">unnamed</a>
+  </template>
+  <template if="{{ !nameIsEmpty }}">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
 </template>
 <script type="application/dart" src="library_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
index f22e019..64d6e6c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
@@ -12,7 +12,7 @@
 
 @CustomTag('library-view')
 class LibraryViewElement extends ObservatoryElement {
-  @published ServiceMap library;
+  @published Library library;
 
   LibraryViewElement.created() : super.created();
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.html b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
index 7ae311b..58cd763 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -29,18 +29,8 @@
       <div class="memberList">
         <div class="memberItem">
           <div class="memberName">url</div>
-          <div class="memberValue">{{ library['url'] }}</div>
+          <div class="memberValue">{{ library.url }}</div>
         </div>
-        <template if="{{ library['imports'].length > 0 }}">
-          <div class="memberItem">
-            <div class="memberName">imports</div>
-            <div class="memberValue">
-              <template repeat="{{ import in library['imports'] }}">
-                <library-ref ref="{{ import }}"></library-ref>
-              </template>
-            </div>
-          </div>
-        </template>
         <template if="{{ library.name != library.vmName }}">
           <div class="memberItem">
             <div class="memberName">vm name</div>
@@ -53,11 +43,27 @@
     <hr>
 
     <div class="content">
-      <template if="{{ library['scripts'].isNotEmpty }}">
-        scripts ({{ library['scripts'].length }})
-        <curly-block>
+      <template if="{{ library.imports.isNotEmpty }}">
+        imports ({{ library.imports.length }})
+        <curly-block expand="{{ library.imports.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ script in library['scripts'] }}">
+            <template repeat="{{ imp in library.imports }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <library-ref ref="{{ imp }}"></library-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+        <br>
+      </template>
+
+      <template if="{{ library.scripts.isNotEmpty }}">
+        scripts ({{ library.scripts.length }})
+        <curly-block expand="{{ library.scripts.length <= 8 }}">
+          <div class="memberList">
+            <template repeat="{{ script in library.scripts }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <script-ref ref="{{ script }}"></script-ref>
@@ -66,13 +72,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['classes'].isNotEmpty }}">
-        classes ({{ library['classes'].length }})
-        <curly-block>
+      <template if="{{ library.classes.isNotEmpty }}">
+        classes ({{ library.classes.length }})
+        <curly-block expand="{{ library.classes.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ cls in library['classes'] }}">
+            <template repeat="{{ cls in library.classes }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <class-ref ref="{{ cls }}"></class-ref>
@@ -81,13 +88,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['variables'].isNotEmpty }}">
-        variables ({{ library['variables'].length }})
-        <curly-block>
+      <template if="{{ library.variables.isNotEmpty }}">
+        variables ({{ library.variables.length }})
+        <curly-block expand="{{ library.variables.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ field in library['variables'] }}">
+            <template repeat="{{ field in library.variables }}">
               <div class="memberItem">
                 <div class="memberName">
                   <field-ref ref="{{ field }}"></field-ref>
@@ -101,13 +109,14 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
 
-      <template if="{{ library['functions'].isNotEmpty }}">
-        functions ({{ library['functions'].length }})
-        <curly-block>
+      <template if="{{ library.functions.isNotEmpty }}">
+        functions ({{ library.functions.length }})
+        <curly-block expand="{{ library.functions.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ function in library['functions'] }}">
+            <template repeat="{{ function in library.functions }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <function-ref ref="{{ function }}"></function-ref>
@@ -116,6 +125,7 @@
             </template>
           </div>
         </curly-block><br>
+        <br>
       </template>
     </div>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
index ad58d58..c82b427 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
@@ -12,6 +12,8 @@
 
 @CustomTag('nav-bar')
 class NavBarElement extends ObservatoryElement {
+  @published bool pad = true;
+
   NavBarElement.created() : super.created();
 }
 
@@ -67,12 +69,27 @@
   @published bool last = false;
   @published Isolate isolate;
 
+  void isolateChanged(oldValue) {
+    notifyPropertyChange(#hashLinkWorkaround, 0, 1);
+  }
+
+  // TODO(turnidge): Figure out why polymer needs this function.
+  @reflectable
+  String get hashLinkWorkaround {
+    if (isolate != null) {
+      return isolate.hashLink;
+    } else {
+      return '';
+    }
+  }
+  @reflectable set hashLinkWorkaround(var x) { /* silence polymer */ }
+
   IsolateNavMenuElement.created() : super.created();
 }
 
 @CustomTag('library-nav-menu')
 class LibraryNavMenuElement extends ObservatoryElement {
-  @published ServiceMap library;
+  @published Library library;
   @published bool last = false;
 
   LibraryNavMenuElement.created() : super.created();
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
index e11f9f0..dc7391c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -6,6 +6,11 @@
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
+      nav {
+        position: fixed;
+        width: 100%;
+        z-index: 1000;
+      }
       nav ul {
         display: inline-table;
         position: relative;
@@ -13,7 +18,7 @@
         padding-left: 0;
         margin-left: 0;
         width: 100%;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background-color: #0489c3;
@@ -21,12 +26,21 @@
       nav ul:after {
         content: ""; clear: both; display: block;
       }
+      .vertical-spacer {
+        height: 40px;
+        background-color: #0489c3;
+      }
     </style>
     <nav>
       <ul>
         <content></content>
       </ul>
     </nav>
+    <div class="vertical-spacer">
+    </div>
+    <template if="{{ pad }}">
+      <br>
+    </template>
   </template>
 </polymer-element>
 
@@ -53,7 +67,7 @@
         margin: 0;
         padding: 0;
         width: auto;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background: #567;
@@ -96,7 +110,7 @@
         padding: 0;
         margin-left: 0;
         width: auto;
-        z-index: 10;
+        z-index: 1000;
         font: 400 16px 'Montserrat', sans-serif;
         color: white;
         background: #567;
@@ -160,13 +174,13 @@
 
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
+    <nav-menu link="{{ hashLinkWorkaround }}" anchor="{{ isolate.name }}" last="{{ last }}">
       <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}"
                      anchor="stack trace"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}"
                      anchor="cpu profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}"
-                     anchor="heap profile"></nav-menu-item>
+                     anchor="allocation profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}"
                      anchor="heap map"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}"
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
index 24e53ba..2d0d60d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
@@ -82,7 +82,7 @@
     return (!['Null',
               'Smi',
               'Mint',
-              'Biginit',
+              'Bigint',
               'Bool',
               'String',
 	      'Double',
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
index c251423..2c2c64a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -9,7 +9,6 @@
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
-    <library-nav-menu library="{{ script.library }}"></library-nav-menu>
     <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
       <li>
         <input type="checkbox" checked="{{ showCoverage }}">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
index 6dad343..b215980 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
@@ -8,8 +8,9 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
+    <div class="content-centered">
       <h1>{{ error.kind }}</h1>
+      <br>
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
index 7bf21e6..b939e38 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
@@ -8,10 +8,13 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
-    <div class="content">
-        <h1>{{ exception.kind }}</h1>
-        <div class="well">{{ exception.message }}</div>
+    <div class="content-centered">
+      <h1>{{ exception.kind }}</h1>
+      <br>
+      <div class="well">{{ exception.message }}</div>
+      <template if="{{ exception.response != '' }}">
         <div class="well">{{ exception.response }}</div>
+      </template>
     </div>
   </template>
   <script type="application/dart" src="service_exception_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
index 9af8c16..2286b1a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
@@ -17,6 +17,7 @@
   void refChanged(oldValue) {
     notifyPropertyChange(#url, "", url);
     notifyPropertyChange(#name, [], name);
+    notifyPropertyChange(#nameIsEmpty, 0, 1);
     notifyPropertyChange(#hoverText, "", hoverText);
   }
 
@@ -47,4 +48,9 @@
     }
     return ref.name;
   }
+
+  // Workaround isEmpty not being useable due to missing @MirrorsUsed.
+  bool get nameIsEmpty {
+    return name.isEmpty;
+  }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
index 822645f..5b08d8a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -52,6 +52,28 @@
         HeapMapElement element = new Element.tag('heap-map');
         element.fragmentation = object;
         return element;
+      case 'LibraryPrefix':
+      case 'TypeRef':
+      case 'TypeParameter':
+      case 'BoundedType':
+      case 'Int32x4':
+      case 'Float32x4':
+      case 'Float64x4':
+      case 'TypedData':
+      case 'ExternalTypedData':
+      case 'Capability':
+      case 'ReceivePort':
+      case 'SendPort':
+      case 'Stacktrace':
+      case 'JSRegExp':
+      case 'WeakProperty':
+      case 'MirrorReference':
+      case 'UserTag':
+        // TODO(turnidge): The types above this comment are instance
+        // types and should be handled by the InstanceViewElement.  We
+        // need to go through these and make sure that they print in a
+        // reasonable way.
+      case 'Type':
       case 'Array':
       case 'Bool':
       case 'Closure':
@@ -59,8 +81,9 @@
       case 'GrowableObjectArray':
       case 'Instance':
       case 'Smi':
+      case 'Mint':
+      case 'Bigint':
       case 'String':
-      case 'Type':
         InstanceViewElement element = new Element.tag('instance-view');
         element.instance = object;
         return element;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
index 59428c1..f134d7f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
@@ -9,7 +9,7 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ trace.isolate.relativeHashLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
     <template if="{{ trace['members'].isEmpty }}">
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index 045f975..a94a706 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -30,6 +30,7 @@
   @reflectable String get link => isolate.relativeLink(_id);
 
   /// The complete service url of this object with a '#/' prefix.
+  // TODO(turnidge): Figure out why using a getter here messes up polymer.
   @reflectable String get hashLink => '#/${link}';
   @reflectable set hashLink(var o) { /* silence polymer */ }
 
@@ -73,6 +74,9 @@
       case 'Isolate':
         obj = new Isolate._empty(owner);
         break;
+      case 'Library':
+        obj = new Library._empty(owner);
+        break;
       case 'ServiceError':
         obj = new ServiceError._empty(owner);
         break;
@@ -280,6 +284,28 @@
       });
   }
 
+  Future<ObservableMap> _processMap(ObservableMap map) {
+    // Verify that the top level response is a service map.
+    if (!_isServiceMap(map)) {
+      return new Future.error(
+            new ServiceObject._fromMap(this, toObservable({
+        'type': 'ServiceException',
+        'id': '',
+        'kind': 'FormatException',
+        'response': map,
+        'message': 'Top level service responses must be service maps.',
+      })));
+    }
+    // Preemptively capture ServiceError and ServiceExceptions.
+    if (map['type'] == 'ServiceError') {
+      return new Future.error(new ServiceObject._fromMap(this, map));
+    } else if (map['type'] == 'ServiceException') {
+      return new Future.error(new ServiceObject._fromMap(this, map));
+    }
+    // map is now guaranteed to be a non-error/exception ServiceObject.
+    return new Future.value(map);
+  }
+
   /// Gets [id] as an [ObservableMap] from the service directly. If
   /// an error occurs, the future is completed as an error with a
   /// ServiceError or ServiceException. Therefore any chained then() calls
@@ -288,34 +314,19 @@
     return getString(id).then((response) {
       try {
         var map = toObservable(JSON.decode(response));
-        // Verify that the top level response is a service map.
-        if (!_isServiceMap(map)) {
-          return new Future.error(
-                new ServiceObject._fromMap(this, toObservable({
-            'type': 'ServiceException',
-            'id': '',
-            'kind': 'FormatException',
-            'response': map,
-            'message': 'Top level service responses must be service maps.',
-          })));
-        }
-        // Preemptively capture ServiceError and ServiceExceptions.
-        if (map['type'] == 'ServiceError') {
-          return new Future.error(new ServiceObject._fromMap(this, map));
-        } else if (map['type'] == 'ServiceException') {
-          return new Future.error(new ServiceObject._fromMap(this, map));
-        }
-        // map is now guaranteed to be a non-error/exception ServiceObject.
-        return map;
+        return _processMap(map);
       } catch (e, st) {
-        print(e);
-        print(st);
         return new Future.error(
               new ServiceObject._fromMap(this, toObservable({
           'type': 'ServiceException',
           'id': '',
           'kind': 'DecodeException',
-          'response': response,
+          'response':
+              'This is likely a result of a known V8 bug. Although the '
+              'the bug has been fixed the fix may not be in your Chrome'
+              ' version. For more information see dartbug.com/18385. '
+              'Observatory is still functioning and you should try your'
+              ' action again.',
           'message': 'Could not decode JSON: $e',
         })));
       }
@@ -576,7 +587,9 @@
       });
   }
 
-  @observable ServiceMap rootLib;
+  @observable Library rootLib;
+  @observable ObservableList<Library> libraries =
+      new ObservableList<Library>();
   @observable ObservableMap topFrame;
 
   @observable String name;
@@ -667,6 +680,12 @@
     running = map['topFrame'] != null;
     idle = !pausedOnStart && !pausedOnExit && !running;
     error = map['error'];
+
+    libraries.clear();
+    for (var lib in map['libraries']) {
+      libraries.add(lib);
+    }
+    libraries.sort((a,b) => a.name.compareTo(b.name));
   }
 
   Future<TagProfile> updateTagProfile() {
@@ -731,10 +750,10 @@
   bool get canCache {
     return (_serviceType == 'Class' ||
             _serviceType == 'Function' ||
-            _serviceType == 'Library') &&
+            _serviceType == 'Field') &&
            !_id.startsWith(objectIdRingPrefix);
   }
-  bool get immutable => canCache;
+  bool get immutable => false;
 
   ServiceMap._empty(ServiceObjectOwner owner) : super._empty(owner);
 
@@ -843,6 +862,49 @@
   }
 }
 
+class Library extends ServiceObject {
+  @observable String url;
+  @reflectable final imports = new ObservableList<Library>();
+  @reflectable final scripts = new ObservableList<Script>();
+  @reflectable final classes = new ObservableList<ServiceMap>();
+  @reflectable final variables = new ObservableList<ServiceMap>();
+  @reflectable final functions = new ObservableList<ServiceMap>();
+
+  bool get canCache => true;
+  bool get immutable => false;
+
+  Library._empty(ServiceObjectOwner owner) : super._empty(owner);
+
+  void _update(ObservableMap map, bool mapIsRef) {
+    url = map['url'];
+    var shortUrl = url;
+    if (url.startsWith('file://') ||
+        url.startsWith('http://')) {
+      shortUrl = url.substring(url.lastIndexOf('/') + 1);
+    }
+    name = map['user_name'];
+    if (name.isEmpty) {
+      name = shortUrl;
+    }
+    vmName = map['name'];
+    if (mapIsRef) {
+      return;
+    }
+    _loaded = true;
+    _upgradeCollection(map, isolate);
+    imports.clear();
+    imports.addAll(map['imports']);
+    scripts.clear();
+    scripts.addAll(map['scripts']);
+    classes.clear();
+    classes.addAll(map['classes']);
+    variables.clear();
+    variables.addAll(map['variables']);
+    functions.clear();
+    functions.addAll(map['functions']);
+  }
+}
+
 class ScriptLine {
   @reflectable final int line;
   @reflectable final String text;
@@ -852,7 +914,6 @@
 class Script extends ServiceObject {
   @reflectable final lines = new ObservableList<ScriptLine>();
   @reflectable final hits = new ObservableMap<int, int>();
-  @observable ServiceObject library;
   @observable String kind;
   @observable int firstTokenPos;
   @observable int lastTokenPos;
@@ -1151,6 +1212,7 @@
   @observable ServiceMap objectPool;
   @observable ServiceMap function;
   @observable Script script;
+  @observable bool isOptimized = false;
   String name;
   String vmName;
 
@@ -1267,6 +1329,7 @@
   void _update(ObservableMap m, bool mapIsRef) {
     name = m['user_name'];
     vmName = m['name'];
+    isOptimized = m['isOptimized'] != null ? m['isOptimized'] : false;
     kind = CodeKind.fromString(m['kind']);
     startAddress = int.parse(m['start'], radix:16);
     endAddress = int.parse(m['end'], radix:16);
diff --git a/runtime/bin/vmservice/client/web/main.dart b/runtime/bin/vmservice/client/web/main.dart
index f386529..db5153c 100644
--- a/runtime/bin/vmservice/client/web/main.dart
+++ b/runtime/bin/vmservice/client/web/main.dart
@@ -9,7 +9,14 @@
 main() {
   Logger.root.level = Level.INFO;
   Logger.root.onRecord.listen((LogRecord rec) {
-    print('${rec.level.name}: ${rec.time}: ${rec.message}');
+      if (rec.level == Level.WARNING &&
+          rec.message.startsWith('Error evaluating expression') &&
+          (rec.message.contains("Can't assign to null: ") ||
+           rec.message.contains('Expression is not assignable: '))) {
+        // Suppress flaky polymer errors.
+        return;
+      }
+      print('${rec.level.name}: ${rec.time}: ${rec.message}');
   });
   Logger.root.info('Starting Observatory');
   GoogleChart.initOnce().then((_) {
@@ -17,4 +24,4 @@
     Logger.root.info('Initializing Polymer');
     initPolymer();
   });
-}
\ No newline at end of file
+}
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 5648eb6..77da50c 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -391,6 +391,17 @@
 DART_EXPORT bool Dart_IdentityEquals(Dart_Handle obj1, Dart_Handle obj2);
 
 /**
+ * Returns a hash code for the argument. The hash code of objects that are equal
+ * according to Dart_IdentityEquals will return the same hash code, but the hash
+ * codes of non-equal objects are not necessarily distinct.
+ *
+ * \param obj An object for which to derive a hash code.
+ *
+ * \return A hash code for the parameter.
+ */
+DART_EXPORT uint64_t Dart_IdentityHash(Dart_Handle obj);
+
+/**
  * Allocates a handle in the current scope from a persistent handle.
  */
 DART_EXPORT Dart_Handle Dart_HandleFromPersistent(Dart_PersistentHandle object);
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index 788113b..c86ff8f 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -26,13 +26,11 @@
       native "List_copyFromObjectArray";
 
   void insert(int index, E element) {
-    throw new UnsupportedError(
-        "Cannot insert into a fixed-length list");
+    throw NonGrowableListError.add();
   }
 
   void insertAll(int index, Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot insert into a fixed-length list");
+    throw NonGrowableListError.add();
   }
 
   void setAll(int index, Iterable<E> iterable) {
@@ -40,23 +38,19 @@
   }
 
   E removeAt(int index) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
+    throw NonGrowableListError.remove();
   }
 
   bool remove(Object element) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
+    throw NonGrowableListError.remove();
   }
 
   void removeWhere(bool test(E element)) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
+    throw NonGrowableListError.remove();
   }
 
   void retainWhere(bool test(E element)) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
+    throw NonGrowableListError.remove();
   }
 
   Iterable<E> getRange(int start, [int end]) {
@@ -94,13 +88,11 @@
   }
 
   void removeRange(int start, int end) {
-    throw new UnsupportedError(
-        "Cannot remove range from a fixed-length list");
+    throw NonGrowableListError.remove();
   }
 
   void replaceRange(int start, int end, Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot remove range from a fixed-length list");
+    throw NonGrowableListError.remove();
   }
 
   void fillRange(int start, int end, [E fillValue]) {
@@ -222,44 +214,39 @@
   }
 
   void add(E element) {
-    throw new UnsupportedError(
-        "Cannot add to a fixed-length list");
+    throw NonGrowableListError.add();
   }
 
   void addAll(Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot add to a fixed-length list");
+    throw NonGrowableListError.add();
   }
 
   void clear() {
-    throw new UnsupportedError(
-        "Cannot clear a fixed-length list");
+    throw NonGrowableListError.remove();
   }
 
   void set length(int length) {
-    throw new UnsupportedError(
-        "Cannot resize a fixed-length list");
+    throw NonGrowableListError.length();
   }
 
   E removeLast() {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
+    throw NonGrowableListError.remove();
   }
 
   E get first {
     if (length > 0) return this[0];
-    throw new StateError("No elements");
+    throw IterableElementError.noElement();
   }
 
   E get last {
     if (length > 0) return this[length - 1];
-    throw new StateError("No elements");
+    throw IterableElementError.noElement();
   }
 
   E get single {
     if (length == 1) return this[0];
-    if (length == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
+    if (length == 0) throw IterableElementError.noElement();
+    throw IterableElementError.tooMany();
   }
 
   List<E> toList({ bool growable: true}) {
@@ -297,70 +284,57 @@
   E operator [](int index) native "List_getIndexed";
 
   void operator []=(int index, E value) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.change();
   }
 
   int get length native "List_getLength";
 
   void insert(int index, E element) {
-    throw new UnsupportedError(
-        "Cannot add to an immutable array");
+    throw UnmodifiableListError.add();
   }
 
   void insertAll(int index, Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot add to an immutable array");
+    throw UnmodifiableListError.add();
   }
 
   void setAll(int index, Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.change();
   }
 
   E removeAt(int index) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.remove();
   }
 
   bool remove(Object element) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.remove();
   }
 
   void removeWhere(bool test(E element)) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.remove();
   }
 
   void retainWhere(bool test(E element)) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.remove();
   }
 
   void copyFrom(List src, int srcStart, int dstStart, int count) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.change();
   }
 
   void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.change();
   }
 
   void removeRange(int start, int end) {
-    throw new UnsupportedError(
-        "Cannot remove range of an immutable array");
+    throw UnmodifiableListError.remove();
   }
 
   void fillRange(int start, int end, [E fillValue]) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.change();
   }
 
   void replaceRange(int start, int end, Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.change();
   }
 
   List<E> sublist(int start, [int end]) {
@@ -461,13 +435,11 @@
   Iterable<E> get reversed => IterableMixinWorkaround.reversedList(this);
 
   void sort([int compare(E a, E b)]) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.change();
   }
 
   void shuffle([Random random]) {
-    throw new UnsupportedError(
-        "Cannot modify an immutable array");
+    throw UnmodifiableListError.change();
   }
 
   String toString() {
@@ -488,44 +460,39 @@
   }
 
   void add(E element) {
-    throw new UnsupportedError(
-        "Cannot add to an immutable array");
+    throw UnmodifiableListError.add();
   }
 
   void addAll(Iterable<E> elements) {
-    throw new UnsupportedError(
-        "Cannot add to an immutable array");
+    throw UnmodifiableListError.add();
   }
 
   void clear() {
-    throw new UnsupportedError(
-        "Cannot clear an immutable array");
+    throw UnmodifiableListError.remove();
   }
 
   void set length(int length) {
-    throw new UnsupportedError(
-        "Cannot change the length of an immutable array");
+    throw UnmodifiableListError.length();
   }
 
   E removeLast() {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
+    throw UnmodifiableListError.remove();
   }
 
   E get first {
     if (length > 0) return this[0];
-    throw new StateError("No elements");
+    throw IterableElementError.noElement();
   }
 
   E get last {
     if (length > 0) return this[length - 1];
-    throw new StateError("No elements");
+    throw IterableElementError.noElement();
   }
 
   E get single {
     if (length == 1) return this[0];
-    if (length == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
+    if (length == 0) throw IterableElementError.noElement();
+    throw IterableElementError.tooMany();
   }
 
   List<E> toList({ bool growable: true }) {
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index a4cac7d..edfa26d 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -271,7 +271,8 @@
 DEFINE_NATIVE_ENTRY(Double_getIsNegative, 1) {
   const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
   // Include negative zero, infinity.
-  return Bool::Get(signbit(arg.value()) && !isnan(arg.value())).raw();
+  double dval = arg.value();
+  return Bool::Get(signbit(dval) && !isnan(dval)).raw();
 }
 
 // Add here only functions using/referring to old-style casts.
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index e9c1082..ed5551a 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -198,18 +198,18 @@
 
   T get first {
     if (length > 0) return this[0];
-    throw new StateError("No elements");
+    throw IterableElementError.noElement();
   }
 
   T get last {
     if (length > 0) return this[length - 1];
-    throw new StateError("No elements");
+    throw IterableElementError.noElement();
   }
 
   T get single {
     if (length == 1) return this[0];
-    if (length == 0) throw new StateError("No elements");
-    throw new StateError("More than one element");
+    if (length == 0) throw IterableElementError.noElement();
+    throw IterableElementError.tooMany();;
   }
 
   int indexOf(Object element, [int start = 0]) {
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index dd0ebd9..a7d8d90 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -948,6 +948,8 @@
     return _qualifiedName;
   }
 
+  bool get isPrivate => _n(simpleName).startsWith('_');
+
   List<InstanceMirror> get metadata {
     // Get the metadata objects, convert them into InstanceMirrors using
     // reflect() and then make them into a Dart list.
@@ -977,7 +979,6 @@
     return _owner;
   }
 
-  bool get isPrivate => false;
   bool get isStatic => false;
   bool get isTopLevel => false;
 
@@ -1051,7 +1052,6 @@
       : super(reflectee, _s(simpleName));
 
   bool get isTopLevel => true;
-  bool get isPrivate => false;
 
   DeclarationMirror _owner;
   DeclarationMirror get owner {
@@ -1417,8 +1417,6 @@
                        this.isConst)
       : super(reflectee, _s(simpleName));
 
-  bool get isPrivate => _n(simpleName).startsWith('_');
-
   bool get isTopLevel => owner is LibraryMirror;
 
   SourceLocation get location {
diff --git a/runtime/lib/profiler.cc b/runtime/lib/profiler.cc
index 75bf2d1..3128fb9 100644
--- a/runtime/lib/profiler.cc
+++ b/runtime/lib/profiler.cc
@@ -36,8 +36,17 @@
   if (FLAG_trace_intrinsified_natives) {
     OS::Print("UserTag_makeCurrent: %s\n", self.ToCString());
   }
+  const UserTag& old = UserTag::Handle(isolate->current_tag());
   self.MakeActive();
-  return Object::null();
+  return old.raw();
+}
+
+
+DEFINE_NATIVE_ENTRY(UserTag_defaultTag, 0) {
+  if (FLAG_trace_intrinsified_natives) {
+    OS::Print("UserTag_defaultTag\n");
+  }
+  return isolate->object_store()->default_tag();
 }
 
 
@@ -49,15 +58,4 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(Profiler_clearCurrentTag, 0) {
-  // Use a NoGCScope to avoid creating a handle for the old current.
-  NoGCScope no_gc;
-  RawUserTag* old_current = isolate->current_tag();
-  UserTag::ClearActive();
-  if (FLAG_trace_intrinsified_natives) {
-    OS::Print("Profiler_clearCurrentTag\n");
-  }
-  return old_current;
-}
-
 }  // namespace dart
diff --git a/runtime/lib/profiler.dart b/runtime/lib/profiler.dart
index 5ed8df5..c42e966 100644
--- a/runtime/lib/profiler.dart
+++ b/runtime/lib/profiler.dart
@@ -8,6 +8,7 @@
   /* patch */ factory UserTag(String label) {
     return new _UserTag(label);
   }
+  /* patch */ static UserTag get defaultTag => _getDefaultTag();
 }
 
 
@@ -20,5 +21,4 @@
 patch UserTag getCurrentTag() => _getCurrentTag();
 UserTag _getCurrentTag() native "Profiler_getCurrentTag";
 
-patch UserTag clearCurrentTag() => _clearCurrentTag();
-UserTag _clearCurrentTag() native "Profiler_clearCurrentTag";
+UserTag _getDefaultTag() native "UserTag_defaultTag";
diff --git a/runtime/platform/utils.h b/runtime/platform/utils.h
index 953cf10..f202562 100644
--- a/runtime/platform/utils.h
+++ b/runtime/platform/utils.h
@@ -179,6 +179,10 @@
   static uint16_t HostToLittleEndian16(uint16_t host_value);
   static uint32_t HostToLittleEndian32(uint32_t host_value);
   static uint64_t HostToLittleEndian64(uint64_t host_value);
+
+  static bool DoublesBitEqual(const double a, const double b) {
+    return bit_cast<int64_t, double>(a) == bit_cast<int64_t, double>(b);
+  }
 };
 
 }  // namespace dart
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 7202e43..d4aadf6 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -17,6 +17,7 @@
 cc/Sleep: Pass, Fail
 
 [ $mode == debug ]
+cc/PrintJSON: Crash  # Issue 18652
 
 [ $arch == x64 ]
 cc/IsolateInterrupt: Skip
diff --git a/runtime/vm/allocation.h b/runtime/vm/allocation.h
index bb23185..9b07893 100644
--- a/runtime/vm/allocation.h
+++ b/runtime/vm/allocation.h
@@ -36,31 +36,34 @@
 // to a stack frame above the frame where these objects were allocated.
 class StackResource {
  public:
-  explicit StackResource(BaseIsolate* isolate)
-      : isolate_(isolate), previous_(NULL) {
+  explicit StackResource(Isolate* isolate)
+      : isolate_(reinterpret_cast<BaseIsolate*>(isolate)), previous_(NULL) {
     // We can only have longjumps and exceptions when there is a current
     // isolate.  If there is no current isolate, we don't need to
     // protect this case.
-    if (isolate != NULL) {
-      previous_ = isolate->top_resource();
-      isolate->set_top_resource(this);
+    if (isolate_ != NULL) {
+      previous_ = isolate_->top_resource();
+      isolate_->set_top_resource(this);
     }
   }
 
   virtual ~StackResource() {
-    if (isolate() != NULL) {
-      StackResource* top = isolate()->top_resource();
+    if (isolate_ != NULL) {
+      StackResource* top = isolate_->top_resource();
       ASSERT(top == this);
-      isolate()->set_top_resource(previous_);
+      isolate_->set_top_resource(previous_);
     }
 #if defined(DEBUG)
-    if (isolate() != NULL) {
-      BaseIsolate::AssertCurrent(isolate());
+    if (isolate_ != NULL) {
+      BaseIsolate::AssertCurrent(isolate_);
     }
 #endif
   }
 
-  BaseIsolate* isolate() const { return isolate_; }
+  // We can only create StackResources with Isolates, so provide the original
+  // isolate to the subclasses. The only reason we have a BaseIsolate in the
+  // StackResource is to break the header include cycles.
+  Isolate* isolate() const { return reinterpret_cast<Isolate*>(isolate_); }
 
  private:
   BaseIsolate* const isolate_;  // Current isolate for this stack resource.
diff --git a/runtime/vm/assembler.cc b/runtime/vm/assembler.cc
index 1b25ac3..65e5627 100644
--- a/runtime/vm/assembler.cc
+++ b/runtime/vm/assembler.cc
@@ -13,7 +13,7 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, code_comments, true,
+DEFINE_FLAG(bool, code_comments, false,
             "Include comments into code and disassembly");
 #if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
 DEFINE_FLAG(bool, use_far_branches, false,
@@ -210,7 +210,7 @@
 
 
 void Assembler::Comment(const char* format, ...) {
-  if (FLAG_code_comments && (FLAG_disassemble || FLAG_disassemble_optimized)) {
+  if (FLAG_code_comments || FLAG_disassemble || FLAG_disassemble_optimized) {
     char buffer[1024];
 
     va_list args;
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index a4a208e..aeaa13b 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -566,9 +566,17 @@
 }
 
 
+void Assembler::LoadDImmediate(VRegister vd, double immd, Register pp) {
+  if (!fmovdi(vd, immd)) {
+    int64_t imm = bit_cast<int64_t, double>(immd);
+    LoadImmediate(TMP, imm, pp);
+    fmovdr(vd, TMP);
+  }
+}
+
+
 void Assembler::AddImmediate(
     Register dest, Register rn, int64_t imm, Register pp) {
-  ASSERT(rn != TMP2);
   Operand op;
   if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) {
     add(dest, rn, op);
@@ -576,12 +584,67 @@
              Operand::Immediate) {
     sub(dest, rn, op);
   } else {
+    // TODO(zra): Try adding top 12 bits, then bottom 12 bits.
+    ASSERT(rn != TMP2);
     LoadImmediate(TMP2, imm, pp);
     add(dest, rn, Operand(TMP2));
   }
 }
 
 
+void Assembler::AddImmediateSetFlags(
+    Register dest, Register rn, int64_t imm, Register pp) {
+  Operand op;
+  if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) {
+    adds(dest, rn, op);
+  } else if (Operand::CanHold(-imm, kXRegSizeInBits, &op) ==
+             Operand::Immediate) {
+    subs(dest, rn, op);
+  } else {
+    // TODO(zra): Try adding top 12 bits, then bottom 12 bits.
+    ASSERT(rn != TMP2);
+    LoadImmediate(TMP2, imm, pp);
+    adds(dest, rn, Operand(TMP2));
+  }
+}
+
+
+void Assembler::AndImmediate(
+    Register rd, Register rn, int64_t imm, Register pp) {
+  Operand imm_op;
+  if (Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op)) {
+    andi(rd, rn, imm);
+  } else {
+    LoadImmediate(TMP, imm, pp);
+    and_(rd, rn, Operand(TMP));
+  }
+}
+
+
+void Assembler::OrImmediate(
+    Register rd, Register rn, int64_t imm, Register pp) {
+  Operand imm_op;
+  if (Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op)) {
+    orri(rd, rn, imm);
+  } else {
+    LoadImmediate(TMP, imm, pp);
+    orr(rd, rn, Operand(TMP));
+  }
+}
+
+
+void Assembler::XorImmediate(
+    Register rd, Register rn, int64_t imm, Register pp) {
+  Operand imm_op;
+  if (Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op)) {
+    eori(rd, rn, imm);
+  } else {
+    LoadImmediate(TMP, imm, pp);
+    eor(rd, rn, Operand(TMP));
+  }
+}
+
+
 void Assembler::TestImmediate(Register rn, int64_t imm, Register pp) {
   Operand imm_op;
   if (Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op)) {
@@ -594,7 +657,6 @@
 
 
 void Assembler::CompareImmediate(Register rn, int64_t imm, Register pp) {
-  ASSERT(rn != TMP2);
   Operand op;
   if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) {
     cmp(rn, op);
@@ -602,6 +664,7 @@
              Operand::Immediate) {
     cmn(rn, op);
   } else {
+    ASSERT(rn != TMP2);
     LoadImmediate(TMP2, imm, pp);
     cmp(rn, Operand(TMP2));
   }
@@ -610,10 +673,10 @@
 
 void Assembler::LoadFromOffset(
     Register dest, Register base, int32_t offset, OperandSize sz) {
-  ASSERT(base != TMP2);
   if (Address::CanHoldOffset(offset, Address::Offset, sz)) {
     ldr(dest, Address(base, offset, Address::Offset, sz), sz);
   } else {
+    ASSERT(base != TMP2);
     // Since offset is 32-bits, it won't be loaded from the pool.
     AddImmediate(TMP2, base, offset, kNoPP);
     ldr(dest, Address(TMP2), sz);
@@ -621,13 +684,25 @@
 }
 
 
+void Assembler::LoadDFromOffset(VRegister dest, Register base, int32_t offset) {
+  if (Address::CanHoldOffset(offset, Address::Offset, kDWord)) {
+    fldrd(dest, Address(base, offset, Address::Offset, kDWord));
+  } else {
+    ASSERT(base != TMP2);
+    // Since offset is 32-bits, it won't be loaded from the pool.
+    AddImmediate(TMP2, base, offset, kNoPP);
+    fldrd(dest, Address(TMP2));
+  }
+}
+
+
 void Assembler::StoreToOffset(
     Register src, Register base, int32_t offset, OperandSize sz) {
-  ASSERT(src != TMP2);
   ASSERT(base != TMP2);
   if (Address::CanHoldOffset(offset, Address::Offset, sz)) {
     str(src, Address(base, offset, Address::Offset, sz), sz);
   } else {
+    ASSERT(src != TMP2);
     // Since offset is 32-bits, it won't be loaded from the pool.
     AddImmediate(TMP2, base, offset, kNoPP);
     str(src, Address(TMP2), sz);
@@ -635,6 +710,18 @@
 }
 
 
+void Assembler::StoreDToOffset(VRegister src, Register base, int32_t offset) {
+  if (Address::CanHoldOffset(offset, Address::Offset, kDWord)) {
+    fstrd(src, Address(base, offset, Address::Offset, kDWord));
+  } else {
+    ASSERT(base != TMP2);
+    // Since offset is 32-bits, it won't be loaded from the pool.
+    AddImmediate(TMP2, base, offset, kNoPP);
+    fstrd(src, Address(TMP2));
+  }
+}
+
+
 // Store into object.
 // Preserves object and value registers.
 void Assembler::StoreIntoObjectFilterNoSmi(Register object,
@@ -832,12 +919,9 @@
 // optimized function and there may be extra space for spill slots to
 // allocate. We must also set up the pool pointer for the function.
 void Assembler::EnterOsrFrame(intptr_t extra_size, Register new_pp) {
-  const intptr_t offset = CodeSize();
-
   Comment("EnterOsrFrame");
   adr(TMP, -CodeSize());
 
-  AddImmediate(TMP, TMP, -offset, kNoPP);
   StoreToOffset(TMP, FP, kPcMarkerSlotFromFp * kWordSize);
 
   // Setup pool pointer for this dart function.
@@ -864,11 +948,22 @@
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_size) {
   EnterFrame(0);
 
-  // TODO(zra): also save volatile FPU registers.
+  // Store fpu registers with the lowest register number at the lowest
+  // address.
+  for (int i = kNumberOfVRegisters - 1; i >= 0; i--) {
+    if ((i >= kAbiFirstPreservedFpuReg) && (i <= kAbiLastPreservedFpuReg)) {
+      // TODO(zra): When SIMD is added, we must also preserve the top
+      // 64-bits of the callee-saved registers.
+      continue;
+    }
+    // TODO(zra): Save the whole V register.
+    VRegister reg = static_cast<VRegister>(i);
+    PushDouble(reg);
+  }
 
   for (int i = kDartFirstVolatileCpuReg; i <= kDartLastVolatileCpuReg; i++) {
     const Register reg = static_cast<Register>(i);
-    if ((reg != R16) && (reg != R17)) {
+    if ((reg != TMP) && (reg != TMP2)) {
       Push(reg);
     }
   }
@@ -883,15 +978,27 @@
   // We need to restore it before restoring registers.
   // TODO(zra): Also include FPU regs in this count once they are added.
   const intptr_t kPushedRegistersSize =
-      kDartVolatileCpuRegCount * kWordSize;
+      kDartVolatileCpuRegCount * kWordSize +
+      kDartVolatileFpuRegCount * kWordSize;
   AddImmediate(SP, FP, -kPushedRegistersSize, PP);
   for (int i = kDartLastVolatileCpuReg; i >= kDartFirstVolatileCpuReg; i--) {
     const Register reg = static_cast<Register>(i);
-    if ((reg != R16) && (reg != R17)) {
+    if ((reg != TMP) && (reg != TMP2)) {
       Pop(reg);
     }
   }
 
+  for (int i = 0; i < kNumberOfVRegisters; i++) {
+    if ((i >= kAbiFirstPreservedFpuReg) && (i <= kAbiLastPreservedFpuReg)) {
+      // TODO(zra): When SIMD is added, we must also restore the top
+      // 64-bits of the callee-saved registers.
+      continue;
+    }
+    // TODO(zra): Restore the whole V register.
+    VRegister reg = static_cast<VRegister>(i);
+    PopDouble(reg);
+  }
+
   Pop(FP);
   Pop(LR);
 }
@@ -1008,6 +1115,48 @@
   }
 }
 
+
+void Assembler::TryAllocate(const Class& cls,
+                            Label* failure,
+                            Register instance_reg,
+                            Register temp_reg,
+                            Register pp) {
+  ASSERT(failure != NULL);
+  if (FLAG_inline_alloc) {
+    Heap* heap = Isolate::Current()->heap();
+    const intptr_t instance_size = cls.instance_size();
+    LoadImmediate(instance_reg, heap->TopAddress(), pp);
+    ldr(instance_reg, Address(instance_reg));
+    AddImmediate(instance_reg, instance_reg, instance_size, pp);
+
+    // instance_reg: potential next object start.
+    LoadImmediate(TMP, heap->EndAddress(), pp);
+    ldr(TMP, Address(TMP));
+    CompareRegisters(TMP, instance_reg);
+    // fail if heap end unsigned less than or equal to instance_reg.
+    b(failure, LS);
+
+    // Successfully allocated the object, now update top to point to
+    // next object start and store the class in the class field of object.
+    LoadImmediate(TMP, heap->TopAddress(), pp);
+    str(instance_reg, Address(TMP));
+
+    ASSERT(instance_size >= kHeapObjectTag);
+    AddImmediate(
+        instance_reg, instance_reg, -instance_size + kHeapObjectTag, pp);
+    UpdateAllocationStats(cls.id(), temp_reg, pp);
+
+    uword tags = 0;
+    tags = RawObject::SizeTag::update(instance_size, tags);
+    ASSERT(cls.id() != kIllegalCid);
+    tags = RawObject::ClassIdTag::update(cls.id(), tags);
+    LoadImmediate(TMP, tags, pp);
+    StoreFieldToOffset(TMP, instance_reg, Object::tags_offset());
+  } else {
+    b(failure);
+  }
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index de40152..17b317e 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -513,6 +513,12 @@
   void madd(Register rd, Register rn, Register rm, Register ra) {
     EmitMiscDP3Source(MADD, rd, rn, rm, ra, kDoubleWord);
   }
+  void msub(Register rd, Register rn, Register rm, Register ra) {
+    EmitMiscDP3Source(MSUB, rd, rn, rm, ra, kDoubleWord);
+  }
+  void smulh(Register rd, Register rn, Register rm) {
+    EmitMiscDP3Source(SMULH, rd, rn, rm, R0, kDoubleWord);
+  }
 
   // Move wide immediate.
   void movk(Register rd, uint16_t imm, int hw_idx) {
@@ -554,6 +560,15 @@
   void csel(Register rd, Register rn, Register rm, Condition cond) {
     EmitCoditionalSelect(CSEL, rd, rn, rm, cond, kDoubleWord);
   }
+  void csinc(Register rd, Register rn, Register rm, Condition cond) {
+    EmitCoditionalSelect(CSINC, rd, rn, rm, cond, kDoubleWord);
+  }
+  void cinc(Register rd, Register rn, Condition cond) {
+    csinc(rd, rn, rn, InvertCondition(cond));
+  }
+  void cset(Register rd, Condition cond) {
+    csinc(rd, ZR, ZR, InvertCondition(cond));
+  }
 
   // Comparison.
   // rn cmp o.
@@ -601,6 +616,75 @@
     EmitExceptionGenOp(HLT, imm);
   }
 
+  // Double floating point.
+  bool fmovdi(VRegister vd, double immd) {
+    int64_t imm64 = bit_cast<int64_t, double>(immd);
+    const uint8_t bit7 = imm64 >> 63;
+    const uint8_t bit6 = (~(imm64 >> 62)) & 0x1;
+    const uint8_t bit54 = (imm64 >> 52) & 0x3;
+    const uint8_t bit30 = (imm64 >> 48) & 0xf;
+    const uint8_t imm8 = (bit7 << 7) | (bit6 << 6) | (bit54 << 4) | bit30;
+    const int64_t expimm8 = Instr::VFPExpandImm(imm8);
+    if (imm64 != expimm8) {
+      return false;
+    }
+    EmitFPImm(FMOVDI, vd, imm8);
+    return true;
+  }
+  void fmovdr(VRegister vd, Register rn) {
+    ASSERT(rn != R31);
+    ASSERT(rn != SP);
+    const Register crn = ConcreteRegister(rn);
+    EmitFPIntCvtOp(FMOVDR, static_cast<Register>(vd), crn);
+  }
+  void fmovrd(Register rd, VRegister vn) {
+    ASSERT(rd != R31);
+    ASSERT(rd != SP);
+    const Register crd = ConcreteRegister(rd);
+    EmitFPIntCvtOp(FMOVRD, crd, static_cast<Register>(vn));
+  }
+  void scvtfd(VRegister vd, Register rn) {
+    ASSERT(rn != R31);
+    ASSERT(rn != SP);
+    const Register crn = ConcreteRegister(rn);
+    EmitFPIntCvtOp(SCVTFD, static_cast<Register>(vd), crn);
+  }
+  void fcvtzds(Register rd, VRegister vn) {
+    ASSERT(rd != R31);
+    ASSERT(rd != SP);
+    const Register crd = ConcreteRegister(rd);
+    EmitFPIntCvtOp(FCVTZDS, crd, static_cast<Register>(vn));
+  }
+  void fmovdd(VRegister vd, VRegister vn) {
+    EmitFPOneSourceOp(FMOVDD, vd, vn);
+  }
+  void fldrd(VRegister vt, Address a) {
+    ASSERT(a.type() != Address::PCOffset);
+    EmitLoadStoreReg(FLDR, static_cast<Register>(vt), a, kDoubleWord);
+  }
+  void fstrd(VRegister vt, Address a) {
+    ASSERT(a.type() != Address::PCOffset);
+    EmitLoadStoreReg(FSTR, static_cast<Register>(vt), a, kDoubleWord);
+  }
+  void fcmpd(VRegister vn, VRegister vm) {
+    EmitFPCompareOp(FCMPD, vn, vm);
+  }
+  void fcmpzd(VRegister vn) {
+    EmitFPCompareOp(FCMPZD, vn, V0);
+  }
+  void fmuld(VRegister vd, VRegister vn, VRegister vm) {
+    EmitFPTwoSourceOp(FMULD, vd, vn, vm);
+  }
+  void fdivd(VRegister vd, VRegister vn, VRegister vm) {
+    EmitFPTwoSourceOp(FDIVD, vd, vn, vm);
+  }
+  void faddd(VRegister vd, VRegister vn, VRegister vm) {
+    EmitFPTwoSourceOp(FADDD, vd, vn, vm);
+  }
+  void fsubd(VRegister vd, VRegister vn, VRegister vm) {
+    EmitFPTwoSourceOp(FSUBD, vd, vn, vm);
+  }
+
   // Aliases.
   void mov(Register rd, Register rn) {
     if ((rd == SP) || (rn == SP)) {
@@ -610,7 +694,7 @@
     }
   }
   void mvn(Register rd, Register rm) {
-    orr(rd, ZR, Operand(rm));
+    orn(rd, ZR, Operand(rm));
   }
   void neg(Register rd, Register rm) {
     sub(rd, ZR, Operand(rm));
@@ -629,6 +713,12 @@
     ASSERT(reg != PP);  // Only pop PP with PopAndUntagPP().
     ldr(reg, Address(SP, 1 * kWordSize, Address::PostIndex));
   }
+  void PushDouble(VRegister reg) {
+    fstrd(reg, Address(SP, -1 * kWordSize, Address::PreIndex));
+  }
+  void PopDouble(VRegister reg) {
+    fldrd(reg, Address(SP, 1 * kWordSize, Address::PostIndex));
+  }
   void TagAndPushPP() {
     // Add the heap object tag back to PP before putting it on the stack.
     add(TMP, PP, Operand(kHeapObjectTag));
@@ -699,6 +789,11 @@
   // pool pointer is in another register, or that it is not available at all,
   // PP should be passed for pp.
   void AddImmediate(Register dest, Register rn, int64_t imm, Register pp);
+  void AddImmediateSetFlags(
+      Register dest, Register rn, int64_t imm, Register pp);
+  void AndImmediate(Register rd, Register rn, int64_t imm, Register pp);
+  void OrImmediate(Register rd, Register rn, int64_t imm, Register pp);
+  void XorImmediate(Register rd, Register rn, int64_t imm, Register pp);
   void TestImmediate(Register rn, int64_t imm, Register pp);
   void CompareImmediate(Register rn, int64_t imm, Register pp);
 
@@ -707,11 +802,19 @@
   void LoadFieldFromOffset(Register dest, Register base, int32_t offset) {
     LoadFromOffset(dest, base, offset - kHeapObjectTag);
   }
+  void LoadDFromOffset(VRegister dest, Register base, int32_t offset);
+  void LoadDFieldFromOffset(VRegister dest, Register base, int32_t offset) {
+    LoadDFromOffset(dest, base, offset - kHeapObjectTag);
+  }
 
-  void StoreToOffset(Register dest, Register base, int32_t offset,
+  void StoreToOffset(Register src, Register base, int32_t offset,
                      OperandSize sz = kDoubleWord);
-  void StoreFieldToOffset(Register dest, Register base, int32_t offset) {
-    StoreToOffset(dest, base, offset - kHeapObjectTag);
+  void StoreFieldToOffset(Register src, Register base, int32_t offset) {
+    StoreToOffset(src, base, offset - kHeapObjectTag);
+  }
+  void StoreDToOffset(VRegister src, Register base, int32_t offset);
+  void StoreDFieldToOffset(VRegister src, Register base, int32_t offset) {
+    StoreDToOffset(src, base, offset - kHeapObjectTag);
   }
 
   // Storing into an object.
@@ -750,6 +853,7 @@
   void LoadDecodableImmediate(Register reg, int64_t imm, Register pp);
   void LoadImmediateFixed(Register reg, int64_t imm);
   void LoadImmediate(Register reg, int64_t imm, Register pp);
+  void LoadDImmediate(VRegister reg, double immd, Register pp);
 
   void PushObject(const Object& object, Register pp) {
     LoadObject(TMP, object, pp);
@@ -790,6 +894,16 @@
                                      Register pp,
                                      Heap::Space space = Heap::kNew);
 
+  // Inlined allocation of an instance of class 'cls', code has no runtime
+  // calls. Jump to 'failure' if the instance cannot be allocated here.
+  // Allocated instance is returned in 'instance_reg'.
+  // Only the tags field of the object is initialized.
+  void TryAllocate(const Class& cls,
+                   Label* failure,
+                   Register instance_reg,
+                   Register temp_reg,
+                   Register pp);
+
  private:
   AssemblerBuffer buffer_;  // Contains position independent code.
 
@@ -1114,6 +1228,48 @@
     Emit(encoding);
   }
 
+  void EmitFPImm(FPImmOp op, VRegister vd, uint8_t imm8) {
+    const int32_t encoding =
+        op |
+        (static_cast<int32_t>(vd) << kVdShift) |
+        (imm8 << kImm8Shift);
+    Emit(encoding);
+  }
+
+  void EmitFPIntCvtOp(FPIntCvtOp op, Register rd, Register rn) {
+    const int32_t encoding =
+        op |
+        (static_cast<int32_t>(rd) << kRdShift) |
+        (static_cast<int32_t>(rn) << kRnShift);
+    Emit(encoding);
+  }
+
+  void EmitFPOneSourceOp(FPOneSourceOp op, VRegister vd, VRegister vn) {
+    const int32_t encoding =
+        op |
+        (static_cast<int32_t>(vd) << kVdShift) |
+        (static_cast<int32_t>(vn) << kVnShift);
+    Emit(encoding);
+  }
+
+  void EmitFPTwoSourceOp(FPTwoSourceOp op,
+                         VRegister vd, VRegister vn, VRegister vm) {
+    const int32_t encoding =
+        op |
+        (static_cast<int32_t>(vd) << kVdShift) |
+        (static_cast<int32_t>(vn) << kVnShift) |
+        (static_cast<int32_t>(vm) << kVmShift);
+    Emit(encoding);
+  }
+
+  void EmitFPCompareOp(FPCompareOp op, VRegister vn, VRegister vm) {
+    const int32_t encoding =
+        op |
+        (static_cast<int32_t>(vn) << kVnShift) |
+        (static_cast<int32_t>(vm) << kVmShift);
+    Emit(encoding);
+  }
+
   void StoreIntoObjectFilter(Register object, Register value, Label* no_update);
 
   // Shorter filtering sequence that assumes that value is not a smi.
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
index 0f67e8c..9544852 100644
--- a/runtime/vm/assembler_arm64_test.cc
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -716,6 +716,114 @@
 }
 
 
+
+
+ASSEMBLER_TEST_GENERATE(FcmpEqBranch, assembler) {
+  Label l;
+
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ LoadDImmediate(V1, 234.0, kNoPP);
+  __ LoadDImmediate(V2, 234.0, kNoPP);
+
+  __ fcmpd(V1, V2);
+  __ b(&l, EQ);
+  __ LoadDImmediate(V0, 0.0, kNoPP);
+  __ Bind(&l);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FcmpEqBranch, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FcmpEqBranchNotTaken, assembler) {
+  Label l;
+
+  __ LoadDImmediate(V0, 0.0, kNoPP);
+  __ LoadDImmediate(V1, 233.0, kNoPP);
+  __ LoadDImmediate(V2, 234.0, kNoPP);
+
+  __ fcmpd(V1, V2);
+  __ b(&l, EQ);
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ Bind(&l);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FcmpEqBranchNotTaken, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FcmpLtBranch, assembler) {
+  Label l;
+
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ LoadDImmediate(V1, 233.0, kNoPP);
+  __ LoadDImmediate(V2, 234.0, kNoPP);
+
+  __ fcmpd(V1, V2);
+  __ b(&l, LT);
+  __ LoadDImmediate(V0, 0.0, kNoPP);
+  __ Bind(&l);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FcmpLtBranch, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FcmpLtBranchNotTaken, assembler) {
+  Label l;
+
+  __ LoadDImmediate(V0, 0.0, kNoPP);
+  __ LoadDImmediate(V1, 235.0, kNoPP);
+  __ LoadDImmediate(V2, 234.0, kNoPP);
+
+  __ fcmpd(V1, V2);
+  __ b(&l, LT);
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ Bind(&l);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FcmpLtBranchNotTaken, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FcmpzGtBranch, assembler) {
+  Label l;
+
+  __ LoadDImmediate(V0, 235.0, kNoPP);
+  __ LoadDImmediate(V1, 233.0, kNoPP);
+
+  __ fcmpzd(V1);
+  __ b(&l, GT);
+  __ LoadDImmediate(V0, 0.0, kNoPP);
+  __ ret();
+  __ Bind(&l);
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) {
   Label l;
 
@@ -1065,6 +1173,35 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(Smulh_pos, assembler) {
+  __ movz(R1, 6, 0);
+  __ movz(R2, 7, 0);
+  __ smulh(R0, R1, R2);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Smulh_pos, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Smulh_neg, assembler) {
+  __ movz(R1, 6, 0);
+  __ movz(R2, 7, 0);
+  __ neg(R2, R2);
+  __ smulh(R0, R1, R2);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Smulh_neg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
 // Loading immediate values without the object pool.
 ASSEMBLER_TEST_GENERATE(LoadImmediateSmall, assembler) {
   __ LoadImmediate(R0, 42, kNoRegister);
@@ -1316,6 +1453,280 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(CsincFalse, assembler) {
+  __ LoadImmediate(R1, 42, kNoRegister);
+  __ LoadImmediate(R2, 1234, kNoRegister);
+  __ CompareRegisters(R1, R2);
+  __ csinc(R0, R2, R1, GE);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(CsincFalse, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(43, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(CsincTrue, assembler) {
+  __ LoadImmediate(R1, 42, kNoRegister);
+  __ LoadImmediate(R2, 1234, kNoRegister);
+  __ CompareRegisters(R1, R2);
+  __ csinc(R0, R2, R1, LT);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(CsincTrue, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+// Floating point move immediate, to/from integer register.
+ASSEMBLER_TEST_GENERATE(Fmovdi, assembler) {
+  __ LoadDImmediate(V0, 1.0, kNoPP);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fmovdi, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fmovdi2, assembler) {
+  __ LoadDImmediate(V0, 123412983.1324524315, kNoPP);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fmovdi2, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_FLOAT_EQ(123412983.1324524315,
+      EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()), 0.0001f);
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fmovrd, assembler) {
+  __ LoadDImmediate(V1, 1.0, kNoPP);
+  __ fmovrd(R0, V1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fmovrd, test) {
+  typedef int (*SimpleCode)();
+  const int64_t one = bit_cast<int64_t, double>(1.0);
+  EXPECT_EQ(one, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fmovdr, assembler) {
+  __ LoadDImmediate(V1, 1.0, kNoPP);
+  __ fmovrd(R1, V1);
+  __ fmovdr(V0, R1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fmovdr, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) {
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex));
+  __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fcvtzds, assembler) {
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ fcvtzds(R0, V0);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fcvtzds, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Scvtfd, assembler) {
+  __ LoadImmediate(R0, 42, kNoPP);
+  __ scvtfd(V0, R0);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Scvtfd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fmuld, assembler) {
+  __ LoadDImmediate(V1, 84.0, kNoPP);
+  __ LoadDImmediate(V2, 0.5, kNoPP);
+  __ fmuld(V0, V1, V2);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fmuld, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fdivd, assembler) {
+  __ LoadDImmediate(V1, 84.0, kNoPP);
+  __ LoadDImmediate(V2, 2.0, kNoPP);
+  __ fdivd(V0, V1, V2);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fdivd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Faddd, assembler) {
+  __ LoadDImmediate(V1, 41.5, kNoPP);
+  __ LoadDImmediate(V2, 0.5, kNoPP);
+  __ faddd(V0, V1, V2);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Faddd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fsubd, assembler) {
+  __ LoadDImmediate(V1, 42.5, kNoPP);
+  __ LoadDImmediate(V2, 0.5, kNoPP);
+  __ fsubd(V0, V1, V2);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fsubd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) {
+  __ LoadDImmediate(V0, 43.0, kNoPP);
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  __ AddImmediate(SP, SP, -1 * kWordSize, kNoPP);
+  __ add(R2, SP, Operand(1));
+  __ fstrd(V1, Address(R2, -1));
+  __ fldrd(V0, Address(R2, -1));
+  __ AddImmediate(SP, SP, 1 * kWordSize, kNoPP);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) {
+  __ LoadDImmediate(V0, 43.0, kNoPP);
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  // Largest negative offset that can fit in the signed 9-bit immediate field.
+  __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex));
+  // Largest positive kWordSize aligned offset that we can fit.
+  __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex));
+  // Correction.
+  __ add(SP, SP, Operand(kWordSize));  // Restore SP.
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) {
+  __ LoadDImmediate(V0, 43.0, kNoPP);
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  __ sub(SP, SP, Operand(512*kWordSize));
+  __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset));
+  __ add(SP, SP, Operand(512*kWordSize));
+  __ fldrd(V0, Address(SP));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) {
+  __ LoadDImmediate(V0, 43.0, kNoPP);
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  __ movz(R2, 0xfff8, 0);
+  __ movk(R2, 0xffff, 1);  // R2 <- -8 (int32_t).
+  // This should sign extend R2, and add to SP to get address,
+  // i.e. SP - kWordSize.
+  __ fstrd(V1, Address(SP, R2, SXTW));
+  __ sub(SP, SP, Operand(kWordSize));
+  __ fldrd(V0, Address(SP));
+  __ add(SP, SP, Operand(kWordSize));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) {
+  __ LoadDImmediate(V0, 43.0, kNoPP);
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  __ movz(R2, 10, 0);
+  __ sub(SP, SP, Operand(10*kWordSize));
+  // Store V1 into SP + R2 * kWordSize.
+  __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled));
+  __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled));
+  __ add(SP, SP, Operand(10*kWordSize));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
 // Called from assembler_test.cc.
 // LR: return address.
 // R0: context.
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index e17dd70..734f59d 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -691,7 +691,6 @@
   void StoreObject(const Address& dst, const Object& obj, Register pp);
   void PushObject(const Object& object, Register pp);
   void CompareObject(Register reg, const Object& object, Register pp);
-  void LoadDoubleConstant(XmmRegister dst, double value);
 
   // Destroys value.
   void StoreIntoObject(Register object,  // Object we are storing into.
@@ -723,7 +722,6 @@
   void EnterCallRuntimeFrame(intptr_t frame_space);
   void LeaveCallRuntimeFrame();
 
-
   void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
   /*
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index b663650..569d531 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -355,9 +355,9 @@
   V(LibraryPrefix_load, 1)                                                     \
   V(UserTag_new, 2)                                                            \
   V(UserTag_label, 1)                                                          \
+  V(UserTag_defaultTag, 0)                                                     \
   V(UserTag_makeCurrent, 1)                                                    \
   V(Profiler_getCurrentTag, 0)                                                 \
-  V(Profiler_clearCurrentTag, 0)                                               \
 
 
 class BootstrapNatives : public AllStatic {
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
index 1e03d79..6b76496 100644
--- a/runtime/vm/code_patcher_arm64.cc
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -98,9 +98,44 @@
 }
 
 
+// This class pattern matches on a load from the object pool.  Loading on
+// ARM64 is complicated because it can take more than one form.  We
+// match backwards from the end of the sequence so we can reuse the code for
+// matching object pool loads at calls.
+class EdgeCounter : public ValueObject {
+ public:
+  EdgeCounter(uword pc, const Code& code)
+      : end_(pc - kAdjust), object_pool_(Array::Handle(code.ObjectPool())) {
+    // An IsValid predicate is complicated and duplicates the code in the
+    // decoding function.  Instead we rely on decoding the pattern which
+    // will assert partial validity.
+  }
+
+  RawObject* edge_counter() const {
+    Register ignored;
+    intptr_t index;
+    InstructionPattern::DecodeLoadWordFromPool(end_, &ignored, &index);
+    ASSERT(ignored == R0);
+    return object_pool_.At(index);
+  }
+
+ private:
+  // The object pool load is followed by the fixed-size edge counter
+  // incrementing code:
+  //     ldr ip, [r0, #+11]
+  //     adds ip, ip, #2
+  //     str ip, [r0, #+11]
+  static const intptr_t kAdjust = 3 * Instr::kInstrSize;
+
+  uword end_;
+  const Array& object_pool_;
+};
+
+
 RawObject* CodePatcher::GetEdgeCounterAt(uword pc, const Code& code) {
-  UNIMPLEMENTED();
-  return NULL;
+  ASSERT(code.ContainsInstructionAt(pc));
+  EdgeCounter counter(pc, code);
+  return counter.edge_counter();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index a986f03..ef002bb 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -466,7 +466,8 @@
 
         if (FLAG_constant_propagation) {
           // Constant propagation can use information from range analysis to
-          // find unreachable branch targets.
+          // find unreachable branch targets and eliminate branches that have
+          // the same true- and false-target.
           ConstantPropagator::OptimizeBranches(flow_graph);
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
         }
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index aa02afe..ae55829 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -97,12 +97,11 @@
 };
 
 // Register alias for floating point scratch register.
-const VRegister VTMP0 = V30;
-const VRegister VTMP1 = V31;
+const VRegister VTMP = V31;
 
 // Architecture independent aliases.
 typedef VRegister FpuRegister;
-const FpuRegister FpuTMP = VTMP0;
+const FpuRegister FpuTMP = VTMP;
 const int kNumberOfFpuRegisters = kNumberOfVRegisters;
 const FpuRegister kNoFpuRegister = kNoVRegister;
 
@@ -143,6 +142,8 @@
     (1 << R19) | (1 << R20) | (1 << R21) | (1 << R22) |
     (1 << R23) | (1 << R24) | (1 << R25) | (1 << R26) |
     (1 << R27) | (1 << R28);
+const Register kAbiFirstPreservedCpuReg = R19;
+const Register kAbiLastPreservedCpuReg = R28;
 const int kAbiPreservedCpuRegCount = 10;
 const VRegister kAbiFirstPreservedFpuReg = V8;
 const VRegister kAbiLastPreservedFpuReg = V15;
@@ -164,9 +165,7 @@
 const Register kDartFirstVolatileCpuReg = R0;
 const Register kDartLastVolatileCpuReg = R18;
 const int kDartVolatileCpuRegCount = 17;  // Excluding R16 and R17.
-const VRegister kDartFirstVolatileFpuReg = V0;
-const VRegister kDartLastVolatileFpuReg = V7;
-const int kDartVolatileFpuRegCount = 8;
+const int kDartVolatileFpuRegCount = 24;
 
 static inline Register ConcreteRegister(Register r) {
   return ((r == ZR) || (r == SP)) ? R31 : r;
@@ -194,6 +193,11 @@
   kMaxCondition = 16,
 };
 
+static inline Condition InvertCondition(Condition c) {
+  const int32_t i = static_cast<int32_t>(c) ^ 0x1;
+  return static_cast<Condition>(i);
+}
+
 enum Bits {
   B0  =  (1 << 0), B1  =  (1 << 1), B2  =  (1 << 2), B3  =  (1 << 3),
   B4  =  (1 << 4), B5  =  (1 << 5), B6  =  (1 << 6), B7  =  (1 << 7),
@@ -259,6 +263,9 @@
 
   DPSimd2Mask = 0x1e000000,
   DPSimd2Fixed = B28 | DPSimd1Fixed,
+
+  FPMask = 0x5e000000,
+  FPFixed = B28 | B27 | B26 | B25,
 };
 
 // C3.2.1
@@ -317,13 +324,6 @@
   RET = BR | B22,
 };
 
-enum LoadStoreRegOp {
-  LoadStoreRegMask = 0x3a000000,
-  LoadStoreRegFixed = LoadStoreFixed | B29 | B28,
-  STR = LoadStoreRegFixed,
-  LDR = LoadStoreRegFixed | B22,
-};
-
 // C3.3.5
 enum LoadRegLiteralOp {
   LoadRegLiteralMask = 0x3b000000,
@@ -331,6 +331,16 @@
   LDRpc = LoadRegLiteralFixed,
 };
 
+// C3.3.7-10
+enum LoadStoreRegOp {
+  LoadStoreRegMask = 0x3a000000,
+  LoadStoreRegFixed = LoadStoreFixed | B29 | B28,
+  STR = LoadStoreRegFixed,
+  LDR = LoadStoreRegFixed | B22,
+  FSTR = STR | B26,
+  FLDR = LDR | B26,
+};
+
 // C3.4.1
 enum AddSubImmOp {
   AddSubImmMask = 0x1f000000,
@@ -379,6 +389,7 @@
   ConditionalSelectMask = 0x1fe00000,
   ConditionalSelectFixed = DPRegisterFixed | B28 | B23,
   CSEL = ConditionalSelectFixed,
+  CSINC = ConditionalSelectFixed | B10,
 };
 
 // C3.5.8
@@ -397,6 +408,8 @@
   MiscDP3SourceMask = 0x1f000000,
   MiscDP3SourceFixed = DPRegisterFixed | B28 | B24,
   MADD = MiscDP3SourceFixed,
+  MSUB = MiscDP3SourceFixed | B15,
+  SMULH = MiscDP3SourceFixed | B31 | B22,
 };
 
 // C3.5.10
@@ -413,6 +426,50 @@
   BICS = LogicalShiftFixed | B30 | B29 | B21,
 };
 
+// C.3.6.22
+enum FPCompareOp {
+  FPCompareMask = 0xffa0fc07,
+  FPCompareFixed = FPFixed | B21 | B13,
+  FCMPD = FPCompareFixed | B22,
+  FCMPZD = FPCompareFixed | B22 | B3,
+};
+
+// C3.6.25
+enum FPOneSourceOp {
+  FPOneSourceMask = 0x5f207c00,
+  FPOneSourceFixed = FPFixed | B21 | B14,
+  FMOVDD = FPOneSourceFixed | B22,
+};
+
+// C3.6.26
+enum FPTwoSourceOp {
+  FPTwoSourceMask = 0xff200c00,
+  FPTwoSourceFixed = FPFixed | B21 | B11,
+  FMULD = FPTwoSourceFixed | B22,
+  FDIVD = FPTwoSourceFixed | B22 | B12,
+  FADDD = FPTwoSourceFixed | B22 | B13,
+  FSUBD = FPTwoSourceFixed | B22 | B13 | B12,
+};
+
+// C3.6.28
+enum FPImmOp {
+  FPImmMask = 0x5f201c00,
+  FPImmFixed = FPFixed | B21 | B12,
+  FMOVSI = FPImmFixed,
+  FMOVDI = FPImmFixed | B22,
+};
+
+// C3.6.30
+enum FPIntCvtOp {
+  FPIntCvtMask = 0x5f20fc00,
+  FPIntCvtFixed = FPFixed | B21,
+  FMOVRD = FPIntCvtFixed | B31 | B22 | B18 | B17,
+  FMOVDR = FPIntCvtFixed | B31 | B22 | B18 | B17 | B16,
+  FCVTZDS = FPIntCvtFixed | B31 | B22 | B20 | B19,
+  SCVTFD = FPIntCvtFixed | B31 | B22 | B17,
+};
+
+
 #define APPLY_OP_LIST(_V)                                                      \
 _V(DPImmediate)                                                                \
 _V(CompareBranch)                                                              \
@@ -420,6 +477,7 @@
 _V(DPRegister)                                                                 \
 _V(DPSimd1)                                                                    \
 _V(DPSimd2)                                                                    \
+_V(FP)                                                                         \
 _V(CompareAndBranch)                                                           \
 _V(ConditionalBranch)                                                          \
 _V(ExceptionGen)                                                               \
@@ -438,6 +496,11 @@
 _V(MiscDP2Source)                                                              \
 _V(MiscDP3Source)                                                              \
 _V(LogicalShift)                                                               \
+_V(FPOneSource)                                                                \
+_V(FPTwoSource)                                                                \
+_V(FPImm)                                                                      \
+_V(FPIntCvt)                                                                   \
+_V(FPCompare)                                                                  \
 
 
 enum Shift {
@@ -494,11 +557,23 @@
   kRtShift = 0,
   kRtBits = 5,
 
+  // V Registers.
+  kVdShift = 0,
+  kVdBits = 5,
+  kVnShift = 5,
+  kVnBits = 5,
+  kVmShift = 16,
+  kVmBits = 5,
+  kVtShift = 0,
+  kVtBits = 5,
+
   // Immediates.
   kImm3Shift = 10,
   kImm3Bits = 3,
   kImm6Shift = 10,
   kImm6Bits = 6,
+  kImm8Shift = 13,
+  kImm8Bits = 8,
   kImm9Shift = 12,
   kImm9Bits = 9,
   kImm12Shift = 10,
@@ -655,10 +730,19 @@
   inline Register RtField() const { return static_cast<Register>(
                                         Bits(kRtShift, kRtBits)); }
 
+  inline VRegister VdField() const { return static_cast<VRegister>(
+                                        Bits(kVdShift, kVdBits)); }
+  inline VRegister VnField() const { return static_cast<VRegister>(
+                                        Bits(kVnShift, kVnBits)); }
+  inline VRegister VmField() const { return static_cast<VRegister>(
+                                        Bits(kVmShift, kVmBits)); }
+  inline VRegister VtField() const { return static_cast<VRegister>(
+                                        Bits(kVtShift, kVtBits)); }
+
   // Immediates
   inline int Imm3Field() const { return Bits(kImm3Shift, kImm3Bits); }
   inline int Imm6Field() const { return Bits(kImm6Shift, kImm6Bits); }
-
+  inline int Imm8Field() const { return Bits(kImm8Shift, kImm8Bits); }
   inline int Imm9Field() const { return Bits(kImm9Shift, kImm9Bits); }
   // Sign-extended Imm9Field()
   inline int64_t SImm9Field() const {
@@ -802,6 +886,20 @@
     return 0;
   }
 
+  static int64_t VFPExpandImm(uint8_t imm8) {
+    const int64_t sign =
+        static_cast<int64_t>((imm8 & 0x80) >> 7) << 63;
+    const int64_t hi_exp =
+        static_cast<int64_t>(!((imm8 & 0x40) >> 6)) << 62;
+    const int64_t mid_exp =
+        (((imm8 & 0x40) >> 6) == 0) ? 0 : (0xffLL << 54);
+    const int64_t low_exp =
+        static_cast<int64_t>((imm8 & 0x30) >> 4) << 52;
+    const int64_t frac =
+        static_cast<int64_t>(imm8 & 0x0f) << 48;
+    return sign | hi_exp | mid_exp | low_exp | frac;
+  }
+
   // Instructions are read out of a code stream. The only way to get a
   // reference to an instruction is to convert a pointer. There is no way
   // to allocate or create instances of class Instr.
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 5f88fbc..66e9601 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -267,6 +267,10 @@
   // Create tag table.
   isolate->set_tag_table(
       GrowableObjectArray::Handle(GrowableObjectArray::New()));
+  // Set up default UserTag.
+  const UserTag& default_tag = UserTag::Handle(UserTag::DefaultTag());
+  isolate->set_current_tag(default_tag);
+
   return Error::null();
 }
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 070d646..3fd21df 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -599,6 +599,50 @@
 }
 
 
+DART_EXPORT uint64_t Dart_IdentityHash(Dart_Handle obj) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+
+  const Object& object = Object::Handle(isolate, Api::UnwrapHandle(obj));
+  if (!object.IsInstance() && !object.IsNull()) {
+    return 0;
+  }
+
+  const Library& libcore = Library::Handle(isolate, Library::CoreLibrary());
+  const String& function_name = String::Handle(isolate,
+                                               String::New("identityHashCode"));
+  const Function& function =
+      Function::Handle(isolate,
+                       libcore.LookupFunctionAllowPrivate(function_name));
+  if (function.IsNull()) {
+    UNREACHABLE();
+    return 0;
+  }
+
+  const Array& arguments = Array::Handle(isolate, Array::New(1));
+  arguments.SetAt(0, object);
+  const Object& result =
+      Object::Handle(isolate, DartEntry::InvokeFunction(function, arguments));
+
+  if (result.IsSmi()) {
+    return Smi::Cast(result).Value();
+  }
+  if (result.IsMint()) {
+    const Mint& mint = Mint::Cast(result);
+    if (!mint.IsNegative()) {
+      return mint.AsInt64Value();
+    }
+  }
+  if (result.IsBigint()) {
+    const Bigint& bigint = Bigint::Cast(result);
+    if (BigintOperations::FitsIntoUint64(bigint)) {
+      return BigintOperations::ToUint64(bigint);
+    }
+  }
+  return 0;
+}
+
+
 DART_EXPORT Dart_Handle Dart_HandleFromPersistent(
     Dart_PersistentHandle object) {
   Isolate* isolate = Isolate::Current();
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 1ba3b9c..41f893b 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -521,20 +521,32 @@
 
 
 TEST_CASE(IdentityEquals) {
-  Dart_Handle five = NewString("5");
-  Dart_Handle five_again = NewString("5");
-  Dart_Handle seven = NewString("7");
+  Dart_Handle five = Dart_NewInteger(5);
+  Dart_Handle five_again = Dart_NewInteger(5);
+  Dart_Handle mint = Dart_NewInteger(0xFFFFFFFF);
+  Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF);
+  Dart_Handle abc = NewString("abc");
+  Dart_Handle abc_again = NewString("abc");
+  Dart_Handle xyz = NewString("abc");
   Dart_Handle dart_core = NewString("dart:core");
   Dart_Handle dart_mirrors = NewString("dart:mirrors");
 
   // Same objects.
   EXPECT(Dart_IdentityEquals(five, five));
+  EXPECT(Dart_IdentityEquals(mint, mint));
+  EXPECT(Dart_IdentityEquals(abc, abc));
+  EXPECT(Dart_IdentityEquals(xyz, xyz));
 
-  // Equal objects.
-  EXPECT(!Dart_IdentityEquals(five, five_again));
+  // Equal objects with special spec rules.
+  EXPECT(Dart_IdentityEquals(five, five_again));
+  EXPECT(Dart_IdentityEquals(mint, mint_again));
+
+  // Equal objects without special spec rules.
+  EXPECT(!Dart_IdentityEquals(abc, abc_again));
 
   // Different objects.
-  EXPECT(!Dart_IdentityEquals(five, seven));
+  EXPECT(!Dart_IdentityEquals(five, mint));
+  EXPECT(!Dart_IdentityEquals(abc, xyz));
 
   // Case where identical() is not the same as pointer equality.
   Dart_Handle nan1 = Dart_NewDouble(NAN);
@@ -559,6 +571,47 @@
 }
 
 
+TEST_CASE(IdentityHash) {
+  Dart_Handle five = Dart_NewInteger(5);
+  Dart_Handle five_again = Dart_NewInteger(5);
+  Dart_Handle mint = Dart_NewInteger(0xFFFFFFFF);
+  Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF);
+  Dart_Handle abc = NewString("abc");
+  // Dart_Handle abc_again = NewString("abc");
+  Dart_Handle xyz = NewString("abc");
+  Dart_Handle dart_core = NewString("dart:core");
+  Dart_Handle dart_mirrors = NewString("dart:mirrors");
+
+  // Same objects.
+  EXPECT_EQ(Dart_IdentityHash(five), Dart_IdentityHash(five));
+  EXPECT_EQ(Dart_IdentityHash(mint), Dart_IdentityHash(mint));
+  EXPECT_EQ(Dart_IdentityHash(abc), Dart_IdentityHash(abc));
+  EXPECT_EQ(Dart_IdentityHash(xyz), Dart_IdentityHash(xyz));
+
+  // Equal objects with special spec rules.
+  EXPECT_EQ(Dart_IdentityHash(five), Dart_IdentityHash(five_again));
+  EXPECT_EQ(Dart_IdentityHash(mint), Dart_IdentityHash(mint_again));
+
+  // Note abc and abc_again are not required to have equal identity hashes.
+
+  // Case where identical() is not the same as pointer equality.
+  Dart_Handle nan1 = Dart_NewDouble(NAN);
+  Dart_Handle nan2 = Dart_NewDouble(NAN);
+  EXPECT_EQ(Dart_IdentityHash(nan1), Dart_IdentityHash(nan2));
+
+  // Non-instance objects.
+  {
+    Isolate* isolate = Isolate::Current();
+    DARTSCOPE(isolate);
+    Dart_Handle lib1 = Dart_LookupLibrary(dart_core);
+    Dart_Handle lib2 = Dart_LookupLibrary(dart_mirrors);
+
+    EXPECT_EQ(Dart_IdentityHash(lib1), Dart_IdentityHash(lib1));
+    EXPECT_EQ(Dart_IdentityHash(lib2), Dart_IdentityHash(lib2));
+  }
+}
+
+
 TEST_CASE(ObjectEquals) {
   bool equal = false;
   Dart_Handle five = NewString("5");
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index c3ffeb8..e66f964 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -30,6 +30,8 @@
 DEFINE_FLAG(bool, verbose_debug, false, "Verbose debugger messages");
 DEFINE_FLAG(bool, trace_debugger_stacktrace, false,
             "Trace debugger stacktrace collection");
+DEFINE_FLAG(bool, show_invisible_frames, false,
+            "Show invisible frames in debugger stack traces");
 
 
 Debugger::EventHandler* Debugger::event_handler_ = NULL;
@@ -864,7 +866,7 @@
 
 
 void DebuggerStackTrace::AddActivation(ActivationFrame* frame) {
-  if (frame->function().is_visible()) {
+  if (FLAG_show_invisible_frames || frame->function().is_visible()) {
     trace_.Add(frame);
   }
 }
@@ -1543,6 +1545,11 @@
   if (best_fit_index >= 0) {
     return desc.TokenPos(best_fit_index);
   }
+  // We didn't find a safe point in the given token range. Try and find
+  // a safe point in the remaining source code of the function.
+  if (last_token_pos < func.end_token_pos()) {
+    return ResolveBreakpointPos(func, last_token_pos, func.end_token_pos());
+  }
   return -1;
 }
 
diff --git a/runtime/vm/disassembler_arm64.cc b/runtime/vm/disassembler_arm64.cc
index b9e0490..55cc0fd 100644
--- a/runtime/vm/disassembler_arm64.cc
+++ b/runtime/vm/disassembler_arm64.cc
@@ -31,6 +31,7 @@
 
   // Printing of common values.
   void PrintRegister(int reg, R31Type r31t);
+  void PrintVRegister(int reg);
   void PrintShiftExtendRm(Instr* instr);
   void PrintMemOperand(Instr* instr);
   void PrintS(Instr* instr);
@@ -38,6 +39,7 @@
 
   // Handle formatting of instructions and their options.
   int FormatRegister(Instr* instr, const char* option);
+  int FormatVRegister(Instr*instr, const char* option);
   int FormatOption(Instr* instr, const char* format);
   void Format(Instr* instr, const char* format);
   void Unknown(Instr* instr);
@@ -103,6 +105,15 @@
 }
 
 
+void ARM64Decoder::PrintVRegister(int reg) {
+  ASSERT(0 <= reg);
+  ASSERT(reg < kNumberOfVRegisters);
+  buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                             remaining_size_in_buffer(),
+                             "v%d", reg);
+}
+
+
 // These shift names are defined in a way to match the native disassembler
 // formatting. See for example the command "objdump -d <binary file>".
 static const char* shift_names[kMaxShift] = {
@@ -291,6 +302,30 @@
 }
 
 
+int ARM64Decoder::FormatVRegister(Instr* instr, const char* format) {
+  ASSERT(format[0] == 'v');
+  if (format[1] == 'd') {
+    int reg = instr->VdField();
+    PrintVRegister(reg);
+    return 2;
+  } else if (format[1] == 'n') {
+    int reg = instr->VnField();
+    PrintVRegister(reg);
+    return 2;
+  } else if (format[1] == 'm') {
+    int reg = instr->VmField();
+    PrintVRegister(reg);
+    return 2;
+  } else if (format[1] == 't') {
+    int reg = instr->VtField();
+    PrintVRegister(reg);
+    return 2;
+  }
+  UNREACHABLE();
+  return -1;
+}
+
+
 // FormatOption takes a formatting string and interprets it based on
 // the current instructions. The format string points to the first
 // character of the option string (the option escape has already been
@@ -363,30 +398,41 @@
       }
       return 2;
     }
-    case 'i': {  // 'imm12, imm16
-      uint64_t imm;
-      int ret = 5;
-      if (format[4] == '2') {
-        ASSERT(STRING_STARTS_WITH(format, "imm12"));
-        imm = instr->Imm12Field();
-        if (format[5] == 's') {
-          // shifted immediate.
-          if (instr->Imm12ShiftField() == 1) {
-            imm = imm << 12;
-          } else if ((instr->Imm12ShiftField() & 0x2) != 0) {
-            Print("Unknown Shift");
+    case 'i': {  // 'imm12, 'imm16, 'immd
+      if (format[3] == '1') {
+        uint64_t imm;
+        int ret = 5;
+        if (format[4] == '2') {
+          ASSERT(STRING_STARTS_WITH(format, "imm12"));
+          imm = instr->Imm12Field();
+          if (format[5] == 's') {
+            // shifted immediate.
+            if (instr->Imm12ShiftField() == 1) {
+              imm = imm << 12;
+            } else if ((instr->Imm12ShiftField() & 0x2) != 0) {
+              Print("Unknown Shift");
+            }
+            ret = 6;
           }
-          ret = 6;
+        } else {
+          ASSERT(STRING_STARTS_WITH(format, "imm16"));
+          imm = instr->Imm16Field();
         }
+        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                   remaining_size_in_buffer(),
+                                   "0x%"Px64,
+                                   imm);
+        return ret;
       } else {
-        ASSERT(STRING_STARTS_WITH(format, "imm16"));
-        imm = instr->Imm16Field();
+        ASSERT(STRING_STARTS_WITH(format, "immd"));
+        double dimm = bit_cast<double, int64_t>(
+            Instr::VFPExpandImm(instr->Imm8Field()));
+        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                   remaining_size_in_buffer(),
+                                   "%f",
+                                   dimm);
+        return 4;
       }
-      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
-                                 remaining_size_in_buffer(),
-                                 "0x%"Px64,
-                                 imm);
-      return ret;
     }
     case 'm': {
       ASSERT(STRING_STARTS_WITH(format, "memop"));
@@ -420,6 +466,9 @@
     case 'r': {
       return FormatRegister(instr, format);
     }
+    case 'v': {
+      return FormatVRegister(instr, format);
+    }
     case 's': {  // 's: S flag.
       if (format[1] == 'h') {
         ASSERT(STRING_STARTS_WITH(format, "shift_op"));
@@ -513,14 +562,28 @@
 
 
 void ARM64Decoder::DecodeLoadStoreReg(Instr* instr) {
-  if (instr->Bits(25, 2) != 0) {
+  if (instr->Bit(23) != 0) {
+    // 128-bit ldr/str.
     Unknown(instr);
-    return;
   }
-  if (instr->Bit(22) == 1) {
-    Format(instr, "ldr'sz 'rt, 'memop");
+  if (instr->Bit(26) == 1) {
+    if (instr->Bits(30, 2) != 3) {
+      // Only 64-bit double variant supported.
+      Unknown(instr);
+    }
+    // SIMD or FP src/dst.
+    if (instr->Bit(22) == 1) {
+      Format(instr, "fldrd 'vt, 'memop");
+    } else {
+      Format(instr, "fstrd 'vt, 'memop");
+    }
   } else {
-    Format(instr, "str'sz 'rt, 'memop");
+    // Integer src/dst.
+    if (instr->Bit(22) == 1) {
+      Format(instr, "ldr'sz 'rt, 'memop");
+    } else {
+      Format(instr, "str'sz 'rt, 'memop");
+    }
   }
 }
 
@@ -554,7 +617,7 @@
       break;
     }
     case 1: {
-      if ((instr->RdField() == R31) && (instr->SFField())) {
+      if ((instr->RdField() == R31) && (instr->SField() == 1)) {
         Format(instr, "cmpi'sf 'rn, 'imm12s");
       } else {
         Format(instr, "subi'sf's 'rd, 'rn, 'imm12s");
@@ -842,6 +905,12 @@
     } else {
       Format(instr, "madd'sf 'rd, 'rn, 'rm, 'ra");
     }
+  } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 0) &&
+             (instr->Bit(15) == 1)) {
+    Format(instr, "msub'sf 'rd, 'rn, 'rm, 'ra");
+  } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 2) &&
+             (instr->Bit(15) == 0)) {
+    Format(instr, "smulh 'rd, 'rn, 'rm");
   } else {
     Unknown(instr);
   }
@@ -851,6 +920,8 @@
 void ARM64Decoder::DecodeConditionalSelect(Instr* instr) {
   if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 0)) {
     Format(instr, "mov'sf'cond 'rd, 'rn, 'rm");
+  } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 1)) {
+    Format(instr, "csinc'sf'cond 'rd, 'rn, 'rm");
   } else {
     Unknown(instr);
   }
@@ -879,8 +950,121 @@
 }
 
 
+void ARM64Decoder::DecodeFPImm(Instr* instr) {
+  if ((instr->Bit(31) != 0) || (instr->Bit(29) != 0) || (instr->Bit(23) != 0) ||
+      (instr->Bits(5, 5) != 0)) {
+    Unknown(instr);
+    return;
+  }
+  if (instr->Bit(22) == 1) {
+    // Double.
+    Format(instr, "fmovd 'vd, 'immd");
+  } else {
+    // Single.
+    Unknown(instr);
+  }
+}
+
+
+void ARM64Decoder::DecodeFPIntCvt(Instr* instr) {
+  if ((instr->SFField() != 1) || (instr->Bit(29) != 0) ||
+      (instr->Bits(22, 2) != 1)) {
+    Unknown(instr);
+    return;
+  }
+  if (instr->Bits(16, 5) == 2) {
+    Format(instr, "scvtfd 'vd, 'vn");
+  } else if (instr->Bits(16, 5) == 6) {
+    Format(instr, "fmovrd 'rd, 'vn");
+  } else if (instr->Bits(16, 5) == 7) {
+    Format(instr, "fmovdr 'vd, 'rn");
+  } else if (instr->Bits(16, 5) == 24) {
+    Format(instr, "fcvtzds 'rd, 'vn");
+  } else {
+    Unknown(instr);
+  }
+}
+
+
+void ARM64Decoder::DecodeFPOneSource(Instr* instr) {
+  const int opc = instr->Bits(15, 2);
+
+  switch (opc) {
+    case 0:
+      Format(instr, "fmovdd 'vd, 'vn");
+      break;
+    default:
+      Unknown(instr);
+      break;
+  }
+}
+
+
+void ARM64Decoder::DecodeFPTwoSource(Instr* instr) {
+  if (instr->Bits(22, 2) != 1) {
+    Unknown(instr);
+    return;
+  }
+  const int opc = instr->Bits(12, 4);
+
+  switch (opc) {
+    case 0:
+      Format(instr, "fmuld 'vd, 'vn, 'vm");
+      break;
+    case 1:
+      Format(instr, "fdivd 'vd, 'vn, 'vm");
+      break;
+    case 2:
+      Format(instr, "faddd 'vd, 'vn, 'vm");
+      break;
+    case 3:
+      Format(instr, "fsubd 'vd, 'vn, 'vm");
+      break;
+    default:
+      Unknown(instr);
+      break;
+  }
+}
+
+
+void ARM64Decoder::DecodeFPCompare(Instr* instr) {
+  if ((instr->Bit(22) == 1) && (instr->Bits(3, 2) == 0)) {
+    Format(instr, "fcmpd 'vn, 'vm");
+  } else if ((instr->Bit(22) == 1) && (instr->Bits(3, 2) == 1)) {
+    if (instr->VmField() == V0) {
+      Format(instr, "fcmpd 'vn, #0.0");
+    } else {
+      Unknown(instr);
+    }
+  } else {
+    Unknown(instr);
+  }
+}
+
+
+void ARM64Decoder::DecodeFP(Instr* instr) {
+  if (instr->IsFPImmOp()) {
+    DecodeFPImm(instr);
+  } else if (instr->IsFPIntCvtOp()) {
+    DecodeFPIntCvt(instr);
+  } else if (instr->IsFPOneSourceOp()) {
+    DecodeFPOneSource(instr);
+  } else if (instr->IsFPTwoSourceOp()) {
+    DecodeFPTwoSource(instr);
+  } else if (instr->IsFPCompareOp()) {
+    DecodeFPCompare(instr);
+  } else {
+    Unknown(instr);
+  }
+}
+
+
 void ARM64Decoder::DecodeDPSimd2(Instr* instr) {
-  Unknown(instr);
+  if (instr->IsFPOp()) {
+    DecodeFP(instr);
+  } else {
+    Unknown(instr);
+  }
 }
 
 
diff --git a/runtime/vm/disassembler_ia32.cc b/runtime/vm/disassembler_ia32.cc
index 3651210..cb845d7 100644
--- a/runtime/vm/disassembler_ia32.cc
+++ b/runtime/vm/disassembler_ia32.cc
@@ -526,7 +526,7 @@
       // Print only if jumping to entry point.
       const Code& code = Code::Handle(Code::LookupCode(addr));
       if (!code.IsNull() && (code.EntryPoint() == addr)) {
-        const String& name = String::Handle(code.UserName());
+        const String& name = String::Handle(code.PrettyName());
         const char* name_c = name.ToCString();
         Print(" [");
         Print(name_c);
@@ -1360,7 +1360,7 @@
           Print(" ");
           PrintXmmRegister(regop);
           Print(",");
-          data += PrintRightOperand(data);
+          data += PrintRightXmmOperand(data);
         } else if (f0byte == 0xB1) {
           data += 2;
           data += PrintOperands(f0mnem, OPER_REG_OP_ORDER, data);
diff --git a/runtime/vm/disassembler_x64.cc b/runtime/vm/disassembler_x64.cc
index 3c751e5..f9cd609 100644
--- a/runtime/vm/disassembler_x64.cc
+++ b/runtime/vm/disassembler_x64.cc
@@ -838,7 +838,7 @@
       // Print only if jumping to entry point.
       const Code& code = Code::Handle(Code::LookupCode(addr));
       if (!code.IsNull() && (code.EntryPoint() == addr)) {
-        const String& name = String::Handle(code.UserName());
+        const String& name = String::Handle(code.PrettyName());
         const char* name_c = name.ToCString();
         AppendToBuffer(" [%s]", name_c);
       }
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index db6d1e0..1359ea7 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -230,12 +230,6 @@
     kill_[graph_entry_->postorder_number()]->Add(vreg);
     live_in_[graph_entry_->postorder_number()]->Remove(vreg);
   }
-
-  // Update initial live_in sets to match live_out sets. Has to be
-  // done in a separate path because of backwards branches.
-  for (intptr_t i = 0; i < block_count; i++) {
-    UpdateLiveIn(*postorder_[i]);
-  }
 }
 
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 9315c22..8d937f2 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -18,6 +18,7 @@
 #include "vm/isolate.h"
 #include "vm/longjump.h"
 #include "vm/object.h"
+#include "vm/object_store.h"
 #include "vm/os.h"
 #include "vm/parser.h"
 #include "vm/resolver.h"
@@ -39,6 +40,27 @@
 DECLARE_FLAG(bool, enable_type_checks);
 
 
+// TODO(srdjan): Allow compiler to add constants as they are encountered in
+// the compilation.
+const double kCommonDoubleConstants[] =
+    {-1.0, -0.5, -0.1, 0.0, 0.1, 0.5, 1.0, 2.0, 4.0, 5.0,
+     10.0, 20.0, 30.0, 64.0, 255.0, NAN,
+     // From dart:math
+     2.718281828459045, 2.302585092994046, 0.6931471805599453,
+     1.4426950408889634, 0.4342944819032518, 3.1415926535897932,
+     0.7071067811865476, 1.4142135623730951};
+
+uword FlowGraphBuilder::FindDoubleConstant(double value) {
+  intptr_t len = sizeof(kCommonDoubleConstants) / sizeof(double);  // NOLINT
+  for (intptr_t i = 0; i < len; i++) {
+    if (Utils::DoublesBitEqual(value, kCommonDoubleConstants[i])) {
+      return reinterpret_cast<uword>(&kCommonDoubleConstants[i]);
+    }
+  }
+  return 0;
+}
+
+
 // Base class for a stack of enclosing statements of interest (e.g.,
 // blocks (breakable) and loops (continuable)).
 class NestedStatement : public ValueObject {
@@ -1296,7 +1318,7 @@
   // Since called only when type tested against is not instantiated.
   ASSERT(instantiator_class.NumTypeParameters() > 0);
   Value* instantiator_type_arguments = NULL;
-  Value* instantiator = BuildInstantiator();
+  Value* instantiator = BuildInstantiator(instantiator_class);
   if (instantiator == NULL) {
     // No instantiator when inside factory.
     *push_instantiator_result = PushArgument(BuildNullValue());
@@ -1325,7 +1347,7 @@
       owner()->parsed_function()->function().Owner());
   // Since called only when type tested against is not instantiated.
   ASSERT(instantiator_class.NumTypeParameters() > 0);
-  instantiator = BuildInstantiator();
+  instantiator = BuildInstantiator(instantiator_class);
   if (instantiator == NULL) {
     // No instantiator when inside factory.
     instantiator = BuildNullValue();
@@ -2561,12 +2583,8 @@
 }
 
 
-Value* EffectGraphVisitor::BuildInstantiator() {
-  const Class& instantiator_class = Class::Handle(
-      owner()->parsed_function()->function().Owner());
-  if (instantiator_class.NumTypeParameters() == 0) {
-    return NULL;
-  }
+Value* EffectGraphVisitor::BuildInstantiator(const Class& instantiator_class) {
+  ASSERT(instantiator_class.NumTypeParameters() > 0);
   Function& outer_function =
       Function::Handle(owner()->parsed_function()->function().raw());
   while (outer_function.IsLocalFunction()) {
@@ -2576,11 +2594,10 @@
     return NULL;
   }
 
-  ASSERT(owner()->parsed_function()->instantiator() != NULL);
-  ValueGraphVisitor for_instantiator(owner());
-  owner()->parsed_function()->instantiator()->Visit(&for_instantiator);
-  Append(for_instantiator);
-  return for_instantiator.value();
+  LocalVariable* instantiator = owner()->parsed_function()->instantiator();
+  ASSERT(instantiator != NULL);
+  Value* result = Bind(BuildLoadLocal(*instantiator));
+  return result;
 }
 
 
@@ -2611,14 +2628,13 @@
   if (outer_function.IsFactory()) {
     // No instantiator for factories.
     ASSERT(instantiator == NULL);
-    ASSERT(owner()->parsed_function()->instantiator() != NULL);
-    ValueGraphVisitor for_instantiator(owner());
-    owner()->parsed_function()->instantiator()->Visit(&for_instantiator);
-    Append(for_instantiator);
-    return for_instantiator.value();
+    LocalVariable* instantiator_var =
+        owner()->parsed_function()->instantiator();
+    ASSERT(instantiator_var != NULL);
+    return Bind(BuildLoadLocal(*instantiator_var));
   }
   if (instantiator == NULL) {
-    instantiator = BuildInstantiator();
+    instantiator = BuildInstantiator(instantiator_class);
   }
   // The instantiator is the receiver of the caller, which is not a factory.
   // The receiver cannot be null; extract its TypeArguments object.
@@ -3464,6 +3480,16 @@
         }
       }
     }
+  } else if (MustSaveRestoreContext(node)) {
+    // Even when the current scope has no context variables, we may
+    // still need to save the current context if, for example, there
+    // are loop scopes below this which will allocate a context
+    // object.
+    BuildSaveContext(
+        *owner()->parsed_function()->saved_entry_context_var());
+    AddInstruction(
+        new StoreContextInstr(Bind(new ConstantInstr(Object::ZoneHandle(
+            Isolate::Current()->object_store()->empty_context())))));
   }
 
   // This check may be deleted if the generated code is leaf.
@@ -3531,7 +3557,6 @@
 
   if (is_open()) {
     if (MustSaveRestoreContext(node)) {
-      ASSERT(num_context_variables > 0);
       BuildRestoreContext(
           *owner()->parsed_function()->saved_entry_context_var());
     } else if (num_context_variables > 0) {
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 81d2c77..3ec5db9 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -207,6 +207,9 @@
   // OSR entry point.
   void PruneUnreachable();
 
+  // Returns address where the constant 'value' is stored or 0 if not found.
+  static uword FindDoubleConstant(double value);
+
  private:
   friend class NestedStatement;  // Explicit access to nesting_stack_.
 
@@ -346,7 +349,7 @@
   void BuildTypecheckArguments(intptr_t token_pos,
                                Value** instantiator,
                                Value** instantiator_type_arguments);
-  Value* BuildInstantiator();
+  Value* BuildInstantiator(const Class& instantiator_class);
   Value* BuildInstantiatorTypeArguments(intptr_t token_pos,
                                         const Class& instantiator_class,
                                         Value* instantiator);
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 0893ee7..4b90de5 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -308,8 +308,9 @@
     // Compile all successors until an exit, branch, or a block entry.
     for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
       Instruction* instr = it.Current();
-      if (FLAG_code_comments &&
-          (FLAG_disassemble || FLAG_disassemble_optimized)) {
+      if (FLAG_code_comments ||
+          FLAG_disassemble ||
+          FLAG_disassemble_optimized) {
         if (FLAG_source_lines) {
           EmitSourceLine(instr);
         }
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 92fa0ef..699ef8b 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -58,7 +58,9 @@
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
-  if (deopt_env_ == NULL) return DeoptInfo::null();
+  if (deopt_env_ == NULL) {
+    return DeoptInfo::null();
+  }
 
   intptr_t stack_height = compiler->StackSize();
   AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
@@ -160,7 +162,9 @@
 #define __ assem->
   __ Comment("Deopt stub for id %" Pd "", deopt_id());
   __ Bind(entry_label());
-  if (FLAG_trap_on_deoptimization) __ bkpt(0);
+  if (FLAG_trap_on_deoptimization) {
+    __ bkpt(0);
+  }
 
   ASSERT(deopt_env() != NULL);
 
@@ -1608,7 +1612,7 @@
   } else if (source.IsDoubleStackSlot()) {
     if (destination.IsFpuRegister()) {
       const intptr_t dest_offset = source.ToStackSlotOffset();
-      DRegister dst = EvenDRegisterOf(destination.fpu_reg());
+      const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
       __ LoadDFromOffset(dst, FP, dest_offset);
     } else {
       ASSERT(destination.IsDoubleStackSlot());
@@ -1632,13 +1636,24 @@
     }
   } else {
     ASSERT(source.IsConstant());
+    const Object& constant = source.constant();
     if (destination.IsRegister()) {
-      const Object& constant = source.constant();
       __ LoadObject(destination.reg(), constant);
+    } else if (destination.IsFpuRegister()) {
+      const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
+      __ LoadObject(TMP, constant);
+      __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag);
+      __ vldrd(dst, Address(TMP, 0));
+    } else if (destination.IsDoubleStackSlot()) {
+      const intptr_t dest_offset = destination.ToStackSlotOffset();
+      __ LoadObject(TMP, constant);
+      __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag);
+      __ vldrd(DTMP, Address(TMP, 0));
+      __ StoreDToOffset(DTMP, FP, dest_offset);
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ LoadObject(TMP, source.constant());
+      __ LoadObject(TMP, constant);
       __ StoreToOffset(kWord, TMP, FP, dest_offset);
     }
   }
@@ -1665,7 +1680,7 @@
   } else if (source.IsStackSlot() && destination.IsStackSlot()) {
     Exchange(source.ToStackSlotOffset(), destination.ToStackSlotOffset());
   } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
-    DRegister dst = EvenDRegisterOf(destination.fpu_reg());
+    const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
     DRegister src = EvenDRegisterOf(source.fpu_reg());
     __ vmovd(DTMP, src);
     __ vmovd(src, dst);
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index aa0db93..b33b5fb 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -22,6 +22,7 @@
 
 namespace dart {
 
+DEFINE_FLAG(bool, trap_on_deoptimization, false, "Trap on deoptimization.");
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(int, reoptimization_counter_threshold);
 DECLARE_FLAG(bool, eliminate_type_checks);
@@ -53,14 +54,114 @@
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
-  UNIMPLEMENTED();
-  return NULL;
+  if (deopt_env_ == NULL) {
+    return DeoptInfo::null();
+  }
+
+  intptr_t stack_height = compiler->StackSize();
+  AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
+
+  intptr_t slot_ix = 0;
+  Environment* current = deopt_env_;
+
+  // Emit all kMaterializeObject instructions describing objects to be
+  // materialized on the deoptimization as a prefix to the deoptimization info.
+  EmitMaterializations(deopt_env_, builder);
+
+  // The real frame starts here.
+  builder->MarkFrameStart();
+
+  // Current PP, FP, and PC.
+  builder->AddPp(current->code(), slot_ix++);
+  builder->AddPcMarker(Code::Handle(), slot_ix++);
+  builder->AddCallerFp(slot_ix++);
+  builder->AddReturnAddress(current->code(), deopt_id(), slot_ix++);
+
+  // Emit all values that are needed for materialization as a part of the
+  // expression stack for the bottom-most frame. This guarantees that GC
+  // will be able to find them during materialization.
+  slot_ix = builder->EmitMaterializationArguments(slot_ix);
+
+  // For the innermost environment, set outgoing arguments and the locals.
+  for (intptr_t i = current->Length() - 1;
+       i >= current->fixed_parameter_count();
+       i--) {
+    builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
+  }
+
+  Environment* previous = current;
+  current = current->outer();
+  while (current != NULL) {
+    // PP, FP, and PC.
+    builder->AddPp(current->code(), slot_ix++);
+    builder->AddPcMarker(previous->code(), slot_ix++);
+    builder->AddCallerFp(slot_ix++);
+
+    // For any outer environment the deopt id is that of the call instruction
+    // which is recorded in the outer environment.
+    builder->AddReturnAddress(current->code(),
+                              Isolate::ToDeoptAfter(current->deopt_id()),
+                              slot_ix++);
+
+    // The values of outgoing arguments can be changed from the inlined call so
+    // we must read them from the previous environment.
+    for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
+      builder->AddCopy(previous->ValueAt(i),
+                       previous->LocationAt(i),
+                       slot_ix++);
+    }
+
+    // Set the locals, note that outgoing arguments are not in the environment.
+    for (intptr_t i = current->Length() - 1;
+         i >= current->fixed_parameter_count();
+         i--) {
+      builder->AddCopy(current->ValueAt(i),
+                       current->LocationAt(i),
+                       slot_ix++);
+    }
+
+    // Iterate on the outer environment.
+    previous = current;
+    current = current->outer();
+  }
+  // The previous pointer is now the outermost environment.
+  ASSERT(previous != NULL);
+
+  // For the outermost environment, set caller PC, caller PP, and caller FP.
+  builder->AddCallerPp(slot_ix++);
+  // PC marker.
+  builder->AddPcMarker(previous->code(), slot_ix++);
+  builder->AddCallerFp(slot_ix++);
+  builder->AddCallerPc(slot_ix++);
+
+  // For the outermost environment, set the incoming arguments.
+  for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
+    builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
+  }
+
+  const DeoptInfo& deopt_info =
+      DeoptInfo::Handle(builder->CreateDeoptInfo(deopt_table));
+  return deopt_info.raw();
 }
 
 
 void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
                                              intptr_t stub_ix) {
-  UNIMPLEMENTED();
+  // Calls do not need stubs, they share a deoptimization trampoline.
+  ASSERT(reason() != ICData::kDeoptAtCall);
+  Assembler* assem = compiler->assembler();
+#define __ assem->
+  __ Comment("Deopt stub for id %" Pd "", deopt_id());
+  __ Bind(entry_label());
+  if (FLAG_trap_on_deoptimization) {
+    __ hlt(0);
+  }
+
+  ASSERT(deopt_env() != NULL);
+
+  __ BranchLink(&StubCode::DeoptimizeLabel(), PP);
+  set_pc_offset(assem->CodeSize());
+#undef __
 }
 
 
@@ -432,12 +533,87 @@
 }
 
 
+// If instanceof type test cannot be performed successfully at compile time and
+// therefore eliminated, optimize it by adding inlined tests for:
+// - NULL -> return false.
+// - Smi -> compile time subtype check (only if dst class is not parameterized).
+// - Class equality (only if class is not parameterized).
+// Inputs:
+// - R0: object.
+// - R1: instantiator type arguments or raw_null.
+// - R2: instantiator or raw_null.
+// Returns:
+// - true or false in R0.
 void FlowGraphCompiler::GenerateInstanceOf(intptr_t token_pos,
                                            intptr_t deopt_id,
                                            const AbstractType& type,
                                            bool negate_result,
                                            LocationSummary* locs) {
-  UNIMPLEMENTED();
+  ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
+
+  // Preserve instantiator (R2) and its type arguments (R1).
+  __ Push(R2);
+  __ Push(R1);
+
+  Label is_instance, is_not_instance;
+  // If type is instantiated and non-parameterized, we can inline code
+  // checking whether the tested instance is a Smi.
+  if (type.IsInstantiated()) {
+    // A null object is only an instance of Object and dynamic, which has
+    // already been checked above (if the type is instantiated). So we can
+    // return false here if the instance is null (and if the type is
+    // instantiated).
+    // We can only inline this null check if the type is instantiated at compile
+    // time, since an uninstantiated type at compile time could be Object or
+    // dynamic at run time.
+    __ CompareObject(R0, Object::null_object(), PP);
+    __ b(&is_not_instance, EQ);
+  }
+
+  // Generate inline instanceof test.
+  SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle();
+  test_cache = GenerateInlineInstanceof(token_pos, type,
+                                        &is_instance, &is_not_instance);
+
+  // test_cache is null if there is no fall-through.
+  Label done;
+  if (!test_cache.IsNull()) {
+    // Generate runtime call.
+    // Load instantiator (R2) and its type arguments (R1).
+    __ ldr(R1, Address(SP, 0 * kWordSize));
+    __ ldr(R2, Address(SP, 1 * kWordSize));
+    __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+    __ Push(R0);  // Push the instance.
+    __ PushObject(type, PP);  // Push the type.
+    // Push instantiator (R2) and its type arguments (R1).
+    __ Push(R2);
+    __ Push(R1);
+    __ LoadObject(R0, test_cache, PP);
+    __ Push(R0);
+    GenerateRuntimeCall(token_pos, deopt_id, kInstanceofRuntimeEntry, 5, locs);
+    // Pop the parameters supplied to the runtime entry. The result of the
+    // instanceof runtime call will be left as the result of the operation.
+    __ Drop(5);
+    if (negate_result) {
+      __ Pop(R1);
+      __ LoadObject(R0, Bool::True(), PP);
+      __ CompareRegisters(R1, R0);
+      __ b(&done, NE);
+      __ LoadObject(R0, Bool::False(), PP);
+    } else {
+      __ Pop(R0);
+    }
+    __ b(&done);
+  }
+  __ Bind(&is_not_instance);
+  __ LoadObject(R0, Bool::Get(negate_result), PP);
+  __ b(&done);
+
+  __ Bind(&is_instance);
+  __ LoadObject(R0, Bool::Get(!negate_result), PP);
+  __ Bind(&done);
+  // Remove instantiator (R2) and its type arguments (R1).
+  __ Drop(2);
 }
 
 
@@ -726,7 +902,7 @@
                     Isolate::kNoDeoptId, kNumArgsChecked));
     __ LoadObject(R5, ic_data, PP);
     __ LeaveDartFrame();  // The arguments are still on the stack.
-    __ Branch(&StubCode::CallNoSuchMethodFunctionLabel(), PP);
+    __ BranchFixed(&StubCode::CallNoSuchMethodFunctionLabel());
     // The noSuchMethod call may return to the caller, but not here.
     __ hlt(0);
   } else if (check_correct_named_args) {
@@ -757,12 +933,27 @@
 
 
 void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
-  UNIMPLEMENTED();
+  // LR: return address.
+  // SP: receiver.
+  // Sequence node has one return node, its input is load field node.
+  __ Comment("Inlined Getter");
+  __ LoadFromOffset(R0, SP, 0 * kWordSize);
+  __ LoadFromOffset(R0, R0, offset - kHeapObjectTag);
+  __ ret();
 }
 
 
 void FlowGraphCompiler::GenerateInlinedSetter(intptr_t offset) {
-  UNIMPLEMENTED();
+  // LR: return address.
+  // SP+1: receiver.
+  // SP+0: value.
+  // Sequence node has one store node and one return NULL node.
+  __ Comment("Inlined Setter");
+  __ LoadFromOffset(R0, SP, 1 * kWordSize);  // Receiver.
+  __ LoadFromOffset(R1, SP, 0 * kWordSize);  // Value.
+  __ StoreIntoObject(R0, FieldAddress(R0, offset), R1);
+  __ LoadObject(R0, Object::null_object(), PP);
+  __ ret();
 }
 
 
@@ -806,6 +997,7 @@
     // may be patched at the AddCurrentDescriptor below.
     new_pp = R13;
 
+    // Set up pool pointer in new_pp.
     __ LoadPoolPointer(new_pp);
 
     AddCurrentDescriptor(PcDescriptors::kEntryPatch,
@@ -883,7 +1075,7 @@
                         Isolate::kNoDeoptId, kNumArgsChecked));
         __ LoadObject(R5, ic_data, PP);
         __ LeaveDartFrame();  // The arguments are still on the stack.
-        __ Branch(&StubCode::CallNoSuchMethodFunctionLabel(), PP);
+        __ BranchFixed(&StubCode::CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
         __ hlt(0);
       } else {
@@ -916,9 +1108,7 @@
   AddCurrentDescriptor(PcDescriptors::kPatchCode,
                        Isolate::kNoDeoptId,
                        0);  // No token position.
-  // This is patched up to a point in FrameEntry where the PP for the
-  // current function is in R13 instead of PP.
-  __ BranchPatchable(&StubCode::FixCallersTargetLabel(), R13);
+  __ BranchFixed(&StubCode::FixCallersTargetLabel());
 
   AddCurrentDescriptor(PcDescriptors::kLazyDeoptJump,
                        Isolate::kNoDeoptId,
@@ -1006,7 +1196,22 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
-  UNIMPLEMENTED();
+  ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
+  // Each ICData propagated from unoptimized to optimized code contains the
+  // function that corresponds to the Dart function of that IC call. Due
+  // to inlining in optimized code, that function may not correspond to the
+  // top-level function (parsed_function().function()) which could be
+  // reoptimized and which counter needs to be incremented.
+  // Pass the function explicitly, it is used in IC stub.
+
+  __ LoadObject(R6, parsed_function().function(), PP);
+  __ LoadObject(R5, ic_data, PP);
+  GenerateDartCall(deopt_id,
+                   token_pos,
+                   target_label,
+                   PcDescriptors::kIcCall,
+                   locs);
+  __ Drop(argument_count);
 }
 
 
@@ -1033,7 +1238,68 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
-  UNIMPLEMENTED();
+  MegamorphicCacheTable* table = Isolate::Current()->megamorphic_cache_table();
+  const String& name = String::Handle(ic_data.target_name());
+  const Array& arguments_descriptor =
+      Array::ZoneHandle(ic_data.arguments_descriptor());
+  ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
+  const MegamorphicCache& cache =
+      MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
+  Label not_smi, load_cache;
+  __ LoadFromOffset(R0, SP, (argument_count - 1) * kWordSize);
+  __ tsti(R0, kSmiTagMask);
+  __ b(&not_smi, NE);
+  __ LoadImmediate(R0, Smi::RawValue(kSmiCid), PP);
+  __ b(&load_cache);
+
+  __ Bind(&not_smi);
+  __ LoadClassId(R0, R0);
+  __ SmiTag(R0);
+
+  // R0: class ID of the receiver (smi).
+  __ Bind(&load_cache);
+  __ LoadObject(R1, cache, PP);
+  __ LoadFieldFromOffset(R2, R1, MegamorphicCache::buckets_offset());
+  __ LoadFieldFromOffset(R1, R1, MegamorphicCache::mask_offset());
+  // R2: cache buckets array.
+  // R1: mask.
+  __ mov(R3, R0);
+
+  Label loop, update, call_target_function;
+  __ b(&loop);
+
+  __ Bind(&update);
+  __ add(R3, R3, Operand(Smi::RawValue(1)));
+  __ Bind(&loop);
+  __ and_(R3, R3, Operand(R1));
+  const intptr_t base = Array::data_offset();
+  // R3 is smi tagged, but table entries are 8 bytes, so LSL 2.
+  __ add(TMP, R2, Operand(R3, LSL, 2));
+  __ LoadFieldFromOffset(R4, TMP, base);
+
+  ASSERT(kIllegalCid == 0);
+  __ tst(R4, Operand(R4));
+  __ b(&call_target_function, EQ);
+  __ CompareRegisters(R4, R0);
+  __ b(&update, NE);
+
+  __ Bind(&call_target_function);
+  // Call the target found in the cache.  For a class id match, this is a
+  // proper target for the given name and arguments descriptor.  If the
+  // illegal class id was found, the target is a cache miss handler that can
+  // be invoked as a normal Dart function.
+  __ add(TMP, R2, Operand(R3, LSL, 2));
+  __ LoadFieldFromOffset(R0, TMP, base + kWordSize);
+  __ LoadFieldFromOffset(R1, R0, Function::code_offset());
+  __ LoadFieldFromOffset(R1, R1, Code::instructions_offset());
+  __ LoadObject(R5, ic_data, PP);
+  __ LoadObject(R4, arguments_descriptor, PP);
+  __ AddImmediate(R1, R1, Instructions::HeaderSize() - kHeapObjectTag, PP);
+  __ blr(R1);
+  AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
+  RecordSafepoint(locs);
+  AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
+  __ Drop(argument_count);
 }
 
 
@@ -1085,7 +1351,16 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
-  UNIMPLEMENTED();
+  __ LoadObject(R4, arguments_descriptor, PP);
+  // 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.
+  GenerateDartCall(deopt_id,
+                   token_pos,
+                   &StubCode::CallStaticFunctionLabel(),
+                   PcDescriptors::kOptStaticCall,
+                   locs);
+  AddStaticCallTarget(function);
+  __ Drop(argument_count);
 }
 
 
@@ -1093,7 +1368,28 @@
                                                     const Object& obj,
                                                     bool needs_number_check,
                                                     intptr_t token_pos) {
-  UNIMPLEMENTED();
+  if (needs_number_check) {
+    ASSERT(!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint());
+    __ Push(reg);
+    __ PushObject(obj, PP);
+    if (is_optimizing()) {
+      __ BranchLinkPatchable(
+          &StubCode::OptimizedIdenticalWithNumberCheckLabel());
+    } else {
+      __ BranchLinkPatchable(
+          &StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+    }
+    if (token_pos != Scanner::kNoSourcePos) {
+      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+                           Isolate::kNoDeoptId,
+                           token_pos);
+    }
+    __ Drop(1);  // Discard constant.
+    __ Pop(reg);  // Restore 'reg'.
+    return;
+  }
+
+  __ CompareObject(reg, obj, PP);
 }
 
 
@@ -1128,7 +1424,20 @@
 // This function must be in sync with FlowGraphCompiler::RecordSafepoint and
 // FlowGraphCompiler::SlowPathEnvironmentFor.
 void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
-  // TODO(zra): Save live FPU Registers.
+  // TODO(vegorov): consider saving only caller save (volatile) registers.
+  const intptr_t fpu_regs_count = locs->live_registers()->FpuRegisterCount();
+  if (fpu_regs_count > 0) {
+    // Store fpu registers with the lowest register number at the lowest
+    // address.
+    for (intptr_t reg_idx = kNumberOfVRegisters - 1;
+                  reg_idx >= 0; --reg_idx) {
+      VRegister fpu_reg = static_cast<VRegister>(reg_idx);
+      if (locs->live_registers()->ContainsFpuRegister(fpu_reg)) {
+        // TODO(zra): Save the whole V register.
+        __ PushDouble(fpu_reg);
+      }
+    }
+  }
 
   // Store general purpose registers with the highest register number at the
   // lowest address.
@@ -1151,7 +1460,17 @@
     }
   }
 
-  // TODO(zra): Restore live FPU registers.
+  const intptr_t fpu_regs_count = locs->live_registers()->FpuRegisterCount();
+  if (fpu_regs_count > 0) {
+    // Fpu registers have the lowest register number at the lowest address.
+    for (intptr_t reg_idx = 0; reg_idx < kNumberOfVRegisters; ++reg_idx) {
+      VRegister fpu_reg = static_cast<VRegister>(reg_idx);
+      if (locs->live_registers()->ContainsFpuRegister(fpu_reg)) {
+        // TODO(zra): Restore the whole V register.
+        __ PopDouble(fpu_reg);
+      }
+    }
+  }
 }
 
 
@@ -1163,7 +1482,43 @@
                                         intptr_t deopt_id,
                                         intptr_t token_index,
                                         LocationSummary* locs) {
-  UNIMPLEMENTED();
+  ASSERT(is_optimizing());
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  Label match_found;
+  const intptr_t len = ic_data.NumberOfChecks();
+  GrowableArray<CidTarget> sorted(len);
+  SortICDataByCount(ic_data, &sorted);
+  ASSERT(class_id_reg != R4);
+  ASSERT(len > 0);  // Why bother otherwise.
+  const Array& arguments_descriptor =
+      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
+                                                 argument_names));
+  __ LoadObject(R4, arguments_descriptor, PP);
+  for (intptr_t i = 0; i < len; i++) {
+    const bool is_last_check = (i == (len - 1));
+    Label next_test;
+    __ CompareImmediate(class_id_reg, sorted[i].cid, PP);
+    if (is_last_check) {
+      __ b(deopt, NE);
+    } else {
+      __ b(&next_test, NE);
+    }
+    // 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.
+    GenerateDartCall(deopt_id,
+                     token_index,
+                     &StubCode::CallStaticFunctionLabel(),
+                     PcDescriptors::kOptStaticCall,
+                     locs);
+    const Function& function = *sorted[i].target;
+    AddStaticCallTarget(function);
+    __ Drop(argument_count);
+    if (!is_last_check) {
+      __ b(&match_found);
+    }
+    __ Bind(&next_test);
+  }
+  __ Bind(&match_found);
 }
 
 
@@ -1210,12 +1565,156 @@
 
 
 void ParallelMoveResolver::EmitMove(int index) {
-  UNIMPLEMENTED();
+  MoveOperands* move = moves_[index];
+  const Location source = move->src();
+  const Location destination = move->dest();
+
+  if (source.IsRegister()) {
+    if (destination.IsRegister()) {
+      __ mov(destination.reg(), source.reg());
+    } else {
+      ASSERT(destination.IsStackSlot());
+      const intptr_t dest_offset = destination.ToStackSlotOffset();
+      __ StoreToOffset(source.reg(), FP, dest_offset);
+    }
+  } else if (source.IsStackSlot()) {
+    if (destination.IsRegister()) {
+      const intptr_t source_offset = source.ToStackSlotOffset();
+      __ LoadFromOffset(destination.reg(), FP, source_offset);
+    } else {
+      ASSERT(destination.IsStackSlot());
+      const intptr_t source_offset = source.ToStackSlotOffset();
+      const intptr_t dest_offset = destination.ToStackSlotOffset();
+      __ LoadFromOffset(TMP, FP, source_offset);
+      __ StoreToOffset(TMP, FP, dest_offset);
+    }
+  } else if (source.IsFpuRegister()) {
+    if (destination.IsFpuRegister()) {
+      __ fmovdd(destination.fpu_reg(), source.fpu_reg());
+    } else {
+      if (destination.IsDoubleStackSlot()) {
+        const intptr_t dest_offset = destination.ToStackSlotOffset();
+        VRegister src = source.fpu_reg();
+        __ StoreDToOffset(src, FP, dest_offset);
+      } else {
+        ASSERT(destination.IsQuadStackSlot());
+        UNIMPLEMENTED();
+      }
+    }
+  } else if (source.IsDoubleStackSlot()) {
+    if (destination.IsFpuRegister()) {
+      const intptr_t dest_offset = source.ToStackSlotOffset();
+      const VRegister dst = destination.fpu_reg();
+      __ LoadDFromOffset(dst, FP, dest_offset);
+    } else {
+      ASSERT(destination.IsDoubleStackSlot());
+      const intptr_t source_offset = source.ToStackSlotOffset();
+      const intptr_t dest_offset = destination.ToStackSlotOffset();
+      __ LoadDFromOffset(VTMP, FP, source_offset);
+      __ StoreDToOffset(VTMP, FP, dest_offset);
+    }
+  } else if (source.IsQuadStackSlot()) {
+    UNIMPLEMENTED();
+  } else {
+    ASSERT(source.IsConstant());
+    const Object& constant = source.constant();
+    if (destination.IsRegister()) {
+      __ LoadObject(destination.reg(), constant, PP);
+    } else if (destination.IsFpuRegister()) {
+      const VRegister dst = destination.fpu_reg();
+      __ LoadObject(TMP, constant, PP);
+      __ LoadDFieldFromOffset(dst, TMP, Double::value_offset());
+    } else if (destination.IsDoubleStackSlot()) {
+      const intptr_t dest_offset = destination.ToStackSlotOffset();
+      __ LoadObject(TMP, constant, PP);
+      __ LoadDFieldFromOffset(VTMP, TMP, Double::value_offset());
+      __ StoreDToOffset(VTMP, FP, dest_offset);
+    } else {
+      ASSERT(destination.IsStackSlot());
+      const intptr_t dest_offset = destination.ToStackSlotOffset();
+      __ LoadObject(TMP, constant, PP);
+      __ StoreToOffset(TMP, FP, dest_offset);
+    }
+  }
+
+  move->Eliminate();
 }
 
 
 void ParallelMoveResolver::EmitSwap(int index) {
-  UNIMPLEMENTED();
+  MoveOperands* move = moves_[index];
+  const Location source = move->src();
+  const Location destination = move->dest();
+
+  if (source.IsRegister() && destination.IsRegister()) {
+    ASSERT(source.reg() != TMP);
+    ASSERT(destination.reg() != TMP);
+    __ mov(TMP, source.reg());
+    __ mov(source.reg(), destination.reg());
+    __ mov(destination.reg(), TMP);
+  } else if (source.IsRegister() && destination.IsStackSlot()) {
+    Exchange(source.reg(), destination.ToStackSlotOffset());
+  } else if (source.IsStackSlot() && destination.IsRegister()) {
+    Exchange(destination.reg(), source.ToStackSlotOffset());
+  } else if (source.IsStackSlot() && destination.IsStackSlot()) {
+    Exchange(source.ToStackSlotOffset(), destination.ToStackSlotOffset());
+  } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
+    const VRegister dst = destination.fpu_reg();
+    const VRegister src = source.fpu_reg();
+    __ fmovdd(VTMP, src);
+    __ fmovdd(src, dst);
+    __ fmovdd(dst, VTMP);
+  } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
+    ASSERT(destination.IsDoubleStackSlot() ||
+           destination.IsQuadStackSlot() ||
+           source.IsDoubleStackSlot() ||
+           source.IsQuadStackSlot());
+    bool double_width = destination.IsDoubleStackSlot() ||
+                        source.IsDoubleStackSlot();
+    VRegister reg = source.IsFpuRegister() ? source.fpu_reg()
+                                          : destination.fpu_reg();
+    const intptr_t slot_offset = source.IsFpuRegister()
+        ? destination.ToStackSlotOffset()
+        : source.ToStackSlotOffset();
+
+    if (double_width) {
+      __ LoadDFromOffset(VTMP, FP, slot_offset);
+      __ StoreDToOffset(reg, FP, slot_offset);
+      __ fmovdd(reg, VTMP);
+    } else {
+      UNIMPLEMENTED();
+    }
+  } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
+    const intptr_t source_offset = source.ToStackSlotOffset();
+    const intptr_t dest_offset = destination.ToStackSlotOffset();
+
+    ScratchFpuRegisterScope ensure_scratch(this, VTMP);
+    VRegister scratch = ensure_scratch.reg();
+    __ LoadDFromOffset(VTMP, FP, source_offset);
+    __ LoadDFromOffset(scratch, FP, dest_offset);
+    __ StoreDToOffset(VTMP, FP, dest_offset);
+    __ StoreDToOffset(scratch, FP, source_offset);
+  } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
+    UNIMPLEMENTED();
+  } else {
+    UNREACHABLE();
+  }
+
+  // The swap of source and destination has executed a move from source to
+  // destination.
+  move->Eliminate();
+
+  // Any unperformed (including pending) move with a source of either
+  // this move's source or destination needs to have their source
+  // changed to reflect the state of affairs after the swap.
+  for (int i = 0; i < moves_.length(); ++i) {
+    const MoveOperands& other_move = *moves_[i];
+    if (other_move.Blocks(source)) {
+      moves_[i]->set_src(destination);
+    } else if (other_move.Blocks(destination)) {
+      moves_[i]->set_src(source);
+    }
+  }
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 5ed4715..518f15b 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -12,6 +12,7 @@
 #include "vm/cpu.h"
 #include "vm/dart_entry.h"
 #include "vm/deopt_instructions.h"
+#include "vm/flow_graph_builder.h"
 #include "vm/il_printer.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -61,7 +62,9 @@
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
-  if (deopt_env_ == NULL) return DeoptInfo::null();
+  if (deopt_env_ == NULL) {
+    return DeoptInfo::null();
+  }
 
   intptr_t stack_height = compiler->StackSize();
   AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
@@ -1649,6 +1652,30 @@
       } else {
         __ LoadObjectSafely(destination.reg(), constant);
       }
+    } else if (destination.IsFpuRegister()) {
+      const Double& constant = Double::Cast(source.constant());
+      uword addr = FlowGraphBuilder::FindDoubleConstant(constant.value());
+      if (addr == 0) {
+        __ pushl(EAX);
+        __ LoadObject(EAX, constant);
+        __ movsd(destination.fpu_reg(),
+            FieldAddress(EAX, Double::value_offset()));
+        __ popl(EAX);
+      } else {
+        __ movsd(destination.fpu_reg(), Address::Absolute(addr));
+      }
+    } else if (destination.IsDoubleStackSlot()) {
+      const Double& constant = Double::Cast(source.constant());
+      uword addr = FlowGraphBuilder::FindDoubleConstant(constant.value());
+      if (addr == 0) {
+        __ pushl(EAX);
+        __ LoadObject(EAX, constant);
+        __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
+        __ popl(EAX);
+      } else {
+        __ movsd(XMM0, Address::Absolute(addr));
+      }
+      __ movsd(destination.ToStackSlotAddress(), XMM0);
     } else {
       ASSERT(destination.IsStackSlot());
       StoreObject(destination.ToStackSlotAddress(), source.constant());
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 508a760..5b272c0 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -55,7 +55,9 @@
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
-  if (deopt_env_ == NULL) return DeoptInfo::null();
+  if (deopt_env_ == NULL) {
+    return DeoptInfo::null();
+  }
 
   intptr_t stack_height = compiler->StackSize();
   AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
@@ -157,7 +159,9 @@
 #define __ assem->
   __ Comment("Deopt stub for id %" Pd "", deopt_id());
   __ Bind(entry_label());
-  if (FLAG_trap_on_deoptimization) __ break_(0);
+  if (FLAG_trap_on_deoptimization) {
+    __ break_(0);
+  }
 
   ASSERT(deopt_env() != NULL);
 
@@ -1684,13 +1688,22 @@
     UNIMPLEMENTED();
   } else {
     ASSERT(source.IsConstant());
+    const Object& constant = source.constant();
     if (destination.IsRegister()) {
-      const Object& constant = source.constant();
       __ LoadObject(destination.reg(), constant);
+    } else if (destination.IsFpuRegister()) {
+      __ LoadObject(TMP, constant);
+      __ LoadDFromOffset(destination.fpu_reg(), TMP,
+          Double::value_offset() - kHeapObjectTag);
+    } else if (destination.IsDoubleStackSlot()) {
+      const intptr_t dest_offset = destination.ToStackSlotOffset();
+      __ LoadObject(TMP, constant);
+      __ LoadDFromOffset(DTMP, TMP, Double::value_offset() - kHeapObjectTag);
+      __ StoreDToOffset(DTMP, FP, dest_offset);
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ LoadObject(TMP, source.constant());
+      __ LoadObject(TMP, constant);
       __ StoreToOffset(TMP, FP, dest_offset);
     }
   }
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index c434a90..66bd6cd 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -58,7 +58,9 @@
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
-  if (deopt_env_ == NULL) return DeoptInfo::null();
+  if (deopt_env_ == NULL) {
+    return DeoptInfo::null();
+  }
 
   intptr_t stack_height = compiler->StackSize();
   AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
@@ -155,7 +157,9 @@
 #define __ assem->
   __ Comment("Deopt stub for id %" Pd "", deopt_id());
   __ Bind(entry_label());
-  if (FLAG_trap_on_deoptimization) __ int3();
+  if (FLAG_trap_on_deoptimization) {
+    __ int3();
+  }
 
   ASSERT(deopt_env() != NULL);
 
@@ -1677,16 +1681,24 @@
     }
   } else {
     ASSERT(source.IsConstant());
+    const Object& constant = source.constant();
     if (destination.IsRegister()) {
-      const Object& constant = source.constant();
       if (constant.IsSmi() && (Smi::Cast(constant).Value() == 0)) {
         __ xorq(destination.reg(), destination.reg());
       } else {
         __ LoadObject(destination.reg(), constant, PP);
       }
+    } else if (destination.IsFpuRegister()) {
+      __ LoadObject(TMP, constant, PP);
+      __ movsd(destination.fpu_reg(),
+          FieldAddress(TMP, Double::value_offset()));
+    } else if (destination.IsDoubleStackSlot()) {
+      __ LoadObject(TMP, constant, PP);
+      __ movsd(XMM0, FieldAddress(TMP, Double::value_offset()));
+      __ movsd(destination.ToStackSlotAddress(), XMM0);
     } else {
       ASSERT(destination.IsStackSlot());
-      StoreObject(destination.ToStackSlotAddress(), source.constant());
+      StoreObject(destination.ToStackSlotAddress(), constant);
     }
   }
 
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 6309034..f8a5494 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -395,6 +395,7 @@
 }
 
 
+// Tries to merge MathUnary operations, in this case sinus and cosinus.
 void FlowGraphOptimizer::TryMergeMathUnary(
     GrowableArray<MathUnaryInstr*>* merge_candidates) {
   if (!FlowGraphCompiler::SupportsSinCos()) {
@@ -411,8 +412,8 @@
       continue;
     }
     const intptr_t kind = curr_instr->kind();
-    ASSERT((kind == MethodRecognizer::kMathSin) ||
-           (kind == MethodRecognizer::kMathCos));
+    ASSERT((kind == MathUnaryInstr::kSin) ||
+           (kind == MathUnaryInstr::kCos));
     // Check if there is sin/cos binop with same inputs.
     const intptr_t other_kind = (kind == MethodRecognizer::kMathSin) ?
         MethodRecognizer::kMathCos : MethodRecognizer::kMathSin;
@@ -488,8 +489,8 @@
         }
       } else if (it.Current()->IsMathUnary()) {
         MathUnaryInstr* math_unary = it.Current()->AsMathUnary();
-        if ((math_unary->kind() == MethodRecognizer::kMathSin) ||
-            (math_unary->kind() == MethodRecognizer::kMathCos)) {
+        if ((math_unary->kind() == MathUnaryInstr::kSin) ||
+            (math_unary->kind() == MathUnaryInstr::kCos)) {
           if (math_unary->HasUses()) {
             sin_cos_merge.Add(math_unary);
           }
@@ -4100,11 +4101,24 @@
 void FlowGraphOptimizer::VisitStaticCall(StaticCallInstr* call) {
   MethodRecognizer::Kind recognized_kind =
       MethodRecognizer::RecognizeKind(call->function());
-  if ((recognized_kind == MethodRecognizer::kMathSqrt) ||
-      (recognized_kind == MethodRecognizer::kMathSin) ||
-      (recognized_kind == MethodRecognizer::kMathCos)) {
+  MathUnaryInstr::MathUnaryKind unary_kind;
+  switch (recognized_kind) {
+    case MethodRecognizer::kMathSqrt:
+      unary_kind = MathUnaryInstr::kSqrt;
+      break;
+    case MethodRecognizer::kMathSin:
+      unary_kind = MathUnaryInstr::kSin;
+      break;
+    case MethodRecognizer::kMathCos:
+      unary_kind = MathUnaryInstr::kCos;
+      break;
+    default:
+      unary_kind = MathUnaryInstr::kIllegal;
+      break;
+  }
+  if (unary_kind != MathUnaryInstr::kIllegal) {
     MathUnaryInstr* math_unary =
-        new MathUnaryInstr(recognized_kind,
+        new MathUnaryInstr(unary_kind,
                            new Value(call->ArgumentAt(0)),
                            call->deopt_id());
     ReplaceCall(call, math_unary);
@@ -4365,7 +4379,8 @@
 
   void ConstrainValueAfterBranch(Definition* defn, Value* use);
   void ConstrainValueAfterCheckArrayBound(Definition* defn,
-                                          CheckArrayBoundInstr* check);
+                                          CheckArrayBoundInstr* check,
+                                          intptr_t use_index);
 
   // Replace uses of the definition def that are dominated by instruction dom
   // with uses of other definition.
@@ -4657,19 +4672,28 @@
     } else if (use->instruction()->IsCheckArrayBound()) {
       ConstrainValueAfterCheckArrayBound(
           defn,
-          use->instruction()->AsCheckArrayBound());
+          use->instruction()->AsCheckArrayBound(),
+          use->use_index());
     }
   }
 }
 
 
 void RangeAnalysis::ConstrainValueAfterCheckArrayBound(
-    Definition* defn, CheckArrayBoundInstr* check) {
-  Definition* length = check->length()->definition();
-
-  Range* constraint_range = new Range(
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::FromDefinition(length, -1));
+    Definition* defn, CheckArrayBoundInstr* check, intptr_t use_index) {
+  Range* constraint_range = NULL;
+  if (use_index == CheckArrayBoundInstr::kIndexPos) {
+    Definition* length = check->length()->definition();
+    constraint_range = new Range(
+        RangeBoundary::FromConstant(0),
+        RangeBoundary::FromDefinition(length, -1));
+  } else {
+    ASSERT(use_index == CheckArrayBoundInstr::kLengthPos);
+    Definition* index = check->index()->definition();
+    constraint_range = new Range(
+        RangeBoundary::FromDefinition(index, 1),
+        RangeBoundary::MaxSmi());
+  }
   InsertConstraintFor(defn, constraint_range, check);
 }
 
@@ -7159,6 +7183,7 @@
   cp.Analyze();
   cp.VisitBranches();
   cp.Transform();
+  cp.EliminateRedundantBranches();
 }
 
 
@@ -7594,6 +7619,9 @@
                                           Integer::Cast(left),
                                           Integer::Cast(right));
       SetValue(instr, Bool::Get(result));
+    } else if (left.IsDouble() && right.IsDouble()) {
+      // TODO(srdjan): Implement.
+      SetValue(instr, non_constant_);
     } else {
       SetValue(instr, non_constant_);
     }
@@ -8062,6 +8090,11 @@
 }
 
 
+void ConstantPropagator::VisitUnboxedConstant(UnboxedConstantInstr* instr) {
+  SetValue(instr, instr->value());
+}
+
+
 void ConstantPropagator::VisitConstraint(ConstraintInstr* instr) {
   // Should not be used outside of range analysis.
   UNREACHABLE();
@@ -8433,6 +8466,85 @@
 }
 
 
+static bool IsEmptyBlock(BlockEntryInstr* block) {
+  return block->next()->IsGoto() &&
+      (!block->IsJoinEntry() || (block->AsJoinEntry()->phis() == NULL));
+}
+
+
+// Traverses a chain of empty blocks and returns the first reachable non-empty
+// block that is not dominated by the start block. The empty blocks are added
+// to the supplied bit vector.
+static BlockEntryInstr* FindFirstNonEmptySuccessor(
+    TargetEntryInstr* block,
+    BitVector* empty_blocks) {
+  BlockEntryInstr* current = block;
+  while (IsEmptyBlock(current) && block->Dominates(current)) {
+    ASSERT(!block->IsJoinEntry() || (block->AsJoinEntry()->phis() == NULL));
+    empty_blocks->Add(current->preorder_number());
+    current = current->next()->AsGoto()->successor();
+  }
+  return current;
+}
+
+
+void ConstantPropagator::EliminateRedundantBranches() {
+  // Canonicalize branches that have no side-effects and where true- and
+  // false-targets are the same.
+  bool changed = false;
+  BitVector* empty_blocks = new BitVector(graph_->preorder().length());
+  for (BlockIterator b = graph_->postorder_iterator();
+       !b.Done();
+       b.Advance()) {
+    BlockEntryInstr* block = b.Current();
+    BranchInstr* branch = block->last_instruction()->AsBranch();
+    empty_blocks->Clear();
+    if ((branch != NULL) && branch->Effects().IsNone()) {
+      ASSERT(branch->previous() != NULL);  // Not already eliminated.
+      BlockEntryInstr* if_true =
+          FindFirstNonEmptySuccessor(branch->true_successor(), empty_blocks);
+      BlockEntryInstr* if_false =
+          FindFirstNonEmptySuccessor(branch->false_successor(), empty_blocks);
+      if (if_true == if_false) {
+        // Replace the branch with a jump to the common successor.
+        // Drop the comparison, which does not have side effects
+        JoinEntryInstr* join = if_true->AsJoinEntry();
+        if (join->phis() == NULL) {
+          GotoInstr* jump = new GotoInstr(if_true->AsJoinEntry());
+          jump->InheritDeoptTarget(branch);
+
+          Instruction* previous = branch->previous();
+          branch->set_previous(NULL);
+          previous->LinkTo(jump);
+
+          // Remove uses from branch and all the empty blocks that
+          // are now unreachable.
+          branch->UnuseAllInputs();
+          for (BitVector::Iterator it(empty_blocks); !it.Done(); it.Advance()) {
+            BlockEntryInstr* empty_block = graph_->preorder()[it.Current()];
+            empty_block->ClearAllInstructions();
+          }
+
+          changed = true;
+
+          if (FLAG_trace_constant_propagation) {
+            OS::Print("Eliminated branch in B%" Pd " common target B%" Pd "\n",
+                      block->block_id(), join->block_id());
+          }
+        }
+      }
+    }
+  }
+
+  if (changed) {
+    graph_->DiscoverBlocks();
+    // TODO(fschneider): Update dominator tree in place instead of recomputing.
+    GrowableArray<BitVector*> dominance_frontier;
+    graph_->ComputeDominators(&dominance_frontier);
+  }
+}
+
+
 void ConstantPropagator::Transform() {
   if (FLAG_trace_constant_propagation) {
     OS::Print("\n==== Before constant propagation ====\n");
@@ -8450,24 +8562,16 @@
        !b.Done();
        b.Advance()) {
     BlockEntryInstr* block = b.Current();
-    JoinEntryInstr* join = block->AsJoinEntry();
     if (!reachable_->Contains(block->preorder_number())) {
       if (FLAG_trace_constant_propagation) {
         OS::Print("Unreachable B%" Pd "\n", block->block_id());
       }
       // Remove all uses in unreachable blocks.
-      if (join != NULL) {
-        for (PhiIterator it(join); !it.Done(); it.Advance()) {
-          it.Current()->UnuseAllInputs();
-        }
-      }
-      block->UnuseAllInputs();
-      for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
-        it.Current()->UnuseAllInputs();
-      }
+      block->ClearAllInstructions();
       continue;
     }
 
+    JoinEntryInstr* join = block->AsJoinEntry();
     if (join != NULL) {
       // Remove phi inputs corresponding to unreachable predecessor blocks.
       // Predecessors will be recomputed (in block id order) after removing
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 838c6b8..c6deefc 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -297,8 +297,16 @@
 
   static void Optimize(FlowGraph* graph);
 
-  // Only visit branches to optimize away unreachable blocks discovered
-  // by range analysis.
+  // (1) Visit branches to optimize away unreachable blocks discovered  by range
+  // analysis.
+  // (2) Eliminate branches that have the same true- and false-target: For
+  // example, this occurs after expressions like
+  //
+  // if (a == null || b == null) {
+  //   ...
+  // }
+  //
+  // where b is known to be null.
   static void OptimizeBranches(FlowGraph* graph);
 
   // Used to initialize the abstract value of definitions.
@@ -308,6 +316,7 @@
   void Analyze();
   void VisitBranches();
   void Transform();
+  void EliminateRedundantBranches();
 
   void SetReachable(BlockEntryInstr* block);
   void SetValue(Definition* definition, const Object& value);
diff --git a/runtime/vm/guard_field_test.cc b/runtime/vm/guard_field_test.cc
index d815b4f5..193d4b7 100644
--- a/runtime/vm/guard_field_test.cc
+++ b/runtime/vm/guard_field_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "vm/dart_api_impl.h"
 #include "vm/dart_api_state.h"
 #include "vm/intermediate_language.h"
@@ -274,5 +270,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/handles.cc b/runtime/vm/handles.cc
index a7564db..5093be5 100644
--- a/runtime/vm/handles.cc
+++ b/runtime/vm/handles.cc
@@ -80,7 +80,7 @@
 }
 
 
-HandleScope::HandleScope(BaseIsolate* isolate) : StackResource(isolate) {
+HandleScope::HandleScope(Isolate* isolate) : StackResource(isolate) {
   ASSERT(isolate->no_handle_scope_depth() == 0);
   VMHandles* handles = isolate->current_zone()->handles();
   ASSERT(handles != NULL);
@@ -109,7 +109,7 @@
 
 
 #if defined(DEBUG)
-NoHandleScope::NoHandleScope(BaseIsolate* isolate) : StackResource(isolate) {
+NoHandleScope::NoHandleScope(Isolate* isolate) : StackResource(isolate) {
   isolate->IncrementNoHandleScopeDepth();
 }
 
diff --git a/runtime/vm/handles.h b/runtime/vm/handles.h
index d12fc4b..8a216ff 100644
--- a/runtime/vm/handles.h
+++ b/runtime/vm/handles.h
@@ -297,7 +297,7 @@
 // }
 class HandleScope : public StackResource {
  public:
-  explicit HandleScope(BaseIsolate* isolate);
+  explicit HandleScope(Isolate* isolate);
   ~HandleScope();
 
  private:
@@ -329,7 +329,7 @@
 #if defined(DEBUG)
 class NoHandleScope : public StackResource {
  public:
-  explicit NoHandleScope(BaseIsolate* isolate);
+  explicit NoHandleScope(Isolate* isolate);
   NoHandleScope();
   ~NoHandleScope();
 
@@ -339,7 +339,7 @@
 #else  // defined(DEBUG)
 class NoHandleScope : public ValueObject {
  public:
-  explicit NoHandleScope(BaseIsolate* isolate) { }
+  explicit NoHandleScope(Isolate* isolate) { }
   NoHandleScope() { }
   ~NoHandleScope() { }
 
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 7f2310a..57ded04 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -156,6 +156,9 @@
 
   // Protect access to the heap.
   void WriteProtect(bool read_only);
+  void WriteProtectCode(bool read_only) {
+    old_space_->WriteProtectCode(read_only);
+  }
 
   // Accessors for inlined allocation in generated code.
   uword TopAddress();
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 8ff354c4..db27a46 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -584,7 +584,7 @@
 
 
 void MathUnaryInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("'%s', ", MethodRecognizer::KindToCString(kind()));
+  f->Print("'%s', ", MathUnaryInstr::KindToCString(kind()));
   value()->PrintTo(f);
 }
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index a9ba3fb..cd41415 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -325,6 +325,14 @@
 }
 
 
+UnboxedConstantInstr::UnboxedConstantInstr(const Object& value)
+    : ConstantInstr(value), constant_address_(0) {
+  // Only doubles supported for now.
+  ASSERT(value.IsDouble());
+  constant_address_ =
+      FlowGraphBuilder::FindDoubleConstant(Double::Cast(value).value());
+}
+
 // Returns true if the value represents a constant.
 bool Value::BindsToConstant() const {
   return definition()->IsConstant();
@@ -1060,6 +1068,22 @@
 }
 
 
+void BlockEntryInstr::ClearAllInstructions() {
+  JoinEntryInstr* join = this->AsJoinEntry();
+  if (join != NULL) {
+    for (PhiIterator it(join); !it.Done(); it.Advance()) {
+      it.Current()->UnuseAllInputs();
+    }
+  }
+  UnuseAllInputs();
+  for (ForwardInstructionIterator it(this);
+       !it.Done();
+       it.Advance()) {
+    it.Current()->UnuseAllInputs();
+  }
+}
+
+
 void JoinEntryInstr::InsertPhi(intptr_t var_index, intptr_t var_count) {
   // Lazily initialize the array of phis.
   // Currently, phis are stored in a sparse array that holds the phi
@@ -1224,7 +1248,6 @@
       return ToIntegerConstant(value->definition()->AsUnboxDouble()->value(),
                                result);
     }
-
     return false;
   }
 
@@ -1339,22 +1362,32 @@
 
 
 Definition* BinaryDoubleOpInstr::Canonicalize(FlowGraph* flow_graph) {
+  if (!HasUses()) return NULL;
+
   Definition* result = NULL;
 
   result = CanonicalizeCommutativeArithmetic(op_kind(),
                                              kDoubleCid,
                                              left(),
                                              right());
+  if (result == NULL) {
+    result = CanonicalizeCommutativeArithmetic(op_kind(),
+                                               kDoubleCid,
+                                               right(),
+                                               left());
+  }
   if (result != NULL) {
     return result;
   }
 
-  result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                             kDoubleCid,
-                                             right(),
-                                             left());
-  if (result != NULL) {
-    return result;
+  if ((op_kind() == Token::kMUL) &&
+      (left()->definition() == right()->definition())) {
+    MathUnaryInstr* math_unary =
+        new MathUnaryInstr(MathUnaryInstr::kDoubleSquare,
+                           new Value(left()->definition()),
+                           DeoptimizationTarget());
+    flow_graph->InsertBefore(this, math_unary, env(), Definition::kValue);
+    return math_unary;
   }
 
   return this;
@@ -1601,9 +1634,21 @@
 
 
 Definition* UnboxDoubleInstr::Canonicalize(FlowGraph* flow_graph) {
+  if (!HasUses()) return NULL;
   // Fold away UnboxDouble(BoxDouble(v)).
-  BoxDoubleInstr* defn = value()->definition()->AsBoxDouble();
-  return (defn != NULL) ? defn->value()->definition() : this;
+  BoxDoubleInstr* box_defn = value()->definition()->AsBoxDouble();
+  if (box_defn != NULL) {
+    return box_defn->value()->definition();
+  }
+
+  ConstantInstr* c = value()->definition()->AsConstant();
+  if ((c != NULL) && c->value().IsDouble()) {
+    UnboxedConstantInstr* uc = new UnboxedConstantInstr(c->value());
+    flow_graph->InsertBefore(this, uc, NULL, Definition::kValue);
+    return uc;
+  }
+
+  return this;
 }
 
 
@@ -3298,9 +3343,9 @@
 
 const RuntimeEntry& MathUnaryInstr::TargetFunction() const {
   switch (kind()) {
-    case MethodRecognizer::kMathSin:
+    case MathUnaryInstr::kSin:
       return kSinRuntimeEntry;
-    case MethodRecognizer::kMathCos:
+    case MathUnaryInstr::kCos:
       return kCosRuntimeEntry;
     default:
       UNREACHABLE();
@@ -3309,6 +3354,19 @@
 }
 
 
+const char* MathUnaryInstr::KindToCString(MathUnaryKind kind) {
+  switch (kind) {
+    case kIllegal:       return "illegal";
+    case kSin:           return "sin";
+    case kCos:           return "cos";
+    case kSqrt:          return "sqrt";
+    case kDoubleSquare:  return "double-square";
+  }
+  UNREACHABLE();
+  return "";
+}
+
+
 MergedMathInstr::MergedMathInstr(ZoneGrowableArray<Value*>* inputs,
                                  intptr_t original_deopt_id,
                                  MergedMathInstr::Kind kind)
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 699231d..1b4b7d8 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -721,6 +721,7 @@
   M(CheckClass)                                                                \
   M(CheckSmi)                                                                  \
   M(Constant)                                                                  \
+  M(UnboxedConstant)                                                           \
   M(CheckEitherNonSmi)                                                         \
   M(BinaryDoubleOp)                                                            \
   M(MathUnary)                                                                 \
@@ -1385,6 +1386,10 @@
 
   void set_block_id(intptr_t block_id) { block_id_ = block_id; }
 
+  // For all instruction in this block: Remove all inputs (including in the
+  // environment) from their definition's use lists for all instructions.
+  void ClearAllInstructions();
+
  protected:
   BlockEntryInstr(intptr_t block_id, intptr_t try_index)
       : block_id_(block_id),
@@ -2745,6 +2750,29 @@
 };
 
 
+// Merged ConstantInstr -> UnboxedXXX into UnboxedConstantInstr.
+// TODO(srdjan): Implemented currently for doubles only, should implement
+// for other unboxing instructions.
+class UnboxedConstantInstr : public ConstantInstr {
+ public:
+  explicit UnboxedConstantInstr(const Object& value);
+
+  virtual Representation representation() const {
+    return kUnboxedDouble;
+  }
+
+  // Either NULL or the address of the unboxed constant.
+  uword constant_address() const { return constant_address_; }
+
+  DECLARE_INSTRUCTION(UnboxedConstant)
+
+ private:
+  uword constant_address_;  // Either NULL or points to the untagged constant.
+
+  DISALLOW_COPY_AND_ASSIGN(UnboxedConstantInstr);
+};
+
+
 class AssertAssignableInstr : public TemplateDefinition<3> {
  public:
   AssertAssignableInstr(intptr_t token_pos,
@@ -5041,14 +5069,21 @@
 
 class MathUnaryInstr : public TemplateDefinition<1> {
  public:
-  MathUnaryInstr(MethodRecognizer::Kind kind, Value* value, intptr_t deopt_id)
+  enum MathUnaryKind {
+    kIllegal,
+    kSin,
+    kCos,
+    kSqrt,
+    kDoubleSquare,
+  };
+  MathUnaryInstr(MathUnaryKind kind, Value* value, intptr_t deopt_id)
       : kind_(kind) {
     SetInputAt(0, value);
     deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
-  MethodRecognizer::Kind kind() const { return kind_; }
+  MathUnaryKind kind() const { return kind_; }
   const RuntimeEntry& TargetFunction() const;
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
@@ -5084,8 +5119,10 @@
 
   Definition* Canonicalize(FlowGraph* flow_graph);
 
+  static const char* KindToCString(MathUnaryKind kind);
+
  private:
-  const MethodRecognizer::Kind kind_;
+  const MathUnaryKind kind_;
 
   DISALLOW_COPY_AND_ASSIGN(MathUnaryInstr);
 };
@@ -7685,13 +7722,13 @@
 
   virtual bool MayThrow() const { return false; }
 
- private:
   // Give a name to the location/input indices.
   enum {
     kLengthPos = 0,
     kIndexPos = 1
   };
 
+ private:
   DISALLOW_COPY_AND_ASSIGN(CheckArrayBoundInstr);
 };
 
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 321fe04..2d4b5ba 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -276,6 +276,32 @@
 }
 
 
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_out(0, Location::RequiresFpuRegister());
+  locs->set_temp(0, Location::RequiresRegister());
+  return locs;
+}
+
+
+void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // The register allocator drops constant definitions that have no uses.
+  if (!locs()->out(0).IsInvalid()) {
+    if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+      const QRegister dst = locs()->out(0).fpu_reg();
+      __ veorq(dst, dst, dst);
+    } else {
+      const DRegister dst = EvenDRegisterOf(locs()->out(0).fpu_reg());
+      const Register temp = locs()->temp(0).reg();
+      __ LoadDImmediate(dst, Double::Cast(value()).value(), temp);
+    }
+  }
+}
+
+
 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
@@ -3290,7 +3316,8 @@
 
 
 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
+  CompileType* value_type = value()->Type();
+  const intptr_t value_cid = value_type->ToCid();
   const Register value = locs()->in(0).reg();
   const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
 
@@ -3304,19 +3331,29 @@
     Label* deopt = compiler->AddDeoptStub(deopt_id_,
                                           ICData::kDeoptBinaryDoubleOp);
     Register temp = locs()->temp(0).reg();
-    Label is_smi, done;
-    __ tst(value, ShifterOperand(kSmiTagMask));
-    __ b(&is_smi, EQ);
-    __ CompareClassId(value, kDoubleCid, temp);
-    __ b(deopt, NE);
-    __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
-    __ b(&done);
-    __ Bind(&is_smi);
-    // TODO(regis): Why do we preserve value here but not above?
-    __ mov(IP, ShifterOperand(value, ASR, 1));  // Copy and untag.
-    __ vmovsr(STMP, IP);
-    __ vcvtdi(result, STMP);
-    __ Bind(&done);
+    if (value_type->is_nullable() &&
+        (value_type->ToNullableCid() == kDoubleCid)) {
+      __ CompareImmediate(value, reinterpret_cast<intptr_t>(Object::null()));
+      __ b(deopt, EQ);
+      // It must be double now.
+      __ LoadDFromOffset(result, value,
+          Double::value_offset() - kHeapObjectTag);
+    } else {
+      Label is_smi, done;
+      __ tst(value, ShifterOperand(kSmiTagMask));
+      __ b(&is_smi, EQ);
+      __ CompareClassId(value, kDoubleCid, temp);
+      __ b(deopt, NE);
+      __ LoadDFromOffset(result, value,
+          Double::value_offset() - kHeapObjectTag);
+      __ b(&done);
+      __ Bind(&is_smi);
+      // TODO(regis): Why do we preserve value here but not above?
+      __ mov(IP, ShifterOperand(value, ASR, 1));  // Copy and untag.
+      __ vmovsr(STMP, IP);
+      __ vcvtdi(result, STMP);
+      __ Bind(&done);
+    }
   }
 }
 
@@ -3572,9 +3609,9 @@
 
 
 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  DRegister left = EvenDRegisterOf(locs()->in(0).fpu_reg());
-  DRegister right = EvenDRegisterOf(locs()->in(1).fpu_reg());
-  DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
+  const DRegister left = EvenDRegisterOf(locs()->in(0).fpu_reg());
+  const DRegister right = EvenDRegisterOf(locs()->in(1).fpu_reg());
+  const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
   switch (op_kind()) {
     case Token::kADD: __ vaddd(result, left, right); break;
     case Token::kSUB: __ vsubd(result, left, right); break;
@@ -4705,8 +4742,7 @@
 
 
 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
-  if ((kind() == MethodRecognizer::kMathSin) ||
-      (kind() == MethodRecognizer::kMathCos)) {
+  if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 0;
     LocationSummary* summary =
@@ -4721,7 +4757,8 @@
 #endif
     return summary;
   }
-  // Sqrt.
+  ASSERT((kind() == MathUnaryInstr::kSqrt) ||
+         (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
@@ -4733,11 +4770,17 @@
 
 
 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (kind() == MethodRecognizer::kMathSqrt) {
+  if (kind() == MathUnaryInstr::kSqrt) {
     DRegister val = EvenDRegisterOf(locs()->in(0).fpu_reg());
     DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
     __ vsqrtd(result, val);
+  } else if (kind() == MathUnaryInstr::kDoubleSquare) {
+    DRegister val = EvenDRegisterOf(locs()->in(0).fpu_reg());
+    DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
+    __ vmuld(result, val, val);
   } else {
+    ASSERT((kind() == MathUnaryInstr::kSin) ||
+           (kind() == MathUnaryInstr::kCos));
 #if defined(ARM_FLOAT_ABI_HARD)
     __ CallRuntime(TargetFunction(), InputCount());
 #else
@@ -5444,13 +5487,6 @@
   Location index_loc = locs()->in(kIndexPos);
 
   if (length_loc.IsConstant() && index_loc.IsConstant()) {
-    // TODO(srdjan): remove this code once failures are fixed.
-    if ((Smi::Cast(length_loc.constant()).Value() >
-         Smi::Cast(index_loc.constant()).Value()) &&
-        (Smi::Cast(index_loc.constant()).Value() >= 0)) {
-      // This CheckArrayBoundInstr should have been eliminated.
-      return;
-    }
     ASSERT((Smi::Cast(length_loc.constant()).Value() <=
             Smi::Cast(index_loc.constant()).Value()) ||
            (Smi::Cast(index_loc.constant()).Value() < 0));
@@ -5767,8 +5803,8 @@
   __ SmiUntag(shift);
 
   // vshlq takes the shift value from low byte. Deopt if shift is
-  // outside of [0, 127].
-  __ CompareImmediate(shift, 127);
+  // outside of [0, 63].
+  __ CompareImmediate(shift, 63);
   __ b(deopt, GT);
   __ CompareImmediate(shift, 0);
   __ b(deopt, LT);
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index db122d2..bcec0ae 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -97,14 +97,85 @@
 }
 
 
+static Condition NegateCondition(Condition condition) {
+  switch (condition) {
+    case EQ: return NE;
+    case NE: return EQ;
+    case LT: return GE;
+    case LE: return GT;
+    case GT: return LE;
+    case GE: return LT;
+    case CC: return CS;
+    case LS: return HI;
+    case HI: return LS;
+    case CS: return CC;
+    default:
+      UNREACHABLE();
+      return EQ;
+  }
+}
+
+
+// Detect pattern when one value is zero and another is a power of 2.
+static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) {
+  return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) ||
+         (Utils::IsPowerOfTwo(v2) && (v1 == 0));
+}
+
+
 LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  comparison()->InitializeLocationSummary(opt);
+  return comparison()->locs();
 }
 
 
 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const Register result = locs()->out(0).reg();
+
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+
+  // Emit comparison code. This must not overwrite the result register.
+  BranchLabels labels = { NULL, NULL, NULL };
+  Condition true_condition = comparison()->EmitComparisonCode(compiler, labels);
+
+  const bool is_power_of_two_kind = IsPowerOfTwoKind(if_true_, if_false_);
+
+  intptr_t true_value = if_true_;
+  intptr_t false_value = if_false_;
+
+  if (is_power_of_two_kind) {
+    if (true_value == 0) {
+      // We need to have zero in result on true_condition.
+      true_condition = NegateCondition(true_condition);
+    }
+  } else {
+    if (true_value == 0) {
+      // Swap values so that false_value is zero.
+      intptr_t temp = true_value;
+      true_value = false_value;
+      false_value = temp;
+    } else {
+      true_condition = NegateCondition(true_condition);
+    }
+  }
+
+  __ cset(result, true_condition);
+
+  if (is_power_of_two_kind) {
+    const intptr_t shift =
+        Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
+    __ Lsl(result, result, shift + kSmiTagSize);
+  } else {
+    __ sub(result, result, Operand(1));
+    const int32_t val =
+        Smi::RawValue(true_value) - Smi::RawValue(false_value);
+    __ AndImmediate(result, result, val, PP);
+    if (false_value != 0) {
+      __ AddImmediate(result, result, Smi::RawValue(false_value), PP);
+    }
+  }
 }
 
 
@@ -202,6 +273,22 @@
 }
 
 
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 0;
+  return LocationSummary::Make(kNumInputs,
+                               Location::RequiresFpuRegister(),
+                               LocationSummary::kNoCall);
+}
+
+
+void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (!locs()->out(0).IsInvalid()) {
+    const VRegister dst = locs()->out(0).fpu_reg();
+    __ LoadDImmediate(dst, Double::Cast(value()).value(), PP);
+  }
+}
+
+
 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
@@ -261,50 +348,219 @@
 }
 
 
+static Condition TokenKindToSmiCondition(Token::Kind kind) {
+  switch (kind) {
+    case Token::kEQ: return EQ;
+    case Token::kNE: return NE;
+    case Token::kLT: return LT;
+    case Token::kGT: return GT;
+    case Token::kLTE: return LE;
+    case Token::kGTE: return GE;
+    default:
+      UNREACHABLE();
+      return VS;
+  }
+}
+
+
+static Condition FlipCondition(Condition condition) {
+  switch (condition) {
+    case EQ: return EQ;
+    case NE: return NE;
+    case LT: return GT;
+    case LE: return GE;
+    case GT: return LT;
+    case GE: return LE;
+    case CC: return HI;
+    case LS: return CS;
+    case HI: return CC;
+    case CS: return LS;
+    default:
+      UNREACHABLE();
+      return EQ;
+  }
+}
+
+
+static void EmitBranchOnCondition(FlowGraphCompiler* compiler,
+                                  Condition true_condition,
+                                  BranchLabels labels) {
+  if (labels.fall_through == labels.false_label) {
+    // If the next block is the false successor we will fall through to it.
+    __ b(labels.true_label, true_condition);
+  } else {
+    // If the next block is not the false successor we will branch to it.
+    Condition false_condition = NegateCondition(true_condition);
+    __ b(labels.false_label, false_condition);
+
+    // Fall through or jump to the true successor.
+    if (labels.fall_through != labels.true_label) {
+      __ b(labels.true_label);
+    }
+  }
+}
+
+
+static Condition EmitSmiComparisonOp(FlowGraphCompiler* compiler,
+                                     LocationSummary* locs,
+                                     Token::Kind kind) {
+  Location left = locs->in(0);
+  Location right = locs->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+
+  Condition true_condition = TokenKindToSmiCondition(kind);
+
+  if (left.IsConstant()) {
+    __ CompareObject(right.reg(), left.constant(), PP);
+    true_condition = FlipCondition(true_condition);
+  } else if (right.IsConstant()) {
+    __ CompareObject(left.reg(), right.constant(), PP);
+  } else {
+    __ CompareRegisters(left.reg(), right.reg());
+  }
+  return true_condition;
+}
+
+
 LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
+  const intptr_t kNumInputs = 2;
+  if (operation_cid() == kDoubleCid) {
+    const intptr_t kNumTemps =  0;
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresFpuRegister());
+    locs->set_in(1, Location::RequiresFpuRegister());
+    locs->set_out(0, Location::RequiresRegister());
+    return locs;
+  }
+  if (operation_cid() == kSmiCid) {
+    const intptr_t kNumTemps = 0;
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RegisterOrConstant(left()));
+    // Only one input can be a constant operand. The case of two constant
+    // operands should be handled by constant propagation.
+    // Only right can be a stack slot.
+    locs->set_in(1, locs->in(0).IsConstant()
+                        ? Location::RequiresRegister()
+                        : Location::RegisterOrConstant(right()));
+    locs->set_out(0, Location::RequiresRegister());
+    return locs;
+  }
+  UNREACHABLE();
   return NULL;
 }
 
 
+static Condition TokenKindToDoubleCondition(Token::Kind kind) {
+  switch (kind) {
+    case Token::kEQ: return EQ;
+    case Token::kNE: return NE;
+    case Token::kLT: return LT;
+    case Token::kGT: return GT;
+    case Token::kLTE: return LE;
+    case Token::kGTE: return GE;
+    default:
+      UNREACHABLE();
+      return VS;
+  }
+}
+
+
+static Condition EmitDoubleComparisonOp(FlowGraphCompiler* compiler,
+                                        LocationSummary* locs,
+                                        Token::Kind kind) {
+  VRegister left = locs->in(0).fpu_reg();
+  VRegister right = locs->in(1).fpu_reg();
+  __ fcmpd(left, right);
+  Condition true_condition = TokenKindToDoubleCondition(kind);
+  return true_condition;
+}
+
+
 Condition EqualityCompareInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                    BranchLabels labels) {
-  UNIMPLEMENTED();
-  return VS;
+  if (operation_cid() == kSmiCid) {
+    return EmitSmiComparisonOp(compiler, locs(), kind());
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    return EmitDoubleComparisonOp(compiler, locs(), kind());
+  }
 }
 
 
 void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  ASSERT((kind() == Token::kEQ) || (kind() == Token::kNE));
+
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+  Condition true_condition = EmitComparisonCode(compiler, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
+
+  // TODO(zra): instead of branching, use the csel instruction to get
+  // True or False into result.
+  Register result = locs()->out(0).reg();
+  Label done;
+  __ Bind(&is_false);
+  __ LoadObject(result, Bool::False(), PP);
+  __ b(&done);
+  __ Bind(&is_true);
+  __ LoadObject(result, Bool::True(), PP);
+  __ Bind(&done);
 }
 
 
 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                           BranchInstr* branch) {
-  UNIMPLEMENTED();
+  ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
+
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+  Condition true_condition = EmitComparisonCode(compiler, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
 LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RequiresRegister());
+  // Only one input can be a constant operand. The case of two constant
+  // operands should be handled by constant propagation.
+  locs->set_in(1, Location::RegisterOrConstant(right()));
+  return locs;
 }
 
 
 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                            BranchLabels labels) {
-  UNIMPLEMENTED();
-  return VS;
+  Register left = locs()->in(0).reg();
+  Location right = locs()->in(1);
+  if (right.IsConstant()) {
+    ASSERT(right.constant().IsSmi());
+    const int32_t imm =
+        reinterpret_cast<int64_t>(right.constant().raw());
+    __ TestImmediate(left, imm, PP);
+  } else {
+    __ tst(left, Operand(right.reg()));
+  }
+  Condition true_condition = (kind() == Token::kNE) ? NE : EQ;
+  return true_condition;
 }
 
+
 void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  // Never emitted outside of the BranchInstr.
+  UNREACHABLE();
 }
 
 
 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                   BranchInstr* branch) {
-  UNIMPLEMENTED();
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+  Condition true_condition = EmitComparisonCode(compiler, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
@@ -322,43 +578,125 @@
 
 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                             BranchLabels labels) {
-  UNIMPLEMENTED();
+  ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT));
+  Register val_reg = locs()->in(0).reg();
+  Register cid_reg = locs()->temp(0).reg();
+
+  Label* deopt = CanDeoptimize() ?
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+
+  const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
+  const ZoneGrowableArray<intptr_t>& data = cid_results();
+  ASSERT(data[0] == kSmiCid);
+  bool result = data[1] == true_result;
+  __ tsti(val_reg, kSmiTagMask);
+  __ b(result ? labels.true_label : labels.false_label, EQ);
+  __ LoadClassId(cid_reg, val_reg);
+
+  for (intptr_t i = 2; i < data.length(); i += 2) {
+    const intptr_t test_cid = data[i];
+    ASSERT(test_cid != kSmiCid);
+    result = data[i + 1] == true_result;
+    __ CompareImmediate(cid_reg, test_cid, PP);
+    __ b(result ? labels.true_label : labels.false_label, EQ);
+  }
+  // No match found, deoptimize or false.
+  if (deopt == NULL) {
+    Label* target = result ? labels.false_label : labels.true_label;
+    if (target != labels.fall_through) {
+      __ b(target);
+    }
+  } else {
+    __ b(deopt);
+  }
+  // Dummy result as the last instruction is a jump, any conditional
+  // branch using the result will therefore be skipped.
   return EQ;
 }
 
 
 void TestCidsInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                    BranchInstr* branch) {
-  UNIMPLEMENTED();
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+  EmitComparisonCode(compiler, labels);
 }
 
 
 void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register result_reg = locs()->out(0).reg();
+  Label is_true, is_false, done;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+  EmitComparisonCode(compiler, labels);
+  // TODO(zra): instead of branching, use the csel instruction to get
+  // True or False into result.
+  __ Bind(&is_false);
+  __ LoadObject(result_reg, Bool::False(), PP);
+  __ b(&done);
+  __ Bind(&is_true);
+  __ LoadObject(result_reg, Bool::True(), PP);
+  __ Bind(&done);
 }
 
 
 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  if (operation_cid() == kDoubleCid) {
+    LocationSummary* summary =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    summary->set_in(0, Location::RequiresFpuRegister());
+    summary->set_in(1, Location::RequiresFpuRegister());
+    summary->set_out(0, Location::RequiresRegister());
+    return summary;
+  }
+  ASSERT(operation_cid() == kSmiCid);
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RegisterOrConstant(left()));
+  // Only one input can be a constant operand. The case of two constant
+  // operands should be handled by constant propagation.
+  summary->set_in(1, summary->in(0).IsConstant()
+                         ? Location::RequiresRegister()
+                         : Location::RegisterOrConstant(right()));
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
 }
 
 
 Condition RelationalOpInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                 BranchLabels labels) {
-  UNIMPLEMENTED();
-  return VS;
+  if (operation_cid() == kSmiCid) {
+    return EmitSmiComparisonOp(compiler, locs(), kind());
+  } else {
+    UNIMPLEMENTED();
+    return VS;
+  }
 }
 
 
 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+  Condition true_condition = EmitComparisonCode(compiler, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
+  // TODO(zra): instead of branching, use the csel instruction to get
+  // True or False into result.
+  Register result = locs()->out(0).reg();
+  Label done;
+  __ Bind(&is_false);
+  __ LoadObject(result, Bool::False(), PP);
+  __ b(&done);
+  __ Bind(&is_true);
+  __ LoadObject(result, Bool::True(), PP);
+  __ Bind(&done);
 }
 
 
 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                        BranchInstr* branch) {
-  UNIMPLEMENTED();
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+  Condition true_condition = EmitComparisonCode(compiler, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
@@ -424,24 +762,45 @@
 
 
 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  // TODO(fschneider): Allow immediate operands for the char code.
+  return LocationSummary::Make(kNumInputs,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
 }
 
 
 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register char_code = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+  __ LoadImmediate(result,
+                   reinterpret_cast<uword>(Symbols::PredefinedAddress()), PP);
+  __ AddImmediate(
+      result, result, Symbols::kNullCharCodeSymbolOffset * kWordSize, PP);
+  __ Asr(TMP, char_code, kSmiTagShift);  // Untag to use scaled adress mode.
+  __ ldr(result, Address(result, TMP, UXTX, Address::Scaled));
 }
 
 
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  return LocationSummary::Make(kNumInputs,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
 }
 
 
 void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  ASSERT(cid_ == kOneByteStringCid);
+  Register str = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+  __ LoadFieldFromOffset(result, str, String::length_offset());
+  __ CompareImmediate(result, Smi::RawValue(1), PP);
+  __ LoadImmediate(TMP, Smi::RawValue(-1), PP);
+  __ ldr(TMP2, FieldAddress(str, OneByteString::data_offset()), kUnsignedByte);
+  __ csel(result, TMP, result, NE);
+  __ csel(result, TMP2, result, EQ);
+  __ SmiTag(result);
 }
 
 
@@ -506,25 +865,205 @@
 
 
 CompileType LoadIndexedInstr::ComputeType() const {
-  UNIMPLEMENTED();
-  return CompileType::Dynamic();
+  switch (class_id_) {
+    case kArrayCid:
+    case kImmutableArrayCid:
+      return CompileType::Dynamic();
+
+    case kTypedDataFloat32ArrayCid:
+    case kTypedDataFloat64ArrayCid:
+      return CompileType::FromCid(kDoubleCid);
+    case kTypedDataFloat32x4ArrayCid:
+      return CompileType::FromCid(kFloat32x4Cid);
+    case kTypedDataInt32x4ArrayCid:
+      return CompileType::FromCid(kInt32x4Cid);
+    case kTypedDataFloat64x2ArrayCid:
+      return CompileType::FromCid(kFloat64x2Cid);
+
+    case kTypedDataInt8ArrayCid:
+    case kTypedDataUint8ArrayCid:
+    case kTypedDataUint8ClampedArrayCid:
+    case kExternalTypedDataUint8ArrayCid:
+    case kExternalTypedDataUint8ClampedArrayCid:
+    case kTypedDataInt16ArrayCid:
+    case kTypedDataUint16ArrayCid:
+    case kOneByteStringCid:
+    case kTwoByteStringCid:
+    case kTypedDataInt32ArrayCid:
+    case kTypedDataUint32ArrayCid:
+      return CompileType::FromCid(kSmiCid);
+
+    default:
+      UNIMPLEMENTED();
+      return CompileType::Dynamic();
+  }
 }
 
 
 Representation LoadIndexedInstr::representation() const {
-  UNIMPLEMENTED();
-  return kTagged;
+  switch (class_id_) {
+    case kArrayCid:
+    case kImmutableArrayCid:
+    case kTypedDataInt8ArrayCid:
+    case kTypedDataUint8ArrayCid:
+    case kTypedDataUint8ClampedArrayCid:
+    case kExternalTypedDataUint8ArrayCid:
+    case kExternalTypedDataUint8ClampedArrayCid:
+    case kTypedDataInt16ArrayCid:
+    case kTypedDataUint16ArrayCid:
+    case kOneByteStringCid:
+    case kTwoByteStringCid:
+    case kTypedDataInt32ArrayCid:
+    case kTypedDataUint32ArrayCid:
+      return kTagged;
+    case kTypedDataFloat32ArrayCid:
+    case kTypedDataFloat64ArrayCid:
+      return kUnboxedDouble;
+    case kTypedDataInt32x4ArrayCid:
+      return kUnboxedInt32x4;
+    case kTypedDataFloat32x4ArrayCid:
+      return kUnboxedFloat32x4;
+    case kTypedDataFloat64x2ArrayCid:
+      return kUnboxedFloat64x2;
+    default:
+      UNIMPLEMENTED();
+      return kTagged;
+  }
 }
 
 
 LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RequiresRegister());
+  // The smi index is either untagged (element size == 1), or it is left smi
+  // tagged (for all element sizes > 1).
+  // TODO(regis): Revisit and see if the index can be immediate.
+  locs->set_in(1, Location::WritableRegister());
+  if ((representation() == kUnboxedDouble)    ||
+      (representation() == kUnboxedFloat32x4) ||
+      (representation() == kUnboxedInt32x4)   ||
+      (representation() == kUnboxedFloat64x2)) {
+    locs->set_out(0, Location::RequiresFpuRegister());
+  } else {
+    locs->set_out(0, Location::RequiresRegister());
+  }
+  return locs;
 }
 
 
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register array = locs()->in(0).reg();
+  Location index = locs()->in(1);
+
+  Address element_address(kNoRegister, 0);
+  ASSERT(index.IsRegister());  // TODO(regis): Revisit.
+  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
+  // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
+  // index is expected to be untagged before accessing.
+  ASSERT(kSmiTagShift == 1);
+  switch (index_scale()) {
+    case 1: {
+      __ SmiUntag(index.reg());
+      break;
+    }
+    case 2: {
+      break;
+    }
+    case 4: {
+      __ Lsl(index.reg(), index.reg(), 1);
+      break;
+    }
+    case 8: {
+      __ Lsl(index.reg(), index.reg(), 2);
+      break;
+    }
+    case 16: {
+      __ Lsl(index.reg(), index.reg(), 3);
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+
+  if (!IsExternal()) {
+    ASSERT(this->array()->definition()->representation() == kTagged);
+    __ AddImmediate(index.reg(), index.reg(),
+        FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag, PP);
+  }
+  element_address = Address(array, index.reg(), UXTX, Address::Unscaled);
+
+  if ((representation() == kUnboxedDouble)    ||
+      (representation() == kUnboxedMint)      ||
+      (representation() == kUnboxedFloat32x4) ||
+      (representation() == kUnboxedInt32x4)   ||
+      (representation() == kUnboxedFloat64x2)) {
+    const VRegister result = locs()->out(0).fpu_reg();
+    switch (class_id()) {
+      case kTypedDataInt32ArrayCid:
+      case kTypedDataUint32ArrayCid:
+        // TODO(zra): Add when we have simd.
+        UNIMPLEMENTED();
+        break;
+      case kTypedDataFloat32ArrayCid:
+        // Load single precision float.
+        // TODO(zra): Add when we add single precision floats.
+        UNIMPLEMENTED();
+        break;
+      case kTypedDataFloat64ArrayCid:
+        // Load double precision float.
+        __ fldrd(result, element_address);
+        break;
+      case kTypedDataFloat64x2ArrayCid:
+      case kTypedDataInt32x4ArrayCid:
+      case kTypedDataFloat32x4ArrayCid:
+        // TODO(zra): Add when we have simd.
+        UNIMPLEMENTED();
+        break;
+    }
+    return;
+  }
+
+  Register result = locs()->out(0).reg();
+  switch (class_id()) {
+    case kTypedDataInt8ArrayCid:
+      ASSERT(index_scale() == 1);
+      __ ldr(result, element_address, kByte);
+      __ SmiTag(result);
+      break;
+    case kTypedDataUint8ArrayCid:
+    case kTypedDataUint8ClampedArrayCid:
+    case kExternalTypedDataUint8ArrayCid:
+    case kExternalTypedDataUint8ClampedArrayCid:
+    case kOneByteStringCid:
+      ASSERT(index_scale() == 1);
+      __ ldr(result, element_address, kUnsignedByte);
+      __ SmiTag(result);
+      break;
+    case kTypedDataInt16ArrayCid:
+      __ ldr(result, element_address, kHalfword);
+      __ SmiTag(result);
+      break;
+    case kTypedDataUint16ArrayCid:
+    case kTwoByteStringCid:
+      __ ldr(result, element_address, kUnsignedHalfword);
+      __ SmiTag(result);
+      break;
+    case kTypedDataInt32ArrayCid:
+      __ ldr(result, element_address, kWord);
+      __ SmiTag(result);
+      break;
+    case kTypedDataUint32ArrayCid:
+      __ ldr(result, element_address, kUnsignedWord);
+      __ SmiTag(result);
+      break;
+    default:
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      __ ldr(result, element_address);
+      break;
+  }
 }
 
 
@@ -597,16 +1136,21 @@
       if (value()->IsSmiValue()) {
         locs->set_in(2, Location::WritableRegister());
       } else {
-        // TODO(zra): Implement when we add fpu loads and stores.
+        // TODO(zra): Implement when we add simd loads and stores.
         UNIMPLEMENTED();
       }
       break;
     case kTypedDataFloat32ArrayCid:
+      // TODO(zra): Implement when we add float store.
+      UNIMPLEMENTED();
+      break;
     case kTypedDataFloat64ArrayCid:  // TODO(srdjan): Support Float64 constants.
+      locs->set_in(2, Location::RequiresFpuRegister());
+      break;
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid:
     case kTypedDataFloat64x2ArrayCid:
-      // TODO(zra): Implement when we add fpu loads and stores.
+      // TODO(zra): Implement when we add simd loads and stores.
       UNIMPLEMENTED();
       break;
     default:
@@ -729,17 +1273,25 @@
         __ SmiUntag(value);
         __ str(value, element_address);
       } else {
-        // TODO(zra): Implement when we add fpu loads and stores.
+        // TODO(zra): Implement when we add simd loads and stores.
         UNIMPLEMENTED();
       }
       break;
     }
     case kTypedDataFloat32ArrayCid:
-    case kTypedDataFloat64ArrayCid:
+      // TODO(zra): Implement when we add float store.
+      UNIMPLEMENTED();
+      break;
+    case kTypedDataFloat64ArrayCid: {
+      VRegister in2 = locs()->in(2).fpu_reg();
+      __ add(index.reg(), index.reg(), Operand(array));
+      __ StoreDToOffset(in2, index.reg(), 0);
+      break;
+    }
     case kTypedDataFloat64x2ArrayCid:
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid: {
-      // TODO(zra): Implement when we add fpu loads and stores.
+      // TODO(zra): Implement when we add simd loads and stores.
       UNIMPLEMENTED();
       break;
     }
@@ -880,7 +1432,8 @@
           __ CompareImmediate(value_cid_reg, kTypedDataInt8ArrayCid, PP);
           // Could still be a regular array.
           __ b(&check_array, LT);
-          __ LoadFromOffset(temp_reg, value_reg, TypedData::length_offset());
+          __ LoadFieldFromOffset(
+              temp_reg, value_reg, TypedData::length_offset());
           __ ldr(TMP, field_length_operand);
           __ CompareRegisters(temp_reg, TMP);
           __ b(&length_compared);
@@ -1129,14 +1682,17 @@
 
   summary->set_in(0, Location::RequiresRegister());
   if (IsUnboxedStore() && opt) {
-    // TODO(zra): Implement when we add fpu loads and stores.
-    UNIMPLEMENTED();
+    summary->set_in(1, Location::RequiresFpuRegister());
+    summary->AddTemp(Location::RequiresRegister());
+    summary->AddTemp(Location::RequiresRegister());
   } else if (IsPotentialUnboxedStore()) {
       summary->set_in(1, ShouldEmitStoreBarrier()
           ? Location::WritableRegister()
           :  Location::RequiresRegister());
       summary->AddTemp(Location::RequiresRegister());
       summary->AddTemp(Location::RequiresRegister());
+      summary->AddTemp(opt ? Location::RequiresFpuRegister()
+                           : Location::FpuRegisterLocation(V1));
   } else {
     summary->set_in(1, ShouldEmitStoreBarrier()
                        ? Location::WritableRegister()
@@ -1152,12 +1708,64 @@
   Register instance_reg = locs()->in(0).reg();
 
   if (IsUnboxedStore() && compiler->is_optimizing()) {
-    UNIMPLEMENTED();
+    const VRegister value = locs()->in(1).fpu_reg();
+    const Register temp = locs()->temp(0).reg();
+    const Register temp2 = locs()->temp(1).reg();
+    const intptr_t cid = field().UnboxedFieldCid();
+
+    if (is_initialization_) {
+      const Class* cls = NULL;
+      switch (cid) {
+        case kDoubleCid:
+          cls = &compiler->double_class();
+          break;
+        // TODO(zra): Implement these when we add fpu loads and stores.
+        case kFloat32x4Cid:
+        case kFloat64x2Cid:
+          UNIMPLEMENTED();
+          break;
+        default:
+          UNREACHABLE();
+      }
+
+      StoreInstanceFieldSlowPath* slow_path =
+          new StoreInstanceFieldSlowPath(this, *cls);
+      compiler->AddSlowPathCode(slow_path);
+
+      __ TryAllocate(*cls,
+                     slow_path->entry_label(),
+                     temp,
+                     temp2,
+                     PP);
+      __ Bind(slow_path->exit_label());
+      __ mov(temp2, temp);
+      __ StoreIntoObject(instance_reg,
+                         FieldAddress(instance_reg, offset_in_bytes_),
+                         temp2);
+    } else {
+      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_);
+    }
+    switch (cid) {
+      case kDoubleCid:
+        __ Comment("UnboxedDoubleStoreInstanceFieldInstr");
+        __ StoreDFieldToOffset(value, temp, Double::value_offset());
+        break;
+      case kFloat32x4Cid:
+      case kFloat64x2Cid:
+        UNIMPLEMENTED();
+        break;
+      default:
+        UNREACHABLE();
+    }
+
+    return;
   }
 
   if (IsPotentialUnboxedStore()) {
+    const Register value_reg = locs()->in(1).reg();
     const Register temp = locs()->temp(0).reg();
     const Register temp2 = locs()->temp(1).reg();
+    const VRegister fpu_temp = locs()->temp(2).fpu_reg();
 
     Label store_pointer;
     Label store_double;
@@ -1195,12 +1803,34 @@
         locs()->live_registers()->Add(locs()->in(1));
     }
 
-    // TODO(zra): Implement these when we add fpu loads and stores.
     {
       __ Bind(&store_double);
-      __ hlt(0);  // Unimplemented.
+      Label copy_double;
+      StoreInstanceFieldSlowPath* slow_path =
+          new StoreInstanceFieldSlowPath(this, compiler->double_class());
+      compiler->AddSlowPathCode(slow_path);
+
+      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_);
+      __ CompareObject(temp, Object::null_object(), PP);
+      __ b(&copy_double, NE);
+
+      __ TryAllocate(compiler->double_class(),
+                     slow_path->entry_label(),
+                     temp,
+                     temp2,
+                     PP);
+      __ Bind(slow_path->exit_label());
+      __ mov(temp2, temp);
+      __ StoreIntoObject(instance_reg,
+                         FieldAddress(instance_reg, offset_in_bytes_),
+                         temp2);
+      __ Bind(&copy_double);
+      __ LoadDFieldFromOffset(fpu_temp, value_reg, Double::value_offset());
+      __ StoreDFieldToOffset(fpu_temp, temp, Double::value_offset());
+      __ b(&skip_store);
     }
 
+    // TODO(zra): Implement these when we add simd loads and stores.
     {
       __ Bind(&store_float32x4);
       __ hlt(0);  // Unimplemented.
@@ -1284,13 +1914,29 @@
 
 
 LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 3;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  summary->set_in(0, Location::RegisterLocation(R0));
+  summary->set_in(1, Location::RegisterLocation(R2));
+  summary->set_in(2, Location::RegisterLocation(R1));
+  summary->set_out(0, Location::RegisterLocation(R0));
+  return summary;
 }
 
 
 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  ASSERT(locs()->in(0).reg() == R0);  // Value.
+  ASSERT(locs()->in(1).reg() == R2);  // Instantiator.
+  ASSERT(locs()->in(2).reg() == R1);  // Instantiator type arguments.
+
+  compiler->GenerateInstanceOf(token_pos(),
+                               deopt_id(),
+                               type(),
+                               negate_result(),
+                               locs());
+  ASSERT(locs()->out(0).reg() == R0);
 }
 
 
@@ -1318,6 +1964,38 @@
 }
 
 
+class BoxDoubleSlowPath : public SlowPathCode {
+ public:
+  explicit BoxDoubleSlowPath(Instruction* instruction)
+      : instruction_(instruction) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    __ Comment("BoxDoubleSlowPath");
+    __ Bind(entry_label());
+    const Class& double_class = compiler->double_class();
+    const Code& stub =
+        Code::Handle(StubCode::GetAllocationStubForClass(double_class));
+    const ExternalLabel label(double_class.ToCString(), stub.EntryPoint());
+
+    LocationSummary* locs = instruction_->locs();
+    locs->live_registers()->Remove(locs->out(0));
+
+    compiler->SaveLiveRegisters(locs);
+    compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
+                           &label,
+                           PcDescriptors::kOther,
+                           locs);
+    __ mov(locs->out(0).reg(), R0);
+    compiler->RestoreLiveRegisters(locs);
+
+    __ b(exit_label());
+  }
+
+ private:
+  Instruction* instruction_;
+};
+
+
 LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
@@ -1331,9 +2009,10 @@
   locs->set_in(0, Location::RequiresRegister());
 
   if (IsUnboxedLoad() && opt) {
-    // TODO(zra): Implement when we add fpu loads and stores.
-    UNIMPLEMENTED();
+    locs->AddTemp(Location::RequiresRegister());
   } else if (IsPotentialUnboxedLoad()) {
+    locs->AddTemp(opt ? Location::RequiresFpuRegister()
+                      : Location::FpuRegisterLocation(V1));
     locs->AddTemp(Location::RequiresRegister());
   }
   locs->set_out(0, Location::RequiresRegister());
@@ -1344,13 +2023,30 @@
 void LoadFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register instance_reg = locs()->in(0).reg();
   if (IsUnboxedLoad() && compiler->is_optimizing()) {
-    UNIMPLEMENTED();
+    const VRegister result = locs()->out(0).fpu_reg();
+    const Register temp = locs()->temp(0).reg();
+    __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
+    const intptr_t cid = field()->UnboxedFieldCid();
+    switch (cid) {
+      case kDoubleCid:
+        __ Comment("UnboxedDoubleLoadFieldInstr");
+        __ LoadDFieldFromOffset(result, temp, Double::value_offset());
+        break;
+      case kFloat32x4Cid:
+      case kFloat64x2Cid:
+        UNIMPLEMENTED();
+        break;
+      default:
+        UNREACHABLE();
+    }
+    return;
   }
 
   Label done;
   Register result_reg = locs()->out(0).reg();
   if (IsPotentialUnboxedLoad()) {
-    const Register temp = locs()->temp(0).reg();
+    const Register temp = locs()->temp(1).reg();
+    const VRegister value = locs()->temp(0).fpu_reg();
 
     Label load_pointer;
     Label load_double;
@@ -1386,12 +2082,24 @@
       locs()->live_registers()->Add(locs()->in(0));
     }
 
-    // TODO(zra): Implement these when we add fpu loads and stores.
     {
       __ Bind(&load_double);
-      __ hlt(0);  // Unimplemented.
+      BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this);
+      compiler->AddSlowPathCode(slow_path);
+
+      __ TryAllocate(compiler->double_class(),
+                     slow_path->entry_label(),
+                     result_reg,
+                     temp,
+                     PP);
+      __ Bind(slow_path->exit_label());
+      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
+      __ LoadDFieldFromOffset(value, temp, Double::value_offset());
+      __ StoreDFieldToOffset(value, result_reg, Double::value_offset());
+      __ b(&done);
     }
 
+    // TODO(zra): Implement these when we add simd loads and stores.
     {
       __ Bind(&load_float32x4);
       __ hlt(0);  // Unimplemented.
@@ -1404,20 +2112,39 @@
 
     __ Bind(&load_pointer);
   }
-  __ LoadFromOffset(
-      result_reg, instance_reg, offset_in_bytes() - kHeapObjectTag);
+  __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes());
   __ Bind(&done);
 }
 
 
 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(R0));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
 }
 
 
 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register instantiator_reg = locs()->in(0).reg();
+  Register result_reg = locs()->out(0).reg();
+
+  // 'instantiator_reg' is the instantiator TypeArguments object (or null).
+  // A runtime call to instantiate the type is required.
+  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ PushObject(type(), PP);
+  __ Push(instantiator_reg);  // Push instantiator type arguments.
+  compiler->GenerateRuntimeCall(token_pos(),
+                                deopt_id(),
+                                kInstantiateTypeRuntimeEntry,
+                                2,
+                                locs());
+  __ Drop(2);  // Drop instantiator and uninstantiated type.
+  __ Pop(result_reg);  // Pop instantiated type.
+  ASSERT(instantiator_reg == result_reg);
 }
 
 
@@ -1668,47 +2395,537 @@
 }
 
 
+static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
+                             BinarySmiOpInstr* shift_left) {
+  const bool is_truncating = shift_left->is_truncating();
+  const LocationSummary& locs = *shift_left->locs();
+  Register left = locs.in(0).reg();
+  Register result = locs.out(0).reg();
+  Label* deopt = shift_left->CanDeoptimize() ?
+      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
+      : NULL;
+  if (locs.in(1).IsConstant()) {
+    const Object& constant = locs.in(1).constant();
+    ASSERT(constant.IsSmi());
+    // Immediate shift operation takes 6 bits for the count.
+    const intptr_t kCountLimit = 0x3F;
+    const intptr_t value = Smi::Cast(constant).Value();
+    if (value == 0) {
+      __ mov(result, left);
+    } else if ((value < 0) || (value >= kCountLimit)) {
+      // This condition may not be known earlier in some cases because
+      // of constant propagation, inlining, etc.
+      if ((value >= kCountLimit) && is_truncating) {
+        __ mov(result, ZR);
+      } else {
+        // Result is Mint or exception.
+        __ b(deopt);
+      }
+    } else {
+      if (!is_truncating) {
+        // Check for overflow (preserve left).
+        __ Lsl(TMP, left, value);
+        __ cmp(left, Operand(TMP, ASR, value));
+        __ b(deopt, NE);  // Overflow.
+      }
+      // Shift for result now we know there is no overflow.
+      __ Lsl(result, left, value);
+    }
+    return;
+  }
+
+  // Right (locs.in(1)) is not constant.
+  Register right = locs.in(1).reg();
+  Range* right_range = shift_left->right()->definition()->range();
+  if (shift_left->left()->BindsToConstant() && !is_truncating) {
+    // TODO(srdjan): Implement code below for is_truncating().
+    // If left is constant, we know the maximal allowed size for right.
+    const Object& obj = shift_left->left()->BoundConstant();
+    if (obj.IsSmi()) {
+      const intptr_t left_int = Smi::Cast(obj).Value();
+      if (left_int == 0) {
+        __ CompareRegisters(right, ZR);
+        __ b(deopt, MI);
+        __ mov(result, ZR);
+        return;
+      }
+      const intptr_t max_right = kSmiBits - Utils::HighestBit(left_int);
+      const bool right_needs_check =
+          (right_range == NULL) ||
+          !right_range->IsWithin(0, max_right - 1);
+      if (right_needs_check) {
+        __ CompareImmediate(right,
+            reinterpret_cast<int64_t>(Smi::New(max_right)), PP);
+        __ b(deopt, CS);
+      }
+      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      __ lslv(result, left, TMP);
+    }
+    return;
+  }
+
+  const bool right_needs_check =
+      (right_range == NULL) || !right_range->IsWithin(0, (Smi::kBits - 1));
+  if (is_truncating) {
+    if (right_needs_check) {
+      const bool right_may_be_negative =
+          (right_range == NULL) ||
+          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+      if (right_may_be_negative) {
+        ASSERT(shift_left->CanDeoptimize());
+        __ CompareRegisters(right, ZR);
+        __ b(deopt, MI);
+      }
+
+      __ CompareImmediate(
+          right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)), PP);
+      __ csel(result, ZR, result, CS);
+      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      __ lslv(TMP, left, TMP);
+      __ csel(result, TMP, result, CC);
+    } else {
+      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      __ lslv(result, left, TMP);
+    }
+  } else {
+    if (right_needs_check) {
+      ASSERT(shift_left->CanDeoptimize());
+      __ CompareImmediate(
+          right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)), PP);
+      __ b(deopt, CS);
+    }
+    // Left is not a constant.
+    // Check if count too large for handling it inlined.
+    __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into IP.
+    // Overflow test (preserve left, right, and IP);
+    Register temp = locs.temp(0).reg();
+    __ lslv(temp, left, TMP);
+    __ asrv(TMP2, temp, TMP);
+    __ CompareRegisters(left, TMP2);
+    __ b(deopt, NE);  // Overflow.
+    // Shift for result now we know there is no overflow.
+    __ lslv(result, left, TMP);
+  }
+}
+
+
 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  if (op_kind() == Token::kTRUNCDIV) {
+    summary->set_in(0, Location::RequiresRegister());
+    if (RightIsPowerOfTwoConstant()) {
+      ConstantInstr* right_constant = right()->definition()->AsConstant();
+      summary->set_in(1, Location::Constant(right_constant->value()));
+    } else {
+      summary->set_in(1, Location::RequiresRegister());
+    }
+    summary->set_out(0, Location::RequiresRegister());
+    return summary;
+  }
+  if (op_kind() == Token::kMOD) {
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_in(1, Location::RequiresRegister());
+    summary->set_out(0, Location::RequiresRegister());
+    return summary;
+  }
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  if (((op_kind() == Token::kSHL) && !is_truncating()) ||
+      (op_kind() == Token::kSHR)) {
+    summary->AddTemp(Location::RequiresRegister());
+  }
+  // We make use of 3-operand instructions by not requiring result register
+  // to be identical to first input register as on Intel.
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
 }
 
 
 void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  if (op_kind() == Token::kSHL) {
+    EmitSmiShiftLeft(compiler, this);
+    return;
+  }
+
+  ASSERT(!is_truncating());
+  const Register left = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+  Label* deopt = NULL;
+  if (CanDeoptimize()) {
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+  }
+
+  if (locs()->in(1).IsConstant()) {
+    const Object& constant = locs()->in(1).constant();
+    ASSERT(constant.IsSmi());
+    int64_t imm = reinterpret_cast<int64_t>(constant.raw());
+    switch (op_kind()) {
+      case Token::kSUB: {
+        imm = -imm;  // TODO(regis): What if deopt != NULL && imm == 0x80000000?
+        // Fall through.
+      }
+      case Token::kADD: {
+        if (deopt == NULL) {
+          __ AddImmediate(result, left, imm, PP);
+        } else {
+          __ AddImmediateSetFlags(result, left, imm, PP);
+          __ b(deopt, VS);        }
+        break;
+      }
+      case Token::kMUL: {
+        // Keep left value tagged and untag right value.
+        const intptr_t value = Smi::Cast(constant).Value();
+        if (deopt == NULL) {
+          if (value == 2) {
+            __ Lsl(result, left, 1);
+          } else {
+            __ LoadImmediate(TMP, value, PP);
+            __ mul(result, left, TMP);
+          }
+        } else {
+          if (value == 2) {
+            __ Asr(TMP, left, 63);  // TMP = sign of left.
+            __ Lsl(result, left, 1);
+            // TMP: result bits 32..63.
+            __ cmp(TMP, Operand(result, ASR, 63));
+            __ b(deopt, NE);
+          } else {
+            __ LoadImmediate(TMP, value, PP);
+            __ mul(result, left, TMP);
+            __ smulh(TMP, left, TMP);
+            // TMP: result bits 64..127.
+            __ cmp(TMP, Operand(result, ASR, 63));
+            __ b(deopt, NE);
+          }
+        }
+        break;
+      }
+      case Token::kTRUNCDIV: {
+        const intptr_t value = Smi::Cast(constant).Value();
+        if (value == 1) {
+          __ mov(result, left);
+          break;
+        } else if (value == -1) {
+          // Check the corner case of dividing the 'MIN_SMI' with -1, in which
+          // case we cannot negate the result.
+          __ CompareImmediate(left, 0x8000000000000000LL, kNoPP);
+          __ b(deopt, EQ);
+          __ sub(result, ZR, Operand(left));
+          break;
+        }
+        ASSERT(Utils::IsPowerOfTwo(Utils::Abs(value)));
+        const intptr_t shift_count =
+            Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize;
+        ASSERT(kSmiTagSize == 1);
+        __ Asr(TMP, left, 63);
+        ASSERT(shift_count > 1);  // 1, -1 case handled above.
+        const Register temp = TMP2;
+        __ add(temp, left, Operand(TMP, LSR, 64 - shift_count));
+        ASSERT(shift_count > 0);
+        __ Asr(result, temp, shift_count);
+        if (value < 0) {
+          __ sub(result, ZR, Operand(result));
+        }
+        __ SmiTag(result);
+        break;
+      }
+      case Token::kBIT_AND:
+        // No overflow check.
+        __ AndImmediate(result, left, imm, PP);
+        break;
+      case Token::kBIT_OR:
+        // No overflow check.
+        __ OrImmediate(result, left, imm, PP);
+        break;
+      case Token::kBIT_XOR:
+        // No overflow check.
+        __ XorImmediate(result, left, imm, PP);
+        break;
+      case Token::kSHR: {
+        // Asr operation masks the count to 6 bits.
+        const intptr_t kCountLimit = 0x3F;
+        intptr_t value = Smi::Cast(constant).Value();
+
+        if (value == 0) {
+          // TODO(vegorov): should be handled outside.
+          __ mov(result, left);
+          break;
+        } else if (value < 0) {
+          // TODO(vegorov): should be handled outside.
+          __ b(deopt);
+          break;
+        }
+
+        value = value + kSmiTagSize;
+        if (value >= kCountLimit) {
+          value = kCountLimit;
+        }
+
+        __ Asr(result, left, value);
+        __ SmiTag(result);
+        break;
+      }
+      default:
+        UNREACHABLE();
+        break;
+    }
+    return;
+  }
+
+  Register right = locs()->in(1).reg();
+  Range* right_range = this->right()->definition()->range();
+  switch (op_kind()) {
+    case Token::kADD: {
+      if (deopt == NULL) {
+        __ add(result, left, Operand(right));
+      } else {
+        __ adds(result, left, Operand(right));
+        __ b(deopt, VS);
+      }
+      break;
+    }
+    case Token::kSUB: {
+      if (deopt == NULL) {
+        __ sub(result, left, Operand(right));
+      } else {
+        __ subs(result, left, Operand(right));
+        __ b(deopt, VS);
+      }
+      break;
+    }
+    case Token::kMUL: {
+      __ Asr(TMP, left, kSmiTagSize);  // SmiUntag left into TMP.
+      if (deopt == NULL) {
+        __ mul(result, TMP, right);
+      } else {
+          __ mul(result, TMP, right);
+          __ smulh(TMP, TMP, right);
+          // TMP: result bits 64..127.
+          __ cmp(TMP, Operand(result, ASR, 63));
+          __ b(deopt, NE);
+      }
+      break;
+    }
+    case Token::kBIT_AND: {
+      // No overflow check.
+      __ and_(result, left, Operand(right));
+      break;
+    }
+    case Token::kBIT_OR: {
+      // No overflow check.
+      __ orr(result, left, Operand(right));
+      break;
+    }
+    case Token::kBIT_XOR: {
+      // No overflow check.
+      __ eor(result, left, Operand(right));
+      break;
+    }
+    case Token::kTRUNCDIV: {
+      if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
+        // Handle divide by zero in runtime.
+        __ CompareRegisters(right, ZR);
+        __ b(deopt, EQ);
+      }
+      const Register temp = TMP2;
+      __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
+      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into IP.
+
+      __ sdiv(result, temp, TMP);
+
+      // Check the corner case of dividing the 'MIN_SMI' with -1, in which
+      // case we cannot tag the result.
+      __ CompareImmediate(result, 0x4000000000000000LL, kNoPP);
+      __ b(deopt, EQ);
+      __ SmiTag(result);
+      break;
+    }
+    case Token::kMOD: {
+      if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
+        // Handle divide by zero in runtime.
+        __ CompareRegisters(right, ZR);
+        __ b(deopt, EQ);
+      }
+      const Register temp = TMP2;
+      __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
+      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into IP.
+
+      __ sdiv(result, temp, TMP);
+
+      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ msub(result, TMP, result, temp);  // result <- left - right * result
+      __ SmiTag(result);
+      //  res = left % right;
+      //  if (res < 0) {
+      //    if (right < 0) {
+      //      res = res - right;
+      //    } else {
+      //      res = res + right;
+      //    }
+      //  }
+      Label done;
+      __ CompareRegisters(result, ZR);
+      __ b(&done, GE);
+      // Result is negative, adjust it.
+      __ CompareRegisters(right, ZR);
+      __ sub(TMP, result, Operand(right));
+      __ add(result, result, Operand(right));
+      __ csel(result, TMP, result, LT);
+      __ Bind(&done);
+      break;
+    }
+    case Token::kSHR: {
+      if (CanDeoptimize()) {
+        __ CompareRegisters(right, ZR);
+        __ b(deopt, LT);
+      }
+      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      // sarl operation masks the count to 6 bits.
+      const intptr_t kCountLimit = 0x3F;
+      if ((right_range == NULL) ||
+          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+        __ LoadImmediate(TMP2, kCountLimit, PP);
+        __ CompareRegisters(TMP, TMP2);
+        __ csel(TMP, TMP2, TMP, GT);
+      }
+      Register temp = locs()->temp(0).reg();
+      __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
+      __ Asr(result, temp, TMP);
+      __ SmiTag(result);
+      break;
+    }
+    case Token::kDIV: {
+      // Dispatches to 'Double./'.
+      // TODO(srdjan): Implement as conversion to double and double division.
+      UNREACHABLE();
+      break;
+    }
+    case Token::kOR:
+    case Token::kAND: {
+      // Flow graph builder has dissected this operation to guarantee correct
+      // behavior (short-circuit evaluation).
+      UNREACHABLE();
+      break;
+    }
+    default:
+      UNREACHABLE();
+      break;
+  }
 }
 
 
 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  intptr_t left_cid = left()->Type()->ToCid();
+  intptr_t right_cid = right()->Type()->ToCid();
+  ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+    new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  return summary;
 }
 
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                        ICData::kDeoptBinaryDoubleOp);
+  intptr_t left_cid = left()->Type()->ToCid();
+  intptr_t right_cid = right()->Type()->ToCid();
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  if (left_cid == kSmiCid) {
+    __ tsti(right, kSmiTagMask);
+  } else if (right_cid == kSmiCid) {
+    __ tsti(left, kSmiTagMask);
+  } else {
+    __ orr(TMP, left, Operand(right));
+    __ tsti(TMP, kSmiTagMask);
+  }
+  __ b(deopt, EQ);
 }
 
 
 LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs,
+                          kNumTemps,
+                          LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_temp(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
 }
 
 
 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this);
+  compiler->AddSlowPathCode(slow_path);
+
+  const Register out_reg = locs()->out(0).reg();
+  const VRegister value = locs()->in(0).fpu_reg();
+
+  __ TryAllocate(compiler->double_class(),
+                 slow_path->entry_label(),
+                 out_reg,
+                 locs()->temp(0).reg(),
+                 PP);
+  __ Bind(slow_path->exit_label());
+  __ StoreDFieldToOffset(value, out_reg, Double::value_offset());
 }
 
 
 LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  CompileType* value_type = value()->Type();
+  const intptr_t value_cid = value_type->ToCid();
+  const Register value = locs()->in(0).reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  if (value_cid == kDoubleCid) {
+    __ LoadDFieldFromOffset(result, value, Double::value_offset());
+  } else if (value_cid == kSmiCid) {
+    __ Asr(TMP, value, kSmiTagSize);  // Untag input before conversion.
+    __ scvtfd(result, TMP);
+  } else {
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptBinaryDoubleOp);
+    if (value_type->is_nullable() &&
+        (value_type->ToNullableCid() == kDoubleCid)) {
+      __ CompareObject(value, Object::null_object(), PP);
+      __ b(deopt, EQ);
+      // It must be double now.
+      __ LoadDFieldFromOffset(result, value, Double::value_offset());
+    } else {
+      Label is_smi, done;
+      __ tsti(value, kSmiTagMask);
+      __ b(&is_smi, EQ);
+      __ CompareClassId(value, kDoubleCid);
+      __ b(deopt, NE);
+      __ LoadDFieldFromOffset(result, value, Double::value_offset());
+      __ b(&done);
+      __ Bind(&is_smi);
+      __ Asr(TMP, value, kSmiTagSize);  // Copy and untag.
+      __ scvtfd(result, TMP);
+      __ Bind(&done);
+    }
+  }
 }
 
 
@@ -1779,13 +2996,28 @@
 
 
 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister left = locs()->in(0).fpu_reg();
+  const VRegister right = locs()->in(1).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+  switch (op_kind()) {
+    case Token::kADD: __ faddd(result, left, right); break;
+    case Token::kSUB: __ fsubd(result, left, right); break;
+    case Token::kMUL: __ fmuld(result, left, right); break;
+    case Token::kDIV: __ fdivd(result, left, right); break;
+    default: UNREACHABLE();
+  }
 }
 
 
@@ -2147,13 +3379,36 @@
 
 
 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  // We make use of 3-operand instructions by not requiring result register
+  // to be identical to first input register as on Intel.
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
 }
 
 
 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register value = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+  switch (op_kind()) {
+    case Token::kNEGATE: {
+      Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
+      __ subs(result, ZR, Operand(value));
+      __ b(deopt, VS);
+      break;
+    }
+    case Token::kBIT_NOT:
+      __ mvn(result, value);
+      // Remove inverted smi-tag.
+      __ andi(result, result, ~kSmiTagMask);
+      break;
+    default:
+      UNREACHABLE();
+  }
 }
 
 
@@ -2246,13 +3501,51 @@
 
 
 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  // Only use this instruction in optimized code.
+  ASSERT(opt);
+  const intptr_t kNumInputs = 1;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  if (representation() == kUnboxedDouble) {
+    if (index() == 0) {
+      summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
+                                        Location::Any()));
+    } else {
+      ASSERT(index() == 1);
+      summary->set_in(0, Location::Pair(Location::Any(),
+                                        Location::RequiresFpuRegister()));
+    }
+    summary->set_out(0, Location::RequiresFpuRegister());
+  } else {
+    ASSERT(representation() == kTagged);
+    if (index() == 0) {
+      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                        Location::Any()));
+    } else {
+      ASSERT(index() == 1);
+      summary->set_in(0, Location::Pair(Location::Any(),
+                                        Location::RequiresRegister()));
+    }
+    summary->set_out(0, Location::RequiresRegister());
+  }
+  return summary;
 }
 
 
 void ExtractNthOutputInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  ASSERT(locs()->in(0).IsPairLocation());
+  PairLocation* pair = locs()->in(0).AsPairLocation();
+  Location in_loc = pair->At(index());
+  if (representation() == kUnboxedDouble) {
+    VRegister out = locs()->out(0).fpu_reg();
+    VRegister in = in_loc.fpu_reg();
+    __ fmovdd(out, in);
+  } else {
+    ASSERT(representation() == kTagged);
+    Register out = locs()->out(0).reg();
+    Register in = in_loc.reg();
+    __ mov(out, in);
+  }
 }
 
 
@@ -2269,13 +3562,45 @@
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
     bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  return MakeCallSummary();
 }
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
+  if (ic_data().NumberOfChecks() == 0) {
+    __ b(deopt);
+    return;
+  }
+  ASSERT(ic_data().NumArgsTested() == 1);
+  if (!with_checks()) {
+    ASSERT(ic_data().HasOneTarget());
+    const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
+    compiler->GenerateStaticCall(deopt_id(),
+                                 instance_call()->token_pos(),
+                                 target,
+                                 instance_call()->ArgumentCount(),
+                                 instance_call()->argument_names(),
+                                 locs());
+    return;
+  }
+
+  // Load receiver into R0.
+  __ LoadFromOffset(
+      R0, SP, (instance_call()->ArgumentCount() - 1) * kWordSize);
+
+  LoadValueCid(compiler, R2, R0,
+               (ic_data().GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
+
+  compiler->EmitTestAndCall(ic_data(),
+                            R2,  // Class id register.
+                            instance_call()->ArgumentCount(),
+                            instance_call()->argument_names(),
+                            deopt,
+                            deopt_id(),
+                            instance_call()->token_pos(),
+                            locs());
 }
 
 
@@ -2293,35 +3618,127 @@
 
 
 LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  if (!IsNullCheck()) {
+    summary->AddTemp(Location::RequiresRegister());
+  }
+  return summary;
 }
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ?
+      ICData::kDeoptHoistedCheckClass : ICData::kDeoptCheckClass;
+  if (IsNullCheck()) {
+    Label* deopt = compiler->AddDeoptStub(deopt_id(), deopt_reason);
+    __ CompareObject(locs()->in(0).reg(), Object::null_object(), PP);
+    __ b(deopt, EQ);
+    return;
+  }
+
+  ASSERT((unary_checks().GetReceiverClassIdAt(0) != kSmiCid) ||
+         (unary_checks().NumberOfChecks() > 1));
+  Register value = locs()->in(0).reg();
+  Register temp = locs()->temp(0).reg();
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), deopt_reason);
+  Label is_ok;
+  intptr_t cix = 0;
+  if (unary_checks().GetReceiverClassIdAt(cix) == kSmiCid) {
+    __ tsti(value, kSmiTagMask);
+    __ b(&is_ok, EQ);
+    cix++;  // Skip first check.
+  } else {
+    __ tsti(value, kSmiTagMask);
+    __ b(deopt, EQ);
+  }
+  __ LoadClassId(temp, value);
+  const intptr_t num_checks = unary_checks().NumberOfChecks();
+  for (intptr_t i = cix; i < num_checks; i++) {
+    ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
+    __ CompareImmediate(temp, unary_checks().GetReceiverClassIdAt(i), PP);
+    if (i == (num_checks - 1)) {
+      __ b(deopt, NE);
+    } else {
+      __ b(&is_ok, EQ);
+    }
+  }
+  __ Bind(&is_ok);
 }
 
 
 LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  return summary;
 }
 
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register value = locs()->in(0).reg();
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi);
+  __ tsti(value, kSmiTagMask);
+  __ b(deopt, NE);
 }
 
 
 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
+  locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
+  return locs;
 }
 
 
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                        ICData::kDeoptCheckArrayBound);
+
+  Location length_loc = locs()->in(kLengthPos);
+  Location index_loc = locs()->in(kIndexPos);
+
+  if (length_loc.IsConstant() && index_loc.IsConstant()) {
+    // TODO(srdjan): remove this code once failures are fixed.
+    if ((Smi::Cast(length_loc.constant()).Value() >
+         Smi::Cast(index_loc.constant()).Value()) &&
+        (Smi::Cast(index_loc.constant()).Value() >= 0)) {
+      // This CheckArrayBoundInstr should have been eliminated.
+      return;
+    }
+    ASSERT((Smi::Cast(length_loc.constant()).Value() <=
+            Smi::Cast(index_loc.constant()).Value()) ||
+           (Smi::Cast(index_loc.constant()).Value() < 0));
+    // Unconditionally deoptimize for constant bounds checks because they
+    // only occur only when index is out-of-bounds.
+    __ b(deopt);
+    return;
+  }
+
+  if (index_loc.IsConstant()) {
+    Register length = length_loc.reg();
+    const Smi& index = Smi::Cast(index_loc.constant());
+    __ CompareImmediate(length, reinterpret_cast<int64_t>(index.raw()), PP);
+    __ b(deopt, LS);
+  } else if (length_loc.IsConstant()) {
+    const Smi& length = Smi::Cast(length_loc.constant());
+    Register index = index_loc.reg();
+    __ CompareImmediate(index, reinterpret_cast<int64_t>(length.raw()), PP);
+    __ b(deopt, CS);
+  } else {
+    Register length = length_loc.reg();
+    Register index = index_loc.reg();
+    __ CompareRegisters(index, length);
+    __ b(deopt, CS);
+  }
 }
 
 
@@ -2477,44 +3894,6 @@
 }
 
 
-static Condition NegateCondition(Condition condition) {
-  switch (condition) {
-    case EQ: return NE;
-    case NE: return EQ;
-    case LT: return GE;
-    case LE: return GT;
-    case GT: return LE;
-    case GE: return LT;
-    case CC: return CS;
-    case LS: return HI;
-    case HI: return LS;
-    case CS: return CC;
-    default:
-      UNREACHABLE();
-      return EQ;
-  }
-}
-
-
-static void EmitBranchOnCondition(FlowGraphCompiler* compiler,
-                                  Condition true_condition,
-                                  BranchLabels labels) {
-  if (labels.fall_through == labels.false_label) {
-    // If the next block is the false successor we will fall through to it.
-    __ b(labels.true_label, true_condition);
-  } else {
-    // If the next block is not the false successor we will branch to it.
-    Condition false_condition = NegateCondition(true_condition);
-    __ b(labels.false_label, false_condition);
-
-    // Fall through or jump to the true successor.
-    if (labels.fall_through != labels.true_label) {
-      __ b(labels.true_label);
-    }
-  }
-}
-
-
 LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index b362d88..8a4c801 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -146,6 +146,36 @@
 }
 
 
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = (constant_address() == 0) ? 1 : 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_out(0, Location::RequiresFpuRegister());
+  if (kNumTemps == 1) {
+    locs->set_temp(0, Location::RequiresRegister());
+  }
+  return locs;
+}
+
+
+void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // The register allocator drops constant definitions that have no uses.
+  if (!locs()->out(0).IsInvalid()) {
+     XmmRegister result = locs()->out(0).fpu_reg();
+    if (constant_address() == 0) {
+      Register boxed = locs()->temp(0).reg();
+      __ LoadObjectSafely(boxed, value());
+      __ movsd(result, FieldAddress(boxed, Double::value_offset()));
+    } else if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+      __ xorps(result, result);
+    } else {
+      __ movsd(result, Address::Absolute(constant_address()));
+    }
+  }
+}
+
+
 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
@@ -3260,7 +3290,8 @@
 
 
 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
+  CompileType* value_type = value()->Type();
+  const intptr_t value_cid = value_type->ToCid();
   const Register value = locs()->in(0).reg();
   const XmmRegister result = locs()->out(0).fpu_reg();
 
@@ -3273,18 +3304,28 @@
     Label* deopt = compiler->AddDeoptStub(deopt_id_,
                                           ICData::kDeoptBinaryDoubleOp);
     Register temp = locs()->temp(0).reg();
-    Label is_smi, done;
-    __ testl(value, Immediate(kSmiTagMask));
-    __ j(ZERO, &is_smi);
-    __ CompareClassId(value, kDoubleCid, temp);
-    __ j(NOT_EQUAL, deopt);
-    __ movsd(result, FieldAddress(value, Double::value_offset()));
-    __ jmp(&done);
-    __ Bind(&is_smi);
-    __ movl(temp, value);
-    __ SmiUntag(temp);
-    __ cvtsi2sd(result, temp);
-    __ Bind(&done);
+    if (value_type->is_nullable() &&
+        (value_type->ToNullableCid() == kDoubleCid)) {
+      const Immediate& raw_null =
+          Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      __ cmpl(value, raw_null);
+      __ j(EQUAL, deopt);
+      // It must be double now.
+      __ movsd(result, FieldAddress(value, Double::value_offset()));
+    } else {
+      Label is_smi, done;
+      __ testl(value, Immediate(kSmiTagMask));
+      __ j(ZERO, &is_smi);
+      __ CompareClassId(value, kDoubleCid, temp);
+      __ j(NOT_EQUAL, deopt);
+      __ movsd(result, FieldAddress(value, Double::value_offset()));
+      __ jmp(&done);
+      __ Bind(&is_smi);
+      __ movl(temp, value);
+      __ SmiUntag(temp);
+      __ cvtsi2sd(result, temp);
+      __ Bind(&done);
+    }
   }
 }
 
@@ -4499,8 +4540,7 @@
 
 
 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
-  if ((kind() == MethodRecognizer::kMathSin) ||
-      (kind() == MethodRecognizer::kMathCos)) {
+  if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 1;
     LocationSummary* summary =
@@ -4512,23 +4552,32 @@
     summary->set_out(0, Location::FpuRegisterLocation(XMM1));
     return summary;
   }
-  ASSERT(kind() == MethodRecognizer::kMathSqrt);
+  ASSERT((kind() == MathUnaryInstr::kSqrt) ||
+         (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
+  if (kind() == MathUnaryInstr::kDoubleSquare) {
+    summary->set_out(0, Location::SameAsFirstInput());
+  } else {
+    summary->set_out(0, Location::RequiresFpuRegister());
+  }
   return summary;
 }
 
 
 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (kind() == MethodRecognizer::kMathSqrt) {
+  if (kind() == MathUnaryInstr::kSqrt) {
     __ sqrtsd(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg());
+  } else if (kind() == MathUnaryInstr::kDoubleSquare) {
+    XmmRegister value_reg = locs()->in(0).fpu_reg();
+    __ mulsd(value_reg, value_reg);
+    ASSERT(value_reg == locs()->out(0).fpu_reg());
   } else {
-    ASSERT((kind() == MethodRecognizer::kMathSin) ||
-           (kind() == MethodRecognizer::kMathCos));
+    ASSERT((kind() == MathUnaryInstr::kSin) ||
+           (kind() == MathUnaryInstr::kCos));
     // Save ESP.
     __ movl(locs()->temp(0).reg(), ESP);
     __ ReserveAlignedFrameSpace(kDoubleSize * InputCount());
@@ -5279,13 +5328,6 @@
   Location index_loc = locs()->in(kIndexPos);
 
   if (length_loc.IsConstant() && index_loc.IsConstant()) {
-    // TODO(srdjan): remove this code once failures are fixed.
-    if ((Smi::Cast(length_loc.constant()).Value() >
-         Smi::Cast(index_loc.constant()).Value()) &&
-        (Smi::Cast(index_loc.constant()).Value() >= 0)) {
-      // This CheckArrayBoundInstr should have been eliminated.
-      return;
-    }
     ASSERT((Smi::Cast(length_loc.constant()).Value() <=
             Smi::Cast(index_loc.constant()).Value()) ||
            (Smi::Cast(index_loc.constant()).Value() < 0));
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 8ace94f..7f3f531 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -299,6 +299,30 @@
 }
 
 
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_out(0, Location::RequiresFpuRegister());
+  locs->set_temp(0, Location::RequiresRegister());
+  return locs;
+}
+
+
+void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // The register allocator drops constant definitions that have no uses.
+  if (!locs()->out(0).IsInvalid()) {
+    ASSERT(value().IsDouble());
+    const Register const_value = locs()->temp(0).reg();
+    const DRegister result = locs()->out(0).fpu_reg();
+    __ LoadObject(const_value, value());
+    __ LoadDFromOffset(result, const_value,
+        Double::value_offset() - kHeapObjectTag);
+  }
+}
+
+
 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
@@ -3018,7 +3042,8 @@
 
 
 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
+  CompileType* value_type = value()->Type();
+  const intptr_t value_cid = value_type->ToCid();
   const Register value = locs()->in(0).reg();
   const DRegister result = locs()->out(0).fpu_reg();
 
@@ -3031,20 +3056,29 @@
   } else {
     Label* deopt = compiler->AddDeoptStub(deopt_id_,
                                           ICData::kDeoptBinaryDoubleOp);
-    Label is_smi, done;
+    if (value_type->is_nullable() &&
+        (value_type->ToNullableCid() == kDoubleCid)) {
+      __ BranchEqual(value, reinterpret_cast<int32_t>(Object::null()), deopt);
+      // It must be double now.
+      __ LoadDFromOffset(result, value,
+          Double::value_offset() - kHeapObjectTag);
+    } else {
+      Label is_smi, done;
 
-    __ andi(CMPRES1, value, Immediate(kSmiTagMask));
-    __ beq(CMPRES1, ZR, &is_smi);
-    __ LoadClassId(CMPRES1, value);
-    __ BranchNotEqual(CMPRES1, kDoubleCid, deopt);
-    __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
-    __ b(&done);
-    __ Bind(&is_smi);
-    // TODO(regis): Why do we preserve value here but not above?
-    __ sra(TMP, value, 1);
-    __ mtc1(TMP, STMP1);
-    __ cvtdw(result, STMP1);
-    __ Bind(&done);
+      __ andi(CMPRES1, value, Immediate(kSmiTagMask));
+      __ beq(CMPRES1, ZR, &is_smi);
+      __ LoadClassId(CMPRES1, value);
+      __ BranchNotEqual(CMPRES1, kDoubleCid, deopt);
+      __ LoadDFromOffset(result, value,
+          Double::value_offset() - kHeapObjectTag);
+      __ b(&done);
+      __ Bind(&is_smi);
+      // TODO(regis): Why do we preserve value here but not above?
+      __ sra(TMP, value, 1);
+      __ mtc1(TMP, STMP1);
+      __ cvtdw(result, STMP1);
+      __ Bind(&done);
+    }
   }
 }
 
@@ -3478,8 +3512,7 @@
 
 
 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
-  if ((kind() == MethodRecognizer::kMathSin) ||
-      (kind() == MethodRecognizer::kMathCos)) {
+  if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 0;
     LocationSummary* summary =
@@ -3488,6 +3521,8 @@
     summary->set_out(0, Location::FpuRegisterLocation(D0));
     return summary;
   }
+  ASSERT((kind() == MathUnaryInstr::kSqrt) ||
+         (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
@@ -3499,8 +3534,12 @@
 
 
 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (kind() == MethodRecognizer::kMathSqrt) {
+  if (kind() == MathUnaryInstr::kSqrt) {
     __ sqrtd(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg());
+  } else if (kind() == MathUnaryInstr::kDoubleSquare) {
+    DRegister val = locs()->in(0).fpu_reg();
+    DRegister result = locs()->out(0).fpu_reg();
+    __ muld(result, val, val);
   } else {
     __ CallRuntime(TargetFunction(), InputCount());
   }
@@ -4163,13 +4202,6 @@
   Location index_loc = locs()->in(kIndexPos);
 
   if (length_loc.IsConstant() && index_loc.IsConstant()) {
-    // TODO(srdjan): remove this code once failures are fixed.
-    if ((Smi::Cast(length_loc.constant()).Value() >
-         Smi::Cast(index_loc.constant()).Value()) &&
-        (Smi::Cast(index_loc.constant()).Value() >= 0)) {
-      // This CheckArrayBoundInstr should have been eliminated.
-      return;
-    }
     ASSERT((Smi::Cast(length_loc.constant()).Value() <=
             Smi::Cast(index_loc.constant()).Value()) ||
            (Smi::Cast(index_loc.constant()).Value() < 0));
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 57a4583..3574404 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -228,6 +228,30 @@
 }
 
 
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_out(0, Location::RequiresFpuRegister());
+  return locs;
+}
+
+
+void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // The register allocator drops constant definitions that have no uses.
+  if (!locs()->out(0).IsInvalid()) {
+    XmmRegister result = locs()->out(0).fpu_reg();
+    if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+      __ xorps(result, result);
+    } else {
+      __ LoadObject(TMP, value(), PP);
+      __ movsd(result, FieldAddress(TMP, Double::value_offset()));
+    }
+  }
+}
+
+
 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
@@ -3145,7 +3169,8 @@
 
 
 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
+  CompileType* value_type = value()->Type();
+  const intptr_t value_cid = value_type->ToCid();
   const Register value = locs()->in(0).reg();
   const XmmRegister result = locs()->out(0).fpu_reg();
 
@@ -3157,17 +3182,27 @@
   } else {
     Label* deopt = compiler->AddDeoptStub(deopt_id_,
                                           ICData::kDeoptBinaryDoubleOp);
-    Label is_smi, done;
-    __ testq(value, Immediate(kSmiTagMask));
-    __ j(ZERO, &is_smi);
-    __ CompareClassId(value, kDoubleCid);
-    __ j(NOT_EQUAL, deopt);
-    __ movsd(result, FieldAddress(value, Double::value_offset()));
-    __ jmp(&done);
-    __ Bind(&is_smi);
-    __ SmiUntag(value);
-    __ cvtsi2sd(result, value);
-    __ Bind(&done);
+    if (value_type->is_nullable() &&
+        (value_type->ToNullableCid() == kDoubleCid)) {
+      const Immediate& raw_null =
+          Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      __ cmpq(value, raw_null);
+      __ j(EQUAL, deopt);
+      // It must be double now.
+      __ movsd(result, FieldAddress(value, Double::value_offset()));
+    } else {
+      Label is_smi, done;
+      __ testq(value, Immediate(kSmiTagMask));
+      __ j(ZERO, &is_smi);
+      __ CompareClassId(value, kDoubleCid);
+      __ j(NOT_EQUAL, deopt);
+      __ movsd(result, FieldAddress(value, Double::value_offset()));
+      __ jmp(&done);
+      __ Bind(&is_smi);
+      __ SmiUntag(value);
+      __ cvtsi2sd(result, value);
+      __ Bind(&done);
+    }
   }
 }
 
@@ -4376,8 +4411,7 @@
 
 
 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
-  if ((kind() == MethodRecognizer::kMathSin) ||
-      (kind() == MethodRecognizer::kMathCos)) {
+  if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     // Calling convention on x64 uses XMM0 and XMM1 to pass the first two
     // double arguments and XMM0 to return the result. Unfortunately
     // currently we can't specify these registers because ParallelMoveResolver
@@ -4393,23 +4427,32 @@
     summary->set_out(0, Location::FpuRegisterLocation(XMM1));
     return summary;
   }
-  ASSERT(kind() == MethodRecognizer::kMathSqrt);
+  ASSERT((kind() == MathUnaryInstr::kSqrt) ||
+         (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
+  if (kind() == MathUnaryInstr::kDoubleSquare) {
+    summary->set_out(0, Location::SameAsFirstInput());
+  } else {
+    summary->set_out(0, Location::RequiresFpuRegister());
+  }
   return summary;
 }
 
 
 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (kind() == MethodRecognizer::kMathSqrt) {
+  if (kind() == MathUnaryInstr::kSqrt) {
     __ sqrtsd(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg());
+  } else if (kind() == MathUnaryInstr::kDoubleSquare) {
+    XmmRegister value_reg = locs()->in(0).fpu_reg();
+    __ mulsd(value_reg, value_reg);
+    ASSERT(value_reg == locs()->out(0).fpu_reg());
   } else {
-    ASSERT((kind() == MethodRecognizer::kMathSin) ||
-           (kind() == MethodRecognizer::kMathCos));
+    ASSERT((kind() == MathUnaryInstr::kSin) ||
+           (kind() == MathUnaryInstr::kCos));
     // Save RSP.
     __ movq(locs()->temp(0).reg(), RSP);
     __ ReserveAlignedFrameSpace(0);
@@ -5217,13 +5260,6 @@
   Location index_loc = locs()->in(kIndexPos);
 
   if (length_loc.IsConstant() && index_loc.IsConstant()) {
-    // TODO(srdjan): remove this code once failures are fixed.
-    if ((Smi::Cast(length_loc.constant()).Value() >
-         Smi::Cast(index_loc.constant()).Value()) &&
-        (Smi::Cast(index_loc.constant()).Value() >= 0)) {
-      // This CheckArrayBoundInstr should have been eliminated.
-      return;
-    }
     ASSERT((Smi::Cast(length_loc.constant()).Value() <=
             Smi::Cast(index_loc.constant()).Value()) ||
            (Smi::Cast(index_loc.constant()).Value() < 0));
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index 9f36db3..69ca15d 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -136,8 +136,8 @@
 
 #define PROFILER_LIB_INTRINSIC_LIST(V)                                         \
   V(_UserTag, makeCurrent, UserTag_makeCurrent, 1038211262)                    \
+  V(::, _getDefaultTag, UserTag_defaultTag, 624228668)                         \
   V(::, _getCurrentTag, Profiler_getCurrentTag, 1559793589)                    \
-  V(::, _clearCurrentTag, Profiler_clearCurrentTag, 874694572)                 \
 
 // TODO(srdjan): Implement _FixedSizeArrayIterator, get:current and
 //   _FixedSizeArrayIterator, moveNext.
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 69dd647..0af28a0 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -1723,23 +1723,33 @@
   // R1: Isolate.
   Isolate* isolate = Isolate::Current();
   __ LoadImmediate(R1, reinterpret_cast<uword>(isolate));
-  // R0: UserTag.
-  __ ldr(R0, Address(SP, + 0 * kWordSize));
+  // R0: Current user tag.
+  __ ldr(R0, Address(R1, Isolate::current_tag_offset()));
+  // R2: UserTag.
+  __ ldr(R2, Address(SP, + 0 * kWordSize));
   // Set Isolate::current_tag_.
-  __ str(R0, Address(R1, Isolate::current_tag_offset()));
-  // R0: UserTag's tag.
-  __ ldr(R0, FieldAddress(R0, UserTag::tag_offset()));
+  __ str(R2, Address(R1, Isolate::current_tag_offset()));
+  // R2: UserTag's tag.
+  __ ldr(R2, FieldAddress(R2, UserTag::tag_offset()));
   // Set Isolate::user_tag_.
-  __ str(R0, Address(R1, Isolate::user_tag_offset()));
-  // Set return value.
-  const int32_t raw_null = reinterpret_cast<int32_t>(Object::null());
-  __ LoadImmediate(R0, raw_null);
+  __ str(R2, Address(R1, Isolate::user_tag_offset()));
+  __ Ret();
+}
+
+
+void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
+  Isolate* isolate = Isolate::Current();
+  // Set return value to default tag address.
+  __ LoadImmediate(R0,
+      reinterpret_cast<uword>(isolate->object_store()) +
+                              ObjectStore::default_tag_offset());
+  __ ldr(R0, Address(R0, 0));
   __ Ret();
 }
 
 
 void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
-  // R1: Isolate.
+  // R1: Default tag address.
   Isolate* isolate = Isolate::Current();
   __ LoadImmediate(R1, reinterpret_cast<uword>(isolate));
   // Set return value to Isolate::current_tag_.
@@ -1747,23 +1757,6 @@
   __ Ret();
 }
 
-
-void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
-  // R1: Isolate.
-  Isolate* isolate = Isolate::Current();
-  __ LoadImmediate(R1, reinterpret_cast<uword>(isolate));
-  // Set return value to Isolate::current_tag_.
-  __ ldr(R0, Address(R1, Isolate::current_tag_offset()));
-  // Clear Isolate::current_tag_.
-  const int32_t raw_null = reinterpret_cast<int32_t>(UserTag::null());
-  __ LoadImmediate(R2, raw_null);
-  __ str(R2, Address(R1, Isolate::current_tag_offset()));
-  // Clear Isolate::user_tag_.
-  __ eor(R2, R2, ShifterOperand(R2));
-  __ str(R2, Address(R1, Isolate::user_tag_offset()));
-  __ Ret();
-}
-
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index be92d60..8bf6c6a 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -413,7 +413,7 @@
 }
 
 
-void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
+void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
   return;
 }
 
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 958e6ce..6e27c85 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -1749,18 +1749,28 @@
   const Address user_tag_addr =
       Address::Absolute(reinterpret_cast<uword>(isolate) +
                         Isolate::user_tag_offset());
+  // EAX: Current user tag.
+  __ movl(EAX, current_tag_addr);
   // EAX: UserTag.
-  __ movl(EAX, Address(ESP, + 1 * kWordSize));
+  __ movl(EBX, Address(ESP, + 1 * kWordSize));
   // Set Isolate::current_tag_.
-  __ movl(current_tag_addr, EAX);
+  __ movl(current_tag_addr, EBX);
   // EAX: UserTag's tag.
-  __ movl(EAX, FieldAddress(EAX, UserTag::tag_offset()));
+  __ movl(EBX, FieldAddress(EBX, UserTag::tag_offset()));
   // Set Isolate::user_tag_.
-  __ movl(user_tag_addr, EAX);
+  __ movl(user_tag_addr, EBX);
+  __ ret();
+}
+
+
+void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
+  Isolate* isolate = Isolate::Current();
+  const Address default_tag_addr =
+      Address::Absolute(
+          reinterpret_cast<uword>(isolate->object_store()) +
+                                  ObjectStore::default_tag_offset());
   // Set return value.
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<int32_t>(Object::null()));
-  __ movl(EAX, raw_null);
+  __ movl(EAX, default_tag_addr);
   __ ret();
 }
 
@@ -1775,26 +1785,6 @@
   __ ret();
 }
 
-
-void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
-  Isolate* isolate = Isolate::Current();
-  const Address current_tag_addr =
-      Address::Absolute(reinterpret_cast<uword>(isolate) +
-                        Isolate::current_tag_offset());
-  const Address user_tag_addr =
-      Address::Absolute(reinterpret_cast<uword>(isolate) +
-                        Isolate::user_tag_offset());
-  // Set return value to Isolate::current_tag_.
-  __ movl(EAX, current_tag_addr);
-  // Clear Isolate::current_tag_.
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<int32_t>(UserTag::null()));
-  __ movl(current_tag_addr, raw_null);
-  // Clear Isolate::user_tag_.
-  __ movl(user_tag_addr, Immediate(0));
-  __ ret();
-}
-
 #undef __
 }  // namespace dart
 
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index 263514d..ce9b0ab 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -1783,17 +1783,29 @@
   // T1: Isolate.
   Isolate* isolate = Isolate::Current();
   __ LoadImmediate(T1, reinterpret_cast<uword>(isolate));
-  // V0: UserTag.
-  __ lw(V0, Address(SP, + 0 * kWordSize));
+  // V0: Current user tag.
+  __ lw(V0, Address(T1, Isolate::current_tag_offset()));
+  // T2: UserTag.
+  __ lw(T2, Address(SP, + 0 * kWordSize));
   // Set Isolate::current_tag_.
-  __ sw(V0, Address(T1, Isolate::current_tag_offset()));
-  // V0: UserTag's tag.
-  __ lw(V0, FieldAddress(V0, UserTag::tag_offset()));
+  __ sw(T2, Address(T1, Isolate::current_tag_offset()));
+  // T2: UserTag's tag.
+  __ lw(T2, FieldAddress(T2, UserTag::tag_offset()));
   // Set Isolate::user_tag_.
-  __ sw(V0, Address(T1, Isolate::user_tag_offset()));
-  // Set return value.
+  __ sw(T2, Address(T1, Isolate::user_tag_offset()));
   __ Ret();
-  __ delay_slot()->LoadImmediate(V0, reinterpret_cast<int32_t>(Object::null()));
+  __ delay_slot()->sw(T2, Address(T1, Isolate::user_tag_offset()));
+}
+
+
+void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
+  Isolate* isolate = Isolate::Current();
+  // V0: Address of default tag.
+  __ LoadImmediate(V0,
+      reinterpret_cast<uword>(isolate->object_store()) +
+                              ObjectStore::default_tag_offset());
+  __ Ret();
+  __ delay_slot()->lw(V0, Address(V0, 0));
 }
 
 
@@ -1806,22 +1818,6 @@
   __ delay_slot()->lw(V0, Address(V0, Isolate::current_tag_offset()));
 }
 
-
-void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
-  // T1: Isolate.
-  Isolate* isolate = Isolate::Current();
-  __ LoadImmediate(T1, reinterpret_cast<uword>(isolate));
-  // Set return value to Isolate::current_tag_.
-  __ lw(V0, Address(T1, Isolate::current_tag_offset()));
-  // Clear Isolate::current_tag_.
-  const int32_t raw_null = reinterpret_cast<int32_t>(UserTag::null());
-  __ LoadImmediate(T0, raw_null);
-  __ sw(T0, Address(T1, Isolate::current_tag_offset()));
-  // Clear Isolate::user_tag_.
-  __ Ret();
-  __ delay_slot()->sw(ZR, Address(T1, Isolate::user_tag_offset()));
-}
-
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index c0bbba5..243d4a5 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -1655,16 +1655,29 @@
   const Immediate& isolate_address =
       Immediate(reinterpret_cast<int64_t>(isolate));
   __ movq(RBX, isolate_address);
-  // RAX: UserTag.
-  __ movq(RAX, Address(RSP, + 1 * kWordSize));
+  // RAX: Current user tag.
+  __ movq(RAX, Address(RBX, Isolate::current_tag_offset()));
+  // R10: UserTag.
+  __ movq(R10, Address(RSP, + 1 * kWordSize));
   // Set Isolate::current_tag_.
-  __ movq(Address(RBX, Isolate::current_tag_offset()), RAX);
-  // RAX: UserTag's tag.
-  __ movq(RAX, FieldAddress(RAX, UserTag::tag_offset()));
+  __ movq(Address(RBX, Isolate::current_tag_offset()), R10);
+  // R10: UserTag's tag.
+  __ movq(R10, FieldAddress(R10, UserTag::tag_offset()));
   // Set Isolate::user_tag_.
-  __ movq(Address(RBX, Isolate::user_tag_offset()), RAX);
+  __ movq(Address(RBX, Isolate::user_tag_offset()), R10);
+  __ ret();
+}
+
+
+void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
+  // RBX: Address of default tag.
+  Isolate* isolate = Isolate::Current();
+  const Immediate& default_tag_addr =
+      Immediate(reinterpret_cast<int64_t>(isolate->object_store()) +
+                                          ObjectStore::default_tag_offset());
+  __ movq(RBX, default_tag_addr);
   // Set return value.
-  __ LoadObject(RAX, Object::null_object(), PP);
+  __ movq(RAX, Address(RBX, 0));
   __ ret();
 }
 
@@ -1680,23 +1693,6 @@
   __ ret();
 }
 
-
-void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
-  // RBX: Isolate.
-  Isolate* isolate = Isolate::Current();
-  const Immediate& isolate_address =
-      Immediate(reinterpret_cast<int64_t>(isolate));
-  __ movq(RBX, isolate_address);
-  // Set return value to Isolate::current_tag_.
-  __ movq(RAX, Address(RBX, Isolate::current_tag_offset()));
-  // Clear Isolate::current_tag_.
-  __ LoadObject(RCX, Object::null_object(), PP);
-  __ movq(Address(RBX, Isolate::current_tag_offset()), RCX);
-  // Clear Isolate::user_tag_.
-  __ movq(Address(RBX, Isolate::user_tag_offset()), Immediate(0));
-  __ ret();
-}
-
 #undef __
 
 }  // namespace dart
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 3bcc306..d185883 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -343,7 +343,7 @@
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
       reusable_handles_() {
   set_vm_tag(VMTag::kIdleTagId);
-  set_user_tag(UserTags::kNoUserTag);
+  set_user_tag(UserTags::kDefaultUserTag);
 }
 #undef REUSABLE_HANDLE_SCOPE_INIT
 #undef REUSABLE_HANDLE_INITIALIZERS
@@ -968,6 +968,19 @@
     typeargsRef.AddProperty("id", "typearguments");
     typeargsRef.AddProperty("name", "canonical type arguments");
   }
+  {
+    const GrowableObjectArray& libs =
+        GrowableObjectArray::Handle(object_store()->libraries());
+    intptr_t num_libs = libs.Length();
+    Library &lib = Library::Handle();
+
+    JSONArray lib_array(&jsobj, "libraries");
+    for (intptr_t i = 0; i < num_libs; i++) {
+      lib ^= libs.At(i);
+      ASSERT(!lib.IsNull());
+      lib_array.AddValue(lib);
+    }
+  }
 }
 
 
@@ -1000,12 +1013,6 @@
 }
 
 
-void Isolate::clear_current_tag() {
-  set_user_tag(UserTags::kNoUserTag);
-  current_tag_ = UserTag::null();
-}
-
-
 void Isolate::VisitIsolates(IsolateVisitor* visitor) {
   if (visitor == NULL) {
     return;
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 1f03df3..309b3ed 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -24,6 +24,7 @@
 class ApiState;
 class Array;
 class Class;
+class Code;
 class CodeIndexTable;
 class Debugger;
 class DeoptContext;
@@ -39,6 +40,7 @@
 class IsolateProfilerData;
 class IsolateSpawnState;
 class InterruptableThreadState;
+class Library;
 class LongJumpScope;
 class MessageHandler;
 class Mutex;
@@ -80,16 +82,19 @@
 };
 
 #define REUSABLE_HANDLE_LIST(V)                                                \
+  V(AbstractType)                                                              \
   V(Array)                                                                     \
   V(Class)                                                                     \
+  V(Code)                                                                      \
   V(Error)                                                                     \
   V(Field)                                                                     \
   V(Function)                                                                  \
+  V(GrowableObjectArray)                                                       \
   V(Instance)                                                                  \
+  V(Library)                                                                   \
   V(Object)                                                                    \
   V(String)                                                                    \
   V(TypeArguments)                                                             \
-  V(AbstractType)                                                              \
   V(TypeParameter)                                                             \
 
 class Isolate : public BaseIsolate {
@@ -490,7 +495,6 @@
 
   RawUserTag* current_tag() const { return current_tag_; }
   void set_current_tag(const UserTag& tag);
-  void clear_current_tag();
 
 #if defined(DEBUG)
 #define REUSABLE_HANDLE_SCOPE_ACCESSORS(object)                                \
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index 7fce0e9..ce565cf 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -9,6 +9,7 @@
 #include "vm/dart_api_impl.h"
 #include "vm/dart_api_state.h"
 #include "vm/object_store.h"
+#include "vm/reusable_handles.h"
 #include "vm/tags.h"
 
 
@@ -45,24 +46,26 @@
 
 const uint8_t* NativeEntry::ResolveSymbolInLibrary(const Library& library,
                                                    uword pc) {
-  if (library.native_entry_symbol_resolver() == 0) {
+  Dart_NativeEntrySymbol symbol_resolver =
+      library.native_entry_symbol_resolver();
+  if (symbol_resolver == 0) {
     // Cannot reverse lookup native entries.
     return NULL;
   }
-  Dart_NativeEntrySymbol symbol_resolver =
-      library.native_entry_symbol_resolver();
   return symbol_resolver(reinterpret_cast<Dart_NativeFunction>(pc));
 }
 
 
 const uint8_t* NativeEntry::ResolveSymbol(uword pc) {
   Isolate* isolate = Isolate::Current();
-  const GrowableObjectArray& libs =
-      GrowableObjectArray::Handle(isolate->object_store()->libraries());
+  REUSABLE_GROWABLE_OBJECT_ARRAY_HANDLESCOPE(isolate);
+  GrowableObjectArray& libs = reused_growable_object_array_handle.Handle();
+  libs ^= isolate->object_store()->libraries();
   ASSERT(!libs.IsNull());
   intptr_t num_libs = libs.Length();
-  Library& lib = Library::Handle();
   for (intptr_t i = 0; i < num_libs; i++) {
+    REUSABLE_LIBRARY_HANDLESCOPE(isolate);
+    Library& lib = reused_library_handle.Handle();
     lib ^= libs.At(i);
     ASSERT(!lib.IsNull());
     const uint8_t* r = ResolveSymbolInLibrary(lib, pc);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 0c43c65..eacee90 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1634,6 +1634,11 @@
 }
 
 
+RawString* Class::PrettyName() const {
+  return GeneratePrettyName();
+}
+
+
 RawString* Class::UserVisibleName() const {
   ASSERT(raw_ptr()->user_name_ != String::null());
   return raw_ptr()->user_name_;
@@ -3031,6 +3036,16 @@
 }
 
 
+RawString* Class::GeneratePrettyName() const {
+  if (!IsCanonicalSignatureClass()) {
+    const String& name = String::Handle(Name());
+    return String::IdentifierPrettyName(name);
+  } else {
+    return Name();
+  }
+}
+
+
 RawString* Class::GenerateUserVisibleName() const {
   if (FLAG_show_internal_names) {
     return Name();
@@ -3909,12 +3924,12 @@
     return;
   }
   const char* internal_class_name = String::Handle(Name()).ToCString();
-  const char* user_visible_class_name =
-      String::Handle(UserVisibleName()).ToCString();
+  const char* pretty_class_name =
+      String::Handle(PrettyName()).ToCString();
   jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "classes/%" Pd "", id());
   jsobj.AddProperty("name", internal_class_name);
-  jsobj.AddProperty("user_name", user_visible_class_name);
+  jsobj.AddProperty("user_name", pretty_class_name);
   if (ref) {
     return;
   }
@@ -3998,8 +4013,7 @@
     typesRef.AddProperty("type", "@TypeList");
     typesRef.AddPropertyF("id", "classes/%" Pd "/types", id());
     jsobj.AddPropertyF("name", "canonical types of %s", internal_class_name);
-    jsobj.AddPropertyF("user_name", "canonical types of %s",
-                       user_visible_class_name);
+    jsobj.AddPropertyF("user_name", "canonical types of %s", pretty_class_name);
   }
 }
 
@@ -4252,9 +4266,9 @@
   jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
   const char* name = String::Handle(Name()).ToCString();
-  const char* user_name = String::Handle(UserVisibleName()).ToCString();
+  const char* pretty_name = String::Handle(PrettyName()).ToCString();
   jsobj.AddProperty("name", name);
-  jsobj.AddProperty("user_name", user_name);
+  jsobj.AddProperty("user_name", pretty_name);
   jsobj.AddProperty("length", Length());
   jsobj.AddProperty("num_instantiations", NumInstantiations());
   if (ref) {
@@ -6265,12 +6279,41 @@
 }
 
 
-RawString* Function::UserVisibleName() const {
+RawString* Function::PrettyName() const {
   const String& str = String::Handle(name());
   return String::IdentifierPrettyName(str);
 }
 
 
+RawString* Function::UserVisibleName() const {
+  return PrettyName();
+}
+
+
+RawString* Function::QualifiedPrettyName() const {
+  String& tmp = String::Handle();
+  const Class& cls = Class::Handle(Owner());
+
+  if (IsClosureFunction()) {
+    if (IsLocalFunction() && !IsImplicitClosureFunction()) {
+      const Function& parent = Function::Handle(parent_function());
+      tmp = parent.QualifiedPrettyName();
+    } else {
+      return PrettyName();
+    }
+  } else {
+    if (cls.IsTopLevel()) {
+      return PrettyName();
+    } else {
+      tmp = cls.PrettyName();
+    }
+  }
+  tmp = String::Concat(tmp, Symbols::Dot());
+  const String& suffix = String::Handle(PrettyName());
+  return String::Concat(tmp, suffix);
+}
+
+
 RawString* Function::QualifiedUserVisibleName() const {
   String& tmp = String::Handle();
   const Class& cls = Class::Handle(Owner());
@@ -6436,8 +6479,8 @@
 
 void Function::PrintJSONImpl(JSONStream* stream, bool ref) const {
   const char* internal_name = String::Handle(name()).ToCString();
-  const char* user_name =
-      String::Handle(UserVisibleName()).ToCString();
+  const char* pretty_name =
+      String::Handle(PrettyName()).ToCString();
   Class& cls = Class::Handle(Owner());
   ASSERT(!cls.IsNull());
   Error& err = Error::Handle();
@@ -6472,7 +6515,7 @@
     jsobj.AddPropertyF("id", "classes/%" Pd "/%s/%" Pd "", cid, selector, id);
   }
   jsobj.AddProperty("name", internal_name);
-  jsobj.AddProperty("user_name", user_name);
+  jsobj.AddProperty("user_name", pretty_name);
   if (cls.IsTopLevel()) {
     const Library& library = Library::Handle(cls.library());
     jsobj.AddProperty("owner", library);
@@ -6733,12 +6776,17 @@
 }
 
 
-RawString* Field::UserVisibleName() const {
+RawString* Field::PrettyName() const {
   const String& str = String::Handle(name());
   return String::IdentifierPrettyName(str);
 }
 
 
+RawString* Field::UserVisibleName() const {
+  return PrettyName();
+}
+
+
 intptr_t Field::guarded_list_length() const {
   return Smi::Value(raw_ptr()->guarded_list_length_);
 }
@@ -6787,7 +6835,7 @@
 void Field::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   const char* internal_field_name = String::Handle(name()).ToCString();
-  const char* field_name = String::Handle(UserVisibleName()).ToCString();
+  const char* field_name = String::Handle(PrettyName()).ToCString();
   Class& cls = Class::Handle(owner());
   intptr_t id = cls.FindFieldIndex(*this);
   ASSERT(id >= 0);
@@ -9068,6 +9116,8 @@
   const String& native_flds_lib_url = Symbols::DartNativeWrappers();
   const Library& native_flds_lib = Library::Handle(
       Library::NewLibraryHelper(native_flds_lib_url, false));
+  const String& native_flds_lib_name = Symbols::DartNativeWrappersLibName();
+  native_flds_lib.SetName(native_flds_lib_name);
   native_flds_lib.Register();
   isolate->object_store()->set_native_wrappers_library(native_flds_lib);
   static const char* const kNativeWrappersClass = "NativeFieldWrapperClass";
@@ -9282,11 +9332,11 @@
   jsobj.AddPropertyF("id", "libraries/%" Pd "", id);
   jsobj.AddProperty("user_name", library_name);
   jsobj.AddProperty("name", library_name);
+  const char* library_url = String::Handle(url()).ToCString();
+  jsobj.AddProperty("url", library_url);
   if (ref) {
     return;
   }
-  const char* library_url = String::Handle(url()).ToCString();
-  jsobj.AddProperty("url", library_url);
   {
     JSONArray jsarr(&jsobj, "classes");
     ClassDictionaryIterator class_iter(*this);
@@ -10244,43 +10294,98 @@
 }
 
 
-const char* LocalVarDescriptors::ToCString() const {
-  intptr_t len = 1;  // Trailing '\0'.
-  const char* kFormat =
-      "%2" Pd " kind=%d scope=0x%04x begin=%" Pd " end=%" Pd " name=%s\n";
-  for (intptr_t i = 0; i < Length(); i++) {
-    String& var_name = String::Handle(GetName(i));
-    if (var_name.IsNull()) {
-      var_name = Symbols::Empty().raw();
-    }
-    RawLocalVarDescriptors::VarInfo info;
-    GetInfo(i, &info);
-    len += OS::SNPrint(NULL, 0, kFormat,
+static const char* VarKindString(int kind) {
+  switch (kind) {
+    case RawLocalVarDescriptors::kStackVar:
+      return "StackVar";
+      break;
+    case RawLocalVarDescriptors::kContextVar:
+      return "ContextVar";
+      break;
+    case RawLocalVarDescriptors::kContextLevel:
+      return "ContextLevel";
+      break;
+    case RawLocalVarDescriptors::kSavedEntryContext:
+      return "SavedEntryCtx";
+      break;
+    case RawLocalVarDescriptors::kSavedCurrentContext:
+      return "SavedCurrentCtx";
+      break;
+    default:
+      UNREACHABLE();
+      return "Unknown";
+  }
+}
+
+
+static int PrintVarInfo(char* buffer, int len,
+                        intptr_t i,
+                        const String& var_name,
+                        const RawLocalVarDescriptors::VarInfo& info) {
+  if (info.kind == RawLocalVarDescriptors::kContextLevel) {
+    return OS::SNPrint(buffer, len,
+                       "%2" Pd " %-13s level=%-3" Pd " scope=%-3d"
+                       " begin=%-3" Pd " end=%" Pd "\n",
                        i,
-                       info.kind,
+                       VarKindString(info.kind),
+                       info.index,
                        info.scope_id,
                        info.begin_pos,
+                       info.end_pos);
+  } else if (info.kind == RawLocalVarDescriptors::kContextVar) {
+    return OS::SNPrint(buffer, len,
+                       "%2" Pd " %-13s level=%-3d index=%-3" Pd ""
+                       " begin=%-3" Pd " end=%-3" Pd " name=%s\n",
+                       i,
+                       VarKindString(info.kind),
+                       info.scope_id,
+                       info.index,
+                       info.begin_pos,
+                       info.end_pos,
+                       var_name.ToCString());
+  } else {
+    return OS::SNPrint(buffer, len,
+                       "%2" Pd " %-13s scope=%-3d index=%-3" Pd ""
+                       " begin=%-3" Pd " end=%-3" Pd " name=%s\n",
+                       i,
+                       VarKindString(info.kind),
+                       info.scope_id,
+                       info.index,
+                       info.begin_pos,
                        info.end_pos,
                        var_name.ToCString());
   }
-  char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len);
-  intptr_t num_chars = 0;
+}
+
+
+const char* LocalVarDescriptors::ToCString() const {
+  if (IsNull()) {
+    return "LocalVarDescriptors(NULL)";
+  }
+  intptr_t len = 1;  // Trailing '\0'.
+  String& var_name = String::Handle();
   for (intptr_t i = 0; i < Length(); i++) {
-    String& var_name = String::Handle(GetName(i));
+    RawLocalVarDescriptors::VarInfo info;
+    var_name = GetName(i);
     if (var_name.IsNull()) {
       var_name = Symbols::Empty().raw();
     }
-    RawLocalVarDescriptors::VarInfo info;
     GetInfo(i, &info);
-    num_chars += OS::SNPrint((buffer + num_chars),
-                             (len - num_chars),
-                             kFormat,
-                             i,
-                             info.kind,
-                             info.scope_id,
-                             info.begin_pos,
-                             info.end_pos,
-                             var_name.ToCString());
+    len += PrintVarInfo(NULL, 0, i, var_name, info);
+  }
+  char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
+  buffer[0] = '\0';
+  intptr_t num_chars = 0;
+  for (intptr_t i = 0; i < Length(); i++) {
+    RawLocalVarDescriptors::VarInfo info;
+    var_name = GetName(i);
+    if (var_name.IsNull()) {
+      var_name = Symbols::Empty().raw();
+    }
+    GetInfo(i, &info);
+    num_chars += PrintVarInfo((buffer + num_chars),
+                              (len - num_chars),
+                              i, var_name, info);
   }
   return buffer;
 }
@@ -11605,7 +11710,7 @@
 }
 
 
-RawString* Code::UserName() const {
+RawString* Code::PrettyName() const {
   const Object& obj = Object::Handle(owner());
   if (obj.IsNull()) {
     // Regular stub.
@@ -11622,7 +11727,7 @@
   } else {
     ASSERT(obj.IsFunction());
     // Dart function.
-    return Function::Cast(obj).QualifiedUserVisibleName();
+    return Function::Cast(obj).QualifiedPrettyName();
   }
 }
 
@@ -11634,14 +11739,13 @@
                      EntryPoint());
   jsobj.AddPropertyF("start", "%" Px "", EntryPoint());
   jsobj.AddPropertyF("end", "%" Px "", EntryPoint() + Size());
-  jsobj.AddProperty("is_optimized", is_optimized());
-  jsobj.AddProperty("is_alive", is_alive());
+  jsobj.AddProperty("isOptimized", is_optimized());
+  jsobj.AddProperty("isAlive", is_alive());
   jsobj.AddProperty("kind", "Dart");
   const String& name = String::Handle(Name());
-  const String& user_name = String::Handle(UserName());
-  const char* name_prefix = is_optimized() ? "*" : "";
-  jsobj.AddPropertyF("name", "%s%s", name_prefix, name.ToCString());
-  jsobj.AddPropertyF("user_name", "%s%s", name_prefix, user_name.ToCString());
+  const String& pretty_name = String::Handle(PrettyName());
+  jsobj.AddProperty("name", name.ToCString());
+  jsobj.AddProperty("user_name", pretty_name.ToCString());
   const Object& obj = Object::Handle(owner());
   if (obj.IsFunction()) {
     jsobj.AddProperty("function", obj);
@@ -11651,7 +11755,7 @@
     func.AddProperty("type", "@Function");
     func.AddProperty("kind", "Stub");
     func.AddPropertyF("id", "functions/stub-%" Pd "", EntryPoint());
-    func.AddProperty("user_name", user_name.ToCString());
+    func.AddProperty("user_name", pretty_name.ToCString());
     func.AddProperty("name", name.ToCString());
   }
   if (ref) {
@@ -13176,7 +13280,9 @@
   if (IsBoundedType()) {
     const AbstractType& type = AbstractType::Handle(
         BoundedType::Cast(*this).type());
-    if (name_visibility == kUserVisibleName) {
+    if (name_visibility == kPrettyName) {
+      return type.BuildName(kPrettyName);
+    } else if (name_visibility == kUserVisibleName) {
       return type.BuildName(kUserVisibleName);
     }
     String& type_name = String::Handle(type.BuildName(kInternalName));
@@ -13221,6 +13327,8 @@
     }
     if (name_visibility == kInternalName) {
       class_name = cls.Name();
+    } else if (name_visibility == kPrettyName) {
+      class_name = cls.PrettyName();
     } else {
       ASSERT(name_visibility == kUserVisibleName);
       // Map internal types to their corresponding public interfaces.
@@ -14067,9 +14175,9 @@
     jsobj.AddPropertyF("id", "objects/%" Pd "", id);
   }
   const char* name = String::Handle(Name()).ToCString();
-  const char* user_name = String::Handle(UserVisibleName()).ToCString();
+  const char* pretty_name = String::Handle(PrettyName()).ToCString();
   jsobj.AddProperty("name", name);
-  jsobj.AddProperty("user_name", user_name);
+  jsobj.AddProperty("user_name", pretty_name);
   if (ref) {
     return;
   }
@@ -14231,9 +14339,9 @@
   const intptr_t id = ring->GetIdForObject(raw());
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
   const char* name = String::Handle(Name()).ToCString();
-  const char* user_name = String::Handle(UserVisibleName()).ToCString();
+  const char* pretty_name = String::Handle(PrettyName()).ToCString();
   jsobj.AddProperty("name", name);
-  jsobj.AddProperty("user_name", user_name);
+  jsobj.AddProperty("user_name", pretty_name);
   if (ref) {
     return;
   }
@@ -14448,9 +14556,9 @@
   const intptr_t id = ring->GetIdForObject(raw());
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
   const char* name = String::Handle(Name()).ToCString();
-  const char* user_name = String::Handle(UserVisibleName()).ToCString();
+  const char* pretty_name = String::Handle(PrettyName()).ToCString();
   jsobj.AddProperty("name", name);
-  jsobj.AddProperty("user_name", user_name);
+  jsobj.AddProperty("user_name", pretty_name);
   const Class& param_cls = Class::Handle(parameterized_class());
   jsobj.AddProperty("parameterized_class", param_cls);
   if (ref) {
@@ -14652,9 +14760,9 @@
   const intptr_t id = ring->GetIdForObject(raw());
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
   const char* name = String::Handle(Name()).ToCString();
-  const char* user_name = String::Handle(UserVisibleName()).ToCString();
+  const char* pretty_name = String::Handle(PrettyName()).ToCString();
   jsobj.AddProperty("name", name);
-  jsobj.AddProperty("user_name", user_name);
+  jsobj.AddProperty("user_name", pretty_name);
   if (ref) {
     return;
   }
@@ -18558,13 +18666,6 @@
 }
 
 
-void UserTag::ClearActive() {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate != NULL);
-  isolate->clear_current_tag();
-}
-
-
 RawUserTag* UserTag::New(const String& label, Heap::Space space) {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate->tag_table() != GrowableObjectArray::null());
@@ -18596,6 +18697,23 @@
 }
 
 
+RawUserTag* UserTag::DefaultTag() {
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate != NULL);
+  ASSERT(isolate->object_store() != NULL);
+  if (isolate->object_store()->default_tag() != UserTag::null()) {
+    // Already created.
+    return isolate->object_store()->default_tag();
+  }
+  // Create default tag.
+  const UserTag& result = UserTag::Handle(isolate,
+                                          UserTag::New(Symbols::Default()));
+  ASSERT(result.tag() == UserTags::kDefaultUserTag);
+  isolate->object_store()->set_default_tag(result);
+  return result.raw();
+}
+
+
 RawUserTag* UserTag::FindTagInIsolate(Isolate* isolate, const String& label) {
   ASSERT(isolate->tag_table() != GrowableObjectArray::null());
   const GrowableObjectArray& tag_table = GrowableObjectArray::Handle(
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 055c396..9054e18 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -495,7 +495,41 @@
 
   // Different kinds of name visibility.
   enum NameVisibility {
+    // Internal names are the true names of classes, fields,
+    // etc. inside the vm.  These names include privacy suffixes,
+    // getter prefixes, and trailing dots on unnamed constructors.
+    //
+    // The names of core implementation classes (like _OneByteString)
+    // are preserved as well.
+    //
+    // e.g.
+    //   private getter             - get:foo@6be832b
+    //   private constructor        - _MyClass@6b3832b.
+    //   private named constructor  - _MyClass@6b3832b.named
+    //   core impl class name shown - _OneByteString
     kInternalName = 0,
+
+    // Pretty names drop privacy suffixes, getter prefixes, and
+    // trailing dots on unnamed constructors.  These names are used in
+    // the vm service.
+    //
+    // e.g.
+    //   get:foo@6be832b        -> foo
+    //   _MyClass@6b3832b.      -> _MyClass
+    //   _MyClass@6b3832b.named -> _MyClass.named
+    //   _OneByteString          -> _OneByteString (not remapped)
+    kPrettyName,
+
+    // User visible names are appropriate for reporting type errors
+    // directly to programmers.  The names have been "prettied" and
+    // the names of core implementation classes are remapped to their
+    // public interface names.
+    //
+    // e.g.
+    //   get:foo@6be832b        -> foo
+    //   _MyClass@6b3832b.      -> _MyClass
+    //   _MyClass@6b3832b.named -> _MyClass.named
+    //   _OneByteString          -> String (remapped)
     kUserVisibleName
   };
 
@@ -705,6 +739,7 @@
   }
 
   RawString* Name() const;
+  RawString* PrettyName() const;
   RawString* UserVisibleName() const;
 
   virtual RawString* DictionaryName() const { return Name(); }
@@ -1155,7 +1190,9 @@
   class CycleFreeBit : public BitField<bool, kCycleFreeBit, 1> {};
 
   void set_name(const String& value) const;
+  void set_pretty_name(const String& value) const;
   void set_user_name(const String& value) const;
+  RawString* GeneratePrettyName() const;
   RawString* GenerateUserVisibleName() const;
   void set_signature_function(const Function& value) const;
   void set_signature_type(const AbstractType& value) const;
@@ -1273,6 +1310,12 @@
     return SubvectorName(0, Length(), kInternalName);
   }
 
+  // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>".
+  // Names of internal classes are not mapped to their public interfaces.
+  RawString* PrettyName() const {
+    return SubvectorName(0, Length(), kPrettyName);
+  }
+
   // 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 {
@@ -1463,7 +1506,9 @@
 class Function : public Object {
  public:
   RawString* name() const { return raw_ptr()->name_; }
+  RawString* PrettyName() const;
   RawString* UserVisibleName() const;
+  RawString* QualifiedPrettyName() const;
   RawString* QualifiedUserVisibleName() const;
   virtual RawString* DictionaryName() const { return name(); }
 
@@ -1477,6 +1522,12 @@
     return BuildSignature(instantiate, kInternalName, TypeArguments::Handle());
   }
 
+  RawString* PrettySignature() const {
+    const bool instantiate = false;
+    return BuildSignature(
+        instantiate, kPrettyName, TypeArguments::Handle());
+  }
+
   // Build a string of the form '(T, {b: B, c: C}) => R' representing the
   // user visible signature of the given function. In this example, T and R are
   // type parameters of class C, the owner of the function.
@@ -2095,6 +2146,7 @@
 class Field : public Object {
  public:
   RawString* name() const { return raw_ptr()->name_; }
+  RawString* PrettyName() const;
   RawString* UserVisibleName() const;
   virtual RawString* DictionaryName() const { return name(); }
 
@@ -3610,7 +3662,7 @@
   RawArray* ExtractTypeFeedbackArray() const;
 
   RawString* Name() const;
-  RawString* UserName() const;
+  RawString* PrettyName() const;
 
   int64_t compile_timestamp() const {
     return raw_ptr()->compile_timestamp_;
@@ -4296,6 +4348,10 @@
     return BuildName(kInternalName);
   }
 
+  virtual RawString* PrettyName() const {
+    return BuildName(kPrettyName);
+  }
+
   // 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 {
@@ -4795,16 +4851,8 @@
 class Number : public Instance {
  public:
   // TODO(iposva): Fill in a useful Number interface.
-  virtual bool IsZero() const {
-    // Number is an abstract class.
-    UNREACHABLE();
-    return false;
-  }
-  virtual bool IsNegative() const {
-    // Number is an abstract class.
-    UNREACHABLE();
-    return false;
-  }
+
+ private:
   OBJECT_IMPLEMENTATION(Number, Instance);
   friend class Class;
 };
@@ -4824,6 +4872,16 @@
                          Heap::Space space = Heap::kNew,
                          const bool silent = false);
 
+  // Integer is an abstract class.
+  virtual bool IsZero() const {
+    UNREACHABLE();
+    return false;
+  }
+  virtual bool IsNegative() const {
+    // Number is an abstract class.
+    UNREACHABLE();
+    return false;
+  }
   virtual double AsDoubleValue() const;
   virtual int64_t AsInt64Value() const;
   virtual uint32_t AsTruncatedUint32Value() const;
@@ -6818,7 +6876,6 @@
   }
 
   void MakeActive() const;
-  static void ClearActive();
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawUserTag));
@@ -6826,6 +6883,7 @@
 
   static RawUserTag* New(const String& label,
                          Heap::Space space = Heap::kOld);
+  static RawUserTag* DefaultTag();
 
   static bool TagTableIsFull(Isolate* isolate);
   static RawUserTag* FindTagById(uword tag_id);
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
new file mode 100644
index 0000000..f4c3c0e
--- /dev/null
+++ b/runtime/vm/object_graph.cc
@@ -0,0 +1,210 @@
+// 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.
+
+#include "vm/object_graph.h"
+
+#include "vm/dart.h"
+#include "vm/growable_array.h"
+#include "vm/isolate.h"
+#include "vm/object.h"
+#include "vm/raw_object.h"
+#include "vm/visitor.h"
+
+namespace dart {
+
+// The state of a pre-order, depth-first traversal of an object graph.
+// When a node is visited, *all* its children are pushed to the stack at once.
+// We insert a sentinel between the node and its children on the stack, to
+// remember that the node has been visited. The node is kept on the stack while
+// its children are processed, to give the visitor a complete chain of parents.
+//
+// TODO(koda): Potential optimizations:
+// - Linked chunks instead of std::vector.
+// - Use smi/heap tag bit instead of full-word sentinel.
+// - Extend RawObject with incremental iteration (one child at a time).
+class ObjectGraph::Stack : public ObjectPointerVisitor {
+ public:
+  explicit Stack(Isolate* isolate)
+      : ObjectPointerVisitor(isolate), data_(kInitialCapacity) { }
+
+  // Marks and pushes. Used to initialize this stack with roots.
+  virtual void VisitPointers(RawObject** first, RawObject** last) {
+    for (RawObject** current = first; current <= last; ++current) {
+      if ((*current)->IsHeapObject() && !(*current)->IsMarked()) {
+        (*current)->SetMarkBit();
+        data_.Add(*current);
+      }
+    }
+  }
+
+  // Traverses the object graph from the current state.
+  void TraverseGraph(ObjectGraph::Visitor* visitor) {
+    while (!data_.is_empty()) {
+      RawObject* obj = data_.Last();
+      if (obj == kSentinel) {
+        data_.RemoveLast();
+        // The node below the sentinel has already been visited.
+        data_.RemoveLast();
+        continue;
+      }
+      ASSERT(obj->IsHeapObject());
+      data_.Add(kSentinel);
+      StackIterator it(this, data_.length() - 2);
+      switch (visitor->VisitObject(&it)) {
+        case ObjectGraph::Visitor::kProceed:
+          obj->VisitPointers(this);
+          break;
+        case ObjectGraph::Visitor::kBacktrack:
+          break;
+        case ObjectGraph::Visitor::kAbort:
+          return;
+      }
+    }
+  }
+
+ private:
+  static RawObject* const kSentinel;
+  static const intptr_t kInitialCapacity = 1024;
+  GrowableArray<RawObject*> data_;
+  friend class StackIterator;
+  DISALLOW_COPY_AND_ASSIGN(Stack);
+};
+
+
+// We only visit heap objects, so any Smi works as the sentinel.
+RawObject* const ObjectGraph::Stack::kSentinel = Smi::New(0);
+
+
+RawObject* ObjectGraph::StackIterator::Get() const {
+  return stack_->data_[index_];
+}
+
+
+bool ObjectGraph::StackIterator::MoveToParent() {
+  // The parent is just below the next sentinel.
+  for (int i = index_; i >= 1; --i) {
+    if (stack_->data_[i] == Stack::kSentinel) {
+      index_ = i - 1;
+      return true;
+    }
+  }
+  return false;
+}
+
+
+class Unmarker : public ObjectVisitor {
+ public:
+  explicit Unmarker(Isolate* isolate) : ObjectVisitor(isolate) { }
+
+  void VisitObject(RawObject* obj) {
+    if (obj->IsMarked()) {
+      obj->ClearMarkBit();
+    }
+  }
+
+  static void UnmarkAll(Isolate* isolate) {
+    Unmarker unmarker(isolate);
+    isolate->heap()->IterateObjects(&unmarker);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Unmarker);
+};
+
+
+ObjectGraph::ObjectGraph(Isolate* isolate)
+    : StackResource(isolate) {
+  // The VM isolate has all its objects pre-marked, so iterating over it
+  // would be a no-op.
+  ASSERT(isolate != Dart::vm_isolate());
+  isolate->heap()->WriteProtectCode(false);
+}
+
+
+ObjectGraph::~ObjectGraph() {
+  isolate()->heap()->WriteProtectCode(true);
+}
+
+
+void ObjectGraph::IterateObjects(ObjectGraph::Visitor* visitor) {
+  NoGCScope no_gc_scope_;
+  Stack stack(isolate());
+  isolate()->VisitObjectPointers(&stack, false, false);
+  stack.TraverseGraph(visitor);
+  Unmarker::UnmarkAll(isolate());
+}
+
+
+void ObjectGraph::IterateObjectsFrom(const Object& root,
+                                     ObjectGraph::Visitor* visitor) {
+  NoGCScope no_gc_scope_;
+  Stack stack(isolate());
+  RawObject* root_raw = root.raw();
+  stack.VisitPointer(&root_raw);
+  stack.TraverseGraph(visitor);
+  // TODO(koda): Optimize if we only visited a small subgraph.
+  Unmarker::UnmarkAll(isolate());
+}
+
+
+class SizeVisitor : public ObjectGraph::Visitor {
+ public:
+  SizeVisitor() : size_(0) { }
+  intptr_t size() const { return size_; }
+  virtual bool ShouldSkip(RawObject* obj) const { return false; }
+  virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
+    RawObject* obj = it->Get();
+    if (ShouldSkip(obj)) {
+      return kBacktrack;
+    }
+    size_ += obj->Size();
+    return kProceed;
+  }
+ private:
+  intptr_t size_;
+};
+
+
+class SizeExcludingObjectVisitor : public SizeVisitor {
+ public:
+  explicit SizeExcludingObjectVisitor(const Object& skip) : skip_(skip) { }
+  virtual bool ShouldSkip(RawObject* obj) const { return obj == skip_.raw(); }
+ private:
+  const Object& skip_;
+};
+
+
+class SizeExcludingClassVisitor : public SizeVisitor {
+ public:
+  explicit SizeExcludingClassVisitor(intptr_t skip) : skip_(skip) { }
+  virtual bool ShouldSkip(RawObject* obj) const {
+    return obj->GetClassId() == skip_;
+  }
+ private:
+  const intptr_t skip_;
+};
+
+
+intptr_t ObjectGraph::SizeRetainedByInstance(const Object& obj) {
+  SizeVisitor total;
+  IterateObjects(&total);
+  intptr_t size_total = total.size();
+  SizeExcludingObjectVisitor excluding_obj(obj);
+  IterateObjects(&excluding_obj);
+  intptr_t size_excluding_obj = excluding_obj.size();
+  return size_total - size_excluding_obj;
+}
+
+
+intptr_t ObjectGraph::SizeRetainedByClass(intptr_t class_id) {
+  SizeVisitor total;
+  IterateObjects(&total);
+  intptr_t size_total = total.size();
+  SizeExcludingClassVisitor excluding_class(class_id);
+  IterateObjects(&excluding_class);
+  intptr_t size_excluding_class = excluding_class.size();
+  return size_total - size_excluding_class;
+}
+
+}  // namespace dart
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
new file mode 100644
index 0000000..8547421
--- /dev/null
+++ b/runtime/vm/object_graph.h
@@ -0,0 +1,77 @@
+// 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.
+
+#ifndef VM_OBJECT_GRAPH_H_
+#define VM_OBJECT_GRAPH_H_
+
+#include "vm/allocation.h"
+#include "vm/object.h"
+
+namespace dart {
+
+class Isolate;
+
+// Utility to traverse the object graph in an ordered fashion.
+// Example uses:
+// - find a retaining path from the isolate roots to a particular object, or
+// - determine how much memory is retained by some particular object(s).
+class ObjectGraph : public StackResource {
+ public:
+  class Stack;
+
+  // Allows climbing the search tree all the way to the root.
+  class StackIterator {
+   public:
+    // The object this iterator currently points to.
+    RawObject* Get() const;
+    // Returns false if there is no parent.
+    bool MoveToParent();
+   private:
+    StackIterator(const Stack* stack, intptr_t index)
+        : stack_(stack), index_(index) { }
+    const Stack* stack_;
+    intptr_t index_;
+    friend class ObjectGraph::Stack;
+    DISALLOW_IMPLICIT_CONSTRUCTORS(StackIterator);
+  };
+
+  class Visitor {
+   public:
+    // Directs how the search should continue after visiting an object.
+    enum Direction {
+      kProceed,    // Recurse on this object's pointers.
+      kBacktrack,  // Ignore this object's pointers.
+      kAbort,      // Terminate the entire search immediately.
+    };
+    virtual ~Visitor() { }
+    // Visits the object pointed to by *it. The iterator is only valid
+    // during this call. This method must not allocate from the heap or
+    // trigger GC in any way.
+    virtual Direction VisitObject(StackIterator* it) = 0;
+  };
+
+  explicit ObjectGraph(Isolate* isolate);
+  ~ObjectGraph();
+
+  // Visits all strongly reachable objects in the isolate's heap, in a
+  // pre-order, depth first traversal.
+  void IterateObjects(Visitor* visitor);
+
+  // Like 'IterateObjects', but restricted to objects reachable from 'root'
+  // (including 'root' itself).
+  void IterateObjectsFrom(const Object& root, Visitor* visitor);
+
+  // The number of bytes retained by 'obj'.
+  intptr_t SizeRetainedByInstance(const Object& obj);
+
+  // The number of bytes retained by the set of all objects of the given class.
+  intptr_t SizeRetainedByClass(intptr_t class_id);
+
+ private:
+  DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectGraph);
+};
+
+}  // namespace dart
+
+#endif  // VM_OBJECT_GRAPH_H_
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
new file mode 100644
index 0000000..8ee5e66
--- /dev/null
+++ b/runtime/vm/object_graph_test.cc
@@ -0,0 +1,96 @@
+// 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.
+
+#include "platform/assert.h"
+#include "vm/object_graph.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+class Counter : public ObjectGraph::Visitor {
+ public:
+  // Records the number of objects and total size visited, excluding 'skip'
+  // and any objects only reachable through 'skip'.
+  Counter(RawObject* skip, RawObject* expected_parent)
+      : count_(0), size_(0), skip_(skip), expected_parent_(expected_parent) { }
+
+  virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
+    RawObject* obj = it->Get();
+    if (obj == skip_) {
+      EXPECT(it->MoveToParent());
+      EXPECT_EQ(expected_parent_, it->Get());
+      return kBacktrack;
+    }
+    ++count_;
+    size_ += obj->Size();
+    return kProceed;
+  }
+
+  int count() const { return count_; }
+  int size() const { return size_; }
+
+ private:
+  int count_;
+  intptr_t size_;
+  RawObject* skip_;
+  RawObject* expected_parent_;
+};
+
+
+TEST_CASE(ObjectGraph) {
+  Isolate* isolate = Isolate::Current();
+  // Create a simple object graph with objects a, b, c, d:
+  //  a+->b+->c
+  //  +   +
+  //  |   v
+  //  +-->d
+  Array& a = Array::Handle(Array::New(2, Heap::kNew));
+  Array& b = Array::Handle(Array::New(2, Heap::kOld));
+  Array& c = Array::Handle(Array::New(0, Heap::kOld));
+  Array& d = Array::Handle(Array::New(0, Heap::kOld));
+  a.SetAt(0, b);
+  b.SetAt(0, c);
+  b.SetAt(1, d);
+  a.SetAt(1, d);
+  intptr_t a_size = a.raw()->Size();
+  intptr_t b_size = b.raw()->Size();
+  intptr_t c_size = c.raw()->Size();
+  intptr_t d_size = d.raw()->Size();
+  {
+    // No more allocation; raw pointers ahead.
+    NoGCScope no_gc_scope;
+    RawObject* b_raw = b.raw();
+    // Clear handles to cut unintended retained paths.
+    b = Array::null();
+    c = Array::null();
+    d = Array::null();
+    ObjectGraph graph(isolate);
+    {
+      // Compare count and size when 'b' is/isn't skipped.
+      Counter with(Object::null(), Object::null());
+      graph.IterateObjectsFrom(a, &with);
+      Counter without(b_raw, a.raw());
+      graph.IterateObjectsFrom(a, &without);
+      // Only 'b' and 'c' were cut off.
+      EXPECT_EQ(2, with.count() - without.count());
+      EXPECT_EQ(b_size + c_size,
+                with.size() - without.size());
+    }
+    {
+      // Like above, but iterate over the entire isolate. The counts and sizes
+      // are thus larger, but the difference should still be just 'b' and 'c'.
+      Counter with(Object::null(), Object::null());
+      graph.IterateObjects(&with);
+      Counter without(b_raw, a.raw());
+      graph.IterateObjects(&without);
+      EXPECT_EQ(2, with.count() - without.count());
+      EXPECT_EQ(b_size + c_size,
+                with.size() - without.size());
+    }
+    EXPECT_EQ(a_size + b_size + c_size + d_size,
+              graph.SizeRetainedByInstance(a));
+  }
+}
+
+}  // namespace dart
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index af2faeb..1c779f5 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -72,7 +72,8 @@
     out_of_memory_(Instance::null()),
     preallocated_stack_trace_(Stacktrace::null()),
     lookup_port_handler_(Function::null()),
-    handle_message_function_(Function::null()) {
+    handle_message_function_(Function::null()),
+    default_tag_(UserTag::null()) {
 }
 
 
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 2cafe52..dbd6122 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -397,6 +397,19 @@
     handle_message_function_ = function.raw();
   }
 
+  RawUserTag* default_tag() const {
+    return default_tag_;
+  }
+  void set_default_tag(const UserTag& tag) {
+    // Only set once.
+    ASSERT(default_tag_ == UserTag::null());
+    ASSERT(!tag.IsNull());
+    default_tag_ = tag.raw();
+  }
+  static intptr_t default_tag_offset() {
+    return OFFSET_OF(ObjectStore, default_tag_);
+  }
+
   // Visit all object pointers.
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
@@ -480,6 +493,7 @@
   RawStacktrace* preallocated_stack_trace_;
   RawFunction* lookup_port_handler_;
   RawFunction* handle_message_function_;
+  RawUserTag* default_tag_;
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&handle_message_function_);
   }
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 33e6c05..45cef4d 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2361,15 +2361,18 @@
   const int first_frame_index = -1;
   LocalScope* loop_owner = parent_scope;
   LocalScope* context_owner = NULL;   // No context allocated yet.
+  bool found_captured_vars = false;
   int next_frame_index = parent_scope->AllocateVariables(first_parameter_index,
                                                          num_parameters,
                                                          first_frame_index,
                                                          loop_owner,
-                                                         &context_owner);
+                                                         &context_owner,
+                                                         &found_captured_vars);
   EXPECT_EQ(first_frame_index, next_frame_index);  // a and c not in frame.
   EXPECT_EQ(parent_scope, context_owner);  // parent_scope allocated a context.
   const intptr_t parent_scope_context_level = 1;
   EXPECT_EQ(parent_scope_context_level, parent_scope->context_level());
+  EXPECT(found_captured_vars);
 
   const intptr_t local_scope_context_level = 5;
   const ContextScope& context_scope = ContextScope::Handle(
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index c4a5546..57c0efe 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -296,15 +296,7 @@
     if (page->Contains(addr)) {
       return true;
     }
-    page = page->next();
-  }
-
-  page = large_pages_;
-  while (page != NULL) {
-    if (page->Contains(addr)) {
-      return true;
-    }
-    page = page->next();
+    page = NextPageAnySize(page);
   }
   return false;
 }
@@ -316,15 +308,7 @@
     if ((page->type() == type) && page->Contains(addr)) {
       return true;
     }
-    page = page->next();
-  }
-
-  page = large_pages_;
-  while (page != NULL) {
-    if ((page->type() == type) && page->Contains(addr)) {
-      return true;
-    }
-    page = page->next();
+    page = NextPageAnySize(page);
   }
   return false;
 }
@@ -334,11 +318,7 @@
   ASSERT(pages_ != NULL || large_pages_ != NULL);
   *start = static_cast<uword>(~0);
   *end = 0;
-  for (HeapPage* page = pages_; page != NULL; page = page->next()) {
-    *start = Utils::Minimum(*start, page->object_start());
-    *end = Utils::Maximum(*end, page->object_end());
-  }
-  for (HeapPage* page = large_pages_; page != NULL; page = page->next()) {
+  for (HeapPage* page = pages_; page != NULL; page = NextPageAnySize(page)) {
     *start = Utils::Minimum(*start, page->object_start());
     *end = Utils::Maximum(*end, page->object_end());
   }
@@ -351,13 +331,7 @@
   HeapPage* page = pages_;
   while (page != NULL) {
     page->VisitObjects(visitor);
-    page = page->next();
-  }
-
-  page = large_pages_;
-  while (page != NULL) {
-    page->VisitObjects(visitor);
-    page = page->next();
+    page = NextPageAnySize(page);
   }
 }
 
@@ -366,13 +340,7 @@
   HeapPage* page = pages_;
   while (page != NULL) {
     page->VisitObjectPointers(visitor);
-    page = page->next();
-  }
-
-  page = large_pages_;
-  while (page != NULL) {
-    page->VisitObjectPointers(visitor);
-    page = page->next();
+    page = NextPageAnySize(page);
   }
 }
 
@@ -388,18 +356,7 @@
         return obj;
       }
     }
-    page = page->next();
-  }
-
-  page = large_pages_;
-  while (page != NULL) {
-    if (page->type() == type) {
-      RawObject* obj = page->FindObject(visitor);
-      if (obj != Object::null()) {
-        return obj;
-      }
-    }
-    page = page->next();
+    page = NextPageAnySize(page);
   }
   return Object::null();
 }
@@ -409,12 +366,7 @@
   HeapPage* page = pages_;
   while (page != NULL) {
     page->WriteProtect(read_only);
-    page = page->next();
-  }
-  page = large_pages_;
-  while (page != NULL) {
-    page->WriteProtect(read_only);
-    page = page->next();
+    page = NextPageAnySize(page);
   }
 }
 
@@ -493,6 +445,20 @@
 }
 
 
+void PageSpace::WriteProtectCode(bool read_only) {
+  // TODO(koda): Is this flag still useful?
+  if (FLAG_write_protect_code) {
+    HeapPage* current_page = pages_;
+    while (current_page != NULL) {
+      if (current_page->type() == HeapPage::kExecutable) {
+        current_page->WriteProtect(read_only);
+      }
+      current_page = NextPageAnySize(current_page);
+    }
+  }
+}
+
+
 void PageSpace::MarkSweep(bool invoke_api_callbacks) {
   // MarkSweep is not reentrant. Make sure that is the case.
   ASSERT(!sweeping_);
@@ -516,23 +482,8 @@
 
   const int64_t start = OS::GetCurrentTimeMicros();
 
-  if (FLAG_write_protect_code) {
-    // Make code pages writable.
-    HeapPage* current_page = pages_;
-    while (current_page != NULL) {
-      if (current_page->type() == HeapPage::kExecutable) {
-        current_page->WriteProtect(false);
-      }
-      current_page = current_page->next();
-    }
-    current_page = large_pages_;
-    while (current_page != NULL) {
-      if (current_page->type() == HeapPage::kExecutable) {
-        current_page->WriteProtect(false);
-      }
-      current_page = current_page->next();
-    }
-  }
+  // Make code pages writable.
+  WriteProtectCode(false);
 
   // Save old value before GCMarker visits the weak persistent handles.
   SpaceUsage usage_before = usage_;
@@ -584,23 +535,8 @@
     page = next_page;
   }
 
-  if (FLAG_write_protect_code) {
-    // Make code pages read-only.
-    HeapPage* current_page = pages_;
-    while (current_page != NULL) {
-      if (current_page->type() == HeapPage::kExecutable) {
-        current_page->WriteProtect(true);
-      }
-      current_page = current_page->next();
-    }
-    current_page = large_pages_;
-    while (current_page != NULL) {
-      if (current_page->type() == HeapPage::kExecutable) {
-        current_page->WriteProtect(true);
-      }
-      current_page = current_page->next();
-    }
-  }
+  // Make code pages read-only.
+  WriteProtectCode(true);
 
   int64_t end = OS::GetCurrentTimeMicros();
 
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index e3b777e..ba57eaa 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -250,7 +250,9 @@
     return UsedInWords() + ExternalInWords() > max_capacity_in_words_;
   }
 
+  // TODO(koda): Unify protection handling.
   void WriteProtect(bool read_only);
+  void WriteProtectCode(bool read_only);
 
   void AddGCTime(int64_t micros) {
     gc_time_micros_ += micros;
@@ -296,6 +298,10 @@
   HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type);
   void FreeLargePage(HeapPage* page, HeapPage* previous_page);
   void FreePages(HeapPage* pages);
+  HeapPage* NextPageAnySize(HeapPage* page) const {
+    ASSERT(pages_tail_ == NULL || pages_tail_->next() == NULL);
+    return page == pages_tail_ ? large_pages_ : page->next();
+  }
 
   static intptr_t LargePageSizeInWordsFor(intptr_t size);
 
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index b7ff5d3..b019d06 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -167,21 +167,29 @@
   // Allocate parameters and local variables, either in the local frame or
   // in the context(s).
   LocalScope* context_owner = NULL;  // No context needed yet.
+  bool found_captured_variables = false;
   int next_free_frame_index =
       scope->AllocateVariables(first_parameter_index_,
                                num_params,
                                first_stack_local_index_,
                                scope,
-                               &context_owner);
+                               &context_owner,
+                               &found_captured_variables);
 
-  // If this function allocates context variables, but none of its enclosing
-  // functions do, the context on entry is not linked as parent of the allocated
-  // context but saved on entry and restored on exit as to prevent memory leaks.
-  // Add and allocate a local variable to this purpose.
-  if (context_owner != NULL) {
+  // We save the entry context for a function when...
+  //
+  //   - some variable in the function is captured by nested functions, and
+  //   - the function does not capture any variables from parent functions.
+  //
+  // We used to link to the parent context in these cases, but this
+  // had the effect of unintentionally retaining parent contexts which
+  // would never be accessed.  By breaking the context chain at this
+  // point, we allow these outer contexts to be collected.
+  if (found_captured_variables) {
     const ContextScope& context_scope =
         ContextScope::Handle(function().context_scope());
     if (context_scope.IsNull() || (context_scope.num_variables() == 0)) {
+      // Allocate a local variable for saving the entry context.
       LocalVariable* context_var =
           new LocalVariable(function().token_pos(),
                             Symbols::SavedEntryContextVar(),
@@ -863,8 +871,7 @@
     }
     if (!parser.current_function().IsLocalFunction() ||
         ((instantiator != NULL) && instantiator->is_captured())) {
-      parsed_function->set_instantiator(
-          new LoadLocalNode(node_sequence->token_pos(), instantiator));
+      parsed_function->set_instantiator(instantiator);
     }
   }
 
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index c65dff6..ab5bdb4 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -61,8 +61,8 @@
   SequenceNode* node_sequence() const { return node_sequence_; }
   void SetNodeSequence(SequenceNode* node_sequence);
 
-  AstNode* instantiator() const { return instantiator_; }
-  void set_instantiator(AstNode* instantiator) {
+  LocalVariable* instantiator() const { return instantiator_; }
+  void set_instantiator(LocalVariable* instantiator) {
     // May be NULL.
     instantiator_ = instantiator;
   }
@@ -124,7 +124,7 @@
   const Function& function_;
   Code& code_;
   SequenceNode* node_sequence_;
-  AstNode* instantiator_;
+  LocalVariable* instantiator_;
   Array& default_parameter_values_;
   LocalVariable* saved_current_context_var_;
   LocalVariable* saved_entry_context_var_;
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index c594fcb..e509383 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -5,6 +5,7 @@
 
 #include "vm/ast_printer.h"
 #include "vm/class_finalizer.h"
+#include "vm/debugger.h"
 #include "vm/longjump.h"
 #include "vm/object.h"
 #include "vm/parser.h"
@@ -13,6 +14,8 @@
 
 namespace dart {
 
+DECLARE_FLAG(bool, show_invisible_frames);
+
 
 void DumpFunction(const Library& lib, const char* cname, const char* fname) {
   const String& classname = String::Handle(Symbols::New(cname));
@@ -162,4 +165,383 @@
   DumpFunction(lib, "B", "bam");
 }
 
+
+// TODO(zra): Remove after porting relevant arm64 features.
+#if !defined(TARGET_ARCH_ARM64)
+
+const char* saved_vars = NULL;
+
+
+char* SkipIndex(const char* input) {
+  char* output_buffer = new char[strlen(input)];
+  char* output = output_buffer;
+
+  while (input[0] != '\0') {
+    const char* index_pos = strstr(input, "index=");
+    if (index_pos == NULL) {
+      while (input[0] != '\0') {
+        *output++ = *input++;
+      }
+      break;
+    }
+
+    // Copy prefix until "index="
+    while (input < index_pos) {
+      *output++ = *input++;
+    }
+
+    // Skip until space.
+    input += strcspn(input, " ");
+    // Skip until next non-space.
+    input += strspn(input, " ");
+  }
+
+  output[0] = '\0';
+  return output_buffer;
+}
+
+
+// Saves the var descriptors for all frames on the stack as a string.
+static void SaveVars(Dart_IsolateId isolate_id,
+                     intptr_t bp_id,
+                     const Dart_CodeLocation& loc) {
+  DebuggerStackTrace* stack =
+      Isolate::Current()->debugger()->StackTrace();
+  intptr_t num_frames = stack->Length();
+  const int kBufferLen = 2048;
+  char* buffer = new char[kBufferLen];
+  char* pos = buffer;
+  LocalVarDescriptors& var_desc = LocalVarDescriptors::Handle();
+  for (intptr_t i = 0; i < num_frames; i++) {
+    ActivationFrame* frame = stack->FrameAt(i);
+    var_desc = frame->code().var_descriptors();
+    const char* var_str = SkipIndex(var_desc.ToCString());
+    pos += OS::SNPrint(pos, (kBufferLen - (pos - buffer)),
+                       "%s\n%s",
+                       frame->function().ToQualifiedCString(),
+                       var_str);
+    delete [] var_str;
+  }
+  pos[0] = '\0';
+  saved_vars = buffer;
+}
+
+
+// Uses the debugger to pause the program and capture the variable
+// descriptors for all frames on the stack.
+static const char* CaptureVarsAtLine(Dart_Handle lib,
+                                     const char* entry,
+                                     int line) {
+  EXPECT(ClassFinalizer::ProcessPendingClasses());
+  bool saved_flag = FLAG_show_invisible_frames;
+  FLAG_show_invisible_frames = true;
+  Isolate* isolate = Isolate::Current();
+  Debugger* debugger = isolate->debugger();
+  const String& url = String::Handle(String::New(TestCase::url()));
+  Dart_SetPausedEventHandler(SaveVars);
+  debugger->SetBreakpointAtLine(url, line);
+  saved_vars = NULL;
+  EXPECT_VALID(Dart_Invoke(lib, NewString(entry), 0, NULL));
+  const char* tmp = saved_vars;
+  saved_vars = NULL;
+  FLAG_show_invisible_frames = saved_flag;
+  return tmp;
+}
+
+
+TEST_CASE(Parser_AllocateVariables_CapturedVar) {
+  const char* kScriptChars =
+      "int main() {\n"
+      "  var value = 11;\n"
+      "  int f(var param) {\n"
+      "    return param + value;\n"  // line 4
+      "  }\n"
+      "  return f(22);\n"
+      "}\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT_VALID(lib);
+  EXPECT_STREQ(
+      // function f uses one ctx var at (0); doesn't save ctx.
+      "::.main_f\n"
+      " 0 ContextVar    level=0   begin=14  end=28  name=value\n"
+      " 1 StackVar      scope=1   begin=16  end=28  name=param\n"
+
+      // Closure call saves current context.
+      "(dynamic, dynamic) => int.call\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
+      "   name=:saved_current_context_var\n"
+
+      // function main uses one ctx var at (1); saves caller ctx.
+      "::.main\n"
+      " 0 ContextLevel  level=1   scope=1   begin=2   end=37\n"
+      " 1 SavedEntryCtx scope=0   begin=0   end=0"
+      "   name=:saved_entry_context_var\n"
+      " 2 ContextVar    level=1   begin=7   end=37  name=value\n"
+      " 3 StackVar      scope=2   begin=12  end=37  name=f\n",
+      CaptureVarsAtLine(lib, "main", 4));
+}
+
+
+TEST_CASE(Parser_AllocateVariables_NestedCapturedVar) {
+  const char* kScriptChars =
+      "int a() {\n"
+      "  int b() {\n"
+      "    var value = 11;\n"
+      "    int c() {\n"
+      "      return value;\n"  // line 5
+      "    }\n"
+      "    return c();\n"
+      "  }\n"
+      "  return b();\n"
+      "}\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT_VALID(lib);
+  EXPECT_STREQ(
+      // Innermost function uses captured variable 'value' from middle
+      // function.
+      "::.a_b_c\n"
+      " 0 ContextVar    level=0   begin=20  end=30  name=value\n"
+
+      // Closure call saves current context.
+      "(dynamic) => int.call\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
+      "   name=:saved_current_context_var\n"
+
+      // Middle function saves the entry context.  Notice that this
+      // happens here and not in the outermost function.  We always
+      // save the entry context at the last possible moment.
+      "::.a_b\n"
+      " 0 ContextLevel  level=1   scope=1   begin=8   end=38\n"
+      " 1 SavedEntryCtx scope=0   begin=0   end=0"
+      "   name=:saved_entry_context_var\n"
+      " 2 ContextVar    level=1   begin=13  end=38  name=value\n"
+      " 3 StackVar      scope=2   begin=18  end=38  name=c\n"
+
+      // Closure call saves current context.
+      "(dynamic) => int.call\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
+      "   name=:saved_current_context_var\n"
+
+      // Outermost function neglects to save the entry context.  We
+      // don't save the entry context if the function has no captured
+      // variables.
+      "::.a\n"
+      " 0 StackVar      scope=2   begin=6   end=46  name=b\n",
+      CaptureVarsAtLine(lib, "a", 5));
+}
+
+
+TEST_CASE(Parser_AllocateVariables_TwoChains) {
+  const char* kScriptChars =
+      "int a() {\n"
+      "  var value1 = 11;\n"
+      "  int b() {\n"
+      "    int aa() {\n"
+      "      var value2 = 12;\n"
+      "      int bb() {\n"
+      "        return value2;\n"  // line 7
+      "      }\n"
+      "      return bb();\n"
+      "    }\n"
+      "    return value1 + aa();\n"
+      "  }\n"
+      "  return b();\n"
+      "}\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT_VALID(lib);
+  EXPECT_STREQ(
+      // bb captures only value2 from aa.  No others.
+      "::.a_b_aa_bb\n"
+      " 0 ContextVar    level=0   begin=32  end=42  name=value2\n"
+
+      // Closure call saves current context.
+      "(dynamic) => int.call\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
+      "   name=:saved_current_context_var\n"
+
+      // aa shares value2. Notice that we save the entry ctx instead
+      // of chaining from b.  This keeps us from holding onto closures
+      // that we would never access.
+      "::.a_b_aa\n"
+      " 0 ContextLevel  level=1   scope=1   begin=20  end=50\n"
+      " 1 SavedEntryCtx scope=0   begin=0   end=0"
+      "   name=:saved_entry_context_var\n"
+      " 2 ContextVar    level=1   begin=25  end=50  name=value2\n"
+      " 3 StackVar      scope=2   begin=30  end=50  name=bb\n"
+
+      // Closure call saves current context.
+      "(dynamic) => int.call\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
+      "   name=:saved_current_context_var\n"
+
+      // b captures value1 from a.
+      "::.a_b\n"
+      " 0 ContextVar    level=0   begin=14  end=60  name=value1\n"
+      " 1 StackVar      scope=2   begin=18  end=60  name=aa\n"
+
+      // Closure call saves current context.
+      "(dynamic) => int.call\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
+      "   name=:saved_current_context_var\n"
+
+      // a shares value1, saves entry ctx.
+      "::.a\n"
+      " 0 ContextLevel  level=1   scope=1   begin=2   end=68\n"
+      " 1 SavedEntryCtx scope=0   begin=0   end=0"
+      "   name=:saved_entry_context_var\n"
+      " 2 ContextVar    level=1   begin=7   end=68  name=value1\n"
+      " 3 StackVar      scope=2   begin=12  end=68  name=b\n",
+      CaptureVarsAtLine(lib, "a", 7));
+}
+
+
+TEST_CASE(Parser_AllocateVariables_Issue7681) {
+  // This is a distilled version of the program from Issue 7681.
+  //
+  // When we create the closure at line 11, we need to make sure to
+  // save the entry context instead of chaining to the parent context.
+  //
+  // This test is somewhat redundant with CapturedVarChain but
+  // included for good measure.
+  const char* kScriptChars =
+      "class X {\n"
+      "  Function onX;\n"
+      "}\n"
+      "\n"
+      "class Y {\n"
+      "  Function onY;\n"
+      "}\n"
+      "\n"
+      "void doIt() {\n"
+      "  var x = new X();\n"
+      "  x.onX = (y) {\n"
+      "    y.onY = () {\n"  // line 12
+      "      return y;\n"
+      "    };\n"
+      "  };\n"
+      "   x.onX(new Y());\n"
+      "}\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT_VALID(lib);
+  EXPECT_STREQ(
+      // This frame saves the entry context instead of chaining.  Good.
+      "::.doIt_<anonymous closure>\n"
+      " 0 ContextLevel  level=1   scope=1   begin=41  end=62\n"
+      " 1 ContextVar    level=1   begin=42  end=62  name=y\n"
+      " 2 SavedEntryCtx scope=0   begin=0   end=0"
+      "   name=:saved_entry_context_var\n"
+
+      // Closure call saves current context.
+      "(dynamic, dynamic) => dynamic.call\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
+      "   name=:saved_current_context_var\n"
+
+      "X.onX\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+
+      // No context is saved here since no vars are captured.
+      "::.doIt\n"
+      " 0 StackVar      scope=2   begin=29  end=77  name=x\n",
+      CaptureVarsAtLine(lib, "doIt", 12));
+}
+
+
+TEST_CASE(Parser_AllocateVariables_CaptureLoopVar) {
+  // This test verifies that...
+  //
+  //   https://code.google.com/p/dart/issues/detail?id=18561
+  //
+  // ...stays fixed.
+  const char* kScriptChars =
+      "int outer() {\n"
+      "  for(int i = 0; i < 1; i++) {\n"
+      "    var value = 11 + i;\n"
+      "    int inner() {\n"
+      "      return value;\n"  // line 5
+      "    }\n"
+      "    return inner();\n"
+      "  }\n"
+      "}\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT_VALID(lib);
+  EXPECT_STREQ(
+      // inner function captures variable value.  That's fine.
+      "::.outer_inner\n"
+      " 0 ContextVar    level=0   begin=32  end=42  name=value\n"
+
+      // Closure call saves current context.
+      "(dynamic) => int.call\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
+      "   name=:saved_current_context_var\n"
+
+      // The outer function saves the entry context, even though the
+      // captured variable is in a loop.  Good.
+      "::.outer\n"
+      " 0 SavedEntryCtx scope=0   begin=0   end=0"
+      "   name=:saved_entry_context_var\n"
+      " 1 StackVar      scope=3   begin=9   end=50  name=i\n"
+      " 2 ContextLevel  level=1   scope=4   begin=20  end=50\n"
+      " 3 ContextVar    level=1   begin=23  end=50  name=value\n"
+      " 4 StackVar      scope=4   begin=30  end=50  name=inner\n",
+      CaptureVarsAtLine(lib, "outer", 5));
+}
+
+TEST_CASE(Parser_AllocateVariables_MiddleChain) {
+  const char* kScriptChars =
+      "a() {\n"
+      "  int x = 11;\n"
+      "  b() {\n"
+      "    for (int i = 0; i < 1; i++) {\n"
+      "      int d() {\n"
+      "        return i;\n"
+      "      }\n"
+      "    }\n"
+      "    int c() {\n"
+      "      return x + 1;\n"  // line 10
+      "    }\n"
+      "    return c();\n"
+      "  }\n"
+      "  return b();\n"
+      "}\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT_VALID(lib);
+  EXPECT_STREQ(
+      "::.a_b_c\n"
+      " 0 ContextVar    level=0   begin=48  end=60  name=x\n"
+      "(dynamic) => int.call\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
+      "   name=:saved_current_context_var\n"
+
+      // Doesn't save the entry context.  Chains to parent instead.
+      "::.a_b\n"
+      " 0 ContextVar    level=0   begin=12  end=68  name=x\n"
+      " 1 StackVar      scope=2   begin=46  end=68  name=c\n"
+      " 2 ContextLevel  level=1   scope=3   begin=18  end=46\n"
+      " 3 ContextVar    level=1   begin=19  end=46  name=i\n"
+      " 4 StackVar      scope=4   begin=32  end=46  name=d\n"
+
+      "(dynamic) => dynamic.call\n"
+      " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
+      "   name=:saved_current_context_var\n"
+
+      "::.a\n"
+      " 0 ContextLevel  level=1   scope=1   begin=1   end=76\n"
+      " 1 SavedEntryCtx scope=0   begin=0   end=0"
+      "   name=:saved_entry_context_var\n"
+      " 2 ContextVar    level=1   begin=6   end=76  name=x\n"
+      " 3 StackVar      scope=2   begin=11  end=76  name=b\n",
+      CaptureVarsAtLine(lib, "a", 10));
+}
+#endif
+
 }  // namespace dart
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index d8ec5da..49df08a 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -13,6 +13,7 @@
 #include "vm/object.h"
 #include "vm/os.h"
 #include "vm/profiler.h"
+#include "vm/reusable_handles.h"
 #include "vm/signal_handler.h"
 #include "vm/simulator.h"
 #include "vm/stack_frame.h"
@@ -910,6 +911,98 @@
 };
 
 
+class FixTopFrameVisitor : public SampleVisitor {
+ public:
+  explicit FixTopFrameVisitor(Isolate* isolate)
+      : SampleVisitor(isolate),
+        vm_isolate_(Dart::vm_isolate()) {
+  }
+
+  void VisitSample(Sample* sample) {
+    if (sample->processed()) {
+      // Already processed.
+      return;
+    }
+    REUSABLE_CODE_HANDLESCOPE(isolate());
+    // Mark that we've processed this sample.
+    sample->set_processed(true);
+    // Lookup code object for leaf frame.
+    Code& code = reused_code_handle.Handle();
+    code = FindCodeForPC(sample->At(0));
+    sample->set_leaf_frame_is_dart(!code.IsNull());
+    if (sample->pc_marker() == 0) {
+      // No pc marker. Nothing to do.
+      return;
+    }
+    if (!code.IsNull() && (code.compile_timestamp() > sample->timestamp())) {
+      // Code compiled after sample. Ignore.
+      return;
+    }
+    if (sample->leaf_frame_is_dart()) {
+      CheckForMissingDartFrame(code, sample);
+    }
+  }
+
+ private:
+  void CheckForMissingDartFrame(const Code& code, Sample* sample) const {
+    // Some stubs (and intrinsics) do not push a frame onto the stack leaving
+    // the frame pointer in the caller.
+    //
+    // PC -> STUB
+    // FP -> DART3  <-+
+    //       DART2  <-|  <- TOP FRAME RETURN ADDRESS.
+    //       DART1  <-|
+    //       .....
+    //
+    // In this case, traversing the linked stack frames will not collect a PC
+    // inside DART3. The stack will incorrectly be: STUB, DART2, DART1.
+    // In Dart code, after pushing the FP onto the stack, an IP in the current
+    // function is pushed onto the stack as well. This stack slot is called
+    // the PC marker. We can use the PC marker to insert DART3 into the stack
+    // so that it will correctly be: STUB, DART3, DART2, DART1. Note the
+    // inserted PC may not accurately reflect the true return address from STUB.
+    ASSERT(!code.IsNull());
+    if (sample->sp() == sample->fp()) {
+      // Haven't pushed pc marker yet.
+      return;
+    }
+    uword pc_marker = sample->pc_marker();
+    if (code.ContainsInstructionAt(pc_marker)) {
+      // PC marker is in the same code as pc, no missing frame.
+      return;
+    }
+    if (!ContainedInDartCodeHeaps(pc_marker)) {
+      // Not a valid PC marker.
+      return;
+    }
+    sample->InsertCallerForTopFrame(pc_marker);
+  }
+
+  bool ContainedInDartCodeHeaps(uword pc) const {
+    return isolate()->heap()->CodeContains(pc) ||
+           vm_isolate()->heap()->CodeContains(pc);
+  }
+
+  Isolate* vm_isolate() const {
+    return vm_isolate_;
+  }
+
+  RawCode* FindCodeForPC(uword pc) const {
+    // Check current isolate for pc.
+    if (isolate()->heap()->CodeContains(pc)) {
+      return Code::LookupCode(pc);
+    }
+    // Check VM isolate for pc.
+    if (vm_isolate()->heap()->CodeContains(pc)) {
+      return Code::LookupCodeInVmIsolate(pc);
+    }
+    return Code::null();
+  }
+
+  Isolate* vm_isolate_;
+};
+
+
 class CodeRegionTableBuilder : public SampleVisitor {
  public:
   CodeRegionTableBuilder(Isolate* isolate,
@@ -1356,6 +1449,12 @@
                                      &dead_code_table,
                                      &tag_code_table);
       {
+        // Preprocess samples and fix the caller when the top PC is in a
+        // stub or intrinsic without a frame.
+        FixTopFrameVisitor fixTopFrame(isolate);
+        sample_buffer->VisitSamples(&fixTopFrame);
+      }
+      {
         // Build CodeRegion tables.
         ScopeStopwatch sw("CodeRegionTableBuilder");
         sample_buffer->VisitSamples(&builder);
@@ -1600,6 +1699,8 @@
       // the isolates stack limit.
       lower_bound_ = original_sp_;
     }
+    // Store the PC marker for the top frame.
+    sample_->set_pc_marker(GetCurrentFramePcMarker(fp));
     int i = 0;
     for (; i < FLAG_profile_depth; i++) {
       if (FLAG_profile_verify_stack_walk) {
@@ -1662,6 +1763,13 @@
     return reinterpret_cast<uword*>(*(fp + kSavedCallerFpSlotFromFp));
   }
 
+  uword GetCurrentFramePcMarker(uword* fp) const {
+    if (!ValidFramePointer(fp)) {
+      return 0;
+    }
+    return *(fp + kPcMarkerSlotFromFp);
+  }
+
   bool ValidFramePointer(uword* fp) const {
     if (fp == NULL) {
       return false;
@@ -1672,7 +1780,6 @@
     return r;
   }
 
-
   Sample* sample_;
   const uword stack_upper_;
   const uword original_pc_;
@@ -1705,6 +1812,8 @@
   sample->Init(isolate, OS::GetCurrentTimeMicros(), state.tid);
   sample->set_vm_tag(isolate->vm_tag());
   sample->set_user_tag(isolate->user_tag());
+  sample->set_sp(state.sp);
+  sample->set_fp(state.fp);
   if (FLAG_profile_native_stack) {
     // Collect native and Dart frames.
     uword stack_lower = 0;
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 0b681c4..0602b27 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -83,7 +83,7 @@
 };
 
 
-class SampleVisitor {
+class SampleVisitor : public ValueObject {
  public:
   explicit SampleVisitor(Isolate* isolate) : isolate_(isolate), visited_(0) { }
   virtual ~SampleVisitor() {}
@@ -119,8 +119,12 @@
     timestamp_ = timestamp;
     tid_ = tid;
     isolate_ = isolate;
+    pc_marker_ = 0;
     vm_tag_ = VMTag::kInvalidTagId;
-    user_tag_ = UserTags::kNoUserTag;
+    user_tag_ = UserTags::kDefaultUserTag;
+    sp_ = 0;
+    fp_ = 0;
+    state_ = 0;
     for (intptr_t i = 0; i < kSampleFramesSize; i++) {
       pcs_[i] = 0;
     }
@@ -165,12 +169,73 @@
     user_tag_ = tag;
   }
 
+  uword pc_marker() const {
+    return pc_marker_;
+  }
+
+  void set_pc_marker(uword pc_marker) {
+    pc_marker_ = pc_marker;
+  }
+
+  uword sp() const {
+    return sp_;
+  }
+
+  void set_sp(uword sp) {
+    sp_ = sp;
+  }
+
+  uword fp() const {
+    return fp_;
+  }
+
+  void set_fp(uword fp) {
+    fp_ = fp;
+  }
+
+  void InsertCallerForTopFrame(uword pc) {
+    // The caller for the top frame is store at index 1.
+    // Shift all entries down by one.
+    for (intptr_t i = kSampleFramesSize - 1; i >= 2; i--) {
+      pcs_[i] = pcs_[i - 1];
+    }
+    // Insert caller for top frame.
+    pcs_[1] = pc;
+  }
+
+  bool processed() const {
+    return ProcessedBit::decode(state_);
+  }
+
+  void set_processed(bool processed) {
+    state_ = ProcessedBit::update(processed, state_);
+  }
+
+  bool leaf_frame_is_dart() const {
+    return LeafFrameIsDart::decode(state_);
+  }
+
+  void set_leaf_frame_is_dart(bool leaf_frame_is_dart) {
+    state_ = LeafFrameIsDart::update(leaf_frame_is_dart, state_);
+  }
+
  private:
+  enum StateBits {
+    kProcessedBit = 0,
+    kLeafFrameIsDartBit = 1,
+  };
+  class ProcessedBit : public BitField<bool, kProcessedBit, 1> {};
+  class LeafFrameIsDart : public BitField<bool, kLeafFrameIsDartBit, 1> {};
+
   int64_t timestamp_;
   ThreadId tid_;
   Isolate* isolate_;
+  uword pc_marker_;
   uword vm_tag_;
   uword user_tag_;
+  uword sp_;
+  uword fp_;
+  uword state_;
   uword pcs_[kSampleFramesSize];
 };
 
@@ -207,25 +272,23 @@
 
   void VisitSamples(SampleVisitor* visitor) {
     ASSERT(visitor != NULL);
-    Sample sample;
     const intptr_t length = capacity();
     for (intptr_t i = 0; i < length; i++) {
-      // Copy the sample.
-      sample = *At(i);
-      if (sample.isolate() != visitor->isolate()) {
+      Sample* sample = At(i);
+      if (sample->isolate() != visitor->isolate()) {
         // Another isolate.
         continue;
       }
-      if (sample.timestamp() == 0) {
+      if (sample->timestamp() == 0) {
         // Empty.
         continue;
       }
-      if (sample.At(0) == 0) {
+      if (sample->At(0) == 0) {
         // No frames.
         continue;
       }
       visitor->IncrementVisited();
-      visitor->VisitSample(&sample);
+      visitor->VisitSample(sample);
     }
   }
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index c511c48..5d394f6 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -456,6 +456,7 @@
   friend class RawTypedData;
   friend class Scavenger;
   friend class ScavengerVisitor;
+  friend class SizeExcludingClassVisitor;  // GetClassId
   friend class SnapshotReader;
   friend class SnapshotWriter;
   friend class String;
@@ -1629,6 +1630,7 @@
   uword tag_;
 
   friend class SnapshotReader;
+  friend class Object;
 
  public:
   uword tag() const { return tag_; }
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 952bcc2..d2ce0df 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1026,6 +1026,11 @@
         reader->Read<Dart_NativeEntryResolver>();
     ASSERT(resolver == NULL);
     library.set_native_entry_resolver(resolver);
+    // The symbol resolver is not serialized.
+    Dart_NativeEntrySymbol symbol_resolver =
+        reader->Read<Dart_NativeEntrySymbol>();
+    ASSERT(symbol_resolver == NULL);
+    library.set_native_entry_symbol_resolver(symbol_resolver);
     // The cache of loaded scripts is not serialized.
     library.raw_ptr()->loaded_scripts_ = Array::null();
 
@@ -1074,6 +1079,9 @@
     // We do not serialize the native resolver over, this needs to be explicitly
     // set after deserialization.
     writer->Write<Dart_NativeEntryResolver>(NULL);
+    // We do not serialize the native entry symbol, this needs to be explicitly
+    // set after deserialization.
+    writer->Write<Dart_NativeEntrySymbol>(NULL);
     // We do not write the loaded_scripts_ cache to the snapshot. It gets
     // set to NULL when reading the library from the snapshot, and will
     // be rebuilt lazily.
diff --git a/runtime/vm/reusable_handles.h b/runtime/vm/reusable_handles.h
index db2752e..2f82687 100644
--- a/runtime/vm/reusable_handles.h
+++ b/runtime/vm/reusable_handles.h
@@ -11,19 +11,24 @@
 
 namespace dart {
 
-// The class ReusableHandleScope is used in regions of the
-// virtual machine where isolate specific reusable handles are used.
-// This class asserts that we do not add code that will result in recursive
-// uses of reusable handles.
-// It is used as follows:
+// Classes registered in REUSABLE_HANDLE_LIST have an isolate specific reusable
+// handle. A guard class (Reusable*ClassName*HandleScope) should be used in
+// regions of the virtual machine where the isolate specific reusable handle
+// of that type is used. The class asserts that we do not add code that will
+// result in recursive uses of the class's reusable handle.
+//
+// Below is an example of a reusable array handle via the
+// REUSABLE_*CLASSNAME*_HANDLESCOPE macro:
+//
 // {
-//   ReusableHandleScope reused_handles(isolate);
+//   REUSABLE_ARRAY_HANDLESCOPE(isolate);
 //   ....
-//   .....
-//   code that uses isolate specific reusable handles.
-//   Array& funcs = reused_handles.ArrayHandle();
+//   ....
+//   Array& funcs = reused_array_handle.Handle();
+//   code that uses funcs
 //   ....
 // }
+//
 
 #if defined(DEBUG)
 #define REUSABLE_SCOPE(name)                                                   \
@@ -76,28 +81,36 @@
 REUSABLE_HANDLE_LIST(REUSABLE_SCOPE)
 #undef REUSABLE_SCOPE
 
-#define REUSABLE_OBJECT_HANDLESCOPE(isolate)                                   \
-  ReusableObjectHandleScope reused_object_handle(isolate);
-#define REUSABLE_ERROR_HANDLESCOPE(isolate)                                    \
-  ReusableErrorHandleScope reused_error_handle(isolate);
-#define REUSABLE_ARRAY_HANDLESCOPE(isolate)                                    \
-  ReusableArrayHandleScope reused_array_handle(isolate);
-#define REUSABLE_STRING_HANDLESCOPE(isolate)                                   \
-  ReusableStringHandleScope reused_string_handle(isolate);
-#define REUSABLE_INSTANCE_HANDLESCOPE(isolate)                                 \
-  ReusableInstanceHandleScope reused_instance_handle(isolate);
-#define REUSABLE_FUNCTION_HANDLESCOPE(isolate)                                 \
-  ReusableFunctionHandleScope reused_function_handle(isolate);
-#define REUSABLE_FIELD_HANDLESCOPE(isolate)                                    \
-  ReusableFieldHandleScope reused_field_handle(isolate);
-#define REUSABLE_CLASS_HANDLESCOPE(isolate)                                    \
-  ReusableClassHandleScope reused_class_handle(isolate);
 #define REUSABLE_ABSTRACT_TYPE_HANDLESCOPE(isolate)                            \
   ReusableAbstractTypeHandleScope reused_abstract_type(isolate);
-#define REUSABLE_TYPE_PARAMETER_HANDLESCOPE(isolate)                           \
-  ReusableTypeParameterHandleScope reused_type_parameter(isolate);
+#define REUSABLE_ARRAY_HANDLESCOPE(isolate)                                    \
+  ReusableArrayHandleScope reused_array_handle(isolate);
+#define REUSABLE_CLASS_HANDLESCOPE(isolate)                                    \
+  ReusableClassHandleScope reused_class_handle(isolate);
+#define REUSABLE_CODE_HANDLESCOPE(isolate)                                     \
+  ReusableCodeHandleScope reused_code_handle(isolate);
+#define REUSABLE_ERROR_HANDLESCOPE(isolate)                                    \
+  ReusableErrorHandleScope reused_error_handle(isolate);
+#define REUSABLE_FIELD_HANDLESCOPE(isolate)                                    \
+  ReusableFieldHandleScope reused_field_handle(isolate);
+#define REUSABLE_FUNCTION_HANDLESCOPE(isolate)                                 \
+  ReusableFunctionHandleScope reused_function_handle(isolate);
+#define REUSABLE_GROWABLE_OBJECT_ARRAY_HANDLESCOPE(isolate)                    \
+  ReusableGrowableObjectArrayHandleScope                                       \
+      reused_growable_object_array_handle(isolate)
+#define REUSABLE_INSTANCE_HANDLESCOPE(isolate)                                 \
+  ReusableInstanceHandleScope reused_instance_handle(isolate);
+#define REUSABLE_LIBRARY_HANDLESCOPE(isolate)                                  \
+  ReusableLibraryHandleScope reused_library_handle(isolate);
+#define REUSABLE_OBJECT_HANDLESCOPE(isolate)                                   \
+  ReusableObjectHandleScope reused_object_handle(isolate);
+#define REUSABLE_STRING_HANDLESCOPE(isolate)                                   \
+  ReusableStringHandleScope reused_string_handle(isolate);
 #define REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(isolate)                           \
   ReusableTypeArgumentsHandleScope reused_type_arguments_handle(isolate);
+#define REUSABLE_TYPE_PARAMETER_HANDLESCOPE(isolate)                           \
+  ReusableTypeParameterHandleScope reused_type_parameter(isolate);
+
 
 }  // namespace dart
 
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index 38e83b1..b6a6064 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -152,7 +152,8 @@
                                   int num_parameters,
                                   int first_frame_index,
                                   LocalScope* loop_owner,
-                                  LocalScope** context_owner) {
+                                  LocalScope** context_owner,
+                                  bool* found_captured_variables) {
   // We should not allocate variables of nested functions while compiling an
   // enclosing function.
   ASSERT(function_level() == 0);
@@ -177,6 +178,7 @@
       // context allocation index.
       frame_index--;
       loop_owner->AllocateContextVariable(parameter, context_owner);
+      *found_captured_variables = true;
     } else {
       parameter->set_index(frame_index--);
     }
@@ -190,6 +192,7 @@
     if (variable->owner() == this) {
       if (variable->is_captured()) {
         loop_owner->AllocateContextVariable(variable, context_owner);
+        *found_captured_variables = true;
       } else {
         variable->set_index(frame_index--);
       }
@@ -206,7 +209,8 @@
                                                      num_parameters_in_child,
                                                      frame_index,
                                                      loop_owner,
-                                                     &child_context_owner);
+                                                     &child_context_owner,
+                                                     found_captured_variables);
     if (child_frame_index < min_frame_index) {
       min_frame_index = child_frame_index;
     }
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 3836a21..6bd93ac 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -302,7 +302,8 @@
                         int num_parameters,
                         int first_frame_index,
                         LocalScope* loop_owner,
-                        LocalScope** context_owner);
+                        LocalScope** context_owner,
+                        bool* found_captured_variables);
 
   // Creates variable info for the scope and all its nested scopes.
   // Must be called after AllocateVariables() has been called.
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 05109e1..eef5f05 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -19,6 +19,7 @@
 #include "vm/native_entry.h"
 #include "vm/native_arguments.h"
 #include "vm/object.h"
+#include "vm/object_graph.h"
 #include "vm/object_id_ring.h"
 #include "vm/object_store.h"
 #include "vm/port.h"
@@ -888,6 +889,12 @@
                                          Array::empty_array()));
     result.PrintJSON(js, true);
     return true;
+  } else if (strcmp(action, "retained") == 0) {
+    ObjectGraph graph(isolate);
+    intptr_t retained_size = graph.SizeRetainedByInstance(obj);
+    const Object& result = Object::Handle(Integer::New(retained_size));
+    result.PrintJSON(js, true);
+    return true;
   }
 
   PrintError(js, "unrecognized action '%s'\n", action);
@@ -1059,6 +1066,20 @@
 }
 
 
+static bool HandleClassesRetained(Isolate* isolate, const Class& cls,
+                                  JSONStream* js) {
+  if (js->num_arguments() != 3) {
+    PrintError(js, "Command too long");
+    return true;
+  }
+  ObjectGraph graph(isolate);
+  intptr_t retained_size = graph.SizeRetainedByClass(cls.id());
+  const Object& result = Object::Handle(Integer::New(retained_size));
+  result.PrintJSON(js, true);
+  return true;
+}
+
+
 static bool HandleClasses(Isolate* isolate, JSONStream* js) {
   if (js->num_arguments() == 1) {
     ClassTable* table = isolate->class_table();
@@ -1097,6 +1118,8 @@
       return HandleClassesDispatchers(isolate, cls, js);
     } else if (!strcmp(second, "types")) {
       return HandleClassesTypes(isolate, cls, js);
+    } else if (!strcmp(second, "retained")) {
+      return HandleClassesRetained(isolate, cls, js);
     } else {
       PrintError(js, "Invalid sub collection %s", second);
       return true;
@@ -1299,7 +1322,7 @@
   JSONArray members(&jsobj, "members");
   const GrowableObjectArray& libs =
       GrowableObjectArray::Handle(isolate->object_store()->libraries());
-  int num_libs = libs.Length();
+  intptr_t num_libs = libs.Length();
   Library &lib = Library::Handle();
   Script& script = Script::Handle();
   for (intptr_t i = 0; i < num_libs; i++) {
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 9719f0c..2001ff5 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -360,9 +360,14 @@
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   ObjectIdRing* ring = isolate->object_id_ring();
-  const String& str = String::Handle(String::New("value"));
-  intptr_t str_id = ring->GetIdForObject(str.raw());
-  Dart_Handle valid_id = Dart_NewInteger(str_id);
+  const Array& arr = Array::Handle(Array::New(1, Heap::kOld));
+  {
+    HANDLESCOPE(isolate);
+    const String& str = String::Handle(String::New("value", Heap::kOld));
+    arr.SetAt(0, str);
+  }
+  intptr_t arr_id = ring->GetIdForObject(arr.raw());
+  Dart_Handle valid_id = Dart_NewInteger(arr_id);
   EXPECT_VALID(valid_id);
   EXPECT_VALID(Dart_SetField(lib, NewString("validId"), valid_id));
 
@@ -447,7 +452,7 @@
   EXPECT_STREQ(
       "{\"type\":\"Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"int\"},"
+      "\"user_name\":\"_Smi\"},"
       "\"fields\":[],"
       "\"id\":\"objects\\/int-123\","
       "\"valueAsString\":\"123\"}",
@@ -461,10 +466,15 @@
   handler.filterMsg("size");
   handler.filterMsg("id");
   EXPECT_STREQ(
-      "{\"type\":\"String\","
-      "\"class\":{\"type\":\"@Class\","
-      "\"user_name\":\"String\"},\"fields\":[],"
-      "\"valueAsString\":\"\\\"value\\\"\"}",
+      "{\"type\":\"Array\","
+      "\"class\":{\"type\":\"@Class\",\"user_name\":\"_List\"},"
+      "\"fields\":[],"
+      "\"length\":1,"
+      "\"elements\":[{"
+          "\"index\":0,"
+          "\"value\":{\"type\":\"@String\","
+          "\"class\":{\"type\":\"@Class\",\"user_name\":\"_OneByteString\"},"
+          "\"valueAsString\":\"\\\"value\\\"\"}}]}",
       handler.msg());
 
   // object id ring / invalid => expired
@@ -499,7 +509,7 @@
   EXPECT_STREQ(
       "{\"type\":\"@Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"int\"},"
+      "\"user_name\":\"_Smi\"},"
       "\"id\":\"objects\\/int-222\","
       "\"valueAsString\":\"222\"}",
       handler.msg());
@@ -542,6 +552,16 @@
       "\"request\":{\"arguments\":[\"objects\",\"int-123\",\"eval\",\"foo\"],"
       "\"option_keys\":[\"expr\"],\"option_values\":[\"this+99\"]}}",
       handler.msg());
+
+  // Retained by single instance.
+  service_msg = Eval(lib,
+                     "[port, ['objects', '$validId', 'retained'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  ExpectSubstringF(handler.msg(),
+                   "\"id\":\"objects\\/int-%" Pd "\"",
+                   arr.raw()->Size() + arr.At(0)->Size());
 }
 
 
@@ -598,7 +618,7 @@
   EXPECT_STREQ(
       "{\"type\":\"@Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"int\"},\"id\":\"objects\\/int-54320\","
+      "\"user_name\":\"_Smi\"},\"id\":\"objects\\/int-54320\","
       "\"valueAsString\":\"54320\"}",
       handler.msg());
 }
@@ -617,10 +637,12 @@
       "    return d;\n"
       "  }\n"
       "}\n"
+      "class B { static int i = 42; }\n"
       "main() {\n"
       "  var z = new A();\n"
       "  var x = z.c();\n"
       "  x();\n"
+      "  ++B.i;\n"
       "}";
 
   Isolate* isolate = Isolate::Current();
@@ -672,7 +694,7 @@
   EXPECT_STREQ(
       "{\"type\":\"@Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"int\"},"
+      "\"user_name\":\"_Smi\"},"
       "\"id\":\"objects\\/int-111235\","
       "\"valueAsString\":\"111235\"}",
       handler.msg());
@@ -750,6 +772,19 @@
     "\"request\":"
     "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\",\"x\"],"
     "\"option_keys\":[],\"option_values\":[]}}", cid);
+
+  // Retained size of all instances of class B.
+  const Class& class_b = Class::Handle(GetClass(lib, "B"));
+  EXPECT(!class_b.IsNull());
+  const Instance& b0 = Instance::Handle(Instance::New(class_b));
+  const Instance& b1 = Instance::Handle(Instance::New(class_b));
+  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'retained'],"
+                      "[], []]", class_b.id());
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(handler.msg(),
+                   "\"id\":\"objects\\/int-%" Pd "\"",
+                   b0.raw()->Size() + b1.raw()->Size());
 }
 
 
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 7ef0248..e7e97cf 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -93,7 +93,7 @@
   Simulator* sim_;
 
   bool GetValue(char* desc, int64_t* value);
-  // TODO(zra): GetVValue for doubles.
+  bool GetDValue(char* desc, int64_t* value);
   // TODO(zra): Breakpoints.
 };
 
@@ -143,6 +143,16 @@
 }
 
 
+static VRegister LookupVRegisterByName(const char* name) {
+  int reg_nr = -1;
+  bool ok = SScanF(name, "v%d", &reg_nr);
+  if (ok && (0 <= reg_nr) && (reg_nr < kNumberOfVRegisters)) {
+    return static_cast<VRegister>(reg_nr);
+  }
+  return kNoVRegister;
+}
+
+
 bool SimulatorDebugger::GetValue(char* desc, int64_t* value) {
   Register reg = LookupCpuRegisterByName(desc);
   if (reg != kNoRegister) {
@@ -175,6 +185,26 @@
 }
 
 
+bool SimulatorDebugger::GetDValue(char* desc, int64_t* value) {
+  VRegister vreg = LookupVRegisterByName(desc);
+  if (vreg != kNoVRegister) {
+    *value = sim_->get_vregisterd(vreg);
+    return true;
+  }
+  if (desc[0] == '*') {
+    int64_t addr;
+    if (GetValue(desc + 1, &addr)) {
+      if (Simulator::IsIllegalAddress(addr)) {
+        return false;
+      }
+      *value = *(reinterpret_cast<int64_t*>(addr));
+      return true;
+    }
+  }
+  return false;
+}
+
+
 void SimulatorDebugger::Debug() {
   intptr_t last_pc = -1;
   bool done = false;
@@ -225,9 +255,11 @@
                   "    disasm <address>\n"
                   "    disasm <address> <number_of_instructions>\n"
                   "  by default 10 instrs are disassembled\n"
+                  "flags -- print flag values\n"
                   "gdb -- transfer control to gdb\n"
                   "h/help -- print this help string\n"
                   "p/print <reg or value or *addr> -- print integer value\n"
+                  "pd/printdouble <dreg or *addr> -- print double value\n"
                   "po/printobject <*reg or *addr> -- print object\n"
                   "si/stepi -- single step an instruction\n"
                   "q/quit -- Quit the debugger and exit the program\n");
@@ -252,6 +284,20 @@
         } else {
           OS::Print("print <reg or value or *addr>\n");
         }
+      } else if ((strcmp(cmd, "pd") == 0) ||
+                 (strcmp(cmd, "printdouble") == 0)) {
+        if (args == 2) {
+          int64_t long_value;
+          if (GetDValue(arg1, &long_value)) {
+            double dvalue = bit_cast<double, int64_t>(long_value);
+            OS::Print("%s: %"Pu64" 0x%"Px64" %.8g\n",
+                arg1, long_value, long_value, dvalue);
+          } else {
+            OS::Print("%s unrecognized\n", arg1);
+          }
+        } else {
+          OS::Print("printdouble <dreg or *addr>\n");
+        }
       } else if ((strcmp(cmd, "po") == 0) ||
                  (strcmp(cmd, "printobject") == 0)) {
         if (args == 2) {
@@ -307,6 +353,12 @@
           }
         }
         Disassembler::Disassemble(start, end);
+      } else if (strcmp(cmd, "flags") == 0) {
+        OS::Print("APSR: ");
+        OS::Print("N flag: %d; ", sim_->n_flag_);
+        OS::Print("Z flag: %d; ", sim_->z_flag_);
+        OS::Print("C flag: %d; ", sim_->c_flag_);
+        OS::Print("V flag: %d\n", sim_->v_flag_);
       } else if (strcmp(cmd, "gdb") == 0) {
         OS::Print("relinquishing control to gdb\n");
         OS::DebugBreak();
@@ -418,6 +470,11 @@
   c_flag_ = false;
   v_flag_ = false;
 
+  for (int i = 0; i < kNumberOfVRegisters; i++) {
+    vregisters_[i].lo = 0;
+    vregisters_[i].hi = 0;
+  }
+
   // The sp is initialized to point to the bottom (high address) of the
   // allocated stack area.
   registers_[R31] = StackTop();
@@ -559,6 +616,19 @@
 }
 
 
+int64_t Simulator::get_vregisterd(VRegister reg) {
+  ASSERT((reg >= 0) && (reg < kNumberOfVRegisters));
+  return vregisters_[reg].lo;
+}
+
+
+void Simulator::set_vregisterd(VRegister reg, int64_t value) {
+  ASSERT((reg >= 0) && (reg < kNumberOfVRegisters));
+  vregisters_[reg].lo = value;
+  vregisters_[reg].hi = 0;
+}
+
+
 // Raw access to the PC register.
 void Simulator::set_pc(int64_t value) {
   pc_modified_ = true;
@@ -843,7 +913,7 @@
   const int hw = instr->HWField();
   const int64_t shift = hw << 4;
   const int64_t shifted_imm =
-      static_cast<uint64_t>(instr->Imm16Field()) << shift;
+      static_cast<int64_t>(instr->Imm16Field()) << shift;
 
   if (instr->SFField()) {
     if (instr->Bits(29, 2) == 0) {
@@ -1322,16 +1392,10 @@
 
 
 void Simulator::DecodeLoadStoreReg(Instr* instr) {
-  // TODO(zra): SIMD loads and stores have bit 26 (V) set.
-  // (bit 25 is never set for loads and stores).
-  if (instr->Bits(25, 2) != 0) {
-    UnimplementedInstruction(instr);
-    return;
-  }
-
   // Calculate the address.
   const Register rn = instr->RnField();
   const Register rt = instr->RtField();
+  const VRegister vt = instr->VtField();
   const int64_t rn_val = get_register(rn, R31IsSP);
   const uint32_t size = instr->SzField();
   uword address = 0;
@@ -1372,6 +1436,7 @@
     address = rn_val + offset;
   } else {
     UnimplementedInstruction(instr);
+    return;
   }
 
   // Check the address.
@@ -1382,86 +1447,106 @@
 
   // Do access.
   if (instr->Bits(22, 2) == 0) {
-    // Format(instr, "str'sz 'rt, 'memop");
-    int32_t rt_val32 = get_wregister(rt, R31IsZR);
-    switch (size) {
-      case 0: {
-        uint8_t val = static_cast<uint8_t>(rt_val32);
-        WriteB(address, val);
-        break;
+    if (instr->Bit(26) == 1) {
+      // Format(instr, "vstrd 'vt, 'memop");
+      if (size != 3) {
+        UnimplementedInstruction(instr);
+        return;
       }
-      case 1: {
-        uint16_t val = static_cast<uint16_t>(rt_val32);
-        WriteH(address, val, instr);
-        break;
+      const int64_t vt_val = get_vregisterd(vt);
+      WriteX(address, vt_val, instr);
+    } else {
+      // Format(instr, "str'sz 'rt, 'memop");
+      const int32_t rt_val32 = get_wregister(rt, R31IsZR);
+      switch (size) {
+        case 0: {
+          const uint8_t val = static_cast<uint8_t>(rt_val32);
+          WriteB(address, val);
+          break;
+        }
+        case 1: {
+          const uint16_t val = static_cast<uint16_t>(rt_val32);
+          WriteH(address, val, instr);
+          break;
+        }
+        case 2: {
+          const uint32_t val = static_cast<uint32_t>(rt_val32);
+          WriteW(address, val, instr);
+          break;
+        }
+        case 3: {
+          const int64_t val = get_register(rt, R31IsZR);
+          WriteX(address, val, instr);
+          break;
+        }
+        default:
+          UNREACHABLE();
+          break;
       }
-      case 2: {
-        uint32_t val = static_cast<uint32_t>(rt_val32);
-        WriteW(address, val, instr);
-        break;
-      }
-      case 3: {
-        int64_t val = get_register(rt, R31IsZR);
-        WriteX(address, val, instr);
-        break;
-      }
-      default:
-        UNREACHABLE();
-        break;
     }
   } else {
-    // Format(instr, "ldr'sz 'rt, 'memop");
-    // Undefined case.
-    if ((size == 3) && (instr->Bits(22, 0) == 3)) {
-      UnimplementedInstruction(instr);
-      return;
-    }
-
-    // Read the value.
-    const bool signd = instr->Bit(23) == 1;
-    // Write the W register for signed values when size < 2.
-    // Write the W register for unsigned values when size == 2.
-    const bool use_w =
-        (signd && (instr->Bit(22) == 1)) || (!signd && (size == 2));
-    int64_t val = 0;  // Sign extend into an int64_t.
-    switch (size) {
-      case 0: {
-        if (signd) {
-          val = static_cast<int64_t>(ReadB(address));
-        } else {
-          val = static_cast<int64_t>(ReadBU(address));
-        }
-        break;
+    if (instr->Bit(26) == 1) {
+      // Format(instr, "ldrd 'vt, 'memop");
+      if ((size != 3) || (instr->Bit(23) != 0)) {
+        UnimplementedInstruction(instr);
+        return;
       }
-      case 1: {
-        if (signd) {
-          val = static_cast<int64_t>(ReadH(address, instr));
-        } else {
-          val = static_cast<int64_t>(ReadHU(address, instr));
-        }
-        break;
-      }
-      case 2: {
-        if (signd) {
-          val = static_cast<int64_t>(ReadW(address, instr));
-        } else {
-          val = static_cast<int64_t>(ReadWU(address, instr));
-        }
-        break;
-      }
-      case 3:
-        val = ReadX(address, instr);
-        break;
-      default:
-        UNREACHABLE();
-        break;
-    }
-
-    // Write to register.
-    if (use_w) {
-      set_wregister(rt, static_cast<int32_t>(val), R31IsZR);
+      const int64_t val = ReadX(address, instr);
+      set_vregisterd(vt, val);
     } else {
-      set_register(rt, val, R31IsZR);
+      // Format(instr, "ldr'sz 'rt, 'memop");
+      // Undefined case.
+      if ((size == 3) && (instr->Bits(22, 2) == 3)) {
+        UnimplementedInstruction(instr);
+        return;
+      }
+
+      // Read the value.
+      const bool signd = instr->Bit(23) == 1;
+      // Write the W register for signed values when size < 2.
+      // Write the W register for unsigned values when size == 2.
+      const bool use_w =
+          (signd && (instr->Bit(22) == 1)) || (!signd && (size == 2));
+      int64_t val = 0;  // Sign extend into an int64_t.
+      switch (size) {
+        case 0: {
+          if (signd) {
+            val = static_cast<int64_t>(ReadB(address));
+          } else {
+            val = static_cast<int64_t>(ReadBU(address));
+          }
+          break;
+        }
+        case 1: {
+          if (signd) {
+            val = static_cast<int64_t>(ReadH(address, instr));
+          } else {
+            val = static_cast<int64_t>(ReadHU(address, instr));
+          }
+          break;
+        }
+        case 2: {
+          if (signd) {
+            val = static_cast<int64_t>(ReadW(address, instr));
+          } else {
+            val = static_cast<int64_t>(ReadWU(address, instr));
+          }
+          break;
+        }
+        case 3:
+          val = ReadX(address, instr);
+          break;
+        default:
+          UNREACHABLE();
+          break;
+      }
+
+      // Write to register.
+      if (use_w) {
+        set_wregister(rt, static_cast<int32_t>(val), R31IsZR);
+      } else {
+        set_register(rt, val, R31IsZR);
+      }
     }
   }
 
@@ -1821,13 +1906,13 @@
 
 
 void Simulator::DecodeMiscDP3Source(Instr* instr) {
+  const Register rd = instr->RdField();
+  const Register rn = instr->RnField();
+  const Register rm = instr->RmField();
+  const Register ra = instr->RaField();
   if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 0) &&
       (instr->Bit(15) == 0)) {
     // Format(instr, "madd'sf 'rd, 'rn, 'rm, 'ra");
-    const Register rd = instr->RdField();
-    const Register rn = instr->RnField();
-    const Register rm = instr->RmField();
-    const Register ra = instr->RaField();
     if (instr->SFField() == 1) {
       const int64_t rn_val = get_register(rn, R31IsZR);
       const int64_t rm_val = get_register(rm, R31IsZR);
@@ -1841,6 +1926,31 @@
       const int32_t alu_out = ra_val + (rn_val * rm_val);
       set_wregister(rd, alu_out, R31IsZR);
     }
+  } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 0) &&
+             (instr->Bit(15) == 1)) {
+    // Format(instr, "msub'sf 'rd, 'rn, 'rm, 'ra");
+    if (instr->SFField() == 1) {
+      const int64_t rn_val = get_register(rn, R31IsZR);
+      const int64_t rm_val = get_register(rm, R31IsZR);
+      const int64_t ra_val = get_register(ra, R31IsZR);
+      const int64_t alu_out = ra_val - (rn_val * rm_val);
+      set_register(rd, alu_out, R31IsZR);
+    } else {
+      const int32_t rn_val = get_wregister(rn, R31IsZR);
+      const int32_t rm_val = get_wregister(rm, R31IsZR);
+      const int32_t ra_val = get_wregister(ra, R31IsZR);
+      const int32_t alu_out = ra_val - (rn_val * rm_val);
+      set_wregister(rd, alu_out, R31IsZR);
+    }
+  } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 2) &&
+             (instr->Bit(15) == 0)) {
+    // Format(instr, "smulh 'rd, 'rn, 'rm");
+    const int64_t rn_val = get_register(rn, R31IsZR);
+    const int64_t rm_val = get_register(rm, R31IsZR);
+    const __int128 res =
+        static_cast<__int128>(rn_val) * static_cast<__int128>(rm_val);
+    const int64_t alu_out = static_cast<int64_t>(res >> 64);
+    set_register(rd, alu_out, R31IsZR);
   } else {
     UnimplementedInstruction(instr);
   }
@@ -1848,31 +1958,41 @@
 
 
 void Simulator::DecodeConditionalSelect(Instr* instr) {
+  const Register rd = instr->RdField();
+  const Register rn = instr->RnField();
+  const Register rm = instr->RmField();
+  const int64_t rm_val64 = get_register(rm, R31IsZR);
+  const int32_t rm_val32 = get_wregister(rm, R31IsZR);
+  const int64_t rn_val64 = get_register(rn, instr->RnMode());
+  const int32_t rn_val32 = get_wregister(rn, instr->RnMode());
+  int64_t result64 = 0;
+  int32_t result32 = 0;
+
   if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 0)) {
     // Format(instr, "mov'sf'cond 'rd, 'rn, 'rm");
-    const Register rd = instr->RdField();
-    const Register rn = instr->RnField();
-    const Register rm = instr->RmField();
-    if (instr->SFField() == 1) {
-      int64_t res = 0;
-      if (ConditionallyExecute(instr)) {
-        res = get_register(rn, instr->RnMode());
-      } else {
-        res = get_register(rm, R31IsZR);
-      }
-      set_register(rd, res, instr->RdMode());
-    } else {
-      int32_t res = 0;
-      if (ConditionallyExecute(instr)) {
-        res = get_wregister(rn, instr->RnMode());
-      } else {
-        res = get_wregister(rm, R31IsZR);
-      }
-      set_wregister(rd, res, instr->RdMode());
+    result64 = rm_val64;
+    result32 = rm_val32;
+    if (ConditionallyExecute(instr)) {
+      result64 = rn_val64;
+      result32 = rn_val32;
     }
-
+  } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 1)) {
+    // Format(instr, "csinc'sf'cond 'rd, 'rn, 'rm");
+    result64 = rm_val64 + 1;
+    result32 = rm_val32 + 1;
+    if (ConditionallyExecute(instr)) {
+      result64 = rn_val64;
+      result32 = rn_val32;
+    }
   } else {
     UnimplementedInstruction(instr);
+    return;
+  }
+
+  if (instr->SFField() == 1) {
+    set_register(rd, result64, instr->RdMode());
+  } else {
+    set_wregister(rd, result32, instr->RdMode());
   }
 }
 
@@ -1899,8 +2019,178 @@
 }
 
 
+void Simulator::DecodeFPImm(Instr* instr) {
+  if ((instr->Bit(31) != 0) || (instr->Bit(29) != 0) || (instr->Bit(23) != 0) ||
+      (instr->Bits(5, 5) != 0)) {
+    UnimplementedInstruction(instr);
+    return;
+  }
+  if (instr->Bit(22) == 1) {
+    // Double.
+    // Format(instr, "fmovd 'vd, #'immd");
+    const VRegister vd = instr->VdField();
+    const int64_t immd = Instr::VFPExpandImm(instr->Imm8Field());
+    set_vregisterd(vd, immd);
+  } else {
+    // Single.
+    UnimplementedInstruction(instr);
+  }
+}
+
+
+void Simulator::DecodeFPIntCvt(Instr* instr) {
+  const VRegister vd = instr->VdField();
+  const VRegister vn = instr->VnField();
+  const Register rd = instr->RdField();
+  const Register rn = instr->RnField();
+
+  if ((instr->SFField() != 1) || (instr->Bit(29) != 0) ||
+      (instr->Bits(22, 2) != 1)) {
+    UnimplementedInstruction(instr);
+    return;
+  }
+  if (instr->Bits(16, 5) == 2) {
+    // Format(instr, "scvtfd 'vd, 'vn");
+    const int64_t rn_val = get_register(rn, instr->RnMode());
+    const double vn_dbl = static_cast<double>(rn_val);
+    set_vregisterd(vd, bit_cast<int64_t, double>(vn_dbl));
+  } else if (instr->Bits(16, 5) == 6) {
+    // Format(instr, "fmovrd 'rd, 'vn");
+    const int64_t vn_val = get_vregisterd(vn);
+    set_register(rd, vn_val, R31IsZR);
+  } else if (instr->Bits(16, 5) == 7) {
+    // Format(instr, "fmovdr 'vd, 'rn");
+    const int64_t rn_val = get_register(rn, R31IsZR);
+    set_vregisterd(vd, rn_val);
+  } else if (instr->Bits(16, 5) == 24) {
+    // Format(instr, "fcvtzds 'rd, 'vn");
+    const double vn_val = bit_cast<double, int64_t>(get_vregisterd(vn));
+    set_register(rd, static_cast<int64_t>(vn_val), instr->RdMode());
+  } else {
+    UnimplementedInstruction(instr);
+  }
+}
+
+
+void Simulator::DecodeFPOneSource(Instr* instr) {
+  const int opc = instr->Bits(15, 2);
+  const VRegister vd = instr->VdField();
+  const VRegister vn = instr->VnField();
+  switch (opc) {
+    case 0:
+      // Format("fmovdd 'vd, 'vn");
+      set_vregisterd(vd, get_vregisterd(vn));
+      break;
+    default:
+      UnimplementedInstruction(instr);
+      break;
+  }
+}
+
+
+void Simulator::DecodeFPTwoSource(Instr* instr) {
+  if (instr->Bits(22, 2) != 1) {
+    UnimplementedInstruction(instr);
+    return;
+  }
+  const VRegister vd = instr->VdField();
+  const VRegister vn = instr->VnField();
+  const VRegister vm = instr->VmField();
+  const double vn_val = bit_cast<double, int64_t>(get_vregisterd(vn));
+  const double vm_val = bit_cast<double, int64_t>(get_vregisterd(vm));
+  const int opc = instr->Bits(12, 4);
+  double result;
+
+  switch (opc) {
+    case 0:
+      // Format(instr, "fmuld 'vd, 'vn, 'vm");
+      result = vn_val * vm_val;
+      break;
+    case 1:
+      // Format(instr, "fdivd 'vd, 'vn, 'vm");
+      result = vn_val / vm_val;
+      break;
+    case 2:
+      // Format(instr, "faddd 'vd, 'vn, 'vm");
+      result = vn_val + vm_val;
+      break;
+    case 3:
+      // Format(instr, "fsubd 'vd, 'vn, 'vm");
+      result = vn_val - vm_val;
+      break;
+    default:
+      // Unknown(instr);
+      break;
+  }
+
+  set_vregisterd(vd, bit_cast<int64_t, double>(result));
+}
+
+
+void Simulator::DecodeFPCompare(Instr* instr) {
+  const VRegister vn = instr->VnField();
+  const VRegister vm = instr->VmField();
+  const double vn_val = get_vregisterd(vn);
+  double vm_val;
+
+  if ((instr->Bit(22) == 1) && (instr->Bits(3, 2) == 0)) {
+    // Format(instr, "fcmpd 'vn, 'vm");
+    vm_val = get_vregisterd(vm);
+  } else if ((instr->Bit(22) == 1) && (instr->Bits(3, 2) == 1)) {
+    if (instr->VmField() == V0) {
+      // Format(instr, "fcmpd 'vn, #0.0");
+      vm_val = 0.0;
+    } else {
+      UnimplementedInstruction(instr);
+      return;
+    }
+  } else {
+    UnimplementedInstruction(instr);
+    return;
+  }
+
+  n_flag_ = false;
+  z_flag_ = false;
+  c_flag_ = false;
+  v_flag_ = false;
+
+  if (isnan(vn_val) || isnan(vm_val)) {
+    c_flag_ = true;
+    v_flag_ = true;
+  } else if (vn_val == vm_val) {
+    z_flag_ = true;
+    c_flag_ = true;
+  } else if (vn_val < vm_val) {
+    n_flag_ = true;
+  } else {
+    c_flag_ = true;
+  }
+}
+
+
+void Simulator::DecodeFP(Instr* instr) {
+  if (instr->IsFPImmOp()) {
+    DecodeFPImm(instr);
+  } else if (instr->IsFPIntCvtOp()) {
+    DecodeFPIntCvt(instr);
+  } else if (instr->IsFPOneSourceOp()) {
+    DecodeFPOneSource(instr);
+  } else if (instr->IsFPTwoSourceOp()) {
+    DecodeFPTwoSource(instr);
+  } else if (instr->IsFPCompareOp()) {
+    DecodeFPCompare(instr);
+  } else {
+    UnimplementedInstruction(instr);
+  }
+}
+
+
 void Simulator::DecodeDPSimd2(Instr* instr) {
-  UnimplementedInstruction(instr);
+  if (instr->IsFPOp()) {
+    DecodeFP(instr);
+  } else {
+    UnimplementedInstruction(instr);
+  }
 }
 
 
@@ -1977,15 +2267,24 @@
                         int64_t parameter0,
                         int64_t parameter1,
                         int64_t parameter2,
-                        int64_t parameter3) {
+                        int64_t parameter3,
+                        bool fp_return,
+                        bool fp_args) {
   // Save the SP register before the call so we can restore it.
   intptr_t sp_before_call = get_register(R31, R31IsSP);
 
   // Setup parameters.
-  set_register(R0, parameter0);
-  set_register(R1, parameter1);
-  set_register(R2, parameter2);
-  set_register(R3, parameter3);
+  if (fp_args) {
+    set_vregisterd(V0, parameter0);
+    set_vregisterd(V1, parameter1);
+    set_vregisterd(V2, parameter2);
+    set_vregisterd(V3, parameter3);
+  } else {
+    set_register(R0, parameter0);
+    set_register(R1, parameter1);
+    set_register(R2, parameter2);
+    set_register(R3, parameter3);
+  }
 
   // Make sure the activation frames are properly aligned.
   intptr_t stack_pointer = sp_before_call;
@@ -2002,67 +2301,50 @@
   // the LR the simulation stops when returning to this call point.
   set_register(LR, kEndSimulatingPC);
 
-  // Remember the values of callee-saved registers.
-  int64_t r19_val = get_register(R19);
-  int64_t r20_val = get_register(R20);
-  int64_t r21_val = get_register(R21);
-  int64_t r22_val = get_register(R22);
-  int64_t r23_val = get_register(R23);
-  int64_t r24_val = get_register(R24);
-  int64_t r25_val = get_register(R25);
-  int64_t r26_val = get_register(R26);
-  int64_t r27_val = get_register(R27);
-  int64_t r28_val = get_register(R28);
-  int64_t r29_val = get_register(R29);
-
-  // Setup the callee-saved registers with a known value. To be able to check
-  // that they are preserved properly across dart execution.
+  // Remember the values of callee-saved registers, and set them up with a
+  // known value so that we are able to check that they are preserved
+  // properly across Dart execution.
+  int64_t preserved_vals[kAbiPreservedCpuRegCount];
   int64_t callee_saved_value = icount_;
-  set_register(R19, callee_saved_value);
-  set_register(R20, callee_saved_value);
-  set_register(R21, callee_saved_value);
-  set_register(R22, callee_saved_value);
-  set_register(R23, callee_saved_value);
-  set_register(R24, callee_saved_value);
-  set_register(R25, callee_saved_value);
-  set_register(R26, callee_saved_value);
-  set_register(R27, callee_saved_value);
-  set_register(R28, callee_saved_value);
-  set_register(R29, callee_saved_value);
+  for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
+    const Register r = static_cast<Register>(i);
+    preserved_vals[i - kAbiFirstPreservedCpuReg] = get_register(r);
+    set_register(r, callee_saved_value);
+  }
+
+  // Only the bottom half of the V registers must be preserved.
+  int64_t preserved_dvals[kAbiPreservedFpuRegCount];
+  for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) {
+    const VRegister r = static_cast<VRegister>(i);
+    preserved_dvals[i - kAbiFirstPreservedFpuReg] = get_vregisterd(r);
+    set_vregisterd(r, callee_saved_value);
+  }
 
   // Start the simulation
   Execute();
 
-  // Check that the callee-saved registers have been preserved.
-  ASSERT(callee_saved_value == get_register(R19));
-  ASSERT(callee_saved_value == get_register(R20));
-  ASSERT(callee_saved_value == get_register(R21));
-  ASSERT(callee_saved_value == get_register(R22));
-  ASSERT(callee_saved_value == get_register(R23));
-  ASSERT(callee_saved_value == get_register(R24));
-  ASSERT(callee_saved_value == get_register(R25));
-  ASSERT(callee_saved_value == get_register(R26));
-  ASSERT(callee_saved_value == get_register(R27));
-  ASSERT(callee_saved_value == get_register(R28));
-  ASSERT(callee_saved_value == get_register(R29));
+  // Check that the callee-saved registers have been preserved,
+  // and restore them with the original value
+  for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
+    const Register r = static_cast<Register>(i);
+    ASSERT(callee_saved_value == get_register(r));
+    set_register(r, preserved_vals[i - kAbiFirstPreservedCpuReg]);
+  }
 
-  // Restore callee-saved registers with the original value.
-  set_register(R19, r19_val);
-  set_register(R20, r20_val);
-  set_register(R21, r21_val);
-  set_register(R22, r22_val);
-  set_register(R23, r23_val);
-  set_register(R24, r24_val);
-  set_register(R25, r25_val);
-  set_register(R26, r26_val);
-  set_register(R27, r27_val);
-  set_register(R28, r28_val);
-  set_register(R29, r29_val);
+  for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) {
+    const VRegister r = static_cast<VRegister>(i);
+    ASSERT(callee_saved_value == get_vregisterd(r));
+    set_vregisterd(r, preserved_dvals[i - kAbiFirstPreservedFpuReg]);
+  }
 
   // Restore the SP register and return R0.
   set_register(R31, sp_before_call, R31IsSP);
   int64_t return_value;
-  return_value = get_register(R0);
+  if (fp_return) {
+    return_value = get_vregisterd(V0);
+  } else {
+    return_value = get_register(R0);
+  }
   return return_value;
 }
 
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index e089813..f5fc3ea 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -24,6 +24,11 @@
 class Isolate;
 class SimulatorSetjmpBuffer;
 
+typedef struct {
+  int64_t lo;
+  int64_t hi;
+} simd_value_t;
+
 class Simulator {
  public:
   static const uword kSimulatorStackUnderflowSize = 64;
@@ -46,6 +51,11 @@
   void set_wregister(Register reg, int32_t value, R31Type r31t = R31IsSP);
   int32_t get_wregister(Register reg, R31Type r31t = R31IsSP) const;
 
+  // Get and set a V register in double ('d') mode. Setting clears the high
+  // 64 bits of the V register. Getting ignores the high 64 bits.
+  int64_t get_vregisterd(VRegister reg);
+  void set_vregisterd(VRegister reg, int64_t value);
+
   int64_t get_pc() const;
   int64_t get_last_pc() const;
   void set_pc(int64_t pc);
@@ -70,7 +80,9 @@
                int64_t parameter0,
                int64_t parameter1,
                int64_t parameter2,
-               int64_t parameter3);
+               int64_t parameter3,
+               bool fp_return = false,
+               bool fp_args = false);
 
   // Runtime and native call support.
   enum CallKind {
@@ -107,6 +119,8 @@
   bool c_flag_;
   bool v_flag_;
 
+  simd_value_t vregisters_[kNumberOfVRegisters];
+
   // Simulator support.
   int64_t last_pc_;
   int64_t pc_;
diff --git a/runtime/vm/stack_frame_arm64.h b/runtime/vm/stack_frame_arm64.h
index df0c467..491b8f2 100644
--- a/runtime/vm/stack_frame_arm64.h
+++ b/runtime/vm/stack_frame_arm64.h
@@ -44,9 +44,9 @@
 static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -14;
-static const int kExitLinkSlotFromEntryFp = -13;
-static const int kSavedVMTagSlotFromEntryFp = -12;
+static const int kSavedContextSlotFromEntryFp = -22;
+static const int kExitLinkSlotFromEntryFp = -21;
+static const int kSavedVMTagSlotFromEntryFp = -20;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 6fc6310..1b86c58 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -24,6 +24,7 @@
 DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
 DEFINE_FLAG(bool, use_slow_path, false,
     "Set to true for debugging & verifying the slow paths.");
+DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
 // Input parameters:
 //   LR : return address.
@@ -353,28 +354,252 @@
 }
 
 
+// Input parameters:
+//   R4: arguments descriptor array.
 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
-  __ Stop("GenerateCallStaticFunctionStub");
+  // Create a stub frame as we are pushing some objects on the stack before
+  // calling into the runtime.
+  __ EnterStubFrame();
+  // Setup space on stack for return value and preserve arguments descriptor.
+  __ Push(R4);
+  __ PushObject(Object::null_object(), PP);
+  __ CallRuntime(kPatchStaticCallRuntimeEntry, 0);
+  // Get Code object result and restore arguments descriptor array.
+  __ Pop(R0);
+  __ Pop(R4);
+  // Remove the stub frame.
+  __ LeaveStubFrame();
+  // Jump to the dart function.
+  __ LoadFieldFromOffset(R0, R0, Code::instructions_offset());
+  __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
+  __ br(R0);
 }
 
 
+// Called from a static call only when an invalid code has been entered
+// (invalid because its function was optimized or deoptimized).
+// R4: arguments descriptor array.
 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
-  __ Stop("GenerateFixCallersTargetStub");
+  // Create a stub frame as we are pushing some objects on the stack before
+  // calling into the runtime.
+  __ EnterStubFrame();
+  // Setup space on stack for return value and preserve arguments descriptor.
+  __ Push(R4);
+  __ PushObject(Object::null_object(), PP);
+  __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
+  // Get Code object result and restore arguments descriptor array.
+  __ Pop(R0);
+  __ Pop(R4);
+  // Remove the stub frame.
+  __ LeaveStubFrame();
+  // Jump to the dart function.
+  __ LoadFieldFromOffset(R0, R0, Code::instructions_offset());
+  __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
+  __ br(R0);
+}
+
+
+// Input parameters:
+//   R2: smi-tagged argument count, may be zero.
+//   FP[kParamEndSlotFromFp + 1]: last argument.
+static void PushArgumentsArray(Assembler* assembler) {
+  // Allocate array to store arguments of caller.
+  __ LoadObject(R1, Object::null_object(), PP);
+  // R1: null element type for raw Array.
+  // R2: smi-tagged argument count, may be zero.
+  __ BranchLink(&StubCode::AllocateArrayLabel(), PP);
+  // R0: newly allocated array.
+  // R2: smi-tagged argument count, may be zero (was preserved by the stub).
+  __ Push(R0);  // Array is in R0 and on top of stack.
+  __ add(R1, FP, Operand(R2, LSL, 2));
+  __ AddImmediate(R1, R1, kParamEndSlotFromFp * kWordSize, PP);
+  __ AddImmediate(R3, R0, Array::data_offset() - kHeapObjectTag, PP);
+  // R1: address of first argument on stack.
+  // R3: address of first argument in array.
+
+  Label loop, loop_exit;
+  __ CompareRegisters(R2, ZR);
+  __ b(&loop_exit, LE);
+  __ Bind(&loop);
+  __ ldr(R7, Address(R1));
+  __ AddImmediate(R1, R1, -kWordSize, PP);
+  __ AddImmediate(R3, R3, kWordSize, PP);
+  __ AddImmediateSetFlags(R2, R2, -Smi::RawValue(1), PP);
+  __ str(R7, Address(R3, -kWordSize));
+  __ b(&loop, GE);
+  __ Bind(&loop_exit);
+}
+
+
+DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
+                           intptr_t deopt_reason,
+                           uword saved_registers_address);
+
+DECLARE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp);
+
+
+// Used by eager and lazy deoptimization. Preserve result in RAX if necessary.
+// This stub translates optimized frame into unoptimized frame. The optimized
+// frame can contain values in registers and on stack, the unoptimized
+// frame contains all values on stack.
+// Deoptimization occurs in following steps:
+// - Push all registers that can contain values.
+// - Call C routine to copy the stack and saved registers into temporary buffer.
+// - Adjust caller's frame to correct unoptimized frame size.
+// - Fill the unoptimized frame.
+// - Materialize objects that require allocation (e.g. Double instances).
+// GC can occur only after frame is fully rewritten.
+// Stack after TagAndPushPP() below:
+//   +------------------+
+//   | Saved PP         | <- PP
+//   +------------------+
+//   | PC marker        | <- TOS
+//   +------------------+
+//   | Saved FP         | <- FP of stub
+//   +------------------+
+//   | return-address   |  (deoptimization point)
+//   +------------------+
+//   | ...              | <- SP of optimized frame
+//
+// Parts of the code cannot GC, part of the code can GC.
+static void GenerateDeoptimizationSequence(Assembler* assembler,
+                                           bool preserve_result) {
+  // DeoptimizeCopyFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
+  // is no need to set the correct PC marker or load PP, since they get patched.
+  __ EnterFrame(0);
+  __ Push(ZR);
+  __ TagAndPushPP();
+
+  // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
+  // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
+  const intptr_t saved_result_slot_from_fp =
+      kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - R0);
+  // Result in R0 is preserved as part of pushing all registers below.
+
+  // Push registers in their enumeration order: lowest register number at
+  // lowest address.
+  for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; i--) {
+    const Register r = static_cast<Register>(i);
+    __ str(r, Address(SP, -1 * kWordSize, Address::PreIndex));
+  }
+
+  for (intptr_t reg_idx = kNumberOfVRegisters - 1; reg_idx >= 0; reg_idx--) {
+    VRegister vreg = static_cast<VRegister>(reg_idx);
+    // TODO(zra): Save whole V registers. For now, push twice.
+    __ PushDouble(vreg);
+    __ PushDouble(vreg);
+  }
+
+  __ mov(R0, SP);  // Pass address of saved registers block.
+  __ ReserveAlignedFrameSpace(0);
+  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
+  // Result (R0) is stack-size (FP - SP) in bytes.
+
+  if (preserve_result) {
+    // Restore result into R1 temporarily.
+    __ LoadFromOffset(R1, FP, saved_result_slot_from_fp * kWordSize);
+  }
+
+  // There is a Dart Frame on the stack. We must restore PP and leave frame.
+  __ LeaveDartFrame();
+  __ sub(TMP, FP, Operand(R0));
+  __ mov(SP, TMP);
+
+  // DeoptimizeFillFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
+  // is no need to set the correct PC marker or load PP, since they get patched.
+  __ EnterFrame(0);
+  __ Push(ZR);
+  __ TagAndPushPP();
+
+  if (preserve_result) {
+    __ Push(R1);  // Preserve result as first local.
+  }
+  __ ReserveAlignedFrameSpace(0);
+  __ mov(R0, FP);  // Pass last FP as parameter in R0.
+  __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
+  if (preserve_result) {
+    // Restore result into R1.
+    __ LoadFromOffset(R1, FP, kFirstLocalSlotFromFp * kWordSize);
+  }
+  // Code above cannot cause GC.
+  // There is a Dart Frame on the stack. We must restore PP and leave frame.
+  __ LeaveDartFrame();
+
+  // Frame is fully rewritten at this point and it is safe to perform a GC.
+  // Materialize any objects that were deferred by FillFrame because they
+  // require allocation.
+  __ EnterStubFrame();
+  if (preserve_result) {
+    __ Push(ZR);  // Workaround for dropped stack slot during GC.
+    __ Push(R1);  // Preserve result, it will be GC-d here.
+  }
+  __ Push(ZR);  // Space for the result.
+  __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry, 0);
+  // Result tells stub how many bytes to remove from the expression stack
+  // of the bottom-most frame. They were used as materialization arguments.
+  __ Pop(R1);
+  __ SmiUntag(R1);
+  if (preserve_result) {
+    __ Pop(R0);  // Restore result.
+    __ Drop(1);  // Workaround for dropped stack slot during GC.
+  }
+  __ LeaveStubFrame();
+  // Remove materialization arguments.
+  __ add(TMP, SP, Operand(R1, UXTX, 0));
+  __ mov(SP, TMP);
+  __ ret();
 }
 
 
 void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) {
-  __ Stop("GenerateDeoptimizeLazyStub");
+  // Correct return address to point just after the call that is being
+  // deoptimized.
+  __ AddImmediate(LR, LR, -CallPattern::kLengthInBytes, kNoPP);
+  GenerateDeoptimizationSequence(assembler, true);  // Preserve R0.
 }
 
 
 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
-  __ Stop("GenerateDeoptimizeStub");
+  GenerateDeoptimizationSequence(assembler, false);  // Don't preserve R0.
 }
 
 
 void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
-  __ Stop("GenerateMegamorphicMissStub");
+  __ EnterStubFrame();
+
+  // Load the receiver.
+  __ LoadFieldFromOffset(R2, R4, ArgumentsDescriptor::count_offset());
+  __ add(TMP, FP, Operand(R2, LSL, 2));  // R2 is Smi.
+  __ LoadFromOffset(R6, TMP, kParamEndSlotFromFp * kWordSize);
+
+  // Preserve IC data and arguments descriptor.
+  __ Push(R5);
+  __ Push(R4);
+
+  // Push space for the return value.
+  // Push the receiver.
+  // Push IC data object.
+  // Push arguments descriptor array.
+  __ PushObject(Object::null_object(), PP);
+  __ Push(R6);
+  __ Push(R5);
+  __ Push(R4);
+  __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3);
+  // Remove arguments.
+  __ Drop(3);
+  __ Pop(R0);  // Get result into R0 (target function).
+
+  // Restore IC data and arguments descriptor.
+  __ Pop(R4);
+  __ Pop(R5);
+
+  __ LeaveStubFrame();
+
+  // Tail-call to target function.
+  __ LoadFieldFromOffset(R2, R0, Function::code_offset());
+  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+  __ AddImmediate(R2, R2, Instructions::HeaderSize() - kHeapObjectTag, PP);
+  __ br(R2);
 }
 
 
@@ -530,12 +755,12 @@
   // The new context, saved vm tag, the top exit frame, and the old context.
   // const intptr_t kPreservedContextSlots = 4;
   const intptr_t kNewContextOffsetFromFp =
-      -(1 + kAbiPreservedCpuRegCount) * kWordSize;
+      -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
   // const intptr_t kPreservedRegSpace =
   //     kWordSize * (kAbiPreservedCpuRegCount + kPreservedContextSlots);
 
   // Save the callee-saved registers.
-  for (int i = R19; i <= R28; i++) {
+  for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
     const Register r = static_cast<Register>(i);
     // We use str instead of the Push macro because we will be pushing the PP
     // register when it is not holding a pool-pointer since we are coming from
@@ -543,8 +768,11 @@
     __ str(r, Address(SP, -1 * kWordSize, Address::PreIndex));
   }
 
-  // TODO(zra): Save the bottom 64-bits of callee-saved floating point
-  // registers.
+  // Save the bottom 64-bits of callee-saved V registers.
+  for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) {
+    const VRegister r = static_cast<VRegister>(i);
+    __ PushDouble(r);
+  }
 
   // Push new context.
   __ Push(R3);
@@ -567,7 +795,7 @@
   __ LoadFieldFromOffset(R5, CTX, Context::isolate_offset());
 
   // Save the current VMTag on the stack.
-  ASSERT(kSavedVMTagSlotFromEntryFp == -12);
+  ASSERT(kSavedVMTagSlotFromEntryFp == -20);
   __ LoadFromOffset(R4, R5, Isolate::vm_tag_offset());
   __ Push(R4);
 
@@ -589,8 +817,8 @@
 
   // The constants kSavedContextSlotFromEntryFp and
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -13);
-  ASSERT(kSavedContextSlotFromEntryFp == -14);
+  ASSERT(kExitLinkSlotFromEntryFp == -21);
+  ASSERT(kSavedContextSlotFromEntryFp == -22);
   __ Push(R6);
   __ Push(R4);
 
@@ -650,8 +878,14 @@
   __ Pop(R3);
   __ Pop(R4);
 
+  // Restore the bottom 64-bits of callee-saved V registers.
+  for (int i = kAbiLastPreservedFpuReg; i >= kAbiFirstPreservedFpuReg; i--) {
+    const VRegister r = static_cast<VRegister>(i);
+    __ PushDouble(r);
+  }
+
   // Restore C++ ABI callee-saved registers.
-  for (int i = R28; i >= R19; i--) {
+  for (int i = kAbiLastPreservedCpuReg; i >= kAbiFirstPreservedCpuReg; i--) {
     Register r = static_cast<Register>(i);
     // We use ldr instead of the Pop macro because we will be popping the PP
     // register when it is not holding a pool-pointer since we are returning to
@@ -659,8 +893,6 @@
     __ ldr(r, Address(SP, 1 * kWordSize, Address::PostIndex));
   }
 
-  // TODO(zra): Restore callee-saved fpu registers.
-
   // Restore the frame pointer and return.
   __ LeaveFrame();
   __ ret();
@@ -966,7 +1198,7 @@
     __ Push(R1);
   } else {
     // Push null type arguments.
-    __ Push(R2);
+    __ PushObject(Object::null_object(), PP);
   }
   __ CallRuntime(kAllocateObjectRuntimeEntry, 2);  // Allocate object.
   __ Drop(2);  // Pop arguments.
@@ -978,13 +1210,65 @@
 }
 
 
+// Called for invoking "dynamic noSuchMethod(Invocation invocation)" function
+// from the entry code of a dart function after an error in passed argument
+// name or number is detected.
+// Input parameters:
+//  LR : return address.
+//  SP : address of last argument.
+//  R5: inline cache data object.
+//  R4: arguments descriptor array.
 void StubCode::GenerateCallNoSuchMethodFunctionStub(Assembler* assembler) {
-  __ Stop("GenerateCallNoSuchMethodFunctionStub");
+  __ EnterStubFrame(true);
+
+  // Load the receiver.
+  __ LoadFieldFromOffset(R2, R4, ArgumentsDescriptor::count_offset());
+  __ add(TMP, FP, Operand(R2, LSL, 2));  // R2 is Smi.
+  __ LoadFromOffset(R6, TMP, kParamEndSlotFromFp * kWordSize);
+
+  // Push space for the return value.
+  // Push the receiver.
+  // Push IC data object.
+  // Push arguments descriptor array.
+  __ PushObject(Object::null_object(), PP);
+  __ Push(R6);
+  __ Push(R5);
+  __ Push(R4);
+
+  // R2: Smi-tagged arguments array length.
+  PushArgumentsArray(assembler);
+
+  __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry, 4);
+  // Remove arguments.
+  __ Drop(4);
+  __ Pop(R0);  // Get result into R0.
+  __ LeaveStubFrame();
+  __ ret();
 }
 
 
+//  R6: function object.
+//  R5: inline cache data object.
+// Cannot use function object from ICData as it may be the inlined
+// function and not the top-scope function.
 void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
-  __ Stop("GenerateOptimizedUsageCounterIncrement");
+  Register ic_reg = R5;
+  Register func_reg = R6;
+  if (FLAG_trace_optimized_ic_calls) {
+    __ EnterStubFrame();
+    __ Push(R6);  // Preserve.
+    __ Push(R5);  // Preserve.
+    __ Push(ic_reg);  // Argument.
+    __ Push(func_reg);  // Argument.
+    __ CallRuntime(kTraceICCallRuntimeEntry, 2);
+    __ Drop(2);  // Discard argument;
+    __ Pop(R5);  // Restore.
+    __ Pop(R6);  // Restore.
+    __ LeaveStubFrame();
+  }
+  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset());
+  __ add(R7, R7, Operand(1));
+  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset());
 }
 
 
@@ -1035,7 +1319,7 @@
   Label not_stepping;
   __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset());
   __ LoadFromOffset(R6, R6, Isolate::single_step_offset(), kUnsignedByte);
-  __ CompareImmediate(R6, 0, kNoPP);
+  __ CompareRegisters(R6, ZR);
   __ b(&not_stepping, EQ);
   __ EnterStubFrame();
   __ Push(R5);  // Preserve IC data.
@@ -1235,19 +1519,25 @@
 
 void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
-  __ Stop("GenerateOneArgOptimizedCheckInlineCacheStub");
+  GenerateOptimizedUsageCounterIncrement(assembler);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
 }
 
 
 void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
-  __ Stop("GenerateTwoArgsOptimizedCheckInlineCacheStub");
+  GenerateOptimizedUsageCounterIncrement(assembler);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
 }
 
 
 void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
-  __ Stop("GenerateThreeArgsOptimizedCheckInlineCacheStub");
+  GenerateOptimizedUsageCounterIncrement(assembler);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
 }
 
 
@@ -1487,8 +1777,24 @@
 }
 
 
+// Calls to the runtime to optimize the given function.
+// R6: function to be re-optimized.
+// R4: argument descriptor (preserved).
 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
-  __ Stop("GenerateOptimizeFunctionStub");
+  __ EnterStubFrame();
+  __ Push(R4);
+  // Setup space on stack for the return value.
+  __ PushObject(Object::null_object(), PP);
+  __ Push(R6);
+  __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
+  __ Pop(R0);  // Discard argument.
+  __ Pop(R0);  // Get Code object
+  __ Pop(R4);  // Restore argument descriptor.
+  __ LoadFieldFromOffset(R0, R0, Code::instructions_offset());
+  __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, PP);
+  __ LeaveStubFrame();
+  __ br(R0);
+  __ hlt(0);
 }
 
 
@@ -1585,9 +1891,20 @@
 }
 
 
+// Called from optimized code only.
+// LR: return address.
+// SP + 4: left operand.
+// SP + 0: right operand.
+// Return Zero condition flag set if equal.
 void StubCode::GenerateOptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  __ Stop("GenerateOptimizedIdenticalWithNumberCheckStub");
+  const Register temp = R2;
+  const Register left = R1;
+  const Register right = R0;
+  __ LoadFromOffset(left, SP, 1 * kWordSize);
+  __ LoadFromOffset(right, SP, 0 * kWordSize);
+  GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
+  __ ret();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 149a9b6..77c0455 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -279,6 +279,7 @@
   V(DartScheme, "dart:")                                                       \
   V(DartSchemePrivate, "dart:_")                                               \
   V(DartNativeWrappers, "dart:nativewrappers")                                 \
+  V(DartNativeWrappersLibName, "dart.nativewrappers")                          \
   V(DartAsync, "dart:async")                                                   \
   V(DartCore, "dart:core")                                                     \
   V(DartCollection, "dart:collection")                                         \
@@ -317,6 +318,7 @@
   V(TempParam, ":temp_param")                                                  \
   V(UserTag, "UserTag")                                                        \
   V(_UserTag, "_UserTag")                                                      \
+  V(Default, "Default")                                                        \
   V(StubPrefix, "[Stub] ")                                                     \
 
 
diff --git a/runtime/vm/tags.h b/runtime/vm/tags.h
index f24f5a3..5d5394c 100644
--- a/runtime/vm/tags.h
+++ b/runtime/vm/tags.h
@@ -83,10 +83,10 @@
 
 class UserTags : public AllStatic {
  public:
-  static const uword kNoUserTag = 0;
   // UserTag id space: [kUserTagIdOffset, kUserTagIdOffset + kMaxUserTags).
   static const intptr_t kMaxUserTags = 64;
   static const uword kUserTagIdOffset = 0x4096;
+  static const uword kDefaultUserTag = kUserTagIdOffset;
   static const char* TagName(uword tag_id);
   static bool IsUserTag(uword tag_id) {
     return (tag_id >= kUserTagIdOffset) &&
diff --git a/runtime/vm/timer.h b/runtime/vm/timer.h
index 1e7ef1d..50bd533 100644
--- a/runtime/vm/timer.h
+++ b/runtime/vm/timer.h
@@ -135,7 +135,7 @@
 // }
 class TimerScope : public StackResource {
  public:
-  TimerScope(bool flag, Timer* timer, BaseIsolate* isolate = NULL)
+  TimerScope(bool flag, Timer* timer, Isolate* isolate = NULL)
       : StackResource(isolate), flag_(flag), nested_(false), timer_(timer) {
     if (flag_) {
       if (!timer_->running()) {
@@ -165,7 +165,7 @@
 
 class PauseTimerScope : public StackResource {
  public:
-  PauseTimerScope(bool flag, Timer* timer, BaseIsolate* isolate = NULL)
+  PauseTimerScope(bool flag, Timer* timer, Isolate* isolate = NULL)
       : StackResource(isolate), flag_(flag), nested_(false), timer_(timer) {
     if (flag_) {
       if (timer_->running()) {
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 8b4a317..2e370e2 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -155,10 +155,16 @@
 #define EXECUTE_TEST_CODE_INT64(name, entry)                                   \
   static_cast<int64_t>(Simulator::Current()->Call(                             \
       bit_cast<int64_t, uword>(entry), 0, 0, 0, 0))
+#define EXECUTE_TEST_CODE_DOUBLE(name, entry)                                  \
+  bit_cast<double, int64_t>(Simulator::Current()->Call(                        \
+      bit_cast<int64_t, uword>(entry), 0, 0, 0, 0, true))
 #else
 #define EXECUTE_TEST_CODE_INT32(name, entry)                                   \
   static_cast<int32_t>(Simulator::Current()->Call(                             \
       bit_cast<int32_t, uword>(entry), 0, 0, 0, 0))
+#define EXECUTE_TEST_CODE_DOUBLE(name, entry)                                  \
+  bit_cast<double, int64_t>(Simulator::Current()->Call(                        \
+      bit_cast<int32_t, uword>(entry), 0, 0, 0, 0, true))
 #endif
 #define EXECUTE_TEST_CODE_INT64_LL(name, entry, long_arg0, long_arg1)          \
   static_cast<int64_t>(Simulator::Current()->Call(                             \
@@ -170,9 +176,6 @@
 #define EXECUTE_TEST_CODE_FLOAT(name, entry)                                   \
   bit_cast<float, int32_t>(Simulator::Current()->Call(                         \
       bit_cast<int32_t, uword>(entry), 0, 0, 0, 0, true))
-#define EXECUTE_TEST_CODE_DOUBLE(name, entry)                                  \
-  bit_cast<double, int64_t>(Simulator::Current()->Call(                        \
-      bit_cast<int32_t, uword>(entry), 0, 0, 0, 0, true))
 #define EXECUTE_TEST_CODE_INT32_F(name, entry, float_arg)                      \
   static_cast<int32_t>(Simulator::Current()->Call(                             \
       bit_cast<int32_t, uword>(entry),                                         \
diff --git a/runtime/vm/utils_test.cc b/runtime/vm/utils_test.cc
index a287172..97385a6 100644
--- a/runtime/vm/utils_test.cc
+++ b/runtime/vm/utils_test.cc
@@ -219,4 +219,13 @@
   EXPECT_EQ(0x0, reinterpret_cast<uint8_t*>(&value64le)[7]);
 }
 
+
+UNIT_TEST_CASE(DoublesBitEqual) {
+  EXPECT(Utils::DoublesBitEqual(1.0, 1.0));
+  EXPECT(!Utils::DoublesBitEqual(1.0, -1.0));
+  EXPECT(Utils::DoublesBitEqual(0.0, 0.0));
+  EXPECT(!Utils::DoublesBitEqual(0.0, -0.0));
+  EXPECT(Utils::DoublesBitEqual(NAN, NAN));
+}
+
 }  // namespace dart
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index ea66f04..18a871b 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -275,6 +275,9 @@
     'object.h',
     'object_arm_test.cc',
     'object_arm64_test.cc',
+    'object_graph.cc',
+    'object_graph.h',
+    'object_graph_test.cc',
     'object_ia32_test.cc',
     'object_id_ring.cc',
     'object_id_ring.h',
diff --git a/runtime/vm/zone.h b/runtime/vm/zone.h
index ff53c21..fea44c9 100644
--- a/runtime/vm/zone.h
+++ b/runtime/vm/zone.h
@@ -157,7 +157,7 @@
 class StackZone : public StackResource {
  public:
   // Create an empty zone and set is at the current zone for the Isolate.
-  explicit StackZone(BaseIsolate* isolate)
+  explicit StackZone(Isolate* isolate)
     : StackResource(isolate),
       zone_() {
 #ifdef DEBUG
@@ -167,14 +167,16 @@
                    reinterpret_cast<intptr_t>(&zone_));
     }
 #endif
-    zone_.Link(isolate->current_zone());
-    isolate->set_current_zone(&zone_);
+    BaseIsolate* base_isolate = reinterpret_cast<BaseIsolate*>(isolate);
+    zone_.Link(base_isolate->current_zone());
+    base_isolate->set_current_zone(&zone_);
   }
 
   // Delete all memory associated with the zone.
   ~StackZone() {
-    ASSERT(isolate()->current_zone() == &zone_);
-    isolate()->set_current_zone(zone_.previous_);
+    BaseIsolate* base_isolate = reinterpret_cast<BaseIsolate*>(isolate());
+    ASSERT(base_isolate->current_zone() == &zone_);
+    base_isolate->set_current_zone(zone_.previous_);
 #ifdef DEBUG
     if (FLAG_trace_zones) {
       OS::PrintErr("*** Deleting Stack zone 0x%" Px "(0x%" Px ")\n",
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index 5209eb4..31c2153 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -4,6 +4,24 @@
  */
 library dart.dom._blink;
 
+import 'dart:async';
+import 'dart:collection';
+import 'dart:html';
+import 'dart:_internal' hide Symbol, deprecated;
+import 'dart:html_common';
+import 'dart:indexed_db';
+import 'dart:isolate';
+import "dart:convert";
+import 'dart:math';
+import 'dart:mirrors';
+import 'dart:nativewrappers';
+import 'dart:typed_data';
+import 'dart:web_gl' as gl;
+import 'dart:web_sql';
+import 'dart:svg' as svg;
+import 'dart:svg' show Matrix;
+import 'dart:svg' show SvgSvgElement;
+import 'dart:web_audio' show AudioNode, AudioParam;
 // 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.
@@ -11,6 +29,12 @@
 // DO NOT EDIT
 // Auto-generated dart:_blink library.
 
+// TODO(leafp) These are mostly copied over from dart:html.  When
+// we shift dart:blink generation over to dartium, this dependency 
+// should go away, or at least be reconsidered.
+// TODO(vsm): Remove this when we can do the proper checking in
+// native code for custom elements.
+// Not actually used, but imported since dart:html can generate these objects.
 
 
 
@@ -46,6 +70,19 @@
 
 Native_AudioNode_numberOfOutputs_Getter(mthis) native "AudioNode_numberOfOutputs_Getter";
 
+  // Generated overload resolver
+Native_AudioNode__connect(mthis, destination, output, input) {
+    if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
+      Native_AudioNode__connect_1_Callback(mthis, destination, output, input);
+      return;
+    }
+    if ((output is int || output == null) && (destination is AudioParam || destination == null) && input == null) {
+      Native_AudioNode__connect_2_Callback(mthis, destination, output);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_AudioNode__connect_1_Callback(mthis, destination, output, input) native "AudioNode__connect_1_Callback";
 
 Native_AudioNode__connect_2_Callback(mthis, destination, output) native "AudioNode__connect_2_Callback";
@@ -98,6 +135,20 @@
 
 Native_TimedItem_startTime_Getter(mthis) native "TimedItem_startTime_Getter";
 
+  // Generated overload resolver
+Native_Animation_Animation(target, keyframes, timingInput) {
+    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
+      return Native_Animation__create_1constructorCallback(target, keyframes, timingInput);
+    }
+    if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
+      return Native_Animation__create_2constructorCallback(target, keyframes, timingInput);
+    }
+    if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
+      return Native_Animation__create_3constructorCallback(target, keyframes);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_Animation__create_1constructorCallback(target, keyframes, timingInput) native "Animation__create_1constructorCallback";
 
 Native_Animation__create_2constructorCallback(target, keyframes, timingInput) native "Animation__create_2constructorCallback";
@@ -222,6 +273,24 @@
 
 Native_AudioBufferSourceNode_noteOn_Callback(mthis, when) native "AudioBufferSourceNode_noteOn_Callback";
 
+  // Generated overload resolver
+Native_AudioBufferSourceNode_start(mthis, when, grainOffset, grainDuration) {
+    if (grainDuration != null) {
+      Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration);
+      return;
+    }
+    if (grainOffset != null) {
+      Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset);
+      return;
+    }
+    if (when != null) {
+      Native_AudioBufferSourceNode__start_3_Callback(mthis, when);
+      return;
+    }
+    Native_AudioBufferSourceNode__start_4_Callback(mthis);
+    return;
+  }
+
 Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode__start_1_Callback";
 
 Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset) native "AudioBufferSourceNode__start_2_Callback";
@@ -230,10 +299,25 @@
 
 Native_AudioBufferSourceNode__start_4_Callback(mthis) native "AudioBufferSourceNode__start_4_Callback";
 
+  // Generated overload resolver
+Native_AudioBufferSourceNode_stop(mthis, when) {
+    if (when != null) {
+      Native_AudioBufferSourceNode__stop_1_Callback(mthis, when);
+      return;
+    }
+    Native_AudioBufferSourceNode__stop_2_Callback(mthis);
+    return;
+  }
+
 Native_AudioBufferSourceNode__stop_1_Callback(mthis, when) native "AudioBufferSourceNode__stop_1_Callback";
 
 Native_AudioBufferSourceNode__stop_2_Callback(mthis) native "AudioBufferSourceNode__stop_2_Callback";
 
+  // Generated overload resolver
+Native_AudioContext_AudioContext() {
+    return Native_AudioContext__create_1constructorCallback();
+  }
+
 Native_AudioContext__create_1constructorCallback() native "AudioContext__create_1constructorCallback";
 
 Native_AudioContext_activeSourceCount_Getter(mthis) native "AudioContext_activeSourceCount_Getter";
@@ -256,20 +340,52 @@
 
 Native_AudioContext_createBufferSource_Callback(mthis) native "AudioContext_createBufferSource_Callback";
 
+  // Generated overload resolver
+Native_AudioContext_createChannelMerger(mthis, numberOfInputs) {
+    if (numberOfInputs != null) {
+      return Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs);
+    }
+    return Native_AudioContext__createChannelMerger_2_Callback(mthis);
+  }
+
 Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs) native "AudioContext__createChannelMerger_1_Callback";
 
 Native_AudioContext__createChannelMerger_2_Callback(mthis) native "AudioContext__createChannelMerger_2_Callback";
 
+  // Generated overload resolver
+Native_AudioContext_createChannelSplitter(mthis, numberOfOutputs) {
+    if (numberOfOutputs != null) {
+      return Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs);
+    }
+    return Native_AudioContext__createChannelSplitter_2_Callback(mthis);
+  }
+
 Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs) native "AudioContext__createChannelSplitter_1_Callback";
 
 Native_AudioContext__createChannelSplitter_2_Callback(mthis) native "AudioContext__createChannelSplitter_2_Callback";
 
 Native_AudioContext_createConvolver_Callback(mthis) native "AudioContext_createConvolver_Callback";
 
+  // Generated overload resolver
+Native_AudioContext_createDelay(mthis, maxDelayTime) {
+    if (maxDelayTime != null) {
+      return Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime);
+    }
+    return Native_AudioContext__createDelay_2_Callback(mthis);
+  }
+
 Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime) native "AudioContext__createDelay_1_Callback";
 
 Native_AudioContext__createDelay_2_Callback(mthis) native "AudioContext__createDelay_2_Callback";
 
+  // Generated overload resolver
+Native_AudioContext_createDelayNode(mthis, maxDelayTime) {
+    if (maxDelayTime != null) {
+      return Native_AudioContext__createDelayNode_1_Callback(mthis, maxDelayTime);
+    }
+    return Native_AudioContext__createDelayNode_2_Callback(mthis);
+  }
+
 Native_AudioContext__createDelayNode_1_Callback(mthis, maxDelayTime) native "AudioContext__createDelayNode_1_Callback";
 
 Native_AudioContext__createDelayNode_2_Callback(mthis) native "AudioContext__createDelayNode_2_Callback";
@@ -280,6 +396,17 @@
 
 Native_AudioContext_createGainNode_Callback(mthis) native "AudioContext_createGainNode_Callback";
 
+  // Generated overload resolver
+Native_AudioContext_createJavaScriptNode(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) {
+    if (numberOfOutputChannels != null) {
+      return Native_AudioContext__createJavaScriptNode_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels);
+    }
+    if (numberOfInputChannels != null) {
+      return Native_AudioContext__createJavaScriptNode_2_Callback(mthis, bufferSize, numberOfInputChannels);
+    }
+    return Native_AudioContext__createJavaScriptNode_3_Callback(mthis, bufferSize);
+  }
+
 Native_AudioContext__createJavaScriptNode_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext__createJavaScriptNode_1_Callback";
 
 Native_AudioContext__createJavaScriptNode_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext__createJavaScriptNode_2_Callback";
@@ -298,6 +425,20 @@
 
 Native_AudioContext_createPeriodicWave_Callback(mthis, real, imag) native "AudioContext_createPeriodicWave_Callback";
 
+  // Generated overload resolver
+Native_AudioContext_createScriptProcessor(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) {
+    if (numberOfOutputChannels != null) {
+      return Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels);
+    }
+    if (numberOfInputChannels != null) {
+      return Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels);
+    }
+    if (bufferSize != null) {
+      return Native_AudioContext__createScriptProcessor_3_Callback(mthis, bufferSize);
+    }
+    return Native_AudioContext__createScriptProcessor_4_Callback(mthis);
+  }
+
 Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext__createScriptProcessor_1_Callback";
 
 Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext__createScriptProcessor_2_Callback";
@@ -424,6 +565,20 @@
 
 Native_Blob_type_Getter(mthis) native "Blob_type_Getter";
 
+  // Generated overload resolver
+Native_Blob_slice(mthis, start, end, contentType) {
+    if (contentType != null) {
+      return Native_Blob__slice_1_Callback(mthis, start, end, contentType);
+    }
+    if (end != null) {
+      return Native_Blob__slice_2_Callback(mthis, start, end);
+    }
+    if (start != null) {
+      return Native_Blob__slice_3_Callback(mthis, start);
+    }
+    return Native_Blob__slice_4_Callback(mthis);
+  }
+
 Native_Blob__slice_1_Callback(mthis, start, end, contentType) native "Blob__slice_1_Callback";
 
 Native_Blob__slice_2_Callback(mthis, start, end) native "Blob__slice_2_Callback";
@@ -580,12 +735,28 @@
 
 Native_CSSStyleSheet_rules_Getter(mthis) native "CSSStyleSheet_rules_Getter";
 
+  // Generated overload resolver
+Native_CSSStyleSheet_addRule(mthis, selector, style, index) {
+    if (index != null) {
+      return Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index);
+    }
+    return Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style);
+  }
+
 Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index) native "CSSStyleSheet__addRule_1_Callback";
 
 Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style) native "CSSStyleSheet__addRule_2_Callback";
 
 Native_CSSStyleSheet_deleteRule_Callback(mthis, index) native "CSSStyleSheet_deleteRule_Callback";
 
+  // Generated overload resolver
+Native_CSSStyleSheet_insertRule(mthis, rule, index) {
+    if (index != null) {
+      return Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index);
+    }
+    return Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule);
+  }
+
 Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index) native "CSSStyleSheet__insertRule_1_Callback";
 
 Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule) native "CSSStyleSheet__insertRule_2_Callback";
@@ -704,6 +875,16 @@
 
 Native_CanvasRenderingContext2D_clearRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback";
 
+  // Generated overload resolver
+Native_CanvasRenderingContext2D_clip(mthis, winding) {
+    if (winding != null) {
+      Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding);
+      return;
+    }
+    Native_CanvasRenderingContext2D__clip_2_Callback(mthis);
+    return;
+  }
+
 Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding) native "CanvasRenderingContext2D__clip_1_Callback";
 
 Native_CanvasRenderingContext2D__clip_2_Callback(mthis) native "CanvasRenderingContext2D__clip_2_Callback";
@@ -724,6 +905,59 @@
 
 Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback";
 
+  // Generated overload resolver
+Native_CanvasRenderingContext2D__drawImage(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) {
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+      Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      return;
+    }
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+      Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      return;
+    }
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+      Native_CanvasRenderingContext2D__drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      return;
+    }
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+      Native_CanvasRenderingContext2D__drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      return;
+    }
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+      Native_CanvasRenderingContext2D__drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      return;
+    }
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+      Native_CanvasRenderingContext2D__drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      return;
+    }
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+      Native_CanvasRenderingContext2D__drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      return;
+    }
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+      Native_CanvasRenderingContext2D__drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      return;
+    }
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+      Native_CanvasRenderingContext2D__drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      return;
+    }
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+      Native_CanvasRenderingContext2D__drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      return;
+    }
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+      Native_CanvasRenderingContext2D__drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      return;
+    }
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+      Native_CanvasRenderingContext2D__drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_1_Callback";
 
 Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_2_Callback";
@@ -752,12 +986,32 @@
 
 Native_CanvasRenderingContext2D_ellipse_Callback(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback";
 
+  // Generated overload resolver
+Native_CanvasRenderingContext2D_fill(mthis, winding) {
+    if (winding != null) {
+      Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding);
+      return;
+    }
+    Native_CanvasRenderingContext2D__fill_2_Callback(mthis);
+    return;
+  }
+
 Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding) native "CanvasRenderingContext2D__fill_1_Callback";
 
 Native_CanvasRenderingContext2D__fill_2_Callback(mthis) native "CanvasRenderingContext2D__fill_2_Callback";
 
 Native_CanvasRenderingContext2D_fillRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback";
 
+  // Generated overload resolver
+Native_CanvasRenderingContext2D_fillText(mthis, text, x, y, maxWidth) {
+    if (maxWidth != null) {
+      Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth);
+      return;
+    }
+    Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y);
+    return;
+  }
+
 Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D__fillText_1_Callback";
 
 Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D__fillText_2_Callback";
@@ -768,6 +1022,14 @@
 
 Native_CanvasRenderingContext2D_getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback";
 
+  // Generated overload resolver
+Native_CanvasRenderingContext2D_isPointInPath(mthis, x, y, winding) {
+    if (winding != null) {
+      return Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding);
+    }
+    return Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y);
+  }
+
 Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding) native "CanvasRenderingContext2D__isPointInPath_1_Callback";
 
 Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y) native "CanvasRenderingContext2D__isPointInPath_2_Callback";
@@ -780,6 +1042,19 @@
 
 Native_CanvasRenderingContext2D_moveTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback";
 
+  // Generated overload resolver
+Native_CanvasRenderingContext2D_putImageData(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+    if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
+      Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy);
+      return;
+    }
+    if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
+      Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D__putImageData_1_Callback";
 
 Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__putImageData_2_Callback";
@@ -806,6 +1081,16 @@
 
 Native_CanvasRenderingContext2D_strokeRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback";
 
+  // Generated overload resolver
+Native_CanvasRenderingContext2D_strokeText(mthis, text, x, y, maxWidth) {
+    if (maxWidth != null) {
+      Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth);
+      return;
+    }
+    Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y);
+    return;
+  }
+
 Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D__strokeText_1_Callback";
 
 Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D__strokeText_2_Callback";
@@ -816,6 +1101,19 @@
 
 Native_CanvasRenderingContext2D_webkitGetImageDataHD_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";
 
+  // Generated overload resolver
+Native_CanvasRenderingContext2D_putImageDataHD(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+    if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
+      Native_CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback(mthis, imagedata, dx, dy);
+      return;
+    }
+    if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
+      Native_CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback";
 
 Native_CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback";
@@ -852,6 +1150,16 @@
 
 Native_Clipboard_types_Getter(mthis) native "Clipboard_types_Getter";
 
+  // Generated overload resolver
+Native_Clipboard_clearData(mthis, type) {
+    if (type != null) {
+      Native_Clipboard__clearData_1_Callback(mthis, type);
+      return;
+    }
+    Native_Clipboard__clearData_2_Callback(mthis);
+    return;
+  }
+
 Native_Clipboard__clearData_1_Callback(mthis, type) native "Clipboard__clearData_1_Callback";
 
 Native_Clipboard__clearData_2_Callback(mthis) native "Clipboard__clearData_2_Callback";
@@ -868,6 +1176,11 @@
 
 Native_CloseEvent_wasClean_Getter(mthis) native "CloseEvent_wasClean_Getter";
 
+  // Generated overload resolver
+Native_Comment_Comment(data) {
+    return Native_Comment__create_1constructorCallback(data);
+  }
+
 Native_Comment__create_1constructorCallback(data) native "Comment__create_1constructorCallback";
 
 Native_UIEvent_charCode_Getter(mthis) native "UIEvent_charCode_Getter";
@@ -1000,6 +1313,11 @@
 
 Native_DOMImplementation_hasFeature_Callback(mthis, feature, version) native "DOMImplementation_hasFeature_Callback";
 
+  // Generated overload resolver
+Native_DOMParser_DomParser() {
+    return Native_DOMParser__create_1constructorCallback();
+  }
+
 Native_DOMParser__create_1constructorCallback() native "DOMParser__create_1constructorCallback";
 
 Native_DOMParser_parseFromString_Callback(mthis, str, contentType) native "DOMParser_parseFromString_Callback";
@@ -1012,6 +1330,14 @@
 
 Native_DOMTokenList_toString_Callback(mthis) native "DOMTokenList_toString_Callback";
 
+  // Generated overload resolver
+Native_DOMTokenList_toggle(mthis, token, force) {
+    if (force != null) {
+      return Native_DOMTokenList__toggle_1_Callback(mthis, token, force);
+    }
+    return Native_DOMTokenList__toggle_2_Callback(mthis, token);
+  }
+
 Native_DOMTokenList__toggle_1_Callback(mthis, token, force) native "DOMTokenList__toggle_1_Callback";
 
 Native_DOMTokenList__toggle_2_Callback(mthis, token) native "DOMTokenList__toggle_2_Callback";
@@ -1030,14 +1356,49 @@
 
 Native_DOMStringList_item_Callback(mthis, index) native "DOMStringList_item_Callback";
 
+  // Generated overload resolver
+Native_DOMStringMap___delete__(mthis, index_OR_name) {
+    if ((index_OR_name is int || index_OR_name == null)) {
+      return Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name);
+    }
+    if ((index_OR_name is String || index_OR_name == null)) {
+      return Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name) native "DOMStringMap____delete___1_Callback";
 
 Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name) native "DOMStringMap____delete___2_Callback";
 
+  // Generated overload resolver
+Native_DOMStringMap___getter__(mthis, index_OR_name) {
+    if ((index_OR_name is int || index_OR_name == null)) {
+      return Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name);
+    }
+    if ((index_OR_name is String || index_OR_name == null)) {
+      return Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name) native "DOMStringMap____getter___1_Callback";
 
 Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name) native "DOMStringMap____getter___2_Callback";
 
+  // Generated overload resolver
+Native_DOMStringMap___setter__(mthis, index_OR_name, value) {
+    if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
+      Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value);
+      return;
+    }
+    if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
+      Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value) native "DOMStringMap____setter___1_Callback";
 
 Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value) native "DOMStringMap____setter___2_Callback";
@@ -1056,6 +1417,17 @@
 
 Native_DataTransferItemList___getter___Callback(mthis, index) native "DataTransferItemList___getter___Callback";
 
+  // Generated overload resolver
+Native_DataTransferItemList_add(mthis, data_OR_file, type) {
+    if ((data_OR_file is File || data_OR_file == null) && type == null) {
+      return Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file);
+    }
+    if ((type is String || type == null) && (data_OR_file is String || data_OR_file == null)) {
+      return Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file) native "DataTransferItemList__add_1_Callback";
 
 Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type) native "DataTransferItemList__add_2_Callback";
@@ -1190,6 +1562,16 @@
 
 Native_Entry_name_Getter(mthis) native "Entry_name_Getter";
 
+  // Generated overload resolver
+Native_Entry__copyTo(mthis, parent, name, successCallback, errorCallback) {
+    if (name != null) {
+      Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
+      return;
+    }
+    Native_Entry__copyTo_2_Callback(mthis, parent);
+    return;
+  }
+
 Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry__copyTo_1_Callback";
 
 Native_Entry__copyTo_2_Callback(mthis, parent) native "Entry__copyTo_2_Callback";
@@ -1198,6 +1580,16 @@
 
 Native_Entry_getParent_Callback(mthis, successCallback, errorCallback) native "Entry_getParent_Callback";
 
+  // Generated overload resolver
+Native_Entry__moveTo(mthis, parent, name, successCallback, errorCallback) {
+    if (name != null) {
+      Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
+      return;
+    }
+    Native_Entry__moveTo_2_Callback(mthis, parent);
+    return;
+  }
+
 Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry__moveTo_1_Callback";
 
 Native_Entry__moveTo_2_Callback(mthis, parent) native "Entry__moveTo_2_Callback";
@@ -1294,10 +1686,29 @@
 
 Native_Document_createElementNS_Callback(mthis, namespaceURI, qualifiedName, typeExtension) native "Document_createElementNS_Callback";
 
+  // Generated overload resolver
+Native_Document__createEvent(mthis, eventType) {
+    if (eventType != null) {
+      return Native_Document__createEvent_1_Callback(mthis, eventType);
+    }
+    return Native_Document__createEvent_2_Callback(mthis);
+  }
+
 Native_Document__createEvent_1_Callback(mthis, eventType) native "Document__createEvent_1_Callback";
 
 Native_Document__createEvent_2_Callback(mthis) native "Document__createEvent_2_Callback";
 
+  // Generated overload resolver
+Native_Document__createNodeIterator(mthis, root, whatToShow, filter) {
+    if (filter != null) {
+      return Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter);
+    }
+    if (whatToShow != null) {
+      return Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow);
+    }
+    return Native_Document__createNodeIterator_3_Callback(mthis, root);
+  }
+
 Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter) native "Document__createNodeIterator_1_Callback";
 
 Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow) native "Document__createNodeIterator_2_Callback";
@@ -1310,6 +1721,17 @@
 
 Native_Document_createTouch_Callback(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback";
 
+  // Generated overload resolver
+Native_Document__createTreeWalker(mthis, root, whatToShow, filter) {
+    if (filter != null) {
+      return Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter);
+    }
+    if (whatToShow != null) {
+      return Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow);
+    }
+    return Native_Document__createTreeWalker_3_Callback(mthis, root);
+  }
+
 Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter) native "Document__createTreeWalker_1_Callback";
 
 Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow) native "Document__createTreeWalker_2_Callback";
@@ -1330,6 +1752,14 @@
 
 Native_Document_getElementsByTagName_Callback(mthis, localName) native "Document_getElementsByTagName_Callback";
 
+  // Generated overload resolver
+Native_Document_importNode(mthis, node, deep) {
+    if (deep != null) {
+      return Native_Document__importNode_1_Callback(mthis, node, deep);
+    }
+    return Native_Document__importNode_2_Callback(mthis, node);
+  }
+
 Native_Document__importNode_1_Callback(mthis, node, deep) native "Document__importNode_1_Callback";
 
 Native_Document__importNode_2_Callback(mthis, node) native "Document__importNode_2_Callback";
@@ -1438,6 +1868,20 @@
 
 Native_Element_tagName_Getter(mthis) native "Element_tagName_Getter";
 
+  // Generated overload resolver
+Native_Element_animate(mthis, keyframes, timingInput) {
+    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
+      return Native_Element__animate_1_Callback(mthis, keyframes, timingInput);
+    }
+    if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
+      return Native_Element__animate_2_Callback(mthis, keyframes, timingInput);
+    }
+    if ((keyframes is List<Map> || keyframes == null) && timingInput == null) {
+      return Native_Element__animate_3_Callback(mthis, keyframes);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_Element__animate_1_Callback(mthis, keyframes, timingInput) native "Element__animate_1_Callback";
 
 Native_Element__animate_2_Callback(mthis, keyframes, timingInput) native "Element__animate_2_Callback";
@@ -1488,10 +1932,30 @@
 
 Native_Element_scrollByPages_Callback(mthis, pages) native "Element_scrollByPages_Callback";
 
+  // Generated overload resolver
+Native_Element__scrollIntoView(mthis, alignWithTop) {
+    if (alignWithTop != null) {
+      Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop);
+      return;
+    }
+    Native_Element__scrollIntoView_2_Callback(mthis);
+    return;
+  }
+
 Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop) native "Element__scrollIntoView_1_Callback";
 
 Native_Element__scrollIntoView_2_Callback(mthis) native "Element__scrollIntoView_2_Callback";
 
+  // Generated overload resolver
+Native_Element__scrollIntoViewIfNeeded(mthis, centerIfNeeded) {
+    if (centerIfNeeded != null) {
+      Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded);
+      return;
+    }
+    Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis);
+    return;
+  }
+
 Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded) native "Element__scrollIntoViewIfNeeded_1_Callback";
 
 Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis) native "Element__scrollIntoViewIfNeeded_2_Callback";
@@ -1528,6 +1992,11 @@
 
 Native_ErrorEvent_message_Getter(mthis) native "ErrorEvent_message_Getter";
 
+  // Generated overload resolver
+Native_EventSource_EventSource(url, eventSourceInit) {
+    return Native_EventSource__create_1constructorCallback(url, eventSourceInit);
+  }
+
 Native_EventSource__create_1constructorCallback(url, eventSourceInit) native "EventSource__create_1constructorCallback";
 
 Native_EventSource_readyState_Getter(mthis) native "EventSource_readyState_Getter";
@@ -1564,6 +2033,11 @@
 
 Native_FileList_item_Callback(mthis, index) native "FileList_item_Callback";
 
+  // Generated overload resolver
+Native_FileReader_FileReader() {
+    return Native_FileReader__create_1constructorCallback();
+  }
+
 Native_FileReader__create_1constructorCallback() native "FileReader__create_1constructorCallback";
 
 Native_FileReader_error_Getter(mthis) native "FileReader_error_Getter";
@@ -1578,6 +2052,16 @@
 
 Native_FileReader_readAsDataURL_Callback(mthis, blob) native "FileReader_readAsDataURL_Callback";
 
+  // Generated overload resolver
+Native_FileReader_readAsText(mthis, blob, encoding) {
+    if (encoding != null) {
+      Native_FileReader__readAsText_1_Callback(mthis, blob, encoding);
+      return;
+    }
+    Native_FileReader__readAsText_2_Callback(mthis, blob);
+    return;
+  }
+
 Native_FileReader__readAsText_1_Callback(mthis, blob, encoding) native "FileReader__readAsText_1_Callback";
 
 Native_FileReader__readAsText_2_Callback(mthis, blob) native "FileReader__readAsText_2_Callback";
@@ -1588,6 +2072,11 @@
 
 Native_FileReader_removeEventListener_Callback(mthis, type, listener, useCapture) native "FileReader_removeEventListener_Callback";
 
+  // Generated overload resolver
+Native_FileReaderSync__FileReaderSync() {
+    return Native_FileReaderSync__create_1constructorCallback();
+  }
+
 Native_FileReaderSync__create_1constructorCallback() native "FileReaderSync__create_1constructorCallback";
 
 Native_FileWriter_error_Getter(mthis) native "FileWriter_error_Getter";
@@ -1614,6 +2103,11 @@
 
 Native_FocusEvent_relatedTarget_Getter(mthis) native "FocusEvent_relatedTarget_Getter";
 
+  // Generated overload resolver
+Native_FontFace_FontFace(family, source, descriptors) {
+    return Native_FontFace__create_1constructorCallback(family, source, descriptors);
+  }
+
 Native_FontFace__create_1constructorCallback(family, source, descriptors) native "FontFace__create_1constructorCallback";
 
 Native_FontFace_family_Getter(mthis) native "FontFace_family_Getter";
@@ -1660,6 +2154,16 @@
 
 Native_FontFaceSet_delete_Callback(mthis, fontFace) native "FontFaceSet_delete_Callback";
 
+  // Generated overload resolver
+Native_FontFaceSet_forEach(mthis, callback, thisArg) {
+    if (thisArg != null) {
+      Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg);
+      return;
+    }
+    Native_FontFaceSet__forEach_2_Callback(mthis, callback);
+    return;
+  }
+
 Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg) native "FontFaceSet__forEach_1_Callback";
 
 Native_FontFaceSet__forEach_2_Callback(mthis, callback) native "FontFaceSet__forEach_2_Callback";
@@ -2008,6 +2512,17 @@
 
 Native_HTMLMediaElement_webkitVideoDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
 
+  // Generated overload resolver
+Native_HTMLMediaElement_addTextTrack(mthis, kind, label, language) {
+    if (language != null) {
+      return Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language);
+    }
+    if (label != null) {
+      return Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label);
+    }
+    return Native_HTMLMediaElement__addTextTrack_3_Callback(mthis, kind);
+  }
+
 Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language) native "HTMLMediaElement__addTextTrack_1_Callback";
 
 Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label) native "HTMLMediaElement__addTextTrack_2_Callback";
@@ -2024,16 +2539,41 @@
 
 Native_HTMLMediaElement_setMediaKeys_Callback(mthis, mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback";
 
+  // Generated overload resolver
+Native_HTMLMediaElement_addKey(mthis, keySystem, key, initData, sessionId) {
+    if (initData != null) {
+      Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId);
+      return;
+    }
+    Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key);
+    return;
+  }
+
 Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId) native "HTMLMediaElement__webkitAddKey_1_Callback";
 
 Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key) native "HTMLMediaElement__webkitAddKey_2_Callback";
 
 Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(mthis, keySystem, sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
 
+  // Generated overload resolver
+Native_HTMLMediaElement_generateKeyRequest(mthis, keySystem, initData) {
+    if (initData != null) {
+      Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData);
+      return;
+    }
+    Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem);
+    return;
+  }
+
 Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData) native "HTMLMediaElement__webkitGenerateKeyRequest_1_Callback";
 
 Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem) native "HTMLMediaElement__webkitGenerateKeyRequest_2_Callback";
 
+  // Generated overload resolver
+Native_HTMLAudioElement_AudioElement(src) {
+    return Native_HTMLAudioElement__create_1constructorCallback(src);
+  }
+
 Native_HTMLAudioElement__create_1constructorCallback(src) native "HTMLAudioElement__create_1constructorCallback";
 
 Native_HTMLBaseElement_href_Getter(mthis) native "HTMLBaseElement_href_Getter";
@@ -2500,18 +3040,61 @@
 
 Native_HTMLInputElement_setCustomValidity_Callback(mthis, error) native "HTMLInputElement_setCustomValidity_Callback";
 
+  // Generated overload resolver
+Native_HTMLInputElement_setRangeText(mthis, replacement, start, end, selectionMode) {
+    if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
+      Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement);
+      return;
+    }
+    if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
+      Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement) native "HTMLInputElement__setRangeText_1_Callback";
 
 Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLInputElement__setRangeText_2_Callback";
 
+  // Generated overload resolver
+Native_HTMLInputElement_setSelectionRange(mthis, start, end, direction) {
+    if (direction != null) {
+      Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction);
+      return;
+    }
+    Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end);
+    return;
+  }
+
 Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLInputElement__setSelectionRange_1_Callback";
 
 Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLInputElement__setSelectionRange_2_Callback";
 
+  // Generated overload resolver
+Native_HTMLInputElement_stepDown(mthis, n) {
+    if (n != null) {
+      Native_HTMLInputElement__stepDown_1_Callback(mthis, n);
+      return;
+    }
+    Native_HTMLInputElement__stepDown_2_Callback(mthis);
+    return;
+  }
+
 Native_HTMLInputElement__stepDown_1_Callback(mthis, n) native "HTMLInputElement__stepDown_1_Callback";
 
 Native_HTMLInputElement__stepDown_2_Callback(mthis) native "HTMLInputElement__stepDown_2_Callback";
 
+  // Generated overload resolver
+Native_HTMLInputElement_stepUp(mthis, n) {
+    if (n != null) {
+      Native_HTMLInputElement__stepUp_1_Callback(mthis, n);
+      return;
+    }
+    Native_HTMLInputElement__stepUp_2_Callback(mthis);
+    return;
+  }
+
 Native_HTMLInputElement__stepUp_1_Callback(mthis, n) native "HTMLInputElement__stepUp_1_Callback";
 
 Native_HTMLInputElement__stepUp_2_Callback(mthis) native "HTMLInputElement__stepUp_2_Callback";
@@ -2712,6 +3295,11 @@
 
 Native_HTMLOptGroupElement_label_Setter(mthis, value) native "HTMLOptGroupElement_label_Setter";
 
+  // Generated overload resolver
+Native_HTMLOptionElement_OptionElement__(data, value, defaultSelected, selected) {
+    return Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected);
+  }
+
 Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected) native "HTMLOptionElement__create_1constructorCallback";
 
 Native_HTMLOptionElement_defaultSelected_Getter(mthis) native "HTMLOptionElement_defaultSelected_Getter";
@@ -3072,10 +3660,33 @@
 
 Native_HTMLTextAreaElement_setCustomValidity_Callback(mthis, error) native "HTMLTextAreaElement_setCustomValidity_Callback";
 
+  // Generated overload resolver
+Native_HTMLTextAreaElement_setRangeText(mthis, replacement, start, end, selectionMode) {
+    if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
+      Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement);
+      return;
+    }
+    if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
+      Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement) native "HTMLTextAreaElement__setRangeText_1_Callback";
 
 Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLTextAreaElement__setRangeText_2_Callback";
 
+  // Generated overload resolver
+Native_HTMLTextAreaElement_setSelectionRange(mthis, start, end, direction) {
+    if (direction != null) {
+      Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction);
+      return;
+    }
+    Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end);
+    return;
+  }
+
 Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLTextAreaElement__setSelectionRange_1_Callback";
 
 Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLTextAreaElement__setSelectionRange_2_Callback";
@@ -3182,6 +3793,20 @@
 
 Native_IDBDatabase_deleteObjectStore_Callback(mthis, name) native "IDBDatabase_deleteObjectStore_Callback";
 
+  // Generated overload resolver
+Native_IDBDatabase_transaction(mthis, storeName_OR_storeNames, mode) {
+    if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
+      return Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode);
+    }
+    if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
+      return Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode);
+    }
+    if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
+      return Native_IDBDatabase__transaction_3_Callback(mthis, storeName_OR_storeNames, mode);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase__transaction_1_Callback";
 
 Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase__transaction_2_Callback";
@@ -3204,6 +3829,14 @@
 
 Native_IDBFactory_deleteDatabase_Callback(mthis, name) native "IDBFactory_deleteDatabase_Callback";
 
+  // Generated overload resolver
+Native_IDBFactory__open(mthis, name, version) {
+    if (version != null) {
+      return Native_IDBFactory__open_1_Callback(mthis, name, version);
+    }
+    return Native_IDBFactory__open_2_Callback(mthis, name);
+  }
+
 Native_IDBFactory__open_1_Callback(mthis, name, version) native "IDBFactory__open_1_Callback";
 
 Native_IDBFactory__open_2_Callback(mthis, name) native "IDBFactory__open_2_Callback";
@@ -3262,6 +3895,17 @@
 
 Native_IDBObjectStore_count_Callback(mthis, key) native "IDBObjectStore_count_Callback";
 
+  // Generated overload resolver
+Native_IDBObjectStore__createIndex(mthis, name, keyPath, options) {
+    if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
+      return Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options);
+    }
+    if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
+      return Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options) native "IDBObjectStore__createIndex_1_Callback";
 
 Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options) native "IDBObjectStore__createIndex_2_Callback";
@@ -3462,10 +4106,25 @@
 
 Native_MIDIMessageEvent_receivedTime_Getter(mthis) native "MIDIMessageEvent_receivedTime_Getter";
 
+  // Generated overload resolver
+Native_MIDIOutput_send(mthis, data, timestamp) {
+    if (timestamp != null) {
+      Native_MIDIOutput__send_1_Callback(mthis, data, timestamp);
+      return;
+    }
+    Native_MIDIOutput__send_2_Callback(mthis, data);
+    return;
+  }
+
 Native_MIDIOutput__send_1_Callback(mthis, data, timestamp) native "MIDIOutput__send_1_Callback";
 
 Native_MIDIOutput__send_2_Callback(mthis, data) native "MIDIOutput__send_2_Callback";
 
+  // Generated overload resolver
+Native_MediaController_MediaController() {
+    return Native_MediaController__create_1constructorCallback();
+  }
+
 Native_MediaController__create_1constructorCallback() native "MediaController__create_1constructorCallback";
 
 Native_MediaController_buffered_Getter(mthis) native "MediaController_buffered_Getter";
@@ -3558,6 +4217,11 @@
 
 Native_MediaKeySession_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaKeySession_removeEventListener_Callback";
 
+  // Generated overload resolver
+Native_MediaKeys_MediaKeys(keySystem) {
+    return Native_MediaKeys__create_1constructorCallback(keySystem);
+  }
+
 Native_MediaKeys__create_1constructorCallback(keySystem) native "MediaKeys__create_1constructorCallback";
 
 Native_MediaKeys_keySystem_Getter(mthis) native "MediaKeys_keySystem_Getter";
@@ -3580,6 +4244,11 @@
 
 Native_MediaQueryList_media_Getter(mthis) native "MediaQueryList_media_Getter";
 
+  // Generated overload resolver
+Native_MediaSource_MediaSource() {
+    return Native_MediaSource__create_1constructorCallback();
+  }
+
 Native_MediaSource__create_1constructorCallback() native "MediaSource__create_1constructorCallback";
 
 Native_MediaSource_activeSourceBuffers_Getter(mthis) native "MediaSource_activeSourceBuffers_Getter";
@@ -3594,6 +4263,16 @@
 
 Native_MediaSource_addSourceBuffer_Callback(mthis, type) native "MediaSource_addSourceBuffer_Callback";
 
+  // Generated overload resolver
+Native_MediaSource_endOfStream(mthis, error) {
+    if (error != null) {
+      Native_MediaSource__endOfStream_1_Callback(mthis, error);
+      return;
+    }
+    Native_MediaSource__endOfStream_2_Callback(mthis);
+    return;
+  }
+
 Native_MediaSource__endOfStream_1_Callback(mthis, error) native "MediaSource__endOfStream_1_Callback";
 
 Native_MediaSource__endOfStream_2_Callback(mthis) native "MediaSource__endOfStream_2_Callback";
@@ -3608,6 +4287,20 @@
 
 Native_MediaSource_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaSource_removeEventListener_Callback";
 
+  // Generated overload resolver
+Native_MediaStream_MediaStream(stream_OR_tracks) {
+    if (stream_OR_tracks == null) {
+      return Native_MediaStream__create_1constructorCallback();
+    }
+    if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
+      return Native_MediaStream__create_2constructorCallback(stream_OR_tracks);
+    }
+    if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
+      return Native_MediaStream__create_3constructorCallback(stream_OR_tracks);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_MediaStream__create_1constructorCallback() native "MediaStream__create_1constructorCallback";
 
 Native_MediaStream__create_2constructorCallback(stream_OR_tracks) native "MediaStream__create_2constructorCallback";
@@ -3898,6 +4591,11 @@
 
 Native_NodeList_item_Callback(mthis, index) native "NodeList_item_Callback";
 
+  // Generated overload resolver
+Native_Notification_Notification(title, options) {
+    return Native_Notification__create_1constructorCallback(title, options);
+  }
+
 Native_Notification__create_1constructorCallback(title, options) native "Notification__create_1constructorCallback";
 
 Native_Notification_body_Getter(mthis) native "Notification_body_Getter";
@@ -3934,6 +4632,11 @@
 
 Native_OfflineAudioCompletionEvent_renderedBuffer_Getter(mthis) native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
 
+  // Generated overload resolver
+Native_OfflineAudioContext_OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate) {
+    return Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate);
+  }
+
 Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext__create_1constructorCallback";
 
 Native_OscillatorNode_detune_Getter(mthis) native "OscillatorNode_detune_Getter";
@@ -3952,10 +4655,30 @@
 
 Native_OscillatorNode_setPeriodicWave_Callback(mthis, periodicWave) native "OscillatorNode_setPeriodicWave_Callback";
 
+  // Generated overload resolver
+Native_OscillatorNode_start(mthis, when) {
+    if (when != null) {
+      Native_OscillatorNode__start_1_Callback(mthis, when);
+      return;
+    }
+    Native_OscillatorNode__start_2_Callback(mthis);
+    return;
+  }
+
 Native_OscillatorNode__start_1_Callback(mthis, when) native "OscillatorNode__start_1_Callback";
 
 Native_OscillatorNode__start_2_Callback(mthis) native "OscillatorNode__start_2_Callback";
 
+  // Generated overload resolver
+Native_OscillatorNode_stop(mthis, when) {
+    if (when != null) {
+      Native_OscillatorNode__stop_1_Callback(mthis, when);
+      return;
+    }
+    Native_OscillatorNode__stop_2_Callback(mthis);
+    return;
+  }
+
 Native_OscillatorNode__stop_1_Callback(mthis, when) native "OscillatorNode__stop_1_Callback";
 
 Native_OscillatorNode__stop_2_Callback(mthis) native "OscillatorNode__stop_2_Callback";
@@ -4006,6 +4729,20 @@
 
 Native_PannerNode_setVelocity_Callback(mthis, x, y, z) native "PannerNode_setVelocity_Callback";
 
+  // Generated overload resolver
+Native_Path_Path(path_OR_text) {
+    if (path_OR_text == null) {
+      return Native_Path__create_1constructorCallback();
+    }
+    if ((path_OR_text is Path || path_OR_text == null)) {
+      return Native_Path__create_2constructorCallback(path_OR_text);
+    }
+    if ((path_OR_text is String || path_OR_text == null)) {
+      return Native_Path__create_3constructorCallback(path_OR_text);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_Path__create_1constructorCallback() native "Path__create_1constructorCallback";
 
 Native_Path__create_2constructorCallback(path_OR_text) native "Path__create_2constructorCallback";
@@ -4222,6 +4959,20 @@
 
 Native_RTCDTMFSender_track_Getter(mthis) native "RTCDTMFSender_track_Getter";
 
+  // Generated overload resolver
+Native_RTCDTMFSender_insertDtmf(mthis, tones, duration, interToneGap) {
+    if (interToneGap != null) {
+      Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap);
+      return;
+    }
+    if (duration != null) {
+      Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration);
+      return;
+    }
+    Native_RTCDTMFSender__insertDTMF_3_Callback(mthis, tones);
+    return;
+  }
+
 Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap) native "RTCDTMFSender__insertDTMF_1_Callback";
 
 Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration) native "RTCDTMFSender__insertDTMF_2_Callback";
@@ -4262,6 +5013,27 @@
 
 Native_RTCDataChannel_close_Callback(mthis) native "RTCDataChannel_close_Callback";
 
+  // Generated overload resolver
+Native_RTCDataChannel_send(mthis, data) {
+    if ((data is TypedData || data == null)) {
+      Native_RTCDataChannel__send_1_Callback(mthis, data);
+      return;
+    }
+    if ((data is ByteBuffer || data == null)) {
+      Native_RTCDataChannel__send_2_Callback(mthis, data);
+      return;
+    }
+    if ((data is Blob || data == null)) {
+      Native_RTCDataChannel__send_3_Callback(mthis, data);
+      return;
+    }
+    if ((data is String || data == null)) {
+      Native_RTCDataChannel__send_4_Callback(mthis, data);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_RTCDataChannel__send_1_Callback(mthis, data) native "RTCDataChannel__send_1_Callback";
 
 Native_RTCDataChannel__send_2_Callback(mthis, data) native "RTCDataChannel__send_2_Callback";
@@ -4286,6 +5058,11 @@
 
 Native_RTCDataChannelEvent_channel_Getter(mthis) native "RTCDataChannelEvent_channel_Getter";
 
+  // Generated overload resolver
+Native_RTCIceCandidate_RtcIceCandidate(dictionary) {
+    return Native_RTCIceCandidate__create_1constructorCallback(dictionary);
+  }
+
 Native_RTCIceCandidate__create_1constructorCallback(dictionary) native "RTCIceCandidate__create_1constructorCallback";
 
 Native_RTCIceCandidate_candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
@@ -4296,6 +5073,11 @@
 
 Native_RTCIceCandidateEvent_candidate_Getter(mthis) native "RTCIceCandidateEvent_candidate_Getter";
 
+  // Generated overload resolver
+Native_RTCPeerConnection_RtcPeerConnection(rtcIceServers, mediaConstraints) {
+    return Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints);
+  }
+
 Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints) native "RTCPeerConnection__create_1constructorCallback";
 
 Native_RTCPeerConnection_iceConnectionState_Getter(mthis) native "RTCPeerConnection_iceConnectionState_Getter";
@@ -4344,6 +5126,11 @@
 
 Native_RTCPeerConnection_removeEventListener_Callback(mthis, type, listener, useCapture) native "RTCPeerConnection_removeEventListener_Callback";
 
+  // Generated overload resolver
+Native_RTCSessionDescription_RtcSessionDescription(descriptionInitDict) {
+    return Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict);
+  }
+
 Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict) native "RTCSessionDescription__create_1constructorCallback";
 
 Native_RTCSessionDescription_sdp_Getter(mthis) native "RTCSessionDescription_sdp_Getter";
@@ -5908,6 +6695,17 @@
 
 Native_Screen_width_Getter(mthis) native "Screen_width_Getter";
 
+  // Generated overload resolver
+Native_Screen_lockOrientation(mthis, orientation_OR_orientations) {
+    if ((orientation_OR_orientations is String || orientation_OR_orientations == null)) {
+      return Native_Screen__lockOrientation_1_Callback(mthis, orientation_OR_orientations);
+    }
+    if ((orientation_OR_orientations is List<String> || orientation_OR_orientations == null)) {
+      return Native_Screen__lockOrientation_2_Callback(mthis, orientation_OR_orientations);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_Screen__lockOrientation_1_Callback(mthis, orientation_OR_orientations) native "Screen__lockOrientation_1_Callback";
 
 Native_Screen__lockOrientation_2_Callback(mthis, orientation_OR_orientations) native "Screen__lockOrientation_2_Callback";
@@ -6028,6 +6826,11 @@
 
 Native_ShadowRoot_getSelection_Callback(mthis) native "ShadowRoot_getSelection_Callback";
 
+  // Generated overload resolver
+Native_SharedWorker_SharedWorker(scriptURL, name) {
+    return Native_SharedWorker__create_1constructorCallback(scriptURL, name);
+  }
+
 Native_SharedWorker__create_1constructorCallback(scriptURL, name) native "SharedWorker__create_1constructorCallback";
 
 Native_SharedWorker_port_Getter(mthis) native "SharedWorker_port_Getter";
@@ -6066,6 +6869,16 @@
 
 Native_SourceBuffer_appendBuffer_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback";
 
+  // Generated overload resolver
+Native_SourceBuffer_appendStream(mthis, stream, maxSize) {
+    if (maxSize != null) {
+      Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize);
+      return;
+    }
+    Native_SourceBuffer__appendStream_2_Callback(mthis, stream);
+    return;
+  }
+
 Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize) native "SourceBuffer__appendStream_1_Callback";
 
 Native_SourceBuffer__appendStream_2_Callback(mthis, stream) native "SourceBuffer__appendStream_2_Callback";
@@ -6100,6 +6913,11 @@
 
 Native_SourceInfo_label_Getter(mthis) native "SourceInfo_label_Getter";
 
+  // Generated overload resolver
+Native_SpeechGrammar_SpeechGrammar() {
+    return Native_SpeechGrammar__create_1constructorCallback();
+  }
+
 Native_SpeechGrammar__create_1constructorCallback() native "SpeechGrammar__create_1constructorCallback";
 
 Native_SpeechGrammar_src_Getter(mthis) native "SpeechGrammar_src_Getter";
@@ -6110,16 +6928,41 @@
 
 Native_SpeechGrammar_weight_Setter(mthis, value) native "SpeechGrammar_weight_Setter";
 
+  // Generated overload resolver
+Native_SpeechGrammarList_SpeechGrammarList() {
+    return Native_SpeechGrammarList__create_1constructorCallback();
+  }
+
 Native_SpeechGrammarList__create_1constructorCallback() native "SpeechGrammarList__create_1constructorCallback";
 
 Native_SpeechGrammarList_length_Getter(mthis) native "SpeechGrammarList_length_Getter";
 
 Native_SpeechGrammarList_NativeIndexed_Getter(mthis, index) native "SpeechGrammarList_item_Callback";
 
+  // Generated overload resolver
+Native_SpeechGrammarList_addFromString(mthis, string, weight) {
+    if (weight != null) {
+      Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight);
+      return;
+    }
+    Native_SpeechGrammarList__addFromString_2_Callback(mthis, string);
+    return;
+  }
+
 Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight) native "SpeechGrammarList__addFromString_1_Callback";
 
 Native_SpeechGrammarList__addFromString_2_Callback(mthis, string) native "SpeechGrammarList__addFromString_2_Callback";
 
+  // Generated overload resolver
+Native_SpeechGrammarList_addFromUri(mthis, src, weight) {
+    if (weight != null) {
+      Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight);
+      return;
+    }
+    Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src);
+    return;
+  }
+
 Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight) native "SpeechGrammarList__addFromUri_1_Callback";
 
 Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src) native "SpeechGrammarList__addFromUri_2_Callback";
@@ -6138,6 +6981,11 @@
 
 Native_SpeechInputResultList_item_Callback(mthis, index) native "SpeechInputResultList_item_Callback";
 
+  // Generated overload resolver
+Native_SpeechRecognition_SpeechRecognition() {
+    return Native_SpeechRecognition__create_1constructorCallback();
+  }
+
 Native_SpeechRecognition__create_1constructorCallback() native "SpeechRecognition__create_1constructorCallback";
 
 Native_SpeechRecognition_continuous_Getter(mthis) native "SpeechRecognition_continuous_Getter";
@@ -6228,6 +7076,11 @@
 
 Native_SpeechSynthesisEvent_name_Getter(mthis) native "SpeechSynthesisEvent_name_Getter";
 
+  // Generated overload resolver
+Native_SpeechSynthesisUtterance_SpeechSynthesisUtterance(text) {
+    return Native_SpeechSynthesisUtterance__create_1constructorCallback(text);
+  }
+
 Native_SpeechSynthesisUtterance__create_1constructorCallback(text) native "SpeechSynthesisUtterance__create_1constructorCallback";
 
 Native_SpeechSynthesisUtterance_lang_Getter(mthis) native "SpeechSynthesisUtterance_lang_Getter";
@@ -6272,14 +7125,49 @@
 
 Native_Storage_length_Getter(mthis) native "Storage_length_Getter";
 
+  // Generated overload resolver
+Native_Storage___delete__(mthis, index_OR_name) {
+    if ((index_OR_name is int || index_OR_name == null)) {
+      return Native_Storage____delete___1_Callback(mthis, index_OR_name);
+    }
+    if ((index_OR_name is String || index_OR_name == null)) {
+      return Native_Storage____delete___2_Callback(mthis, index_OR_name);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_Storage____delete___1_Callback(mthis, index_OR_name) native "Storage____delete___1_Callback";
 
 Native_Storage____delete___2_Callback(mthis, index_OR_name) native "Storage____delete___2_Callback";
 
+  // Generated overload resolver
+Native_Storage___getter__(mthis, index_OR_name) {
+    if ((index_OR_name is int || index_OR_name == null)) {
+      return Native_Storage____getter___1_Callback(mthis, index_OR_name);
+    }
+    if ((index_OR_name is String || index_OR_name == null)) {
+      return Native_Storage____getter___2_Callback(mthis, index_OR_name);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_Storage____getter___1_Callback(mthis, index_OR_name) native "Storage____getter___1_Callback";
 
 Native_Storage____getter___2_Callback(mthis, index_OR_name) native "Storage____getter___2_Callback";
 
+  // Generated overload resolver
+Native_Storage___setter__(mthis, index_OR_name, value) {
+    if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
+      Native_Storage____setter___1_Callback(mthis, index_OR_name, value);
+      return;
+    }
+    if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
+      Native_Storage____setter___2_Callback(mthis, index_OR_name, value);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_Storage____setter___1_Callback(mthis, index_OR_name, value) native "Storage____setter___1_Callback";
 
 Native_Storage____setter___2_Callback(mthis, index_OR_name, value) native "Storage____setter___2_Callback";
@@ -6530,7 +7418,19 @@
 
 Native_TreeWalker_previousSibling_Callback(mthis) native "TreeWalker_previousSibling_Callback";
 
-Native_URL__createObjectUrlFromWebKitSource_Callback(source) native "URL__createObjectUrlFromWebKitSource_Callback";
+  // Generated overload resolver
+Native_URL_createObjectUrl(blob_OR_source_OR_stream) {
+    if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
+      return Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream);
+    }
+    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+      return Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream);
+    }
+    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
+      return Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
 
 Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_1_Callback";
 
@@ -6538,8 +7438,6 @@
 
 Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_3_Callback";
 
-Native_URL__createObjectURL_4_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_4_Callback";
-
 Native_URL_createObjectUrlFromBlob_Callback(blob) native "URL_createObjectUrlFromBlob_Callback";
 
 Native_URL_createObjectUrlFromSource_Callback(source) native "URL_createObjectUrlFromSource_Callback";
@@ -6610,6 +7508,11 @@
 
 Native_URLUtilsReadOnly_toString_Callback(mthis) native "URLUtilsReadOnly_toString_Callback";
 
+  // Generated overload resolver
+Native_VTTCue_VttCue(startTime, endTime, text) {
+    return Native_VTTCue__create_1constructorCallback(startTime, endTime, text);
+  }
+
 Native_VTTCue__create_1constructorCallback(startTime, endTime, text) native "VTTCue__create_1constructorCallback";
 
 Native_VTTCue_align_Getter(mthis) native "VTTCue_align_Getter";
@@ -6646,6 +7549,11 @@
 
 Native_VTTCue_getCueAsHTML_Callback(mthis) native "VTTCue_getCueAsHTML_Callback";
 
+  // Generated overload resolver
+Native_VTTRegion_VttRegion() {
+    return Native_VTTRegion__create_1constructorCallback();
+  }
+
 Native_VTTRegion__create_1constructorCallback() native "VTTRegion__create_1constructorCallback";
 
 Native_VTTRegion_height_Getter(mthis) native "VTTRegion_height_Getter";
@@ -6798,6 +7706,23 @@
 
 Native_WebGLRenderingContext_bufferByteData_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferByteData_Callback";
 
+  // Generated overload resolver
+Native_WebGLRenderingContext_bufferData(mthis, target, data_OR_size, usage) {
+    if ((usage is int || usage == null) && (data_OR_size is TypedData || data_OR_size == null) && (target is int || target == null)) {
+      Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage);
+      return;
+    }
+    if ((usage is int || usage == null) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int || target == null)) {
+      Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage);
+      return;
+    }
+    if ((usage is int || usage == null) && (data_OR_size is int || data_OR_size == null) && (target is int || target == null)) {
+      Native_WebGLRenderingContext__bufferData_3_Callback(mthis, target, data_OR_size, usage);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_1_Callback";
 
 Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_2_Callback";
@@ -6808,6 +7733,19 @@
 
 Native_WebGLRenderingContext_bufferSubByteData_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubByteData_Callback";
 
+  // Generated overload resolver
+Native_WebGLRenderingContext_bufferSubData(mthis, target, offset, data) {
+    if ((data is TypedData || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
+      Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data);
+      return;
+    }
+    if ((data is ByteBuffer || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
+      Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data) native "WebGLRenderingContext__bufferSubData_1_Callback";
 
 Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data) native "WebGLRenderingContext__bufferSubData_2_Callback";
@@ -6988,6 +7926,31 @@
 
 Native_WebGLRenderingContext_stencilOpSeparate_Callback(mthis, face, fail, zfail, zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";
 
+  // Generated overload resolver
+Native_WebGLRenderingContext_texImage2D(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
+    if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (format is int || format == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null)) {
+      Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
+      Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
+      Native_WebGLRenderingContext__texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
+      Native_WebGLRenderingContext__texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
+      Native_WebGLRenderingContext__texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext__texImage2D_1_Callback";
 
 Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_2_Callback";
@@ -7010,6 +7973,31 @@
 
 Native_WebGLRenderingContext_texParameteri_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameteri_Callback";
 
+  // Generated overload resolver
+Native_WebGLRenderingContext_texSubImage2D(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
+    if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null)) {
+      Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
+      Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
+      Native_WebGLRenderingContext__texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
+      Native_WebGLRenderingContext__texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
+      Native_WebGLRenderingContext__texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext__texSubImage2D_1_Callback";
 
 Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_2_Callback";
@@ -7102,8 +8090,18 @@
 
 Native_WebKitCSSFilterRule_style_Getter(mthis) native "WebKitCSSFilterRule_style_Getter";
 
+  // Generated overload resolver
+Native_WebKitCSSMatrix__WebKitCSSMatrix(cssValue) {
+    return Native_WebKitCSSMatrix__create_1constructorCallback(cssValue);
+  }
+
 Native_WebKitCSSMatrix__create_1constructorCallback(cssValue) native "WebKitCSSMatrix__create_1constructorCallback";
 
+  // Generated overload resolver
+Native_WebKitMediaSource__WebKitMediaSource() {
+    return Native_WebKitMediaSource__create_1constructorCallback();
+  }
+
 Native_WebKitMediaSource__create_1constructorCallback() native "WebKitMediaSource__create_1constructorCallback";
 
 Native_WebKitPoint_constructorCallback(x, y) native "WebKitPoint_constructorCallback";
@@ -7118,6 +8116,20 @@
 
 Native_WebKitSourceBufferList_item_Callback(mthis, index) native "WebKitSourceBufferList_item_Callback";
 
+  // Generated overload resolver
+Native_WebSocket_WebSocket(url, protocol_OR_protocols) {
+    if ((url is String || url == null) && protocol_OR_protocols == null) {
+      return Native_WebSocket__create_1constructorCallback(url);
+    }
+    if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
+      return Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols);
+    }
+    if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
+      return Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_WebSocket__create_1constructorCallback(url) native "WebSocket__create_1constructorCallback";
 
 Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols) native "WebSocket__create_2constructorCallback";
@@ -7138,6 +8150,20 @@
 
 Native_WebSocket_url_Getter(mthis) native "WebSocket_url_Getter";
 
+  // Generated overload resolver
+Native_WebSocket_close(mthis, code, reason) {
+    if (reason != null) {
+      Native_WebSocket__close_1_Callback(mthis, code, reason);
+      return;
+    }
+    if (code != null) {
+      Native_WebSocket__close_2_Callback(mthis, code);
+      return;
+    }
+    Native_WebSocket__close_3_Callback(mthis);
+    return;
+  }
+
 Native_WebSocket__close_1_Callback(mthis, code, reason) native "WebSocket__close_1_Callback";
 
 Native_WebSocket__close_2_Callback(mthis, code) native "WebSocket__close_2_Callback";
@@ -7276,6 +8302,17 @@
 
 Native_Window_window_Getter(mthis) native "Window_window_Getter";
 
+  // Generated overload resolver
+Native_Window___getter__(mthis, index_OR_name) {
+    if ((index_OR_name is int || index_OR_name == null)) {
+      return Native_Window____getter___1_Callback(mthis, index_OR_name);
+    }
+    if ((index_OR_name is String || index_OR_name == null)) {
+      return Native_Window____getter___2_Callback(mthis, index_OR_name);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
 Native_Window____getter___1_Callback(mthis, index_OR_name) native "Window____getter___1_Callback";
 
 Native_Window____getter___2_Callback(mthis, index_OR_name) native "Window____getter___2_Callback";
@@ -7354,6 +8391,11 @@
 
 Native_Window_setTimeout_Callback(mthis, handler, timeout) native "Window_setTimeout_Callback";
 
+  // Generated overload resolver
+Native_Worker_Worker(scriptUrl) {
+    return Native_Worker__create_1constructorCallback(scriptUrl);
+  }
+
 Native_Worker__create_1constructorCallback(scriptUrl) native "Worker__create_1constructorCallback";
 
 Native_Worker_postMessage_Callback(mthis, message, messagePorts) native "Worker_postMessage_Callback";
@@ -7418,10 +8460,20 @@
 
 Native_XMLHttpRequest_setRequestHeader_Callback(mthis, header, value) native "XMLHttpRequest_setRequestHeader_Callback";
 
+  // Generated overload resolver
+Native_XMLSerializer_XmlSerializer() {
+    return Native_XMLSerializer__create_1constructorCallback();
+  }
+
 Native_XMLSerializer__create_1constructorCallback() native "XMLSerializer__create_1constructorCallback";
 
 Native_XMLSerializer_serializeToString_Callback(mthis, node) native "XMLSerializer_serializeToString_Callback";
 
+  // Generated overload resolver
+Native_XPathEvaluator_XPathEvaluator() {
+    return Native_XPathEvaluator__create_1constructorCallback();
+  }
+
 Native_XPathEvaluator__create_1constructorCallback() native "XPathEvaluator__create_1constructorCallback";
 
 Native_XPathEvaluator_createExpression_Callback(mthis, expression, resolver) native "XPathEvaluator_createExpression_Callback";
@@ -7452,6 +8504,11 @@
 
 Native_XPathResult_snapshotItem_Callback(mthis, index) native "XPathResult_snapshotItem_Callback";
 
+  // Generated overload resolver
+Native_XSLTProcessor_XsltProcessor() {
+    return Native_XSLTProcessor__create_1constructorCallback();
+  }
+
 Native_XSLTProcessor__create_1constructorCallback() native "XSLTProcessor__create_1constructorCallback";
 
 Native_XSLTProcessor_clearParameters_Callback(mthis) native "XSLTProcessor_clearParameters_Callback";
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index a4d1f1f..f5fbcae 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -236,14 +236,17 @@
         ir.FunctionDefinition function = compiler.irBuilder.getIr(element);
         tree.Builder builder = new tree.Builder(compiler);
         tree.FunctionDefinition definition = builder.build(function);
-        compiler.tracer.traceCompilation(element.name, null, compiler);
-        compiler.tracer.traceGraph('Tree builder', definition);
-        treeElements = new TreeElementMapping(element);
-        tree.Unnamer unnamer = new tree.Unnamer();
-        unnamer.unname(definition);
-        compiler.tracer.traceGraph('Unnamer', definition);
-        tree.Emitter emitter = new tree.Emitter();
-        node = emitter.emit(element, treeElements, definition);
+        if (definition == null) {
+          node = element.parseNode(compiler);
+        } else {
+          compiler.tracer.traceCompilation(element.name, null, compiler);
+          compiler.tracer.traceGraph('Tree builder', definition);
+          treeElements = new TreeElementMapping(element);
+          tree.Unnamer unnamer = new tree.Unnamer();
+          unnamer.unname(definition);
+          compiler.tracer.traceGraph('Unnamer', definition);
+          node = dart_codegen.emit(element, treeElements, definition);
+        }
       }
       return new ElementAst(node, treeElements);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
index 942a55c..518c5d0 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
@@ -14,6 +14,7 @@
 import 'dart_tree.dart' as tree;
 import '../util/util.dart';
 import '../mirror_renamer/mirror_renamer.dart';
+import 'dart_codegen.dart' as dart_codegen;
 
 import '../scanner/scannerlib.dart' show StringToken,
                                          Keyword,
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
new file mode 100644
index 0000000..d8d7573
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
@@ -0,0 +1,171 @@
+library dart_codegen;
+
+import 'dart_tree.dart' as tree;
+import 'dart_printer.dart';
+import 'dart_tree_printer.dart' show TreePrinter;
+import '../tree/tree.dart' as frontend;
+import '../dart2jslib.dart' as dart2js;
+import '../elements/elements.dart';
+import '../dart_types.dart';
+import '../elements/modelx.dart' as modelx;
+
+/// Translates the dart_tree IR to Dart frontend AST.
+frontend.FunctionExpression emit(FunctionElement element,
+                                 dart2js.TreeElementMapping treeElements,
+                                 tree.FunctionDefinition definition) {
+  FunctionExpression fn = new ASTEmitter().emit(element, definition);
+  return new TreePrinter(treeElements).makeExpression(fn);
+}
+
+/// Translates the dart_tree IR to Dart backend AST.
+class ASTEmitter extends tree.Visitor<dynamic, Expression> {
+  /// Variables to be hoisted at the top of the current function.
+  List<VariableDeclaration> variables;
+  
+  /// Statements emitted by the most recent call to [visitStatement].
+  List<Statement> statementBuffer;
+  
+  /// The function currently being emitted.
+  FunctionElement functionElement;
+  
+  FunctionExpression emit(FunctionElement element,
+                          tree.FunctionDefinition definition) {
+    functionElement = element;
+    variables = <VariableDeclaration>[];
+    statementBuffer = <Statement>[];
+    tree.Variable.counter = 0;
+    
+    Parameters parameters = emitParameters(definition.parameters);
+    visitStatement(definition.body);
+    removeTrailingReturn();
+    Statement body = new Block(statementBuffer);
+    if (variables.length > 0) {
+      Statement head = new VariableDeclarations(variables);
+      body = new Block([head, body]);
+    }
+    
+    FunctionType functionType = element.type;
+    
+    variables = null;
+    statementBuffer = null;
+    functionElement = null;
+    
+    return new FunctionExpression(
+        parameters, 
+        body,
+        name: element.name,
+        returnType: emitOptionalType(functionType.returnType))
+        ..element = element;
+  }
+  
+  /// Removes a trailing "return null" from [statementBuffer].
+  void removeTrailingReturn() {
+    if (statementBuffer.isEmpty) return;
+    if (statementBuffer.last is! Return) return;
+    Return ret = statementBuffer.last;
+    Expression expr = ret.expression;
+    if (expr is Literal && expr.value is dart2js.NullConstant) {
+      statementBuffer.removeLast();
+    }
+  }
+  
+  Parameter emitParameter(tree.Variable param) {
+    ParameterElement element = param.element;
+    TypeAnnotation type = emitOptionalType(element.type);
+    return new Parameter(element.name, type:type)
+               ..element = element;
+  }
+  
+  Parameters emitParameters(List<tree.Variable> params) {
+    return new Parameters(params.map(emitParameter).toList(growable:false));
+  }
+  
+  void visitExpressionStatement(tree.ExpressionStatement stmt) {
+    Expression e = visitExpression(stmt.expression);
+    statementBuffer.add(new ExpressionStatement(e));
+    visitStatement(stmt.next);
+  }
+  
+  void visitLetVal(tree.LetVal stmt) {
+    // Synthesize an element for the variable, if necessary.
+    if (stmt.variable.element == null) {
+      stmt.variable.element = new modelx.VariableElementX.synthetic(
+          stmt.variable.name,
+          ElementKind.VARIABLE,
+          functionElement);
+    }
+    variables.add(new VariableDeclaration(stmt.variable.name));
+    Expression def = visitExpression(stmt.definition);
+    statementBuffer.add(new ExpressionStatement(new Assignment(
+        visitVariable(stmt.variable), 
+        '=', 
+        def)));
+    visitStatement(stmt.body);
+  }
+  
+  void visitReturn(tree.Return stmt) {
+    Expression inner = visitExpression(stmt.value);
+    statementBuffer.add(new Return(inner));
+  }
+  
+  Expression visitConstant(tree.Constant exp) {
+    return emitConstant(exp.value);
+  }
+  
+  Expression visitInvokeStatic(tree.InvokeStatic exp) {
+    List args = exp.arguments.map(visitExpression).toList(growable:false);
+    return new CallStatic(null, exp.target.name, args)
+               ..element = exp.target;
+  }
+  
+  Expression visitVariable(tree.Variable exp) {
+    return new Identifier(exp.name)
+               ..element = exp.element;
+  }
+  
+  TypeAnnotation emitType(DartType type) {
+    if (type is GenericType) { // TODO(asgerf): faster Link.map
+      return new TypeAnnotation(
+          type.element.name, 
+          type.typeArguments.toList(growable:false) 
+              .map(emitType).toList(growable:false))
+          ..dartType = type;
+    } else if (type is VoidType) {
+      return new TypeAnnotation('void')
+          ..dartType = type;
+    } else if (type is TypeVariableType) {
+      return new TypeAnnotation(type.name)
+          ..dartType = type;
+    } else {
+      throw "Unsupported type annotation: ${type.runtimeType}";
+    }
+  }
+  
+  /// Like [emitType] except the dynamic type is converted to null.
+  TypeAnnotation emitOptionalType(DartType type) {
+    if (type.isDynamic) {
+      return null;
+    } else {
+      return emitType(type);
+    }
+  }
+  
+  Expression emitConstant(dart2js.Constant constant) {
+    if (constant is dart2js.PrimitiveConstant) {
+      return new Literal(constant);
+    } else if (constant is dart2js.ListConstant) {
+      return new LiteralList(constant.entries.map(emitConstant), isConst: true);
+    } else if (constant is dart2js.MapConstant) {
+      List<LiteralMapEntry> entries = <LiteralMapEntry>[];
+      for (var i = 0; i < constant.keys.length; i++) {
+        entries.add(new LiteralMapEntry(
+            emitConstant(constant.keys.entries[i]), 
+            emitConstant(constant.values[i])));
+      }
+      return new LiteralMap(entries, isConst: true);
+    } else {
+      throw "Unsupported constant: ${constant.runtimeType}";
+    }
+  }
+}
+
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
index 445c0de..9320905 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
@@ -22,6 +22,8 @@
 import '../dart2jslib.dart' as dart2js;
 import '../tree/tree.dart' as tree;
 import '../util/characters.dart' as characters;
+import '../elements/elements.dart' as elements;
+import '../dart_types.dart' as types;
 
 /// The following nodes correspond to [tree.Send] expressions: 
 /// [FieldExpression], [IndexExpression], [Assignment], [Increment], 
@@ -64,14 +66,9 @@
   final String name;
   final List<TypeAnnotation> typeArguments;
   
-  TypeAnnotation(this.name, [this.typeArguments]);
+  types.DartType dartType;
   
-  static final TypeAnnotation NUM = new TypeAnnotation("num");
-  static final TypeAnnotation INT = new TypeAnnotation("int");
-  static final TypeAnnotation DOUBLE = new TypeAnnotation("double");
-  static final TypeAnnotation BOOL = new TypeAnnotation("bool");
-  static final TypeAnnotation STRING = new TypeAnnotation("String");
-  static final TypeAnnotation DYNAMIC = new TypeAnnotation("dynamic");
+  TypeAnnotation(this.name, [this.typeArguments = const <TypeAnnotation>[]]);
 }
 
 // STATEMENTS
@@ -134,8 +131,8 @@
       : this.leftHandValue = leftHandValue {
     assert(leftHandValue is Identifier 
         || (leftHandValue is VariableDeclarations 
-            && leftHandValue.definitions.length == 1
-            && leftHandValue.definitions[0].initializer == null));
+            && leftHandValue.declarations.length == 1
+            && leftHandValue.declarations[0].initializer == null));
   }
 }
 
@@ -234,9 +231,9 @@
   final TypeAnnotation type;
   final bool isFinal;
   final bool isConst;
-  final List<VariableDeclaration> definitions;
+  final List<VariableDeclaration> declarations;
 
-  VariableDeclarations(this.definitions, 
+  VariableDeclarations(this.declarations, 
                       { this.type, 
                         this.isFinal: false, 
                         this.isConst: false }) {
@@ -260,9 +257,9 @@
   final Statement body;
 
   FunctionDeclaration(this.name,
-                    this.parameters,
-                    this.body, 
-                    [ this.returnType ]);
+                      this.parameters,
+                      this.body, 
+                      [ this.returnType ]);
 }
 
 class Parameters extends Node {
@@ -295,13 +292,15 @@
   /// Parameters to function parameter. Null for non-function parameters.
   final Parameters parameters;
   
+  elements.ParameterElement element;
+  
   Parameter(this.name, {this.type, this.defaultValue})
       : parameters = null;
   
   Parameter.function(this.name, 
                      TypeAnnotation returnType, 
                      this.parameters, 
-                     [this.defaultValue]) : type = returnType {
+                     [ this.defaultValue ]) : type = returnType {
     assert(parameters != null);
   }
   
@@ -314,10 +313,20 @@
 // EXPRESSIONS
 
 class FunctionExpression extends Expression {
+  final TypeAnnotation returnType;
+  final String name;
   final Parameters parameters;
   final Statement body;
+  
+  elements.FunctionElement element;
 
-  FunctionExpression(this.parameters, this.body);
+  FunctionExpression(this.parameters, 
+                     this.body, 
+                     { this.name, 
+                       this.returnType }) {
+    // Function must have a name if it has a return type
+    assert(returnType == null || name != null);
+  }
 }
 
 class Conditional extends Expression {
@@ -334,6 +343,8 @@
 /// to the proper definition.
 class Identifier extends Expression {
   final String name;
+  
+  elements.Element element;
 
   Identifier(this.name);
   
@@ -351,7 +362,7 @@
   final TypeAnnotation typeArgument;
   final List<Expression> values;
 
-  LiteralList(this.values, {this.typeArgument, this.isConst: false});
+  LiteralList(this.values, { this.typeArgument, this.isConst: false });
 }
 
 class LiteralMap extends Expression {
@@ -359,7 +370,7 @@
   final List<TypeAnnotation> typeArguments;
   final List<LiteralMapEntry> entries;
 
-  LiteralMap(this.entries, {this.typeArguments, this.isConst: false}) {
+  LiteralMap(this.entries, { this.typeArguments, this.isConst: false }) {
     assert(this.typeArguments == null 
         || this.typeArguments.length == 0 
         || this.typeArguments.length == 2);
@@ -451,6 +462,8 @@
   final String className;
   final String methodName;
   final List<Argument> arguments;
+  
+  elements.FunctionElement element;
 
   CallStatic(this.className, this.methodName, this.arguments);
 }
@@ -541,13 +554,79 @@
   return op == '!' || op == '-' || op == '~';
 }
 bool isBinaryOperator(String op) {
-  return Unparser._binaryPrecedence.containsKey(op);
+  return BINARY_PRECEDENCE.containsKey(op);
 }
 
 
 const int NEWLINE = 10;
 const int CARRIAGE_RETURN = 13;
 
+// Precedence levels
+const int EXPRESSION = 1;
+const int CONDITIONAL = 2;
+const int LOGICAL_OR = 3;
+const int LOGICAL_AND = 4;
+const int EQUALITY = 6;
+const int RELATIONAL = 7;
+const int BITWISE_OR = 8;
+const int BITWISE_XOR = 9;
+const int BITWISE_AND = 10;
+const int SHIFT = 11;
+const int ADDITIVE = 12;
+const int MULTIPLICATIVE = 13;
+const int UNARY = 14;
+const int POSTFIX_INCREMENT = 15;
+const int PRIMARY = 20;
+
+/// Precedence level required for the callee in a [FunctionCall]. 
+const int CALLEE = 21;
+
+const Map<String,int> BINARY_PRECEDENCE = const {
+  '&&': LOGICAL_AND,
+  '||': LOGICAL_OR,
+                                  
+  '==': EQUALITY,
+  '!=': EQUALITY,
+  
+  '>': RELATIONAL,
+  '>=': RELATIONAL,
+  '<': RELATIONAL,
+  '<=': RELATIONAL,
+  
+  '|': BITWISE_OR,
+  '^': BITWISE_XOR,
+  '&': BITWISE_AND,
+  
+  '>>': SHIFT,
+  '<<': SHIFT,
+  
+  '+': ADDITIVE,
+  '-': ADDITIVE,
+  
+  '*': MULTIPLICATIVE,
+  '%': MULTIPLICATIVE,
+  '/': MULTIPLICATIVE,
+  '~/': MULTIPLICATIVE,
+};
+
+/// Return true if binary operators with the given precedence level are
+/// (left) associative. False if they are non-associative.
+bool isAssociativeBinaryOperator(int precedence) {
+  return precedence != EQUALITY && precedence != RELATIONAL; 
+}
+
+/// True if [x] is a letter, digit, or underscore.
+/// Such characters may not follow a shorthand string interpolation.
+bool isIdentifierPartNoDollar(dynamic x) {
+  if (x is! int) {
+    return false;
+  }
+  return (characters.$0 <= x && x <= characters.$9) || 
+         (characters.$A <= x && x <= characters.$Z) ||
+         (characters.$a <= x && x <= characters.$z) ||
+         (x == characters.$_);
+}
+
 /// The unparser will apply the following syntactic rewritings:
 ///   Use short-hand function returns:
 ///     foo(){return E} ==> foo() => E;
@@ -585,64 +664,6 @@
   
   Unparser(this.output);
   
-  // Precedence levels
-  static const EXPRESSION = 1;
-  static const CONDITIONAL = 2;
-  static const LOGICAL_OR = 3;
-  static const LOGICAL_AND = 4;
-  static const EQUALITY = 6;
-  static const RELATIONAL = 7;
-  static const BITWISE_OR = 8;
-  static const BITWISE_XOR = 9;
-  static const BITWISE_AND = 10;
-  static const SHIFT = 11;
-  static const ADDITIVE = 12;
-  static const MULTIPLICATIVE = 13;
-  static const UNARY = 14;
-  static const POSTFIX_INCREMENT = 15;
-  static const PRIMARY = 20;
-  
-  /// Precedence level required for the callee in a [FunctionCall]. 
-  static const CALLEE = 21;
-  
-  static const _binaryPrecedence = const {
-    '&&': LOGICAL_AND,
-    '||': LOGICAL_OR,
-                                    
-    '==': EQUALITY,
-    '!=': EQUALITY,
-    
-    '>': RELATIONAL,
-    '>=': RELATIONAL,
-    '<': RELATIONAL,
-    '<=': RELATIONAL,
-    
-    '|': BITWISE_OR,
-    '^': BITWISE_XOR,
-    '&': BITWISE_AND,
-    
-    '>>': SHIFT,
-    '<<': SHIFT,
-    
-    '+': ADDITIVE,
-    '-': ADDITIVE,
-    
-    '*': MULTIPLICATIVE,
-    '%': MULTIPLICATIVE,
-    '/': MULTIPLICATIVE,
-    '~/': MULTIPLICATIVE,
-  };
-  
-  /// The type of quote used around string literals.
-  static const QUOTE = "'";
-  static const QUOTE_CODE = 39;
-  
-  /// Return true if binary operators with the given precedence level are
-  /// (left) associative. False if they are non-associative.
-  static bool isAssociativeBinaryOperator(int precedence) {
-    return precedence != EQUALITY && precedence != RELATIONAL; 
-  }
-  
 
   void write(String s) {
     output.write(s);
@@ -722,13 +743,30 @@
       Statement stmt = unfoldBlocks(e.body);
       int precedence = stmt is Return ? EXPRESSION : PRIMARY;
       withPrecedence(precedence, () {
+        // A named function expression at the beginning of a statement
+        // can be mistaken for a function declaration.
+        // (Note: Functions with a return type also have a name) 
+        bool needParen = beginStmt && e.name != null;
+        if (needParen) {
+          write('(');
+        }
+        if (e.returnType != null) {
+          writeType(e.returnType);
+          write(' ');
+        }
+        if (e.name != null) {
+          write(e.name);
+        }
         writeParameters(e.parameters);
-        if (stmt is Return) {
+        if (stmt is Return) { // TODO(asgerf): Print {} for "return null;"
           write('=> '); // TODO(asgerf): Minimize use of whitespace.
           writeExp(stmt.expression, EXPRESSION);
         } else {
           writeBlock(stmt);
         }
+        if (needParen) {
+          write(')');
+        }
       });
     } else if (e is Conditional) {
       withPrecedence(CONDITIONAL, () {
@@ -768,7 +806,7 @@
         write(' const '); // TODO(asgerf): Minimize use of whitespace.
         needParen = false;
       }
-      if (e.typeArguments != null && e.typeArguments.length > 0) {
+      if (e.typeArguments.length > 0) {
         write('<');
         writeEach(',', e.typeArguments, writeType);
         write('>');
@@ -807,7 +845,7 @@
       else if (e.operatorName == '!' &&
           operand is TypeOperator && operand.operatorName == 'is') {
         withPrecedence(RELATIONAL, () {
-          writeExp(operand.expression, BITWISE_OR);
+          writeExp(operand.expression, BITWISE_OR, beginStmt: beginStmt);
           write(' is!'); // TODO(asgerf): Minimize use of whitespace.
           writeType(operand.type);
         });
@@ -819,7 +857,7 @@
         });
       }
     } else if (e is BinaryOperator) {
-      int precedence = _binaryPrecedence[e.operatorName];
+      int precedence = BINARY_PRECEDENCE[e.operatorName];
       withPrecedence(precedence, () {
         // All binary operators are left-associative or non-associative.
         // For each operand, we use either the same precedence level as
@@ -1131,7 +1169,7 @@
     if (!vds.isConst && !vds.isFinal && vds.type == null) {
       write('var ');
     }
-    writeEach(',', vds.definitions, (VariableDeclaration vd) {
+    writeEach(',', vds.declarations, (VariableDeclaration vd) {
       write(vd.name);
       if (vd.initializer != null) {
         write('=');
@@ -1179,7 +1217,7 @@
     }  
   }
   
-  void writeStringLiteral(Expression node) {
+  static StringLiteralOutput analyzeStringLiteral(Expression node) {
     // TODO(asgerf): This might be a bit too expensive. Benchmark.
     // Flatten the StringConcat tree.
     List parts = []; // Expression or int (char node)
@@ -1248,16 +1286,6 @@
       }
     }
     
-    /// True if [x] is a letter, digit, or underscore.
-    /// Such characters may not follow a shorthand string interpolation.
-    bool isIdentifierPartNoDollar(dynamic x) {
-      if (x is! int)
-        return false;
-      return (characters.$0 <= x && x <= characters.$9) 
-          || (characters.$A <= x && x <= characters.$Z) 
-          || (characters.$a <= x && x <= characters.$z)
-          || (x == characters.$_);
-    }
 
     /// Applies additional cost to each track in [penalized], and considers
     /// switching from each [penalized] to a [nonPenalized] track.
@@ -1342,6 +1370,12 @@
       }
     }
     
+    return new StringLiteralOutput(parts, bestChunk.end(parts.length));
+  }
+  
+  void writeStringLiteral(Expression node) {
+    StringLiteralOutput output = analyzeStringLiteral(node);
+    List parts = output.parts;
     void printChunk(StringChunk chunk) {
       int startIndex;
       if (chunk.previous != null) {
@@ -1411,11 +1445,21 @@
       }
       write(chunk.quoting.quoteChar);
     }
-    printChunk(bestChunk.end(parts.length));
+    printChunk(output.chunk);
   }
   
 }
 
+/// The contents of a string literal together with a strategy for printing it.
+class StringLiteralOutput {
+  /// Mix of [Expression] and `int`. Each expression is a string interpolation,
+  /// and each `int` is the character code of a character in a string literal.
+  final List parts;
+  final StringChunk chunk;
+  
+  StringLiteralOutput(this.parts, this.chunk);
+}
+
 
 /// Strategy for printing a prefix of a string literal.
 /// A chunk represents the substring going from [:previous.endIndex:] to
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
index 2ba25bf..3e91bb1 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
@@ -32,7 +32,6 @@
  * The base class of all Tree nodes.
  */
 abstract class Node {
-  accept(Visitor visitor);
 }
 
 /**
@@ -40,6 +39,11 @@
  */
 abstract class Expression extends Node {
   bool get isPure;
+  accept(Visitor v);
+}
+
+abstract class Statement extends Node {
+  accept(Visitor v);
 }
 
 /**
@@ -51,57 +55,22 @@
   static int counter = 0;
   static String _newName() => 'v${counter++}';
 
-  final Element element;
-  String name;
-  ast.Identifier identifier;
+  Element element;
+  String cachedName;
+  
+  String get name {
+    if (cachedName != null) return cachedName;
+    return cachedName = ((element == null) ? _newName() : element.name);
+  }
 
   Variable(this.element);
 
-  ast.Identifier assignIdentifier() {
-    assert(identifier == null);
-    name = (element == null) ? _newName() : element.name;
-    identifier = Emitter.makeIdentifier(name);
-    return identifier;
-  }
-
   final bool isPure = true;
 
   accept(Visitor visitor) => visitor.visitVariable(this);
 }
 
 /**
- * A sequence of expressions.
- */
-class Sequence extends Expression {
-  final List<Expression> expressions;
-
-  Sequence(this.expressions);
-
-  bool get isPure => expressions.every((e) => e.isPure);
-
-  accept(Visitor visitor) => visitor.visitSequence(this);
-}
-
-/**
- * A local binding of a [Variable] to an [Expression].
- *
- * In contrast to the CPS-based IR, non-primitive expressions can be named
- * with let.
- */
-class LetVal extends Expression {
-  final Variable variable;
-  Expression definition;
-  Expression body;
-  final bool hasExactlyOneUse;
-
-  LetVal(this.variable, this.definition, this.body, this.hasExactlyOneUse);
-
-  bool get isPure => definition.isPure && body.isPure;
-
-  accept(Visitor visitor) => visitor.visitLetVal(this);
-}
-
-/**
  * A call to a static target.
  *
  * In contrast to the CPS-based IR, the arguments can be arbitrary expressions.
@@ -118,22 +87,6 @@
 }
 
 /**
- * A return exit from the function.
- *
- * In contrast to the CPS-based IR, the return value is an arbitrary
- * expression.
- */
-class Return extends Expression {
-  Expression value;
-
-  Return(this.value);
-
-  final bool isPure = true;
-
-  accept(Visitor visitor) => visitor.visitReturn(this);
-}
-
-/**
  * A constant.
  */
 class Constant extends Expression {
@@ -146,30 +99,66 @@
   accept(Visitor visitor) => visitor.visitConstant(this);
 }
 
-class FunctionDefinition extends Node {
-  final List<Variable> parameters;
-  Expression body;
+/**
+ * A local binding of a [Variable] to an [Expression].
+ *
+ * In contrast to the CPS-based IR, non-primitive expressions can be named
+ * with let.
+ */
+class LetVal extends Statement {
+  final Variable variable;
+  Expression definition;
+  Statement body;
+  final bool hasExactlyOneUse;
 
-  FunctionDefinition(this.parameters, this.body);
+  LetVal(this.variable, this.definition, this.body, this.hasExactlyOneUse);
 
-  accept(Visitor visitor) => visitor.visitFunctionDefinition(this);
+  accept(Visitor visitor) => visitor.visitLetVal(this);
+}
+/**
+ * A return exit from the function.
+ *
+ * In contrast to the CPS-based IR, the return value is an arbitrary
+ * expression.
+ */
+class Return extends Statement {
+  Expression value;
+
+  Return(this.value);
+
+  final bool isPure = true;
+
+  accept(Visitor visitor) => visitor.visitReturn(this);
 }
 
-abstract class Visitor<T> {
-  T visit(Node node) => node.accept(this);
+class ExpressionStatement extends Statement {
+  Expression expression;
+  Statement next;
+  
+  ExpressionStatement(this.expression, this.next);
+  
+  accept(Visitor visitor) => visitor.visitExpressionStatement(this);
+}
 
-  // Abstract classes.
-  T visitNode(Node node) => null;
-  T visitFunctionDefinition(FunctionDefinition node) => visitNode(node);
-  T visitExpression(Expression node) => visitNode(node);
 
-  // Concrete classes.
-  T visitVariable(Variable node) => visitExpression(node);
-  T visitSequence(Sequence node) => visitExpression(node);
-  T visitLetVal(LetVal node) => visitExpression(node);
-  T visitInvokeStatic(InvokeStatic node) => visitExpression(node);
-  T visitReturn(Return node) => visitExpression(node);
-  T visitConstant(Constant node) => visitExpression(node);
+
+class FunctionDefinition extends Node {
+  final List<Variable> parameters;
+  Statement body;
+
+  FunctionDefinition(this.parameters, this.body);
+}
+
+abstract class Visitor<S, E> {
+  E visitExpression(Expression e) => e.accept(this);
+  E visitVariable(Variable node);
+  E visitInvokeStatic(InvokeStatic node);
+  E visitConstant(Constant node);
+  
+  S visitStatement(Statement s) => s.accept(this);
+  S visitLetVal(LetVal node);
+  S visitReturn(Return node);
+  S visitExpressionStatement(ExpressionStatement node);
 }
 
 /**
@@ -204,7 +193,7 @@
  * particular, intermediate values and blocks used for local control flow are
  * still all named.
  */
-class Builder extends ir.Visitor<Expression> {
+class Builder extends ir.Visitor<Node> {
   final dart2js.Compiler compiler;
 
   // Uses of IR definitions are replaced with Tree variables.  This is the
@@ -216,9 +205,18 @@
 
   Builder(this.compiler);
 
+  static final String _bailout = 'Bailout Tree Builder';
+
+  bailout() => throw _bailout;
+
   FunctionDefinition build(ir.FunctionDefinition node) {
-    visit(node);
-    return function;
+    try {
+      visit(node);
+      return function;
+    } catch (e) {
+      if (e == _bailout) return null;
+      rethrow;
+    }
   }
 
   List<Expression> translateArguments(List<ir.Reference> args) {
@@ -238,7 +236,7 @@
     return null;
   }
 
-  Expression visitLetPrim(ir.LetPrim node) {
+  Statement visitLetPrim(ir.LetPrim node) {
     // LetPrim is translated to LetVal.
     Expression definition = visit(node.primitive);
     if (node.primitive.hasAtLeastOneUse) {
@@ -251,19 +249,19 @@
       // values (e.g., as part of a shrinking reductions pass).
       return visit(node.body);
     } else {
-      return new Sequence([definition, visit(node.body)]);
+      return new ExpressionStatement(definition, visit(node.body));
     }
   }
 
-  Expression visitLetCont(ir.LetCont node) {
+  Statement visitLetCont(ir.LetCont node) {
     // TODO(kmillikin): Allow continuations to have multiple uses.  This could
     // arise due to the representation of local control flow or due to
     // optimization.
-    assert(node.continuation.hasAtMostOneUse);
+    if (!node.continuation.hasAtMostOneUse) return bailout();
     return visit(node.body);
   }
 
-  Expression visitInvokeStatic(ir.InvokeStatic node) {
+  Statement visitInvokeStatic(ir.InvokeStatic node) {
     // Calls are translated to direct style.
     List<Expression> arguments = translateArguments(node.arguments);
     Expression invoke = new InvokeStatic(node.target, arguments);
@@ -280,16 +278,21 @@
         return new LetVal(variable, invoke, cont.body.accept(this),
             parameter.hasExactlyOneUse);
       } else {
-        return new Sequence([invoke, visit(cont.body)]);
+        return new ExpressionStatement(invoke, visit(cont.body));
       }
     }
   }
 
-  Expression visitInvokeContinuation(ir.InvokeContinuation node) {
+  Statement visitInvokeContinuation(ir.InvokeContinuation node) {
     // TODO(kmillikin): Support non-return continuations.  These could arise
     // due to local control flow or due to inlining or other optimization.
-    assert(node.continuation.definition == returnContinuation);
-    return new Return(variables[node.argument.definition]);
+    if (node.continuation.definition != returnContinuation) return bailout();
+    assert(node.arguments.length == 1);
+    return new Return(variables[node.arguments[0].definition]);
+  }
+
+  Expression visitBranch(ir.Branch node) {
+    return bailout();
   }
 
   Expression visitConstant(ir.Constant node) {
@@ -330,14 +333,14 @@
  * See [visitVariable] for the implementation of the heuristic for propagating
  * a definition.
  */
-class Unnamer extends Visitor<Expression> {
+class Unnamer extends Visitor<Statement, Expression> {
   // The binding environment.  The rightmost element of the list is the nearest
   // enclosing binding.
   List<LetVal> environment;
 
   void unname(FunctionDefinition definition) {
     environment = <LetVal>[];
-    definition.body = visit(definition.body);
+    definition.body = visitStatement(definition.body);
 
     // TODO(kmillikin):  Allow definitions that are not propagated.  Here,
     // this means rebuilding the binding with a recursively unnamed definition,
@@ -366,7 +369,7 @@
             && environment[i].hasExactlyOneUse) {
           // Use the definition if it is pure or if it is the first impure
           // definition (i.e., propagating past only pure expressions).
-          return visit(environment.removeAt(i).definition);
+          return visitExpression(environment.removeAt(i).definition);
         }
         break;
       } else if (!environment[i].definition.isPure) {
@@ -379,22 +382,15 @@
     return node;
   }
 
-  Expression visitSequence(Sequence node) {
-    for (int i = 0; i < node.expressions.length; ++i) {
-      node.expressions[i] = visit(node.expressions[i]);
-    }
-    return node;
-  }
-
-  Expression visitLetVal(LetVal node) {
+  Statement visitLetVal(LetVal node) {
     environment.add(node);
-    Expression body = visit(node.body);
+    Statement body = visitStatement(node.body);
 
     if (!environment.isEmpty && environment.last == node) {
       // The definition could not be propagated.  Residualize the let binding.
       node.body = body;
       environment.removeLast();
-      node.definition = visit(node.definition);
+      node.definition = visitExpression(node.definition);
       return node;
     }
     assert(!environment.contains(node));
@@ -404,368 +400,23 @@
   Expression visitInvokeStatic(InvokeStatic node) {
     // Process arguments right-to-left, the opposite of evaluation order.
     for (int i = node.arguments.length - 1; i >= 0; --i) {
-      node.arguments[i] = visit(node.arguments[i]);
+      node.arguments[i] = visitExpression(node.arguments[i]);
     }
     return node;
   }
 
-  Expression visitReturn(Return node) {
-    node.value = visit(node.value);
+  Statement visitReturn(Return node) {
+    node.value = visitExpression(node.value);
     return node;
   }
 
-  visitConstant(Constant node) {
+  Expression visitConstant(Constant node) {
     return node;
   }
-}
-
-/**
- * [Emitter] translates Tree to a Dart AST.
- *
- * The AST is handed off to the Dart backend for renaming and to emit Dart
- * code.  Generating an AST is a temporary approach to integrating Tree into
- * the Dart backend.  Ultimately, either Dart code directly will be emitted or
- * the translation will be to a backend-specific Dart AST and not the same
- * one used by the front end.
- *
- * The front end's AST is an unwieldy interface for constructing and generating
- * Dart code.  AST nodes require references to tokens and the tokens will be
- * used by the unparser.  This means that constructing an AST also requires
- * constructing (redundant) tokens.  Unparsing AST nodes also requires a
- * mapping from nodes to elements --- so this mapping must be constructed by
- * the emitter.
- */
-class Emitter extends Visitor<ast.Node> {
-  ConstantEmitter constantEmitter = new ConstantEmitter();
-
-  // Accumulate a list of variables used, these are hoisted and declared on
-  // entry to the function.
-  List<ast.Identifier> variables = <ast.Identifier>[];
-
-  // A mapping from nodes to elements, constructed while walking the input
-  // tree.
-  dart2js.TreeElementMapping treeElements;
-
-  // Tokens needed in the AST.
-  final Token openParen = new BeginGroupToken(OPEN_PAREN_INFO, -1);
-  final Token closeParen = new SymbolToken(CLOSE_PAREN_INFO, -1);
-  final Token openBrace = new BeginGroupToken(OPEN_CURLY_BRACKET_INFO, -1);
-  final Token closeBrace = new SymbolToken(CLOSE_CURLY_BRACKET_INFO, -1);
-  final Token semicolon = new SymbolToken(SEMICOLON_INFO, -1);
-
-  // Helper methods to construct ASTs.
-  static ast.Identifier makeIdentifier(String name) {
-    return new ast.Identifier(
-        new StringToken.fromString(IDENTIFIER_INFO, name, -1));
-  }
-
-  ast.NodeList makeArgumentList(List<ast.Node> arguments) {
-    return new ast.NodeList(openParen,
-                            new Link<ast.Node>.fromList(arguments),
-                            closeParen,
-                            ',');
-  }
-
-  ast.Block makeBlock(List<ast.Node> statements) {
-    return new ast.Block(new ast.NodeList(
-        openBrace, new Link<ast.Node>.fromList(statements), closeBrace));
-  }
-
-  static ast.SendSet makeAssignment(ast.Identifier identifier,
-                                    ast.Expression expression) {
-    return new ast.SendSet(
-        null,
-        identifier,
-        new ast.Operator(new SymbolToken(EQ_INFO, -1)),
-        new ast.NodeList.singleton(expression));
-  }
-
-  /**
-   * Translate the body of a function to an AST FunctionExpression.
-   */
-  ast.FunctionExpression emit(FunctionElement element,
-                              dart2js.TreeElementMapping treeElements,
-                              FunctionDefinition definition) {
-    // Reset the variable index.  This function is not reentrant.
-    Variable.counter = 0;
-    this.treeElements = treeElements;
-    ast.Identifier name = makeIdentifier(element.name);
-
-    TypeEmitter typeEmitter = new TypeEmitter();
-    FunctionSignature signature = element.functionSignature;
-    ast.TypeAnnotation returnType;
-    if (!signature.type.returnType.isDynamic) {
-      returnType = typeEmitter.visit(signature.type.returnType, treeElements);
-    }
-
-    List<ast.VariableDefinitions> parameterList = <ast.VariableDefinitions>[];
-    for (Variable parameter in definition.parameters) {
-      ParameterElement element = parameter.element;
-      parameter.assignIdentifier();
-      ast.TypeAnnotation type;
-      if (!element.type.isDynamic) {
-        type = typeEmitter.visit(element.type, treeElements);
-      }
-      parameterList.add(new ast.VariableDefinitions(
-          type,
-          ast.Modifiers.EMPTY,
-          new ast.NodeList.singleton(parameter.identifier)));
-    }
-    ast.NodeList parameters =
-        new ast.NodeList(openParen,
-                         new Link<ast.Node>.fromList(parameterList),
-                         closeParen,
-                         ',');
-
-    ast.Node body = visit(definition.body);
-
-    if (!variables.isEmpty) {
-      // Introduce hoisted definitions for all variables.
-      ast.Identifier modifier =
-          new ast.Identifier(new KeywordToken(Keyword.keywords['var'], -1));
-      ast.VariableDefinitions definitions = new ast.VariableDefinitions(
-          null,
-          new ast.Modifiers(new ast.NodeList(
-              null,
-              new Link<ast.Node>.fromList([modifier]),
-              null,
-              ' ')),
-          new ast.NodeList(
-              null,
-              new Link<ast.Node>.fromList(variables),
-              semicolon,
-              ','));
-      body = concatenate(definitions, body);
-    }
-
-    if (body is ast.Return) {
-      // Use a short form for bodies that are a single return.
-      ast.Expression value = (body as ast.Return).expression;
-      if (value is ast.LiteralNull) {
-        // '{ return null; }' is '{}'.
-        body = makeBlock([]);
-      } else {
-        // '{ return e; }' is '=> e;'.
-        body = new ast.Return(new SymbolToken(FUNCTION_INFO, -1),
-                              semicolon,
-                              value);
-      }
-    } else if (body is ast.Block) {
-      // Remove a final 'return null' that ends the body block.
-      Link<ast.Node> nodes = (body as ast.Block).statements.nodes;
-      ast.Node last;
-      for (ast.Node n in nodes) {
-        last = n;
-      }
-      if (last is ast.Return
-          && (last as ast.Return).expression is ast.LiteralNull) {
-        List<ast.Node> statements =
-            (body as ast.Block).statements.nodes.toList();
-        statements.removeLast();
-        body = makeBlock(statements);
-      }
-    }
-
-    return new ast.FunctionExpression(name, parameters, body, returnType,
-        ast.Modifiers.EMPTY, null, null);
-  }
-
-  /**
-   * Translate a list of arguments to an AST NodeList.
-   */
-  ast.NodeList translateArguments(List<Expression> args) {
-    List<ast.Expression> arguments = args.map(visit).toList(growable: false);
-    return makeArgumentList(arguments);
-  }
-
-  /**
-   * Concatenate a pair of AST expressions or statements into a single Block
-   * statement.
-   */
-  ast.Node concatenate(ast.Node first, ast.Node second) {
-    // This is a convenient but very inefficient way to accumulate statements.
-    // The Block and NodeList nodes are not mutable so we can't simply use a
-    // Block or NodeList as an accumulator.  Using a List<Node> requires
-    // special casing and extra state to handle the expression/statement
-    // distinction.
-    // TODO(kmillikin): If we don't get rid of this Emitter, use a more
-    // efficient way to accumulate nodes.
-    LinkBuilder<ast.Node> statements = new LinkBuilder<ast.Node>();
-
-    addStatements(ast.Node node) {
-      if (node is ast.Block) {
-        for (ast.Node n in node.statements.nodes) {
-          statements.addLast(n);
-        }
-      } else if (node is ast.Expression) {
-          statements.addLast(new ast.ExpressionStatement(node, semicolon));
-      } else {
-        statements.addLast(node);
-      }
-    }
-
-    addStatements(first);
-    addStatements(second);
-
-    return new ast.Block(
-        new ast.NodeList(openBrace, statements.toLink(), closeBrace));
-  }
-
-  ast.Node visitVariable(Variable node) {
-    // The scope of variables is the body of their binding, so a name has
-    // already been generated when we visit a variable.
-    assert(node.identifier != null);
-    return new ast.Send(null, node.identifier);
-  }
-
-  ast.Node visitSequence(Sequence node) {
-    return node.expressions.map(visit).reduce(concatenate);
-  }
-
-  ast.Node visitLetVal(LetVal node) {
-    // Let bindings translate into assignments.
-    ast.Identifier identifier = node.variable.assignIdentifier();
-    variables.add(identifier);
-
-    ast.Expression expression = visit(node.definition);
-    ast.Expression assignment = makeAssignment(identifier, expression);
-
-    ast.Node rest = visit(node.body);
-    return concatenate(assignment, rest);
-  }
-
-  ast.Node visitInvokeStatic(InvokeStatic node) {
-    ast.Identifier name = makeIdentifier(node.target.name);
-    ast.Send send =
-        new ast.Send(null, name, translateArguments(node.arguments));
-    treeElements[send] = node.target;
-    return send;
-  }
-
-  ast.Node visitReturn(Return node) {
-    ast.Expression expression = visit(node.value);
-    return new ast.Return(
-        new KeywordToken(Keyword.keywords['return'], -1),
-        semicolon,
-        expression);
-  }
-
-  ast.Node visitConstant(Constant node) {
-    return node.value.accept(constantEmitter);
-  }
-}
-
-class TypeEmitter extends
-    DartTypeVisitor<ast.TypeAnnotation, dart2js.TreeElementMapping> {
-
-  // Supported types are verified at IR construction time.  The unimplemented
-  // emit methods should be unreachable.
-  ast.TypeAnnotation unimplemented() => throw new UnimplementedError();
-
-  ast.TypeAnnotation makeSimpleAnnotation(
-      DartType type,
-      dart2js.TreeElementMapping treeElements) {
-    ast.TypeAnnotation annotation =
-        new ast.TypeAnnotation(Emitter.makeIdentifier(type.toString()), null);
-    treeElements.setType(annotation, type);
-    return annotation;
-  }
-
-  ast.TypeAnnotation visit(DartType type,
-                           dart2js.TreeElementMapping treeElements) {
-    return type.accept(this, treeElements);
-  }
-
-  ast.TypeAnnotation visitType(DartType type,
-                               dart2js.TreeElementMapping treeElements) {
-    return unimplemented();
-  }
-
-  ast.TypeAnnotation visitVoidType(VoidType type,
-                                   dart2js.TreeElementMapping treeElements) {
-    return makeSimpleAnnotation(type, treeElements);
-  }
-
-  ast.TypeAnnotation visitInterfaceType(
-      InterfaceType type,
-      dart2js.TreeElementMapping treeElements) {
-    assert(!type.isGeneric);
-    return makeSimpleAnnotation(type, treeElements);
-  }
-
-  ast.TypeAnnotation visitTypedefType(
-      TypedefType type,
-      dart2js.TreeElementMapping treeElements) {
-    assert(!type.isGeneric);
-    return makeSimpleAnnotation(type, treeElements);
-  }
-
-  ast.TypeAnnotation visitDynamicType(
-      DynamicType type,
-      dart2js.TreeElementMapping treeElements) {
-    return unimplemented();
-  }
-}
-
-class ConstantEmitter extends dart2js.ConstantVisitor<ast.Expression> {
-  ast.Expression unimplemented() => throw new UnimplementedError();
-
-  ast.Expression visitFunction(dart2js.FunctionConstant constant) {
-    return unimplemented();
-  }
-
-  ast.Expression visitNull(dart2js.NullConstant constant) {
-    return new ast.LiteralNull(
-        new KeywordToken(Keyword.keywords['null'], -1));
-  }
-
-  ast.Expression visitInt(dart2js.IntConstant constant) {
-    return new ast.LiteralInt(
-        new StringToken.fromString(INT_INFO, constant.value.toString(), -1),
-        null);
-  }
-
-  ast.Expression visitDouble(dart2js.DoubleConstant constant) {
-    return new ast.LiteralDouble(
-        new StringToken.fromString(DOUBLE_INFO, constant.value.toString(), -1),
-        null);
-  }
-
-  ast.Expression visitTrue(dart2js.TrueConstant constant) {
-    return new ast.LiteralBool(
-        new KeywordToken(Keyword.keywords['true'], -1), null);
-  }
-
-  ast.Expression visitFalse(dart2js.FalseConstant constant) {
-    return new ast.LiteralBool(
-        new KeywordToken(Keyword.keywords['false'], -1), null);
-  }
-
-  ast.Expression visitString(dart2js.StringConstant constant) {
-    return unimplemented();
-  }
-
-  ast.Expression visitList(dart2js.ListConstant constant) {
-    return unimplemented();
-  }
-
-  ast.Expression visitMap(dart2js.MapConstant constant) {
-    return unimplemented();
-  }
-
-  ast.Expression visitConstructed(dart2js.ConstructedConstant constant) {
-    return unimplemented();
-  }
-
-  ast.Expression visitType(dart2js.TypeConstant constant) {
-    return unimplemented();
-  }
-
-  ast.Expression visitInterceptor(dart2js.InterceptorConstant constant) {
-    return unimplemented();
-  }
-
-  ast.Expression visitDummy(dart2js.DummyConstant constant) {
-    return unimplemented();
+  
+  Statement visitExpressionStatement(ExpressionStatement node) {
+    node.expression = visitExpression(node.expression);
+    node.next = visitStatement(node.next);
+    return node;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
new file mode 100644
index 0000000..e93f548
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
@@ -0,0 +1,906 @@
+library dart_tree_printer;
+
+import 'dart_printer.dart';
+import '../tree/tree.dart' as tree;
+import '../scanner/scannerlib.dart';
+import '../util/util.dart';
+import '../dart2jslib.dart' as dart2js;
+import '../util/characters.dart' as characters;
+import '../elements/elements.dart' as elements;
+import '../dart_types.dart' as types;
+
+/// Converts backend ASTs to frontend ASTs.
+class TreePrinter {
+  dart2js.TreeElementMapping treeElements;
+  
+  TreePrinter([this.treeElements]);
+  
+  void setElement(tree.Node node, elements.Element element) {
+    if (treeElements != null) {
+      if (element == null) {
+        throw "Missing element";
+      }
+      treeElements[node] = element;
+    }
+  }
+  
+  void setType(tree.Node node, types.DartType type) {
+    if (treeElements != null) {
+      if (type == null) {
+        throw "Missing type from ${node.runtimeType}";
+      }
+      treeElements.setType(node, type);
+    }
+  }
+  
+  // Group tokens: () [] {} <>
+  static BeginGroupToken makeGroup(PrecedenceInfo open, PrecedenceInfo close) {
+    BeginGroupToken openTok = new BeginGroupToken(open, -1);
+    openTok.endGroup = new SymbolToken(close, -1);
+    return openTok;
+  }
+  
+  final BeginGroupToken openParen = makeGroup(OPEN_PAREN_INFO, 
+                                              CLOSE_PAREN_INFO);
+  final BeginGroupToken openBrace = makeGroup(OPEN_CURLY_BRACKET_INFO, 
+                                              CLOSE_CURLY_BRACKET_INFO);
+  final BeginGroupToken openBracket = makeGroup(OPEN_SQUARE_BRACKET_INFO, 
+                                                CLOSE_SQUARE_BRACKET_INFO);
+  final BeginGroupToken lt = makeGroup(LT_INFO, GT_INFO);
+  
+  Token get closeParen => openParen.endGroup;
+  Token get closeBrace => openBrace.endGroup;
+  Token get closeBracket => openBracket.endGroup;
+  Token get gt => lt.endGroup;
+  
+  // Symbol tokens
+  final Token semicolon = new SymbolToken(SEMICOLON_INFO, -1);
+  final Token indexToken = new SymbolToken(INDEX_INFO, -1); // "[]"
+  final Token question = new SymbolToken(QUESTION_INFO, -1);
+  final Token colon = new SymbolToken(COLON_INFO, -1);
+  final Token hash = new SymbolToken(HASH_INFO, -1);
+  final Token bang = new SymbolToken(BANG_INFO, -1);
+  final Token eq = new SymbolToken(EQ_INFO, -1);
+  
+  // Keyword tokens
+  static Token makeIdToken(String text) {
+    return new StringToken.fromString(IDENTIFIER_INFO, text, -1);
+  }
+  final Token newToken = makeIdToken('new');
+  final Token constToken = makeIdToken('const');
+  final Token throwToken = makeIdToken('throw');
+  final Token rethrowToken = makeIdToken('rethrow');
+  final Token breakToken = makeIdToken('break');
+  final Token continueToken = makeIdToken('continue');
+  final Token doToken = makeIdToken('do');
+  final Token whileToken = makeIdToken('while');
+  final Token ifToken = makeIdToken('if');
+  final Token elseToken = makeIdToken('else');
+  final Token forToken = makeIdToken('for');
+  final Token inToken = makeIdToken('in');
+  final Token returnToken = makeIdToken('return');
+  final Token switchToken = makeIdToken('switch');
+  final Token caseToken = makeIdToken('case');
+  final Token defaultToken = makeIdToken('default');
+  final Token tryToken = makeIdToken('try');
+  final Token catchToken = makeIdToken('catch');
+  final Token onToken = makeIdToken('on');
+  final Token finallyToken = makeIdToken('finally');
+  
+  static tree.Identifier makeIdentifier(String name) {
+    return new tree.Identifier(
+        new StringToken.fromString(IDENTIFIER_INFO, name, -1));
+  }
+  
+  // Utilities for creating NodeLists
+  Link<tree.Node> makeLink(Iterable<tree.Node> nodes) {
+    LinkBuilder builder = new LinkBuilder();
+    for (tree.Node node in nodes) {
+      builder.addLast(node);
+    }
+    return builder.toLink();
+  }
+  
+  tree.NodeList blankList() {
+    return new tree.NodeList(null, makeLink([]), null, '');
+  }
+  tree.NodeList singleton(tree.Node node) {
+    return new tree.NodeList(null, makeLink([node]), null, '');
+  }
+  tree.NodeList makeList(String delimiter, 
+                         Iterable<tree.Node> nodes,
+                         { Token open,
+                           Token close }) {
+    return new tree.NodeList(open, makeLink(nodes), close, delimiter);
+  }
+  tree.NodeList parenList(String delimiter, Iterable<tree.Node> nodes) {
+    return makeList(delimiter, nodes, open: openParen, close: closeParen);
+  }
+  tree.NodeList bracketList(String delimiter, Iterable<tree.Node> nodes) {
+    return makeList(delimiter, nodes, open: openBracket, close: closeBracket);
+  }
+  tree.NodeList braceList(String delimiter, Iterable<tree.Node> nodes) {
+    return makeList(delimiter, nodes, open: openBrace, close: closeBrace);
+  }
+  tree.NodeList argList(Iterable<tree.Node> nodes) {
+    return parenList(',', nodes);
+  }
+  tree.NodeList typeArgList(Iterable<tree.Node> nodes) {
+    return makeList(',', nodes, open: lt, close: gt);
+  }
+  
+  /// Converts a qualified name into nested Sends.
+  tree.Node makeName(String name) {
+    if (name == null) {
+      return null;
+    }
+    List<String> names = name.split('.').toList(growable:false);
+    tree.Node node = makeIdentifier(names[0]);
+    for (int i = 1; i < names.length; i++) {
+      node = new tree.Send(node, makeIdentifier(names[i]));
+    }
+    return node;
+  }
+  
+  static Token assignmentToken(String operatorName) {
+    switch (operatorName) {
+      case '=': return new SymbolToken(EQ_INFO, -1);
+      case '+=': return new SymbolToken(PLUS_EQ_INFO, -1);
+      case '-=': return new SymbolToken(MINUS_EQ_INFO, -1);
+      case '*=': return new SymbolToken(STAR_EQ_INFO, -1);
+      case '/=': return new SymbolToken(SLASH_EQ_INFO, -1);
+      case '~/=': return new SymbolToken(TILDE_SLASH_EQ_INFO, -1);
+      case '%=': return new SymbolToken(PERCENT_EQ_INFO, -1);
+      case '&=': return new SymbolToken(AMPERSAND_EQ_INFO, -1);
+      case '^=': return new SymbolToken(CARET_EQ_INFO, -1);
+      case '|=': return new SymbolToken(BAR_EQ_INFO, -1);
+      case '>>=': return new SymbolToken(GT_GT_EQ_INFO, -1);
+      case '<<=': return new SymbolToken(LT_LT_EQ_INFO, -1);
+      default:
+        throw "Unrecognized assignment operator: $operatorName";
+    }
+  }
+  
+  static Token binopToken(String operatorName) {
+    switch (operatorName) {
+      case '+': return new SymbolToken(PLUS_INFO, -1);
+      case '-': return new SymbolToken(MINUS_INFO, -1);
+      case '*': return new SymbolToken(STAR_INFO, -1);
+      case '/': return new SymbolToken(SLASH_INFO, -1);
+      case '~/': return new SymbolToken(TILDE_SLASH_INFO, -1);
+      case '%': return new SymbolToken(PERCENT_INFO, -1);
+      case '&': return new SymbolToken(AMPERSAND_INFO, -1);
+      case '^': return new SymbolToken(CARET_INFO, -1);
+      case '|': return new SymbolToken(BAR_INFO, -1);
+      case '>>': return new SymbolToken(GT_GT_INFO, -1);
+      case '<<': return new SymbolToken(LT_LT_INFO, -1);
+      case '==': return new SymbolToken(EQ_EQ_INFO, -1);
+      case '!=': return new SymbolToken(BANG_EQ_INFO, -1);
+      case '>': return new SymbolToken(GT_INFO, -1);
+      case '>=': return new SymbolToken(GT_EQ_INFO, -1);
+      case '<': return new SymbolToken(LT_INFO, -1);
+      case '<=': return new SymbolToken(LT_EQ_INFO, -1);
+      case '&&': return new SymbolToken(AMPERSAND_AMPERSAND_INFO, -1);
+      case '||': return new SymbolToken(BAR_BAR_INFO, -1);
+      default:
+        throw "Unrecognized binary operator: $operatorName";
+    }
+  }
+  
+  static Token incrementToken(String operatorName) {
+    switch (operatorName) {
+      case '++': return new SymbolToken(PLUS_PLUS_INFO, -1);
+      case '--': return new SymbolToken(MINUS_MINUS_INFO, -1);
+      default:
+        throw "Unrecognized increment operator: $operatorName";
+    }
+  }
+  
+  static Token typeOpToken(String operatorName) {
+    switch (operatorName) { // "is!" is not an operator in the frontend AST.
+      case 'is': return new SymbolToken(IS_INFO, -1);
+      case 'as': return new SymbolToken(AS_INFO, -1);
+      default:
+        throw 'Unrecognized type operator: $operatorName';
+    }
+  }
+  
+  Token unopToken(String operatorName) {
+    switch (operatorName) {
+      case '-': return new SymbolToken(MINUS_INFO, -1);
+      case '~': return new SymbolToken(TILDE_INFO, -1);
+      case '!': return bang;
+      default:
+        throw "Unrecognized unary operator: $operatorName";
+    }
+  }
+  
+  tree.Node makeArgument(Argument arg) {
+    if (arg is Expression) {
+      return makeExpression(arg);
+    } else if (arg is NamedArgument) {
+      return new tree.NamedArgument(
+          makeIdentifier(arg.name), 
+          colon, 
+          makeExpression(arg.expression));
+    } else {
+      throw "Unrecognized argument type: ${arg.runtimeType}";
+    }
+  }
+  
+  tree.Node makeExpression(Expression exp) {
+    return makeExp(exp, EXPRESSION);
+  }
+  
+  /// Converts [exp] to a [tree.Node] that unparses to an expression with 
+  /// a precedence level of at least [minPrecedence]. The expression will be
+  /// wrapped in a parenthesis if necessary.
+  tree.Node makeExp(Receiver exp, int minPrecedence, {bool beginStmt: false}) {
+    tree.Node result;
+    int precedence;
+    bool needParen = false;
+    if (exp is SuperReceiver) {
+      precedence = CALLEE;
+      result = makeIdentifier('super');
+    } else if (exp is Assignment) {
+      Expression left = exp.left;
+      tree.Node receiver;
+      tree.Node selector;
+      tree.NodeList arguments;
+      elements.Element element;
+      if (left is Identifier) {
+        receiver = null;
+        selector = makeIdentifier(left.name);
+        arguments = singleton(makeExpression(exp.right));
+        element = left.element;
+      } else if (left is FieldExpression) {
+        receiver = makeExp(left.object, PRIMARY, beginStmt: beginStmt);
+        selector = makeIdentifier(left.fieldName);
+        arguments = singleton(makeExpression(exp.right));
+      } else if (left is IndexExpression) {
+        receiver = makeExp(left.object, PRIMARY, beginStmt: beginStmt);
+        selector = new tree.Operator(indexToken);
+        arguments = bracketList(',', 
+            [makeExpression(left.index), makeExpression(exp.right)]);
+      } else {
+        throw "Unexpected left-hand side of assignment: ${left.runtimeType}";
+      }
+      tree.Operator op = new tree.Operator(assignmentToken(exp.operatorName));
+      result = new tree.SendSet(receiver, selector, op, arguments);
+      setElement(result, element);
+      precedence = EXPRESSION;
+    } else if (exp is BinaryOperator) {
+      precedence = BINARY_PRECEDENCE[exp.operatorName];
+      int deltaLeft = isAssociativeBinaryOperator(precedence) ? 0 : 1;
+      result = new tree.Send(
+          makeExp(exp.left, precedence + deltaLeft, beginStmt: beginStmt),
+          new tree.Operator(binopToken(exp.operatorName)),
+          singleton(makeExp(exp.right, precedence + 1)));
+    } else if (exp is CallFunction) {
+      precedence = CALLEE;
+      tree.Node selector;
+      Expression callee = exp.callee;
+      if (callee is Identifier) {
+        selector = makeIdentifier(callee.name);
+      } else {
+        selector = makeExp(callee, CALLEE, beginStmt: beginStmt); 
+      }
+      result = new tree.Send(
+          null, 
+          selector, 
+          argList(exp.arguments.map(makeArgument)));
+    } else if (exp is CallMethod) {
+      precedence = CALLEE;
+      result = new tree.Send(
+          makeExp(exp.object, PRIMARY, beginStmt: beginStmt),
+          makeIdentifier(exp.methodName),
+          argList(exp.arguments.map(makeArgument)));
+    } else if (exp is CallNew) {
+      precedence = CALLEE;
+      tree.Node selector = makeName(exp.type.name);
+      if (exp.type.typeArguments.length > 0) {
+        selector = new tree.TypeAnnotation(
+            selector,
+            typeArgList(exp.type.typeArguments.map(makeType)));
+      }
+      if (exp.constructorName != null) {
+        selector = new tree.Send(
+            selector,
+            makeIdentifier(exp.constructorName));
+      }
+      result = new tree.NewExpression(
+          exp.isConst ? constToken : newToken,
+          new tree.Send(
+            null,
+            selector,
+            argList(exp.arguments.map(makeArgument))));
+    } else if (exp is CallStatic) {
+      precedence = CALLEE;
+      result = new tree.Send(
+          makeName(exp.className),
+          makeIdentifier(exp.methodName),
+          argList(exp.arguments.map(makeArgument)));
+      setElement(result, exp.element);
+    } else if (exp is Conditional) {
+      precedence = CONDITIONAL;
+      result = new tree.Conditional(
+          makeExp(exp.condition, LOGICAL_OR, beginStmt: beginStmt),
+          makeExp(exp.thenExpression, EXPRESSION),
+          makeExp(exp.elseExpression, EXPRESSION),
+          question, 
+          colon);
+    } else if (exp is FieldExpression) {
+      precedence = PRIMARY;
+      result = new tree.Send(
+          makeExp(exp.object, PRIMARY, beginStmt: beginStmt),
+          makeIdentifier(exp.fieldName));
+    } else if (exp is FunctionExpression) {
+      precedence = PRIMARY;
+      if (beginStmt && exp.name != null) {
+        needParen = true; // Do not mistake for function declaration.
+      }
+      result = new tree.FunctionExpression(
+          exp.name != null ? makeIdentifier(exp.name) : null,
+          makeParameters(exp.parameters),
+          makeBlock(exp.body),
+          exp.returnType != null ? makeType(exp.returnType) : null,
+          makeEmptyModifiers(), // TODO(asgerf): Function modifiers?
+          null,  // initializers
+          null); // get/set
+      setElement(result, exp.element);
+    } else if (exp is Identifier) {
+      precedence = CALLEE;
+      result = new tree.Send(null, makeIdentifier(exp.name));
+      setElement(result, exp.element);
+    } else if (exp is Increment) {
+      Expression lvalue = exp.expression;
+      tree.Node receiver;
+      tree.Node selector;
+      tree.Node argument;
+      bool innerBeginStmt = beginStmt && !exp.isPrefix;
+      if (lvalue is Identifier) {
+        selector = makeIdentifier(lvalue.name);
+      } else if (lvalue is FieldExpression) {
+        receiver = makeExp(lvalue.object, PRIMARY, beginStmt: innerBeginStmt);
+        selector = makeIdentifier(lvalue.fieldName);
+      } else if (lvalue is IndexExpression) {
+        receiver = makeExp(lvalue.object, PRIMARY, beginStmt: innerBeginStmt);
+        selector = new tree.Operator(indexToken);
+        argument = makeExpression(lvalue.index);
+      } else {
+        throw "Unrecognized left-hand side: ${lvalue.runtimeType}";
+      }
+      tree.Operator op = new tree.Operator(incrementToken(exp.operatorName));
+      if (exp.isPrefix) {
+        precedence = UNARY;
+        result = new tree.SendSet.prefix(receiver, selector, op, argument);
+      } else {
+        precedence = POSTFIX_INCREMENT;
+        result = new tree.SendSet.postfix(receiver, selector, op, argument);
+      }
+    } else if (exp is IndexExpression) {
+      precedence = CALLEE;
+      result = new tree.Send(
+          makeExp(exp.object, PRIMARY, beginStmt: beginStmt),
+          new tree.Operator(indexToken),
+          bracketList(',', [makeExpression(exp.index)]));
+    } else if (exp is Literal) {
+      precedence = CALLEE;
+      dart2js.PrimitiveConstant value = exp.value;
+      Token tok = new StringToken.fromString(STRING_INFO, '${value.value}', -1);
+      if (value is dart2js.StringConstant) {
+        result = new tree.LiteralString(tok, value.value);
+      } else if (value is dart2js.IntConstant) {
+        result = new tree.LiteralInt(tok, null);
+      } else if (value is dart2js.DoubleConstant) {
+        result = new tree.LiteralDouble(tok, null);
+      } else if (value is dart2js.BoolConstant) {
+        result = new tree.LiteralBool(tok, null);
+      } else if (value is dart2js.NullConstant) {
+        result = new tree.LiteralNull(tok);
+      } else {
+        throw "Unrecognized constant: ${value.runtimeType}";
+      }
+    } else if (exp is LiteralList) {
+      precedence = PRIMARY;
+      tree.NodeList typeArgs = null;
+      if (exp.typeArgument != null) {
+        typeArgs = typeArgList([makeType(exp.typeArgument)]);
+      }
+      result = new tree.LiteralList(
+          typeArgs,
+          bracketList(',', exp.values.map(makeExpression)), 
+          exp.isConst ? constToken : null);
+    } else if (exp is LiteralMap) {
+      precedence = PRIMARY;
+      if (beginStmt) {
+        // The opening brace can be confused with a block statement.
+        needParen = true;
+      }
+      tree.NodeList typeArgs = null;
+      if (exp.typeArguments != null && exp.typeArguments.length > 0) {
+        typeArgs = typeArgList(exp.typeArguments.map(makeType));
+      }
+      result = new tree.LiteralMap(
+          typeArgs,
+          braceList(',', exp.entries.map(makeLiteralMapEntry)),
+          exp.isConst ? constToken : null);
+    } else if (exp is LiteralSymbol) {
+      precedence = PRIMARY;
+      result = new tree.LiteralSymbol(
+          hash, 
+          makeList('.', exp.id.split('.').map(makeIdentifier)));
+    } else if (exp is StringConcat) {
+      precedence = PRIMARY;
+      if (exp.expressions.length == 0) {
+        result = new tree.LiteralString(
+            new StringToken.fromString(STRING_INFO, '""', -1), 
+            new tree.DartString.empty());
+      } else {
+        StringLiteralOutput output = Unparser.analyzeStringLiteral(exp);
+        List parts = output.parts;
+        tree.Node printStringChunk(StringChunk chunk) {
+          bool raw = chunk.quoting.raw;
+          int quoteCode = chunk.quoting.quote;
+          
+          List<tree.StringInterpolationPart> literalParts = [];
+          tree.LiteralString firstLiteral;
+          tree.Node currentInterpolation;
+          
+          // sb contains the current unfinished LiteralString
+          StringBuffer sb = new StringBuffer();
+          if (raw) {
+            sb.write('r');
+          }
+          for (int i = 0; i < chunk.quoting.leftQuoteCharCount; i++) {
+            sb.write(chunk.quoting.quoteChar);
+          }
+
+          // Print every character and string interpolation
+          int startIndex = chunk.previous != null ? chunk.previous.endIndex : 0;
+          for (int i = startIndex; i < chunk.endIndex; i++) {
+            var part = parts[i];
+            if (part is Expression) {
+              // Finish the previous string interpolation, if there is one.
+              tree.LiteralString lit = makeVerbatimStringLiteral(sb.toString());
+              if (currentInterpolation != null) {
+                literalParts.add(new tree.StringInterpolationPart(
+                    currentInterpolation, 
+                    lit));
+              } else {
+                firstLiteral = lit;
+              }
+              sb.clear();
+              currentInterpolation = makeExpression(part);
+            } else {
+              int char = part;
+              switch (char) {
+                case characters.$$:
+                  if (raw)
+                    sb.write(r'$');
+                  else
+                    sb.write(r'\$');
+                  break;
+                case characters.$BACKSLASH:
+                  if (raw)
+                    sb.write(r'\');
+                  else
+                    sb.write(r'\\');
+                  break;
+                case characters.$DQ:
+                  if (quoteCode == char) {
+                    sb.write(r'\"');
+                  } else {
+                    sb.write(r'"');
+                  }
+                  break;
+                case characters.$SQ:
+                  if (quoteCode == char) {
+                    sb.write(r"\'");
+                  } else {
+                    sb.write(r"'");
+                  }
+                  break;
+                case NEWLINE:
+                  sb.write(r'\n');
+                  break;
+                case CARRIAGE_RETURN:
+                  sb.write(r'\r');
+                  break;
+                default:
+                  sb.write(new String.fromCharCode(char));
+              }
+            }
+          }
+          
+          // Print ending quotes
+          for (int i = 0; i < chunk.quoting.rightQuoteLength; i++) {
+            sb.write(chunk.quoting.quoteChar);
+          }
+          
+          // Finish the previous string interpolation, if there is one.
+          // Then wrap everything in a StringInterpolation, if relevant.
+          tree.LiteralString lit = makeVerbatimStringLiteral(sb.toString());
+          tree.Node node;
+          if (firstLiteral == null) {
+            node = lit;
+          } else {
+            literalParts.add(new tree.StringInterpolationPart(
+                currentInterpolation,
+                lit));
+            node = new tree.StringInterpolation(
+                firstLiteral, 
+                makeList('', literalParts));
+          }
+          
+          // Juxtapose with the previous string chunks, if any.
+          if (chunk.previous != null) {
+            return new tree.StringJuxtaposition(
+                printStringChunk(chunk.previous),
+                node);
+          } else {
+            return node;
+          }
+        }
+        result = printStringChunk(output.chunk);
+      }
+    } else if (exp is This) {
+      precedence = CALLEE;
+      result = makeIdentifier('this');
+    } else if (exp is Throw) {
+      precedence = EXPRESSION; // ???
+      result = new tree.Throw(
+          makeExpression(exp.expression), 
+          throwToken, 
+          throwToken); // endToken not used by unparser
+    } else if (exp is TypeOperator) {
+      precedence = RELATIONAL;
+      tree.Operator operator;
+      tree.Node rightOperand = makeType(exp.type);
+      if (exp.operatorName == 'is!') {
+        operator = new tree.Operator(typeOpToken('is'));
+        rightOperand = new tree.Send(
+            rightOperand, 
+            new tree.Operator(bang), 
+            blankList());
+      } else {
+        operator = new tree.Operator(typeOpToken(exp.operatorName));
+      }
+      result = new tree.Send(
+          makeExp(exp.expression, BITWISE_OR, beginStmt: beginStmt),
+          operator,
+          singleton(rightOperand));
+    } else if (exp is UnaryOperator) {
+      precedence = UNARY;
+      result = new tree.Send.prefix(
+          makeExp(exp.operand, UNARY),
+          new tree.Operator(unopToken(exp.operatorName)));
+    } else {
+      throw "Unknown expression type: ${exp.runtimeType}";
+    }
+    
+    needParen = needParen || precedence < minPrecedence;
+    if (needParen) {
+      result = parenthesize(result);
+    }
+    return result;
+  }
+  
+  /// Creates a LiteralString with [verbatim] as the value. 
+  /// No (un)quoting or (un)escaping will be performed by this method. 
+  /// The [DartString] inside the literal will be set to null because the
+  /// code emitter does not use it. 
+  tree.LiteralString makeVerbatimStringLiteral(String verbatim) {
+    Token tok = new StringToken.fromString(STRING_INFO, verbatim, -1);
+    return new tree.LiteralString(tok, null);
+  }
+  
+  tree.LiteralMapEntry makeLiteralMapEntry(LiteralMapEntry en) {
+    return new tree.LiteralMapEntry(
+        makeExpression(en.key), 
+        colon, 
+        makeExpression(en.value));
+  }
+  
+  /// Produces a statement in a context where only blocks are allowed.
+  tree.Node makeBlock(Statement stmt) {
+    if (stmt is Block)
+      return makeStatement(stmt);
+    else {
+      return new tree.Block(singleton(makeStatement(stmt)));
+    }
+  }
+  
+  tree.Node makeStatement(Statement stmt, {bool shortIf: true}) {
+    if (stmt is Block) {
+      return new tree.Block(braceList('', stmt.statements.map(makeStatement)));
+    } else if (stmt is Break) {
+      return new tree.BreakStatement(
+          stmt.label == null ? null : makeIdentifier(stmt.label), 
+          breakToken, 
+          semicolon);
+    } else if (stmt is Continue) {
+      return new tree.ContinueStatement(
+          stmt.label == null ? null : makeIdentifier(stmt.label), 
+          continueToken, 
+          semicolon);
+    } else if (stmt is DoWhile) {
+      return new tree.DoWhile(
+          makeStatement(stmt.body, shortIf: shortIf), 
+          parenthesize(makeExpression(stmt.condition)), 
+          doToken, 
+          whileToken, 
+          semicolon);
+    } else if (stmt is EmptyStatement) {
+      return new tree.EmptyStatement(semicolon);
+    } else if (stmt is ExpressionStatement) {
+      return new tree.ExpressionStatement(
+          makeExp(stmt.expression, EXPRESSION, beginStmt: true), 
+          semicolon);
+    } else if (stmt is For) {
+      tree.Node initializer;
+      if (stmt.initializer is VariableDeclarations) {
+        initializer = makeVariableDeclarations(stmt.initializer);
+      } else if (stmt.initializer is Expression) {
+        initializer = makeExpression(stmt.initializer);
+      } else {
+        initializer = null;
+      }
+      tree.Node condition;
+      if (stmt.condition != null) {
+        condition = new tree.ExpressionStatement(
+            makeExpression(stmt.condition), 
+            semicolon);
+      } else {
+        condition = new tree.EmptyStatement(semicolon);
+      }
+      return new tree.For(
+          initializer, 
+          condition, 
+          makeList(',', stmt.updates.map(makeExpression)), 
+          makeStatement(stmt.body, shortIf: shortIf), 
+          forToken);
+    } else if (stmt is ForIn) {
+      tree.Node left;
+      if (stmt.leftHandValue is Identifier) {
+        left = makeExpression(stmt.leftHandValue);
+      } else {
+        left = makeVariableDeclarations(stmt.leftHandValue);
+      }
+      return new tree.ForIn(
+          left,
+          makeExpression(stmt.expression),
+          makeStatement(stmt.body, shortIf: shortIf), 
+          forToken, 
+          inToken);
+    } else if (stmt is FunctionDeclaration) {
+      return new tree.FunctionDeclaration(new tree.FunctionExpression(
+          stmt.name != null ? makeIdentifier(stmt.name) : null,
+          makeParameters(stmt.parameters),
+          makeBlock(stmt.body),
+          stmt.returnType != null ? makeType(stmt.returnType) : null,
+          makeEmptyModifiers(), // TODO(asgerf): Function modifiers?
+          null,  // initializers
+          null)); // get/set
+    } else if (stmt is If) {
+      if (stmt.elseStatement == null) {
+        tree.Node node = new tree.If(
+            parenthesize(makeExpression(stmt.condition)), 
+            makeStatement(stmt.thenStatement),
+            null, // else statement
+            ifToken,
+            null); // else token
+        if (shortIf)
+          return node;
+        else
+          return new tree.Block(braceList('', [node]));
+      } else {
+        return new tree.If(
+            parenthesize(makeExpression(stmt.condition)), 
+            makeStatement(stmt.thenStatement, shortIf: false),
+            makeStatement(stmt.elseStatement, shortIf: shortIf),
+            ifToken,
+            elseToken); // else token
+      }
+    } else if (stmt is LabeledStatement) {
+      List<tree.Label> labels = [];
+      Statement inner = stmt;
+      while (inner is LabeledStatement) {
+        LabeledStatement lbl = inner as LabeledStatement;
+        labels.add(new tree.Label(makeIdentifier(lbl.label), colon));
+        inner = lbl.statement;
+      }
+      return new tree.LabeledStatement(
+          makeList('', labels), 
+          makeStatement(inner, shortIf: shortIf));
+    } else if (stmt is Rethrow) {
+      return new tree.Rethrow(rethrowToken, semicolon);
+    } else if (stmt is Return) {
+      return new tree.Return(
+          returnToken, 
+          semicolon, 
+          stmt.expression == null ? null : makeExpression(stmt.expression));
+    } else if (stmt is Switch) {
+      return new tree.SwitchStatement(
+          parenthesize(makeExpression(stmt.expression)), 
+          braceList('', stmt.cases.map(makeSwitchCase)), 
+          switchToken);
+    } else if (stmt is Try) {
+      return new tree.TryStatement(
+          makeBlock(stmt.tryBlock), 
+          braceList('', stmt.catchBlocks.map(makeCatchBlock)), 
+          stmt.finallyBlock == null ? null : makeBlock(stmt.finallyBlock), 
+          tryToken, 
+          finallyToken);
+    } else if (stmt is VariableDeclarations) {
+      return makeVariableDeclarations(stmt, useVar: true, endToken: semicolon);
+    } else if (stmt is While) {
+      return new tree.While(
+          parenthesize(makeExpression(stmt.condition)), 
+          makeStatement(stmt.body, shortIf: shortIf), 
+          whileToken);
+    } else {
+      throw "Unrecognized statement: ${stmt.runtimeType}";
+    }
+  }
+  
+  tree.Node makeVariableDeclaration(VariableDeclaration vd) {
+    if (vd.initializer == null)
+      return makeIdentifier(vd.name);
+    else {
+      return new tree.SendSet(
+          null,
+          makeIdentifier(vd.name),
+          new tree.Operator(eq),
+          singleton(makeExpression(vd.initializer)));
+    }
+  }
+  
+  /// If [useVar] is true, the variable definition will use `var` as modifier 
+  /// if no other modifiers are present.
+  /// [endToken] will be used to terminate the declaration list.
+  tree.Node makeVariableDeclarations(VariableDeclarations decl, 
+                                      { bool useVar: false,
+                                        Token endToken: null }) {
+    return new tree.VariableDefinitions(
+        decl.type == null ? null : makeType(decl.type), 
+        makeVarModifiers(isConst: decl.isConst, 
+                          isFinal: decl.isFinal,
+                          useVar: useVar && decl.type == null), 
+        makeList(',', 
+            decl.declarations.map(makeVariableDeclaration),
+            close: endToken));
+  }
+  
+  tree.CatchBlock makeCatchBlock(CatchBlock block) {
+    List<tree.VariableDefinitions> formals = [];
+    if (block.exceptionVar != null) {
+      formals.add(new tree.VariableDefinitions(
+          null, 
+          makeEmptyModifiers(), 
+          singleton(makeIdentifier(block.exceptionVar))));
+    }
+    if (block.stackVar != null) {
+      formals.add(new tree.VariableDefinitions(
+          null, 
+          makeEmptyModifiers(), 
+          singleton(makeIdentifier(block.stackVar))));
+    }
+    return new tree.CatchBlock(
+        block.onType == null ? null : makeType(block.onType), 
+        block.exceptionVar == null ? null : argList(formals), 
+        makeBlock(block.body), 
+        block.onType == null ? null : onToken, 
+        block.exceptionVar == null ? null : catchToken);
+  }
+  
+  tree.SwitchCase makeSwitchCase(SwitchCase caze) {
+    if (caze.isDefaultCase) {
+      return new tree.SwitchCase(
+          blankList(), 
+          defaultToken, 
+          makeList('', caze.statements.map(makeStatement)),
+          null); // startToken unused by unparser
+    } else {
+      return new tree.SwitchCase(
+          makeList('', caze.expressions.map(makeCaseMatch)),
+          null, // defaultKeyword,
+          makeList('', caze.statements.map(makeStatement)),
+          null); // startToken unused by unparser
+    }
+  }
+  
+  tree.CaseMatch makeCaseMatch(Expression exp) {
+    return new tree.CaseMatch(caseToken, makeExpression(exp), colon);
+  }
+  
+  tree.TypeAnnotation makeType(TypeAnnotation type) {
+    tree.NodeList typeArgs;
+    if (type.typeArguments.length > 0) {
+      typeArgs = typeArgList(type.typeArguments.map(makeType));
+    } else {
+      typeArgs = null;
+    }
+    tree.TypeAnnotation result = 
+        new tree.TypeAnnotation(makeIdentifier(type.name), typeArgs);
+    setType(result, type.dartType);
+    return result;
+  }
+  
+  tree.NodeList makeParameters(Parameters params) {
+    List<tree.Node> nodes = 
+        params.requiredParameters.map(makeParameter).toList();
+    if (params.hasOptionalParameters) {
+      Token assign = params.hasNamedParameters ? colon : eq;
+      Token open = params.hasNamedParameters ? openBrace : openBracket;
+      Token close = params.hasNamedParameters ? closeBrace : closeBracket;
+      List opt = params.optionalParameters.map((p) => makeParameter(p,assign));
+      nodes.add(new tree.NodeList(open, makeLink(opt), close, ','));
+    }
+    return argList(nodes);
+  }
+  
+  /// [assignOperator] is used for writing the default value.
+  tree.Node makeParameter(Parameter param, [Token assignOperator]) {
+    if (param.isFunction) {
+      tree.Node definition = new tree.FunctionExpression(
+          makeIdentifier(param.name), 
+          makeParameters(param.parameters), 
+          null, // body 
+          param.type == null ? null : makeType(param.type), 
+          makeEmptyModifiers(), // TODO: Function parameter modifiers? 
+          null, // initializers 
+          null); // get/set
+      if (param.defaultValue != null) {
+        return new tree.SendSet(
+            null,
+            definition,
+            new tree.Operator(assignOperator),
+            singleton(makeExpression(param.defaultValue)));
+      } else {
+        return definition;
+      }
+    } else {
+      tree.Node definition;
+      if (param.defaultValue != null) {
+        definition = new tree.SendSet(
+            null, 
+            makeIdentifier(param.name), 
+            new tree.Operator(assignOperator), 
+            singleton(makeExpression(param.defaultValue)));
+      } else {
+        definition = makeIdentifier(param.name);
+      }
+      setElement(definition, param.element);
+      return new tree.VariableDefinitions(
+          param.type == null ? null : makeType(param.type), 
+          makeEmptyModifiers(), // TODO: Parameter modifiers? 
+          singleton(definition));
+    }
+  }
+  
+  tree.Modifiers makeEmptyModifiers() {
+    return new tree.Modifiers(blankList());
+  }
+  
+  tree.Modifiers makeVarModifiers({bool isConst: false,
+                               bool isFinal: false,
+                               bool useVar: false}) {
+    List<tree.Node> nodes = [];
+    if (isConst) {
+      nodes.add(makeIdentifier('const'));
+    }
+    if (isFinal) {
+      nodes.add(makeIdentifier('final'));
+    }
+    if (useVar && nodes.isEmpty) {
+      nodes.add(makeIdentifier('var'));
+    }
+    return new tree.Modifiers(makeList('', nodes));
+  }
+  
+  tree.Node parenthesize(tree.Node node) {
+    return new tree.ParenthesizedExpression(node, openParen);
+  }
+  
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index aa5b07d..2aade10 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -320,6 +320,7 @@
   }
 
   void makeElementPlaceholder(Node node, Element element) {
+    assert(node != null);
     assert(element != null);
     if (identical(element, entryFunction)) return;
     if (identical(element.getLibrary(), coreLibrary)) return;
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
index 1730851..cfbf6fa 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
@@ -4,7 +4,7 @@
 import '../tracer.dart';
 import 'dart_tree.dart';
 
-class TreeTracer extends TracerUtil implements Visitor {
+class TreeTracer extends TracerUtil with Visitor {
   final EventSink<String> output;
 
   TreeTracer(this.output);
@@ -12,8 +12,6 @@
   Names names;
   int statementCounter;
 
-  void visit(Node node) => node.accept(this);
-
   void traceGraph(String name, FunctionDefinition function) {
     names = new Names();
     statementCounter = 0;
@@ -24,7 +22,7 @@
     names = null;
   }
 
-  void printBlock(Expression e) {
+  void printBlock(Statement e) {
     tag("block", () {
       printProperty("name", "B0"); // Update when proper blocks exist
       printProperty("from_bci", -1);
@@ -54,6 +52,8 @@
     addIndent();
     add("$bci $uses $name $contents <|@\n");
   }
+  
+  
 
   visitFunctionDefinition(FunctionDefinition node) {
   }
@@ -62,10 +62,9 @@
     printStatement(null, "dead-use ${names.varName(node)}");
   }
 
-  visitSequence(Sequence node) {
-    for (Expression e in node.expressions) {
-      e.accept(this);
-    }
+  visitExpressionStatement(ExpressionStatement node) {
+    node.expression.accept(this);
+    node.next.accept(this);
   }
 
   visitLetVal(LetVal node) {
@@ -95,20 +94,15 @@
   }
 }
 
-class ExpressionVisitor extends Visitor<String> {
+class ExpressionVisitor extends Visitor<String, String> {
   Names names;
 
   ExpressionVisitor(this.names);
-
+  
   String visitVariable(Variable node) {
     return names.varName(node);
   }
 
-  String visitSequence(Sequence node) {
-    String exps = node.expressions.map((e) => e.accept(this)).join('; ');
-    return "{ $exps }";
-  }
-
   String visitLetVal(LetVal node) {
     String name = names.varName(node.variable);
     String def = node.definition.accept(this);
@@ -129,6 +123,15 @@
   String visitConstant(Constant node) {
     return "${node.value}";
   }
+  
+  String visitExpressionStatement(ExpressionStatement node) {
+    // Note: There should not be statements in the context of expressions.
+    // However, generating a trace that shows where something went wrong is more
+    // useful than raising an exception.
+    String expr = node.expression.accept(this);
+    String body = node.next.accept(this);
+    return "{$expr; $body}";
+  }
 }
 
 /**
@@ -146,8 +149,9 @@
   String varName(Variable v) {
     String name = _names[v];
     if (name == null) {
-      if (v.identifier != null) {
-        name = v.identifier.token.value;
+      name = v.name;
+      if (v.cachedName != null) {
+        name = v.cachedName;
       }
       while (name == null || _usedNames.contains(name)) {
         name = "v${_counter++}";
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index a203ec5..2fd142a 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -247,19 +247,56 @@
 
   FunctionElement asFunctionElement();
 
+  /// Is [:true:] if this element has a corresponding patch.
+  ///
+  /// If [:true:] this element has a non-null [patch] field.
+  ///
+  /// See [:patch_parser.dart:] for a description of the terminology.
   bool get isPatched;
+
+  /// Is [:true:] if this element is a patch.
+  ///
+  /// If [:true:] this element has a non-null [origin] field.
+  ///
+  /// See [:patch_parser.dart:] for a description of the terminology.
   bool get isPatch;
+
+  /// Is [:true:] if this element defines the implementation for the entity of
+  /// this element.
+  ///
+  /// See [:patch_parser.dart:] for a description of the terminology.
   bool get isImplementation;
+
+  /// Is [:true:] if this element introduces the entity of this element.
+  ///
+  /// See [:patch_parser.dart:] for a description of the terminology.
   bool get isDeclaration;
+
+  /// Returns the element which defines the implementation for the entity of
+  /// this element.
+  ///
+  /// See [:patch_parser.dart:] for a description of the terminology.
+  Element get implementation;
+
+  /// Returns the element which introduces the entity of this element.
+  ///
+  /// See [:patch_parser.dart:] for a description of the terminology.
+  Element get declaration;
+
+  /// Returns the patch for this element if this element is patched.
+  ///
+  /// See [:patch_parser.dart:] for a description of the terminology.
+  Element get patch;
+
+  /// Returns the origin for this element if this element is a patch.
+  ///
+  /// See [:patch_parser.dart:] for a description of the terminology.
+  Element get origin;
+
   bool get isSynthesized;
   bool get isForwardingConstructor;
   bool get isMixinApplication;
 
-  Element get implementation;
-  Element get declaration;
-  Element get patch;
-  Element get origin;
-
   bool hasFixedBackendName();
   String fixedBackendName();
 
@@ -842,8 +879,6 @@
   InterfaceType computeTargetType(InterfaceType newType);
 
   // TODO(kasperl): These are bit fishy. Do we really need them?
-  void set patch(FunctionElement value);
-  void set origin(FunctionElement value);
   void set defaultImplementation(FunctionElement value);
 
   /// Do not use [computeSignature] outside of the resolver; instead retrieve
@@ -915,8 +950,6 @@
   // TODO(kasperl): These are bit fishy. Do we really need them?
   void set supertype(DartType value);
   void set interfaces(Link<DartType> value);
-  void set patch(ClassElement value);
-  void set origin(ClassElement value);
   void set supertypeLoadState(int value);
   void set resolutionState(int value);
   void set nativeTagInfo(String value);
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 4a5ffb7..7fb55a0 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -5,6 +5,7 @@
 library elements.modelx;
 
 import 'elements.dart';
+import '../helpers/helpers.dart';
 import '../tree/tree.dart';
 import '../util/util.dart';
 import '../resolution/resolution.dart';
@@ -110,59 +111,17 @@
   /** See [WarnOnUseElement] for documentation. */
   bool isWarnOnUse() => false;
 
-  /**
-   * Is [:true:] if this element has a corresponding patch.
-   *
-   * If [:true:] this element has a non-null [patch] field.
-   *
-   * See [:patch_parser.dart:] for a description of the terminology.
-   */
   bool get isPatched => false;
 
-  /**
-   * Is [:true:] if this element is a patch.
-   *
-   * If [:true:] this element has a non-null [origin] field.
-   *
-   * See [:patch_parser.dart:] for a description of the terminology.
-   */
   bool get isPatch => false;
 
-  /**
-   * Is [:true:] if this element defines the implementation for the entity of
-   * this element.
-   *
-   * See [:patch_parser.dart:] for a description of the terminology.
-   */
-  bool get isImplementation => !isPatched;
+  bool get isImplementation => true;
 
-  /**
-   * Is [:true:] if this element introduces the entity of this element.
-   *
-   * See [:patch_parser.dart:] for a description of the terminology.
-   */
-  bool get isDeclaration => !isPatch;
+  bool get isDeclaration => true;
 
-  bool get isSynthesized => false;
+  Element get implementation => this;
 
-  bool get isForwardingConstructor => false;
-
-  bool get isMixinApplication => false;
-
-  /**
-   * Returns the element which defines the implementation for the entity of this
-   * element.
-   *
-   * See [:patch_parser.dart:] for a description of the terminology.
-   */
-  Element get implementation => isPatched ? patch : this;
-
-  /**
-   * Returns the element which introduces the entity of this element.
-   *
-   * See [:patch_parser.dart:] for a description of the terminology.
-   */
-  Element get declaration => isPatch ? origin : this;
+  Element get declaration => this;
 
   Element get patch {
     throw new UnsupportedError('patch is not supported on $this');
@@ -172,6 +131,12 @@
     throw new UnsupportedError('origin is not supported on $this');
   }
 
+  bool get isSynthesized => false;
+
+  bool get isForwardingConstructor => false;
+
+  bool get isMixinApplication => false;
+
   // TODO(johnniwinther): This breaks for libraries (for which enclosing
   // elements are null) and is invalid for top level variable declarations for
   // which the enclosing element is a VariableDeclarations and not a compilation
@@ -350,15 +315,9 @@
 
   bool get isRedirectingFactory => unsupported();
 
-  setPatch(patch) => unsupported();
   computeSignature(compiler) => unsupported();
-  requiredParameterCount(compiler) => unsupported();
-  optionalParameterCount(compiler) => unsupported();
-  parameterCount(compiler) => unsupported();
 
   // TODO(kasperl): These seem unnecessary.
-  set patch(value) => unsupported();
-  set origin(value) => unsupported();
   set defaultImplementation(value) => unsupported();
 
   get redirectionTarget => this;
@@ -769,7 +728,8 @@
   Element operator [](String name) => importScope[name];
 }
 
-class LibraryElementX extends ElementX with AnalyzableElement
+class LibraryElementX
+    extends ElementX with AnalyzableElement, PatchMixin<LibraryElementX>
     implements LibraryElement {
   final Uri canonicalUri;
   CompilationUnitElement entryCompilationUnit;
@@ -782,20 +742,6 @@
   final ScopeX localScope = new ScopeX();
   final ImportScope importScope = new ImportScope();
 
-  /**
-   * If this library is patched, [patch] points to the patch library.
-   *
-   * See [:patch_parser.dart:] for a description of the terminology.
-   */
-  LibraryElementX patch = null;
-
-  /**
-   * If this is a patch library, [origin] points to the origin library.
-   *
-   * See [:patch_parser.dart:] for a description of the terminology.
-   */
-  final LibraryElementX origin;
-
   /// A mapping from an imported element to the "import" tag.
   final Importers importers = new Importers();
 
@@ -812,22 +758,17 @@
   final Map<LibraryDependency, LibraryElement> tagMapping =
       new Map<LibraryDependency, LibraryElement>();
 
-  LibraryElementX(Script script, [Uri canonicalUri, LibraryElement this.origin])
+  LibraryElementX(Script script,
+                  [Uri canonicalUri, LibraryElementX origin])
     : this.canonicalUri =
           ((canonicalUri == null) ? script.readableUri : canonicalUri),
       super(script.name, ElementKind.LIBRARY, null) {
     entryCompilationUnit = new CompilationUnitElementX(script, this);
-    if (isPatch) {
-      origin.patch = this;
+    if (origin != null) {
+      origin.applyPatch(this);
     }
   }
 
-  bool get isPatched => patch != null;
-  bool get isPatch => origin != null;
-
-  LibraryElement get declaration => super.declaration;
-  LibraryElement get implementation => super.implementation;
-
   Link<MetadataAnnotation> get metadata {
     return (libraryTag == null) ? super.metadata : libraryTag.metadata;
   }
@@ -858,7 +799,8 @@
    * Adds [element] to the import scope of this library.
    *
    * If an element by the same name is already in the imported scope, an
-   * [ErroneousElement] will be put in the imported scope, allowing for detection of ambiguous uses of imported names.
+   * [ErroneousElement] will be put in the imported scope, allowing for
+   * detection of ambiguous uses of imported names.
    */
   void addImport(Element element, Import import, DiagnosticListener listener) {
     importScope.addImport(this, element, import, listener);
@@ -1034,6 +976,10 @@
   }
 
   accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
+
+  // TODO(johnniwinther): Remove these when issue 18630 is fixed.
+  LibraryElementX get patch => super.patch;
+  LibraryElementX get origin => super.origin;
 }
 
 class PrefixElementX extends ElementX implements PrefixElement {
@@ -1284,7 +1230,8 @@
 /// patched with the corresponding parameter of the patch method. This is done
 /// to ensure that default values on parameters are computed once (on the
 /// origin parameter) but can be found through both the origin and the patch.
-class ParameterElementX extends ElementX implements ParameterElement {
+class ParameterElementX extends ElementX with PatchMixin<ParameterElement>
+    implements ParameterElement {
   final VariableDefinitions definitions;
   final Identifier identifier;
   final Expression initializer;
@@ -1334,12 +1281,6 @@
   FunctionType get functionType => type;
 
   accept(ElementVisitor visitor) => visitor.visitVariableElement(this);
-
-  ParameterElementX patch = null;
-  ParameterElementX origin = null;
-
-  bool get isPatch => origin != null;
-  bool get isPatched => patch != null;
 }
 
 class AbstractFieldElementX extends ElementX implements AbstractFieldElement {
@@ -1486,7 +1427,8 @@
   }
 }
 
-class FunctionElementX extends ElementX with AnalyzableElement
+class FunctionElementX
+    extends ElementX with AnalyzableElement, PatchMixin<FunctionElement>
     implements FunctionElement {
   FunctionExpression cachedNode;
   DartType typeCache;
@@ -1496,14 +1438,6 @@
 
   FunctionSignature functionSignatureCache;
 
-  /**
-   * A function declaration that should be parsed instead of the current one.
-   * The patch should be parsed as if it was in the current scope. Its
-   * signature must match this function's signature.
-   */
-  FunctionElement patch = null;
-  FunctionElement origin = null;
-
   final bool _hasNoBody;
 
   AbstractFieldElement abstractField;
@@ -1545,9 +1479,6 @@
     defaultImplementation = this;
   }
 
-  bool get isPatched => patch != null;
-  bool get isPatch => origin != null;
-
   bool get isRedirectingFactory => defaultImplementation != this;
 
   /// This field is set by the post process queue when checking for cycles.
@@ -1575,18 +1506,6 @@
     return redirectionTargetType.substByContext(newType);
   }
 
-  /**
-   * Applies a patch function to this function. The patch function's body
-   * is used as replacement when parsing this function's body.
-   * This method must not be called after the function has been parsed,
-   * and it must be called at most once.
-   */
-  void setPatch(FunctionElement patchElement) {
-    // Sanity checks. The caller must check these things before calling.
-    assert(patch == null);
-    this.patch = patchElement;
-  }
-
   bool isInstanceMember() {
     return isMember()
            && !isConstructor()
@@ -1911,6 +1830,7 @@
 abstract class BaseClassElementX extends ElementX
     with AnalyzableElement,
          TypeDeclarationElementX<InterfaceType>,
+         PatchMixin<ClassElement>,
          ClassMemberMixin
     implements ClassElement {
   final int id;
@@ -1943,10 +1863,6 @@
         super(name, ElementKind.CLASS, enclosing);
 
   int get hashCode => id;
-  ClassElement get patch => super.patch;
-  ClassElement get origin => super.origin;
-  ClassElement get declaration => super.declaration;
-  ClassElement get implementation => super.implementation;
 
   bool get hasBackendMembers => !backendMembers.isEmpty;
 
@@ -2297,13 +2213,13 @@
         lookupInterfaceMember(const PublicName(Compiler.CALL_OPERATOR_NAME));
     return member != null && member.isMethod ? member.type : null;
   }
+
+  // TODO(johnniwinther): Remove these when issue 18630 is fixed.
+  ClassElement get patch => super.patch;
+  ClassElement get origin => super.origin;
 }
 
 abstract class ClassElementX extends BaseClassElementX {
-  // Lazily applied patch of class members.
-  ClassElement patch = null;
-  ClassElement origin = null;
-
   Link<Element> localMembers = const Link<Element>();
   final ScopeX localScope = new ScopeX();
 
@@ -2313,8 +2229,6 @@
   ClassNode parseNode(Compiler compiler);
 
   bool get isMixinApplication => false;
-  bool get isPatched => patch != null;
-  bool get isPatch => origin != null;
   bool get hasLocalScopeMembers => !localScope.isEmpty;
 
   void addMember(Element element, DiagnosticListener listener) {
@@ -2393,16 +2307,9 @@
   bool get hasConstructor => !constructors.isEmpty;
   bool get hasLocalScopeMembers => !constructors.isEmpty;
 
-  unsupported(message) {
-    throw new UnsupportedError('$message is not supported on $this');
-  }
-
   get patch => null;
   get origin => null;
 
-  set patch(value) => unsupported('set patch');
-  set origin(value) => unsupported('set origin');
-
   Token position() => node.getBeginToken();
 
   Node parseNode(DiagnosticListener listener) => node;
@@ -2626,3 +2533,34 @@
   Token get endToken => metadata.getEndToken();
 }
 
+/// Mixin for the implementation of patched elements.
+///
+/// See [:patch_parser.dart:] for a description of the terminology.
+abstract class PatchMixin<E extends Element> implements Element {
+  // TODO(johnniwinther): Use type variables when issue 18630 is fixed.
+  Element/*E*/ patch = null;
+  Element/*E*/ origin = null;
+
+  bool get isPatch => origin != null;
+  bool get isPatched => patch != null;
+
+  bool get isImplementation => !isPatched;
+  bool get isDeclaration => !isPatch;
+
+  Element/*E*/ get implementation => isPatched ? patch : this;
+  Element/*E*/ get declaration => isPatch ? origin : this;
+
+  /// Applies a patch to this element. This method must be called at most once.
+  void applyPatch(PatchMixin<E> patch) {
+    assert(invariant(this, this.patch == null,
+                     message: "Element is patched twice."));
+    assert(invariant(this, this.origin == null,
+                     message: "Origin element is a patch."));
+    assert(invariant(patch, patch.origin == null,
+                     message: "Element is patched twice."));
+    assert(invariant(patch, patch.patch == null,
+                     message: "Patch element is patched."));
+    this.patch = patch;
+    patch.origin = this;
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 1aa3ead..171de10 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -150,10 +150,10 @@
  * to the [builder] and return the last added statement for trees that represent
  * an expression.
  */
-class IrBuilder extends ResolvedVisitor<ir.Definition> {
+class IrBuilder extends ResolvedVisitor<ir.Primitive> {
   final SourceFile sourceFile;
-  ir.Continuation returnContinuation = null;
-  List<ir.Parameter> parameters = <ir.Parameter>[];
+  final ir.Continuation returnContinuation;
+  final List<ir.Parameter> parameters;
 
   // The IR builder maintains a context, which is an expression with a hole in
   // it.  The hole represents the focus where new expressions can be added.
@@ -174,18 +174,56 @@
   // the expression's value, or else an expression without a hole if all
   // control-flow paths through the expression have exited.
   //
-  // We do not pass and return contexts, rather we use the current context
-  // (root, current) as the visitor state and mutate current.  Visiting a
-  // statement returns null; visiting an expression optionally returns the
-  // definition denoting its value.
+  // We do not pass contexts as arguments or return them.  Rather we use the
+  // current context (root, current) as the visitor state and mutate current.
+  // Visiting a statement returns null; visiting an expression returns the
+  // primitive denoting its value.
+
   ir.Expression root = null;
   ir.Expression current = null;
 
-  Map<Element, int> variableIndex = <Element, int>{};
-  List<ir.Definition> assignedVars = <ir.Definition>[];
+  // In SSA terms, join-point continuation parameters are the phis and the
+  // continuation invocation arguments are the corresponding phi inputs.  To
+  // support name introduction and renaming for source level variables, we use
+  // nested (delimited) visitors for constructing subparts of the IR that will
+  // need renaming.  Each source variable is assigned an index.
+  //
+  // Each nested visitor maintains a list of free variable uses in the body.
+  // These are implemented as a list of parameters, each with their own use
+  // list of references.  When the delimited subexpression is plugged into the
+  // surrounding context, the free occurrences can be captured or become free
+  // occurrences in the next outer delimited subexpression.
+  //
+  // Each nested visitor maintains a list that maps indexes of variables
+  // assigned in the delimited subexpression to their reaching definition ---
+  // that is, the definition in effect at the hole in 'current'.  These are
+  // used to determine if a join-point continuation needs to be passed
+  // arguments, and what the arguments are.
+  final Map<Element, int> variableIndex;
+  final List<ir.Parameter> freeVars;
+  final List<ir.Primitive> assignedVars;
 
+  /// Construct a top-level visitor.
   IrBuilder(TreeElements elements, Compiler compiler, this.sourceFile)
-      : super(elements, compiler);
+      : returnContinuation = new ir.Continuation.retrn(),
+        parameters = <ir.Parameter>[],
+        variableIndex = <Element, int>{},
+        freeVars = null,
+        assignedVars = <ir.Primitive>[],
+        super(elements, compiler);
+
+  /// Construct a delimited visitor.
+  IrBuilder.delimited(IrBuilder parent)
+      : sourceFile = parent.sourceFile,
+        returnContinuation = parent.returnContinuation,
+        parameters = parent.parameters,
+        variableIndex = parent.variableIndex,
+        freeVars = new List<ir.Parameter>.generate(
+            parent.assignedVars.length, (_) => new ir.Parameter(null),
+            growable: false),
+        assignedVars = new List<ir.Primitive>.generate(
+            parent.assignedVars.length, (_) => null),
+        super(parent.elements, parent.compiler);
 
   /**
    * Builds the [ir.FunctionDefinition] for a function element. In case the
@@ -203,7 +241,6 @@
     assert(!function.modifiers.isExternal());
     assert(elements[function] != null);
 
-    returnContinuation = new ir.Continuation.retrn();
     root = current = null;
 
     FunctionSignature signature = element.functionSignature;
@@ -229,9 +266,10 @@
   // the new hole must be in the newly added expression---which becomes the
   // new value of current.
   void add(ir.Expression expr) {
+    assert(isOpen);
     if (root == null) {
       root = current = expr;
-    } else if (current != null) {
+    } else {
       current = current.plug(expr);
     }
   }
@@ -245,16 +283,16 @@
     if (!isOpen) return;
     ir.Constant constant = new ir.Constant(constantSystem.createNull());
     add(new ir.LetPrim(constant));
-    add(new ir.InvokeContinuation(returnContinuation, constant));
+    add(new ir.InvokeContinuation(returnContinuation, [constant]));
     current = null;
   }
 
-  ir.Definition visit(ast.Node node) => node.accept(this);
+  ir.Primitive visit(ast.Node node) => node.accept(this);
 
   // ==== Statements ====
   // Build(Block(stamements), C) = C'
   //   where C' = statements.fold(Build, C)
-  ir.Definition visitBlock(ast.Block node) {
+  ir.Primitive visitBlock(ast.Block node) {
     assert(isOpen);
     for (ast.Node n in node.statements.nodes) {
       visit(n);
@@ -264,25 +302,128 @@
   }
 
   // Build(EmptyStatement, C) = C
-  ir.Definition visitEmptyStatement(ast.EmptyStatement node) {
+  ir.Primitive visitEmptyStatement(ast.EmptyStatement node) {
     assert(isOpen);
     return null;
   }
 
   // Build(ExpressionStatement(e), C) = C'
   //   where (C', _) = Build(e, C)
-  ir.Definition visitExpressionStatement(ast.ExpressionStatement node) {
+  ir.Primitive visitExpressionStatement(ast.ExpressionStatement node) {
     assert(isOpen);
     visit(node.expression);
     return null;
   }
 
-  ir.Definition visitIf(ast.If node) {
+  ir.Primitive visitIf(ast.If node) {
     assert(isOpen);
-    return giveup();
+    ir.Primitive condition = visit(node.condition);
+
+    // The then and else parts are delimited.
+    IrBuilder thenBuilder = new IrBuilder.delimited(this);
+    thenBuilder.visit(node.thenPart);
+    IrBuilder elseBuilder = new IrBuilder.delimited(this);
+    if (node.hasElsePart) elseBuilder.visit(node.elsePart);
+
+    // The free variables in the then and else parts are uses of definitions
+    // from an outer builder.  Capture them or propagate them outward.  The
+    // assigned variables in the then and else parts are arguments to the join
+    // point continuation if any.
+
+    // FreeVars is initially the length of assignedVars of the parent, and it
+    // does not grow.  AssignedVars can grow.
+    assert(assignedVars.length == thenBuilder.freeVars.length);
+    assert(assignedVars.length == elseBuilder.freeVars.length);
+    assert(assignedVars.length <= thenBuilder.assignedVars.length);
+    assert(assignedVars.length <= elseBuilder.assignedVars.length);
+    List<ir.Parameter> parameters = <ir.Parameter>[];
+    List<ir.Primitive> thenArguments = <ir.Primitive>[];
+    List<ir.Primitive> elseArguments = <ir.Primitive>[];
+    for (int i = 0; i < assignedVars.length; ++i) {
+      // These are the last assignments, if any, in the then and else
+      // continuations respectively (if they can reach the join point).  If a
+      // variable is assigned in either branch reaching the join point, it has
+      // different values that must be passed as an argument to the join point
+      // continuation.
+      ir.Definition thenAssignment =
+          thenBuilder.isOpen ? thenBuilder.assignedVars[i] : null;
+      ir.Definition elseAssignment =
+          elseBuilder.isOpen ? elseBuilder.assignedVars[i] : null;
+      if (thenAssignment != null || elseAssignment != null) {
+        // In the case that not both then and else parts can reach the join
+        // point, there will still be a join-point continuation possibly with
+        // arguments passed to it.  Such singly-used continuations should be
+        // eliminated by shrinking conversions (because they can arise
+        // otherwise as the result of optimization).
+        ir.Parameter parameter = new ir.Parameter(null);
+        parameters.add(parameter);
+        thenArguments.add(thenAssignment == null
+                              ? thenBuilder.freeVars[i]
+                              : thenAssignment);
+        elseArguments.add(elseAssignment == null
+                              ? elseBuilder.freeVars[i]
+                              : elseAssignment);
+      }
+    }
+
+    // Create a then and else continuations and a join continuation if
+    // necessary.  Jump to the join continuation from the exits of the then
+    // and else continuations.
+    ir.Continuation joinContinuation;
+    ir.Continuation thenContinuation = new ir.Continuation([]);
+    ir.Continuation elseContinuation = new ir.Continuation([]);
+    if (thenBuilder.isOpen || elseBuilder.isOpen) {
+      joinContinuation = new ir.Continuation(parameters);
+      if (thenBuilder.isOpen) {
+        thenBuilder.add(
+            new ir.InvokeContinuation(joinContinuation, thenArguments));
+      }
+      if (elseBuilder.isOpen) {
+        elseBuilder.add(
+            new ir.InvokeContinuation(joinContinuation, elseArguments));
+      }
+    }
+    thenContinuation.body = thenBuilder.root;
+    elseContinuation.body = elseBuilder.root;
+
+    // Capture free occurrences in the then and else bodies.  This is done
+    // after creating invocations of the join continuation so free join
+    // continuation arguments are properly captured.
+    //
+    // Also add join continuation parameters as assignments for the join body.
+    // This is done last because the assigned variables are updated in place.
+    int parameterIndex = 0;
+    for (int i = 0; i < assignedVars.length; ++i) {
+      // This is the definition that reaches the then and else continuations.
+      // All free uses in either continuation are uses of this definition.
+      ir.Definition reachingDefinition =
+          assignedVars[i] == null ? freeVars[i] : assignedVars[i];
+      reachingDefinition
+          ..substituteFor(thenBuilder.freeVars[i])
+          ..substituteFor(elseBuilder.freeVars[i]);
+
+      if ((thenBuilder.isOpen && thenBuilder.assignedVars[i] != null) ||
+          (elseBuilder.isOpen && elseBuilder.assignedVars[i] != null)) {
+        assignedVars[i] = parameters[parameterIndex++];
+      }
+    }
+
+    ir.Expression branch =
+        new ir.LetCont(thenContinuation,
+            new ir.LetCont(elseContinuation,
+                new ir.Branch(new ir.IsTrue(condition),
+                              thenContinuation,
+                              elseContinuation)));
+    if (joinContinuation == null) {
+      add(branch);
+      current = null;
+    } else {
+      add(new ir.LetCont(joinContinuation, branch));
+    }
+    return null;
   }
 
-  ir.Definition visitVariableDefinitions(ast.VariableDefinitions node) {
+  ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) {
     assert(isOpen);
     for (ast.Node definition in node.definitions.nodes) {
       Element element = elements[definition];
@@ -291,9 +432,7 @@
       if (definition is ast.SendSet) {
         assert(!definition.arguments.isEmpty);
         assert(definition.arguments.tail.isEmpty);
-        ir.Definition initialValue = visit(definition.arguments.head);
-        // Do not continue adding instructions if the initializer throws.
-        if (!isOpen) return null;
+        ir.Primitive initialValue = visit(definition.arguments.head);
         variableIndex[element] = assignedVars.length;
         assignedVars.add(initialValue);
       } else {
@@ -313,19 +452,18 @@
   //   where (C', x) = Build(e, C)
   //
   // Return without a subexpression is translated as if it were return null.
-  ir.Definition visitReturn(ast.Return node) {
+  ir.Primitive visitReturn(ast.Return node) {
     assert(isOpen);
     // TODO(lry): support native returns.
     if (node.beginToken.value == 'native') return giveup();
-    ir.Definition value;
+    ir.Primitive value;
     if (node.expression == null) {
       value = new ir.Constant(constantSystem.createNull());
       add(new ir.LetPrim(value));
     } else {
       value = visit(node.expression);
-      if (!isOpen) return null;
     }
-    add(new ir.InvokeContinuation(returnContinuation, value));
+    add(new ir.InvokeContinuation(returnContinuation, [value]));
     current = null;
     return null;
   }
@@ -333,7 +471,7 @@
   // ==== Expressions ====
   // For all simple literals:
   // Build(Literal(c), C) = C[let val x = Constant(c) in [], x]
-  ir.Definition visitLiteralBool(ast.LiteralBool node) {
+  ir.Primitive visitLiteralBool(ast.LiteralBool node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createBool(node.value));
@@ -341,7 +479,7 @@
     return constant;
   }
 
-  ir.Definition visitLiteralDouble(ast.LiteralDouble node) {
+  ir.Primitive visitLiteralDouble(ast.LiteralDouble node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createDouble(node.value));
@@ -349,7 +487,7 @@
     return constant;
   }
 
-  ir.Definition visitLiteralInt(ast.LiteralInt node) {
+  ir.Primitive visitLiteralInt(ast.LiteralInt node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createInt(node.value));
@@ -358,7 +496,7 @@
   }
 
 
-  ir.Definition visitLiteralNull(ast.LiteralNull node) {
+  ir.Primitive visitLiteralNull(ast.LiteralNull node) {
     assert(isOpen);
     ir.Constant constant = new ir.Constant(constantSystem.createNull());
     add(new ir.LetPrim(constant));
@@ -373,37 +511,45 @@
   //   LiteralMapEntry
   //   LiteralSymbol
 
-  ir.Definition visitParenthesizedExpression(
+  ir.Primitive visitParenthesizedExpression(
       ast.ParenthesizedExpression node) {
+    assert(isOpen);
     return visit(node.expression);
   }
 
   // ==== Sends ====
-  ir.Definition visitAssert(ast.Send node) {
+  ir.Primitive visitAssert(ast.Send node) {
+    assert(isOpen);
     return giveup();
   }
 
-  ir.Definition visitClosureSend(ast.Send node) {
+  ir.Primitive visitClosureSend(ast.Send node) {
+    assert(isOpen);
     return giveup();
   }
 
-  ir.Definition visitDynamicSend(ast.Send node) {
+  ir.Primitive visitDynamicSend(ast.Send node) {
+    assert(isOpen);
     return giveup();
   }
 
-  ir.Definition visitGetterSend(ast.Send node) {
+  ir.Primitive visitGetterSend(ast.Send node) {
+    assert(isOpen);
     Element element = elements[node];
     if (!Elements.isLocal(element)) return giveup();
-    return assignedVars[variableIndex[element]];
+    int index = variableIndex[element];
+    ir.Primitive value = assignedVars[index];
+    return value == null ? freeVars[index] : value;
   }
 
-  ir.Definition visitOperatorSend(ast.Send node) {
+  ir.Primitive visitOperatorSend(ast.Send node) {
+    assert(isOpen);
     return giveup();
   }
 
   // Build(StaticSend(f, arguments), C) = C[C'[InvokeStatic(f, xs)]]
   //   where (C', xs) = arguments.fold(Build, C)
-  ir.Definition visitStaticSend(ast.Send node) {
+  ir.Primitive visitStaticSend(ast.Send node) {
     assert(isOpen);
     Element element = elements[node];
     // TODO(lry): support static fields. (separate IR instruction?)
@@ -430,16 +576,12 @@
     List arguments = [];
     // TODO(lry): support default arguments, need support for locals.
     bool succeeded = selector.addArgumentsToList(
-        node.arguments, arguments, element.implementation,
-        // Guard against visiting arguments after an argument expression throws.
-        (node) => isOpen ? visit(node) : null,
-        (node) => giveup(),
-        compiler);
+        node.arguments, arguments, element.implementation, visit,
+        (node) => giveup(), compiler);
     if (!succeeded) {
       // TODO(lry): generate code to throw a [WrongArgumentCountError].
       return giveup();
     }
-    if (!isOpen) return null;
     ir.Parameter v = new ir.Parameter(null);
     ir.Continuation k = new ir.Continuation([v]);
     ir.Expression invoke =
@@ -448,29 +590,32 @@
     return v;
   }
 
-  ir.Definition visitSuperSend(ast.Send node) {
+  ir.Primitive visitSuperSend(ast.Send node) {
+    assert(isOpen);
     return giveup();
   }
 
-  ir.Definition visitTypeReferenceSend(ast.Send node) {
+  ir.Primitive visitTypeReferenceSend(ast.Send node) {
+    assert(isOpen);
     return giveup();
   }
 
-  ir.Definition visitSendSet(ast.SendSet node) {
+  ir.Primitive visitSendSet(ast.SendSet node) {
+    assert(isOpen);
     Element element = elements[node];
     if (!Elements.isLocal(element)) return giveup();
     if (node.assignmentOperator.source != '=') return giveup();
     // Exactly one argument expected for a simple assignment.
     assert(!node.arguments.isEmpty);
     assert(node.arguments.tail.isEmpty);
-    ir.Definition result = visit(node.arguments.head);
+    ir.Primitive result = visit(node.arguments.head);
     assignedVars[variableIndex[element]] = result;
     return result;
   }
 
   static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
 
-  ir.Definition giveup() => throw ABORT_IRNODE_BUILDER;
+  ir.Primitive giveup() => throw ABORT_IRNODE_BUILDER;
 
   ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) {
     try {
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index 2ce6ed8..f2159de 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -32,6 +32,18 @@
   bool get hasAtMostOneUse => firstRef == null || firstRef.nextRef == null;
   bool get hasExactlyOneUse => firstRef != null && firstRef.nextRef == null;
   bool get hasAtLeastOneUse => firstRef != null;
+
+  void substituteFor(Definition other) {
+    if (other.firstRef == null) return;
+    Reference previous, current = other.firstRef;
+    do {
+      current.definition = this;
+      previous = current;
+      current = current.nextRef;
+    } while (current != null);
+    previous.nextRef = firstRef;
+    firstRef = other.firstRef;
+  }
 }
 
 abstract class Primitive extends Definition {
@@ -115,15 +127,39 @@
 /// Invoke a continuation in tail position.
 class InvokeContinuation extends Expression {
   final Reference continuation;
-  final Reference argument;
+  final List<Reference> arguments;
 
-  InvokeContinuation(Continuation cont, Definition arg)
+  InvokeContinuation(Continuation cont, List<Definition> args)
       : continuation = new Reference(cont),
-        argument = new Reference(arg);
-
+        arguments = args.map((t) => new Reference(t)).toList(growable: false);
   accept(Visitor visitor) => visitor.visitInvokeContinuation(this);
 }
 
+/// The base class of things which can be tested and branched on.
+abstract class Condition extends Node {
+}
+
+class IsTrue extends Condition {
+  final Reference value;
+
+  IsTrue(Definition val) : value = new Reference(val);
+
+  accept(Visitor visitor) => visitor.visitIsTrue(this);
+}
+
+/// Choose between a pair of continuations based on a condition value.
+class Branch extends Expression {
+  final Condition condition;
+  final Reference trueContinuation;
+  final Reference falseContinuation;
+
+  Branch(this.condition, Continuation trueCont, Continuation falseCont)
+      : trueContinuation = new Reference(trueCont),
+        falseContinuation = new Reference(falseCont);
+
+  accept(Visitor visitor) => visitor.visitBranch(this);
+}
+
 class Constant extends Primitive {
   final dart2js.Constant value;
 
@@ -177,18 +213,25 @@
   T visitExpression(Expression node) => visitNode(node);
   T visitDefinition(Definition node) => visitNode(node);
   T visitPrimitive(Primitive node) => visitDefinition(node);
+  T visitCondition(Condition node) => visitNode(node);
 
   // Concrete classes.
   T visitFunctionDefinition(FunctionDefinition node) => visitNode(node);
 
+  // Expressions.
   T visitLetPrim(LetPrim node) => visitExpression(node);
   T visitLetCont(LetCont node) => visitExpression(node);
   T visitInvokeStatic(InvokeStatic node) => visitExpression(node);
   T visitInvokeContinuation(InvokeContinuation node) => visitExpression(node);
+  T visitBranch(Branch node) => visitExpression(node);
 
+  // Definitions.
   T visitConstant(Constant node) => visitPrimitive(node);
   T visitParameter(Parameter node) => visitPrimitive(node);
   T visitContinuation(Continuation node) => visitDefinition(node);
+
+  // Conditions.
+  T visitIsTrue(IsTrue node) => visitCondition(node);
 }
 
 /// Generate a Lisp-like S-expression representation of an IR node as a string.
@@ -213,56 +256,68 @@
           return name;
         })
         .join(' ');
-    return '(FunctionDefinition ($parameters) ${node.body.accept(this)})';
+    return '(FunctionDefinition ($parameters) ${visit(node.body)})';
   }
 
-  String visitLetPrim(LetPrim expr) {
+  String visitLetPrim(LetPrim node) {
     String name = newValueName();
-    names[expr.primitive] = name;
-    String value = expr.primitive.accept(this);
-    String body = expr.body.accept(this);
+    names[node.primitive] = name;
+    String value = visit(node.primitive);
+    String body = visit(node.body);
     return '(LetPrim $name $value) $body';
   }
 
-  String visitLetCont(LetCont expr) {
+  String visitLetCont(LetCont node) {
     String cont = newContinuationName();
-    names[expr.continuation] = cont;
-    String parameters = expr.continuation.parameters
+    names[node.continuation] = cont;
+    String parameters = node.continuation.parameters
         .map((p) {
           String name = newValueName();
           names[p] = name;
-          return name;
+          return ' $name';
         })
-       .join(' ');
-    String contBody = expr.continuation.body.accept(this);
-    String body = expr.body.accept(this);
-    return '(LetCont ($cont $parameters) $contBody) $body';
+       .join('');
+    String contBody = visit(node.continuation.body);
+    String body = visit(node.body);
+    return '(LetCont ($cont$parameters) $contBody) $body';
   }
 
-  String visitInvokeStatic(InvokeStatic expr) {
-    String name = expr.target.name;
-    String cont = names[expr.continuation.definition];
-    String args = expr.arguments.map((v) => names[v.definition]).join(' ');
+  String visitInvokeStatic(InvokeStatic node) {
+    String name = node.target.name;
+    String cont = names[node.continuation.definition];
+    String args = node.arguments.map((v) => names[v.definition]).join(' ');
     return '(InvokeStatic $name $cont $args)';
   }
 
-  String visitInvokeContinuation(InvokeContinuation expr) {
-    String cont = names[expr.continuation.definition];
-    String arg = names[expr.argument.definition];
-    return '(InvokeContinuation $cont $arg)';
+  String visitInvokeContinuation(InvokeContinuation node) {
+    String cont = names[node.continuation.definition];
+    String args = node.arguments.map((v) => names[v.definition]).join(' ');
+    return '(InvokeContinuation $cont $args)';
   }
 
-  String visitConstant(Constant triv) {
-    return '(Constant ${triv.value})';
+  String visitBranch(Branch node) {
+    String condition = visit(node.condition);
+    String trueCont = names[node.trueContinuation.definition];
+    String falseCont = names[node.falseContinuation.definition];
+    return '(Branch $condition $trueCont $falseCont)';
   }
 
-  String visitParameter(Parameter triv) {
+  String visitConstant(Constant node) {
+    return '(Constant ${node.value})';
+  }
+
+  String visitParameter(Parameter node) {
     // Parameters are visited directly in visitLetCont.
     return '(Unexpected Parameter)';
   }
 
-  String visitContinuation(Continuation triv) {
+  String visitContinuation(Continuation node) {
     // Continuations are visited directly in visitLetCont.
     return '(Unexpected Continuation)';
   }
+
+  String visitIsTrue(IsTrue node) {
+    String value = names[node.value.definition];
+    return '(IsTrue $value)';
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
index b55ab52..563b6b9 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
@@ -40,7 +40,7 @@
  *             | byte(NODE_INVOKE_STATIC) element selector
  *                   reference(continuation) {reference(argument)}
  *             | byte(NODE_INVOKE_CONTINUATION) reference(continuation)
- *                   reference(argument)
+ *                   {reference(argument)}
  *
  * reference ::= int(indexDelta)
  *
@@ -68,10 +68,12 @@
 
   static const int FIRST_NODE_TAG           = STRING_UTF8 + 1;
   static const int NODE_CONSTANT            = FIRST_NODE_TAG;
-  static const int NODE_LET_CONT            = NODE_CONSTANT + 1;
+  static const int NODE_IS_TRUE             = NODE_CONSTANT + 1;
+  static const int NODE_LET_CONT            = NODE_IS_TRUE + 1;
   static const int NODE_INVOKE_STATIC       = NODE_LET_CONT + 1;
   static const int NODE_INVOKE_CONTINUATION = NODE_INVOKE_STATIC + 1;
-  static const int LAST_NODE_TAG            = NODE_INVOKE_CONTINUATION;
+  static const int NODE_BRANCH              = NODE_INVOKE_CONTINUATION + 1;
+  static const int LAST_NODE_TAG            = NODE_BRANCH;
 
   static const int FIRST_CONST_TAG      = LAST_NODE_TAG + 1;
   static const int CONST_BOOL           = FIRST_CONST_TAG;
@@ -173,7 +175,7 @@
     offset = 0;
     emitted = <Object, int>{};
     index = 0;
-    function.accept(this);
+    visit(function);
 
     int sizeOffset = offset;
     writeInt(emitted.length);
@@ -282,10 +284,10 @@
     writeInt(index - entryIndex);
   }
 
-  void writeBackReferenceList(List entries) {
-    writeInt(entries.length);
-    for (int i = 0; i < entries.length; i++) {
-      writeBackReference(entries[i]);
+  void writeBackReferenceList(int length, Iterable entries) {
+    writeInt(length);
+    for (var x in entries) {
+      writeBackReference(x);
     }
   }
 
@@ -364,14 +366,14 @@
       recordForBackReference(parameter);
       writeElement(parameter.element);
     }
-    node.body.accept(this);
+    visit(node.body);
   }
 
   void visitLetPrim(ir.LetPrim node) {
-    node.primitive.accept(this);
+    visit(node.primitive);
     // The right-hand side is bound in the body.
     recordForBackReference(node.primitive);
-    node.body.accept(this);
+    visit(node.body);
   }
 
   void visitLetCont(ir.LetCont node) {
@@ -384,10 +386,10 @@
     writeInt(node.continuation.parameters.length);
     // The continuation is bound in the body.
     recordForBackReference(node.continuation);
-    node.body.accept(this);
+    visit(node.body);
     // The continuation parameters are bound in the continuation's body.
     node.continuation.parameters.forEach(recordForBackReference);
-    node.continuation.body.accept(this);
+    visit(node.continuation.body);
   }
 
   void visitInvokeStatic(ir.InvokeStatic node) {
@@ -397,14 +399,22 @@
     // TODO(lry): compact encoding when the arity of the selector and the
     // arguments list are the same
     writeBackReference(node.continuation.definition);
-    writeBackReferenceList(node.arguments.map(
-        (a) => a.definition).toList(growable: false));
+    writeBackReferenceList(node.arguments.length,
+                           node.arguments.map((a) => a.definition));
   }
 
   void visitInvokeContinuation(ir.InvokeContinuation node) {
     writeByte(Pickles.NODE_INVOKE_CONTINUATION);
     writeBackReference(node.continuation.definition);
-    writeBackReference(node.argument.definition);
+    writeBackReferenceList(node.arguments.length,
+                           node.arguments.map((a) => a.definition));
+  }
+
+  void visitBranch(ir.Branch node) {
+    writeByte(Pickles.NODE_BRANCH);
+    visit(node.condition);
+    writeBackReference(node.trueContinuation.definition);
+    writeBackReference(node.falseContinuation.definition);
   }
 
   void visitConstant(ir.Constant node) {
@@ -412,6 +422,11 @@
     node.value.accept(constantPickler);
   }
 
+  void visitIsTrue(ir.IsTrue node) {
+    writeByte(Pickles.NODE_IS_TRUE);
+    writeBackReference(node.value.definition);
+  }
+
   void visitNode(ir.Node node) {
     throw "Unexpected $node in pickler.";
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
index 3c79ef0..f3864d1 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
@@ -31,7 +31,7 @@
   visitFunctionDefinition(ir.FunctionDefinition f) {
     names = new Names();
     BlockCollector builder = new BlockCollector(names);
-    f.accept(builder);
+    builder.visit(f);
 
     printNode(builder.entry);
     for (Block block in builder.cont2block.values) {
@@ -58,7 +58,7 @@
         });
       });
       tag("HIR", () {
-        block.body.accept(this);
+        visit(block.body);
       });
     });
   }
@@ -73,7 +73,7 @@
   visitLetPrim(ir.LetPrim node) {
     String id = names.name(node.primitive);
     printStmt(id, "LetPrim $id = ${formatPrimitive(node.primitive)}");
-    node.body.accept(this);
+    visit(node.body);
   }
 
   visitLetCont(ir.LetCont node) {
@@ -82,7 +82,7 @@
       String id = names.name(node.continuation);
       printStmt(dummy, "LetCont $id = <$id>");
     }
-    node.body.accept(this);
+    visit(node.body);
   }
 
   visitInvokeStatic(ir.InvokeStatic node) {
@@ -96,8 +96,16 @@
   visitInvokeContinuation(ir.InvokeContinuation node) {
     String dummy = names.name(node);
     String kont = formatReference(node.continuation);
-    String arg = formatReference(node.argument);
-    printStmt(dummy, "InvokeContinuation $kont ($arg)");
+    String args = node.arguments.map(formatReference).join(', ');
+    printStmt(dummy, "InvokeContinuation $kont ($args)");
+  }
+
+  visitBranch(ir.Branch node) {
+    String dummy = names.name(node);
+    String condition = visit(node.condition);
+    String trueCont = formatReference(node.trueContinuation);
+    String falseCont = formatReference(node.falseContinuation);
+    printStmt(dummy, "Branch $condition ($trueCont, $falseCont)");
   }
 
   String formatReference(ir.Reference ref) {
@@ -109,9 +117,7 @@
     }
   }
 
-  String formatPrimitive(ir.Primitive p) {
-    return p.accept(this);
-  }
+  String formatPrimitive(ir.Primitive p) => visit(p);
 
   visitConstant(ir.Constant node) {
     return "Constant ${node.value}";
@@ -125,6 +131,11 @@
     return "Continuation ${names.name(node)}";
   }
 
+  visitIsTrue(ir.IsTrue node) {
+    return "IsTrue(${names.name(node)})";
+  }
+
+  visitCondition(ir.Condition c) {}
   visitExpression(ir.Expression e) {}
   visitPrimitive(ir.Primitive p) {}
   visitDefinition(ir.Definition d) {}
@@ -201,16 +212,16 @@
 
   visitFunctionDefinition(ir.FunctionDefinition f) {
     entry = current_block = new Block(names.name(f), [], f.body);
-    f.body.accept(this);
+    visit(f.body);
   }
 
   visitLetPrim(ir.LetPrim exp) {
-    exp.body.accept(this);
+    visit(exp.body);
   }
 
   visitLetCont(ir.LetCont exp) {
-    exp.continuation.accept(this);
-    exp.body.accept(this);
+    visit(exp.continuation);
+    visit(exp.body);
   }
 
   visitInvokeStatic(ir.InvokeStatic exp) {
@@ -227,14 +238,21 @@
     }
   }
 
-  visitConstant(ir.Constant constant) {}
-
-  visitParameter(ir.Parameter p) {}
+  visitBranch(ir.Branch exp) {
+    ir.Continuation trueTarget = exp.trueContinuation.definition;
+    if (trueTarget.body != null) {
+      current_block.addEdgeTo(getBlock(trueTarget));
+    }
+    ir.Continuation falseTarget = exp.falseContinuation.definition;
+    if (falseTarget.body != null) {
+      current_block.addEdgeTo(getBlock(falseTarget));
+    }
+  }
 
   visitContinuation(ir.Continuation c) {
     var old_node = current_block;
     current_block = getBlock(c);
-    c.body.accept(this);
+    visit(c.body);
     current_block = old_node;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
index 7b27bcf..3b29e65 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
@@ -121,6 +121,7 @@
   ir.Expression readExpressionNode() {
     int tag = readByte();
     switch (tag) {
+      // Nontail-position expressions.
       case Pickles.NODE_CONSTANT:
         ir.Definition constant = readConstant();
         unpickled[index++] = constant;
@@ -136,6 +137,8 @@
         parameters.forEach((p) => unpickled[index++] = p);
         addExpression(new ir.LetCont(continuation, body));
         break;
+
+      // Tail-position expressions.
       case Pickles.NODE_INVOKE_STATIC:
         addExpression(readInvokeStatic());
         current = null;
@@ -144,6 +147,11 @@
         addExpression(readInvokeContinuation());
         current = null;
         break;
+      case Pickles.NODE_BRANCH:
+        addExpression(readBranch());
+        current = null;
+        break;
+
       default:
         compiler.internalError(NO_LOCATION_SPANNABLE,
                                "Unexpected expression entry tag: $tag");
@@ -216,8 +224,26 @@
 
   ir.InvokeContinuation readInvokeContinuation() {
     ir.Continuation continuation = readBackReference();
-    ir.Definition argument = readBackReference();
-    return new ir.InvokeContinuation(continuation, argument);
+    List<ir.Definition> arguments = readBackReferenceList();
+    return new ir.InvokeContinuation(continuation, arguments);
+  }
+
+  ir.Branch readBranch() {
+    ir.Condition condition = readCondition();
+    ir.Continuation trueContinuation = readBackReference();
+    ir.Continuation falseContinuation = readBackReference();
+    return new ir.Branch(condition, trueContinuation, falseContinuation);
+  }
+
+  ir.Condition readCondition() {
+    int tag = readByte();
+    assert(tag == Pickles.NODE_IS_TRUE);
+    return readIsTrue();
+  }
+
+  ir.IsTrue readIsTrue() {
+    ir.Definition value = readBackReference();
+    return new ir.IsTrue(value);
   }
 
   Constant readConstantValue() {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index 5ae18d7..85199f1 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -458,6 +458,19 @@
   Uri get uri => _element.script.resourceUri;
 }
 
+class ResolvedNode {
+  final node;
+  final _elements;
+  final _mirrorSystem;
+  ResolvedNode(this.node, this._elements, this._mirrorSystem);
+
+  Mirror resolvedMirror(node) {
+    var element = _elements[node];
+    if (element == null) return null;
+    return _convertElementToDeclarationMirror(_mirrorSystem, element);
+  }
+}
+
 /**
  * Transitional class that allows access to features that have not yet
  * made it to the mirror API.
@@ -470,4 +483,33 @@
     return library._element.compilationUnits.toList().map(
         (cu) => new Dart2JsCompilationUnitMirror(cu, library)).toList();
   }
+
+  static Iterable metadataSyntaxOf(Dart2JsElementMirror declaration) {
+    Compiler compiler = declaration.mirrorSystem.compiler;
+    return declaration._element.metadata.toList().map((metadata) {
+      var node = metadata.parseNode(compiler);
+      Element annotatedElement = metadata.annotatedElement;
+      var context = annotatedElement.enclosingElement;
+      if (context == null) {
+        context = annotatedElement;
+      }
+      return new ResolvedNode(
+          node, context.treeElements, declaration.mirrorSystem);
+    });
+  }
+
+  static ResolvedNode initializerSyntaxOf(Dart2JsFieldMirror variable) {
+    var node = variable._variable.initializer;
+    if (node == null) return null;
+    return new ResolvedNode(
+        node, variable._variable.treeElements, variable.mirrorSystem);
+  }
+
+  static ResolvedNode defaultValueSyntaxOf(Dart2JsParameterMirror parameter) {
+    if (!parameter.hasDefaultValue) return null;
+    var node = parameter._element.initializer;
+    return new ResolvedNode(node,
+        (parameter.owner as Dart2JsElementMirror)._element.treeElements,
+        parameter.mirrorSystem);
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/patch_parser.dart b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
index 2a5a6c1..0b14e3a 100644
--- a/sdk/lib/_internal/compiler/implementation/patch_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
@@ -123,6 +123,7 @@
 import "elements/modelx.dart"
     show LibraryElementX,
          MetadataAnnotationX,
+         ClassElementX,
          FunctionElementX;
 import 'util/util.dart';
 
@@ -441,20 +442,18 @@
 }
 
 void patchClass(leg.DiagnosticListener listener,
-                 ClassElement origin,
-                 ClassElement patch) {
+                ClassElementX origin,
+                ClassElementX patch) {
   if (origin.isPatched) {
     listener.internalError(origin,
         "Patching the same class more than once.");
   }
-  // TODO(johnniwinther): Change to functions on the ElementX class.
-  origin.patch = patch;
-  patch.origin = origin;
+  origin.applyPatch(patch);
 }
 
 void tryPatchGetter(leg.DiagnosticListener listener,
-                     Element origin,
-                     FunctionElement patch) {
+                    Element origin,
+                    FunctionElement patch) {
   if (!origin.isAbstractField()) {
     listener.reportError(
         origin, leg.MessageKind.PATCH_NON_GETTER, {'name': origin.name});
@@ -515,8 +514,8 @@
 }
 
 void tryPatchFunction(leg.DiagnosticListener listener,
-                       Element origin,
-                       FunctionElement patch) {
+                      Element origin,
+                      FunctionElement patch) {
   if (!origin.isFunction()) {
     listener.reportError(
         origin,
@@ -530,8 +529,8 @@
 }
 
 void patchFunction(leg.DiagnosticListener listener,
-                    FunctionElementX origin,
-                    FunctionElementX patch) {
+                   FunctionElementX origin,
+                   FunctionElementX patch) {
   if (!origin.modifiers.isExternal()) {
     listener.reportError(origin, leg.MessageKind.PATCH_NON_EXTERNAL);
     listener.reportInfo(
@@ -547,10 +546,7 @@
     listener.internalError(origin,
         "Trying to patch an already compiled function.");
   }
-  // Don't just assign the patch field. This also updates the cachedNode.
-  // TODO(johnniwinther): Change to functions on the ElementX class.
-  origin.setPatch(patch);
-  patch.origin = origin;
+  origin.applyPatch(patch);
 }
 
 // TODO(johnniwinther): Add unittest when patch is (real) metadata.
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 4c3b88c..2e6ae95 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -322,18 +322,7 @@
     while (!originParameters.isEmpty) {
       ParameterElementX originParameter = originParameters.head;
       ParameterElementX patchParameter = patchParameters.head;
-      // TODO(johnniwinther): Remove the case for reassignment of
-      // [patch]/[origin] when resolution is ensure to be done only once.
-      assert(invariant(originParameter, originParameter.origin == null));
-      assert(invariant(originParameter,
-          originParameter.patch == null ||
-          originParameter.patch == patchParameter));
-      originParameter.patch = patchParameter;
-      assert(invariant(patchParameter,
-          patchParameter.origin == null ||
-          patchParameter.origin == originParameter));
-      assert(invariant(patchParameter, patchParameter.patch == null));
-      patchParameter.origin = originParameter;
+      originParameter.applyPatch(patchParameter);
       DartType originParameterType = originParameter.computeType(compiler);
       DartType patchParameterType = patchParameter.computeType(compiler);
       if (originParameterType != patchParameterType) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
index 8894cd5..9fbf715 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
@@ -16,19 +16,6 @@
   Link<BeginGroupToken> groupingStack = const Link<BeginGroupToken>();
 
   /**
-   * Appends a token whose kind is determined by [info] and content is defined
-   * by the String [value].
-   *
-   * This method is invoked for class names, field names, method names, types,
-   * etc.
-   */
-  void appendStringToken(PrecedenceInfo info, String value) {
-    tail.next = new StringToken.fromString(info, value, tokenStart,
-                                           canonicalize: true);
-    tail = tail.next;
-  }
-
-  /**
    * Appends a fixed token whose kind and content is determined by [info].
    * Appends an *operator* token from [info].
    *
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 5bb6790..23bb0d7 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -714,6 +714,9 @@
         case r'$':
           kind = MessageKind.MALFORMED_STRING_LITERAL;
           break;
+        case '/*':
+          kind = MessageKind.UNTERMINATED_COMMENT;
+          break;
         default:
           kind = MessageKind.UNTERMINATED_TOKEN;
           break;
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
index aee544d..f74e339 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
@@ -150,9 +150,6 @@
                             bool asciiOnly, [int extraOffset]);
 
   /** Documentation in subclass [ArrayBasedScanner]. */
-  void appendStringToken(PrecedenceInfo info, String value);
-
-  /** Documentation in subclass [ArrayBasedScanner]. */
   void appendPrecedenceToken(PrecedenceInfo info);
 
   /** Documentation in subclass [ArrayBasedScanner]. */
@@ -745,7 +742,7 @@
     while (true) {
       if (identical($EOF, next)) {
         if (!asciiOnlyLines) handleUnicode(unicodeStart);
-        appendStringToken(BAD_INPUT_INFO, "unterminated multi-line comment");
+        unterminated('/*');
         break;
       } else if (identical($STAR, next)) {
         next = advance();
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 75e86d8..efbad80 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -1492,8 +1492,10 @@
 
       if (constructor.isPatch) {
         // Create origin body element for patched constructors.
-        bodyElement.origin = new ConstructorBodyElementX(constructor.origin);
-        bodyElement.origin.patch = bodyElement;
+        ConstructorBodyElementX patch = bodyElement;
+        ConstructorBodyElementX origin =
+            new ConstructorBodyElementX(constructor.origin);
+        origin.applyPatch(patch);
         classElement.origin.addBackendMember(bodyElement.origin);
       }
     }
@@ -4801,37 +4803,38 @@
     }
     HInstruction value;
     if (node.isRedirectingFactoryBody) {
-      FunctionElement element = elements[node.expression].implementation;
-      FunctionElement function = sourceElement;
+      FunctionElement targetConstructor =
+          elements[node.expression].implementation;
+      FunctionElement redirectingConstructor = sourceElement;
       List<HInstruction> inputs = <HInstruction>[];
-      FunctionSignature calleeSignature = element.functionSignature;
-      FunctionSignature callerSignature = function.functionSignature;
-      callerSignature.forEachRequiredParameter((Element element) {
+      FunctionSignature targetSignature = targetConstructor.functionSignature;
+      FunctionSignature redirectingSignature =
+          redirectingConstructor.functionSignature;
+      redirectingSignature.forEachRequiredParameter((Element element) {
         inputs.add(localsHandler.readLocal(element));
       });
-      List<Element> calleeOptionals =
-          calleeSignature.orderedOptionalParameters;
-      List<Element> callerOptionals =
-          callerSignature.orderedOptionalParameters;
+      List<Element> targetOptionals =
+          targetSignature.orderedOptionalParameters;
+      List<Element> redirectingOptionals =
+          redirectingSignature.orderedOptionalParameters;
       int i = 0;
-      for (; i < callerOptionals.length; i++) {
-        inputs.add(localsHandler.readLocal(callerOptionals[i]));
+      for (; i < redirectingOptionals.length; i++) {
+        inputs.add(localsHandler.readLocal(redirectingOptionals[i]));
       }
-      for (; i < calleeOptionals.length; i++) {
-        inputs.add(handleConstantForOptionalParameter(calleeOptionals[i]));
+      for (; i < targetOptionals.length; i++) {
+        inputs.add(handleConstantForOptionalParameter(targetOptionals[i]));
       }
 
-      if (backend.classNeedsRti(element.getEnclosingClass())) {
-        ClassElement cls = function.getEnclosingClass();
-        Link<DartType> typeVariable = cls.typeVariables;
-        InterfaceType type = elements.getType(node.expression);
-        type.typeArguments.forEach((DartType argument) {
+      ClassElement targetClass = targetConstructor.getEnclosingClass();
+      if (backend.classNeedsRti(targetClass)) {
+        ClassElement cls = redirectingConstructor.getEnclosingClass();
+        InterfaceType targetType =
+            redirectingConstructor.computeTargetType(cls.thisType);
+        targetType.typeArguments.forEach((DartType argument) {
           inputs.add(analyzeTypeArgument(argument));
-          typeVariable = typeVariable.tail;
         });
-        assert(typeVariable.isEmpty);
       }
-      pushInvokeStatic(node, element, inputs);
+      pushInvokeStatic(node, targetConstructor, inputs);
       value = pop();
     } else if (node.expression == null) {
       value = graph.addConstantNull(compiler);
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 3aede58..e1ec24d 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -1824,6 +1824,14 @@
 }
 ''']);
 
+  static const MessageKind UNTERMINATED_COMMENT = const MessageKind(
+      "Comment starting with '/*' must end with '*/'.",
+      howToFix: DONT_KNOW_HOW_TO_FIX,
+      examples: const [r"""
+main() {
+}
+/*"""]);
+
   static const MessageKind COMPILER_CRASHED = const MessageKind(
       "The compiler crashed when compiling this element.");
 
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index 4d19e8e..496a35b 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -22,8 +22,7 @@
   ArgResults options;
 
   try {
-    options = PubCommand.pubArgParser.parse(arguments,
-        allowTrailingOptions: true);
+    options = PubCommand.pubArgParser.parse(arguments);
   } on FormatException catch (e) {
     log.error(e.message);
     log.error('Run "pub help" to see available options.');
diff --git a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
index 2124374..101669f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -279,19 +279,23 @@
 
   /// A [CompilerOutputProvider] for dart2js.
   EventSink<String> provideOutput(String name, String extension) {
-    // Dart2js uses an empty string for the name of the entrypoint library.
-    // We only expect to get output files associated with that right now. For
-    // other files, we'd need some logic to determine the right relative path
-    // for it.
-    assert(name == "");
-
     // TODO(rnystrom): Do this more cleanly. See: #17403.
     if (!generateSourceMaps && extension.endsWith(".map")) {
       return new NullSink<String>();
     }
 
     var primaryId = _transform.primaryInput.id;
-    var id = new AssetId(primaryId.package, "${primaryId.path}.$extension");
+
+    // Dart2js uses an empty string for the name of the entrypoint library.
+    // Otherwise, it's the name of a deferred library.
+    var outPath;
+    if (name == "") {
+      outPath = _transform.primaryInput.id.path;
+    } else {
+      outPath = path.join(path.dirname(_transform.primaryInput.id.path), name);
+    }
+
+    var id = new AssetId(primaryId.package, "$outPath.$extension");
 
     // Make a sink that dart2js can write to.
     var sink = new StreamController<String>();
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 760d5fc..3cfb07a 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -129,12 +129,17 @@
   /// only needs to be set in leaf commands.
   bool get takesArguments => false;
 
+  /// Override this and return `false` to disallow trailing options from being
+  /// parsed after a non-option argument is parsed.
+  bool get allowTrailingOptions => true;
+
   /// Alternate names for this command. These names won't be used in the
   /// documentation, but they will work when invoked on the command line.
   final aliases = const <String>[];
 
   /// The [ArgParser] for this command.
-  final commandParser = new ArgParser();
+  ArgParser get commandParser => _commandParser;
+  ArgParser _commandParser;
 
   /// Subcommands exposed by this command.
   ///
@@ -150,6 +155,8 @@
   bool get isOffline => false;
 
   PubCommand() {
+    _commandParser = new ArgParser(allowTrailingOptions: allowTrailingOptions);
+
     // Allow "--help" after a command to get command help.
     commandParser.addFlag('help', abbr: 'h', negatable: false,
         help: 'Print usage information for this command.');
@@ -263,7 +270,7 @@
 
 /// Creates the top-level [ArgParser] used to parse the pub command line.
 ArgParser _initArgParser() {
-  var argParser = new ArgParser();
+  var argParser = new ArgParser(allowTrailingOptions: true);
 
   // Add the global options.
   argParser.addFlag('help', abbr: 'h', negatable: false,
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index de11e56..64374db 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -82,10 +82,11 @@
     if (terse) options.add('--terse');
     if (toDart) options.add('--output-type=dart');
 
+    var sourceUrl = path.toUri(entrypoint);
+    options.add("--out=$sourceUrl.js");
+
     // Add the source map URLs.
     if (includeSourceMapUrls) {
-      var sourceUrl = path.toUri(entrypoint);
-      options.add("--out=$sourceUrl.js");
       options.add("--source-map=$sourceUrl.js.map");
     }
 
diff --git a/sdk/lib/_internal/pub/test/dart2js/outputs_deferred_libraries_test.dart b/sdk/lib/_internal/pub/test/dart2js/outputs_deferred_libraries_test.dart
new file mode 100644
index 0000000..cd06568
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/dart2js/outputs_deferred_libraries_test.dart
@@ -0,0 +1,69 @@
+// 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:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const MAIN = """
+import 'dart:async';
+
+@lazyA import 'a.dart' as a;
+@lazyB import 'b.dart' as b;
+
+const lazyA = const DeferredLibrary('a', uri: 'a.js');
+const lazyB = const DeferredLibrary('b', uri: 'b.js');
+
+void main() {
+  Future.wait([lazyA.load(), lazyB.load()]).then((_) {
+    a.fn();
+    b.fn();
+  });
+}
+""";
+
+const A = """
+library a;
+
+fn() => print("a");
+""";
+
+const B = """
+library b;
+
+fn() => print("b");
+""";
+
+main() {
+  initConfig();
+  integration("compiles deferred libraries to separate outputs", () {
+    // Dart2js can take a long time to compile dart code, so we increase the
+    // timeout to cope with that.
+    currentSchedule.timeout *= 3;
+
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('web', [
+        d.file('main.dart', MAIN),
+        d.file('a.dart', A),
+        d.file('b.dart', B)
+      ])
+    ]).create();
+
+    schedulePub(args: ["build"],
+        output: new RegExp(r'Built 4 files to "build".'));
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.dir('web', [
+          d.matcherFile('main.dart.js', isNot(isEmpty)),
+          d.matcherFile('main.dart.precompiled.js', isNot(isEmpty)),
+          d.matcherFile('main.dart.js_a.part.js', isNot(isEmpty)),
+          d.matcherFile('main.dart.js_b.part.js', isNot(isEmpty)),
+        ])
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/collection/iterable.dart b/sdk/lib/collection/iterable.dart
index d74448a..7c8ec70 100644
--- a/sdk/lib/collection/iterable.dart
+++ b/sdk/lib/collection/iterable.dart
@@ -31,7 +31,7 @@
   E reduce(E combine(E value, E element)) {
     Iterator<E> iterator = this.iterator;
     if (!iterator.moveNext()) {
-      throw new StateError("No elements");
+      throw IterableElementError.noElement();
     }
     E value = iterator.current;
     while (iterator.moveNext()) {
@@ -117,7 +117,7 @@
   E get first {
     Iterator it = iterator;
     if (!it.moveNext()) {
-      throw new StateError("No elements");
+      throw IterableElementError.noElement();
     }
     return it.current;
   }
@@ -125,7 +125,7 @@
   E get last {
     Iterator it = iterator;
     if (!it.moveNext()) {
-      throw new StateError("No elements");
+      throw IterableElementError.noElement();
     }
     E result;
     do {
@@ -136,9 +136,9 @@
 
   E get single {
     Iterator it = iterator;
-    if (!it.moveNext()) throw new StateError("No elements");
+    if (!it.moveNext()) throw IterableElementError.noElement();
     E result = it.current;
-    if (it.moveNext()) throw new StateError("More than one element");
+    if (it.moveNext()) throw IterableElementError.tooMany();
     return result;
   }
 
@@ -147,7 +147,7 @@
       if (test(element)) return element;
     }
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   dynamic lastWhere(bool test(E value), { Object orElse() }) {
@@ -161,7 +161,7 @@
     }
     if (foundMatching) return result;
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   E singleWhere(bool test(E value)) {
@@ -170,14 +170,14 @@
     for (E element in this) {
       if (test(element)) {
         if (foundMatching) {
-          throw new StateError("More than one matching element");
+          throw IterableElementError.tooMany();
         }
         result = element;
         foundMatching = true;
       }
     }
     if (foundMatching) return result;
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   E elementAt(int index) {
@@ -225,7 +225,7 @@
   E reduce(E combine(E value, E element)) {
     Iterator<E> iterator = this.iterator;
     if (!iterator.moveNext()) {
-      throw new StateError("No elements");
+      throw IterableElementError.noElement();
     }
     E value = iterator.current;
     while (iterator.moveNext()) {
@@ -311,7 +311,7 @@
   E get first {
     Iterator it = iterator;
     if (!it.moveNext()) {
-      throw new StateError("No elements");
+      throw IterableElementError.noElement();
     }
     return it.current;
   }
@@ -319,7 +319,7 @@
   E get last {
     Iterator it = iterator;
     if (!it.moveNext()) {
-      throw new StateError("No elements");
+      throw IterableElementError.noElement();
     }
     E result;
     do {
@@ -330,9 +330,9 @@
 
   E get single {
     Iterator it = iterator;
-    if (!it.moveNext()) throw new StateError("No elements");
+    if (!it.moveNext()) throw IterableElementError.noElement();
     E result = it.current;
-    if (it.moveNext()) throw new StateError("More than one element");
+    if (it.moveNext()) throw IterableElementError.tooMany();
     return result;
   }
 
@@ -341,7 +341,7 @@
       if (test(element)) return element;
     }
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   dynamic lastWhere(bool test(E value), { Object orElse() }) {
@@ -355,7 +355,7 @@
     }
     if (foundMatching) return result;
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   E singleWhere(bool test(E value)) {
@@ -364,14 +364,14 @@
     for (E element in this) {
       if (test(element)) {
         if (foundMatching) {
-          throw new StateError("More than one matching element");
+          throw IterableElementError.tooMany();
         }
         result = element;
         foundMatching = true;
       }
     }
     if (foundMatching) return result;
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   E elementAt(int index) {
diff --git a/sdk/lib/core/symbol.dart b/sdk/lib/core/symbol.dart
index 9f33e3a..e5cb8b2 100644
--- a/sdk/lib/core/symbol.dart
+++ b/sdk/lib/core/symbol.dart
@@ -25,7 +25,7 @@
    *   "`[]`", "`[]=`", or "`unary-`"),
    * * any of the above preceeded by any number of qualifiers,
    *   where a qualifier is a non-private identifier followed by '`.`',
-   * * or the empty string (the default name of a library with not library
+   * * or the empty string (the default name of a library with no library
    *   name declaration).
    *
    * The following text is non-normative:
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index a8b6082..fbbdd1a 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -7752,11 +7752,15 @@
   ElementList queryAll(String relativeSelectors) =>
       querySelectorAll(relativeSelectors);
 
-  /// Checks if [register] is supported on the current platform.
-  bool get supportsRegister {
+  /// Checks if [registerElement] is supported on the current platform.
+  bool get supportsRegisterElement {
     return JS('bool', '("registerElement" in #)', this);
   }
 
+  /// *Deprecated*: use [supportsRegisterElement] instead.
+  @deprecated
+  bool get supportsRegister => supportsRegisterElement;
+
   @DomName('Document.createElement')
   Element createElement(String tagName, [String typeExtension]) {
     return _createElement(tagName, typeExtension);
@@ -9317,7 +9321,7 @@
    *          // Perform any element initialization.
    *       }
    *     }
-   *     document.register('x-custom', CustomElement);
+   *     document.registerElement('x-custom', CustomElement);
    */
   Element.created() : super._created() {
     // Validate that this is a custom element & perform any additional
@@ -9694,15 +9698,39 @@
   /**
    * Called by the DOM when this element has been inserted into the live
    * document.
+   *
+   * More information can be found in the
+   * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-attached-callback)
+   * draft specification.
    */
   @Experimental()
-  void enteredView() {}
+  void attached() {
+    // For the deprecation period, call the old callback.
+    enteredView();
+  }
 
   /**
    * Called by the DOM when this element has been removed from the live
    * document.
+   *
+   * More information can be found in the
+   * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-detached-callback)
+   * draft specification.
    */
   @Experimental()
+  void detached() {
+    // For the deprecation period, call the old callback.
+    leftView();
+  }
+
+  /** *Deprecated*: override [attached] instead. */
+  @Experimental()
+  @deprecated
+  void enteredView() {}
+
+  /** *Deprecated*: override [detached] instead. */
+  @Experimental()
+  @deprecated
   void leftView() {}
 
   /**
@@ -14328,7 +14356,7 @@
    *     }
    *
    *     main() {
-   *       document.register('x-foo', FooElement);
+   *       document.registerElement('x-foo', FooElement);
    *       var myFoo = new Element.tag('x-foo');
    *       // prints 'FooElement created!' to the console.
    *     }
@@ -14345,7 +14373,7 @@
    *     }
    *
    *     main() {
-   *       document.register('x-bar', BarElement);
+   *       document.registerElement('x-bar', BarElement);
    *       var myBar = new Element.tag('input', 'x-bar');
    *       // prints 'BarElement created!' to the console.
    *     }
@@ -14354,11 +14382,19 @@
    * `<input is="x-bar"></input>`
    *
    */
-  void register(String tag, Type customElementClass, {String extendsTag}) {
+  void registerElement(String tag, Type customElementClass,
+      {String extendsTag}) {
     _registerCustomElement(JS('', 'window'), this, tag, customElementClass,
         extendsTag);
   }
 
+  /** *Deprecated*: use [registerElement] instead. */
+  @deprecated
+  @Experimental()
+  void register(String tag, Type customElementClass, {String extendsTag}) {
+    return registerElement(tag, customElementClass, extendsTag: extendsTag);
+  }
+
   /**
    * Static factory designed to expose `visibilitychange` events to event
    * handlers that are not necessarily instances of [Document].
@@ -26406,11 +26442,6 @@
   // To suppress missing implicit constructor warnings.
   factory Url._() { throw new UnsupportedError("Not supported"); }
 
-  @JSName('createObjectURL')
-  @DomName('URL.createObjectURL')
-  @DocsEditable()
-  static String _createObjectUrlFromWebKitSource(_WebKitMediaSource source) native;
-
   // From URLUtils
 
   @DomName('URL.hash')
@@ -35214,12 +35245,12 @@
   };
 }
 
-_callEnteredView(receiver) {
-  return receiver.enteredView();
+_callAttached(receiver) {
+  return receiver.attached();
 }
 
-_callLeftView(receiver) {
-  return receiver.leftView();
+_callDetached(receiver) {
+  return receiver.detached();
 }
  _callAttributeChanged(receiver, name, oldValue, newValue) {
   return receiver.attributeChanged(name, oldValue, newValue);
@@ -35302,9 +35333,9 @@
       JS('=Object', '{value: #}',
           _makeCallbackMethod(_callConstructor(constructor, interceptor))));
   JS('void', '#.attachedCallback = #', properties,
-      JS('=Object', '{value: #}', _makeCallbackMethod(_callEnteredView)));
+      JS('=Object', '{value: #}', _makeCallbackMethod(_callAttached)));
   JS('void', '#.detachedCallback = #', properties,
-      JS('=Object', '{value: #}', _makeCallbackMethod(_callLeftView)));
+      JS('=Object', '{value: #}', _makeCallbackMethod(_callDetached)));
   JS('void', '#.attributeChangedCallback = #', properties,
       JS('=Object', '{value: #}', _makeCallbackMethod3(_callAttributeChanged)));
 
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 2585e84..33f0663 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -350,27 +350,7 @@
 
   @DomName('Animation.Animation')
   @DocsEditable()
-  factory Animation(Element target, List<Map> keyframes, [timingInput]) {
-    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return Animation._create_1(target, keyframes, timingInput);
-    }
-    if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return Animation._create_2(target, keyframes, timingInput);
-    }
-    if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
-      return Animation._create_3(target, keyframes);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  @DocsEditable()
-  static Animation _create_1(target, keyframes, timingInput) => _blink.Native_Animation__create_1constructorCallback(target, keyframes, timingInput);
-
-  @DocsEditable()
-  static Animation _create_2(target, keyframes, timingInput) => _blink.Native_Animation__create_2constructorCallback(target, keyframes, timingInput);
-
-  @DocsEditable()
-  static Animation _create_3(target, keyframes) => _blink.Native_Animation__create_3constructorCallback(target, keyframes);
+  factory Animation(Element target, List<Map> keyframes, [timingInput]) => _blink.Native_Animation_Animation(target, keyframes, timingInput);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -768,12 +748,7 @@
 
   @DomName('HTMLAudioElement.HTMLAudioElement')
   @DocsEditable()
-  factory AudioElement([String src]) {
-    return AudioElement._create_1(src);
-  }
-
-  @DocsEditable()
-  static AudioElement _create_1(src) => _blink.Native_HTMLAudioElement__create_1constructorCallback(src);
+  factory AudioElement([String src]) => _blink.Native_HTMLAudioElement_AudioElement(src);
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -952,26 +927,7 @@
   @DocsEditable()
   String get type => _blink.Native_Blob_type_Getter(this);
 
-  Blob slice([int start, int end, String contentType]) {
-    if (contentType != null) {
-      return _slice_1(start, end, contentType);
-    }
-    if (end != null) {
-      return _slice_2(start, end);
-    }
-    if (start != null) {
-      return _slice_3(start);
-    }
-    return _slice_4();
-  }
-
-  Blob _slice_1(start, end, contentType) => _blink.Native_Blob__slice_1_Callback(this, start, end, contentType);
-
-  Blob _slice_2(start, end) => _blink.Native_Blob__slice_2_Callback(this, start, end);
-
-  Blob _slice_3(start) => _blink.Native_Blob__slice_3_Callback(this, start);
-
-  Blob _slice_4() => _blink.Native_Blob__slice_4_Callback(this);
+  Blob slice([int start, int end, String contentType]) => _blink.Native_Blob_slice(this, start, end, contentType);
 
 }
 
@@ -1889,18 +1845,7 @@
   @DocsEditable()
   void clearRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_clearRect_Callback(this, x, y, width, height);
 
-  void clip([String winding]) {
-    if (winding != null) {
-      _clip_1(winding);
-      return;
-    }
-    _clip_2();
-    return;
-  }
-
-  void _clip_1(winding) => _blink.Native_CanvasRenderingContext2D__clip_1_Callback(this, winding);
-
-  void _clip_2() => _blink.Native_CanvasRenderingContext2D__clip_2_Callback(this);
+  void clip([String winding]) => _blink.Native_CanvasRenderingContext2D_clip(this, winding);
 
   @DomName('CanvasRenderingContext2D.closePath')
   @DocsEditable()
@@ -1935,81 +1880,7 @@
   @Experimental() // untriaged
   bool drawCustomFocusRing(Element element) => _blink.Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(this, element);
 
-  void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) {
-    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_1(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-      return;
-    }
-    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_2(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-      return;
-    }
-    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      _drawImage_3(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-      return;
-    }
-    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_4(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-      return;
-    }
-    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_5(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-      return;
-    }
-    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      _drawImage_6(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-      return;
-    }
-    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_7(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-      return;
-    }
-    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_8(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-      return;
-    }
-    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      _drawImage_9(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-      return;
-    }
-    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_10(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-      return;
-    }
-    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_11(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-      return;
-    }
-    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      _drawImage_12(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void _drawImage_1(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_1_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-
-  void _drawImage_2(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_2_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-
-  void _drawImage_3(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_3_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-
-  void _drawImage_4(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_4_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-
-  void _drawImage_5(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_5_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-
-  void _drawImage_6(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_6_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-
-  void _drawImage_7(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_7_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-
-  void _drawImage_8(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_8_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-
-  void _drawImage_9(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_9_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-
-  void _drawImage_10(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_10_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-
-  void _drawImage_11(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_11_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-
-  void _drawImage_12(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_12_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+  void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) => _blink.Native_CanvasRenderingContext2D__drawImage(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
 
   @DomName('CanvasRenderingContext2D.drawSystemFocusRing')
   @DocsEditable()
@@ -2021,35 +1892,13 @@
   @Experimental() // untriaged
   void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_CanvasRenderingContext2D_ellipse_Callback(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
 
-  void fill([String winding]) {
-    if (winding != null) {
-      _fill_1(winding);
-      return;
-    }
-    _fill_2();
-    return;
-  }
-
-  void _fill_1(winding) => _blink.Native_CanvasRenderingContext2D__fill_1_Callback(this, winding);
-
-  void _fill_2() => _blink.Native_CanvasRenderingContext2D__fill_2_Callback(this);
+  void fill([String winding]) => _blink.Native_CanvasRenderingContext2D_fill(this, winding);
 
   @DomName('CanvasRenderingContext2D.fillRect')
   @DocsEditable()
   void fillRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_fillRect_Callback(this, x, y, width, height);
 
-  void fillText(String text, num x, num y, [num maxWidth]) {
-    if (maxWidth != null) {
-      _fillText_1(text, x, y, maxWidth);
-      return;
-    }
-    _fillText_2(text, x, y);
-    return;
-  }
-
-  void _fillText_1(text, x, y, maxWidth) => _blink.Native_CanvasRenderingContext2D__fillText_1_Callback(this, text, x, y, maxWidth);
-
-  void _fillText_2(text, x, y) => _blink.Native_CanvasRenderingContext2D__fillText_2_Callback(this, text, x, y);
+  void fillText(String text, num x, num y, [num maxWidth]) => _blink.Native_CanvasRenderingContext2D_fillText(this, text, x, y, maxWidth);
 
   @DomName('CanvasRenderingContext2D.getContextAttributes')
   @DocsEditable()
@@ -2065,16 +1914,7 @@
   @DocsEditable()
   List<num> _getLineDash() => _blink.Native_CanvasRenderingContext2D_getLineDash_Callback(this);
 
-  bool isPointInPath(num x, num y, [String winding]) {
-    if (winding != null) {
-      return _isPointInPath_1(x, y, winding);
-    }
-    return _isPointInPath_2(x, y);
-  }
-
-  bool _isPointInPath_1(x, y, winding) => _blink.Native_CanvasRenderingContext2D__isPointInPath_1_Callback(this, x, y, winding);
-
-  bool _isPointInPath_2(x, y) => _blink.Native_CanvasRenderingContext2D__isPointInPath_2_Callback(this, x, y);
+  bool isPointInPath(num x, num y, [String winding]) => _blink.Native_CanvasRenderingContext2D_isPointInPath(this, x, y, winding);
 
   @DomName('CanvasRenderingContext2D.isPointInStroke')
   @DocsEditable()
@@ -2092,21 +1932,7 @@
   @DocsEditable()
   void moveTo(num x, num y) => _blink.Native_CanvasRenderingContext2D_moveTo_Callback(this, x, y);
 
-  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
-    if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
-      _putImageData_1(imagedata, dx, dy);
-      return;
-    }
-    if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
-      _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void _putImageData_1(imagedata, dx, dy) => _blink.Native_CanvasRenderingContext2D__putImageData_1_Callback(this, imagedata, dx, dy);
-
-  void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) => _blink.Native_CanvasRenderingContext2D__putImageData_2_Callback(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) => _blink.Native_CanvasRenderingContext2D_putImageData(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
 
   @DomName('CanvasRenderingContext2D.quadraticCurveTo')
   @DocsEditable()
@@ -2153,18 +1979,7 @@
   @DocsEditable()
   void strokeRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_strokeRect_Callback(this, x, y, width, height);
 
-  void strokeText(String text, num x, num y, [num maxWidth]) {
-    if (maxWidth != null) {
-      _strokeText_1(text, x, y, maxWidth);
-      return;
-    }
-    _strokeText_2(text, x, y);
-    return;
-  }
-
-  void _strokeText_1(text, x, y, maxWidth) => _blink.Native_CanvasRenderingContext2D__strokeText_1_Callback(this, text, x, y, maxWidth);
-
-  void _strokeText_2(text, x, y) => _blink.Native_CanvasRenderingContext2D__strokeText_2_Callback(this, text, x, y);
+  void strokeText(String text, num x, num y, [num maxWidth]) => _blink.Native_CanvasRenderingContext2D_strokeText(this, text, x, y, maxWidth);
 
   @DomName('CanvasRenderingContext2D.transform')
   @DocsEditable()
@@ -2181,21 +1996,7 @@
   @Experimental()
   ImageData getImageDataHD(num sx, num sy, num sw, num sh) => _blink.Native_CanvasRenderingContext2D_webkitGetImageDataHD_Callback(this, sx, sy, sw, sh);
 
-  void putImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
-    if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
-      _webkitPutImageDataHD_1(imagedata, dx, dy);
-      return;
-    }
-    if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
-      _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void _webkitPutImageDataHD_1(imagedata, dx, dy) => _blink.Native_CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback(this, imagedata, dx, dy);
-
-  void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) => _blink.Native_CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+  void putImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) => _blink.Native_CanvasRenderingContext2D_putImageDataHD(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
 
 
   /**
@@ -2549,12 +2350,7 @@
 
   @DomName('Comment.Comment')
   @DocsEditable()
-  factory Comment([String data]) {
-    return Comment._create_1(data);
-  }
-
-  @DocsEditable()
-  static Comment _create_1(data) => _blink.Native_Comment__create_1constructorCallback(data);
+  factory Comment([String data]) => _blink.Native_Comment_Comment(data);
 }
 // 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
@@ -6591,31 +6387,13 @@
   @Experimental() // non-standard
   List<CssRule> get rules => _blink.Native_CSSStyleSheet_rules_Getter(this);
 
-  int addRule(String selector, String style, [int index]) {
-    if (index != null) {
-      return _addRule_1(selector, style, index);
-    }
-    return _addRule_2(selector, style);
-  }
-
-  int _addRule_1(selector, style, index) => _blink.Native_CSSStyleSheet__addRule_1_Callback(this, selector, style, index);
-
-  int _addRule_2(selector, style) => _blink.Native_CSSStyleSheet__addRule_2_Callback(this, selector, style);
+  int addRule(String selector, String style, [int index]) => _blink.Native_CSSStyleSheet_addRule(this, selector, style, index);
 
   @DomName('CSSStyleSheet.deleteRule')
   @DocsEditable()
   void deleteRule(int index) => _blink.Native_CSSStyleSheet_deleteRule_Callback(this, index);
 
-  int insertRule(String rule, [int index]) {
-    if (index != null) {
-      return _insertRule_1(rule, index);
-    }
-    return _insertRule_2(rule);
-  }
-
-  int _insertRule_1(rule, index) => _blink.Native_CSSStyleSheet__insertRule_1_Callback(this, rule, index);
-
-  int _insertRule_2(rule) => _blink.Native_CSSStyleSheet__insertRule_2_Callback(this, rule);
+  int insertRule(String rule, [int index]) => _blink.Native_CSSStyleSheet_insertRule(this, rule, index);
 
   @DomName('CSSStyleSheet.removeRule')
   @DocsEditable()
@@ -6825,18 +6603,7 @@
   @DocsEditable()
   List<String> get types => _blink.Native_Clipboard_types_Getter(this);
 
-  void clearData([String type]) {
-    if (type != null) {
-      _clearData_1(type);
-      return;
-    }
-    _clearData_2();
-    return;
-  }
-
-  void _clearData_1(type) => _blink.Native_Clipboard__clearData_1_Callback(this, type);
-
-  void _clearData_2() => _blink.Native_Clipboard__clearData_2_Callback(this);
+  void clearData([String type]) => _blink.Native_Clipboard_clearData(this, type);
 
   /**
    * Gets the data for the specified type.
@@ -6935,19 +6702,7 @@
   @Experimental() // untriaged
   DataTransferItem __getter__(int index) => _blink.Native_DataTransferItemList___getter___Callback(this, index);
 
-  DataTransferItem add(data_OR_file, [String type]) {
-    if ((data_OR_file is File || data_OR_file == null) && type == null) {
-      return _add_1(data_OR_file);
-    }
-    if ((type is String || type == null) && (data_OR_file is String || data_OR_file == null)) {
-      return _add_2(data_OR_file, type);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  DataTransferItem _add_1(data_OR_file) => _blink.Native_DataTransferItemList__add_1_Callback(this, data_OR_file);
-
-  DataTransferItem _add_2(data_OR_file, type) => _blink.Native_DataTransferItemList__add_2_Callback(this, data_OR_file, type);
+  DataTransferItem add(data_OR_file, [String type]) => _blink.Native_DataTransferItemList_add(this, data_OR_file, type);
 
   @DomName('DataTransferItemList.addData')
   @DocsEditable()
@@ -7720,32 +7475,9 @@
   @DocsEditable()
   Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.Native_Document_createElementNS_Callback(this, namespaceURI, qualifiedName, typeExtension);
 
-  Event _createEvent([String eventType]) {
-    if (eventType != null) {
-      return _createEvent_1(eventType);
-    }
-    return _createEvent_2();
-  }
+  Event _createEvent([String eventType]) => _blink.Native_Document__createEvent(this, eventType);
 
-  Event _createEvent_1(eventType) => _blink.Native_Document__createEvent_1_Callback(this, eventType);
-
-  Event _createEvent_2() => _blink.Native_Document__createEvent_2_Callback(this);
-
-  NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) {
-    if (filter != null) {
-      return _createNodeIterator_1(root, whatToShow, filter);
-    }
-    if (whatToShow != null) {
-      return _createNodeIterator_2(root, whatToShow);
-    }
-    return _createNodeIterator_3(root);
-  }
-
-  NodeIterator _createNodeIterator_1(root, whatToShow, filter) => _blink.Native_Document__createNodeIterator_1_Callback(this, root, whatToShow, filter);
-
-  NodeIterator _createNodeIterator_2(root, whatToShow) => _blink.Native_Document__createNodeIterator_2_Callback(this, root, whatToShow);
-
-  NodeIterator _createNodeIterator_3(root) => _blink.Native_Document__createNodeIterator_3_Callback(this, root);
+  NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) => _blink.Native_Document__createNodeIterator(this, root, whatToShow, filter);
 
   @DomName('Document.createRange')
   @DocsEditable()
@@ -7761,21 +7493,7 @@
   @Experimental()
   Touch _createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) => _blink.Native_Document_createTouch_Callback(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
 
-  TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) {
-    if (filter != null) {
-      return _createTreeWalker_1(root, whatToShow, filter);
-    }
-    if (whatToShow != null) {
-      return _createTreeWalker_2(root, whatToShow);
-    }
-    return _createTreeWalker_3(root);
-  }
-
-  TreeWalker _createTreeWalker_1(root, whatToShow, filter) => _blink.Native_Document__createTreeWalker_1_Callback(this, root, whatToShow, filter);
-
-  TreeWalker _createTreeWalker_2(root, whatToShow) => _blink.Native_Document__createTreeWalker_2_Callback(this, root, whatToShow);
-
-  TreeWalker _createTreeWalker_3(root) => _blink.Native_Document__createTreeWalker_3_Callback(this, root);
+  TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) => _blink.Native_Document__createTreeWalker(this, root, whatToShow, filter);
 
   @DomName('Document.elementFromPoint')
   @DocsEditable()
@@ -7807,16 +7525,7 @@
   @DocsEditable()
   List<Node> getElementsByTagName(String localName) => _blink.Native_Document_getElementsByTagName_Callback(this, localName);
 
-  Node importNode(Node node, [bool deep]) {
-    if (deep != null) {
-      return _importNode_1(node, deep);
-    }
-    return _importNode_2(node);
-  }
-
-  Node _importNode_1(node, deep) => _blink.Native_Document__importNode_1_Callback(this, node, deep);
-
-  Node _importNode_2(node) => _blink.Native_Document__importNode_2_Callback(this, node);
+  Node importNode(Node node, [bool deep]) => _blink.Native_Document_importNode(this, node, deep);
 
   @DomName('Document.queryCommandEnabled')
   @DocsEditable()
@@ -8221,11 +7930,15 @@
   ElementList queryAll(String relativeSelectors) =>
       querySelectorAll(relativeSelectors);
 
-  /// Checks if [register] is supported on the current platform.
-  bool get supportsRegister {
+  /// Checks if [registerElement] is supported on the current platform.
+  bool get supportsRegisterElement {
     return true;
   }
 
+  /// *Deprecated*: use [supportsRegisterElement] instead.
+  @deprecated
+  bool get supportsRegister => supportsRegisterElement;
+
   @DomName('Document.createElement')
   Element createElement(String tagName, [String typeExtension]) {
     if (typeExtension != null) {
@@ -8508,12 +8221,7 @@
 
   @DomName('DOMParser.DOMParser')
   @DocsEditable()
-  factory DomParser() {
-    return DomParser._create_1();
-  }
-
-  @DocsEditable()
-  static DomParser _create_1() => _blink.Native_DOMParser__create_1constructorCallback();
+  factory DomParser() => _blink.Native_DOMParser_DomParser();
 
   @DomName('DOMParser.parseFromString')
   @DocsEditable()
@@ -8631,49 +8339,11 @@
   // To suppress missing implicit constructor warnings.
   factory DomStringMap._() { throw new UnsupportedError("Not supported"); }
 
-  bool __delete__(index_OR_name) {
-    if ((index_OR_name is int || index_OR_name == null)) {
-      return ___delete___1(index_OR_name);
-    }
-    if ((index_OR_name is String || index_OR_name == null)) {
-      return ___delete___2(index_OR_name);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
+  bool __delete__(index_OR_name) => _blink.Native_DOMStringMap___delete__(this, index_OR_name);
 
-  bool ___delete___1(index_OR_name) => _blink.Native_DOMStringMap____delete___1_Callback(this, index_OR_name);
+  String __getter__(index_OR_name) => _blink.Native_DOMStringMap___getter__(this, index_OR_name);
 
-  bool ___delete___2(index_OR_name) => _blink.Native_DOMStringMap____delete___2_Callback(this, index_OR_name);
-
-  String __getter__(index_OR_name) {
-    if ((index_OR_name is int || index_OR_name == null)) {
-      return ___getter___1(index_OR_name);
-    }
-    if ((index_OR_name is String || index_OR_name == null)) {
-      return ___getter___2(index_OR_name);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  String ___getter___1(index_OR_name) => _blink.Native_DOMStringMap____getter___1_Callback(this, index_OR_name);
-
-  String ___getter___2(index_OR_name) => _blink.Native_DOMStringMap____getter___2_Callback(this, index_OR_name);
-
-  void __setter__(index_OR_name, String value) {
-    if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      ___setter___1(index_OR_name, value);
-      return;
-    }
-    if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
-      ___setter___2(index_OR_name, value);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void ___setter___1(index_OR_name, value) => _blink.Native_DOMStringMap____setter___1_Callback(this, index_OR_name, value);
-
-  void ___setter___2(index_OR_name, value) => _blink.Native_DOMStringMap____setter___2_Callback(this, index_OR_name, value);
+  void __setter__(index_OR_name, String value) => _blink.Native_DOMStringMap___setter__(this, index_OR_name, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8705,16 +8375,7 @@
   @DocsEditable()
   String toString() => _blink.Native_DOMTokenList_toString_Callback(this);
 
-  bool toggle(String token, [bool force]) {
-    if (force != null) {
-      return _toggle_1(token, force);
-    }
-    return _toggle_2(token);
-  }
-
-  bool _toggle_1(token, force) => _blink.Native_DOMTokenList__toggle_1_Callback(this, token, force);
-
-  bool _toggle_2(token) => _blink.Native_DOMTokenList__toggle_2_Callback(this, token);
+  bool toggle(String token, [bool force]) => _blink.Native_DOMTokenList_toggle(this, token, force);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9835,7 +9496,7 @@
    *          // Perform any element initialization.
    *       }
    *     }
-   *     document.register('x-custom', CustomElement);
+   *     document.registerElement('x-custom', CustomElement);
    */
   Element.created() : super._created() {
     // Validate that this is a custom element & perform any additional
@@ -10212,15 +9873,39 @@
   /**
    * Called by the DOM when this element has been inserted into the live
    * document.
+   *
+   * More information can be found in the
+   * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-attached-callback)
+   * draft specification.
    */
   @Experimental()
-  void enteredView() {}
+  void attached() {
+    // For the deprecation period, call the old callback.
+    enteredView();
+  }
 
   /**
    * Called by the DOM when this element has been removed from the live
    * document.
+   *
+   * More information can be found in the
+   * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-detached-callback)
+   * draft specification.
    */
   @Experimental()
+  void detached() {
+    // For the deprecation period, call the old callback.
+    leftView();
+  }
+
+  /** *Deprecated*: override [attached] instead. */
+  @Experimental()
+  @deprecated
+  void enteredView() {}
+
+  /** *Deprecated*: override [detached] instead. */
+  @Experimental()
+  @deprecated
   void leftView() {}
 
   /**
@@ -11289,24 +10974,7 @@
   @DocsEditable()
   String get tagName => _blink.Native_Element_tagName_Getter(this);
 
-  Animation animate(List<Map> keyframes, [timingInput]) {
-    if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
-      return _animate_1(keyframes, timingInput);
-    }
-    if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
-      return _animate_2(keyframes, timingInput);
-    }
-    if ((keyframes is List<Map> || keyframes == null) && timingInput == null) {
-      return _animate_3(keyframes);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  Animation _animate_1(keyframes, timingInput) => _blink.Native_Element__animate_1_Callback(this, keyframes, timingInput);
-
-  Animation _animate_2(keyframes, timingInput) => _blink.Native_Element__animate_2_Callback(this, keyframes, timingInput);
-
-  Animation _animate_3(keyframes) => _blink.Native_Element__animate_3_Callback(this, keyframes);
+  Animation animate(List<Map> keyframes, [timingInput]) => _blink.Native_Element_animate(this, keyframes, timingInput);
 
   @DomName('Element.blur')
   @DocsEditable()
@@ -11485,31 +11153,9 @@
   @DocsEditable()
   void scrollByPages(int pages) => _blink.Native_Element_scrollByPages_Callback(this, pages);
 
-  void _scrollIntoView([bool alignWithTop]) {
-    if (alignWithTop != null) {
-      _scrollIntoView_1(alignWithTop);
-      return;
-    }
-    _scrollIntoView_2();
-    return;
-  }
+  void _scrollIntoView([bool alignWithTop]) => _blink.Native_Element__scrollIntoView(this, alignWithTop);
 
-  void _scrollIntoView_1(alignWithTop) => _blink.Native_Element__scrollIntoView_1_Callback(this, alignWithTop);
-
-  void _scrollIntoView_2() => _blink.Native_Element__scrollIntoView_2_Callback(this);
-
-  void _scrollIntoViewIfNeeded([bool centerIfNeeded]) {
-    if (centerIfNeeded != null) {
-      _scrollIntoViewIfNeeded_1(centerIfNeeded);
-      return;
-    }
-    _scrollIntoViewIfNeeded_2();
-    return;
-  }
-
-  void _scrollIntoViewIfNeeded_1(centerIfNeeded) => _blink.Native_Element__scrollIntoViewIfNeeded_1_Callback(this, centerIfNeeded);
-
-  void _scrollIntoViewIfNeeded_2() => _blink.Native_Element__scrollIntoViewIfNeeded_2_Callback(this);
+  void _scrollIntoViewIfNeeded([bool centerIfNeeded]) => _blink.Native_Element__scrollIntoViewIfNeeded(this, centerIfNeeded);
 
   @DomName('Element.setAttribute')
   @DocsEditable()
@@ -12113,18 +11759,7 @@
   @DocsEditable()
   String get name => _blink.Native_Entry_name_Getter(this);
 
-  void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
-    if (name != null) {
-      _copyTo_1(parent, name, successCallback, errorCallback);
-      return;
-    }
-    _copyTo_2(parent);
-    return;
-  }
-
-  void _copyTo_1(parent, name, successCallback, errorCallback) => _blink.Native_Entry__copyTo_1_Callback(this, parent, name, successCallback, errorCallback);
-
-  void _copyTo_2(parent) => _blink.Native_Entry__copyTo_2_Callback(this, parent);
+  void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_Entry__copyTo(this, parent, name, successCallback, errorCallback);
 
   Future<Entry> copyTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
@@ -12158,18 +11793,7 @@
     return completer.future;
   }
 
-  void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
-    if (name != null) {
-      _moveTo_1(parent, name, successCallback, errorCallback);
-      return;
-    }
-    _moveTo_2(parent);
-    return;
-  }
-
-  void _moveTo_1(parent, name, successCallback, errorCallback) => _blink.Native_Entry__moveTo_1_Callback(this, parent, name, successCallback, errorCallback);
-
-  void _moveTo_2(parent) => _blink.Native_Entry__moveTo_2_Callback(this, parent);
+  void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_Entry__moveTo(this, parent, name, successCallback, errorCallback);
 
   Future<Entry> moveTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
@@ -12484,12 +12108,7 @@
 
   @DomName('EventSource.EventSource')
   @DocsEditable()
-  static EventSource _factoryEventSource(String url, [Map eventSourceInit]) {
-    return EventSource._create_1(url, eventSourceInit);
-  }
-
-  @DocsEditable()
-  static EventSource _create_1(url, eventSourceInit) => _blink.Native_EventSource__create_1constructorCallback(url, eventSourceInit);
+  static EventSource _factoryEventSource(String url, [Map eventSourceInit]) => _blink.Native_EventSource_EventSource(url, eventSourceInit);
 
   @DomName('EventSource.CLOSED')
   @DocsEditable()
@@ -13035,12 +12654,7 @@
 
   @DomName('FileReader.FileReader')
   @DocsEditable()
-  factory FileReader() {
-    return FileReader._create_1();
-  }
-
-  @DocsEditable()
-  static FileReader _create_1() => _blink.Native_FileReader__create_1constructorCallback();
+  factory FileReader() => _blink.Native_FileReader_FileReader();
 
   @DomName('FileReader.DONE')
   @DocsEditable()
@@ -13078,18 +12692,7 @@
   @DocsEditable()
   void readAsDataUrl(Blob blob) => _blink.Native_FileReader_readAsDataURL_Callback(this, blob);
 
-  void readAsText(Blob blob, [String encoding]) {
-    if (encoding != null) {
-      _readAsText_1(blob, encoding);
-      return;
-    }
-    _readAsText_2(blob);
-    return;
-  }
-
-  void _readAsText_1(blob, encoding) => _blink.Native_FileReader__readAsText_1_Callback(this, blob, encoding);
-
-  void _readAsText_2(blob) => _blink.Native_FileReader__readAsText_2_Callback(this, blob);
+  void readAsText(Blob blob, [String encoding]) => _blink.Native_FileReader_readAsText(this, blob, encoding);
 
   @DomName('FileReader.addEventListener')
   @DocsEditable()
@@ -13400,12 +13003,7 @@
 
   @DomName('FontFace.FontFace')
   @DocsEditable()
-  factory FontFace(String family, String source, Map descriptors) {
-    return FontFace._create_1(family, source, descriptors);
-  }
-
-  @DocsEditable()
-  static FontFace _create_1(family, source, descriptors) => _blink.Native_FontFace__create_1constructorCallback(family, source, descriptors);
+  factory FontFace(String family, String source, Map descriptors) => _blink.Native_FontFace_FontFace(family, source, descriptors);
 
   @DomName('FontFace.family')
   @DocsEditable()
@@ -13532,18 +13130,7 @@
   @Experimental() // untriaged
   bool delete(FontFace fontFace) => _blink.Native_FontFaceSet_delete_Callback(this, fontFace);
 
-  void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) {
-    if (thisArg != null) {
-      _forEach_1(callback, thisArg);
-      return;
-    }
-    _forEach_2(callback);
-    return;
-  }
-
-  void _forEach_1(callback, thisArg) => _blink.Native_FontFaceSet__forEach_1_Callback(this, callback, thisArg);
-
-  void _forEach_2(callback) => _blink.Native_FontFaceSet__forEach_2_Callback(this, callback);
+  void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) => _blink.Native_FontFaceSet_forEach(this, callback, thisArg);
 
   @DomName('FontFaceSet.has')
   @DocsEditable()
@@ -14764,7 +14351,7 @@
    *     }
    *
    *     main() {
-   *       document.register('x-foo', FooElement);
+   *       document.registerElement('x-foo', FooElement);
    *       var myFoo = new Element.tag('x-foo');
    *       // prints 'FooElement created!' to the console.
    *     }
@@ -14781,7 +14368,7 @@
    *     }
    *
    *     main() {
-   *       document.register('x-bar', BarElement);
+   *       document.registerElement('x-bar', BarElement);
    *       var myBar = new Element.tag('input', 'x-bar');
    *       // prints 'BarElement created!' to the console.
    *     }
@@ -14790,10 +14377,18 @@
    * `<input is="x-bar"></input>`
    *
    */
-  void register(String tag, Type customElementClass, {String extendsTag}) {
+  void registerElement(String tag, Type customElementClass,
+      {String extendsTag}) {
     _Utils.register(this, tag, customElementClass, extendsTag);
   }
 
+  /** *Deprecated*: use [registerElement] instead. */
+  @deprecated
+  @Experimental()
+  void register(String tag, Type customElementClass, {String extendsTag}) {
+    return registerElement(tag, customElementClass, extendsTag: extendsTag);
+  }
+
   /**
    * Static factory designed to expose `visibilitychange` events to event
    * handlers that are not necessarily instances of [Document].
@@ -17096,60 +16691,13 @@
   @DocsEditable()
   void setCustomValidity(String error) => _blink.Native_HTMLInputElement_setCustomValidity_Callback(this, error);
 
-  void setRangeText(String replacement, {int start, int end, String selectionMode}) {
-    if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
-      _setRangeText_1(replacement);
-      return;
-    }
-    if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
-      _setRangeText_2(replacement, start, end, selectionMode);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
+  void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.Native_HTMLInputElement_setRangeText(this, replacement, start, end, selectionMode);
 
-  void _setRangeText_1(replacement) => _blink.Native_HTMLInputElement__setRangeText_1_Callback(this, replacement);
+  void setSelectionRange(int start, int end, [String direction]) => _blink.Native_HTMLInputElement_setSelectionRange(this, start, end, direction);
 
-  void _setRangeText_2(replacement, start, end, selectionMode) => _blink.Native_HTMLInputElement__setRangeText_2_Callback(this, replacement, start, end, selectionMode);
+  void stepDown([int n]) => _blink.Native_HTMLInputElement_stepDown(this, n);
 
-  void setSelectionRange(int start, int end, [String direction]) {
-    if (direction != null) {
-      _setSelectionRange_1(start, end, direction);
-      return;
-    }
-    _setSelectionRange_2(start, end);
-    return;
-  }
-
-  void _setSelectionRange_1(start, end, direction) => _blink.Native_HTMLInputElement__setSelectionRange_1_Callback(this, start, end, direction);
-
-  void _setSelectionRange_2(start, end) => _blink.Native_HTMLInputElement__setSelectionRange_2_Callback(this, start, end);
-
-  void stepDown([int n]) {
-    if (n != null) {
-      _stepDown_1(n);
-      return;
-    }
-    _stepDown_2();
-    return;
-  }
-
-  void _stepDown_1(n) => _blink.Native_HTMLInputElement__stepDown_1_Callback(this, n);
-
-  void _stepDown_2() => _blink.Native_HTMLInputElement__stepDown_2_Callback(this);
-
-  void stepUp([int n]) {
-    if (n != null) {
-      _stepUp_1(n);
-      return;
-    }
-    _stepUp_2();
-    return;
-  }
-
-  void _stepUp_1(n) => _blink.Native_HTMLInputElement__stepUp_1_Callback(this, n);
-
-  void _stepUp_2() => _blink.Native_HTMLInputElement__stepUp_2_Callback(this);
+  void stepUp([int n]) => _blink.Native_HTMLInputElement_stepUp(this, n);
 
   /// Stream of `speechchange` events handled by this [InputElement].
   @DomName('HTMLInputElement.onwebkitSpeechChange')
@@ -18416,12 +17964,7 @@
 
   @DomName('MediaController.MediaController')
   @DocsEditable()
-  factory MediaController() {
-    return MediaController._create_1();
-  }
-
-  @DocsEditable()
-  static MediaController _create_1() => _blink.Native_MediaController__create_1constructorCallback();
+  factory MediaController() => _blink.Native_MediaController_MediaController();
 
   @DomName('MediaController.buffered')
   @DocsEditable()
@@ -19022,21 +18565,7 @@
   @Experimental() // nonstandard
   int get videoDecodedByteCount => _blink.Native_HTMLMediaElement_webkitVideoDecodedByteCount_Getter(this);
 
-  TextTrack addTextTrack(String kind, [String label, String language]) {
-    if (language != null) {
-      return _addTextTrack_1(kind, label, language);
-    }
-    if (label != null) {
-      return _addTextTrack_2(kind, label);
-    }
-    return _addTextTrack_3(kind);
-  }
-
-  TextTrack _addTextTrack_1(kind, label, language) => _blink.Native_HTMLMediaElement__addTextTrack_1_Callback(this, kind, label, language);
-
-  TextTrack _addTextTrack_2(kind, label) => _blink.Native_HTMLMediaElement__addTextTrack_2_Callback(this, kind, label);
-
-  TextTrack _addTextTrack_3(kind) => _blink.Native_HTMLMediaElement__addTextTrack_3_Callback(this, kind);
+  TextTrack addTextTrack(String kind, [String label, String language]) => _blink.Native_HTMLMediaElement_addTextTrack(this, kind, label, language);
 
   @DomName('HTMLMediaElement.canPlayType')
   @DocsEditable()
@@ -19060,18 +18589,7 @@
   @Experimental() // untriaged
   void setMediaKeys(MediaKeys mediaKeys) => _blink.Native_HTMLMediaElement_setMediaKeys_Callback(this, mediaKeys);
 
-  void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) {
-    if (initData != null) {
-      _webkitAddKey_1(keySystem, key, initData, sessionId);
-      return;
-    }
-    _webkitAddKey_2(keySystem, key);
-    return;
-  }
-
-  void _webkitAddKey_1(keySystem, key, initData, sessionId) => _blink.Native_HTMLMediaElement__webkitAddKey_1_Callback(this, keySystem, key, initData, sessionId);
-
-  void _webkitAddKey_2(keySystem, key) => _blink.Native_HTMLMediaElement__webkitAddKey_2_Callback(this, keySystem, key);
+  void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) => _blink.Native_HTMLMediaElement_addKey(this, keySystem, key, initData, sessionId);
 
   @DomName('HTMLMediaElement.webkitCancelKeyRequest')
   @DocsEditable()
@@ -19081,18 +18599,7 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
   void cancelKeyRequest(String keySystem, String sessionId) => _blink.Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(this, keySystem, sessionId);
 
-  void generateKeyRequest(String keySystem, [Uint8List initData]) {
-    if (initData != null) {
-      _webkitGenerateKeyRequest_1(keySystem, initData);
-      return;
-    }
-    _webkitGenerateKeyRequest_2(keySystem);
-    return;
-  }
-
-  void _webkitGenerateKeyRequest_1(keySystem, initData) => _blink.Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(this, keySystem, initData);
-
-  void _webkitGenerateKeyRequest_2(keySystem) => _blink.Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(this, keySystem);
+  void generateKeyRequest(String keySystem, [Uint8List initData]) => _blink.Native_HTMLMediaElement_generateKeyRequest(this, keySystem, initData);
 
   /// Stream of `canplay` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplay')
@@ -19479,12 +18986,7 @@
 
   @DomName('MediaKeys.MediaKeys')
   @DocsEditable()
-  factory MediaKeys(String keySystem) {
-    return MediaKeys._create_1(keySystem);
-  }
-
-  @DocsEditable()
-  static MediaKeys _create_1(keySystem) => _blink.Native_MediaKeys__create_1constructorCallback(keySystem);
+  factory MediaKeys(String keySystem) => _blink.Native_MediaKeys_MediaKeys(keySystem);
 
   @DomName('MediaKeys.keySystem')
   @DocsEditable()
@@ -19574,12 +19076,7 @@
 
   @DomName('MediaSource.MediaSource')
   @DocsEditable()
-  factory MediaSource() {
-    return MediaSource._create_1();
-  }
-
-  @DocsEditable()
-  static MediaSource _create_1() => _blink.Native_MediaSource__create_1constructorCallback();
+  factory MediaSource() => _blink.Native_MediaSource_MediaSource();
 
   @DomName('MediaSource.activeSourceBuffers')
   @DocsEditable()
@@ -19605,18 +19102,7 @@
   @DocsEditable()
   SourceBuffer addSourceBuffer(String type) => _blink.Native_MediaSource_addSourceBuffer_Callback(this, type);
 
-  void endOfStream([String error]) {
-    if (error != null) {
-      _endOfStream_1(error);
-      return;
-    }
-    _endOfStream_2();
-    return;
-  }
-
-  void _endOfStream_1(error) => _blink.Native_MediaSource__endOfStream_1_Callback(this, error);
-
-  void _endOfStream_2() => _blink.Native_MediaSource__endOfStream_2_Callback(this);
+  void endOfStream([String error]) => _blink.Native_MediaSource_endOfStream(this, error);
 
   @DomName('MediaSource.isTypeSupported')
   @DocsEditable()
@@ -19684,27 +19170,7 @@
 
   @DomName('MediaStream.MediaStream')
   @DocsEditable()
-  factory MediaStream([stream_OR_tracks]) {
-    if (stream_OR_tracks == null) {
-      return MediaStream._create_1();
-    }
-    if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
-      return MediaStream._create_2(stream_OR_tracks);
-    }
-    if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
-      return MediaStream._create_3(stream_OR_tracks);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  @DocsEditable()
-  static MediaStream _create_1() => _blink.Native_MediaStream__create_1constructorCallback();
-
-  @DocsEditable()
-  static MediaStream _create_2(stream_OR_tracks) => _blink.Native_MediaStream__create_2constructorCallback(stream_OR_tracks);
-
-  @DocsEditable()
-  static MediaStream _create_3(stream_OR_tracks) => _blink.Native_MediaStream__create_3constructorCallback(stream_OR_tracks);
+  factory MediaStream([stream_OR_tracks]) => _blink.Native_MediaStream_MediaStream(stream_OR_tracks);
 
   @DomName('MediaStream.ended')
   @DocsEditable()
@@ -20480,18 +19946,7 @@
   // To suppress missing implicit constructor warnings.
   factory MidiOutput._() { throw new UnsupportedError("Not supported"); }
 
-  void send(Uint8List data, [num timestamp]) {
-    if (timestamp != null) {
-      _send_1(data, timestamp);
-      return;
-    }
-    _send_2(data);
-    return;
-  }
-
-  void _send_1(data, timestamp) => _blink.Native_MIDIOutput__send_1_Callback(this, data, timestamp);
-
-  void _send_2(data) => _blink.Native_MIDIOutput__send_2_Callback(this, data);
+  void send(Uint8List data, [num timestamp]) => _blink.Native_MIDIOutput_send(this, data, timestamp);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22171,12 +21626,7 @@
 
   @DomName('Notification.Notification')
   @DocsEditable()
-  static Notification _factoryNotification(String title, [Map options]) {
-    return Notification._create_1(title, options);
-  }
-
-  @DocsEditable()
-  static Notification _create_1(title, options) => _blink.Native_Notification__create_1constructorCallback(title, options);
+  static Notification _factoryNotification(String title, [Map options]) => _blink.Native_Notification_Notification(title, options);
 
   @DomName('Notification.body')
   @DocsEditable()
@@ -22483,12 +21933,7 @@
 
   @DomName('HTMLOptionElement.HTMLOptionElement')
   @DocsEditable()
-  factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) {
-    return OptionElement._create_1(data, value, defaultSelected, selected);
-  }
-
-  @DocsEditable()
-  static OptionElement _create_1(data, value, defaultSelected, selected) => _blink.Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected);
+  factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) => _blink.Native_HTMLOptionElement_OptionElement__(data, value, defaultSelected, selected);
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -22812,27 +22257,7 @@
 
   @DomName('Path.Path')
   @DocsEditable()
-  factory Path([path_OR_text]) {
-    if (path_OR_text == null) {
-      return Path._create_1();
-    }
-    if ((path_OR_text is Path || path_OR_text == null)) {
-      return Path._create_2(path_OR_text);
-    }
-    if ((path_OR_text is String || path_OR_text == null)) {
-      return Path._create_3(path_OR_text);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  @DocsEditable()
-  static Path _create_1() => _blink.Native_Path__create_1constructorCallback();
-
-  @DocsEditable()
-  static Path _create_2(path_OR_text) => _blink.Native_Path__create_2constructorCallback(path_OR_text);
-
-  @DocsEditable()
-  static Path _create_3(path_OR_text) => _blink.Native_Path__create_3constructorCallback(path_OR_text);
+  factory Path([path_OR_text]) => _blink.Native_Path_Path(path_OR_text);
 
   @DomName('Path.arc')
   @DocsEditable()
@@ -24080,33 +23505,7 @@
   @DocsEditable()
   void close() => _blink.Native_RTCDataChannel_close_Callback(this);
 
-  void send(data) {
-    if ((data is TypedData || data == null)) {
-      _send_1(data);
-      return;
-    }
-    if ((data is ByteBuffer || data == null)) {
-      _send_2(data);
-      return;
-    }
-    if ((data is Blob || data == null)) {
-      _send_3(data);
-      return;
-    }
-    if ((data is String || data == null)) {
-      _send_4(data);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void _send_1(data) => _blink.Native_RTCDataChannel__send_1_Callback(this, data);
-
-  void _send_2(data) => _blink.Native_RTCDataChannel__send_2_Callback(this, data);
-
-  void _send_3(data) => _blink.Native_RTCDataChannel__send_3_Callback(this, data);
-
-  void _send_4(data) => _blink.Native_RTCDataChannel__send_4_Callback(this, data);
+  void send(data) => _blink.Native_RTCDataChannel_send(this, data);
 
   @DomName('RTCDataChannel.sendBlob')
   @DocsEditable()
@@ -24222,24 +23621,7 @@
   @DocsEditable()
   MediaStreamTrack get track => _blink.Native_RTCDTMFSender_track_Getter(this);
 
-  void insertDtmf(String tones, [int duration, int interToneGap]) {
-    if (interToneGap != null) {
-      _insertDTMF_1(tones, duration, interToneGap);
-      return;
-    }
-    if (duration != null) {
-      _insertDTMF_2(tones, duration);
-      return;
-    }
-    _insertDTMF_3(tones);
-    return;
-  }
-
-  void _insertDTMF_1(tones, duration, interToneGap) => _blink.Native_RTCDTMFSender__insertDTMF_1_Callback(this, tones, duration, interToneGap);
-
-  void _insertDTMF_2(tones, duration) => _blink.Native_RTCDTMFSender__insertDTMF_2_Callback(this, tones, duration);
-
-  void _insertDTMF_3(tones) => _blink.Native_RTCDTMFSender__insertDTMF_3_Callback(this, tones);
+  void insertDtmf(String tones, [int duration, int interToneGap]) => _blink.Native_RTCDTMFSender_insertDtmf(this, tones, duration, interToneGap);
 
   @DomName('RTCDTMFSender.addEventListener')
   @DocsEditable()
@@ -24297,12 +23679,7 @@
 
   @DomName('RTCIceCandidate.RTCIceCandidate')
   @DocsEditable()
-  factory RtcIceCandidate(Map dictionary) {
-    return RtcIceCandidate._create_1(dictionary);
-  }
-
-  @DocsEditable()
-  static RtcIceCandidate _create_1(dictionary) => _blink.Native_RTCIceCandidate__create_1constructorCallback(dictionary);
+  factory RtcIceCandidate(Map dictionary) => _blink.Native_RTCIceCandidate_RtcIceCandidate(dictionary);
 
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
@@ -24450,12 +23827,7 @@
 
   @DomName('RTCPeerConnection.RTCPeerConnection')
   @DocsEditable()
-  factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
-    return RtcPeerConnection._create_1(rtcIceServers, mediaConstraints);
-  }
-
-  @DocsEditable()
-  static RtcPeerConnection _create_1(rtcIceServers, mediaConstraints) => _blink.Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints);
+  factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) => _blink.Native_RTCPeerConnection_RtcPeerConnection(rtcIceServers, mediaConstraints);
 
   @DomName('RTCPeerConnection.iceConnectionState')
   @DocsEditable()
@@ -24619,12 +23991,7 @@
 
   @DomName('RTCSessionDescription.RTCSessionDescription')
   @DocsEditable()
-  factory RtcSessionDescription([Map descriptionInitDict]) {
-    return RtcSessionDescription._create_1(descriptionInitDict);
-  }
-
-  @DocsEditable()
-  static RtcSessionDescription _create_1(descriptionInitDict) => _blink.Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict);
+  factory RtcSessionDescription([Map descriptionInitDict]) => _blink.Native_RTCSessionDescription_RtcSessionDescription(descriptionInitDict);
 
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
@@ -24772,19 +24139,7 @@
   @DocsEditable()
   int get width => _blink.Native_Screen_width_Getter(this);
 
-  bool lockOrientation(orientation_OR_orientations) {
-    if ((orientation_OR_orientations is String || orientation_OR_orientations == null)) {
-      return _lockOrientation_1(orientation_OR_orientations);
-    }
-    if ((orientation_OR_orientations is List<String> || orientation_OR_orientations == null)) {
-      return _lockOrientation_2(orientation_OR_orientations);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  bool _lockOrientation_1(orientation_OR_orientations) => _blink.Native_Screen__lockOrientation_1_Callback(this, orientation_OR_orientations);
-
-  bool _lockOrientation_2(orientation_OR_orientations) => _blink.Native_Screen__lockOrientation_2_Callback(this, orientation_OR_orientations);
+  bool lockOrientation(orientation_OR_orientations) => _blink.Native_Screen_lockOrientation(this, orientation_OR_orientations);
 
   @DomName('Screen.unlockOrientation')
   @DocsEditable()
@@ -25414,12 +24769,7 @@
 
   @DomName('SharedWorker.SharedWorker')
   @DocsEditable()
-  factory SharedWorker(String scriptURL, [String name]) {
-    return SharedWorker._create_1(scriptURL, name);
-  }
-
-  @DocsEditable()
-  static SharedWorker _create_1(scriptURL, name) => _blink.Native_SharedWorker__create_1constructorCallback(scriptURL, name);
+  factory SharedWorker(String scriptURL, [String name]) => _blink.Native_SharedWorker_SharedWorker(scriptURL, name);
 
   @DomName('SharedWorker.port')
   @DocsEditable()
@@ -25559,18 +24909,7 @@
   @Experimental() // untriaged
   void appendBuffer(ByteBuffer data) => _blink.Native_SourceBuffer_appendBuffer_Callback(this, data);
 
-  void appendStream(FileStream stream, [int maxSize]) {
-    if (maxSize != null) {
-      _appendStream_1(stream, maxSize);
-      return;
-    }
-    _appendStream_2(stream);
-    return;
-  }
-
-  void _appendStream_1(stream, maxSize) => _blink.Native_SourceBuffer__appendStream_1_Callback(this, stream, maxSize);
-
-  void _appendStream_2(stream) => _blink.Native_SourceBuffer__appendStream_2_Callback(this, stream);
+  void appendStream(FileStream stream, [int maxSize]) => _blink.Native_SourceBuffer_appendStream(this, stream, maxSize);
 
   @DomName('SourceBuffer.appendTypedData')
   @DocsEditable()
@@ -25804,12 +25143,7 @@
 
   @DomName('SpeechGrammar.SpeechGrammar')
   @DocsEditable()
-  factory SpeechGrammar() {
-    return SpeechGrammar._create_1();
-  }
-
-  @DocsEditable()
-  static SpeechGrammar _create_1() => _blink.Native_SpeechGrammar__create_1constructorCallback();
+  factory SpeechGrammar() => _blink.Native_SpeechGrammar_SpeechGrammar();
 
   @DomName('SpeechGrammar.src')
   @DocsEditable()
@@ -25845,12 +25179,7 @@
 
   @DomName('SpeechGrammarList.SpeechGrammarList')
   @DocsEditable()
-  factory SpeechGrammarList() {
-    return SpeechGrammarList._create_1();
-  }
-
-  @DocsEditable()
-  static SpeechGrammarList _create_1() => _blink.Native_SpeechGrammarList__create_1constructorCallback();
+  factory SpeechGrammarList() => _blink.Native_SpeechGrammarList_SpeechGrammarList();
 
   @DomName('SpeechGrammarList.length')
   @DocsEditable()
@@ -25902,31 +25231,9 @@
   SpeechGrammar elementAt(int index) => this[index];
   // -- end List<SpeechGrammar> mixins.
 
-  void addFromString(String string, [num weight]) {
-    if (weight != null) {
-      _addFromString_1(string, weight);
-      return;
-    }
-    _addFromString_2(string);
-    return;
-  }
+  void addFromString(String string, [num weight]) => _blink.Native_SpeechGrammarList_addFromString(this, string, weight);
 
-  void _addFromString_1(string, weight) => _blink.Native_SpeechGrammarList__addFromString_1_Callback(this, string, weight);
-
-  void _addFromString_2(string) => _blink.Native_SpeechGrammarList__addFromString_2_Callback(this, string);
-
-  void addFromUri(String src, [num weight]) {
-    if (weight != null) {
-      _addFromUri_1(src, weight);
-      return;
-    }
-    _addFromUri_2(src);
-    return;
-  }
-
-  void _addFromUri_1(src, weight) => _blink.Native_SpeechGrammarList__addFromUri_1_Callback(this, src, weight);
-
-  void _addFromUri_2(src) => _blink.Native_SpeechGrammarList__addFromUri_2_Callback(this, src);
+  void addFromUri(String src, [num weight]) => _blink.Native_SpeechGrammarList_addFromUri(this, src, weight);
 
   @DomName('SpeechGrammarList.item')
   @DocsEditable()
@@ -26105,12 +25412,7 @@
 
   @DomName('SpeechRecognition.SpeechRecognition')
   @DocsEditable()
-  factory SpeechRecognition() {
-    return SpeechRecognition._create_1();
-  }
-
-  @DocsEditable()
-  static SpeechRecognition _create_1() => _blink.Native_SpeechRecognition__create_1constructorCallback();
+  factory SpeechRecognition() => _blink.Native_SpeechRecognition_SpeechRecognition();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
@@ -26525,12 +25827,7 @@
 
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
   @DocsEditable()
-  factory SpeechSynthesisUtterance([String text]) {
-    return SpeechSynthesisUtterance._create_1(text);
-  }
-
-  @DocsEditable()
-  static SpeechSynthesisUtterance _create_1(text) => _blink.Native_SpeechSynthesisUtterance__create_1constructorCallback(text);
+  factory SpeechSynthesisUtterance([String text]) => _blink.Native_SpeechSynthesisUtterance_SpeechSynthesisUtterance(text);
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
@@ -26761,49 +26058,11 @@
   @DocsEditable()
   int get _length => _blink.Native_Storage_length_Getter(this);
 
-  bool __delete__(index_OR_name) {
-    if ((index_OR_name is int || index_OR_name == null)) {
-      return ___delete___1(index_OR_name);
-    }
-    if ((index_OR_name is String || index_OR_name == null)) {
-      return ___delete___2(index_OR_name);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
+  bool __delete__(index_OR_name) => _blink.Native_Storage___delete__(this, index_OR_name);
 
-  bool ___delete___1(index_OR_name) => _blink.Native_Storage____delete___1_Callback(this, index_OR_name);
+  String __getter__(index_OR_name) => _blink.Native_Storage___getter__(this, index_OR_name);
 
-  bool ___delete___2(index_OR_name) => _blink.Native_Storage____delete___2_Callback(this, index_OR_name);
-
-  String __getter__(index_OR_name) {
-    if ((index_OR_name is int || index_OR_name == null)) {
-      return ___getter___1(index_OR_name);
-    }
-    if ((index_OR_name is String || index_OR_name == null)) {
-      return ___getter___2(index_OR_name);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  String ___getter___1(index_OR_name) => _blink.Native_Storage____getter___1_Callback(this, index_OR_name);
-
-  String ___getter___2(index_OR_name) => _blink.Native_Storage____getter___2_Callback(this, index_OR_name);
-
-  void __setter__(index_OR_name, String value) {
-    if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      ___setter___1(index_OR_name, value);
-      return;
-    }
-    if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
-      ___setter___2(index_OR_name, value);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void ___setter___1(index_OR_name, value) => _blink.Native_Storage____setter___1_Callback(this, index_OR_name, value);
-
-  void ___setter___2(index_OR_name, value) => _blink.Native_Storage____setter___2_Callback(this, index_OR_name, value);
+  void __setter__(index_OR_name, String value) => _blink.Native_Storage___setter__(this, index_OR_name, value);
 
   @DomName('Storage.clear')
   @DocsEditable()
@@ -27688,34 +26947,9 @@
   @DocsEditable()
   void setCustomValidity(String error) => _blink.Native_HTMLTextAreaElement_setCustomValidity_Callback(this, error);
 
-  void setRangeText(String replacement, {int start, int end, String selectionMode}) {
-    if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
-      _setRangeText_1(replacement);
-      return;
-    }
-    if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
-      _setRangeText_2(replacement, start, end, selectionMode);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
+  void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.Native_HTMLTextAreaElement_setRangeText(this, replacement, start, end, selectionMode);
 
-  void _setRangeText_1(replacement) => _blink.Native_HTMLTextAreaElement__setRangeText_1_Callback(this, replacement);
-
-  void _setRangeText_2(replacement, start, end, selectionMode) => _blink.Native_HTMLTextAreaElement__setRangeText_2_Callback(this, replacement, start, end, selectionMode);
-
-  void setSelectionRange(int start, int end, [String direction]) {
-    if (direction != null) {
-      _setSelectionRange_1(start, end, direction);
-      return;
-    }
-    _setSelectionRange_2(start, end);
-    return;
-  }
-
-  void _setSelectionRange_1(start, end, direction) => _blink.Native_HTMLTextAreaElement__setSelectionRange_1_Callback(this, start, end, direction);
-
-  void _setSelectionRange_2(start, end) => _blink.Native_HTMLTextAreaElement__setSelectionRange_2_Callback(this, start, end);
+  void setSelectionRange(int start, int end, [String direction]) => _blink.Native_HTMLTextAreaElement_setSelectionRange(this, start, end, direction);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -28961,34 +28195,7 @@
   // To suppress missing implicit constructor warnings.
   factory Url._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('URL._createObjectUrlFromWebKitSource')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static String _createObjectUrlFromWebKitSource(_WebKitMediaSource source) => _blink.Native_URL__createObjectUrlFromWebKitSource_Callback(source);
-
-  static String createObjectUrl(blob_OR_source_OR_stream) {
-    if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
-      return _createObjectURL_1(blob_OR_source_OR_stream);
-    }
-    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
-      return _createObjectURL_2(blob_OR_source_OR_stream);
-    }
-    if ((blob_OR_source_OR_stream is _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
-      return _createObjectURL_3(blob_OR_source_OR_stream);
-    }
-    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
-      return _createObjectURL_4(blob_OR_source_OR_stream);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  static String _createObjectURL_1(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream);
-
-  static String _createObjectURL_2(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream);
-
-  static String _createObjectURL_3(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream);
-
-  static String _createObjectURL_4(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_4_Callback(blob_OR_source_OR_stream);
+  static String createObjectUrl(blob_OR_source_OR_stream) => _blink.Native_URL_createObjectUrl(blob_OR_source_OR_stream);
 
   @DomName('URL.createObjectUrlFromBlob')
   @DocsEditable()
@@ -29506,12 +28713,7 @@
 
   @DomName('VTTCue.VTTCue')
   @DocsEditable()
-  factory VttCue(num startTime, num endTime, String text) {
-    return VttCue._create_1(startTime, endTime, text);
-  }
-
-  @DocsEditable()
-  static VttCue _create_1(startTime, endTime, text) => _blink.Native_VTTCue__create_1constructorCallback(startTime, endTime, text);
+  factory VttCue(num startTime, num endTime, String text) => _blink.Native_VTTCue_VttCue(startTime, endTime, text);
 
   @DomName('VTTCue.align')
   @DocsEditable()
@@ -29615,12 +28817,7 @@
 
   @DomName('VTTRegion.VTTRegion')
   @DocsEditable()
-  factory VttRegion() {
-    return VttRegion._create_1();
-  }
-
-  @DocsEditable()
-  static VttRegion _create_1() => _blink.Native_VTTRegion__create_1constructorCallback();
+  factory VttRegion() => _blink.Native_VTTRegion_VttRegion();
 
   @DomName('VTTRegion.height')
   @DocsEditable()
@@ -29832,27 +29029,7 @@
 
   @DomName('WebSocket.WebSocket')
   @DocsEditable()
-  factory WebSocket(String url, [protocol_OR_protocols]) {
-    if ((url is String || url == null) && protocol_OR_protocols == null) {
-      return WebSocket._create_1(url);
-    }
-    if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return WebSocket._create_2(url, protocol_OR_protocols);
-    }
-    if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return WebSocket._create_3(url, protocol_OR_protocols);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  @DocsEditable()
-  static WebSocket _create_1(url) => _blink.Native_WebSocket__create_1constructorCallback(url);
-
-  @DocsEditable()
-  static WebSocket _create_2(url, protocol_OR_protocols) => _blink.Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols);
-
-  @DocsEditable()
-  static WebSocket _create_3(url, protocol_OR_protocols) => _blink.Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols);
+  factory WebSocket(String url, [protocol_OR_protocols]) => _blink.Native_WebSocket_WebSocket(url, protocol_OR_protocols);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
@@ -29901,24 +29078,7 @@
   @DocsEditable()
   String get url => _blink.Native_WebSocket_url_Getter(this);
 
-  void close([int code, String reason]) {
-    if (reason != null) {
-      _close_1(code, reason);
-      return;
-    }
-    if (code != null) {
-      _close_2(code);
-      return;
-    }
-    _close_3();
-    return;
-  }
-
-  void _close_1(code, reason) => _blink.Native_WebSocket__close_1_Callback(this, code, reason);
-
-  void _close_2(code) => _blink.Native_WebSocket__close_2_Callback(this, code);
-
-  void _close_3() => _blink.Native_WebSocket__close_3_Callback(this);
+  void close([int code, String reason]) => _blink.Native_WebSocket_close(this, code, reason);
 
   /**
    * Transmit data to the server over this connection.
@@ -30964,19 +30124,7 @@
   @DocsEditable()
   WindowBase get window => _blink.Native_Window_window_Getter(this);
 
-  WindowBase __getter__(index_OR_name) {
-    if ((index_OR_name is int || index_OR_name == null)) {
-      return ___getter___1(index_OR_name);
-    }
-    if ((index_OR_name is String || index_OR_name == null)) {
-      return ___getter___2(index_OR_name);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  WindowBase ___getter___1(index_OR_name) => _blink.Native_Window____getter___1_Callback(this, index_OR_name);
-
-  WindowBase ___getter___2(index_OR_name) => _blink.Native_Window____getter___2_Callback(this, index_OR_name);
+  WindowBase __getter__(index_OR_name) => _blink.Native_Window___getter__(this, index_OR_name);
 
   /**
    * Displays a modal alert to the user.
@@ -31805,12 +30953,7 @@
 
   @DomName('Worker.Worker')
   @DocsEditable()
-  factory Worker(String scriptUrl) {
-    return Worker._create_1(scriptUrl);
-  }
-
-  @DocsEditable()
-  static Worker _create_1(scriptUrl) => _blink.Native_Worker__create_1constructorCallback(scriptUrl);
+  factory Worker(String scriptUrl) => _blink.Native_Worker_Worker(scriptUrl);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
@@ -32109,12 +31252,7 @@
 
   @DomName('XPathEvaluator.XPathEvaluator')
   @DocsEditable()
-  factory XPathEvaluator() {
-    return XPathEvaluator._create_1();
-  }
-
-  @DocsEditable()
-  static XPathEvaluator _create_1() => _blink.Native_XPathEvaluator__create_1constructorCallback();
+  factory XPathEvaluator() => _blink.Native_XPathEvaluator_XPathEvaluator();
 
   @DomName('XPathEvaluator.createExpression')
   @DocsEditable()
@@ -32293,12 +31431,7 @@
 
   @DomName('XMLSerializer.XMLSerializer')
   @DocsEditable()
-  factory XmlSerializer() {
-    return XmlSerializer._create_1();
-  }
-
-  @DocsEditable()
-  static XmlSerializer _create_1() => _blink.Native_XMLSerializer__create_1constructorCallback();
+  factory XmlSerializer() => _blink.Native_XMLSerializer_XmlSerializer();
 
   @DomName('XMLSerializer.serializeToString')
   @DocsEditable()
@@ -32324,12 +31457,7 @@
 
   @DomName('XSLTProcessor.XSLTProcessor')
   @DocsEditable()
-  factory XsltProcessor() {
-    return XsltProcessor._create_1();
-  }
-
-  @DocsEditable()
-  static XsltProcessor _create_1() => _blink.Native_XSLTProcessor__create_1constructorCallback();
+  factory XsltProcessor() => _blink.Native_XSLTProcessor_XsltProcessor();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
@@ -33013,12 +32141,7 @@
 
   @DomName('FileReaderSync.FileReaderSync')
   @DocsEditable()
-  factory _FileReaderSync() {
-    return _FileReaderSync._create_1();
-  }
-
-  @DocsEditable()
-  static _FileReaderSync _create_1() => _blink.Native_FileReaderSync__create_1constructorCallback();
+  factory _FileReaderSync() => _blink.Native_FileReaderSync__FileReaderSync();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33756,12 +32879,7 @@
 
   @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
   @DocsEditable()
-  factory _WebKitCSSMatrix([String cssValue]) {
-    return _WebKitCSSMatrix._create_1(cssValue);
-  }
-
-  @DocsEditable()
-  static _WebKitCSSMatrix _create_1(cssValue) => _blink.Native_WebKitCSSMatrix__create_1constructorCallback(cssValue);
+  factory _WebKitCSSMatrix([String cssValue]) => _blink.Native_WebKitCSSMatrix__WebKitCSSMatrix(cssValue);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33796,12 +32914,7 @@
 
   @DomName('WebKitMediaSource.WebKitMediaSource')
   @DocsEditable()
-  factory _WebKitMediaSource() {
-    return _WebKitMediaSource._create_1();
-  }
-
-  @DocsEditable()
-  static _WebKitMediaSource _create_1() => _blink.Native_WebKitMediaSource__create_1constructorCallback();
+  factory _WebKitMediaSource() => _blink.Native_WebKitMediaSource__WebKitMediaSource();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -38060,7 +37173,6 @@
       throw new UnsupportedError('Element is incorrect type');
     }
     return _Utils.changeElementWrapper(element, _type);
-    return null;
   }
 }
 
@@ -38864,7 +37976,7 @@
   String remove(String key) => _blink.Native_DOMStringMap_remove(this, key);
   void clear() => Maps.clear(this);
   void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this, keys);
+  Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this);
   Iterable<String> get values => Maps.getValues(this);
   int get length => Maps.length(this);
   bool get isEmpty => Maps.isEmpty(this);
diff --git a/sdk/lib/html/dartium/nativewrappers.dart b/sdk/lib/html/dartium/nativewrappers.dart
index 5000343..55e5742 100644
--- a/sdk/lib/html/dartium/nativewrappers.dart
+++ b/sdk/lib/html/dartium/nativewrappers.dart
@@ -4,8 +4,8 @@
 
 library nativewrappers;
 
-class NativeFieldWrapperClass1 {
-  NativeFieldWrapperClass1() {
+class NativeFieldWrapperClass2 {
+  NativeFieldWrapperClass2() {
     throw new UnsupportedError(
         "Generative constructors not supported on native types.");
   }
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 426ab31..2d51aed 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -223,24 +223,7 @@
   @DocsEditable()
   void deleteObjectStore(String name) => _blink.Native_IDBDatabase_deleteObjectStore_Callback(this, name);
 
-  Transaction transaction(storeName_OR_storeNames, String mode) {
-    if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
-      return _transaction_1(storeName_OR_storeNames, mode);
-    }
-    if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
-      return _transaction_2(storeName_OR_storeNames, mode);
-    }
-    if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
-      return _transaction_3(storeName_OR_storeNames, mode);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  Transaction _transaction_1(storeName_OR_storeNames, mode) => _blink.Native_IDBDatabase__transaction_1_Callback(this, storeName_OR_storeNames, mode);
-
-  Transaction _transaction_2(storeName_OR_storeNames, mode) => _blink.Native_IDBDatabase__transaction_2_Callback(this, storeName_OR_storeNames, mode);
-
-  Transaction _transaction_3(storeName_OR_storeNames, mode) => _blink.Native_IDBDatabase__transaction_3_Callback(this, storeName_OR_storeNames, mode);
+  Transaction transaction(storeName_OR_storeNames, String mode) => _blink.Native_IDBDatabase_transaction(this, storeName_OR_storeNames, mode);
 
   @DomName('IDBDatabase.transactionList')
   @DocsEditable()
@@ -386,16 +369,7 @@
   @DocsEditable()
   OpenDBRequest _deleteDatabase(String name) => _blink.Native_IDBFactory_deleteDatabase_Callback(this, name);
 
-  OpenDBRequest _open(String name, [int version]) {
-    if (version != null) {
-      return _open_1(name, version);
-    }
-    return _open_2(name);
-  }
-
-  OpenDBRequest _open_1(name, version) => _blink.Native_IDBFactory__open_1_Callback(this, name, version);
-
-  OpenDBRequest _open_2(name) => _blink.Native_IDBFactory__open_2_Callback(this, name);
+  OpenDBRequest _open(String name, [int version]) => _blink.Native_IDBFactory__open(this, name, version);
 
   @DomName('IDBFactory.webkitGetDatabaseNames')
   @DocsEditable()
@@ -795,19 +769,7 @@
   @DocsEditable()
   Request _count(Object key) => _blink.Native_IDBObjectStore_count_Callback(this, key);
 
-  Index _createIndex(String name, keyPath, [Map options]) {
-    if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
-      return _createIndex_1(name, keyPath, options);
-    }
-    if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
-      return _createIndex_2(name, keyPath, options);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  Index _createIndex_1(name, keyPath, options) => _blink.Native_IDBObjectStore__createIndex_1_Callback(this, name, keyPath, options);
-
-  Index _createIndex_2(name, keyPath, options) => _blink.Native_IDBObjectStore__createIndex_2_Callback(this, name, keyPath, options);
+  Index _createIndex(String name, keyPath, [Map options]) => _blink.Native_IDBObjectStore__createIndex(this, name, keyPath, options);
 
   @DomName('IDBObjectStore.delete')
   @DocsEditable()
diff --git a/sdk/lib/internal/iterable.dart b/sdk/lib/internal/iterable.dart
index 4ad6d14..6149cb9 100644
--- a/sdk/lib/internal/iterable.dart
+++ b/sdk/lib/internal/iterable.dart
@@ -46,18 +46,18 @@
   bool get isEmpty => length == 0;
 
   E get first {
-    if (length == 0) throw new StateError("No elements");
+    if (length == 0) throw IterableElementError.noElement();
     return elementAt(0);
   }
 
   E get last {
-    if (length == 0) throw new StateError("No elements");
+    if (length == 0) throw IterableElementError.noElement();
     return elementAt(length - 1);
   }
 
   E get single {
-    if (length == 0) throw new StateError("No elements");
-    if (length > 1) throw new StateError("Too many elements");
+    if (length == 0) throw IterableElementError.noElement();
+    if (length > 1) throw IterableElementError.tooMany();
     return elementAt(0);
   }
 
@@ -104,7 +104,7 @@
       }
     }
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   dynamic lastWhere(bool test(E element), { Object orElse() }) {
@@ -117,7 +117,7 @@
       }
     }
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   E singleWhere(bool test(E element)) {
@@ -128,7 +128,7 @@
       E element = elementAt(i);
       if (test(element)) {
         if (matchFound) {
-          throw new StateError("More than one matching element");
+          throw IterableElementError.tooMany();
         }
         matchFound = true;
         match = element;
@@ -138,7 +138,7 @@
       }
     }
     if (matchFound) return match;
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   String join([String separator = ""]) {
@@ -175,7 +175,7 @@
   Iterable map(f(E element)) => new MappedListIterable(this, f);
 
   E reduce(E combine(var value, E element)) {
-    if (length == 0) throw new StateError("No elements");
+    if (length == 0) throw IterableElementError.noElement();
     E value = elementAt(0);
     for (int i = 1; i < length; i++) {
       value = combine(value, elementAt(i));
@@ -661,11 +661,11 @@
 
   int get length => 0;
 
-  E get first { throw new StateError("No elements"); }
+  E get first { throw IterableElementError.noElement(); }
 
-  E get last { throw new StateError("No elements"); }
+  E get last { throw IterableElementError.noElement(); }
 
-  E get single { throw new StateError("No elements"); }
+  E get single { throw IterableElementError.noElement(); }
 
   E elementAt(int index) { throw new RangeError.value(index); }
 
@@ -677,17 +677,17 @@
 
   E firstWhere(bool test(E element), { E orElse() }) {
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   E lastWhere(bool test(E element), { E orElse() }) {
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   E singleWhere(bool test(E element), { E orElse() }) {
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   String join([String separator = ""]) => "";
@@ -697,7 +697,7 @@
   Iterable map(f(E element)) => const EmptyIterable();
 
   E reduce(E combine(E value, E element)) {
-    throw new StateError("No elements");
+    throw IterableElementError.noElement();
   }
 
   fold(var initialValue, combine(var previousValue, E element)) {
@@ -774,7 +774,7 @@
   static dynamic reduce(Iterable iterable,
                         dynamic combine(previousValue, element)) {
     Iterator iterator = iterable.iterator;
-    if (!iterator.moveNext()) throw new StateError("No elements");
+    if (!iterator.moveNext()) throw IterableElementError.noElement();
     var value = iterator.current;
     while (iterator.moveNext()) {
       value = combine(value, iterator.current);
@@ -824,7 +824,7 @@
   static dynamic first(Iterable iterable) {
     Iterator it = iterable.iterator;
     if (!it.moveNext()) {
-      throw new StateError("No elements");
+      throw IterableElementError.noElement();
     }
     return it.current;
   }
@@ -832,7 +832,7 @@
   static dynamic last(Iterable iterable) {
     Iterator it = iterable.iterator;
     if (!it.moveNext()) {
-      throw new StateError("No elements");
+      throw IterableElementError.noElement();
     }
     dynamic result;
     do {
@@ -843,9 +843,9 @@
 
   static dynamic single(Iterable iterable) {
     Iterator it = iterable.iterator;
-    if (!it.moveNext()) throw new StateError("No elements");
+    if (!it.moveNext()) throw IterableElementError.noElement();
     dynamic result = it.current;
-    if (it.moveNext()) throw new StateError("More than one element");
+    if (it.moveNext()) throw IterableElementError.tooMany();
     return result;
   }
 
@@ -856,7 +856,7 @@
       if (test(element)) return element;
     }
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   static dynamic lastWhere(Iterable iterable,
@@ -872,7 +872,7 @@
     }
     if (foundMatching) return result;
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   static dynamic lastWhereList(List list,
@@ -884,7 +884,7 @@
       if (test(element)) return element;
     }
     if (orElse != null) return orElse();
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   static dynamic singleWhere(Iterable iterable, bool test(dynamic value)) {
@@ -893,14 +893,14 @@
     for (dynamic element in iterable) {
       if (test(element)) {
         if (foundMatching) {
-          throw new StateError("More than one matching element");
+          throw IterableElementError.tooMany();
         }
         result = element;
         foundMatching = true;
       }
     }
     if (foundMatching) return result;
-    throw new StateError("No matching element");
+    throw IterableElementError.noElement();
   }
 
   static dynamic elementAt(Iterable iterable, int index) {
@@ -1058,7 +1058,7 @@
       otherStart = 0;
     }
     if (otherStart + length > otherList.length) {
-      throw new StateError("Not enough elements");
+      throw IterableElementError.tooFew();
     }
     Lists.copy(otherList, otherStart, list, start, length);
   }
@@ -1165,3 +1165,15 @@
     return result;
   }
 }
+
+/**
+ * Creates errors throw by [Iterable] when the element count is wrong.
+ */
+abstract class IterableElementError {
+  /** Error thrown thrown by, e.g., [Iterable.first] when there is no result. */
+  static StateError noElement() => new StateError("No element");
+  /** Error thrown by, e.g., [Iterable.single] if there are too many results. */
+  static StateError tooMany() => new StateError("Too many elements");
+  /** Error thrown by, e.g., [List.setRange] if there are too few elements. */
+  static StateError tooFew() => new StateError("Too few elements");
+}
diff --git a/sdk/lib/internal/list.dart b/sdk/lib/internal/list.dart
index f40c39b..473a87a 100644
--- a/sdk/lib/internal/list.dart
+++ b/sdk/lib/internal/list.dart
@@ -307,6 +307,49 @@
 }
 
 /**
+ * Creates errors thrown by unmodifiable lists when they are attempted modified.
+ *
+ * This class creates [UnsupportedError]s with specialized messages.
+ */
+abstract class UnmodifiableListError {
+  /** Error thrown when trying to add elements to an unmodifiable list. */
+  static UnsupportedError add()
+      => new UnsupportedError("Cannot add to unmodifiable List");
+
+  /** Error thrown when trying to add elements to an unmodifiable list. */
+  static UnsupportedError change()
+      => new UnsupportedError(
+             "Cannot change the content of an unmodifiable List");
+
+  /** Error thrown when trying to change the length of an unmodifiable list. */
+  static UnsupportedError length()
+      => new UnsupportedError("Cannot change length of unmodifiable List");
+
+  /** Error thrown when trying to remove elements from an unmodifiable list. */
+  static UnsupportedError remove()
+      => new UnsupportedError("Cannot remove from unmodifiable List");
+}
+
+/**
+ * Creates errors thrown by non-growable lists when they are attempted modified.
+ *
+ * This class creates [UnsupportedError]s with specialized messages.
+ */
+abstract class NonGrowableListError {
+  /** Error thrown when trying to add elements to an non-growable list. */
+  static UnsupportedError add()
+      => new UnsupportedError("Cannot add to non-growable List");
+
+  /** Error thrown when trying to change the length of an non-growable list. */
+  static UnsupportedError length()
+      => new UnsupportedError("Cannot change length of non-growable List");
+
+  /** Error thrown when trying to remove elements from an non-growable list. */
+  static UnsupportedError remove()
+      => new UnsupportedError("Cannot remove from non-growable List");
+}
+
+/**
  * Converts a growable list to a fixed length list with the same elements.
  *
  * For internal use only.
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 18360c6..371543f 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -877,14 +877,8 @@
  *
  *     void handleGetRequest(HttpRequest req) {
  *       HttpResponse res = req.response;
- *       var body = [];
- *       req.listen((List<int> buffer) => body.add(buffer),
- *         onDone: () {
- *           res.write('Received ${body.length} for request ');
- *           res.write(' ${req.method}: ${req.uri.path}');
- *           res.close();
- *         },
- *         onError: handleError);
+ *       res.write('Received request ${req.method}: ${req.uri.path}');
+ *       res.close();
  *     }
  */
 abstract class HttpRequest implements Stream<List<int>> {
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index b966c61..680acb6 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -246,13 +246,22 @@
       {bool sendClientCertificate: false,
        String certificateName,
        bool onBadCertificate(X509Certificate certificate)}) {
-    return  _RawSecureSocket.connect(
+    _RawSecureSocket._verifyFields(
         host,
         port,
         certificateName,
-        is_server: false,
-        sendClientCertificate: sendClientCertificate,
-        onBadCertificate: onBadCertificate);
+        false,
+        false,
+        false,
+        sendClientCertificate,
+        onBadCertificate);
+    return RawSocket.connect(host, port)
+        .then((socket) {
+          return secure(socket,
+                        sendClientCertificate: sendClientCertificate,
+                        certificateName: certificateName,
+                        onBadCertificate: onBadCertificate);
+        });
   }
 
   /**
@@ -293,7 +302,7 @@
     socket.readEventsEnabled = false;
     socket.writeEventsEnabled = false;
     return  _RawSecureSocket.connect(
-        host != null ? host : socket.address,
+        host != null ? host : socket.address.host,
         socket.port,
         certificateName,
         is_server: false,
@@ -463,34 +472,24 @@
        bool requireClientCertificate: false,
        bool sendClientCertificate: false,
        bool onBadCertificate(X509Certificate certificate)}) {
-    var future;
     _verifyFields(host, requestedPort, certificateName, is_server,
                  requestClientCertificate, requireClientCertificate,
                  sendClientCertificate, onBadCertificate);
-    if (host is String) {
-      if (socket != null) {
-        future = new Future.value(
-            (socket.address as dynamic)._cloneWithNewHost(host));
-      } else {
-        future = InternetAddress.lookup(host).then((addrs) => addrs.first);
-      }
-    } else {
-      future = new Future.value(host);
-    }
-    return future.then((addr) {
-     return new _RawSecureSocket(addr,
-                                 requestedPort,
-                                 certificateName,
-                                 is_server,
-                                 socket,
-                                 subscription,
-                                 bufferedData,
-                                 requestClientCertificate,
-                                 requireClientCertificate,
-                                 sendClientCertificate,
-                                 onBadCertificate)
-         ._handshakeComplete.future;
-    });
+    if (host is InternetAddress) host = host.host;
+    var address = socket.address;
+    if (host != null) address =  address._cloneWithNewHost(host);
+    return new _RawSecureSocket(address,
+                                requestedPort,
+                                certificateName,
+                                is_server,
+                                socket,
+                                subscription,
+                                bufferedData,
+                                requestClientCertificate,
+                                requireClientCertificate,
+                                sendClientCertificate,
+                                onBadCertificate)
+        ._handshakeComplete.future;
   }
 
   _RawSecureSocket(
@@ -498,7 +497,7 @@
       int requestedPort,
       this.certificateName,
       this.is_server,
-      RawSocket socket,
+      RawSocket this._socket,
       this._socketSubscription,
       this._bufferedData,
       this.requestClientCertificate,
@@ -521,31 +520,26 @@
     if (onBadCertificate != null) {
       _secureFilter.registerBadCertificateCallback(_onBadCertificateWrapper);
     }
-    var futureSocket;
-    if (socket == null) {
-      futureSocket = RawSocket.connect(address, requestedPort);
+    _socket.readEventsEnabled = true;
+    _socket.writeEventsEnabled = false;
+    if (_socketSubscription == null) {
+      // If a current subscription is provided use this otherwise
+      // create a new one.
+      _socketSubscription = _socket.listen(_eventDispatcher,
+                                           onError: _reportError,
+                                           onDone: _doneHandler);
     } else {
-      futureSocket = new Future.value(socket);
-    }
-    futureSocket.then((rawSocket) {
-      _socket = rawSocket;
-      _socket.readEventsEnabled = true;
-      _socket.writeEventsEnabled = false;
-      if (_socketSubscription == null) {
-        // If a current subscription is provided use this otherwise
-        // create a new one.
-        _socketSubscription = _socket.listen(_eventDispatcher,
-                                             onError: _reportError,
-                                             onDone: _doneHandler);
-      } else {
-        if (_socketSubscription.isPaused) {
-          throw new StateError("Subscription passed to TLS upgrade is paused");
-        }
-        _socketSubscription
-            ..onData(_eventDispatcher)
-            ..onError(_reportError)
-            ..onDone(_doneHandler);
+      if (_socketSubscription.isPaused) {
+        _socket.close();
+        throw new ArgumentError(
+            "Subscription passed to TLS upgrade is paused");
       }
+      _socketSubscription
+          ..onData(_eventDispatcher)
+          ..onError(_reportError)
+          ..onDone(_doneHandler);
+    }
+    try {
       _secureFilter.connect(address.host,
                             (address as dynamic)._in_addr,
                             port,
@@ -556,8 +550,9 @@
                             requireClientCertificate,
                             sendClientCertificate);
       _secureHandshake();
-    })
-    .catchError(_reportError);
+    } catch (e, s) {
+      _reportError(e, s);
+    }
   }
 
   StreamSubscription listen(void onData(RawSocketEvent data),
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index b1e5be7..337029c 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -244,6 +244,36 @@
    * is fully closed and is no longer bound.
    */
   Future<RawServerSocket> close();
+
+  /**
+   * Get the [RawServerSocketReference].
+   *
+   * WARNING: This feature is *highly experimental* and currently only works on
+   * Linux. The API is most likely going to change in the near future.
+   *
+   * The returned [RawServerSocketReference] can be used to create other
+   * [RawServerSocket]s listening on the same port,
+   * using [RawServerSocketReference.create].
+   * Incoming connections on the port will be distributed fairly between the
+   * active server sockets.
+   * The [RawServerSocketReference] can be distributed to other isolates through
+   * a [RawSendPort].
+   */
+  RawServerSocketReference get reference;
+}
+
+
+/**
+ * A [RawServerSocketReference].
+ *
+ * WARNING: This class is used with [RawServerSocket.reference] which is highly
+ * experimental.
+ */
+abstract class RawServerSocketReference {
+  /**
+   * Create a new [RawServerSocket], from this reference.
+   */
+  Future<RawServerSocket> create();
 }
 
 
@@ -305,8 +335,39 @@
    * is fully closed and is no longer bound.
    */
   Future<ServerSocket> close();
+
+  /**
+   * Get the [ServerSocketReference].
+   *
+   * WARNING: This feature is *highly experimental* and currently only works on
+   * Linux. The API is most likely going to change in the near future.
+   *
+   * The returned [ServerSocketReference] can be used to create other
+   * [ServerSocket]s listening on the same port,
+   * using [ServerSocketReference.create].
+   * Incoming connections on the port will be distributed fairly between the
+   * active server sockets.
+   * The [ServerSocketReference] can be distributed to other isolates through a
+   * [SendPort].
+   */
+  ServerSocketReference get reference;
 }
 
+
+/**
+ * A [ServerSocketReference].
+ *
+ * WARNING: This class is used with [ServerSocket.reference] which is highly
+ * experimental.
+ */
+abstract class ServerSocketReference {
+  /**
+   * Create a new [ServerSocket], from this reference.
+   */
+  Future<ServerSocket> create();
+}
+
+
 /**
  * The [SocketDirection] is used as a parameter to [Socket.close] and
  * [RawSocket.close] to close a socket in the specified direction(s).
@@ -388,8 +449,10 @@
    * if the host-lookup or connection failed.
    *
    * [host] can either be a [String] or an [InternetAddress]. If [host] is a
-   * [String], [connect] will perform a [InternetAddress.lookup] and use
-   * the first value in the list.
+   * [String], [connect] will perform a [InternetAddress.lookup] and try
+   * all returned [InternetAddress]es, in turn, until connected. Unless a
+   * connection was established, the error from the first attempt is
+   * returned.
    */
   external static Future<RawSocket> connect(host, int port);
 
@@ -479,8 +542,10 @@
    * if the host-lookup or connection failed.
    *
    * [host] can either be a [String] or an [InternetAddress]. If [host] is a
-   * [String], [connect] will perform a [InternetAddress.lookup] and use
-   * the first value in the list.
+   * [String], [connect] will perform a [InternetAddress.lookup] and try
+   * all returned [InternetAddress]es, in turn, until connected. Unless a
+   * connection was established, the error from the first attempt is
+   * returned.
    */
   external static Future<Socket> connect(host, int port);
 
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
index a35ca3e..327ef3a 100644
--- a/sdk/lib/io/websocket.dart
+++ b/sdk/lib/io/websocket.dart
@@ -133,6 +133,10 @@
                                    {List<String> protocols: const []}) =>
       _WebSocketImpl.connect(url, protocols);
 
+  @Deprecated('This constructor will be removed in Dart 2.0. Use `implements`'
+      ' instead of `extends` if implementing this abstract class.')
+  WebSocket();
+
   /**
    * Creates a WebSocket from an already-upgraded socket.
    *
@@ -144,13 +148,18 @@
    *
    * [protocol] should be the protocol negotiated by this handshake, if any.
    *
-   * If [serverSide] is `false`, the WebSocket will act as the client and mask
-   * the messages it sends. If it's `true`, it will act as the server and will
-   * not mask its messages.
+   * [serverSide] must be passed explicitly. If it's `false`, the WebSocket will
+   * act as the client and mask the messages it sends. If it's `true`, it will
+   * act as the server and will not mask its messages.
    */
   factory WebSocket.fromUpgradedSocket(Socket socket, {String protocol,
-        bool serverSide: true}) =>
-      new _WebSocketImpl._fromSocket(socket, protocol, serverSide);
+        bool serverSide}) {
+    if (serverSide == null) {
+      throw new ArgumentError("The serverSide argument must be passed "
+          "explicitly to WebSocket.fromUpgradedSocket.");
+    }
+    return new _WebSocketImpl._fromSocket(socket, protocol, serverSide);
+  }
 
   /**
    * Returns the current state of the connection.
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index ddffcd6..7fb810e 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -55,9 +55,6 @@
  */
 library dart.mirrors;
 
-import 'dart:async';
-import 'dart:isolate';
-
 /**
  * A [MirrorSystem] is the main interface used to reflect on a set of
  * associated libraries.
@@ -569,7 +566,7 @@
 }
 
 /// A mirror on an import or export declaration.
-abstract class LibraryDependencyMirror {
+abstract class LibraryDependencyMirror implements Mirror {
   /// Is `true` if this dependency is an import.
   bool get isImport;
 
@@ -597,7 +594,7 @@
 }
 
 /// A mirror on a show/hide combinator declared on a library dependency.
-abstract class CombinatorMirror {
+abstract class CombinatorMirror implements Mirror {
   /// The list of identifiers on the combinator.
   List<Symbol> get identifiers;
 
diff --git a/sdk/lib/profiler/profiler.dart b/sdk/lib/profiler/profiler.dart
index 56614dd..0bcae56 100644
--- a/sdk/lib/profiler/profiler.dart
+++ b/sdk/lib/profiler/profiler.dart
@@ -14,53 +14,52 @@
   /// Label of [this].
   String get label;
 
-  /// Make [this] the current tag for the isolate.
-  makeCurrent();
+  /// Make [this] the current tag for the isolate. Returns the current tag
+  /// before setting.
+  UserTag makeCurrent();
+
+  /// The default [UserTag] with label 'Default'.
+  static UserTag get defaultTag => _FakeUserTag._defaultTag;
 }
 
 // This is a fake implementation of UserTag so that code can compile and run
 // in dart2js.
 class _FakeUserTag implements UserTag {
-  static List _instances = [];
+  static Map _instances = {};
 
   _FakeUserTag.real(this.label);
 
   factory _FakeUserTag(String label) {
     // Canonicalize by name.
-    for (var tag in _instances) {
-      if (tag.label == label) {
-        return tag;
-      }
+    var existingTag = _instances[label];
+    if (existingTag != null) {
+      return existingTag;
     }
     // Throw an exception if we've reached the maximum number of user tags.
     if (_instances.length == UserTag.MAX_USER_TAGS) {
       throw new UnsupportedError(
           'UserTag instance limit (${UserTag.MAX_USER_TAGS}) reached.');
     }
-    // Create a new instance and add it to the instance list.
+    // Create a new instance and add it to the instance map.
     var instance = new _FakeUserTag.real(label);
-    _instances.add(instance);
+    _instances[label] = instance;
     return instance;
   }
 
   final String label;
 
-  makeCurrent() {
+  UserTag makeCurrent() {
+    var old = _currentTag;
     _currentTag = this;
+    return old;
   }
+
+  static final UserTag _defaultTag = new _FakeUserTag('Default');
 }
 
-var _currentTag = null;
+var _currentTag = _FakeUserTag._defaultTag;
 
 /// Returns the current [UserTag] for the isolate.
 UserTag getCurrentTag() {
   return _currentTag;
 }
-
-/// Sets the current [UserTag] for the isolate to null. Returns current tag
-/// before clearing.
-UserTag clearCurrentTag() {
-  var old = _currentTag;
-  _currentTag = null;
-  return old;
-}
\ No newline at end of file
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 55ea84b..a88c32f 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -231,43 +231,9 @@
   @DocsEditable()
   void noteOn(num when) => _blink.Native_AudioBufferSourceNode_noteOn_Callback(this, when);
 
-  void start([num when, num grainOffset, num grainDuration]) {
-    if (grainDuration != null) {
-      _start_1(when, grainOffset, grainDuration);
-      return;
-    }
-    if (grainOffset != null) {
-      _start_2(when, grainOffset);
-      return;
-    }
-    if (when != null) {
-      _start_3(when);
-      return;
-    }
-    _start_4();
-    return;
-  }
+  void start([num when, num grainOffset, num grainDuration]) => _blink.Native_AudioBufferSourceNode_start(this, when, grainOffset, grainDuration);
 
-  void _start_1(when, grainOffset, grainDuration) => _blink.Native_AudioBufferSourceNode__start_1_Callback(this, when, grainOffset, grainDuration);
-
-  void _start_2(when, grainOffset) => _blink.Native_AudioBufferSourceNode__start_2_Callback(this, when, grainOffset);
-
-  void _start_3(when) => _blink.Native_AudioBufferSourceNode__start_3_Callback(this, when);
-
-  void _start_4() => _blink.Native_AudioBufferSourceNode__start_4_Callback(this);
-
-  void stop([num when]) {
-    if (when != null) {
-      _stop_1(when);
-      return;
-    }
-    _stop_2();
-    return;
-  }
-
-  void _stop_1(when) => _blink.Native_AudioBufferSourceNode__stop_1_Callback(this, when);
-
-  void _stop_2() => _blink.Native_AudioBufferSourceNode__stop_2_Callback(this);
+  void stop([num when]) => _blink.Native_AudioBufferSourceNode_stop(this, when);
 
   /// Stream of `ended` events handled by this [AudioBufferSourceNode].
   @DomName('AudioBufferSourceNode.onended')
@@ -300,12 +266,7 @@
 
   @DomName('AudioContext.AudioContext')
   @DocsEditable()
-  factory AudioContext() {
-    return AudioContext._create_1();
-  }
-
-  @DocsEditable()
-  static AudioContext _create_1() => _blink.Native_AudioContext__create_1constructorCallback();
+  factory AudioContext() => _blink.Native_AudioContext_AudioContext();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
@@ -350,53 +311,17 @@
   @DocsEditable()
   AudioBufferSourceNode createBufferSource() => _blink.Native_AudioContext_createBufferSource_Callback(this);
 
-  ChannelMergerNode createChannelMerger([int numberOfInputs]) {
-    if (numberOfInputs != null) {
-      return _createChannelMerger_1(numberOfInputs);
-    }
-    return _createChannelMerger_2();
-  }
+  ChannelMergerNode createChannelMerger([int numberOfInputs]) => _blink.Native_AudioContext_createChannelMerger(this, numberOfInputs);
 
-  ChannelMergerNode _createChannelMerger_1(numberOfInputs) => _blink.Native_AudioContext__createChannelMerger_1_Callback(this, numberOfInputs);
-
-  ChannelMergerNode _createChannelMerger_2() => _blink.Native_AudioContext__createChannelMerger_2_Callback(this);
-
-  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) {
-    if (numberOfOutputs != null) {
-      return _createChannelSplitter_1(numberOfOutputs);
-    }
-    return _createChannelSplitter_2();
-  }
-
-  ChannelSplitterNode _createChannelSplitter_1(numberOfOutputs) => _blink.Native_AudioContext__createChannelSplitter_1_Callback(this, numberOfOutputs);
-
-  ChannelSplitterNode _createChannelSplitter_2() => _blink.Native_AudioContext__createChannelSplitter_2_Callback(this);
+  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) => _blink.Native_AudioContext_createChannelSplitter(this, numberOfOutputs);
 
   @DomName('AudioContext.createConvolver')
   @DocsEditable()
   ConvolverNode createConvolver() => _blink.Native_AudioContext_createConvolver_Callback(this);
 
-  DelayNode createDelay([num maxDelayTime]) {
-    if (maxDelayTime != null) {
-      return _createDelay_1(maxDelayTime);
-    }
-    return _createDelay_2();
-  }
+  DelayNode createDelay([num maxDelayTime]) => _blink.Native_AudioContext_createDelay(this, maxDelayTime);
 
-  DelayNode _createDelay_1(maxDelayTime) => _blink.Native_AudioContext__createDelay_1_Callback(this, maxDelayTime);
-
-  DelayNode _createDelay_2() => _blink.Native_AudioContext__createDelay_2_Callback(this);
-
-  DelayNode createDelayNode([num maxDelayTime]) {
-    if (maxDelayTime != null) {
-      return _createDelayNode_1(maxDelayTime);
-    }
-    return _createDelayNode_2();
-  }
-
-  DelayNode _createDelayNode_1(maxDelayTime) => _blink.Native_AudioContext__createDelayNode_1_Callback(this, maxDelayTime);
-
-  DelayNode _createDelayNode_2() => _blink.Native_AudioContext__createDelayNode_2_Callback(this);
+  DelayNode createDelayNode([num maxDelayTime]) => _blink.Native_AudioContext_createDelayNode(this, maxDelayTime);
 
   @DomName('AudioContext.createDynamicsCompressor')
   @DocsEditable()
@@ -410,21 +335,7 @@
   @DocsEditable()
   GainNode createGainNode() => _blink.Native_AudioContext_createGainNode_Callback(this);
 
-  ScriptProcessorNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) {
-    if (numberOfOutputChannels != null) {
-      return _createJavaScriptNode_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
-    }
-    if (numberOfInputChannels != null) {
-      return _createJavaScriptNode_2(bufferSize, numberOfInputChannels);
-    }
-    return _createJavaScriptNode_3(bufferSize);
-  }
-
-  ScriptProcessorNode _createJavaScriptNode_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) => _blink.Native_AudioContext__createJavaScriptNode_1_Callback(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
-
-  ScriptProcessorNode _createJavaScriptNode_2(bufferSize, numberOfInputChannels) => _blink.Native_AudioContext__createJavaScriptNode_2_Callback(this, bufferSize, numberOfInputChannels);
-
-  ScriptProcessorNode _createJavaScriptNode_3(bufferSize) => _blink.Native_AudioContext__createJavaScriptNode_3_Callback(this, bufferSize);
+  ScriptProcessorNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) => _blink.Native_AudioContext_createJavaScriptNode(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
 
   @DomName('AudioContext.createMediaElementSource')
   @DocsEditable()
@@ -451,26 +362,7 @@
   @Experimental() // untriaged
   PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => _blink.Native_AudioContext_createPeriodicWave_Callback(this, real, imag);
 
-  ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) {
-    if (numberOfOutputChannels != null) {
-      return _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
-    }
-    if (numberOfInputChannels != null) {
-      return _createScriptProcessor_2(bufferSize, numberOfInputChannels);
-    }
-    if (bufferSize != null) {
-      return _createScriptProcessor_3(bufferSize);
-    }
-    return _createScriptProcessor_4();
-  }
-
-  ScriptProcessorNode _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) => _blink.Native_AudioContext__createScriptProcessor_1_Callback(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
-
-  ScriptProcessorNode _createScriptProcessor_2(bufferSize, numberOfInputChannels) => _blink.Native_AudioContext__createScriptProcessor_2_Callback(this, bufferSize, numberOfInputChannels);
-
-  ScriptProcessorNode _createScriptProcessor_3(bufferSize) => _blink.Native_AudioContext__createScriptProcessor_3_Callback(this, bufferSize);
-
-  ScriptProcessorNode _createScriptProcessor_4() => _blink.Native_AudioContext__createScriptProcessor_4_Callback(this);
+  ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) => _blink.Native_AudioContext_createScriptProcessor(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
 
   @DomName('AudioContext.createWaveShaper')
   @DocsEditable()
@@ -631,21 +523,7 @@
   @DocsEditable()
   int get numberOfOutputs => _blink.Native_AudioNode_numberOfOutputs_Getter(this);
 
-  void _connect(destination, int output, [int input]) {
-    if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
-      _connect_1(destination, output, input);
-      return;
-    }
-    if ((output is int || output == null) && (destination is AudioParam || destination == null) && input == null) {
-      _connect_2(destination, output);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void _connect_1(destination, output, input) => _blink.Native_AudioNode__connect_1_Callback(this, destination, output, input);
-
-  void _connect_2(destination, output) => _blink.Native_AudioNode__connect_2_Callback(this, destination, output);
+  void _connect(destination, int output, [int input]) => _blink.Native_AudioNode__connect(this, destination, output, input);
 
   @DomName('AudioNode.disconnect')
   @DocsEditable()
@@ -1101,12 +979,7 @@
 
   @DomName('OfflineAudioContext.OfflineAudioContext')
   @DocsEditable()
-  factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) {
-    return OfflineAudioContext._create_1(numberOfChannels, numberOfFrames, sampleRate);
-  }
-
-  @DocsEditable()
-  static OfflineAudioContext _create_1(numberOfChannels, numberOfFrames, sampleRate) => _blink.Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate);
+  factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.Native_OfflineAudioContext_OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1184,31 +1057,9 @@
   @Experimental() // untriaged
   void setPeriodicWave(PeriodicWave periodicWave) => _blink.Native_OscillatorNode_setPeriodicWave_Callback(this, periodicWave);
 
-  void start([num when]) {
-    if (when != null) {
-      _start_1(when);
-      return;
-    }
-    _start_2();
-    return;
-  }
+  void start([num when]) => _blink.Native_OscillatorNode_start(this, when);
 
-  void _start_1(when) => _blink.Native_OscillatorNode__start_1_Callback(this, when);
-
-  void _start_2() => _blink.Native_OscillatorNode__start_2_Callback(this);
-
-  void stop([num when]) {
-    if (when != null) {
-      _stop_1(when);
-      return;
-    }
-    _stop_2();
-    return;
-  }
-
-  void _stop_1(when) => _blink.Native_OscillatorNode__stop_1_Callback(this, when);
-
-  void _stop_2() => _blink.Native_OscillatorNode__stop_2_Callback(this);
+  void stop([num when]) => _blink.Native_OscillatorNode_stop(this, when);
 
   /// Stream of `ended` events handled by this [OscillatorNode].
   @DomName('OscillatorNode.onended')
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index ea55cda..4b55e83 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -2325,27 +2325,7 @@
   @DocsEditable()
   void bufferByteData(int target, ByteBuffer data, int usage) => _blink.Native_WebGLRenderingContext_bufferByteData_Callback(this, target, data, usage);
 
-  void bufferData(int target, data_OR_size, int usage) {
-    if ((usage is int || usage == null) && (data_OR_size is TypedData || data_OR_size == null) && (target is int || target == null)) {
-      _bufferData_1(target, data_OR_size, usage);
-      return;
-    }
-    if ((usage is int || usage == null) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int || target == null)) {
-      _bufferData_2(target, data_OR_size, usage);
-      return;
-    }
-    if ((usage is int || usage == null) && (data_OR_size is int || data_OR_size == null) && (target is int || target == null)) {
-      _bufferData_3(target, data_OR_size, usage);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void _bufferData_1(target, data_OR_size, usage) => _blink.Native_WebGLRenderingContext__bufferData_1_Callback(this, target, data_OR_size, usage);
-
-  void _bufferData_2(target, data_OR_size, usage) => _blink.Native_WebGLRenderingContext__bufferData_2_Callback(this, target, data_OR_size, usage);
-
-  void _bufferData_3(target, data_OR_size, usage) => _blink.Native_WebGLRenderingContext__bufferData_3_Callback(this, target, data_OR_size, usage);
+  void bufferData(int target, data_OR_size, int usage) => _blink.Native_WebGLRenderingContext_bufferData(this, target, data_OR_size, usage);
 
   @DomName('WebGLRenderingContext.bufferDataTyped')
   @DocsEditable()
@@ -2355,21 +2335,7 @@
   @DocsEditable()
   void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.Native_WebGLRenderingContext_bufferSubByteData_Callback(this, target, offset, data);
 
-  void bufferSubData(int target, int offset, data) {
-    if ((data is TypedData || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
-      _bufferSubData_1(target, offset, data);
-      return;
-    }
-    if ((data is ByteBuffer || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
-      _bufferSubData_2(target, offset, data);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void _bufferSubData_1(target, offset, data) => _blink.Native_WebGLRenderingContext__bufferSubData_1_Callback(this, target, offset, data);
-
-  void _bufferSubData_2(target, offset, data) => _blink.Native_WebGLRenderingContext__bufferSubData_2_Callback(this, target, offset, data);
+  void bufferSubData(int target, int offset, data) => _blink.Native_WebGLRenderingContext_bufferSubData(this, target, offset, data);
 
   @DomName('WebGLRenderingContext.bufferSubDataTyped')
   @DocsEditable()
@@ -2723,39 +2689,7 @@
   @DocsEditable()
   void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.Native_WebGLRenderingContext_stencilOpSeparate_Callback(this, face, fail, zfail, zpass);
 
-  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) {
-    if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (format is int || format == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null)) {
-      _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
-      return;
-    }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) => _blink.Native_WebGLRenderingContext__texImage2D_1_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
-
-  void _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_2_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-
-  void _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_3_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-
-  void _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_4_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-
-  void _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_5_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) => _blink.Native_WebGLRenderingContext_texImage2D(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texImage2DCanvas')
   @DocsEditable()
@@ -2781,39 +2715,7 @@
   @DocsEditable()
   void texParameteri(int target, int pname, int param) => _blink.Native_WebGLRenderingContext_texParameteri_Callback(this, target, pname, param);
 
-  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) {
-    if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null)) {
-      _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
-      return;
-    }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) => _blink.Native_WebGLRenderingContext__texSubImage2D_1_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
-
-  void _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_2_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-
-  void _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_3_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-
-  void _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_4_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-
-  void _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_5_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) => _blink.Native_WebGLRenderingContext_texSubImage2D(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
 
   @DomName('WebGLRenderingContext.texSubImage2DCanvas')
   @DocsEditable()
diff --git a/site/try/build_try.gyp b/site/try/build_try.gyp
index b62178e..654fce0 100644
--- a/site/try/build_try.gyp
+++ b/site/try/build_try.gyp
@@ -25,6 +25,7 @@
         'try_dart_static_files': [
           'index.html',
           'dartlang-style.css',
+          'line_numbers.css',
           'iframe.html',
           'iframe.js',
           'dart-icon.png', # iOS icon.
diff --git a/site/try/index.html b/site/try/index.html
index 63cdacd..4e5805c 100644
--- a/site/try/index.html
+++ b/site/try/index.html
@@ -14,8 +14,10 @@
 
 See: http://www.google.com/fonts#UsePlace:use/Collection:Open+Sans:400,600,700,800,300
 -->
+<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
 <link href='http://fonts.googleapis.com/css?family=Open+Sans:400,600,700,800,300' rel='stylesheet' type='text/css'>
 <link rel="stylesheet" type="text/css" href="dartlang-style.css">
+<link rel="alternate stylesheet" type="text/css" href="line_numbers.css" title="line_numbers">
 <style>
 a.diagnostic {
   /* position: relative; */
@@ -148,7 +150,16 @@
   height: auto;
 }
 
+.mainEditorPane {
+  overflow-y: auto;
+  overflow-x: hidden;
+  white-space: pre;
+  max-height: 80vh;
+}
 
+.lineNumber {
+  position: relative;
+}
 </style>
 
 <meta itemprop="name" content="Try Dart!">
@@ -201,7 +212,7 @@
 <a class="brand" href="//www.dartlang.org/" title="Dart Homepage" target="_blank">
 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJxQTFRFAAAAAIvMdsvDAIvMdsvDAIvMdsvDLaTJAIvMOqnHdsvDAIvMdsvDAIvMKaLJdsvDAIvMAIvMdsvDAIvMdsvDdsvDAIvMAIvMAZnFdsvDAILHAIPHAITIAIXJAIfKAIjKAIrLAIrMAIvMAJXHAJjFC5i/I6HENr2yOb6zPr+0TsK4UsO5WbnEWcW8Xsa9Yse+Zsi/asjAc8rCdsvDdt4SRQAAABp0Uk5TABAQICAwMFBgYGBwcICAgI+vr7+/z9/v7+97IXGnAAAAqUlEQVQYV13QxxaCQBBE0VZkjBgAGVEBaVEUM/P//yaTGg5vV3dZANTCZ9BvFAoR93kVC9FnthW6uIPTJ7UkdHaXvS2LXKNBURInyDXPsShbzjU7XCpxhooDVGo5QcQAJmjUco64AY/UcIrowYCTaj5KBZeTaj5JBTc6l11OlQKMf497y1ahefFb3TQfcqtM/fipJF/X9gnDon6/ah/aDDfNOgosNA2b8QdGciZlh/U93AAAAABJRU5ErkJggg==" alt="Dart">
 </a>
-<ul class="nav pull-right"><li><a href="#" id="settings"><i class="icon-cog"></i></a></li></ul>
+<ul class="nav pull-right"><li><a href="https://code.google.com/p/dart/issues/entry?template=Try+Dart+Bug" target="_blank"><i class="fa fa-bug"></i></a></li><li><a href="#" id="settings"><i class="icon-cog"></i></a></li></ul>
 
 <ul class="nav hidden-phone">
 <li class="active"><a>Try Dart!</a></li>
diff --git a/site/try/line_numbers.css b/site/try/line_numbers.css
new file mode 100644
index 0000000..786d555
--- /dev/null
+++ b/site/try/line_numbers.css
@@ -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.
+ */
+
+.mainEditorPane {
+  padding: 0px;
+  counter-reset: dart-line-number;
+}
+
+.lineNumber {
+  padding-left: 3.5em;
+}
+
+.lineNumber:before {
+  counter-increment: dart-line-number;
+  content: counter(dart-line-number) " ";
+  position: absolute;
+  left: 0px;
+  width: 3em;
+  text-align: right;
+  background-color: lightgoldenrodyellow;
+}
diff --git a/site/try/nossl.appcache b/site/try/nossl.appcache
index d5218a3..07be94d 100644
--- a/site/try/nossl.appcache
+++ b/site/try/nossl.appcache
@@ -8,6 +8,7 @@
 CACHE:
 index.html
 dartlang-style.css
+line_numbers.css
 leap.dart.js
 
 iframe.html
diff --git a/site/try/project_server.dart b/site/try/project_server.dart
index d71d870..08c5d56 100644
--- a/site/try/project_server.dart
+++ b/site/try/project_server.dart
@@ -7,7 +7,8 @@
 import 'dart:io';
 
 import 'dart:async' show
-    Future;
+    Future,
+    Stream;
 
 import 'dart:convert' show
     HtmlEscape,
@@ -145,12 +146,6 @@
     response.close();
   }
 
-  redirect(String location) {
-    response.statusCode = HttpStatus.FOUND;
-    response.headers.add(HttpHeaders.LOCATION, location);
-    response.close();
-  }
-
   badRequest(String problem) {
     response.statusCode = HttpStatus.BAD_REQUEST;
     response.write(htmlInfo("Bad request",
diff --git a/site/try/src/cache.dart b/site/try/src/cache.dart
index fd4cce0..a61ec0a 100644
--- a/site/try/src/cache.dart
+++ b/site/try/src/cache.dart
@@ -20,21 +20,30 @@
 
 /// Called when the window has finished loading.
 void onLoad(Event event) {
-  window.applicationCache.onUpdateReady.listen((_) => updateCacheStatus());
-  window.applicationCache.onCached.listen((_) => updateCacheStatus());
-  window.applicationCache.onChecking.listen((_) => updateCacheStatus());
-  window.applicationCache.onDownloading.listen((_) => updateCacheStatus());
-  window.applicationCache.onError.listen((_) => updateCacheStatus());
-  window.applicationCache.onNoUpdate.listen((_) => updateCacheStatus());
-  window.applicationCache.onObsolete.listen((_) => updateCacheStatus());
+  if (!ApplicationCache.supported) return;
+  window.applicationCache.onUpdateReady.listen(updateCacheStatus);
+  window.applicationCache.onCached.listen(updateCacheStatus);
+  window.applicationCache.onChecking.listen(updateCacheStatus);
+  window.applicationCache.onDownloading.listen(updateCacheStatus);
+  window.applicationCache.onError.listen(updateCacheStatus);
+  window.applicationCache.onNoUpdate.listen(updateCacheStatus);
+  window.applicationCache.onObsolete.listen(updateCacheStatus);
   window.applicationCache.onProgress.listen(onCacheProgress);
 }
 
-onCacheProgress(ProgressEvent event) {
-  if (!event.lengthComputable) {
-    updateCacheStatus();
-    return;
+void onCacheProgress(Event event) {
+  if (event is ProgressEvent) {
+    // Firefox doesn't fire a ProgressEvent on cache progress.  Just a plain
+    // Event with type == "progress".
+    if (event.lengthComputable) {
+      updateCacheStatusFromEvent(event);
+      return;
+    }
   }
+  updateCacheStatus(null);
+}
+
+void updateCacheStatusFromEvent(ProgressEvent event) {
   cacheStatusElement.nodes.clear();
   cacheStatusElement.appendText('Downloading SDK ');
   var progress = '${event.loaded} of ${event.total}';
@@ -62,7 +71,7 @@
   return '?';
 }
 
-void updateCacheStatus() {
+void updateCacheStatus(_) {
   cacheStatusElement.nodes.clear();
   int status = window.applicationCache.status;
   if (status == ApplicationCache.UPDATEREADY) {
diff --git a/site/try/src/compilation.dart b/site/try/src/compilation.dart
index 3f6fbaf..1bc432d 100644
--- a/site/try/src/compilation.dart
+++ b/site/try/src/compilation.dart
@@ -293,7 +293,10 @@
   void consolePrint(message) {
     if (window.parent != window) {
       // Test support.
-      window.parent.postMessage('$message\n', '/');
+      // TODO(ahe): Use '/' instead of '*' when Firefox is upgraded to version
+      // 30 across build bots.  Support for '/' was added in version 29, and we
+      // support the two most recent versions.
+      window.parent.postMessage('$message\n', '*');
     }
     console.appendText('$message\n');
   }
diff --git a/site/try/src/editor.dart b/site/try/src/editor.dart
index d330a7b..9072ef8 100644
--- a/site/try/src/editor.dart
+++ b/site/try/src/editor.dart
@@ -27,6 +27,9 @@
     info,
     warning;
 
+import 'selection.dart' show
+    isCollapsed;
+
 const String INDENT = '\u{a0}\u{a0}';
 
 Set<String> seenIdentifiers;
@@ -106,7 +109,7 @@
 /// exists.
 Element getElementAtSelection() {
   Selection selection = window.getSelection();
-  if (!selection.isCollapsed) return null;
+  if (!isCollapsed(selection)) return null;
   var anchorNode = selection.anchorNode;
   if (!mainEditorPane.contains(anchorNode)) return null;
   if (mainEditorPane == anchorNode) return null;
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index a59cf4e..4d4dd24 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -21,7 +21,9 @@
     EOF_TOKEN,
     ErrorToken,
     StringScanner,
-    Token;
+    Token,
+    UnmatchedToken,
+    UnterminatedToken;
 
 import 'package:compiler/implementation/source_file.dart' show
     StringSourceFile;
@@ -53,7 +55,8 @@
     CompilationUnit;
 
 import 'selection.dart' show
-    TrySelection;
+    TrySelection,
+    isCollapsed;
 
 import 'editor.dart' as editor;
 
@@ -61,6 +64,10 @@
 
 import 'settings.dart' as settings;
 
+const String TRY_DART_NEW_DEFECT =
+    'https://code.google.com/p/dart/issues/entry'
+    '?template=Try+Dart+Internal+Error';
+
 /**
  * UI interaction manager for the entire application.
  */
@@ -85,6 +92,8 @@
 
   void onInput(Event event);
 
+  // TODO(ahe): Rename to onKeyDown (as it is called in response to keydown
+  // event).
   void onKeyUp(KeyboardEvent event);
 
   void onMutation(List<MutationRecord> mutations, MutationObserver observer);
@@ -127,7 +136,33 @@
   void onKeyUp(KeyboardEvent event) => state.onKeyUp(event);
 
   void onMutation(List<MutationRecord> mutations, MutationObserver observer) {
-    return state.onMutation(mutations, observer);
+    try {
+      try {
+        return state.onMutation(mutations, observer);
+      } finally {
+        // Discard any mutations during the observer, as these can lead to
+        // infinite loop.
+        observer.takeRecords();
+      }
+    } catch (error, stackTrace) {
+      try {
+        editor.isMalformedInput = true;
+        outputDiv
+            ..nodes.clear()
+            ..append(new HeadingElement.h1()..appendText('Internal Error'))
+            ..appendText('We would appreciate if you take a moment to report '
+                         'this at ')
+            ..append(
+                new AnchorElement(href: TRY_DART_NEW_DEFECT)
+                    ..target = '_blank'
+                    ..appendText(TRY_DART_NEW_DEFECT))
+            ..appendText('\nError and stack trace:\n$error\n')
+            ..appendText('$stackTrace\n');
+      } catch (e) {
+        // Double faults ignored.
+      }
+      rethrow;
+    }
   }
 
   void onSelectionChange(Event event) => state.onSelectionChange(event);
@@ -195,13 +230,28 @@
   void onUnmodifiedKeyUp(KeyboardEvent event) {
     switch (event.keyCode) {
       case KeyCode.ENTER: {
-        event.preventDefault();
         Selection selection = window.getSelection();
-        if (selection.isCollapsed && selection.anchorNode is Text) {
-          Text text = selection.anchorNode;
-          int offset = selection.anchorOffset;
-          text.insertData(offset, '\n');
-          selection.collapse(text, offset + 1);
+        if (isCollapsed(selection)) {
+          event.preventDefault();
+          Node node = selection.anchorNode;
+          if (node is Text) {
+            Text text = node;
+            int offset = selection.anchorOffset;
+            // If at end-of-file, insert an extra newline.  The the extra
+            // newline ensures that the next line isn't empty.  At least Chrome
+            // behaves as if "\n" is just a single line. "\nc" (where c is any
+            // character) is two lines, according to Chrome.
+            String newline = isAtEndOfFile(text, offset) ? '\n\n' : '\n';
+            text.insertData(offset, newline);
+            selection.collapse(text, offset + 1);
+          } else if (node is Element) {
+            node.appendText('\n\n');
+            selection.collapse(node.firstChild, 1);
+          } else {
+            window.console
+                ..error('Unexpected node')
+                ..dir(node);
+          }
         }
         break;
       }
@@ -229,8 +279,46 @@
     Selection selection = window.getSelection();
     TrySelection trySelection = new TrySelection(mainEditorPane, selection);
 
+    Set<Node> normalizedNodes = new Set<Node>();
     for (MutationRecord record in mutations) {
-      normalizeMutationRecord(record, trySelection);
+      normalizeMutationRecord(record, trySelection, normalizedNodes);
+    }
+
+    if (normalizedNodes.length == 1) {
+      Node node = normalizedNodes.single;
+      if (node is Element && node.classes.contains('lineNumber')) {
+        print('Single line change: ${node.outerHtml}');
+
+        String currentText = node.text;
+
+        trySelection = new TrySelection(node, selection);
+        trySelection.updateText(currentText);
+
+        editor.isMalformedInput = false;
+        int offset = 0;
+        List<Node> nodes = <Node>[];
+
+        String state = '';
+        Element previousLine = node.previousElementSibling;
+        if (previousLine != null) {
+          state = previousLine.getAttribute('dart-state');
+        }
+        for (String line in splitLines(currentText)) {
+          List<Node> lineNodes = <Node>[];
+          state = tokenizeAndHighlight(
+              line, state, offset, trySelection, lineNodes);
+          offset += line.length;
+          nodes.add(makeLine(lineNodes, state));
+        }
+
+        node.parent.insertAllBefore(nodes, node);
+        node.remove();
+        trySelection.adjust(selection);
+
+        // Discard highlighting mutations.
+        observer.takeRecords();
+        return;
+      }
     }
 
     String currentText = mainEditorPane.text;
@@ -244,7 +332,14 @@
     int offset = 0;
     List<Node> nodes = <Node>[];
 
-    tokenizeAndHighlight(currentText, offset, trySelection, nodes);
+    String state = '';
+    for (String line in splitLines(currentText)) {
+      List<Node> lineNodes = <Node>[];
+      state =
+          tokenizeAndHighlight(line, state, offset, trySelection, lineNodes);
+      offset += line.length;
+      nodes.add(makeLine(lineNodes, state));
+    }
 
     mainEditorPane
         ..nodes.clear()
@@ -670,63 +765,133 @@
       event.getModifierState("OS");
 }
 
-void tokenizeAndHighlight(String currentText,
-                          int offset,
-                          TrySelection trySelection,
-                          List<Node> nodes) {
+String tokenizeAndHighlight(String line,
+                            String state,
+                            int start,
+                            TrySelection trySelection,
+                            List<Node> nodes) {
+  String newState = '';
+  int offset = state.length;
+  int adjustedStart = start - state.length;
+
   //   + offset  + charOffset  + globalOffset   + (charOffset + charCount)
   //   v         v             v                v
   // do          identifier_abcdefghijklmnopqrst
-  for (Token token = tokenize(currentText);
+  for (Token token = tokenize('$state$line');
        token.kind != EOF_TOKEN;
        token = token.next) {
     int charOffset = token.charOffset;
     int charCount = token.charCount;
 
-    if (charOffset < offset) continue; // Happens for scanner errors.
-
-    Decoration decoration = editor.getDecoration(token);
-
-    Token follow = token.next;
-    if (token is BeginGroupToken) {
-      follow = token.endGroup.next;
+    Token tokenToDecorate = token;
+    if (token is UnterminatedToken && isUnterminatedMultiLineToken(token)) {
+      newState += '${token.start}';
+      continue; // This might not be an error.
+    } else {
+      Token follow = token.next;
+      if (token is BeginGroupToken && token.endGroup != null) {
+        follow = token.endGroup.next;
+      }
+      if (follow is ErrorToken && follow.charOffset == token.charOffset) {
+        if (follow is UnmatchedToken) {
+          newState += '${follow.begin.value}';
+        } else {
+          tokenToDecorate = follow;
+        }
+      }
     }
-    if (follow is ErrorToken) {
-      decoration = editor.getDecoration(follow);
+
+    if (charOffset < offset) {
+      // Happens for scanner errors, or for the [state] prefix.
+      continue;
     }
 
+    Decoration decoration = editor.getDecoration(tokenToDecorate);
+
     if (decoration == null) continue;
 
     // Add a node for text before current token.
-    trySelection.addNodeFromSubstring(offset, charOffset, nodes);
+    trySelection.addNodeFromSubstring(
+        adjustedStart + offset, adjustedStart + charOffset, nodes);
 
     // Add a node for current token.
     trySelection.addNodeFromSubstring(
-        charOffset, charOffset + charCount, nodes, decoration);
+        adjustedStart + charOffset,
+        adjustedStart + charOffset + charCount, nodes, decoration);
 
     offset = charOffset + charCount;
   }
 
   // Add a node for anything after the last (decorated) token.
-  trySelection.addNodeFromSubstring(offset, currentText.length, nodes);
+  trySelection.addNodeFromSubstring(
+      adjustedStart + offset, start + line.length, nodes);
 
-  // Ensure text always ends with a newline.
-  if (!currentText.endsWith('\n')) {
-    nodes.add(new Text('\n'));
-  }
+  return newState;
 }
 
-void normalizeMutationRecord(MutationRecord record, TrySelection selection) {
-  if (record.addedNodes.isEmpty) return;
+bool isUnterminatedMultiLineToken(UnterminatedToken token) {
+  return
+      token.start == '/*' ||
+      token.start == "'''" ||
+      token.start == '"""' ||
+      token.start == "r'''" ||
+      token.start == 'r"""';
+}
+
+void normalizeMutationRecord(MutationRecord record,
+                             TrySelection selection,
+                             Set<Node> normalizedNodes) {
   for (Node node in record.addedNodes) {
     if (node.parent == null) continue;
     StringBuffer buffer = new StringBuffer();
     int selectionOffset = htmlToText(node, buffer, selection);
     Text newNode = new Text('$buffer');
     node.replaceWith(newNode);
+    normalizedNodes.add(findLine(newNode));
     if (selectionOffset != -1) {
       selection.anchorNode = newNode;
       selection.anchorOffset = selectionOffset;
     }
   }
+  if (!record.removedNodes.isEmpty) {
+    normalizedNodes.add(findLine(record.target));
+  }
+  if (record.type == "characterData") {
+    normalizedNodes.add(findLine(record.target));
+  }
+}
+
+// Finds the line of [node] (a parent node with CSS class 'lineNumber').
+// If no such parent exists, return mainEditorPane if it is a parent.
+// Otherwise return [node].
+Node findLine(Node node) {
+  for (Node n = node; n != null; n = n.parent) {
+    if (n is Element && n.classes.contains('lineNumber')) return n;
+    if (n == mainEditorPane) return n;
+  }
+  return node;
+}
+
+Element makeLine(List<Node> lineNodes, String state) {
+  // Using a div element here (anything with display=block) generally messes up
+  // editing and navigation.  We would like to use a block element here so
+  // error messages show as expected.  But no such luck.  Fortunately, there
+  // are strong indications that the current solution for displaying errors
+  // isn't good enough anyways.
+  return new SpanElement()
+      ..setAttribute('dart-state', state)
+      ..nodes.addAll(lineNodes)
+      ..classes.add('lineNumber');
+}
+
+bool isAtEndOfFile(Text text, int offset) {
+  Node line = findLine(text);
+  return
+      line.nextNode == null &&
+      text.parent.nextNode == null &&
+      offset == text.length;
+}
+
+List<String> splitLines(String text) {
+  return text.split(new RegExp('^', multiLine: true));
 }
diff --git a/site/try/src/selection.dart b/site/try/src/selection.dart
index 35e17a8..7551b59 100644
--- a/site/try/src/selection.dart
+++ b/site/try/src/selection.dart
@@ -23,8 +23,8 @@
   int globalOffset = -1;
 
   TrySelection(this.root, Selection selection)
-      : this.anchorNode = selection.isCollapsed ? selection.anchorNode : null,
-        this.anchorOffset = selection.isCollapsed ? selection.anchorOffset : -1;
+      : anchorNode = isCollapsed(selection) ? selection.anchorNode : null,
+        anchorOffset = isCollapsed(selection) ? selection.anchorOffset : -1;
 
   Text addNodeFromSubstring(int start,
                             int end,
@@ -34,7 +34,7 @@
 
     Text textNode = new Text(text.substring(start, end));
 
-    if (start <= globalOffset && globalOffset < end) {
+    if (start <= globalOffset && globalOffset <= end) {
       anchorNode = textNode;
       anchorOffset = globalOffset - start;
     }
@@ -74,3 +74,9 @@
     return -1;
   }
 }
+
+bool isCollapsed(Selection selection) {
+  // Firefox and Chrome don't agree on if the selection is collapsed if there
+  // is no node selected.
+  return selection.isCollapsed && selection.anchorNode != null;
+}
diff --git a/site/try/src/ui.dart b/site/try/src/ui.dart
index e9b66d6..1fefeb8 100644
--- a/site/try/src/ui.dart
+++ b/site/try/src/ui.dart
@@ -104,11 +104,9 @@
   buildCode(interaction);
 
   (mainEditorPane = new DivElement())
-      ..classes.add('well')
+      ..classes.addAll(['well', 'mainEditorPane'])
       ..style.backgroundColor = currentTheme.background.color
       ..style.color = currentTheme.foreground.color
-      ..style.overflow = 'visible'
-      ..style.whiteSpace = 'pre'
       ..style.font = codeFont
       ..spellcheck = false;
 
@@ -179,7 +177,7 @@
       ..appendText('Save');
 
   cacheStatusElement = document.getElementById('appcache-status');
-  updateCacheStatus();
+  updateCacheStatus(null);
 
   var section = document.querySelector('article[class="homepage"]>section');
 
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 6f062d4..0d27176 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -119,8 +119,6 @@
 
 #co19 issue 680
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t04: StaticWarning
-Language/12_Expressions/30_Identifier_Reference_A07_t01: StaticWarning
-Language/12_Expressions/30_Identifier_Reference_A16_t01: StaticWarning
 
 # co19 roll to r706: Please triage all these issues.
 Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t03: StaticWarning # co19-roll r706: Please triage this failure.
@@ -195,9 +193,9 @@
 LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: CompileTimeError
+LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: StaticWarning
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: StaticWarning
 LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTableElement/createCaption_t01: StaticWarning # co19-roll r722: Please triage this failure.
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index be6e51e..4fdf01d 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -936,7 +936,7 @@
 LibTest/math/log_A01_t01: Fail # TODO(dart2js-team): Please triage this failure.
 
 
-[ $compiler == dart2js && ($runtime == ie10 || $runtime == ff || $runtime == chrome || $runtime == drt || $runtime == safari || $runtime == opera) ]
+[ $compiler == dart2js && ($runtime == ie10 || $runtime == ff || $runtime == chrome || $runtime == drt || $runtime == safari || $runtime == safarimobilesim || $runtime == opera ) ]
 *: Skip
 
 #
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index c72b315..08cfe6b 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -7,7 +7,6 @@
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 # Something is breaking browser_test.dart in the test infrastructure in these tests. Issue 18558.
-LayoutTests/fast/dom/HTMLS*: Skip # Issue 18558
 LayoutTests/fast/dom/HTMLB*: Skip # Issue 18558
 
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index fc5f230..3b8578d 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -19,6 +19,9 @@
   // Helper methods for debugging should never be called from production code:
   "implementation/helpers/": const [" is never "],
   "implementation/util/setlet.dart": const [" is never "],
+  
+  // Some things in dart_printer are not yet used
+  "implementation/dart_backend/dart_printer.dart" : const [" is never "]
 };
 
 void main() {
diff --git a/tests/compiler/dart2js/bad_output_io_test.dart b/tests/compiler/dart2js/bad_output_io_test.dart
index f8ec58b..ebc3a6d 100644
--- a/tests/compiler/dart2js/bad_output_io_test.dart
+++ b/tests/compiler/dart2js/bad_output_io_test.dart
@@ -8,7 +8,6 @@
 
 import 'dart:io' show exit;
 import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
 
 import '../../../sdk/lib/_internal/compiler/compiler.dart'
        show Diagnostic;
@@ -45,6 +44,10 @@
   void call(Uri uri, int begin, int end, String message, kind) {
     diagnosticHandler(uri, begin, end, message, kind);
   }
+
+  String prefixMessage(String message, Diagnostic kind) {
+    return message;
+  }
 }
 
 testOutputProvider(script, libraryRoot, packageRoot, inputProvider, handler,
@@ -56,8 +59,9 @@
 void main() {
   compileFunc = testOutputProvider;
   exitFunc = (exitCode) {
-    Expect.equals(1, diagnosticHandler.messages.length);
-    var message = diagnosticHandler.messages[0];
+    CollectingFormattingDiagnosticHandler handler = diagnosticHandler;
+    Expect.equals(1, handler.messages.length);
+    var message = handler.messages[0];
     Expect.isTrue(message[0].contains("Cannot open file"));
     Expect.equals(Diagnostic.ERROR, message[1]);
     Expect.equals(1, exitCode);
diff --git a/tests/compiler/dart2js/begin_end_token_test.dart b/tests/compiler/dart2js/begin_end_token_test.dart
index 34d18a6..355bbb5 100644
--- a/tests/compiler/dart2js/begin_end_token_test.dart
+++ b/tests/compiler/dart2js/begin_end_token_test.dart
@@ -25,7 +25,8 @@
 }
 
 Node testExpression(String text, [String alternate]) {
-  var node = parseStatement('$text;').expression;
+  ExpressionStatement statement = parseStatement('$text;');
+  Expression node = statement.expression;
   testNode(node, alternate == null ? text : alternate, text);
   return node;
 }
diff --git a/tests/compiler/dart2js/codegen_helper.dart b/tests/compiler/dart2js/codegen_helper.dart
index 20a8f0a..be3029c 100644
--- a/tests/compiler/dart2js/codegen_helper.dart
+++ b/tests/compiler/dart2js/codegen_helper.dart
@@ -27,10 +27,11 @@
   return compiler.run(uri).then((success) {
     Expect.isTrue(success);
     Map<String, String> result = new Map<String, String>();
-    for (var element in compiler.backend.generatedCode.keys) {
+    var backend = compiler.backend;
+    for (var element in backend.generatedCode.keys) {
       if (element.getCompilationUnit().script.readableUri != uri) continue;
       var name = element.name;
-      var code = compiler.backend.assembleCode(element);
+      var code = backend.assembleCode(element);
       result[name] = code;
     }
     return result;
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index 23fa7ac..62a3651 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -5,7 +5,6 @@
 import "package:expect/expect.dart";
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
-import 'parser_helper.dart';
 import 'mock_compiler.dart';
 import '../../../sdk/lib/_internal/compiler/compiler.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' as leg;
@@ -451,6 +450,8 @@
   get resolvedElements => compiler.enqueuer.resolution.resolvedElements;
   ElementAst operator[](Element element) =>
       new ElementAst(element.parseNode(compiler), resolvedElements[element]);
+
+  noSuchMethod(Invocation invocation) => throw 'unimplemented method';
 }
 
 PlaceholderCollector collectPlaceholders(compiler, element) =>
@@ -471,7 +472,9 @@
   compiler.processQueue(compiler.enqueuer.resolution, mainElement);
   PlaceholderCollector collector = collectPlaceholders(compiler, mainElement);
   FunctionExpression mainNode = mainElement.parseNode(compiler);
-  FunctionExpression fooNode = mainNode.body.statements.nodes.head.function;
+  Block body = mainNode.body;
+  FunctionDeclaration functionDeclaration = body.statements.nodes.head;
+  FunctionExpression fooNode = functionDeclaration.function;
   LocalPlaceholder fooPlaceholder =
       collector.functionScopes[mainElement].localPlaceholders.first;
   Expect.isTrue(fooPlaceholder.nodes.contains(fooNode.name));
diff --git a/tests/compiler/dart2js/dart_printer_test.dart b/tests/compiler/dart2js/dart_printer_test.dart
index d570b0a..3829354 100644
--- a/tests/compiler/dart2js/dart_printer_test.dart
+++ b/tests/compiler/dart2js/dart_printer_test.dart
@@ -9,6 +9,7 @@
 import 'dart:mirrors';
 import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart' as tree;
 import '../../../sdk/lib/_internal/compiler/implementation/string_validator.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart' show TreePrinter;
 
 /// For debugging the [AstBuilder] stack. Prints information about [x].
 void show(x) {
@@ -586,12 +587,13 @@
     push(statement);
   }
   
+  // TODO(kmillikin,asgerf): this code is currently untested.
   endFunctionDeclaration(Token end) {
     Statement body = pop();
     Parameters parameters = pop();
     String name = pop(asName);
     TypeAnnotation returnType = popTypeAnnotation();
-    push(new FunctionStatement(name, parameters, body, returnType));
+    push(new FunctionDeclaration(name, parameters, returnType));
   }
   
   endFunctionBody(int count, Token begin, Token end) {
@@ -681,15 +683,25 @@
   return buf.toString();
 }
 
+/// Converts [exp] to an instance of the frontend AST and unparses that.
+String frontUnparseExpression(Expression exp) {
+  tree.Node node = new TreePrinter().makeExpression(exp);
+  return tree.unparse(node);
+}
+/// Converts [stmt] to an instance of the frontend AST and unparses that.
+String frontUnparseStatement(Statement stmt) {
+  tree.Node node = new TreePrinter().makeStatement(stmt);
+  return tree.unparse(node);
+}
+
 /// Parses [code], unparses the resulting AST, then parses the unparsed text.
 /// The ASTs from the first and second parse are then compared for structural
 /// equality. Alternatively, if [expected] is not an empty string, the second
 /// parse must match the AST of parsing [expected].
 void checkFn(String code, String expected, Function parse, Function unparse) {
-  String unparsed = "";
+  var firstParse = parse(code);
+  String unparsed = unparse(firstParse);
   try {
-    var firstParse = parse(code);
-    unparsed = unparse(firstParse);
     var secondParse = parse(unparsed);
     var baseline = expected == "" ? firstParse : parse(expected);
     checkDeepEqual(baseline, secondParse);
@@ -698,11 +710,13 @@
   }
 }
 
-void checkExpression(String code, [String expected=""]) {
+void checkExpression(String code, [String expected="", String expected2=""]) {
   checkFn(code, expected, parseExpression, unparseExpression);
+  checkFn(code, expected2, parseExpression, frontUnparseExpression);
 }
-void checkStatement(String code, [String expected=""]) {
+void checkStatement(String code, [String expected="", String expected2=""]) {
   checkFn(code, expected, parseStatement, unparseStatement);
+  checkFn(code, expected2, parseStatement, frontUnparseStatement);
 }
 
 void debugTokens(String code) {
@@ -880,6 +894,10 @@
   
   checkExpression(r"'${$x}'");
   checkExpression(r"'${$x}y'");
+  checkExpression("null + null");
+  
+  checkExpression("throw x");
+  checkStatement("throw x;");
   
   checkStatement("var x, y, z;");
   checkStatement("final x, y, z;");
@@ -932,5 +950,10 @@
   checkStatement("do while(x); while (y);");
   checkStatement("{do; while(x); while (y);}");
   
+  checkStatement('switch(x) { case 1: case 2: return y; }');
+  checkStatement('switch(x) { default: return y; }');
+  checkStatement('switch(x) { case 1: x=y; default: return y; }');
+  checkStatement('switch(x) { case 1: x=y; y=z; break; default: return y; }');
+  
 }
 
diff --git a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
index 88a5680..582bcf0 100644
--- a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
@@ -43,7 +43,8 @@
     var outputUnitForElement = compiler.deferredLoadTask.outputUnitForElement;
 
     var mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
-    var classes = compiler.backend.emitter.neededClasses;
+    var backend = compiler.backend;
+    var classes = backend.emitter.neededClasses;
     var inputElement = classes.where((e) => e.name == 'InputElement').single;
     var lib1 = compiler.libraries["memory:lib1.dart"];
     var foo1 = lib1.find("foo1");
@@ -54,7 +55,7 @@
     var lib4 = compiler.libraries["memory:lib4.dart"];
     var bar1 = lib4.find("bar1");
     var bar2 = lib4.find("bar2");
-    var outputClassLists = compiler.backend.emitter.outputClassLists;
+    var outputClassLists = backend.emitter.outputClassLists;
 
     Expect.equals(mainOutputUnit, outputUnitForElement(main));
     Expect.notEquals(mainOutputUnit, outputUnitForElement(foo1));
diff --git a/tests/compiler/dart2js/deferred_not_in_main_test.dart b/tests/compiler/dart2js/deferred_not_in_main_test.dart
index a2d828a..5c1bf87 100644
--- a/tests/compiler/dart2js/deferred_not_in_main_test.dart
+++ b/tests/compiler/dart2js/deferred_not_in_main_test.dart
@@ -40,13 +40,14 @@
     var outputUnitForElement = compiler.deferredLoadTask.outputUnitForElement;
 
     var mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
-    var classes = compiler.backend.emitter.neededClasses;
+    var backend = compiler.backend;
+    var classes = backend.emitter.neededClasses;
     var lib1 = compiler.libraries["memory:lib1.dart"];
     var lib2 = compiler.libraries["memory:lib2.dart"];
     var foo1 = lib1.find("foo1");
     var foo2 = lib2.find("foo2");
 
-    var outputClassLists = compiler.backend.emitter.outputClassLists;
+    var outputClassLists = backend.emitter.outputClassLists;
 
     Expect.notEquals(mainOutputUnit, outputUnitForElement(foo2));
   }));
diff --git a/tests/compiler/dart2js/find_my_name_test.dart b/tests/compiler/dart2js/find_my_name_test.dart
index 72f42fc..f36c662 100644
--- a/tests/compiler/dart2js/find_my_name_test.dart
+++ b/tests/compiler/dart2js/find_my_name_test.dart
@@ -34,11 +34,11 @@
   int skip = code.indexOf('{');
   ClassElement cls = parseUnit(code, compiler, compiler.mainApp).head;
   cls.parseNode(compiler);
-  for (Element e in cls.localMembers) {
+  cls.forEachLocalMember((Element e) {
     String name = e.name;
     if (e.isConstructor()) {
       name = Elements.reconstructConstructorName(e).replaceFirst(r'$', '.');
     }
     Expect.equals(code.indexOf(name, skip), e.position().charOffset);
-  }
+  });
 }
diff --git a/tests/compiler/dart2js/members_test.dart b/tests/compiler/dart2js/members_test.dart
index d170c9d..2fc70b5 100644
--- a/tests/compiler/dart2js/members_test.dart
+++ b/tests/compiler/dart2js/members_test.dart
@@ -9,9 +9,10 @@
 import 'type_test_helper.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
-       show Element, ClassElement, MemberSignature, Name, PublicName;
+       show Element, ClassElement, MemberSignature, Name, PublicName,
+            DeclaredMember, Member;
 import "../../../sdk/lib/_internal/compiler/implementation/resolution/class_members.dart"
-  show SyntheticMember, ErroneousMember;
+  show DeclaredMember, ErroneousMember, SyntheticMember;
 
 void main() {
   testClassMembers();
@@ -90,7 +91,7 @@
   }
 
   if (inheritedFrom != null) {
-    MemberSignature inherited = checkType == CHECK_CLASS
+    DeclaredMember inherited = checkType == CHECK_CLASS
         ? inheritedFrom.element.lookupClassMember(memberName)
         : inheritedFrom.element.lookupInterfaceMember(memberName);
     Expect.isNotNull(inherited,
@@ -111,19 +112,21 @@
       Set<MemberSignature> members = new Set<MemberSignature>();
       List from = synthesizedFrom != null ? synthesizedFrom : erroneousFrom;
       for (InterfaceType type in from) {
-        MemberSignature inheritedMember =
+        DeclaredMember inheritedMember =
             type.element.lookupInterfaceMember(memberName);
         Expect.isNotNull(inheritedMember);
         members.add(inheritedMember.inheritFrom(type));
       }
       Expect.setEquals(members, member.declarations);
     } else if (declarer != null) {
-      Expect.equals(declarer, member.declarer,
-          "Unexpected declarer '${member.declarer}' of $memberKind member "
+      DeclaredMember declared = member;
+      Expect.equals(declarer, declared.declarer,
+          "Unexpected declarer '${declared.declarer}' of $memberKind member "
           "'$member'. Expected '${declarer}'.");
     } else {
-      Expect.equals(cls.element, member.element.getEnclosingClass());
-      Expect.equals(cls, member.declarer);
+      DeclaredMember declared = member;
+      Expect.equals(cls.element, declared.element.getEnclosingClass());
+      Expect.equals(cls, declared.declarer);
     }
     Expect.equals(isSetter, member.isSetter);
     Expect.equals(isGetter, member.isGetter);
diff --git a/tests/compiler/dart2js/memory_source_file_helper.dart b/tests/compiler/dart2js/memory_source_file_helper.dart
index 4409497..db8010d 100644
--- a/tests/compiler/dart2js/memory_source_file_helper.dart
+++ b/tests/compiler/dart2js/memory_source_file_helper.dart
@@ -5,7 +5,6 @@
 library dart2js.test.memory_source_file_helper;
 
 import 'dart:async' show Future;
-import 'dart:io';
 export 'dart:io' show Platform;
 
 export '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart'
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index 6550d17..5a16e56 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -32,16 +32,18 @@
     MessageKind.FORMAL_DECLARED_CONST,
     MessageKind.FORMAL_DECLARED_STATIC,
     MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT,
-    MessageKind.HEX_DIGIT_EXPECTED,
     MessageKind.HIDDEN_IMPLICIT_IMPORT,
     MessageKind.HIDDEN_IMPORT,
     MessageKind.INHERIT_GETTER_AND_METHOD,
     MessageKind.UNIMPLEMENTED_METHOD,
     MessageKind.UNIMPLEMENTED_METHOD_ONE,
-    MessageKind.UNMATCHED_TOKEN,
-    MessageKind.UNTERMINATED_STRING,
     MessageKind.VAR_FUNCTION_TYPE_PARAMETER,
     MessageKind.VOID_NOT_ALLOWED,
+
+    MessageKind.HEX_DIGIT_EXPECTED, // http://dartbug.com/18574
+    MessageKind.UNMATCHED_TOKEN, // http://dartbug.com/18574
+    MessageKind.UNTERMINATED_COMMENT, // http://dartbug.com/18574
+    MessageKind.UNTERMINATED_STRING, // http://dartbug.com/18574
 ]);
 
 /// Most messages can be tested without causing a fatal error. Add an exception
diff --git a/tests/compiler/dart2js/metadata_test.dart b/tests/compiler/dart2js/metadata_test.dart
index ab302eb..1c7f596 100644
--- a/tests/compiler/dart2js/metadata_test.dart
+++ b/tests/compiler/dart2js/metadata_test.dart
@@ -6,6 +6,8 @@
 import "package:async_helper/async_helper.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+    show PrimitiveConstant;
 
 void checkPosition(Spannable spannable, Node node, String source, compiler) {
   SourceSpan span = compiler.spanFromSpannable(spannable);
@@ -34,7 +36,7 @@
         'Unexpected metadata count on $element.');
     PartialMetadataAnnotation annotation = element.metadata.head;
     annotation.ensureResolved(compiler);
-    Constant value = annotation.value;
+    PrimitiveConstant value = annotation.value;
     Expect.stringEquals('xyz', value.value.slowToString());
 
     checkPosition(annotation, annotation.cachedNode, source1, compiler);
@@ -57,8 +59,8 @@
     Expect.isFalse(identical(annotation1, annotation2),
                    'expected unique instances');
     Expect.notEquals(annotation1, annotation2, 'expected unequal instances');
-    Constant value1 = annotation1.value;
-    Constant value2 = annotation2.value;
+    PrimitiveConstant value1 = annotation1.value;
+    PrimitiveConstant value2 = annotation2.value;
     Expect.identical(value1, value2, 'expected same compile-time constant');
     Expect.stringEquals('xyz', value1.value.slowToString());
     Expect.stringEquals('xyz', value2.value.slowToString());
@@ -87,7 +89,7 @@
     Expect.equals(1, length(element.metadata));
     PartialMetadataAnnotation annotation = element.metadata.head;
     annotation.ensureResolved(compiler);
-    Constant value = annotation.value;
+    PrimitiveConstant value = annotation.value;
     Expect.stringEquals('xyz', value.value.slowToString());
 
     checkPosition(annotation, annotation.cachedNode, source3, compiler);
@@ -116,8 +118,8 @@
     Expect.isFalse(identical(annotation1, annotation2),
                    'expected unique instances');
     Expect.notEquals(annotation1, annotation2, 'expected unequal instances');
-    Constant value1 = annotation1.value;
-    Constant value2 = annotation2.value;
+    PrimitiveConstant value1 = annotation1.value;
+    PrimitiveConstant value2 = annotation2.value;
     Expect.identical(value1, value2, 'expected same compile-time constant');
     Expect.stringEquals('xyz', value1.value.slowToString());
     Expect.stringEquals('xyz', value2.value.slowToString());
@@ -169,7 +171,7 @@
 
       PartialMetadataAnnotation annotation = metadata.head;
       annotation.ensureResolved(compiler);
-      Constant value = annotation.value;
+      PrimitiveConstant value = annotation.value;
       Expect.stringEquals('xyz', value.value.slowToString());
 
       checkPosition(annotation, annotation.cachedNode, source, compiler);
diff --git a/tests/compiler/dart2js/mirror_helper_test.dart b/tests/compiler/dart2js/mirror_helper_test.dart
index 57c869b..1f3b7ae 100644
--- a/tests/compiler/dart2js/mirror_helper_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_test.dart
@@ -15,7 +15,7 @@
 import
     '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
 show
-    Node;
+    Block, ExpressionStatement, FunctionExpression, Node, Send;
 import
     '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart'
 show
@@ -54,13 +54,15 @@
     Map<Node, String> renames = backend.renames;
     Map<LibraryElement, String> imports = backend.imports;
 
-    Node getNameFunctionNode =
-        backend.memberNodes.values.first.first.body.statements.nodes.head;
+    FunctionExpression node = backend.memberNodes.values.first.first;
+    Block block = node.body;
+    ExpressionStatement getNameFunctionNode = block.statements.nodes.head;
+    Send send = getNameFunctionNode.expression;
 
     Expect.equals(renames[mirrorRenamer.mirrorHelperGetNameFunctionNode.name],
-                  renames[getNameFunctionNode.expression.selector]);
+                  renames[send.selector]);
     Expect.equals("",
-                  renames[getNameFunctionNode.expression.receiver]);
+                  renames[send.receiver]);
     Expect.equals(1, imports.keys.length);
   }));
 }
@@ -73,11 +75,13 @@
     Map<Node, String> renames = backend.renames;
     Map<LibraryElement, String> imports = backend.imports;
 
-    Node getNameFunctionNode =
-        backend.memberNodes.values.first.first.body.statements.nodes.head;
+    FunctionExpression node = backend.memberNodes.values.first.first;
+    Block block = node.body;
+    ExpressionStatement getNameFunctionNode = block.statements.nodes.head;
+    Send send = getNameFunctionNode.expression;
 
-    Expect.isFalse(renames.containsKey(getNameFunctionNode.expression.selector));
-    Expect.isFalse(renames.containsKey(getNameFunctionNode.expression.receiver));
+    Expect.isFalse(renames.containsKey(send.selector));
+    Expect.isFalse(renames.containsKey(send.receiver));
     Expect.equals(1, imports.keys.length);
   }));
 }
diff --git a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
index e72f98a..5a74894 100644
--- a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
@@ -14,8 +14,7 @@
     DartBackend;
 import
     '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
-show
-    Node, Identifier;
+show Identifier, Node, Send;
 import
     '../../../sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart'
 show
@@ -53,7 +52,8 @@
       Identifier identifier = node.asIdentifier();
       if (identifier != null) {
         String source = identifier.source;
-        if (mirrorRenamer.mirrorSystemGetNameNodes.first.selector == node)
+        Send send = mirrorRenamer.mirrorSystemGetNameNodes.first;
+        if (send.selector == node)
           continue;
         if (symbols.containsKey(renames[node])) {
           print(node);
diff --git a/tests/compiler/dart2js/mirror_tree_shaking_test.dart b/tests/compiler/dart2js/mirror_tree_shaking_test.dart
index 5f8c5c0..68bc816 100644
--- a/tests/compiler/dart2js/mirror_tree_shaking_test.dart
+++ b/tests/compiler/dart2js/mirror_tree_shaking_test.dart
@@ -15,6 +15,8 @@
        show Diagnostic;
 
 import 'dart:async';
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
+       show JavaScriptBackend;
 
 main() {
   Uri script = currentDirectory.resolveUri(Platform.script);
@@ -50,7 +52,8 @@
     Expect.isFalse(compiler.enqueuer.codegen.hasEnqueuedEverything);
     Expect.isFalse(compiler.enqueuer.codegen.hasEnqueuedReflectiveStaticFields);
     Expect.isFalse(compiler.disableTypeInference);
-    Expect.isFalse(compiler.backend.hasRetainedMetadata);
+    JavaScriptBackend backend = compiler.backend;
+    Expect.isFalse(backend.hasRetainedMetadata);
   }));
 }
 
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index ba2afed..f2656a2 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -21,8 +21,9 @@
 
 import
     '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
-show
-    Elements;
+show Element, Elements;
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
+    show JavaScriptBackend;
 
 void expectOnlyVerboseInfo(Uri uri, int begin, int end, String message, kind) {
   if (kind.name == 'verbose info') {
@@ -81,15 +82,15 @@
           compiler.stringClass, compiler.boolClass, compiler.nullClass,
           compiler.listClass
         ];
-
+    JavaScriptBackend backend = compiler.backend;
     Iterable<String> nativeNames =
-        nativeClasses.map(compiler.backend.namer.getNameOfClass);
+        nativeClasses.map(backend.namer.getNameOfClass);
     expectedNames.addAll(nativeNames);
 
     Set recordedNames = new Set()
-        ..addAll(compiler.backend.emitter.recordedMangledNames)
-        ..addAll(compiler.backend.emitter.mangledFieldNames.keys)
-        ..addAll(compiler.backend.emitter.mangledGlobalFieldNames.keys);
+        ..addAll(backend.emitter.recordedMangledNames)
+        ..addAll(backend.emitter.mangledFieldNames.keys)
+        ..addAll(backend.emitter.mangledGlobalFieldNames.keys);
     Expect.setEquals(new Set.from(expectedNames), recordedNames);
 
     for (var library in compiler.libraries.values) {
@@ -111,13 +112,12 @@
 
     // There should at least be one metadata constant:
     // 1. The constructed constant for 'MirrorsUsed'.
-    Expect.isTrue(compiler.backend.metadataConstants.length >= 1);
+    Expect.isTrue(backend.metadataConstants.length >= 1);
 
-    Set<Constant> compiledConstants =
-        compiler.backend.constants.compiledConstants;
+    Set<Constant> compiledConstants = backend.constants.compiledConstants;
     // Make sure that most of the metadata constants aren't included in the
     // generated code.
-    for (var dependency in compiler.backend.metadataConstants) {
+    for (var dependency in backend.metadataConstants) {
       Constant constant = dependency.constant;
       Expect.isFalse(compiledConstants.contains(constant), '$constant');
     }
diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/parser_test.dart
index 5526922..9b47f8d 100644
--- a/tests/compiler/dart2js/parser_test.dart
+++ b/tests/compiler/dart2js/parser_test.dart
@@ -259,8 +259,8 @@
   FunctionExpression function = parseMember('operator -() => null;');
   Send name = function.name.asSend();
   Expect.isNotNull(name);
-  Expect.stringEquals('operator', name.receiver.source);
-  Expect.stringEquals('-', name.selector.source);
+  Expect.stringEquals('operator', name.receiver.toString());
+  Expect.stringEquals('-', name.selector.toString());
   Expect.isTrue(function.parameters.isEmpty);
   Expect.isNull(function.returnType);
   Expect.isNull(function.getOrSet);
@@ -285,6 +285,8 @@
   void log(message) {
     print(message);
   }
+
+  noSuchMethod(Invocation invocation) => throw 'unsupported operation';
 }
 
 void testMissingCloseParen() {
diff --git a/tests/compiler/dart2js/resolution_test.dart b/tests/compiler/dart2js/resolution_test.dart
index 4f47d01..3480144 100644
--- a/tests/compiler/dart2js/resolution_test.dart
+++ b/tests/compiler/dart2js/resolution_test.dart
@@ -9,6 +9,7 @@
 import "package:async_helper/async_helper.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart';
 
 const String NO_RUNTIME_TYPE = r"""
 import 'dart:core' as prefix;
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 04ca4e3..832e784 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -12,6 +12,7 @@
 import "parser_helper.dart";
 
 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart';
 
 Node buildIdentifier(String name) => new Identifier(scan(name));
 
@@ -613,15 +614,15 @@
 testTopLevelFields() {
   MockCompiler compiler = new MockCompiler();
   compiler.parseScript("int a;");
-  VariableElement element = compiler.mainApp.find("a");
+  VariableElementX element = compiler.mainApp.find("a");
   Expect.equals(ElementKind.FIELD, element.kind);
   VariableDefinitions node = element.variables.parseNode(element, compiler);
   Identifier typeName = node.type.typeName;
   Expect.equals(typeName.source, 'int');
 
   compiler.parseScript("var b, c;");
-  VariableElement bElement = compiler.mainApp.find("b");
-  VariableElement cElement = compiler.mainApp.find("c");
+  VariableElementX bElement = compiler.mainApp.find("b");
+  VariableElementX cElement = compiler.mainApp.find("c");
   Expect.equals(ElementKind.FIELD, bElement.kind);
   Expect.equals(ElementKind.FIELD, cElement.kind);
   Expect.isTrue(bElement != cElement);
diff --git a/tests/compiler/dart2js/source_mapping_test.dart b/tests/compiler/dart2js/source_mapping_test.dart
index 752d05a..35c633b 100644
--- a/tests/compiler/dart2js/source_mapping_test.dart
+++ b/tests/compiler/dart2js/source_mapping_test.dart
@@ -8,14 +8,15 @@
 import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
 import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
 import "mock_compiler.dart";
-import 'parser_helper.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
 
 Future<CodeBuffer> compileAll(SourceFile sourceFile) {
   MockCompiler compiler = new MockCompiler();
   Uri uri = new Uri(path: sourceFile.filename);
   compiler.sourceFiles[uri.toString()] = sourceFile;
+  JavaScriptBackend backend = compiler.backend;
   return compiler.runCompiler(uri).then((_) {
-    return compiler.backend.emitter.mainBuffer;
+    return backend.emitter.mainBuffer;
   });
 }
 
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 9ef843f..5a0644c 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -2075,8 +2075,9 @@
 
 void generateOutput(String text) {
   for (WarningMessage message in compiler.warnings) {
-    var beginToken = message.node.getBeginToken();
-    var endToken = message.node.getEndToken();
+    Node node = message.node;
+    var beginToken = node.getBeginToken();
+    var endToken = node.getEndToken();
     int begin = beginToken.charOffset;
     int end = endToken.charOffset + endToken.charCount;
     SourceFile sourceFile = new StringSourceFile('analysis', text);
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index a6d9f8c..886a93b 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -4,10 +4,9 @@
 
 import "package:expect/expect.dart";
 import "compiler_helper.dart";
-import "parser_helper.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
 import "../../../sdk/lib/_internal/compiler/implementation/types/types.dart";
 import "type_mask_test_helper.dart";
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
 
 TypeMask nullType;
 TypeMask objectType;
@@ -384,6 +383,7 @@
 }
 
 void testIntersection(MockCompiler compiler) {
+  JavaScriptBackend backend = compiler.backend;
   RuleSet ruleSet = new RuleSet('intersection',
                                 (t1, t2) => t1.intersection(t2, compiler));
   rule(type1, type2, result) => ruleSet.rule(type1, type2, result);
@@ -519,9 +519,9 @@
   rule(jsIndexable, nonPrimitive1, emptyType);
   rule(jsIndexable, nonPrimitive2, emptyType);
   rule(jsIndexable, potentialArray, new TypeMask.nonNullSubtype(
-      compiler.backend.jsArrayClass));
+      backend.jsArrayClass));
   rule(jsIndexable, potentialString, new TypeMask.nonNullSubtype(
-      compiler.backend.jsStringClass));
+      backend.jsStringClass));
   rule(jsIndexable, jsBooleanOrNull, emptyType);
   rule(jsIndexable, jsNumberOrNull, emptyType);
   rule(jsIndexable, jsIntegerOrNull, emptyType);
@@ -677,6 +677,7 @@
 
 void main() {
   MockCompiler compiler = new MockCompiler();
+  JavaScriptBackend backend = compiler.backend;
   compiler.interceptorsLibrary.forEachLocalMember((element) {
     if (element.isClass()) {
       compiler.enqueuer.resolution.registerInstantiatedClass(
@@ -697,52 +698,29 @@
       compiler.functionClass);
   potentialArray = new TypeMask.subtype(
       compiler.listClass);
-  potentialString = new TypeMask.subtype(
-      patternClass);
-  jsInterceptor = new TypeMask.nonNullSubclass(
-      compiler.backend.jsInterceptorClass);
-  jsArrayOrNull = new TypeMask.subclass(
-      compiler.backend.jsArrayClass);
-  jsReadableArray = new TypeMask.nonNullSubclass(
-      compiler.backend.jsArrayClass);
-  jsMutableArrayOrNull = new TypeMask.subclass(
-      compiler.backend.jsMutableArrayClass);
-  jsMutableArray = new TypeMask.nonNullSubclass(
-      compiler.backend.jsMutableArrayClass);
-  jsFixedArrayOrNull = new TypeMask.exact(
-      compiler.backend.jsFixedArrayClass);
-  jsFixedArray = new TypeMask.nonNullExact(
-      compiler.backend.jsFixedArrayClass);
-  jsExtendableArrayOrNull = new TypeMask.exact(
-      compiler.backend.jsExtendableArrayClass);
-  jsExtendableArray = new TypeMask.nonNullExact(
-      compiler.backend.jsExtendableArrayClass);
-  jsIndexableOrNull = new TypeMask.subtype(
-      compiler.backend.jsIndexableClass);
-  jsIndexable = new TypeMask.nonNullSubtype(
-      compiler.backend.jsIndexableClass);
-  jsInterceptorOrNull = new TypeMask.subclass(
-      compiler.backend.jsInterceptorClass);
-  jsStringOrNull = new TypeMask.exact(
-      compiler.backend.jsStringClass);
-  jsString = new TypeMask.nonNullExact(
-      compiler.backend.jsStringClass);
-  jsBoolean = new TypeMask.nonNullExact(
-      compiler.backend.jsBoolClass);
-  jsNumber = new TypeMask.nonNullSubclass(
-      compiler.backend.jsNumberClass);
-  jsInteger = new TypeMask.nonNullExact(
-      compiler.backend.jsIntClass);
-  jsDouble = new TypeMask.nonNullExact(
-      compiler.backend.jsDoubleClass);
-  jsBooleanOrNull = new TypeMask.exact(
-      compiler.backend.jsBoolClass);
-  jsNumberOrNull = new TypeMask.subclass(
-      compiler.backend.jsNumberClass);
-  jsIntegerOrNull = new TypeMask.exact(
-      compiler.backend.jsIntClass);
-  jsDoubleOrNull = new TypeMask.exact(
-      compiler.backend.jsDoubleClass);
+  potentialString = new TypeMask.subtype(patternClass);
+  jsInterceptor = new TypeMask.nonNullSubclass(backend.jsInterceptorClass);
+  jsArrayOrNull = new TypeMask.subclass(backend.jsArrayClass);
+  jsReadableArray = new TypeMask.nonNullSubclass(backend.jsArrayClass);
+  jsMutableArrayOrNull = new TypeMask.subclass(backend.jsMutableArrayClass);
+  jsMutableArray = new TypeMask.nonNullSubclass(backend.jsMutableArrayClass);
+  jsFixedArrayOrNull = new TypeMask.exact(backend.jsFixedArrayClass);
+  jsFixedArray = new TypeMask.nonNullExact(backend.jsFixedArrayClass);
+  jsExtendableArrayOrNull = new TypeMask.exact(backend.jsExtendableArrayClass);
+  jsExtendableArray = new TypeMask.nonNullExact(backend.jsExtendableArrayClass);
+  jsIndexableOrNull = new TypeMask.subtype(backend.jsIndexableClass);
+  jsIndexable = new TypeMask.nonNullSubtype(backend.jsIndexableClass);
+  jsInterceptorOrNull = new TypeMask.subclass(backend.jsInterceptorClass);
+  jsStringOrNull = new TypeMask.exact(backend.jsStringClass);
+  jsString = new TypeMask.nonNullExact(backend.jsStringClass);
+  jsBoolean = new TypeMask.nonNullExact(backend.jsBoolClass);
+  jsNumber = new TypeMask.nonNullSubclass(backend.jsNumberClass);
+  jsInteger = new TypeMask.nonNullExact(backend.jsIntClass);
+  jsDouble = new TypeMask.nonNullExact(backend.jsDoubleClass);
+  jsBooleanOrNull = new TypeMask.exact(backend.jsBoolClass);
+  jsNumberOrNull = new TypeMask.subclass(backend.jsNumberClass);
+  jsIntegerOrNull = new TypeMask.exact(backend.jsIntClass);
+  jsDoubleOrNull = new TypeMask.exact(backend.jsDoubleClass);
   nullType = const TypeMask.empty();
   objectType = new TypeMask.nonNullSubclass(
       compiler.objectClass);
diff --git a/tests/compiler/dart2js/type_variable_occurrence_test.dart b/tests/compiler/dart2js/type_variable_occurrence_test.dart
index 1d51adf..5c71028 100644
--- a/tests/compiler/dart2js/type_variable_occurrence_test.dart
+++ b/tests/compiler/dart2js/type_variable_occurrence_test.dart
@@ -57,10 +57,10 @@
 
     ClassElement A = env.getElement('A');
 
-    expect(bool expect, String memberName) {
+    expect(bool expectResult, String memberName) {
       DartType memberType = env.getMemberType(A, memberName);
       TypeVariableType typeVariable = memberType.typeVariableOccurrence;
-      if (expect) {
+      if (expectResult) {
         Expect.isNotNull(typeVariable);
         Expect.equals(A, Types.getClassContext(memberType));
       } else {
diff --git a/tests/compiler/dart2js/unparser2_test.dart b/tests/compiler/dart2js/unparser2_test.dart
index fa5f0bb..ced1c31 100644
--- a/tests/compiler/dart2js/unparser2_test.dart
+++ b/tests/compiler/dart2js/unparser2_test.dart
@@ -83,4 +83,6 @@
   void log(message) {
     messages.add(message);
   }
+
+  noSuchMethod(Invocation invocation) => throw 'unsupported operation';
 }
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index bd7d93f..fd54729 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -44,7 +44,7 @@
 [ $compiler == dart2js && ($runtime == drt || $runtime == ff || $runtime == safari || $runtime == jsshell) ]
 code_motion_exception_test: Skip  # Required V8 specific format of JavaScript errors.
 
-[ $compiler == dart2js && ($runtime == drt || $runtime == ff || $runtime == safari || $runtime == chrome || $runtime == chromeOnAndroid) ]
+[ $compiler == dart2js && ($runtime == drt || $runtime == ff || $runtime == safari || $runtime == safarimobilesim || $runtime == chrome || $runtime == chromeOnAndroid) ]
 isolate2_test/01: Fail # Issue 14458.
 
 [ $runtime == jsshell ]
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 800e3f8..c445f42 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -63,7 +63,7 @@
 [ $runtime == ff || $runtime == ie9 || $runtime == jsshell ]
 unicode_test: Fail
 
-[ $runtime == ff || $runtime == ie9 || $runtime == jsshell || $runtime == safari ]
+[ $runtime == ff || $runtime == ie9 || $runtime == jsshell || $runtime == safari || $runtime == safarimobilesim ]
 double_round3_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
 double_round_to_double2_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
 
@@ -105,7 +105,7 @@
 
 [ $compiler == dart2js && ($runtime == firefox || $runtime == safari || $runtime == chrome || $runtime == drt) ]
 
-[ $compiler == dart2js && ($runtime == chrome || $runtime == drt || $runtime == safari) ]
+[ $compiler == dart2js && ($runtime == chrome || $runtime == drt || $runtime == safari || $runtime == safarimobilesim) ]
 string_trimlr_test/none: Fail # Bug in v8. Fixed in v8 r19222, 2014-02-10.
 
 [ $compiler == dart2js && ( $runtime == drt) ]
@@ -160,7 +160,7 @@
 num_clamp_test: StaticWarning, OK # Test generates errors on purpose.
 string_test: StaticWarning, OK # Test generates error on purpose.
 
-[ $compiler == dart2js && $runtime == safari ]
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
 list_test/01: Fail # Safari bug: Array(-2) seen as dead code.
 
 [ $runtime == ie9 || $runtime == ie10 ]
diff --git a/tests/html/custom/attribute_changed_callback_test.dart b/tests/html/custom/attribute_changed_callback_test.dart
index 14b8614..3eaa446 100644
--- a/tests/html/custom/attribute_changed_callback_test.dart
+++ b/tests/html/custom/attribute_changed_callback_test.dart
@@ -52,8 +52,8 @@
   setUp(() => customElementsReady.then((_) {
     if (!registered) {
       registered = true;
-      document.register(A.tag, A);
-      document.register(B.tag, B);
+      document.registerElement(A.tag, A);
+      document.registerElement(B.tag, B);
     }
   }));
 
diff --git a/tests/html/custom/constructor_calls_created_synchronously_test.dart b/tests/html/custom/constructor_calls_created_synchronously_test.dart
index 0eb1f5c..256b9f8 100644
--- a/tests/html/custom/constructor_calls_created_synchronously_test.dart
+++ b/tests/html/custom/constructor_calls_created_synchronously_test.dart
@@ -30,7 +30,7 @@
     return customElementsReady.then((_) {
       if (!registered) {
         registered = true;
-        document.register(A.tag, A);
+        document.registerElement(A.tag, A);
       }
     });
   });
@@ -51,7 +51,8 @@
   });
 
   test("can extend elements that don't have special prototypes", () {
-    document.register('fancy-section', FancySection, extendsTag: 'section');
+    document.registerElement('fancy-section', FancySection,
+        extendsTag: 'section');
     var fancy = document.createElement('section', 'fancy-section');
     expect(fancy is FancySection, true, reason: 'fancy-section was registered');
     expect(fancy.wasCreated, true, reason: 'FancySection ctor was called');
diff --git a/tests/html/custom/created_callback_test.dart b/tests/html/custom/created_callback_test.dart
index 8652520..769b784 100644
--- a/tests/html/custom/created_callback_test.dart
+++ b/tests/html/custom/created_callback_test.dart
@@ -65,15 +65,15 @@
     return customElementsReady.then((_) {
       if (!registered) {
         registered = true;
-        document.register(B.tag, B);
-        document.register(C.tag, C);
+        document.registerElement(B.tag, B);
+        document.registerElement(C.tag, C);
         ErrorConstructorElement.register();
       }
     });
   });
 
   test('transfer created callback', () {
-    document.register(A.tag, A);
+    document.registerElement(A.tag, A);
     var x = new A();
     expect(A.createdInvocations, 1);
   });
@@ -107,7 +107,8 @@
 
   test('cannot register without created', () {
     expect(() {
-      document.register(MissingCreatedElement.tag, MissingCreatedElement);
+      document.registerElement(MissingCreatedElement.tag,
+          MissingCreatedElement);
     }, throws);
   });
 
@@ -149,7 +150,8 @@
 
   test('cannot register created with params', () {
     expect(() {
-      document.register('x-created-with-params', CreatedWithParametersElement);
+      document.registerElement('x-created-with-params',
+          CreatedWithParametersElement);
     }, throws);
   });
 
@@ -171,7 +173,7 @@
   NestedElement.created() : super.created();
 
   static void register() {
-    document.register(tag, NestedElement);
+    document.registerElement(tag, NestedElement);
   }
 
   static void test() {
@@ -203,7 +205,7 @@
   }
 
   static void register() {
-    document.register(tag, AccessWhileUpgradingElement);
+    document.registerElement(tag, AccessWhileUpgradingElement);
   }
 
   static void test() {
@@ -239,7 +241,7 @@
   }
 
   static void register() {
-    document.register(tag, ErrorConstructorElement);
+    document.registerElement(tag, ErrorConstructorElement);
   }
 }
 
@@ -254,7 +256,7 @@
   NestedCreatedConstructorElement.created() : super.created();
 
   static void register() {
-    document.register(tag, NestedCreatedConstructorElement);
+    document.registerElement(tag, NestedCreatedConstructorElement);
   }
 
   // Try to run the created constructor, and record the results.
diff --git a/tests/html/custom/document_register_basic_test.dart b/tests/html/custom/document_register_basic_test.dart
index c5a0d6e..e127ebf 100644
--- a/tests/html/custom/document_register_basic_test.dart
+++ b/tests/html/custom/document_register_basic_test.dart
@@ -47,23 +47,23 @@
 
   setUp(() => customElementsReady);
 
-  test('Testing document.register() basic behaviors', () {
-    document.register(Foo.tag, Foo);
+  test('Testing document.registerElement() basic behaviors', () {
+    document.registerElement(Foo.tag, Foo);
 
     // Cannot register an existing dart:html type.
-    expect(() => document.register('x-bad-a', HtmlElement), throws);
+    expect(() => document.registerElement('x-bad-a', HtmlElement), throws);
 
     // Invalid user type.  Doesn't inherit from HtmlElement.
-    expect(() => document.register('x-bad-b', BadB), throws);
+    expect(() => document.registerElement('x-bad-b', BadB), throws);
 
     // Not a type.
-    expect(() => document.register('x-bad-c', null), throws);
+    expect(() => document.registerElement('x-bad-c', null), throws);
 
     // Cannot register system type.
-    expect(() => document.register('x-bad-d', Object), throws);
+    expect(() => document.registerElement('x-bad-d', Object), throws);
 
     // Must extend HtmlElement, not just implement it.
-    expect(() => document.register(BadE.tag, BadE), throws);
+    expect(() => document.registerElement(BadE.tag, BadE), throws);
 
     // Constructor initiated instantiation
     var createdFoo = new Foo();
@@ -104,14 +104,14 @@
     expect(someProperty[container.firstChild], someProperty[parsedFoo]);
 
     // Having another constructor
-    document.register(Bar.tag, Bar);
+    document.registerElement(Bar.tag, Bar);
     var createdBar = new Bar();
     expect(createdBar is Bar, isTrue);
     expect(createdBar is Foo, isFalse);
     expect(createdBar.tagName, "X-BAR");
 
     // Having a subclass
-    document.register(Baz.tag, Baz);
+    document.registerElement(Baz.tag, Baz);
     var createdBaz = new Baz();
     expect(createdBaz.tagName, "X-BAZ");
     expect(createdBaz.thisIsACustomClass, isTrue);
diff --git a/tests/html/custom/document_register_type_extensions_test.dart b/tests/html/custom/document_register_type_extensions_test.dart
index 80f703f..67957b12 100644
--- a/tests/html/custom/document_register_type_extensions_test.dart
+++ b/tests/html/custom/document_register_type_extensions_test.dart
@@ -93,12 +93,12 @@
       return;
     }
     registeredTypes = true;
-    document.register(Foo.tag, Foo);
-    document.register(Bar.tag, Bar, extendsTag: 'input');
-    document.register(Baz.tag, Baz);
-    document.register(Qux.tag, Qux, extendsTag: 'input');
-    document.register(MyCanvas.tag, MyCanvas, extendsTag: 'canvas');
-    document.register(CustomCustomDiv.tag, CustomCustomDiv, extendsTag: 'div');
+    document.registerElement(Foo.tag, Foo);
+    document.registerElement(Bar.tag, Bar, extendsTag: 'input');
+    document.registerElement(Baz.tag, Baz);
+    document.registerElement(Qux.tag, Qux, extendsTag: 'input');
+    document.registerElement(MyCanvas.tag, MyCanvas, extendsTag: 'canvas');
+    document.registerElement(CustomCustomDiv.tag, CustomCustomDiv, extendsTag: 'div');
   }
 
   setUp(() => customElementsReady);
@@ -107,19 +107,19 @@
     setUp(registerTypes);
 
     test('cannot register twice', () {
-      expect(() => document.register(FooBad.tag, Foo, extendsTag: 'div'),
+      expect(() => document.registerElement(FooBad.tag, Foo, extendsTag: 'div'),
           throws);
     });
 
     test('cannot register for non-matching tag', () {
       expect(() {
-        document.register('x-input-div', Bar, extendsTag: 'div');
+        document.registerElement('x-input-div', Bar, extendsTag: 'div');
       }, throws);
     });
 
     test('cannot register type extension for custom tag', () {
       expect(() {
-        document.register('x-custom-tag', CustomCustomDiv);
+        document.registerElement('x-custom-tag', CustomCustomDiv);
       }, throws);
     });
   });
diff --git a/tests/html/custom/element_upgrade_test.dart b/tests/html/custom/element_upgrade_test.dart
index 244f21b..c8e7376 100644
--- a/tests/html/custom/element_upgrade_test.dart
+++ b/tests/html/custom/element_upgrade_test.dart
@@ -40,7 +40,7 @@
         upgrader.upgrade(e);
       };
 
-      document.register('custom-element', CustomElement);
+      document.registerElement('custom-element', CustomElement);
     }
   }));
 
diff --git a/tests/html/custom/entered_left_view_test.dart b/tests/html/custom/entered_left_view_test.dart
index 4822d0e..a2804bc 100644
--- a/tests/html/custom/entered_left_view_test.dart
+++ b/tests/html/custom/entered_left_view_test.dart
@@ -18,12 +18,43 @@
     invocations.add('created');
   }
 
+  void attached() {
+    invocations.add('attached');
+  }
+
   void enteredView() {
-    invocations.add('entered');
+    // Deprecated name. Should never be called since we override "attached".
+    invocations.add('enteredView');
+  }
+
+  void detached() {
+    invocations.add('detached');
   }
 
   void leftView() {
-    invocations.add('left');
+    // Deprecated name. Should never be called since we override "detached".
+    invocations.add('leftView');
+  }
+
+  void attributeChanged(String name, String oldValue, String newValue) {
+    invocations.add('attribute changed');
+  }
+}
+
+
+// Test that the deprecated callbacks still work.
+class FooOldCallbacks extends HtmlElement {
+  factory FooOldCallbacks() => null;
+  FooOldCallbacks.created() : super.created() {
+    invocations.add('created');
+  }
+
+  void enteredView() {
+    invocations.add('enteredView');
+  }
+
+  void leftView() {
+    invocations.add('leftView');
   }
 
   void attributeChanged(String name, String oldValue, String newValue) {
@@ -35,7 +66,7 @@
   useHtmlIndividualConfiguration();
 
   // Adapted from Blink's
-  // fast/dom/custom/entered-left-document.html test.
+  // fast/dom/custom/attached-detached-document.html test.
 
   var docA = document;
   var docB = document.implementation.createHtmlDocument('');
@@ -46,7 +77,8 @@
   setUp(() => customElementsReady.then((_) {
     if (registeredTypes) return;
     registeredTypes = true;
-    document.register('x-a', Foo);
+    document.registerElement('x-a', Foo);
+    document.registerElement('x-a-old', FooOldCallbacks);
   }));
 
   group('standard_events', () {
@@ -60,38 +92,84 @@
       expect(invocations, ['created']);
     });
 
-    test('entered', () {
+    test('attached', () {
       document.body.append(a);
       customElementsTakeRecords();
-      expect(invocations, ['entered']);
+      expect(invocations, ['attached']);
     });
 
-    test('left', () {
+    test('detached', () {
       a.remove();
       customElementsTakeRecords();
-      expect(invocations, ['left']);
+      expect(invocations, ['detached']);
     });
 
     var div = new DivElement();
-    test('nesting does not trigger entered', () {
+    test('nesting does not trigger attached', () {
       div.append(a);
       customElementsTakeRecords();
       expect(invocations, []);
     });
 
-    test('nested entering triggers entered', () {
+    test('nested entering triggers attached', () {
       document.body.append(div);
       customElementsTakeRecords();
-      expect(invocations, ['entered']);
+      expect(invocations, ['attached']);
     });
 
-    test('nested leaving triggers left', () {
+    test('nested leaving triggers detached', () {
       div.remove();
       customElementsTakeRecords();
-      expect(invocations, ['left']);
+      expect(invocations, ['detached']);
     });
   });
 
+
+  // TODO(jmesserly): remove after deprecation period.
+  group('standard_events -- old callback names', () {
+    var a;
+    setUp(() {
+      invocations = [];
+    });
+
+    test('Created', () {
+      a = new Element.tag('x-a-old');
+      expect(invocations, ['created']);
+    });
+
+    test('enteredView', () {
+      document.body.append(a);
+      customElementsTakeRecords();
+      expect(invocations, ['enteredView']);
+    });
+
+    test('leftView', () {
+      a.remove();
+      customElementsTakeRecords();
+      expect(invocations, ['leftView']);
+    });
+
+    var div = new DivElement();
+    test('nesting does not trigger enteredView', () {
+      div.append(a);
+      customElementsTakeRecords();
+      expect(invocations, []);
+    });
+
+    test('nested entering triggers enteredView', () {
+      document.body.append(div);
+      customElementsTakeRecords();
+      expect(invocations, ['enteredView']);
+    });
+
+    test('nested leaving triggers leftView', () {
+      div.remove();
+      customElementsTakeRecords();
+      expect(invocations, ['leftView']);
+    });
+  });
+
+
   group('viewless_document', () {
     var a;
     setUp(() {
@@ -110,7 +188,7 @@
     test('Entered document without a view', () {
       docB.body.append(a);
       expect(invocations, [],
-          reason: 'entered callback should not be invoked when entering a '
+          reason: 'attached callback should not be invoked when entering a '
           'document without a view');
     });
 
@@ -124,16 +202,16 @@
     test('Entered document with a view', () {
       document.body.append(a);
       customElementsTakeRecords();
-      expect(invocations, ['entered'],
-          reason: 'entered callback should be invoked when entering a document '
+      expect(invocations, ['attached'],
+          reason: 'attached callback should be invoked when entering a document '
           'with a view');
     });
 
     test('Left document with a view', () {
       a.remove();
       customElementsTakeRecords();
-      expect(invocations, ['left'],
-          reason: 'left callback should be invoked when leaving a document '
+      expect(invocations, ['detached'],
+          reason: 'detached callback should be invoked when leaving a document '
           'with a view');
     });
 
@@ -165,14 +243,14 @@
       upgradeCustomElements(s);
 
       expect(invocations, ['created'],
-          reason: 'the entered callback should not be invoked when entering a '
+          reason: 'the attached callback should not be invoked when entering a '
           'Shadow DOM subtree not in the document');
     });
 
     test('Leaves Shadow DOM that is not in a document', () {
       s.innerHtml = '';
       expect(invocations, [],
-          reason: 'the left callback should not be invoked when leaving a '
+          reason: 'the detached callback should not be invoked when leaving a '
           'Shadow DOM subtree not in the document');
     });
 
@@ -182,15 +260,15 @@
 
       document.body.append(div);
       customElementsTakeRecords();
-      expect(invocations, ['created', 'entered'],
-            reason: 'the entered callback should be invoked when inserted into '
+      expect(invocations, ['created', 'attached'],
+            reason: 'the attached callback should be invoked when inserted into '
             'a document with a view as part of Shadow DOM');
 
       div.remove();
       customElementsTakeRecords();
 
-      expect(invocations, ['created', 'entered', 'left'],
-          reason: 'the left callback should be invoked when removed from a '
+      expect(invocations, ['created', 'attached', 'detached'],
+          reason: 'the detached callback should be invoked when removed from a '
           'document with a view as part of Shadow DOM');
     });
   });
@@ -208,14 +286,14 @@
       upgradeCustomElements(div);
 
       expect(invocations, ['created'],
-          reason: 'the entered callback should not be invoked when inserted '
+          reason: 'the attached callback should not be invoked when inserted '
           'into a disconnected subtree');
     });
 
     test('Leaves a disconnected subtree of DOM', () {
       div.innerHtml = '';
       expect(invocations, [],
-          reason: 'the left callback should not be invoked when removed from a '
+          reason: 'the detached callback should not be invoked when removed from a '
           'disconnected subtree');
     });
 
@@ -225,8 +303,8 @@
       invocations = [];
       document.body.append(div);
       customElementsTakeRecords();
-      expect(invocations, ['entered'],
-          reason: 'the entered callback should be invoked when inserted into a '
+      expect(invocations, ['attached'],
+          reason: 'the attached callback should be invoked when inserted into a '
           'document with a view as part of a subtree');
     });
   });
diff --git a/tests/html/custom/js_custom_test.dart b/tests/html/custom/js_custom_test.dart
index 1abf32f..fc80ffa 100644
--- a/tests/html/custom/js_custom_test.dart
+++ b/tests/html/custom/js_custom_test.dart
@@ -31,7 +31,7 @@
     return customElementsReady.then((_) {
       if (!registered) {
         registered = true;
-        document.register(A.tag, A);
+        document.registerElement(A.tag, A);
       }
     });
   });
@@ -51,7 +51,7 @@
 
   test('accessing custom JS element from Dart', () {
     var script = '''
-    var Foo = document.register('x-foo', {
+    var Foo = document.registerElement('x-foo', {
       prototype: Object.create(HTMLElement.prototype, {
         createdCallback: {
           value: function() {
diff --git a/tests/html/custom/mirrors_test.dart b/tests/html/custom/mirrors_test.dart
index e8778d1..87a7ffd 100644
--- a/tests/html/custom/mirrors_test.dart
+++ b/tests/html/custom/mirrors_test.dart
@@ -22,8 +22,8 @@
   setUp(() => customElementsReady.then((_) {
     if (!registered) {
       registered = true;
-      document.register(A.tag, A);
-      document.register(B.tag, B);
+      document.registerElement(A.tag, A);
+      document.registerElement(B.tag, B);
     }
   }));
 
diff --git a/tests/html/custom/regress_194523002_test.dart b/tests/html/custom/regress_194523002_test.dart
index f7a5ae1..33541df 100644
--- a/tests/html/custom/regress_194523002_test.dart
+++ b/tests/html/custom/regress_194523002_test.dart
@@ -28,7 +28,7 @@
     return customElementsReady.then((_) {
       if (!registered) {
         registered = true;
-        document.register(A.tag, A);
+        document.registerElement(A.tag, A);
       }
     });
   });
diff --git a/tests/html/custom/template_wrappers_test.dart b/tests/html/custom/template_wrappers_test.dart
index 5b9ff64..0828c97 100644
--- a/tests/html/custom/template_wrappers_test.dart
+++ b/tests/html/custom/template_wrappers_test.dart
@@ -30,7 +30,7 @@
   test('element is upgraded once', () {
 
     expect(createdCount, 0);
-    document.register('x-custom', CustomElement);
+    document.registerElement('x-custom', CustomElement);
     expect(createdCount, 0);
 
     var element = document.createElement('x-custom');
@@ -54,7 +54,7 @@
     d1.attributes['foo'] = 'bar';
     d1 = null;
 
-    document.register('x-custom-two', CustomElement);
+    document.registerElement('x-custom-two', CustomElement);
 
     expect(createdCount, 1);
 
diff --git a/tests/html/custom_elements_test.dart b/tests/html/custom_elements_test.dart
index f31f84a..3ab5207 100644
--- a/tests/html/custom_elements_test.dart
+++ b/tests/html/custom_elements_test.dart
@@ -46,7 +46,7 @@
   group('register', () {
     test('register', () {
       var tag = nextTag;
-      document.register(tag, CustomType);
+      document.registerElement(tag, CustomType);
 
       var element = new Element.tag(tag);
       expect(element, isNotNull);
@@ -56,13 +56,13 @@
 
     test('register twice', () {
       var tag = nextTag;
-      document.register(tag, CustomType);
+      document.registerElement(tag, CustomType);
       expect(() {
-        document.register(tag, CustomType);
+        document.registerElement(tag, CustomType);
       }, throws, reason: 'Cannot register a tag more than once.');
 
       var newTag = nextTag;
-      document.register(newTag, CustomType);
+      document.registerElement(newTag, CustomType);
 
       var element = new Element.tag(newTag);
       expect(element, isNotNull);
@@ -71,19 +71,19 @@
 
     test('register null', () {
       expect(() {
-        document.register(nextTag, null);
+        document.registerElement(nextTag, null);
       }, throws, reason: 'Cannot register a null type.');
     });
 
     test('register native', () {
       expect(() {
-        document.register(nextTag, BodyElement);
+        document.registerElement(nextTag, BodyElement);
       }, throws, reason: 'Cannot register a native element.');
     });
 
     test('register non-element', () {
       expect(() {
-        document.register(nextTag, NotAnElement);
+        document.registerElement(nextTag, NotAnElement);
       }, throws, reason: 'Cannot register a non-element.');
     });
   });
@@ -105,7 +105,7 @@
         firedOnPre = true;
       });
 
-      document.register(tag, CustomType);
+      document.registerElement(tag, CustomType);
       upgradeCustomElements(dom);
 
       var postElement = dom.children[0];
@@ -132,7 +132,7 @@
   group('innerHtml', () {
     test('query', () {
       var tag = nextTag;
-      document.register(tag, CustomType);
+      document.registerElement(tag, CustomType);
       var element = new DivElement();
       element.setInnerHtml('<$tag></$tag>',
           treeSanitizer: new NullTreeSanitizer());
@@ -147,7 +147,7 @@
 
     test('query id', () {
       var tag = nextTag;
-      document.register(tag, CustomType);
+      document.registerElement(tag, CustomType);
       var element = new DivElement();
       element.setInnerHtml('<$tag id="someid"></$tag>',
           treeSanitizer: new NullTreeSanitizer());
@@ -165,7 +165,7 @@
     test('created', () {
       int oldCount = customCreatedCount;
       var tag = nextTag;
-      document.register(tag, CustomType);
+      document.registerElement(tag, CustomType);
       var element = new DivElement();
       element.setInnerHtml('<$tag></$tag>',
           treeSanitizer: new NullTreeSanitizer());
@@ -178,7 +178,7 @@
   group('mixins', () {
     test('can invoke mixin methods', () {
       var tag = nextTag;
-      document.register(tag, CustomType);
+      document.registerElement(tag, CustomType);
 
       var element = new Element.tag(tag);
       element.invokeMixinMethod();
diff --git a/tests/html/html.status b/tests/html/html.status
index 08cdd23..deef6ce 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -16,7 +16,7 @@
 [ $compiler == dart2js && $browser ]
 custom/created_callback_test: Fail # Support for created constructor.
 
-[ $compiler == dart2js && ($runtime == safari || $runtime == ff || $runtime == chrome || $ie) ]
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff || $runtime == chrome || $ie) ]
 custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
 custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
 
@@ -72,6 +72,11 @@
 speechrecognition_test/types: Fail # TODO(dart2js-team): Please triage this failure.
 xhr_test/json: Fail # TODO(dart2js-team): Please triage this failure.
 
+[ $runtime == safarimobilesim ]
+canvasrenderingcontext2d_test/fillText: RuntimeError # Issue 18573
+element_offset_test/offset: RuntimeError # Issue 18573
+element_types_test/supported_meter: RuntimeError # Issue 18573
+
 [ $runtime == chrome ]
 touchevent_test/supported: Pass, Fail # Issue 17061
 xhr_cross_origin_test: Pass, Fail # Issue 11884
@@ -304,12 +309,9 @@
 xhr_test/supported_overrideMimeType: Fail
 xsltprocessor_test/supported: Fail
 
-[ $runtime == safari ]
+[ $runtime == safari || $runtime == safarimobilesim ]
 worker_test: Skip # Issue 13221
 worker_api_test: Skip # Issue 13221
-input_element_test/supported_month: RuntimeError
-input_element_test/supported_time: RuntimeError
-input_element_test/supported_week: RuntimeError
 webgl_1_test: Pass, Fail # Issue 8219
 canvasrenderingcontext2d_test/drawImage_video_element: Fail # Safari does not support drawImage w/ video element
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Safari does not support drawImage w/ video element
@@ -325,8 +327,6 @@
 fileapi_test/supported: Fail
 indexeddb_1_test/supported: Fail
 indexeddb_1_test/supportsDatabaseNames: Fail
-input_element_test/supported_date: Fail
-input_element_test/supported_datetime-local: Fail
 media_stream_test/supported_MediaStreamEvent: Fail
 media_stream_test/supported_MediaStreamTrackEvent: Fail
 media_stream_test/supported_media: Fail
@@ -334,9 +334,16 @@
 rtc_test/supported: Fail
 shadow_dom_test/supported: Fail
 speechrecognition_test/supported: Fail
-touchevent_test/supported: Fail
 xhr_test/json: Fail # Safari doesn't support JSON response type
 
+[ $runtime == safari ]
+input_element_test/supported_month: RuntimeError
+input_element_test/supported_time: RuntimeError
+input_element_test/supported_week: RuntimeError
+input_element_test/supported_date: Fail
+input_element_test/supported_datetime-local: Fail
+touchevent_test/supported: Fail
+
 [ $runtime == opera ]
 blob_constructor_test: Fail
 canvas_test: Fail
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index f1f41fa..0dd2952 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -9,6 +9,9 @@
 [ $runtime == vm && $arch == mips && $mode == debug ]
 mandel_isolate_test: Skip # Uses 600 MB Ram on our 1 GB test device.
 
+[ $runtime == vm && $arch == simarm && $mode == debug ]
+mandel_isolate_test: Crash, Pass # Issue 18670
+
 [ $runtime == vm && $arch == simarm64 ]
 *: Skip
 
diff --git a/tests/language/const_map3_test.dart b/tests/language/const_map3_test.dart
new file mode 100644
index 0000000..ee2f88c
--- /dev/null
+++ b/tests/language/const_map3_test.dart
@@ -0,0 +1,24 @@
+// 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 {
+  static const b = const B();
+}
+
+class B implements A {
+  const B();
+
+  operator ==(o) => true;  /// 00: compile-time error
+}
+
+main() {
+  // It is a compile-time error if the key type overrides operator ==.
+  var m = const { A.b: 42 };
+  Expect.equals(42, m[const B()]);
+
+  m = const { "foo": 99, A.b: 499 };
+  Expect.equals(499, m[const B()]);
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 91945d5..8a67e43 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -124,5 +124,20 @@
 stack_overflow_test: Skip # Crashes. Issue 17440.
 stack_overflow_stacktrace_test: Skip # Crashes. Issue 17440.
 
+# arm64 port is WIP. No issue numbers until we're a bit further along.
 [ $compiler == none && $runtime == vm && $arch == simarm64 ]
-*: Skip
+vm/regress_16873_test: Skip # Pass, Slow
+
+# Unimplemented features
+vm/string_polymorphic_test: Crash
+vm/optimization_test: Crash
+vm/math_vm_test: Crash
+vm/deopt_hoisted_smi_check_vm_test:Crash
+vm/reusable_boxes_test: Crash
+vm/allocation_sinking_vm_test: Crash
+double_modulo_test: Crash
+modulo_test: Crash
+guess_cid_test: Crash
+arithmetic_canonicalization_test: Crash
+try_catch_optimized1_test: Crash
+arithmetic_test: Crash
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index c07a0da..cb09358 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -453,12 +453,25 @@
 list_literal1_test/01: CompileTimeError # Issue 16391
 map_literal1_test/01: CompileTimeError # Issue 16391
 
-# Issue 17522
-deferred_constraints_type_annotation_test/*: Pass, Fail
-deferred_constraints_constants_test/*: Pass, Fail
+# Issue 18562- Old syntax (@lazy) for deferred libraries
 deferred_constraints_type_annotation_old_syntax_test/*: Pass, Fail
 deferred_constraints_constants_old_syntax_test/*: Pass, Fail
-deferred_closurize_load_library_test: Fail
+
+# Issue 18562- 'is', 'as' and 'catch' aren't type annotations, thus we don't
+# generate the "The deferred types cannot be used in a declaration" warning
+#deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
+#deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
+#deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
+
+# Deferred loading support, tests marked as failing until support is enabled by default.
+deferred_closurize_load_library_test: Pass, Fail
+deferred_not_loaded_check_test/*: Pass, Fail
+deferred_shadow_load_library_test: Pass, Fail
+deferred_constraints_constants_test/*: Pass, Fail
+deferred_load_library_wrong_args_test/*: Pass, Fail
+deferred_constraints_type_annotation_test/*: Pass, Fail
+deferred_load_inval_code_test: Pass, Fail
+deferred_not_loaded_check_test: Pass, Fail
 
 # Issues to be fixed now that type parameters have been fixed
 # (issues 14221, 15553)
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index da96370..46fe07f 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -78,6 +78,9 @@
 import_combinators_negative_test: fail
 interface_static_non_final_fields_negative_test: fail
 
+# test issue 11697: switch/case and static const class member
+switch_case_static_const_test: fail
+
 # test issue 11918: mixin and const constructor
 const_constructor_mixin_test/01: fail
 const_constructor_mixin3_test/01: fail
@@ -198,6 +201,7 @@
 bad_named_constructor_negative_test: CompileTimeError
 body_less_constructor_wrong_arg_negative_test: CompileTimeError
 const_counter_negative_test: CompileTimeError
+const_map3_test/00: MissingCompileTimeError
 const_optional_args_negative_test: CompileTimeError
 constructor_redirect1_negative_test: CompileTimeError
 constructor_redirect2_negative_test: CompileTimeError
@@ -453,13 +457,15 @@
 list_literal1_test/01: CompileTimeError # Issue 16391
 map_literal1_test/01: CompileTimeError # Issue 16391
 
-# Issue 17522
-deferred_constraints_type_annotation_test/*: Pass, Fail
-deferred_constraints_constants_test/*: Pass, Fail
+# Issue 18562- Old syntax (@lazy) for deferred libraries
 deferred_constraints_type_annotation_old_syntax_test/*: Pass, Fail
 deferred_constraints_constants_old_syntax_test/*: Pass, Fail
-deferred_shadow_load_library_test: Fail
-deferred_closurize_load_library_test: Fail
+
+# Issue 18562- 'is', 'as' and 'catch' aren't type annotations, thus we don't
+# generate the "The deferred types cannot be used in a declaration" warning
+deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
+deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
+deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
 
 # Issues to be fixed now that type parameters have been fixed
 # (issues 14221, 15553)
@@ -487,7 +493,4 @@
 factory1_test/none: StaticWarning
 generic_closure_test: StaticWarning
 local_function2_test: StaticWarning
-null_test/none: StaticWarning
 redirecting_factory_long_test: StaticWarning
-type_parameter_literal_test: StaticWarning
-mirrors/new_instance_with_type_arguments_test: StaticWarning
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index e55ec91..27041c4 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -146,7 +146,7 @@
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
 
-[ $compiler == dart2js && ($runtime == ff || $runtime == jsshell || $runtime == ie9 || $runtime == safari)]
+[ $compiler == dart2js && ($runtime == ff || $runtime == jsshell || $runtime == ie9 || $runtime == safari || $runtime == safarimobilesim)]
 round_test: Fail, OK # Common JavaScript engine Math.round bug.
 
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
diff --git a/tests/language/regress_18535_test.dart b/tests/language/regress_18535_test.dart
new file mode 100644
index 0000000..991a8a8
--- /dev/null
+++ b/tests/language/regress_18535_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for issue 18535.
+
+import 'dart:mirrors';
+import 'package:collection/collection.dart';
+
+void main() {
+  print(currentMirrorSystem().libraries);
+}
\ No newline at end of file
diff --git a/tests/language/switch_case_static_const_test.dart b/tests/language/switch_case_static_const_test.dart
new file mode 100644
index 0000000..e15a9f4
--- /dev/null
+++ b/tests/language/switch_case_static_const_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+class A {
+  static const S = 'A.S';
+}
+
+const S = 'S';
+
+foo(var p) {
+  switch (p) {
+    case S:
+      break;
+    case A.S:
+      break;
+    case 'abc':
+      break;
+  }
+}
+
+main() {
+  foo('p');
+}
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 5e5d7de..9d9085a 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -6,6 +6,7 @@
 lib/_internal: Skip # Slow like a hell - timeouts.
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
+lib/_blink/dartium/_blink_dartium: CompileTimeError # Issue 16522
 lib/_chrome/dart2js/chrome_dart2js: CompileTimeError # Issue 16522
 lib/html/dart2js/html_dart2js: CompileTimeError # Issue 16522
 lib/html/dartium/html_dartium: CompileTimeError # Issue 16522
@@ -16,7 +17,6 @@
 lib/_internal/compiler/samples/compile_loop/compile_loop: CompileTimeError  # Issue 16524
 lib/_internal/compiler/samples/darttags/darttags: CompileTimeError  # Issue 16524
 lib/js/dart2js/js_dart2js: CompileTimeError # Issue 16524
-lib/js/dartium/js_dartium: CompileTimeError # Issue 16524
 lib/svg/dart2js/svg_dart2js: CompileTimeError # Issue 16524
 lib/svg/dartium/svg_dartium: CompileTimeError # Issue 16524
 lib/typed_data/dart2js/native_typed_data_dart2js: CompileTimeError # Issue 16524
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 4198cae..da8892f 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -96,6 +96,7 @@
 mirrors/parameter_test/none: RuntimeError # Issue 6490
 mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 6490
 mirrors/private_symbol_test: CompileTimeError # Issue 13597
+mirrors/private_types_test: RuntimeError # Issue 6490
 mirrors/redirecting_factory_test/none: RuntimeError # Issue 6490
 mirrors/redirecting_factory_test/02: RuntimeError # Issue 6490
 mirrors/reflected_type_function_type_test: RuntimeError # Issue 12607
@@ -118,7 +119,7 @@
 mirrors/raw_type_test/01: RuntimeError # http://dartbug.com/6490
 mirrors/mirrors_reader_test: Slow, RuntimeError # Issue 16589
 
-[ $runtime == safari ]
+[ $runtime == safari || $runtime == safarimobilesim ]
 typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
 typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
 typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
@@ -128,7 +129,7 @@
 typed_data/setRange_2_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
 typed_data/setRange_3_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
 
-[ $compiler == dart2js && $runtime != jsshell && $runtime != safari && $runtime != ff && $runtime != ie9 && $runtime != ie10]
+[ $compiler == dart2js && $runtime != jsshell && $runtime != safarimobilesim && $runtime != safari && $runtime != ff && $runtime != ie9 && $runtime != ie10]
 math/math_test: RuntimeError
 math/math2_test: RuntimeError
 
diff --git a/tests/lib/mirrors/private_types_test.dart b/tests/lib/mirrors/private_types_test.dart
new file mode 100644
index 0000000..fd86f89
--- /dev/null
+++ b/tests/lib/mirrors/private_types_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.private_types;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+typedef int _F(int i);
+class _C<_T> {}
+
+typedef int F(int i);
+class C<T> {}
+
+main() {
+  Expect.isTrue(reflectType(_F).isPrivate);
+  Expect.isFalse((reflectType(_F) as TypedefMirror).referent.isPrivate);
+  Expect.isTrue(reflectType(_C).isPrivate);
+  Expect.isTrue(reflectClass(_C).typeVariables.single.isPrivate);
+
+  Expect.isFalse(reflectType(F).isPrivate);
+  Expect.isFalse((reflectType(F) as TypedefMirror).referent.isPrivate);
+  Expect.isFalse(reflectType(C).isPrivate);
+  Expect.isFalse(reflectClass(C).typeVariables.single.isPrivate);
+
+  Expect.isFalse(reflectType(dynamic).isPrivate);
+  Expect.isFalse(currentMirrorSystem().dynamicType.isPrivate);
+  Expect.isFalse(currentMirrorSystem().voidType.isPrivate);
+}
diff --git a/tests/lib/profiler/user_tags_test.dart b/tests/lib/profiler/user_tags_test.dart
index 4070d90..f09abcd 100644
--- a/tests/lib/profiler/user_tags_test.dart
+++ b/tests/lib/profiler/user_tags_test.dart
@@ -6,6 +6,11 @@
 import 'dart:profiler';
 import 'package:expect/expect.dart';
 
+// Test that the default tag is set.
+testDefault() {
+  Expect.isTrue(identical(UserTag.defaultTag, getCurrentTag()));
+}
+
 // Test that the label property matches the constructor.
 void testLabel() {
   var label = 'Hello World';
@@ -19,6 +24,9 @@
   var label = 'Global Tag';
   var tag = new UserTag(label);
   Expect.isTrue(identical(tag, tag1));
+  var defaultLabel = 'Default';
+  var defaultTag = new UserTag(defaultLabel);
+  Expect.isTrue(identical(UserTag.defaultTag, defaultTag));
 }
 
 
@@ -29,16 +37,6 @@
 }
 
 
-// Test clearCurrentTag.
-void testClearCurrent(tag) {
-  tag.makeCurrent();
-  Expect.isTrue(identical(tag, getCurrentTag()));
-  var old_tag = clearCurrentTag();
-  Expect.isTrue(identical(tag, old_tag));
-  Expect.isNull(getCurrentTag());
-}
-
-
 // Test that we reach a limit of tags an exception is thrown.
 void testExhaust() {
   var i = 0;
@@ -50,7 +48,29 @@
 }
 
 
+var callerTag = new UserTag('caller');
+var calleeTag = new UserTag('callee');
+
+void callee() {
+  var old = calleeTag.makeCurrent();
+  Expect.isTrue(identical(calleeTag, getCurrentTag()));
+  old.makeCurrent();
+}
+
+void testCallerPattern() {
+  Expect.isTrue(identical(UserTag.defaultTag, getCurrentTag()));
+  var old = callerTag.makeCurrent();
+  Expect.isTrue(identical(callerTag, getCurrentTag()));
+  callee();
+  Expect.isTrue(identical(callerTag, getCurrentTag()));
+  old.makeCurrent();
+  Expect.isTrue(identical(UserTag.defaultTag, getCurrentTag()));
+}
+
+
 main() {
+  testDefault();
+  testCallerPattern();
   var label = 'Global Tag';
   var tag = new UserTag(label);
   testLabel();
@@ -58,6 +78,5 @@
   for (var i = 0; i < 2000; i++) {
     testMakeCurrent(tag);
   }
-  testClearCurrent(tag);
   Expect.throws(testExhaust);
 }
diff --git a/tests/standalone/io/raw_secure_server_socket_test.dart b/tests/standalone/io/raw_secure_server_socket_test.dart
index 6c90ed9..33fc191 100644
--- a/tests/standalone/io/raw_secure_server_socket_test.dart
+++ b/tests/standalone/io/raw_secure_server_socket_test.dart
@@ -472,8 +472,6 @@
 }
 
 testPausedSecuringSubscription(bool pausedServer, bool pausedClient) {
-  bool expectFail = pausedServer || pausedClient;
-
   asyncStart();
   var clientComplete = new Completer();
   RawServerSocket.bind(HOST, 0).then((server) {
@@ -483,25 +481,32 @@
         if (pausedServer) {
           subscription.pause();
         }
-        RawSecureSocket.secureServer(
-            client, CERTIFICATE, subscription: subscription).then((client) {
-          if (expectFail) {
-            Expect.fail("secureServer succeeded with paused subscription");
-          }
-        }).catchError((e) {
-          if (!expectFail) {
-            Expect.fail("secureServer failed with non-paused subscriptions");
-          }
-          if (pausedServer) {
-            Expect.isTrue(e is StateError);
-          }
-        }).whenComplete(() {
+        void done() {
           server.close();
           clientComplete.future.then((_) {
             client.close();
             asyncEnd();
           });
-        });
+        }
+        try {
+          RawSecureSocket.secureServer(
+              client, CERTIFICATE, subscription: subscription)
+            .catchError((_) {})
+            .whenComplete(() {
+              if (pausedServer) {
+                Expect.fail("secureServer succeeded with paused subscription");
+              }
+              done();
+            });
+        } catch (e) {
+          if (!pausedServer) {
+            Expect.fail("secureServer failed with non-paused subscriptions");
+          }
+          if (pausedServer) {
+            Expect.isTrue(e is ArgumentError);
+          }
+          done();
+        }
       });
     });
 
@@ -511,22 +516,26 @@
         if (pausedClient) {
           subscription.pause();
         }
-        RawSecureSocket.secure(
-            socket, subscription: subscription).then((socket) {
-          if (expectFail) {
-            Expect.fail("secure succeeded with paused subscription");
-          }
-          socket.close();
-        }).catchError((e) {
-          if (!expectFail) {
+        try {
+          RawSecureSocket.secure(
+              socket, subscription: subscription)
+            .catchError((_) {})
+            .whenComplete(() {
+              if (pausedClient) {
+                Expect.fail("secure succeeded with paused subscription");
+              }
+              socket.close();
+              clientComplete.complete(null);
+            });
+        } catch (e) {
+          if (!pausedClient) {
             Expect.fail("secure failed with non-paused subscriptions ($e)");
           }
           if (pausedClient) {
-            Expect.isTrue(e is StateError);
+            Expect.isTrue(e is ArgumentError);
           }
-        }).whenComplete(() {
           clientComplete.complete(null);
-        });
+        }
       });
     });
   });
@@ -555,6 +564,7 @@
   testSimpleConnectFail("not_a_nickname", true);
   testSimpleConnectFail("CN=notARealDistinguishedName", true);
   testServerListenAfterConnect();
+
   testSimpleReadWrite(listenSecure: true,
                       connectSecure: true,
                       handshakeBeforeSecure: false,
diff --git a/tests/standalone/io/web_socket_test.dart b/tests/standalone/io/web_socket_test.dart
index 27a903e..564f412 100644
--- a/tests/standalone/io/web_socket_test.dart
+++ b/tests/standalone/io/web_socket_test.dart
@@ -386,7 +386,8 @@
     });
   }
 
-  testFromSocket() {
+  testFromUpgradedSocket() {
+    asyncStart();
     createServer().then((server) {
       server.listen((request) {
         Expect.equals('Upgrade', request.headers.value(HttpHeaders.CONNECTION));
@@ -401,18 +402,17 @@
             ..headers.add(HttpHeaders.UPGRADE, "websocket")
             ..headers.add("Sec-WebSocket-Accept", accept);
         request.response.contentLength = 0;
-        return request.response.detachSocket()
-            .then((socket) => new WebSocket.fromUpgradedSocket(socket))
-            .then((websocket) {
+        request.response.detachSocket().then((socket) {
+          return new WebSocket.fromUpgradedSocket(socket, serverSide: true);
+        }).then((websocket) {
           websocket.add("Hello");
           websocket.close();
+          asyncEnd();
         });
       });
 
       var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
 
-      var client = new HttpClient();
-      var completer = new Completer();
       WebSocket.connect(url).then((websocket) {
         return websocket.listen((message) {
           Expect.equals("Hello", message);
@@ -442,7 +442,7 @@
     testUsePOST();
     testConnections(10, 3002, "Got tired");
     testIndividualUpgrade(5);
-    testFromSocket();
+    testFromUpgradedSocket();
   }
 }
 
diff --git a/tests/standalone/issue14236_test.dart b/tests/standalone/issue14236_test.dart
index e2a36fe..26ec20a 100644
--- a/tests/standalone/issue14236_test.dart
+++ b/tests/standalone/issue14236_test.dart
Binary files differ
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index e9564a6..62de2f0 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -118,8 +118,6 @@
 io/file_stat_test: Fail # dartbug.com/17440
 io/process_sync_test: Skip # Starts 10 dart subprocesses, uses too much memory.
 io/signals_test: Skip # Starts 10 dart subprocesses, uses too much memory
-
-[ $arch == mips && $mode == debug ]
 io/file_read_special_device_test: Fail # dartbug.com/17440
 
 [ $arch == simarm64 ]
diff --git a/tests/standalone/vmservice/isolate_class_field_test.dart b/tests/standalone/vmservice/isolate_class_field_test.dart
index be85613..dd3f44e 100644
--- a/tests/standalone/vmservice/isolate_class_field_test.dart
+++ b/tests/standalone/vmservice/isolate_class_field_test.dart
@@ -30,7 +30,7 @@
     Expect.equals('Field', field['type']);
     Expect.equals('final_fixed_length_list', field['user_name']);
     Expect.equals('final_fixed_length_list', field['name']);
-    Expect.equals('Float32List', field['guard_class']['user_name']);
+    Expect.equals('_Float32Array', field['guard_class']['user_name']);
     Expect.equals(true, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
@@ -44,7 +44,7 @@
     Expect.equals(false, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
-    Expect.equals('Float32List', field['guard_class']['user_name']);
+    Expect.equals('_Float32Array', field['guard_class']['user_name']);
     Expect.equals('variable', field['guard_length']);
   }
 
@@ -55,7 +55,7 @@
     Expect.equals(false, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
-    Expect.equals('String', field['guard_class']['user_name']);
+    Expect.equals('_OneByteString', field['guard_class']['user_name']);
     Expect.equals(false, field['guard_nullable']);
     Expect.equals('variable', field['guard_length']);
   }
@@ -86,7 +86,7 @@
     Expect.equals(false, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
-    Expect.equals('double', field['guard_class']['user_name']);
+    Expect.equals('_Double', field['guard_class']['user_name']);
     Expect.equals(true, field['guard_nullable']);
     Expect.equals('variable', field['guard_length']);
   }
@@ -98,7 +98,7 @@
     Expect.equals(true, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(true, field['final']);
-    Expect.equals('int', field['guard_class']['user_name']);
+    Expect.equals('_Smi', field['guard_class']['user_name']);
     Expect.equals(false, field['guard_nullable']);
     Expect.equals('variable', field['guard_length']);
   }
@@ -107,7 +107,7 @@
     Expect.equals('Field', field['type']);
     Expect.equals('final_fixed_length_list', field['user_name']);
     Expect.equals('final_fixed_length_list', field['name']);
-    Expect.equals('Float32List', field['guard_class']['user_name']);
+    Expect.equals('_Float32Array', field['guard_class']['user_name']);
     Expect.equals(true, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
@@ -118,7 +118,7 @@
     Expect.equals('Field', field['type']);
     Expect.equals('fixed_length_array', field['user_name']);
     Expect.equals('fixed_length_array', field['name']);
-    Expect.equals('List', field['guard_class']['user_name']);
+    Expect.equals('_List', field['guard_class']['user_name']);
     Expect.equals(true, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
diff --git a/tests/try/cursor_position_test.dart b/tests/try/cursor_position_test.dart
new file mode 100644
index 0000000..ef7932f
--- /dev/null
+++ b/tests/try/cursor_position_test.dart
@@ -0,0 +1,144 @@
+// 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.
+
+// SharedOptions=--package-root=sdk/lib/_internal/
+
+// Test that cursor positions are correctly updated after adding new content.
+
+library trydart.cursor_position_test;
+
+import 'dart:html';
+import 'dart:async';
+
+import '../../site/try/src/interaction_manager.dart' show
+    InteractionManager;
+
+import '../../site/try/src/ui.dart' show
+    hackDiv,
+    mainEditorPane,
+    observer;
+
+import '../../site/try/src/user_option.dart' show
+    UserOption;
+
+import '../../pkg/expect/lib/expect.dart';
+
+import '../../pkg/async_helper/lib/async_helper.dart';
+
+void main() {
+  InteractionManager interaction = mockTryDartInteraction();
+
+  List<TestCase> tests = <TestCase>[
+
+    new TestCase('Test adding two lines programmatically.', () {
+      clearEditorPaneWithoutNotifications();
+      mainEditorPane.appendText('\n\n');
+      Text text = mainEditorPane.firstChild;
+      window.getSelection().collapse(text, 1);
+      checkSelectionIsCollapsed(text, 1);
+    }, checkAtBeginningOfSecondLine),
+
+    new TestCase('Test adding a new line with mock key event.', () {
+      clearEditorPaneWithoutNotifications();
+      checkSelectionIsCollapsed(mainEditorPane, 0);
+      simulateEnterKeyDown(interaction);
+    }, checkAtBeginningOfSecondLine),
+
+  ];
+
+  runTests(tests.iterator, completerForAsyncTest());
+}
+
+void simulateEnterKeyDown(InteractionManager interaction) {
+  interaction.onKeyUp(
+      new MockKeyboardEvent('keydown', keyCode: KeyCode.ENTER));
+}
+
+void clearEditorPaneWithoutNotifications() {
+  mainEditorPane.nodes.clear();
+  observer.takeRecords();
+}
+
+void checkSelectionIsCollapsed(Node node, int offset) {
+  var selection = window.getSelection();
+  Expect.isTrue(selection.isCollapsed, 'selection.isCollapsed');
+  Expect.equals(node, selection.anchorNode, 'selection.anchorNode');
+  Expect.equals(offset, selection.anchorOffset, 'selection.anchorOffset');
+}
+
+void checkLineCount(int expectedLineCount) {
+  Expect.equals(
+      expectedLineCount, mainEditorPane.nodes.length,
+      'mainEditorPane.nodes.length');
+}
+
+void checkAtBeginningOfSecondLine() {
+  checkLineCount(2);
+  checkSelectionIsCollapsed(mainEditorPane.nodes[1].firstChild, 0);
+}
+
+runTests(Iterator<TestCase> iterator, Completer completer) {
+  if (iterator.moveNext()) {
+    TestCase test = iterator.current;
+    new Future(() {
+      print('${test.description}\nSetup.');
+      test.setup();
+      new Future(() {
+        test.validate();
+        print('${test.description}\nDone.');
+        runTests(iterator, completer);
+      });
+    });
+  } else {
+    completer.complete(null);
+  }
+}
+
+Completer completerForAsyncTest() {
+  Completer completer = new Completer();
+  asyncTest(() => completer.future.then((_) {
+    // Clear the DOM to work around a bug in test.dart.
+    document.body.nodes.clear();
+  }));
+  return completer;
+}
+
+InteractionManager mockTryDartInteraction() {
+  UserOption.storage = {};
+
+  InteractionManager interaction = new InteractionManager();
+
+  hackDiv = new DivElement();
+  mainEditorPane = new DivElement()
+      ..style.whiteSpace = 'pre'
+      ..contentEditable = 'true';
+
+  observer = new MutationObserver(interaction.onMutation);
+  observer.observe(
+      mainEditorPane, childList: true, characterData: true, subtree: true);
+
+  document.body.nodes.addAll([mainEditorPane, hackDiv]);
+
+  return interaction;
+}
+
+class MockKeyboardEvent extends KeyEvent {
+  final int keyCode;
+
+  MockKeyboardEvent(String type, {int keyCode})
+      : this.keyCode = keyCode,
+        super.wrap(new KeyEvent(type, keyCode: keyCode));
+
+  bool getModifierState(String keyArgument) => false;
+}
+
+typedef void VoidFunction();
+
+class TestCase {
+  final String description;
+  final VoidFunction setup;
+  final VoidFunction validate;
+
+  TestCase(this.description, this.setup, this.validate);
+}
diff --git a/tests/try/end_to_end_test.dart b/tests/try/end_to_end_test.dart
index 46abf8e..3452aa8 100644
--- a/tests/try/end_to_end_test.dart
+++ b/tests/try/end_to_end_test.dart
@@ -19,6 +19,18 @@
 
 import 'package:async_helper/async_helper.dart';
 
+void onError(String message, String filename, int lineno) {
+  if (filename != null) {
+    message = '$filename:$lineno: $message';
+  }
+  print("Error occurred in Try Dart iframe: $message");
+  new Future(() {
+    // Chrome seems to not call window.onerror when you throw in response to an
+    // error event.  So we throw the error in a future.
+    throw 'Error from iframe: $message';
+  });
+}
+
 void installErrorHandlerOn(IFrameElement iframe) {
   // This method uses dart:js to install an error event handler on the content
   // window of [iframe]. This is a workaround for http://dartbug.com/17936.
@@ -29,16 +41,10 @@
     throw 'No contentWindow in iframe';
   }
   contentWindowProxy.callMethod('addEventListener', ['error', (eventProxy) {
-    String filename = eventProxy['filename'];
-    int lineno = eventProxy['lineno'];
-    String message = eventProxy['message'];
-    print("Error occurred in iframe: $message");
-    new Future(() {
-      // Chrome seems to not call window.onerror when you throw in response to
-      // an error event. So we throw the error in a future.
-      throw 'Error from iframe: $filename:$lineno: $message';
-    });
+    onError(
+        eventProxy['message'], eventProxy['filename'], eventProxy['lineno']);
   }]);
+  contentWindowProxy['onerror'] = onError;
 }
 
 void onIframeLoaded(Event event) {
@@ -66,7 +72,6 @@
   window.localStorage.clear();
 
   IFrameElement iframe = new IFrameElement()
-      ..src = '/root_build/try_dartlang_org/index.html'
       ..style.width = '90vw'
       ..style.height = '90vh'
       ..onLoad.listen(onIframeLoaded);
@@ -75,4 +80,6 @@
   // fired the load event.  That seems to matter according to some sources on
   // stackoverflow.
   installErrorHandlerOn(iframe);
+
+  iframe.src = '/root_build/try_dartlang_org/index.html';
 }
diff --git a/tests/try/internal_error_test.dart b/tests/try/internal_error_test.dart
new file mode 100644
index 0000000..8cbac3a
--- /dev/null
+++ b/tests/try/internal_error_test.dart
@@ -0,0 +1,53 @@
+// 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.
+
+// SharedOptions=--package-root=sdk/lib/_internal/
+
+library trydart.internal_error_test;
+
+import 'dart:html';
+import 'dart:async';
+
+import '../../site/try/src/interaction_manager.dart' show
+    InteractionManager,
+    TRY_DART_NEW_DEFECT;
+
+import '../../site/try/src/ui.dart' show
+    mainEditorPane,
+    observer,
+    outputDiv;
+
+import '../../site/try/src/user_option.dart' show
+    UserOption;
+
+import '../../pkg/expect/lib/expect.dart';
+import '../../pkg/async_helper/lib/async_helper.dart';
+
+main() {
+  UserOption.storage = {};
+
+  var interaction = new InteractionManager();
+  mainEditorPane = new DivElement();
+  outputDiv = new PreElement();
+  document.body.append(mainEditorPane);
+  observer = new MutationObserver((mutations, observer) {
+    try {
+      interaction.onMutation(mutations, observer);
+    } catch (e) {
+      // Ignored.
+    }
+  });
+  observer.observe(
+      mainEditorPane, childList: true, characterData: true, subtree: true);
+
+  mainEditorPane.innerHtml = 'main() { print("hello"); }';
+
+  interaction.currentCompilationUnit = null; // This will provoke a crash.
+
+  asyncTest(() {
+    return new Future(() {
+      Expect.isTrue(outputDiv.text.contains(TRY_DART_NEW_DEFECT));
+    });
+  });
+}
diff --git a/tests/try/paste_content_rewriting_test.dart b/tests/try/paste_content_rewriting_test.dart
index 8355275..f16c3d8 100644
--- a/tests/try/paste_content_rewriting_test.dart
+++ b/tests/try/paste_content_rewriting_test.dart
@@ -23,13 +23,16 @@
 import '../../pkg/async_helper/lib/async_helper.dart';
 
 const Map<String, String> tests = const <String, String> {
-  '<span><p>//...</p>}</span>': '//...\n}\n',
-  'someText': 'someText\n',
-  '"\$"': '"<DIAGNOSTIC>\$</DIAGNOSTIC>"\n',
-  '"\$\$"': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>"\n',
-  '"\$\$4"': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>4"\n',
-  '"\$\$4 "': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>4 "\n',
-  '1e': '<DIAGNOSTIC>1e</DIAGNOSTIC>\n',
+  '<span><p>//...</p>}</span>': '//...\n}',
+  'someText': 'someText',
+  '"\$"': '"<DIAGNOSTIC>\$</DIAGNOSTIC>"',
+  '"\$\$"': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>"',
+  '"\$\$4"': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>4"',
+  '"\$\$4 "': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>4 "',
+  '1e': '<DIAGNOSTIC>1e</DIAGNOSTIC>',
+  'r"""\n\n\'"""': 'r"""\n\n\'"""',
+  '"': '<DIAGNOSTIC>"</DIAGNOSTIC>',
+  '/**\n*/': '/**\n*/',
 };
 
 List<Node> queryDiagnosticNodes() {
@@ -76,7 +79,5 @@
       ..observe(
           mainEditorPane, childList: true, characterData: true, subtree: true);
 
-  mainEditorPane.innerHtml = "<span><p>//...</p>}</span>";
-
   asyncTest(runTests);
 }
diff --git a/tests/try/try.status b/tests/try/try.status
index 2b285d9..e591cc8 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -2,9 +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.
 
-# Not dart2js on chrome or drt.
-[ $compiler != dart2js || ($runtime != drt && $runtime != chrome) ]
+# Try Dart is tested on the following configurations:
+# dart2js-drt (Content Shell --dump-render-tree)
+# dart2js-chrome
+# dart2js-ff (Firefox)
+[ $compiler != dart2js || ($runtime != drt && $runtime != chrome && $runtime != ff) ]
 *: Skip
 
 [ $csp ]
-end_to_end_test: Fail, OK # http://dartbug.com/17935
+end_to_end_test: Skip, OK # http://dartbug.com/17935
diff --git a/tools/VERSION b/tools/VERSION
index ef14d62..ed7eba2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 4
 PATCH 0
-PRERELEASE 5
-PRERELEASE_PATCH 1
+PRERELEASE 6
+PRERELEASE_PATCH 0
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index 6aacb4f..d0974e6 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -264,8 +264,9 @@
     else:
       gsutil_command = [sys.executable, GSUtil.GSUTIL_PATH]
 
-    run(gsutil_command + gsutil_args, env=env,
-        shell=(GSUtil.GSUTIL_IS_SHELL_SCRIPT and sys.platform == 'win32'))
+    return run(gsutil_command + gsutil_args, env=env,
+               shell=(GSUtil.GSUTIL_IS_SHELL_SCRIPT and
+                      sys.platform == 'win32'))
 
   def upload(self, local_path, remote_path, recursive=False, public=False):
     assert remote_path.startswith('gs://')
@@ -278,6 +279,13 @@
     args += [local_path, remote_path]
     self.execute(args)
 
+  def cat(self, remote_path):
+    assert remote_path.startswith('gs://')
+
+    args = ['cat', remote_path]
+    (stdout, _, _) = self.execute(args)
+    return stdout
+
   def setGroupReadACL(self, remote_path, group):
     args = ['acl', 'ch', '-g', '%s:R' % group, remote_path]
     self.execute(args)
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index ca322f9..06c3b07 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -25,7 +25,7 @@
     r'dart2js-(linux|mac|windows)(-(jsshell))?-(debug|release)(-(checked|host-checked))?(-(host-checked))?(-(minified))?(-(x64))?-?(\d*)-?(\d*)')
 DART2JS_FULL_BUILDER = r'dart2js-full-(linux|mac|windows)(-checked)?(-minified)?-(\d+)-(\d+)'
 WEB_BUILDER = (
-    r'dart2js-(ie9|ie10|ie11|ff|safari|chrome|chromeOnAndroid|opera|drt)-(win7|win8|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
+    r'dart2js-(ie9|ie10|ie11|ff|safari|chrome|chromeOnAndroid|safarimobilesim|opera|drt)-(win7|win8|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
 
 DART2JS_FULL_CONFIGURATIONS = {
   'linux' : [ ],
diff --git a/tools/bots/linux_distribution_support.py b/tools/bots/linux_distribution_support.py
index 3714728..8b3e251 100644
--- a/tools/bots/linux_distribution_support.py
+++ b/tools/bots/linux_distribution_support.py
@@ -99,10 +99,10 @@
   with bot.BuildStep('Upload artifacts'):
     bot_name, _ = bot.GetBotName()
     channel = bot_utils.GetChannelFromName(bot_name)
-#    if channel != bot_utils.Channel.BLEEDING_EDGE:
-    ArchiveArtifacts(tarfile, builddir, channel, build_info.builder_tag)
-#    else:
-#      print 'Not uploading artifacts on bleeding edge'
+    if channel != bot_utils.Channel.BLEEDING_EDGE:
+     ArchiveArtifacts(tarfile, builddir, channel, build_info.builder_tag)
+    else:
+      print 'Not uploading artifacts on bleeding edge'
 
 if __name__ == '__main__':
   # We pass in None for build_step to avoid building the sdk.
diff --git a/tools/bots/version_checker.py b/tools/bots/version_checker.py
new file mode 100755
index 0000000..d6295a6
--- /dev/null
+++ b/tools/bots/version_checker.py
@@ -0,0 +1,85 @@
+#!/usr/bin/python
+
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+import json
+import re
+import sys
+
+import bot
+import bot_utils
+
+utils = bot_utils.GetUtils()
+
+VERSION_BUILDER = r'version-checker'
+
+def VersionConfig(name, is_buildbot):
+  version_pattern = re.match(VERSION_BUILDER, name)
+  if not version_pattern:
+      return None
+  # We don't really use this, but we create it anyway to use the standard
+  # bot execution model.
+  return bot.BuildInfo('none', 'none', 'release', 'linux')
+
+def GetLatestVersionFromGCS(channel):
+  namer = bot_utils.GCSNamer(channel=channel)
+  gsutil = bot_utils.GSUtil()
+  gcs_version_path = namer.version_filepath('latest')
+  print 'Getting latest version from: %s' % gcs_version_path
+  version_json = gsutil.cat(gcs_version_path)
+  version_map = json.loads(version_json)
+  return version_map['version']
+
+def ValidateChannelVersion(latest_version, channel):
+  repo_version = utils.ReadVersionFile()
+  assert repo_version.channel == channel
+  if channel == bot_utils.Channel.STABLE:
+    assert int(repo_version.prerelease) == 0
+    assert int(repo_version.prerelease_patch) == 0
+
+  version_re = r'(\d+)\.(\d+)\.(\d+)(-dev\.(\d+)\.(\d+))?'
+
+  latest_match = re.match(version_re, latest_version)
+  latest_major = int(latest_match.group(1))
+  latest_minor = int(latest_match.group(2))
+  latest_patch = int(latest_match.group(3))
+  # We don't use these on stable.
+  latest_prerelease = int(latest_match.group(5) or 0)
+  latest_prerelease_patch = int(latest_match.group(6) or 0)
+
+  if latest_major < int(repo_version.major):
+    return True
+  if latest_minor < int(repo_version.minor):
+    return True
+  if latest_patch < int(repo_version.patch):
+    return True
+  if latest_prerelease < int(repo_version.prerelease):
+    return True
+  if latest_prerelease_patch < int(repo_version.prerelease_patch):
+    return True
+  return False
+
+def VersionSteps(build_info):
+  with bot.BuildStep('Version file sanity checking'):
+    bot_name, _ = bot.GetBotName()
+    channel = bot_utils.GetChannelFromName(bot_name)
+    if channel == bot_utils.Channel.BLEEDING_EDGE:
+      print 'No sanity checking on bleeding edge'
+    else:
+      assert (channel == bot_utils.Channel.STABLE or
+              channel == bot_utils.Channel.DEV)
+      latest_version = GetLatestVersionFromGCS(channel)
+      version = utils.GetVersion()
+      print 'Latests version on GCS: %s' % latest_version
+      print 'Version currently building: %s' % version
+      if not ValidateChannelVersion(latest_version, channel):
+        print "Validation failed"
+        sys.exit(1)
+      else:
+        print 'Version file changed, sanity checks passed'
+
+if __name__ == '__main__':
+  # We pass in None for build_step to avoid building.
+  bot.RunBot(VersionConfig, VersionSteps, build_step=None)
diff --git a/tools/create_debian_packages.py b/tools/create_debian_packages.py
index 0eba452..3b344c6 100755
--- a/tools/create_debian_packages.py
+++ b/tools/create_debian_packages.py
@@ -31,6 +31,10 @@
   result.add_option("--out_dir",
                     default=None,
                     help="Where to put the packages.")
+  result.add_option("-a", "--arch",
+      help='Target architectures (comma-separated).',
+      metavar='[all,ia32,x64]',
+      default='x64')
 
   return result
 
@@ -45,7 +49,7 @@
     raise Exception('Command \'%s\' failed: %s\nSTDOUT: %s' %
                     (' '.join(cmd), stderr, stdout))
 
-def BuildDebianPackage(tarball, out_dir):
+def BuildDebianPackage(tarball, out_dir, arch):
   version = utils.GetVersion()
   tarroot = 'dart-%s' % version
   origtarname = 'dart_%s.orig.tar.gz' % version
@@ -65,9 +69,15 @@
     print "Building source package"
     RunBuildPackage(['-S', '-us', '-uc'], join(temp_dir, tarroot));
 
+    # Build 32-bit binary package.
+    if ('ia32' in arch):
+      print "Building i386 package"
+      RunBuildPackage(['-B', '-ai386', '-us', '-uc'], join(temp_dir, tarroot));
+
     # Build 64-bit binary package.
-    print "Building amd64 package"
-    RunBuildPackage(['-B', '-aamd64', '-us', '-uc'], join(temp_dir, tarroot));
+    if ('x64' in arch):
+      print "Building amd64 package"
+      RunBuildPackage(['-B', '-aamd64', '-us', '-uc'], join(temp_dir, tarroot));
 
     # Copy the Debian package files to the build directory.
     debbase = 'dart_%s' % version
@@ -76,14 +86,21 @@
       '%s.orig.tar.gz' % debbase,
       '%s-1.debian.tar.gz' % debbase
     ]
+    i386_package = [
+      '%s-1_i386.deb' % debbase
+    ]
     amd64_package = [
       '%s-1_amd64.deb' % debbase
     ]
 
     for name in source_package:
       copyfile(join(temp_dir, name), join(out_dir, name))
-    for name in amd64_package:
-      copyfile(join(temp_dir, name), join(out_dir, name))
+    if ('ia32' in arch):
+      for name in i386_package:
+        copyfile(join(temp_dir, name), join(out_dir, name))
+    if ('x64' in arch):
+      for name in amd64_package:
+        copyfile(join(temp_dir, name), join(out_dir, name))
 
 def Main():
   if HOST_OS != 'linux':
@@ -93,6 +110,10 @@
   options, args = BuildOptions().parse_args()
   out_dir = options.out_dir
   tar_filename = options.tar_filename
+  if options.arch == 'all':
+    options.arch = 'ia32,x64'
+  arch = options.arch.split(',')
+
   if not options.out_dir:
     out_dir = join(DART_DIR, utils.GetBuildDir(HOST_OS, HOST_OS))
 
@@ -101,7 +122,7 @@
                         utils.GetBuildDir(HOST_OS, HOST_OS),
                         'dart-%s.tar.gz' % utils.GetVersion())
 
-  BuildDebianPackage(tar_filename, out_dir)
+  BuildDebianPackage(tar_filename, out_dir, arch)
 
 if __name__ == '__main__':
   sys.exit(Main())
diff --git a/tools/dartium/archive.py b/tools/dartium/archive.py
new file mode 100755
index 0000000..04889cc
--- /dev/null
+++ b/tools/dartium/archive.py
@@ -0,0 +1,204 @@
+#!/usr/bin/python
+
+# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import glob
+import optparse
+import os
+import shutil
+import subprocess
+import sys
+import utils
+
+HOST_OS = utils.guessOS()
+
+if HOST_OS == 'mac':
+  VERSION_FILE = 'Chromium.app/Contents/MacOS/VERSION'
+  CONTENTSHELL_FILES = ['Content Shell.app', 'ffmpegsumo.so', 'osmesa.so',
+                        'lib']
+  CHROMEDRIVER_FILES = ['chromedriver']
+elif HOST_OS == 'linux':
+  VERSION_FILE = 'VERSION'
+  CONTENTSHELL_FILES = ['content_shell', 'content_shell.pak', 'fonts.conf',
+                        'libffmpegsumo.so', 'libosmesa.so', 'lib',
+                        'icudtl.dat']
+  CHROMEDRIVER_FILES = ['chromedriver']
+elif HOST_OS == 'win':
+  VERSION_FILE = 'VERSION'
+  # TODO: provide proper list.
+  CONTENTSHELL_FILES = ['content_shell.exe', 'AHEM____.ttf']
+  CHROMEDRIVER_FILES = ['chromedriver.exe']
+else:
+  raise Exception('Unsupported platform')
+
+# Append a file with size of the snapshot.
+CONTENTSHELL_FILES.append('snapshot-size.txt')
+
+
+def GenerateVersionFile():
+  # TODO: fix it.
+  if HOST_OS == 'win': return
+  versionInfo = utils.getCommandOutput(os.path.join('..', '..',
+                                                    'dart', 'tools', 'dartium',
+                                                    'print_dart_version.sh'))
+  file = open(VERSION_FILE, 'w')
+  file.write(versionInfo)
+  file.close()
+
+
+def GenerateDartiumFileList(mode, srcpath):
+  def blacklisted(name):
+    # We include everything if this is a debug build.
+    if mode.lower() == 'debug':
+      return True
+    else:
+      # We don't include .debug/.pdb files if this is a release build.
+      if name.endswith('.debug') or name.endswith('.pdb'):
+        return False
+      return True
+
+  configFile = os.path.join(srcpath, 'chrome', 'tools', 'build', HOST_OS,
+                            'FILES.cfg')
+  configNamespace = {}
+  execfile(configFile, configNamespace)
+  fileList = [file['filename'] for file in configNamespace['FILES']]
+
+  # The debug version of dartium on our bots build with
+  # 'component=shared_library', so we need to include all libraries
+  # (i.e. 'lib/*.so) as we do on the CONTENTSHELL_FILES list above.
+  if HOST_OS == 'linux' and mode.lower() == 'debug':
+    fileList.append('lib')
+
+  # Filter out files we've blacklisted and don't want to include.
+  fileList = filter(blacklisted, fileList)
+  return fileList
+
+
+def GenerateContentShellFileList(srcpath):
+  return CONTENTSHELL_FILES
+
+
+def GenerateChromeDriverFileList(srcpath):
+  return CHROMEDRIVER_FILES
+
+
+def ZipDir(zipFile, directory):
+  if HOST_OS == 'win':
+    cmd = os.path.normpath(os.path.join(
+        os.path.dirname(__file__),
+        '../third_party/lzma_sdk/Executable/7za.exe'))
+    options = ['a', '-r', '-tzip']
+  else:
+    cmd = 'zip'
+    options = ['-yr']
+  utils.runCommand([cmd] + options + [zipFile, directory])
+
+
+def GenerateZipFile(zipFile, stageDir, fileList):
+  # Stage files.
+  for fileName in fileList:
+    fileName = fileName.rstrip(os.linesep)
+    targetName = os.path.join(stageDir, fileName)
+    try:
+      targetDir = os.path.dirname(targetName)
+      if not os.path.exists(targetDir):
+        os.makedirs(targetDir)
+      if os.path.isdir(fileName):
+        # TODO: This is a hack to handle duplicates on the fileList of the
+        # form: [ 'lib/foo.so', 'lib' ]
+        if os.path.exists(targetName) and os.path.isdir(targetName):
+          shutil.rmtree(targetName)
+        shutil.copytree(fileName, targetName)
+      elif os.path.exists(fileName):
+        shutil.copy2(fileName, targetName)
+    except:
+      import traceback
+      print 'Troubles processing %s [cwd=%s]: %s' % (fileName, os.getcwd(), traceback.format_exc())
+
+  ZipDir(zipFile, stageDir)
+
+
+def StageAndZip(fileList, target):
+  if not target:
+    return None
+
+  stageDir = target
+  zipFile = stageDir + '.zip'
+
+  # Cleanup old files.
+  if os.path.exists(stageDir):
+    shutil.rmtree(stageDir)
+  os.mkdir(stageDir)
+  oldFiles = glob.glob(target.split('-')[0] + '*.zip')
+  for oldFile in oldFiles:
+    os.remove(oldFile)
+
+  GenerateVersionFile()
+  GenerateZipFile(zipFile, stageDir, fileList)
+  print 'last change: %s' % (zipFile)
+
+  # Clean up. Buildbot disk space is limited.
+  shutil.rmtree(stageDir)
+
+  return zipFile
+
+
+def Archive(srcpath, mode, dartium_target, contentshell_target,
+            chromedriver_target, is_win_ninja=False):
+  # We currently build using ninja on mac debug.
+  if HOST_OS == 'mac':
+    releaseDir = os.path.join(srcpath, 'out', mode)
+    # Also package dynamic libraries.
+    extra_files = [file for file in os.listdir(releaseDir) if file.endswith('.dylib')]
+  elif HOST_OS == 'linux':
+    releaseDir = os.path.join(srcpath, 'out', mode)
+    extra_files = []
+  elif HOST_OS == 'win':
+    if is_win_ninja:
+      releaseDir = os.path.join(srcpath, 'out', mode)
+    else:
+      releaseDir = os.path.join(srcpath, 'out', mode)
+    # issue(16760) - we _need_ to fix our parsing of the FILES.cfg
+    extra_files = [file for file in os.listdir(releaseDir) if file.endswith('manifest')]
+  else:
+    raise Exception('Unsupported platform')
+  os.chdir(releaseDir)
+
+  dartium_zip = StageAndZip(
+      GenerateDartiumFileList(mode, srcpath) + extra_files, dartium_target)
+  contentshell_zip = StageAndZip(GenerateContentShellFileList(srcpath) + extra_files,
+                                 contentshell_target)
+  chromedriver_zip = StageAndZip(GenerateChromeDriverFileList(srcpath) + extra_files,
+                                 chromedriver_target)
+  return (dartium_zip, contentshell_zip, chromedriver_zip)
+
+
+def main():
+  pathname = os.path.dirname(sys.argv[0])
+  fullpath = os.path.abspath(pathname)
+  srcpath = os.path.join(fullpath, '..', '..', '..')
+
+  parser = optparse.OptionParser()
+  parser.add_option('--dartium', dest='dartium',
+                    action='store', type='string',
+                    help='dartium archive name')
+  parser.add_option('--contentshell', dest='contentshell',
+                    action='store', type='string',
+                    help='content shell archive name')
+  parser.add_option('--chromedriver', dest='chromedriver',
+                    action='store', type='string',
+                    help='chromedriver archive name')
+  parser.add_option('--mode', dest='mode',
+                    default='Release',
+                    action='store', type='string',
+                    help='(Release|Debug)')
+  (options, args) = parser.parse_args()
+  Archive(srcpath, options.mode, options.dartium, options.contentshell,
+          options.chromedriver)
+  return 0
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/tools/dartium/build.py b/tools/dartium/build.py
new file mode 100755
index 0000000..df511b0
--- /dev/null
+++ b/tools/dartium/build.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 Google Inc. All Rights Reserved.
+
+# This file is used by the buildbot.
+
+import optparse
+import os.path
+import utils
+
+ALL_TARGETS = [
+    'content_shell',
+    'chrome',
+    'blink_tests',
+    'pkg_packages',
+]
+
+def main():
+  parser = optparse.OptionParser()
+  parser.add_option('--target', dest='target',
+                    default='all',
+                    action='store', type='string',
+                    help='Target (%s)' % ', '.join(ALL_TARGETS))
+  parser.add_option('--mode', dest='mode',
+                    action='store', type='string',
+                    help='Build mode (Debug or Release)')
+  parser.add_option('--clobber', dest='clobber',
+                    action='store_true',
+                    help='Clobber the output directory')
+  parser.add_option('-j', '--jobs', dest='jobs',
+                    action='store',
+                    help='Number of jobs')
+  (options, args) = parser.parse_args()
+  mode = options.mode
+  if options.jobs:
+    jobs = options.jobs
+  else:
+    jobs = utils.guessCpus()
+  if not (mode in ['Debug', 'Release']):
+    raise Exception('Invalid build mode')
+
+  if options.target == 'all':
+    targets = ALL_TARGETS
+  else:
+    targets = [options.target]
+
+  if options.clobber:
+    utils.runCommand(['rm', '-rf', 'out'])
+
+  utils.runCommand(['ninja',
+                    '-j%s' % jobs,
+                    '-C',
+                    os.path.join('out', mode)]
+                    + targets)
+
+if __name__ == '__main__':
+  main()
diff --git a/tools/dartium/buildbot_annotated_steps.py b/tools/dartium/buildbot_annotated_steps.py
new file mode 100755
index 0000000..7f95594
--- /dev/null
+++ b/tools/dartium/buildbot_annotated_steps.py
@@ -0,0 +1,366 @@
+#!/usr/bin/python
+
+# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Chromium buildbot steps
+
+Run the Dart layout tests.
+"""
+
+import os
+import platform
+import re
+import shutil
+import socket
+import subprocess
+import sys
+import imp
+
+BUILDER_NAME = 'BUILDBOT_BUILDERNAME'
+REVISION = 'BUILDBOT_REVISION'
+BUILDER_PATTERN = (r'^dartium-(mac|lucid64|lucid32|win)'
+                   r'-(full|inc|debug)(-ninja)?(-(be|dev|stable|integration))?$')
+
+if platform.system() == 'Windows':
+  GSUTIL = 'e:/b/build/scripts/slave/gsutil.bat'
+else:
+  GSUTIL = '/b/build/scripts/slave/gsutil'
+ACL = 'public-read'
+GS_SITE = 'gs://'
+GS_URL = 'https://sandbox.google.com/storage/'
+GS_DIR = 'dartium-archive'
+LATEST = 'latest'
+CONTINUOUS = 'continuous'
+
+REVISION_FILE = 'chrome/browser/ui/webui/dartvm_revision.h'
+
+# Add dartium tools and build/util to python path.
+SRC_PATH = os.path.dirname(os.path.dirname(
+    os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
+DART_PATH = os.path.join(SRC_PATH, 'dart')
+TOOLS_PATH = os.path.join(DART_PATH, 'tools', 'dartium')
+BUILD_UTIL_PATH = os.path.join(SRC_PATH, 'build', 'util')
+# We limit testing on drt since it takes a long time to run
+DRT_FILTER = 'html'
+
+
+sys.path.extend([TOOLS_PATH, BUILD_UTIL_PATH])
+import archive
+import utils
+
+bot_utils = imp.load_source('bot_utils',
+    os.path.join(DART_PATH, 'tools', 'bots', 'bot_utils.py'))
+
+def DartArchiveFile(local_path, remote_path, create_md5sum=False):
+  # Copy it to the new unified gs://dart-archive bucket
+  # TODO(kustermann/ricow): Remove all the old archiving code, once everything
+  # points to the new location
+  gsutil = bot_utils.GSUtil()
+  gsutil.upload(local_path, remote_path, public=True)
+  if create_md5sum:
+    # 'local_path' may have a different filename than 'remote_path'. So we need
+    # to make sure the *.md5sum file contains the correct name.
+    assert '/' in remote_path and not remote_path.endswith('/')
+    mangled_filename = remote_path[remote_path.rfind('/') + 1:]
+    local_md5sum = bot_utils.CreateChecksumFile(local_path, mangled_filename)
+    gsutil.upload(local_md5sum, remote_path + '.md5sum', public=True)
+
+def UploadDartiumVariant(revision, name, channel, arch, mode, zip_file):
+  name = name.replace('drt', 'content_shell')
+  system = sys.platform
+
+  namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.RAW)
+  remote_path = namer.dartium_variant_zipfilepath(revision, name, system, arch,
+      mode)
+  DartArchiveFile(zip_file, remote_path, create_md5sum=True)
+  return remote_path
+
+def ExecuteCommand(cmd):
+  """Execute a command in a subprocess.
+  """
+  print 'Executing: ' + ' '.join(cmd)
+  try:
+    pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    (output, error) = pipe.communicate()
+    if pipe.returncode != 0:
+      print 'Execution failed: ' + str(error)
+    return (pipe.returncode, output)
+  except:
+    import traceback
+    print 'Execution raised exception:', traceback.format_exc()
+    return (-1, '')
+
+
+# TODO: Instead of returning a tuple we should make a class with these fields.
+def GetBuildInfo():
+  """Returns a tuple (name, dart_revision, version, mode, arch, channel,
+     is_full) where:
+    - name: A name for the build - the buildbot host if a buildbot.
+    - dart_revision: The dart revision.
+    - version: A version string corresponding to this build.
+    - mode: 'Debug' or 'Release'
+    - arch: target architecture
+    - channel: the channel this build is happening on
+    - is_full: True if this is a full build.
+  """
+  os.chdir(SRC_PATH)
+
+  name = None
+  version = None
+  mode = 'Release'
+
+  # Populate via builder environment variables.
+  name = os.environ[BUILDER_NAME]
+
+  # We need to chdir() to src/dart in order to get the correct revision number.
+  with utils.ChangedWorkingDirectory(DART_PATH):
+    dart_tools_utils = imp.load_source('dart_tools_utils',
+                                       os.path.join('tools', 'utils.py'))
+    dart_revision = dart_tools_utils.GetSVNRevision()
+
+  version = dart_revision + '.0'
+  is_incremental = '-inc' in name
+  is_win_ninja = 'win-inc-ninja' in name
+  is_full = False
+
+  pattern = re.match(BUILDER_PATTERN, name)
+  assert pattern
+  arch = 'x64' if pattern.group(1) == 'lucid64' else 'ia32'
+  if pattern.group(2) == 'debug':
+    mode = 'Debug'
+  is_full = pattern.group(2) == 'full'
+  channel = pattern.group(5)
+  if not channel:
+    channel = 'be'
+
+  # Fall back if not on builder.
+  if not name:
+    name = socket.gethostname().split('.')[0]
+
+  return (name, dart_revision, version, mode, arch, channel, is_full,
+          is_incremental, is_win_ninja)
+
+
+def RunDartTests(mode, component, suite, arch, checked, test_filter=None,
+                 is_win_ninja=False):
+  """Runs the Dart WebKit Layout tests.
+  """
+  cmd = [sys.executable]
+  script = os.path.join(TOOLS_PATH, 'test.py')
+  cmd.append(script)
+  cmd.append('--buildbot')
+  cmd.append('--mode=' + mode)
+  cmd.append('--component=' + component)
+  cmd.append('--suite=' + suite)
+  cmd.append('--arch=' + arch)
+  cmd.append('--' + checked)
+  cmd.append('--no-show-results')
+
+  if is_win_ninja:
+    cmd.append('--win-ninja-build')
+
+  if test_filter:
+    cmd.append('--test-filter=' + test_filter)
+
+  status = subprocess.call(cmd)
+  if status != 0:
+    print '@@@STEP_FAILURE@@@'
+  return status
+
+
+def UploadDartTestsResults(layout_test_results_dir, name, version,
+                           component, checked):
+  """Uploads test results to google storage.
+  """
+  print ('@@@BUILD_STEP archive %s_layout_%s_tests results@@@' %
+         (component, checked))
+  dir_name = os.path.dirname(layout_test_results_dir)
+  base_name = os.path.basename(layout_test_results_dir)
+  cwd = os.getcwd()
+  os.chdir(dir_name)
+
+  archive_name = 'layout_test_results.zip'
+  archive.ZipDir(archive_name, base_name)
+
+  target = '/'.join([GS_DIR, 'layout-test-results', name, component + '-' +
+                     checked + '-' + version + '.zip'])
+  status = UploadArchive(os.path.abspath(archive_name), GS_SITE + target)
+  os.remove(archive_name)
+  if status == 0:
+    print ('@@@STEP_LINK@download@' + GS_URL + target + '@@@')
+  else:
+    print '@@@STEP_FAILURE@@@'
+  os.chdir(cwd)
+
+
+def ListArchives(pattern):
+  """List the contents in Google storage matching the file pattern.
+  """
+  cmd = [GSUTIL, 'ls', pattern]
+  (status, output) = ExecuteCommand(cmd)
+  if status != 0:
+    return []
+  return output.split(os.linesep)
+
+
+def RemoveArchives(archives):
+  """Remove the list of archives in Google storage.
+  """
+  for archive in archives:
+    if archive.find(GS_SITE) == 0:
+      cmd = [GSUTIL, 'rm', archive.rstrip()]
+      (status, _) = ExecuteCommand(cmd)
+      if status != 0:
+        return status
+  return 0
+
+
+def UploadArchive(source, target):
+  """Upload an archive zip file to Google storage.
+  """
+
+  # Upload file.
+  cmd = [GSUTIL, 'cp', source, target]
+  (status, output) = ExecuteCommand(cmd)
+  if status != 0:
+    return status
+  print 'Uploaded: ' + output
+
+  # Set ACL.
+  if ACL is not None:
+    cmd = [GSUTIL, 'setacl', ACL, target]
+    (status, output) = ExecuteCommand(cmd)
+  return status
+
+
+def main():
+  (dartium_bucket, dart_revision, version, mode, arch, channel,
+   is_full, is_incremental, is_win_ninja) = GetBuildInfo()
+  drt_bucket = dartium_bucket.replace('dartium', 'drt')
+  chromedriver_bucket = dartium_bucket.replace('dartium', 'chromedriver')
+
+  def archiveAndUpload(archive_latest=False):
+    print '@@@BUILD_STEP dartium_generate_archive@@@'
+    cwd = os.getcwd()
+    dartium_archive = dartium_bucket + '-' + version
+    drt_archive = drt_bucket + '-' + version
+    chromedriver_archive = chromedriver_bucket + '-' + version
+    dartium_zip, drt_zip, chromedriver_zip = \
+        archive.Archive(SRC_PATH, mode, dartium_archive,
+                        drt_archive, chromedriver_archive,
+                        is_win_ninja=is_win_ninja)
+    status = upload('dartium', dartium_bucket, os.path.abspath(dartium_zip),
+                    archive_latest=archive_latest)
+    if status == 0:
+      status = upload('drt', drt_bucket, os.path.abspath(drt_zip),
+                      archive_latest=archive_latest)
+    if status == 0:
+      status = upload('chromedriver', chromedriver_bucket,
+                      os.path.abspath(chromedriver_zip),
+                      archive_latest=archive_latest)
+    os.chdir(cwd)
+    if status != 0:
+      print '@@@STEP_FAILURE@@@'
+    return status
+
+  def upload(module, bucket, zip_file, archive_latest=False):
+    status = 0
+
+    # We archive to the new location on all builders except for -inc builders.
+    if not is_incremental:
+      print '@@@BUILD_STEP %s_upload_archive_new @@@' % module
+      # We archive the full builds to gs://dart-archive/
+      revision = 'latest' if archive_latest else dart_revision
+      remote_path = UploadDartiumVariant(revision, module, channel, arch,
+          mode.lower(), zip_file)
+      print '@@@STEP_LINK@download@' + remote_path + '@@@'
+
+    # We archive to the old locations only for bleeding_edge builders
+    if channel == 'be':
+      _, filename = os.path.split(zip_file)
+      if not archive_latest:
+        target = '/'.join([GS_DIR, bucket, filename])
+        print '@@@BUILD_STEP %s_upload_archive@@@' % module
+        status = UploadArchive(zip_file, GS_SITE + target)
+        print '@@@STEP_LINK@download@' + GS_URL + target + '@@@'
+      else:
+        print '@@@BUILD_STEP %s_upload_latest@@@' % module
+        # Clear latest for this build type.
+        old = '/'.join([GS_DIR, LATEST, bucket + '-*'])
+        old_archives = ListArchives(GS_SITE + old)
+
+        # Upload the new latest and remove unnecessary old ones.
+        target = GS_SITE + '/'.join([GS_DIR, LATEST, filename])
+        status = UploadArchive(zip_file, target)
+        if status == 0:
+          RemoveArchives(
+              [iarch for iarch in old_archives if iarch != target])
+        else:
+          print 'Upload failed'
+
+        # Upload unversioned name to continuous site for incremental
+        # builds.
+        if '-inc' in bucket:
+          continuous_name = bucket[:bucket.find('-inc')]
+          target = GS_SITE + '/'.join([GS_DIR, CONTINUOUS,
+                                       continuous_name + '.zip'])
+          status = UploadArchive(zip_file, target)
+
+      print ('@@@BUILD_STEP %s_upload_archive is over (status = %s)@@@' %
+          (module, status))
+
+    return status
+
+  def test(component, suite, checked, test_filter=None):
+    """Test a particular component (e.g., dartium or frog).
+    """
+    print '@@@BUILD_STEP %s_%s_%s_tests@@@' % (component, suite, checked)
+    sys.stdout.flush()
+    layout_test_results_dir = os.path.join(SRC_PATH, 'webkit', mode,
+                                           'layout-test-results')
+    shutil.rmtree(layout_test_results_dir, ignore_errors=True)
+    status = RunDartTests(mode, component, suite, arch, checked,
+                          test_filter=test_filter, is_win_ninja=is_win_ninja)
+
+    if suite == 'layout' and status != 0:
+      UploadDartTestsResults(layout_test_results_dir, dartium_bucket, version,
+                             component, checked)
+    return status
+
+  result = 0
+
+  # Archive to the revision bucket unless integration build
+  if channel != 'integration':
+    result = archiveAndUpload(archive_latest=False)
+
+    # On dev/stable we archive to the latest bucket as well
+    if channel != 'be':
+      result = archiveAndUpload(archive_latest=True) or result
+
+  # Run layout tests
+  if mode == 'Release' or platform.system() != 'Darwin':
+    result = test('drt', 'layout', 'unchecked') or result
+    result = test('drt', 'layout', 'checked') or result
+
+  # Run dartium tests
+  result = test('dartium', 'core', 'unchecked') or result
+  result = test('dartium', 'core', 'checked') or result
+
+  # Run ContentShell tests
+  # NOTE: We don't run ContentShell tests on dartium-*-inc builders to keep
+  # cycle times down.
+  if not is_incremental:
+    # If we run all checked tests on dartium, we restrict the number of
+    # unchecked tests on drt to DRT_FILTER
+    result = test('drt', 'core', 'unchecked', test_filter=DRT_FILTER) or result
+    result = test('drt', 'core', 'checked') or result
+
+  # On the 'be' channel, we only archive to the latest bucket if all tests ran
+  # successfull.
+  if result == 0 and channel == 'be':
+    result = archiveAndUpload(archive_latest=True) or result
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/tools/dartium/fetch_reference_build.py b/tools/dartium/fetch_reference_build.py
new file mode 100755
index 0000000..077d49c
--- /dev/null
+++ b/tools/dartium/fetch_reference_build.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Fetches an archived chromium build into
+  src/chrome/tools/test/reference_build unless
+  src/chrome/tools/test/reference_build/REQUESTED_REVISION is the same as
+  src/chrome/tools/test/reference_build/CURRENT_REVISION.
+  Must be run from the root of a Dartium or multivm checkout.
+
+Usage:
+  $ ./src/dart/tools/dartium/fetch_reference_build_revision.py
+"""
+
+import os
+import subprocess
+import sys
+
+def main(argv):
+  dirname = os.path.join('src', 'chrome', 'tools',
+                        'test', 'reference_build')
+  request = os.path.join(dirname, 'REQUESTED_REVISION')
+  found = os.path.join(dirname, 'CURRENT_REVISION')
+  if not os.path.exists(request):
+    return
+  with file(request, 'r') as f:
+    request_revision = f.read()
+
+  if os.path.exists(found):
+    with file(found, 'r') as f:
+      found_revision = f.read()
+    if found_revision == request_revision:
+      return
+
+  get_script = os.path.join('src', 'dart', 'tools',
+                            'dartium', 'get_chromium_build.py')
+  get_script = os.path.abspath(get_script)
+  exit_code = subprocess.call(['python', get_script,
+                               '-r', request_revision,
+                               '-t', dirname])
+  if exit_code == 0:
+    with file(found, 'w') as f:
+      f.write(request_revision)
+  return exit_code
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/tools/dartium/generate_dart_vm_version.py b/tools/dartium/generate_dart_vm_version.py
new file mode 100755
index 0000000..68ec2f5
--- /dev/null
+++ b/tools/dartium/generate_dart_vm_version.py
@@ -0,0 +1,35 @@
+import datetime
+import imp
+import os
+import subprocess
+import sys
+import time
+
+scriptpath = os.path.abspath(os.path.dirname(__file__))
+utils = imp.load_source('utils', os.path.join(scriptpath, '..', 'utils.py'))
+
+REVISION_FILE = 'src/chrome/browser/ui/webui/dartvm_revision.h'
+EXPIRATION_FILE = 'src/third_party/WebKit/Source/bindings/dart/ExpirationTimeSecsSinceEpoch.time_t'
+
+def updateFile(filename, content):
+  if os.path.exists(filename):
+    if file(filename, 'r').read() == content:
+      return
+  else:
+    dir = os.path.dirname(filename)
+    if not os.path.exists(dir):
+      os.makedirs(dir)
+  file(filename, 'w').write(content)
+
+def main():
+  dart_version = utils.GetVersion()
+  version_string = '#define DART_VM_REVISION "%s"\n' % dart_version.strip()
+
+  updateFile(REVISION_FILE, version_string)
+
+  expiration_date = datetime.date.today() + datetime.timedelta(weeks=12)
+  updateFile(EXPIRATION_FILE,
+             "%dLL\n" % time.mktime(expiration_date.timetuple()))
+
+if __name__ == '__main__':
+  main()
diff --git a/tools/dartium/get_chromium_build.py b/tools/dartium/get_chromium_build.py
new file mode 100755
index 0000000..edb8bac
--- /dev/null
+++ b/tools/dartium/get_chromium_build.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Gets a Chromium archived build, and unpacks it
+   into a target directory.
+
+  Use -r option to specify the revison number
+  Use -t option to specify the directory to unzip the build into.
+
+Usage:
+  $ /path/to/get_chromium_build.py -r <revision> -t <target>
+"""
+
+import logging
+import optparse
+import os
+import platform
+import shutil
+import subprocess
+import sys
+import time
+import urllib
+import urllib2
+import zipfile
+
+# Example chromium build location:
+# gs://chromium-browser-snapshots/Linux_x64/228977/chrome-linux.zip
+CHROMIUM_URL_FMT = ('http://commondatastorage.googleapis.com/'
+                    'chromium-browser-snapshots/%s/%s/%s')
+
+class BuildUpdater(object):
+  _PLATFORM_PATHS_MAP = {
+      'Linux': { 'zipfiles': ['chrome-linux.zip'],
+                 'folder': 'chrome_linux',
+                 'archive_path': 'Linux_x64'},
+      'Darwin': {'zipfiles': ['chrome-mac.zip'],
+                 'folder': 'chrome_mac',
+                 'archive_path': 'Mac'},
+      'Windows': {'zipfiles': ['chrome-win32.zip',
+                               'chrome-win32-syms.zip'],
+                 'folder': 'chrome_win',
+                 'archive_path': 'Win'}}
+
+  def __init__(self, options):
+    platform_data = BuildUpdater._PLATFORM_PATHS_MAP[platform.system()]
+    self._zipfiles = platform_data['zipfiles']
+    self._folder = platform_data['folder']
+    self._archive_path = platform_data['archive_path']
+    self._revision = int(options.revision)
+    self._target_dir = options.target_dir
+    self._download_dir = os.path.join(self._target_dir, 'downloads')
+
+  def _GetBuildUrl(self, revision, filename):
+    return CHROMIUM_URL_FMT % (self._archive_path, revision, filename)
+
+  def _FindBuildRevision(self, revision, filename):
+    MAX_REVISIONS_PER_BUILD = 100
+    for revision_guess in xrange(revision, revision + MAX_REVISIONS_PER_BUILD):
+      if self._DoesBuildExist(revision_guess, filename):
+        return revision_guess
+      else:
+        time.sleep(.1)
+    return None
+
+  def _DoesBuildExist(self, revision_guess, filename):
+    url = self._GetBuildUrl(revision_guess, filename)
+
+    r = urllib2.Request(url)
+    r.get_method = lambda: 'HEAD'
+    try:
+      urllib2.urlopen(r)
+      return True
+    except urllib2.HTTPError, err:
+      if err.code == 404:
+        return False
+
+  def _DownloadBuild(self):
+    if not os.path.exists(self._download_dir):
+      os.makedirs(self._download_dir)
+    for zipfile in self._zipfiles:
+      build_revision = self._FindBuildRevision(self._revision, zipfile)
+      if not build_revision:
+        logging.critical('Failed to find %s build for r%s\n',
+                         self._archive_path,
+                         self._revision)
+        sys.exit(1)
+      url = self._GetBuildUrl(build_revision, zipfile)
+      logging.info('Downloading %s', url)
+      r = urllib2.urlopen(url)
+      with file(os.path.join(self._download_dir, zipfile), 'wb') as f:
+        f.write(r.read())
+
+  def _UnzipFile(self, dl_file, dest_dir):
+    if not zipfile.is_zipfile(dl_file):
+      return False
+    logging.info('Unzipping %s', dl_file)
+    with zipfile.ZipFile(dl_file, 'r') as z:
+      for content in z.namelist():
+        dest = os.path.join(dest_dir, content[content.find('/')+1:])
+        # Create dest parent dir if it does not exist.
+        if not os.path.isdir(os.path.dirname(dest)):
+          logging.info('Making %s', dest)
+          os.makedirs(os.path.dirname(dest))
+        # If dest is just a dir listing, do nothing.
+        if not os.path.basename(dest):
+          continue
+        with z.open(content) as unzipped_content:
+          logging.info('Extracting %s to %s (%s)', content, dest, dl_file)
+          with file(dest, 'wb') as dest_file:
+            dest_file.write(unzipped_content.read())
+          permissions = z.getinfo(content).external_attr >> 16
+          if permissions:
+            os.chmod(dest, permissions)
+    return True
+
+  def _ClearDir(self, dir):
+    """Clears all files in |dir| except for hidden files and folders."""
+    for root, dirs, files in os.walk(dir):
+      # Skip hidden files and folders (like .svn and .git).
+      files = [f for f in files if f[0] != '.']
+      dirs[:] = [d for d in dirs if d[0] != '.']
+
+      for f in files:
+        os.remove(os.path.join(root, f))
+
+  def _ExtractBuild(self):
+    dest_dir = os.path.join(self._target_dir, self._folder)
+    self._ClearDir(dest_dir)
+    for root, _, dl_files in os.walk(os.path.join(self._download_dir)):
+      for dl_file in dl_files:
+        dl_file = os.path.join(root, dl_file)
+        if not self._UnzipFile(dl_file, dest_dir):
+          logging.info('Copying %s to %s', dl_file, dest_dir)
+          shutil.copy(dl_file, dest_dir)
+    shutil.rmtree(self._download_dir)
+
+  def DownloadAndUpdateBuild(self):
+    self._DownloadBuild()
+    self._ExtractBuild()
+
+
+def ParseOptions(argv):
+  parser = optparse.OptionParser()
+  usage = 'usage: %prog <options>'
+  parser.set_usage(usage)
+  parser.add_option('-r', dest='revision',
+                    help='Revision to download.')
+  parser.add_option('-t', dest='target_dir',
+                    help='Target directory for unzipped Chromium.')
+
+  (options, _) = parser.parse_args(argv)
+  if not options.revision:
+    logging.critical('Must specify -r.\n')
+    sys.exit(1)
+  if not options.target_dir:
+    logging.critical('Must specify -t.\n')
+    sys.exit(1)
+  return options
+
+def main(argv):
+  logging.getLogger().setLevel(logging.DEBUG)
+  options = ParseOptions(argv)
+  b = BuildUpdater(options)
+  b.DownloadAndUpdateBuild()
+  logging.info('Successfully got archived Chromium build.')
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/tools/dartium/print_dart_version.sh b/tools/dartium/print_dart_version.sh
new file mode 100755
index 0000000..273e0d5
--- /dev/null
+++ b/tools/dartium/print_dart_version.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# Print svn revisions for Dartium internal repositories.  The output
+# is included in each Dartium archive build / release.
+#
+# This script is necessary because Dartium maintains its own branches
+# of Chromium and WebKit.  This script is for temporary use only; it
+# will not be integrated back into Chromium.
+
+function version() {
+  if [ $(svnversion) == exported ]
+  then
+    # git-svn
+    git svn info | grep Revision | cut -c 11-
+  else
+    # svn
+    echo $(svnversion)
+  fi
+}
+
+root_dir=$(dirname $0)/../..
+pushd ${root_dir} > /dev/null
+echo dartium-chromium: $(version)
+cd third_party/WebKit
+echo dartium-webkit: $(version)
+cd ../../dart/runtime
+echo dartium-runtime: $(version)
+popd > /dev/null
diff --git a/tools/dartium/set_reference_build_revision.py b/tools/dartium/set_reference_build_revision.py
new file mode 100755
index 0000000..f860210
--- /dev/null
+++ b/tools/dartium/set_reference_build_revision.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Writes a revision number into src/chrome/tools/test/reference_build/REVISON
+   Must be run from the root of a Dartium or multivm checkout.
+
+Usage:
+  $ ./src/dart/tools/dartium/set_reference_build_revision.py <revision>
+"""
+
+import os
+import sys
+
+def main(argv):
+  revision = argv[1]
+  output = os.path.join('src', 'chrome', 'tools',
+                        'test', 'reference_build',
+                        'REQUESTED_REVISION')
+  dirname = os.path.dirname(output)
+  if dirname and not os.path.exists(dirname):
+    os.makedirs(dirname)
+  with file(output, 'w') as f:
+    f.write(revision)
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/tools/dartium/start_dartium_roll.sh b/tools/dartium/start_dartium_roll.sh
new file mode 100755
index 0000000..41aebbf
--- /dev/null
+++ b/tools/dartium/start_dartium_roll.sh
@@ -0,0 +1,999 @@
+#!/bin/bash -e
+
+# Requirements:
+#    sudo apt-get install xclip
+
+
+# e.g. 1908 ROLL
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 251904 --new-branch 1908 --new-revision 259084 --chrome --pre-roll
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 251904 --new-branch 1908 --new-revision 259084 --chrome --roll
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 251904 --new-branch 1908 --new-revision 259084 --chrome --info
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 167304 --new-branch 1908 --new-revision 169907 --blink --pre-roll
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 167304 --new-branch 1908 --new-revision 169907 --blink --roll
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 167304 --new-branch 1908 --new-revision 169907 --blink --info
+
+# e.g., 1916 ROLL
+# ~/./start_dartium_roll.sh --verbose --directory /media/TB/dartium-1916 --old-branch 1908 --old-revision 259084 --new-branch 1916 --new-revision 260298 --chrome --pre-roll
+
+# ~/./start_dartium_roll.sh --verbose --directory /media/TB/dartium-1916 --old-branch 1908 --old-revision 169907 --new-branch 1916 --new-revision 170313 --blink --pre-roll
+
+E_INVALID_ARG=128
+
+function usage {
+  echo "Usage: $0 [--options]"
+  echo "Options:"
+  echo "  --[no-]verbose:           display information about each step"
+  echo "  --directory base:         base directory of local git repository"
+  echo "                            (e.g., ~/dartium-roll implies directory"
+  echo "                            ~/dartium-roll/src and"
+  echo "                            ~/dartium-roll/src/third_party/WebKit)**"
+  echo "  --chrome:                 for the Chrome branch (not with --blink)**"
+  echo "  --blink:                  for the Blink branch (not with --chrome)**"
+  echo "  --old-branch name:        name of previous true branch (e.g., use 1847"
+  echo "                            for version 34.0.1847.92) *"
+  echo "  --old-revision revision:  revision of base trunk for $OLD version *"
+  echo "  --new-branch name:        name of new true branch to create *"
+  echo "  --new-revision revision:  revision of base trunk for new branch *"
+  echo "  --pre-roll:               display commands to prepare for the roll"
+  echo "  --roll:                   display Git commands to execute for creating"
+  echo "                            branches for the roll"
+  echo "  --info:                   display hashes for $BASE and $LAST on each"
+  echo "                            branch (stripped$OLD, trunkdata$OLD, and"
+  echo "                            trunkdata$NEW)"
+  echo "  --help:                   this message"
+  echo
+  echo "* - required"
+  echo
+  echo "*  Script will prompt interactively if options not given."
+  echo "** Argument must be specified."
+  echo
+  exit 1
+}
+
+
+function verbose_message {
+  if [ "$do_verbose" = 1 ]; then
+    if [ "${1}" = "" ]; then
+      echo
+    else
+      echo -e "...${1}..."
+    fi
+  fi
+}
+
+
+# Does the file src/.git/config contains the added lines pointing to the chrome
+# remote dart$OLD and dart$NEW branches for src/ (e.g, dart1847 and dart1908):
+#
+#     [svn-remote "dart$OLD"]
+#             url = svn://svn.chromium.org/chrome/branches/dart/$OLD/src
+#             fetch = :refs/remotes/dart1847
+#     [svn-remote "dart$NEW"]
+#             url = svn://svn.chromium.org/chrome/branches/dart/$NEW/src
+#             fetch = :refs/remotes/dart1908
+#
+# and does the file src/third_party/WebKit/.git/config contains the added lines
+# for blink:
+#
+#     [svn-remote "dart$OLD"]
+#             url = svn://svn.chromium.org/blink/branches/dart/$OLD/src
+#             fetch = :refs/remotes/dart1847
+#     [svn-remote "dart$NEW"]
+#             url = svn://svn.chromium.org/blink/branches/dart/$NEW/src
+#             fetch = :refs/remotes/dart1908
+#
+function validate_remotes {
+  verbose_message "Validating Remotes"
+
+  if [ "$do_which" = "chrome" ]; then
+    # Ensure remote for old Dartium release exist (e.g., remotes/dart1847)
+    remote_dart_last=$(git branch -a | grep "remotes/dart${do_old_branch}")
+    # Ensure remote for new Dartium release exist (e.g., remotes/dart1908)
+    remote_dart_new=$(git branch -a | grep "remotes/dart${do_new_branch}")
+    if [ "$remote_dart_last" = "" ]; then
+      $(display_error "missing old remotes/dart${do_old_branch}")
+      exit -1
+    fi
+    if [ "$remote_dart_new" = "" ]; then
+      $(display_error "missing new remotes/dart${do_new_branch}")
+      exit -1
+    fi
+  elif [ "$do_which" = "blink" ]; then
+    # Ensure remote for old Dartium release exist (e.g., remotes/dart1847)
+    remote_dart_last=$(git branch -a | grep "remotes/blink-svn/${do_old_branch}")
+    # Ensure remote for new Dartium release exist (e.g., remotes/dart1908)
+    remote_dart_new=$(git branch -a | grep "remotes/blink-svn/multivm-${do_new_branch}")
+
+    if [ "$remote_dart_last" = "" ]; then
+      $(display_error "missing old remotes/blink-svn/${do_old_branch}")
+      exit -1
+    fi
+    if [ "$remote_dart_new" = "" ]; then
+      $(display_error "missing new remotes/blink-svn/multivm-${do_new_branch}")
+      exit -1
+    fi
+  else
+    $(display_error "--chrome or --blink must be specified")
+    exit -1
+  fi
+}
+
+function stripped_exist {
+  local branch_name=$(git branch --no-color --list $(stripped_name) | sed 's/^[ \t\*]*//')
+  echo $branch_name
+}
+
+# Does the branch trunkdart$OLD or trunkdart$NEW exist where $OLD is previous
+# branch (e.g. 1847) and $NEW is new branch to roll (e.g., 1908)
+# $(trunk_exist ${do_old_branch})  or  $(trunk_exist ${do_new_branch})
+# Strip out the spaces and * (implies current branch) then return the branch name.
+function trunk_exist {
+  local branch_name=$(git branch --list --no-color trunkdart${1} | sed 's/^[ \t\*]*//' | tail -n 1)
+  echo $branch_name
+}
+
+function validate_repository {
+  verbose_message "Validating Repository"
+
+  strip_branch=${stripped_name}
+
+  # Validate that branches exist.
+  stripped_found=${stripped_exist}
+  old_branch_found=$(trunk_exist ${do_old_branch})
+  new_branch_found=$(trunk_exist ${do_new_branch})
+
+  if [ "$stripped_found" != "" ]; then
+    $(display_error "branch ${strip_branch} already exist")
+    exit -1
+  fi
+
+  if [ "$old_branch_found" != "" ]; then
+    $(display_error "branch trunkdart${do_old_branch} already exist")
+    exit -1
+  fi
+
+  if [ "$new_branch_found" != "" ]; then
+    $(display_error "branch trunkdart${do_new_branch} already exist")
+    exit -1
+ fi
+}
+
+function display_error() {
+  echo -e "\n\e[1;31mERROR: ${1}\e[0m\n" >&2
+  exit 1
+}
+
+
+# Given a revision number $1 return the trunk's hash code for that revision.
+function hash_trunk_revision {
+  # Chrome trunk hash code for [NewChromeCommit]
+  hash_trunk=$(git log master --grep=src@${1} --pretty=format:'%H' -n 1)
+}
+
+
+# Return the last revision for a branch.  Used by new trunk roll for the
+# DEPS file for the last revision to use during build.
+function last_revision() {
+  echo $(git svn log ${1} --oneline -1 | cut -d '|' -f1 | sed "s/r//")
+}
+
+
+# Return the branch for strippedOOOO use bash line:
+#    $(stripped_name)
+function stripped_name {
+  echo "stripped${do_old_branch}"
+}
+
+
+# Give a branch name return the trunk release for that branch.
+function trunkdart_name {
+  echo "trunkdart${1}"
+}
+
+
+# Compute the hash codes for the previous branch hash_base is the first commit
+# and hash_last is final commit.
+function hash_codes_base_last {
+  # Get the first commit for previous Dartium roll on chrome branch.
+  hash_base=$(git rev-list ${1} --pretty=format:'%H' | tail -n 1)
+
+  # Get the last commit for previous Dartium roll on chrome branch.
+  hash_last=$(git log ${1} --pretty=format:'%H' -1)
+}
+
+
+# Compute the hash codes for the previous branch hash_base is the first commit
+# and hash_last is final commit.
+function hash_codes_base2_last2 {
+  # Get the last commit for previous Dartium roll on chrome branch.
+  hash_last2=$(git log ${1} --pretty=format:'%H' -1)
+
+  local search
+  if [ "$do_which" = "chrome" ]; then
+    search="chrome/trunk/src@${do_old_revision}"
+  else
+    search="blink/branches/dart/multivm-${do_new_revision}@${do_old_revision}"
+  fi
+
+  # Get the first commit for previous Dartium roll on chrome branch.
+  hash_base2=$(git log ${1} --grep=@${do_old_revision} --pretty=format:'%H' | tail -1)
+}
+
+
+# Pad right/left up to 80 spaces.
+#   Parameter $1 string to pad.
+#   Parameter $2 is max length to post-pad with spaces.
+#   Parameter $3 if specified padd to the right otherwise pad to the right.
+#   Returns string right padded with spaces.
+function space_pad() {
+  local spaces=$(printf '%0.1s' " "{1..80})
+  local spaces_pad=${spaces:0:$2}
+  local padding=$(printf "%s" "${spaces_pad:${#1}}")
+
+  if [[ "$3" = "" ]]; then
+    # Pad to the right [default].
+    echo "${1}${padding}"
+  else
+    # Pad to the left.
+    echo "${padding}${1}"
+  fi
+}
+
+
+# Format the line '|  URL:  <url>   |'.
+#   Paramter $1 - url to format
+#   Returns the formatted and space padded line for display_hashes.
+function display_url() {
+  # Line length is 65, skipped # 9 characters at beginning '|  URL:  '
+  # and last character '|'. Up to 55 characters of padding.
+  local format_url=$(space_pad $1 55)
+  local valid_url=$(valid_branch_url $1)
+  if [[ "$valid_url" = "" ]]; then
+    # Error format padding is same as above remote_url 55;
+    local format_err=$(space_pad "WARNING ON TRUNK - FIX IMMEDIATELY" 55)
+    # Output in red, the problem, both lines the URL and the warning message.
+    echo -e "|  URL:  \e[1;31m${format_url}\e[0m|\n|        \e[1;31m${format_err}\e[0m|"
+  else
+    # URL looks good.
+    echo "|  URL:  ${format_url}|"
+  fi
+}
+
+
+function display_hashes {
+  if [ "$do_info_hashes" = 1 ]; then
+    local format_which=$(space_pad $do_which 6 1)
+    stripped_branch=$(stripped_name)
+    # stripped$OLD found
+    stripped_found=$(stripped_exist)
+    if [ "$stripped_found" != "" ]; then
+      hash_codes_base_last ${stripped_branch}
+      hash_trunk_revision ${do_old_revision}
+      # Display the first/last commit hash for stripped$OLD branch and the
+      # trunk hash for $OLD@do_last_revsion.
+      echo "================================================================="
+      local format_branch=$(space_pad $stripped_branch 32 1)
+      echo "|  \$OLD: ${format_which} dart${do_old_branch}@${do_old_revision}${format_branch} |"
+      local remote_url=$(url_branch $stripped_branch)
+
+# TODO(terry): Testing failure below remove before checkin
+#      local remote_url=$(url_branch "master")
+
+      echo "$(display_url $remote_url)"
+      echo "|---------------------------------------------------------------|"
+      local format_hash=$(space_pad $hash_base 51)
+      echo "|  \$BASE  | ${format_hash} |"
+      echo "|---------------------------------------------------------------|"
+      format_hash=$(space_pad $hash_last 51)
+      echo "|  \$LAST  | ${format_hash} |"
+      echo "================================================================="
+      echo
+    else
+      echo "${stripped_branch} not found"
+      echo
+    fi
+
+    # trunkdart$OLD found
+    branch_trunkdart_old=$(trunkdart_name ${do_old_branch})
+    old_branch_found=$(trunk_exist ${do_old_branch})
+    if [ "$old_branch_found" != "" ]; then
+      hash_codes_base2_last2 ${branch_trunkdart_old}
+      hash_trunk_revision ${do_old_revision}
+      # Display the first/last commit hash for trunkdart$OLD branch and the
+      # trunk hash for $OLD@do_last_revsion.
+      echo "================================================================="
+      local format_branch=$(space_pad $branch_trunkdart_old 32 1)
+      echo "|  \$OLD  ${format_which} dart${do_old_branch}@${do_old_revision}${format_branch} |"
+      local remote_url=$(url_branch $branch_trunkdart_old)
+      echo "$(display_url $remote_url)"
+      echo "|---------------------------------------------------------------|"
+      local format_base2=$(space_pad $hash_base2 51)
+      echo "|  \$BASE2 | ${format_base2} |"
+      echo "|---------------------------------------------------------------|"
+      local format_last2=$(space_pad $hash_last2 51)
+      echo "|  \$LAST2 | ${format_last2} |"
+      echo "================================================================="
+      echo
+    else
+      echo "${branch_trunkdart_old} not found"
+      echo
+    fi
+
+    # trunkdart$NEW found
+    branch_trunkdart_new=$(trunkdart_name ${do_new_branch})
+    new_branch_found=$(trunk_exist ${do_new_branch})
+    if [ "$new_branch_found" != "" ]; then
+      hash_trunk_revision ${do_new_revision}
+      # Display the trunk hash for $NEW@do_new_revsion.
+      echo "================================================================="
+      local format_branch=$(space_pad $branch_trunkdart_new 32 1)
+      echo "|  \$NEW  ${format_which} dart${do_new_branch}@${do_new_revision}${format_branch} |"
+      local remote_url=$(url_branch $branch_trunkdart_new)
+      echo "$(display_url $remote_url)"
+      echo "|---------------------------------------------------------------|"
+      local revision=$(last_revision $branch_trunkdart_new)
+      local format_revision=$(space_pad $revision 43)
+      echo "|  last revision  | ${format_revision} |"
+      echo "================================================================="
+      echo
+    else
+      echo "${branch_trunkdart_new} not found"
+      echo
+    fi
+  fi
+}
+
+
+function switch_branch() {
+  $(git checkout ${1} --quiet)
+  local curr_branch=$(git name-rev --name-only HEAD)
+  if [[ "$curr_branch" != "$1" ]]; then
+    $(display_error "Unable to switch to branch $1 - pending commits/add?")
+    exit -1
+  fi
+  echo $curr_branch
+}
+
+
+# Check that the branch is not pointing to either blink or chrome trunk.
+# These branches should be pointing to either:
+#     svn://svn.chromium.org/chrome/branches/dart/NNNN
+#     svn://svn.chromium.org/blink/branches/dart/NNNN
+#
+# $1 parameter - branch-name to make current branch and check repository
+#                name.
+function check_branch() {
+  local old_branch=$(git name-rev --name-only HEAD)
+  local curr_branch=$(switch_branch $1)
+  local trunk_url;
+
+  if [ "$do_which" = "chrome" ]; then
+    # Chrome
+    trunk_url='Committing to svn://svn.chromium.org/chrome/trunk/src ...'
+  elif [ "$do_which" = "blink" ]; then
+    # Blink
+    trunk_url='Committing to svn://svn.chromium.org/blink/trunk ...'
+  else
+    $(display_error "Neither blink or chrome specified")
+    exit -1
+  fi
+
+  local remote_commit=$(git svn dcommit --dry-run | head -1 | grep "${trunk_url}")
+
+  curr_branch=$(switch_branch $old_branch)
+  if [[ "$curr_branch" != "$old_branch" ]]; then
+    $(display_error "Unable to switch back to original branch ${old_branch}")
+    exit -1
+  fi
+
+  if [[ "$remote_commit" != "" ]]; then
+    $(display_error "Branch ${1} is NOT pointing to the Dart branch repository but pointing to trunk.")
+    exit -1
+  fi
+
+  echo "Local branch '${1}' is based on the remote branch/dart repository."
+}
+
+
+# Given an URL of a remote repository passed as parameter $1 (e.g., from
+# url_branch function) return the URL passed in if valid or return empty
+# string "".
+function valid_branch_url() {
+  # Compute what the remote repository should be:
+  #    svn://svn.chromium.org/${do_which}/branches/dart/${do_old_branch}/src
+  #    e.g., svn://svn.chromium.org/chrome/branches/dart/1847/src
+  # or blink:
+  #    svn://svn.chromium.org/blink/branches/dart/${do_old_branch}
+  #    e.g., svn://svn.chromium.org/blink/branches/dart/1847
+  local src_dir=""
+  if [[ "$do_which" = "chrome" ]]; then
+    src_dir="/src"
+  fi
+  local old_remote="svn://svn.chromium.org/${do_which}/branches/dart/${do_old_branch}${src_dir}"
+  local new_remote="svn://svn.chromium.org/${do_which}/branches/dart/${do_new_branch}${src_dir}"
+
+  echo $(echo "$1" | grep -e "${old_remote}" -e "${new_remote}")
+}
+
+
+# Returns the remote repository URL associated with a branch.
+# Parameter $1 is the branch name.
+function url_branch() {
+  local old_branch=$(git name-rev --name-only HEAD)
+  local curr_branch=$(switch_branch $1)
+
+  local remote_commit=$(git svn dcommit --dry-run | head -1 | sed 's/Committing to //' | sed 's/ ...//')
+
+  curr_branch=$(switch_branch $old_branch)
+
+  echo "${remote_commit}"
+}
+
+
+# Ensure that any created branches (stripped$OLD, trunkdart$OLD and
+# trunkdart$NEW) are not pointing to either the blink or chrome trunks.
+function validate_branches() {
+  # stripped branch
+  local stripped_found=$(stripped_exist)
+  if [ "$stripped_found" != "" ]; then
+    local branch_name=$(stripped_name)
+    local check_result=$(check_branch ${branch_name})
+    printf "%s\n" "$check_result"
+  fi
+
+  # trunkdart$OLD
+  local branch_trunkdart_old=$(trunkdart_name ${do_old_branch})
+  local old_branch_found=$(trunk_exist ${do_old_branch})
+  if [ "$old_branch_found" != "" ]; then
+    local check_result=$(check_branch $branch_trunkdart_old)
+    printf "%s\n" "$check_result"
+  fi
+
+  # trunkdart$NEW
+  local branch_trunkdart_new=$(trunkdart_name ${do_new_branch})
+  local new_branch_found=$(trunk_exist ${do_new_branch})
+  if [ "$new_branch_found" != "" ]; then
+    local check_result=$(check_branch $branch_trunkdart_new)
+    printf "%s\n" "$check_result"
+  fi
+}
+
+
+function display_roll_commands() {
+  if [ "$roll_branches" = 1 ]; then
+    if [ "$do_which" = "chrome" ]; then
+      roll_chrome_commands
+    elif [ "$do_which" = "blink" ]; then
+      roll_blink_commands
+    fi
+  fi
+}
+
+
+# Show commands to create SVN branch folder and remote repository for new roll.
+function display_remote_repository_creation() {
+# TODO(terry): Use the diretory passed in instead of hard-coded dartium-NNNN
+# TODO(terry): Should execute each command with a Y or N and command runs.
+# TODO(terry): Echo output from commands especially clone and rebase using "OUTPUT=$(git cl rebase); echo $OUTPUT"
+# TODO(terry): Add ability to copy to clipboard programmatically us 'echo "hi" | xclip -selection clipboard'
+#              copies hi to clipboard.
+  echo "Do the following pre-roll setup"
+  if [ "$do_which" = "chrome" ]; then
+    echo "  mkdir dartium-${do_new_branch}"
+    echo "  cd dartium-${do_new_branch}"
+    echo "  svn mkdir -m \"Preparing Chrome 35/${do_new_branch} branch\" "\
+         "svn://svn.chromium.org/chrome/branches/dart/${do_new_branch}"
+    echo "  svn cp -m \"Branching for ${do_new_branch} @${do_new_revision}\" "\
+         "svn://svn.chromium.org/chrome/trunk/src@${do_new_revision} "\
+         "svn://svn.chromium.org/chrome/branches/dart/${do_new_branch}/src"
+    echo "  git svn clone -r241107 svn://svn.chromium.org/chrome/trunk/src src"
+    echo
+    echo "  cd src"
+    echo "  git cl rebase"
+    echo
+    echo "-----After rebase finishes-----"
+    echo
+    echo " 1. Add the below lines to src/.git/config"
+    echo
+    echo "[svn-remote \"dart${do_old_branch}\"]"
+    echo "      url = svn://svn.chromium.org/chrome/branches/dart/${do_old_branch}/src"
+    echo "      fetch = :refs/remotes/dart${do_old_branch}"
+    echo "[svn-remote \"dart${do_new_branch}\"]"
+    echo "      url = svn://svn.chromium.org/chrome/branches/dart/${do_new_branch}/src"
+    echo "      fetch = :refs/remotes/dart${do_new_branch}"
+    echo
+    echo " 2. Get the code"
+    echo
+    echo "    cd src"
+    echo "    git svn fetch dart${do_old_branch} && git svn fetch dart${do_new_branch}"
+  elif [ "$do_which" = "blink" ]; then
+    echo "  Directory dartium-${do_new_branch} exists."
+    echo "  cd dartium-${do_new_branch}"
+    echo "  svn cp -m \"Branching ${do_new_branch} @${do_new_revision}\" "\
+         "svn://svn.chromium.org/blink/trunk@${do_new_revision} "\
+         "svn://svn.chromium.org/blink/branches/dart/${do_new_branch}"
+
+    echo "  git svn clone --trunk=trunk --branches=branches/dart"\
+         " --prefix=blink-svn/ -r165883:HEAD " \
+         "svn://svn.chromium.org/blink src/third_party/WebKit"
+    echo
+    echo "  cd src/third_party/WebKit"
+    echo "  git cl rebase"
+    echo
+    echo "-----After rebase finishes-----"
+    echo
+    echo " 1. Add the below lines to src/third_party/WebKit/.git/config"
+    echo
+    echo "[svn-remote \"dart${do_old_branch}\"]"
+    echo "      url = svn://svn.chromium.org/blink/branches/dart/${do_old_branch}"
+    echo "      fetch = :refs/remotes/dart${do_old_branch}"
+    echo "[svn-remote \"dart${do_new_branch}\"]"
+    echo "      url = svn://svn.chromium.org/blink/branches/dart/${do_new_branch}"
+    echo "      fetch = :refs/remotes/dart${do_new_branch}"
+    echo
+    echo " 2. Get the code"
+    echo
+    echo "    cd src/third_party/WebKit"
+    #TODO(terry): Should the fetch be remotes/blink-svn/multivm-${do_new_branch}
+    echo "    git svn fetch dart${do_old_branch} && git svn fetch dart${do_new_branch}"
+  fi
+}
+
+# Displays each of the 3 steps, of GIT commands, to create the
+# branches for a Dartium roll.
+#
+# Givin the following Dartium roll information:
+#   Previous Dartium roll 1847 @251094      ($OLD)
+#   New Dartium roll to make 1908 @ 259084  ($NEW)
+#
+# Three branches will be created a stripped[$OLD], trunkdart[$OLD]
+# and trunkdart[$NEW].
+#
+#  |==============================================|
+#  | $OLD       |     1847                        |
+#  |----------------------------------------------|
+#  | $OLD_REV   |     251094                      |
+#  |----------------------------------------------|
+#  | $NEW       |     1908                        |
+#  |----------------------------------------------|
+#  | $NEW_REV   |     259084                      |
+#  |==============================================|
+#
+# stripped$OLD  - Branch with upstream patches stripped out.
+# trunkdart$OLD - Branch with all patches for $OLD.
+# trunkdart$NEW - Branch of a new Chromium/Blink release with
+#                 cherry-picked $OLD commits from trunkdart$OLD.
+#
+# stripped$OLD, trunkdart$OLD points the SVN remote repository
+#
+#    svn://svn.chromium.org/chrome/branches/dart/1847/src
+#
+# trunkdart$NEW points to the SVN remote repository
+#    svn://svn.chromium.org/chrome/branches/dart/1908/src
+#
+# STEP 1.
+# -------
+# Create the stripped$OLD:
+#     > git checkout -b stripped$OLD dart$OLD
+#     > git rebase -i $BASE
+#
+#     e.g., git checkout -b stripped1847 dart1847
+#           git rebase -i 3345f6a26911beda2ed352e887549bc514acb4bd
+#
+# Rebasing with -i will launch an editor, show all commits after $BASE and let
+# you interactively remove any upstream commits from trunk.  Upstream commits
+# have a format of "Incrementing VERSION to 32.0.1847.78".  Then save and quit
+# the editor.
+#
+# $BASE and $LAST are computed by this script and is returned in the
+# 'git rebase -i <hash-code>' command.
+#
+#      NOTE: How $BASE and $LAST are computed:
+#      ---------------------------------------
+#      $BASE, first commit in $OLD, is computed by:
+#           > git rev-list stripped1847 --pretty=format:'%H' | tail -n 1
+#      Return a GIT hash code e.g., 3345f6a26911beda2ed352e887549bc514acb4bd
+#
+#      $LAST, last commit in $NEW, is computed by:
+#           > git log stripped1847 --pretty=format:'%H' -1
+#      Return a GIT hash code e.g., 44d12cd4b7e041f8d06f8735f1af08abb66825c4
+#
+# STEP 2.
+# -------
+# Create the trunkdart$OLD e.g.,
+#     > git checkout -b trunkdart$OLD $BASE
+#     > git cherry-pick $BASE..$LAST
+#
+#     e.g., git checkout -b trunkdart1847
+#
+# Create branch trunkdart$OLD and reapplies all Dart-related work on $OLD (from
+# the stripped branch created in Step1.).  This cherry-pick should not have any
+# conflicts as you are rebasing onto exactly the same source code layout.
+#
+# STEP 3.
+# -------
+# Create the branch for $NEW (trunkdart$NEW):
+#    > git checkout -b trunkdart$NEW dart$NEW
+#    > git cherry-pick $BASE2..$LAST2
+#
+# Important points trunkdart$NEW is attached to the remote SVN repository created
+# in pre-steps.
+#
+#    e.g., git checkout -b trunkdart1908 dart1908
+#          git cherry-pick xxxx..xxxx
+#
+# $BASE2 should be the same as $BASE to validate with:
+#
+#    > git log trunkdart$OLD --grep=@$OLD_REV --pretty=format:'%H' | tail -1
+#
+#    e.g., git log trunkdart1847 --grep=251094 --pretty=format:'%H' | tail -1
+#          3345f6a26911beda2ed352e887549bc514acb4bd
+#
+# $LAST2 is the last commit in $OLD in trunkdart$OLD computed by:
+#
+#    > git log trunkdart$OLD --pretty=format:'%H' -1
+#
+#    e.g., > git log trunkdart1847 --pretty=format:'%H' -1
+#          2549d8ecd211ee6fed6699d70f319e077b425be4
+#
+# The we'll cherry-pick commits from $OLD.
+#   e.g.,
+#   > git cherry-pick 3345f6a26911beda2ed352e887549bc514acb4bd..2549d8ecd211ee6fed6699d70f319e077b425be4
+#
+# Cherry picking is an iterative process.  Each commit in the $OLD branch is
+# applied to the $NEW branch any conflicts will need to fixed.
+#
+# Fix each file conflict(s) in a particular commit:
+#
+#   > vim <filename>
+#   > git add <filename>
+#
+# When all file conflicts for a particular commit are done then:
+#
+#   > git commit -a -m "Merged $OLD"
+#
+# Continue the original cherry-picking
+#   > git cherry-pick --continue
+#
+#
+# ********************************************************************
+# *                            IMPORTANT:                            *
+# ********************************************************************
+#
+# When all commits are made to our new trunk (trunkdart$NEW).  Then try an
+# initial dcommit with the --dry-run option.
+#
+#     > git svn dcommit --dry-run
+#
+#     e.g., git svn dcommit --dry-run
+#           Committing to svn://svn.chromium.org/chrome/branches/dart/1908/src ...
+#           diff-tree 48e85b5f247696c432d9dbb55c37f88f4df8a06a~1 48e85b5f247696c432d9dbb55c37f88f4df8a06a
+#           ...
+#
+# It is important to check the first line "Committing to " the repository
+# should be the new remote SVN e.g., svn://svn.chromium.org/chrome/branches/dart/1908/src ...
+#
+# IT SHOULD NOT BE "svn://svn.chromium.org/chrome/trunk/src ..." this will
+# dcommit the changes to the chrome trunk and break the chromium build.
+#
+function roll_chrome_commands() {
+  stripped_found=$(stripped_exist)
+  old_branch_found=$(trunk_exist ${do_old_branch})
+  new_branch_found=$(trunk_exist ${do_new_branch})
+
+  echo
+  echo "================================================"
+  echo "|             git commands to run:             |"
+  echo "================================================"
+
+  remoteOld=dart${do_old_branch}
+  strip_branch=$(stripped_name)
+
+  if [ "$stripped_found" = "" ]; then
+    echo "------------------ Step 1. ---------------------"
+    echo
+
+    # Git command to create stripped old branch.
+    echo "git checkout -b ${strip_branch} ${remoteOld}"
+
+    # Get hashes for base for do_old_branch.
+    hash_codes_base_last ${remoteOld}
+
+    echo "git rebase -i ${hash_base}"
+    echo
+  elif [ "$old_branch_found" = "" ]; then
+    echo "------------------ Step 2. ---------------------"
+    echo
+
+    # Get hashes for base, last and base hash from trunk for the last branch.
+    hash_codes_base_last ${strip_branch}
+
+    # Git command to create old branch with only changes from base to last
+    # commits for that branch.  Checkout based on stripped$OLD first commit
+    # $BASE.
+    branch_trunkdart_old=$(trunkdart_name ${do_old_branch})
+    echo "git checkout -b ${branch_trunkdart_old} ${hash_base}"
+
+    echo "git cherry-pick ${hash_base}..${hash_last}"
+    echo
+  elif [ "$new_branch_found" = "" ]; then
+    echo "------------------ Step 3. ---------------------"
+    echo
+
+    # Git command to create new branch to roll.
+    branch_trunkdart_new=$(trunkdart_name ${do_new_branch})
+
+    # get base and last commit hashes of the trunkdart$OLD
+    hash_codes_base2_last2 ${branch_trunkdart_old}
+
+    echo "git checkout -b ${branch_trunkdart_new} ${remoteOld}"
+
+    echo "git cherry-pick ${hash_base2}..${hash_last2}"
+    echo
+  else
+    echo "===== Nothing to do - Roll setup complete. ====="
+  fi
+
+  echo "================================================"
+}
+
+
+function roll_blink_commands() {
+  stripped_found=$(stripped_exist)
+  old_branch_found=$(trunk_exist ${do_old_branch})
+  new_branch_found=$(trunk_exist ${do_new_branch})
+
+  echo
+  echo "================================================"
+  echo "|             git commands to run:             |"
+  echo "================================================"
+
+  remoteOld=dart${do_old_branch}
+  strip_branch=$(stripped_name)
+
+  if [ "$stripped_found" = "" ]; then
+    echo "------------------ Step 1. ---------------------"
+    echo
+
+    # Git command to create stripped old branch.
+    echo "git checkout -b ${strip_branch} ${remoteOld}"
+
+    # Get hashes for base dir do_old_branch.
+    hash_codes_base_last ${remoteOld}
+
+    eho "git rebase -i ${hash_base}"
+    echo
+  elif [ "$old_branch_found" = "" ]; then
+    echo "------------------ Step 2. ---------------------"
+    echo
+
+    # Get hashes for base, last and base hash from trunk for the last branch.
+    hash_codes_base_last ${strip_branch}
+
+    # Git command to create old branch with only changes from base to last
+    # commits for that branch.  Checkout based on stripped$OLD first commit
+    # $BASE.
+    branch_trunkdart_old=$(trunkdart_name ${do_old_branch})
+    echo "git checkout -b ${branch_trunkdart_old} ${hash_base}"
+
+    echo "git cherry-pick ${hash_base}..${hash_last}"
+    echo
+  elif [ "$new_branch_found" = "" ]; then
+    echo "------------------ Step 3. ---------------------"
+    echo
+
+
+    # Git command to create new branch to roll.
+    branch_trunkdart_new=$(trunkdart_name ${do_new_branch})
+
+    # get base and last commit hashes of the trunkdart$OLD
+    hash_codes_base2_last2 ${branch_trunkdart_old}
+
+    echo "git checkout -b ${branch_trunkdart_new} ${remoteOld}"
+
+    echo "git cherry-pick ${hash_base2}..${hash_last2}"
+    echo
+  else
+    echo "===== Nothing to do - Roll setup complete. ====="
+  fi
+
+  echo "================================================"
+}
+
+
+# checkout strippedOOOO and trunkdartNNNN
+create_branches=0
+
+do_info_hashes=0
+
+base_dir=""
+
+# Display the pre-roll commands; if specified nothing else is displayed.
+do_pre_roll=0
+
+# which branch chrome or blink
+do_which=""
+
+# Display detail information about all major steps
+do_verbose=0
+
+# $OLD branch
+do_old_branch=""
+do_old_revision=""
+
+# $NEW branch
+do_new_branch=""
+do_new_revision=""
+
+curr_switch=""
+for var in "$@"
+do
+  case "$var" in
+  --help)
+    usage
+    exit
+    ;;
+  --verbose)
+    do_verbose=1
+    curr_switch=""
+    ;;
+  --no-verbose)
+    do_verbose=0
+    curr_switch=""
+    ;;
+  --chrome)
+    if [ "$do_which" != "" ]; then
+      $(display_error "--chrome can not be specified with --blink")
+      exit $E_INVALID_ARG
+    fi
+    do_which="chrome"
+    curr_switch=""
+    ;;
+  --blink)
+    if [ "$do_which" != "" ]; then
+      $(display_error "--blink can not be specified with --chrome")
+      exit $E_INVALID_ARG
+    fi
+    do_which="blink"
+    curr_switch=""
+    ;;
+  --pre-roll)
+    do_pre_roll=1
+    curr_switch=""
+    ;;
+  --roll)
+    roll_branches=1
+    curr_switch=""
+    ;;
+  --info)
+    do_info_hashes=1
+    curr_switch=""
+    ;;
+  --directory)
+    curr_switch="base-directory"   # takes an argument.
+    ;;
+  --old-branch)
+    curr_switch="old-branch"       # takes an argument.
+    ;;
+  --new-branch)
+    curr_switch="new-branch"       # takes an argument.
+    ;;
+  --old-revision)
+    curr_switch="old-revision"     # takes an argument.
+    ;;
+  --new-revision)
+    curr_switch="new-revision"     # takes an argument.
+    ;;
+  *)
+    prefix=${var:0:2}
+    if [ "$prefix" = "--" ]; then
+      $(display_error "unexpected switch ${var}")
+      exit $E_INVALID_ARG
+    fi
+    case "$curr_switch" in
+      base-directory)
+        base_dir="${var}"
+        ;;
+      old-branch)
+        do_old_branch="${var}"
+        ;;
+      old-revision)
+        do_old_revision="${var}"
+        ;;
+      new-branch)
+        do_new_branch="${var}"
+        ;;
+      new-revision)
+        do_new_revision="${var}"
+        ;;
+      *)
+        if [ "$curr_switch" != "" ]; then
+          $(display_error "unexpected paramter for ${curr_switch}")
+          exit $E_INVALID_ARG
+        else
+          $(display_error "unexpected switch ${var}")
+          exit $E_INVALID_ARG
+        fi
+        ;;
+    esac
+    curr_switch=""
+    ;;
+  esac
+done
+
+# Insure that everything is known otherwise prompt information.
+if [ "$base_dir" = "" ]; then
+  echo "--directory switch must be specified."
+  exit $E_INVALID_ARG
+fi
+
+if [ "$do_which" == "" ]; then
+  echo "--chrome or --blink switch must be specified."
+  exit $E_INVALID_ARG
+fi
+
+if [ "$do_old_branch" = "" ]; then
+  echo "Enter LAST ${do_which} true branch (e.g., Chrome version 34.0.1847.92 true branch is 1847)"
+  read do_old_branch
+fi
+
+if [ "$do_old_revision" = "" ]; then
+  echo "Enter LAST ${do_which} base trunk revision #"
+  read do_old_revision
+fi
+
+if [ "$do_new_branch" = "" ]; then
+  echo "Enter NEW ${do_which} true branch (e.g., Chrome version 35.0.1908.4 true branch is 1908)"
+  read do_new_branch
+fi
+
+if [ "$do_new_revision" = "" ]; then
+  echo "Enter NEW ${do_which} base trunk revision #"
+  read do_new_revision
+fi
+
+echo
+echo "Rolling new branch ${do_new_branch}@${do_new_revision}"
+
+verbose_message
+verbose_message "Previous branch ${do_old_branch}@${do_old_revision}"
+verbose_message "New branch ${do_new_branch}@${do_new_revision}"
+verbose_message
+
+if [[ "$do_pre_roll" = "1" ]]; then
+  display_remote_repository_creation
+  exit 1
+fi
+
+pushd . > /dev/null
+
+if [ "$base_dir" != "" ]; then
+  cd ${base_dir}
+fi
+
+cd src
+
+if [ "$do_which" = "blink" ]; then
+  cd third_party/WebKit
+fi
+
+# Disable ^C and ^Z while running script.
+trap '' INT
+trap '' TSTP
+
+validate_remotes
+
+display_roll_commands
+
+display_hashes
+
+# Insure that all local branches for the roll are NOT based on the chrome or
+# blink trunks.
+validate_branches
+
+# Re-enable ^C and ^Z.
+trap - INT
+trap - TSTP
+
+popd > /dev/null
+
diff --git a/tools/dartium/test.py b/tools/dartium/test.py
new file mode 100755
index 0000000..75b85d5
--- /dev/null
+++ b/tools/dartium/test.py
@@ -0,0 +1,242 @@
+#!/usr/bin/env python
+#
+# Copyright 2011 Google Inc. All Rights Reserved.
+
+import fnmatch
+import optparse
+import os
+import re
+import shutil
+import subprocess
+import sys
+import urllib
+import utils
+
+SCRIPT_TAG = '<script type="application/%s" src="%s"></script>\n'
+
+DART_TEST_DIR = os.path.join('dart')
+
+DART_VM_FLAGS = [
+    ]
+DART_VM_CHECKED_FLAGS = DART_VM_FLAGS + [
+    '--enable_type_checks',
+    '--warning_as_error',
+    ]
+
+TEST_DRT_FLAGS = [
+    '--compiler=none',
+    '--runtime=drt',
+    '--drt=%(drt)s',
+    '--mode=%(mode)s',
+    '--arch=%(arch)s',
+    '--build-directory=%(build_dir)s',
+    '--report',
+    '--time',
+    ]
+
+TEST_DRT_CHECKED_FLAGS = TEST_DRT_FLAGS + [
+    '--checked',
+    ]
+
+TEST_DARTIUM_FLAGS = [
+    '--compiler=none',
+    '--runtime=dartium',
+    '--dartium=%(dartium)s',
+    '--mode=%(mode)s',
+    '--build-directory=%(build_dir)s',
+    '--report',
+    '--time',
+    ]
+
+TEST_DARTIUM_CHECKED_FLAGS = TEST_DARTIUM_FLAGS + [
+    '--checked',
+    ]
+
+TEST_INFO = {
+    'dartium': {
+        'core': {
+            'checked': TEST_DARTIUM_CHECKED_FLAGS,
+            'unchecked': TEST_DARTIUM_FLAGS,
+        },
+    },
+    'drt': {
+        'layout': {
+            'checked': DART_VM_CHECKED_FLAGS,
+            'unchecked': DART_VM_FLAGS,
+        },
+        'core': {
+            'checked': TEST_DRT_CHECKED_FLAGS,
+            'unchecked': TEST_DRT_FLAGS,
+        },
+    },
+}
+
+COMPONENTS = TEST_INFO.keys()
+SUITES = [ 'layout', 'core' ]
+
+def main():
+  parser = optparse.OptionParser()
+  parser.add_option('--mode', dest='mode',
+                    action='store', type='string',
+                    help='Test mode (Debug or Release)')
+  parser.add_option('--component', dest='component',
+                    default='drt',
+                    action='store', type='string',
+                    help='Execution mode (dartium, drt or all)')
+  parser.add_option('--suite', dest='suite',
+                    default='all',
+                    action='store', type='string',
+                    help='Test suite (layout, core, or all)')
+  parser.add_option('--arch', dest='arch',
+                    default='ia32',
+                    action='store', type='string',
+                    help='Target architecture')
+  parser.add_option('--no-show-results', action='store_false',
+                    default=True, dest='show_results',
+                    help='Don\'t launch a browser with results '
+                    'after the tests are done')
+  parser.add_option('--checked', action='store_true',
+                    default=False, dest='checked',
+                    help='Run Dart code in checked mode')
+  parser.add_option('--unchecked', action='store_true',
+                    default=False, dest='unchecked',
+                    help='Run Dart code in unchecked mode')
+  parser.add_option('--buildbot', action='store_true',
+                    default=False, dest='buildbot',
+                    help='Print results in buildbot format')
+  parser.add_option('--layout-test', dest='layout_test',
+                    default=None,
+                    action='store', type='string',
+                    help='Single layout test to run if set')
+  parser.add_option('--test-filter', dest='test_filter',
+                    default=None,
+                    action='store', type='string',
+                    help='Test filter for core tests')
+  parser.add_option('--win-ninja-build', action='store_true',
+                    default=False, dest='is_win_ninja',
+                    help='We are on windows and use ninja for building.')
+
+  (options, args) = parser.parse_args()
+  mode = options.mode
+  if not (mode in ['Debug', 'Release']):
+    raise Exception('Invalid test mode')
+
+  if options.component == 'all':
+    components = COMPONENTS
+  elif not (options.component in COMPONENTS):
+    raise Exception('Invalid component %s' % options.component)
+  else:
+    components = [ options.component ]
+
+  if options.suite == 'all':
+    suites = SUITES
+  elif not (options.suite in SUITES):
+    raise Exception('Invalid suite %s' % options.suite)
+  else:
+    suites = [ options.suite ]
+
+  # If --checked or --unchecked not present, run with both.
+  checkmodes = ['unchecked', 'checked']
+  if options.checked or options.unchecked:
+    checkmodes = []
+    if options.unchecked: checkmodes.append('unchecked')
+    if options.checked: checkmodes.append('checked')
+
+  pathname = os.path.dirname(sys.argv[0])
+  fullpath = os.path.abspath(pathname)
+  srcpath = os.path.normpath(os.path.join(fullpath, '..'))
+
+  test_mode = ''
+  timeout = 30000
+  if mode == 'Debug':
+    test_mode = '--debug'
+    timeout = 60000
+
+  show_results = ''
+  if not options.show_results:
+    show_results = '--no-show-results'
+
+  host_os = utils.guessOS()
+  if options.is_win_ninja:
+    host_os = 'win-ninja'
+  build_root, drt_path, dartium_path, dart_path  = {
+      'mac': (
+        'out',
+        os.path.join('Content Shell.app', 'Contents', 'MacOS', 'Content Shell'),
+        os.path.join('Chromium.app', 'Contents', 'MacOS', 'Chromium'),
+        'dart',
+      ),
+      'linux': ('out', 'content_shell', 'chrome', 'dart'),
+      'win': ('out', 'content_shell.exe', 'chrome.exe', 'dart.exe'),
+      'win-ninja': ('out', 'content_shell.exe', 'chrome.exe', 'dart.exe'),
+  }[host_os]
+
+  build_dir = os.path.join(srcpath, build_root, mode)
+
+  executable_map = {
+    'mode': mode.lower(),
+    'build_dir': os.path.relpath(build_dir),
+    'drt': os.path.join(build_dir, drt_path),
+    'dartium': os.path.join(build_dir, dartium_path),
+    'dart': os.path.join(build_dir, dart_path),
+    'arch': options.arch,
+  }
+
+  test_script = os.path.join(srcpath, 'webkit', 'tools', 'layout_tests',
+                             'run_webkit_tests.py')
+
+  errors = False
+  for component in components:
+    for checkmode in checkmodes:
+      # Capture errors and report at the end.
+      try:
+        if ('layout' in suites and
+            'layout' in TEST_INFO[component] and
+            checkmode in TEST_INFO[component]['layout']):
+          # Run layout tests in this mode
+          dart_flags = ' '.join(TEST_INFO[component]['layout'][checkmode])
+
+          if options.layout_test:
+            test = os.path.join(DART_TEST_DIR, options.layout_test)
+          else:
+            test = DART_TEST_DIR
+          package_root = os.path.join(build_dir, 'packages')
+          utils.runCommand(['python',
+                            test_script,
+                            test_mode,
+                            show_results,
+                            '--time-out-ms', str(timeout),
+                            # Temporary hack to fix issue with svn vs. svn.bat.
+                            '--builder-name', 'BuildBot',
+                            '--additional-env-var',
+                            'DART_FLAGS=%s' % dart_flags,
+                            '--additional-env-var',
+                            'DART_PACKAGE_ROOT=file://%s' % package_root,
+                            test])
+
+        # Run core dart tests
+        if ('core' in suites and
+            'core' in TEST_INFO[component] and
+            checkmode in TEST_INFO[component]['core']):
+          core_flags = TEST_INFO[component]['core'][checkmode]
+          core_flags = map(lambda flag: flag % executable_map, core_flags)
+          if options.buildbot:
+            core_flags = ['--progress=buildbot'] + core_flags
+          tester = os.path.join(srcpath, 'dart', 'tools', 'test.py')
+          test_filter = [options.test_filter] if options.test_filter else []
+          utils.runCommand(['python', tester] + core_flags + test_filter)
+      except (StandardError, Exception) as e:
+        print 'Fail: '  + str(e)
+        errors = True
+
+  if errors:
+    return 1
+  else:
+    return 0
+
+if __name__ == '__main__':
+  try:
+    sys.exit(main())
+  except StandardError as e:
+    print 'Fail: ' + str(e)
+    sys.exit(1)
diff --git a/tools/dartium/update_deps.py b/tools/dartium/update_deps.py
new file mode 100755
index 0000000..c3036eb
--- /dev/null
+++ b/tools/dartium/update_deps.py
@@ -0,0 +1,269 @@
+#!/usr/bin/python
+
+# Update Dartium DEPS automatically.
+
+from datetime import datetime, timedelta
+import optparse
+import os
+import re
+from subprocess import Popen, PIPE
+import sys
+from time import strptime
+
+# Instructions:
+#
+# To run locally:
+#  (a) Create and change to a directory to run the updater in:
+#      > mkdir /usr/local/google/home/$USER/dartium_deps_updater
+#      > cd /usr/local/google/home/$USER/dartium_deps_updater
+#
+#  (b) Make a 'deps' directory to store temporary files:
+#      > mkdir deps
+#
+#  (c) Checkout dart/tools/dartium (with this script):
+#      > svn co https://dart.googlecode.com/svn/branches/bleeding_edge/dart/tools/dartium dartium_tools
+#
+#  (d) If your home directory is remote, consider redefining it for this shell/script:
+#      > cp -R $HOME/.subversion /usr/local/google/home/$USER
+#      > export HOME=/usr/local/google/home/$USER
+#
+#  (e) Test by running (Ctrl-C to quit):
+#      > ./dartium_tools/update_deps.py
+#      > ./dartium_tools/update_deps.py --target=multivm
+#      > ./dartium_tools/update_deps.py --target=clank
+#      > ./dartium_tools/update_deps.py --target=integration
+#
+#  (f) Run periodical update:
+#      > while true; do ./dartium_tools/update_deps.py --force ; sleep 300 ; done
+
+########################################################################
+# Repositories to auto-update
+########################################################################
+
+BRANCH_CURRENT="dart/1847"
+BRANCH_NEXT="dart/1916"
+BRANCH_MULTIVM="dart/multivm"
+
+TARGETS = {
+  'dartium': (
+    'https://dart.googlecode.com/svn/branches/bleeding_edge/deps/dartium.deps',
+    'dartium',
+    ['webkit', 'chromium'],
+    BRANCH_CURRENT,
+    ),
+  'integration': (
+    'https://dart.googlecode.com/svn/branches/dartium_integration/deps/dartium.deps',
+    'dartium',
+    ['webkit', 'chromium'],
+    BRANCH_NEXT,
+    ),
+  'clank': (
+    'https://dart.googlecode.com/svn/branches/bleeding_edge/deps/clank.deps',
+    'dartium',
+    ['webkit', 'chromium'],
+    BRANCH_CURRENT,
+    ),
+  'multivm': (
+    'https://dart.googlecode.com/svn/branches/bleeding_edge/deps/multivm.deps',
+    'multivm',
+    ['blink'],
+    BRANCH_MULTIVM,
+    ),
+}
+
+# Each element in this map represents a repository to update.  Entries
+# take the form:
+#  (repo_tag: (svn_url, view_url))
+#
+# The repo_tag must match the DEPS revision entry.  I.e, there must be
+# an entry of the form:
+#   'dartium_%s_revision' % repo_tag
+# to roll forward.
+#
+# The view_url should be parameterized by revision number.  This is
+# used to generated the commit message.
+REPOSITORY_INFO = {
+    'webkit': (
+        'http://src.chromium.org/blink/branches/%s',
+        'http://src.chromium.org/viewvc/blink?view=rev&revision=%s'),
+    'blink': (
+        'http://src.chromium.org/blink/branches/%s',
+        'http://src.chromium.org/viewvc/blink?view=rev&revision=%s'),
+    'chromium': (
+        'http://src.chromium.org/chrome/branches/%s',
+        'http://src.chromium.org/viewvc/chrome?view=rev&revision=%s'),
+}
+
+REPOSITORIES = REPOSITORY_INFO.keys()
+
+########################################################################
+# Actions
+########################################################################
+
+def write_file(filename, content):
+  f = open(filename, "w")
+  f.write(content)
+  f.close()
+
+def run_cmd(cmd):
+  print "\n[%s]\n$ %s" % (os.getcwd(), " ".join(cmd))
+  pipe = Popen(cmd, stdout=PIPE, stderr=PIPE)
+  output = pipe.communicate()
+  if pipe.returncode == 0:
+    return output[0]
+  else:
+    print output[1]
+    print "FAILED. RET_CODE=%d" % pipe.returncode
+    sys.exit(pipe.returncode)
+
+def parse_iso_time(s):
+  pair = s.rsplit(' ', 1)
+  d = datetime.strptime(pair[0], '%Y-%m-%d %H:%M:%S')
+  offset = timedelta(hours=int(pair[1][0:3]))
+  return d - offset
+
+def parse_git_log(output, repo):
+  if len(output) < 4:
+    return []
+  lst = output.split(os.linesep)
+  lst = [s.strip('\'') for s in lst]
+  lst = [s.split(',', 3) for s in lst]
+  lst = [{'repo': repo,
+      'rev': s[0],
+      'isotime':s[1],
+      'author': s[2],
+      'utctime': parse_iso_time(s[1]),
+      'info': s[3]} for s in lst]
+  return lst
+
+def parse_svn_log(output, repo):
+  lst = output.split(os.linesep)
+  lst = [s.strip('\'') for s in lst]
+  output = '_LINESEP_'.join(lst)
+  lst = output.split('------------------------------------------------------------------------')
+  lst = [s.replace('_LINESEP_', '\n') for s in lst]
+  lst = [s.strip('\n') for s in lst]
+  lst = [s.strip(' ') for s in lst]
+  lst = [s for s in lst if len(s) > 0]
+  pattern = re.compile(' \| (\d+) line(s|)')
+  lst = [pattern.sub(' | ', s) for s in lst]
+  lst = [s.split(' | ', 3) for s in lst]
+  lst = [{'repo': repo,
+      'rev': s[0].replace('r', ''),
+      'author': s[1],
+      'isotime':s[2][0:25],
+      'utctime': parse_iso_time(s[2][0:25]),
+      'info': s[3].split('\n')[2]} for s in lst]
+  return lst
+
+def commit_url(repo, rev):
+  numrev = rev.replace('r', '')
+  if repo in REPOSITORIES:
+    (_, view_url) = REPOSITORY_INFO[repo]
+    return view_url % numrev
+  else:
+    raise Exception('Unknown repo');
+
+def find_max(revs):
+  max_time = None
+  max_position = None
+  for i, rev in enumerate(revs):
+    if rev == []:
+      continue
+    if max_time is None or rev[0]['utctime'] > max_time:
+      max_time = rev[0]['utctime']
+      max_position = i
+  return max_position
+
+def merge_revs(revs):
+  position = find_max(revs)
+  if position is None:
+    return []
+  item = revs[position][0]
+  revs[position] = revs[position][1:]
+  return [item] + merge_revs(revs)
+
+def main():
+  option_parser = optparse.OptionParser()
+  option_parser.add_option('', '--target', help="Update one of [dartium|integration|multivm|clank]", action="store", dest="target", default="dartium")
+  option_parser.add_option('', '--force', help="Push DEPS update to server without prompting", action="store_true", dest="force")
+  options, args = option_parser.parse_args()
+
+  target = options.target
+  if not target in TARGETS.keys():
+    print "Error: invalid target"
+    print "Choose one of " + str(TARGETS)
+  (deps_dir, prefix, repos, branch) = TARGETS[target]
+  deps_file = deps_dir + '/DEPS'
+
+  src_dir = "/usr/local/google/home/%s/dartium_deps_updater/deps/%s" % (os.environ["USER"], target)
+  os.putenv("GIT_PAGER", "")
+
+  if not os.path.exists(src_dir):
+    print run_cmd(['svn', 'co', deps_dir, src_dir])
+
+  os.chdir(src_dir)
+
+  # parse DEPS
+  deps = run_cmd(['svn', 'cat', deps_file])
+  rev_num = {}
+  for repo in repos:
+    revision = '%s_%s_revision":\s*"(.+)"' % (prefix, repo)
+    rev_num[repo] = re.search(revision, deps).group(1)
+
+  # update repos
+  all_revs = []
+  for repo in repos:
+    (svn_url, _) = REPOSITORY_INFO[repo]
+    output = run_cmd(["svn", "log",  "-r", "HEAD:%s" % rev_num[repo], svn_url % branch])
+    revs = parse_svn_log(output, repo)
+    if revs and revs[-1]['rev'] == rev_num[repo]:
+      revs.pop()
+    all_revs.append(revs)
+
+  pending_updates = merge_revs(all_revs)
+  pending_updates.reverse()
+
+  print
+  print "Current DEPS revisions:"
+  for repo in repos:
+    print '  %s_%s_revision=%s' % (prefix, repo, rev_num[repo])
+
+  if len(pending_updates) == 0:
+    print "DEPS is up-to-date."
+    sys.exit(0)
+  else:
+    print "Pending DEPS updates:"
+    for s in pending_updates:
+      print "  %s to %s (%s) %s" % (s['repo'], s['rev'], s['isotime'], s['info'])
+
+  # make the next DEPS update
+  os.chdir(src_dir)
+  run_cmd(['rm', 'DEPS'])
+  print run_cmd(['svn', 'update'])
+  s = pending_updates[0]
+
+  pattern = re.compile(prefix + '_' + s['repo'] + '_revision":\s*"(.+)"')
+  new_deps = pattern.sub(prefix + '_' + s['repo'] + '_revision": "' + s['rev'] + '"', deps)
+  write_file('DEPS', new_deps)
+
+  commit_log = 'DEPS AutoUpdate: %s to %s (%s) %s\n' % (s['repo'], s['rev'], s['isotime'], s['author'])
+  commit_log += s['info'] + '\n' + commit_url(s['repo'], s['rev'])
+
+  write_file('commit_log.txt', commit_log)
+  print run_cmd(['svn', 'diff'])
+  print
+  print "Commit log:"
+  print "---------------------------------------------"
+  print commit_log
+  print "---------------------------------------------"
+
+  if not options.force:
+    print "Ready to push; press Enter to continue or Control-C to abort..."
+    sys.stdin.readline()
+  print run_cmd(['svn', 'commit', '--file', 'commit_log.txt'])
+  print "Done."
+
+
+if '__main__' == __name__:
+  main()
diff --git a/tools/dartium/update_patched_files.py b/tools/dartium/update_patched_files.py
new file mode 100755
index 0000000..37e9543
--- /dev/null
+++ b/tools/dartium/update_patched_files.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+#
+# Copyright 2012 Google Inc. All Rights Reserved.
+
+import overrides_database
+import shutil
+import subprocess
+import sys
+
+
+def svn_update(path, rev):
+  subprocess.call(['svn', 'up', '-r', str(rev), path])
+
+
+def update_overridden_files(old_rev, new_rev):
+  assert old_rev < new_rev
+  for override in overrides_database.OVERRIDDEN_FILES:
+    patched = override['modified']
+    orig = override['original']
+    svn_update(orig, old_rev)
+    shutil.copyfile(patched, orig)
+    svn_update(orig, new_rev)
+    shutil.copyfile(orig, patched)
+
+
+if __name__ == '__main__':
+  update_overridden_files(int(sys.argv[1]), int(sys.argv[2]))
diff --git a/tools/dartium/update_version.py b/tools/dartium/update_version.py
new file mode 100755
index 0000000..020eea3
--- /dev/null
+++ b/tools/dartium/update_version.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+#
+# Copyright 2012 Google Inc. All Rights Reserved.
+
+import subprocess
+import sys
+
+def FetchSVNRevision():
+  try:
+    proc = subprocess.Popen(['svn', 'info'],
+                            stdout=subprocess.PIPE,
+                            stderr=subprocess.PIPE,
+                            cwd='src/dart',
+                            shell=(sys.platform=='win32'))
+  except OSError:
+    # command is apparently either not installed or not executable.
+    return None
+  if not proc:
+    return None
+
+  for line in proc.stdout:
+    line = line.strip()
+    if not line:
+      continue
+    key, val = line.split(': ', 1)
+    if key == 'Revision':
+      return val
+
+  return None
+
+
+def main():
+  revision = FetchSVNRevision()
+  path = 'src/chrome/VERSION'
+  text = file(path).readlines()
+  text[2] = 'BUILD=d%s\n' % revision
+  file(path, 'w').writelines(text)
+
+if __name__ == '__main__':
+  main()
diff --git a/tools/dartium/utils.py b/tools/dartium/utils.py
new file mode 100755
index 0000000..e2a50ed
--- /dev/null
+++ b/tools/dartium/utils.py
@@ -0,0 +1,123 @@
+# Copyright 2010 Google Inc. All Rights Reserved.
+
+# This file contains a set of utilities functions used
+# by both SConstruct and other Python-based scripts.
+
+import commands
+import os
+import platform
+import re
+import subprocess
+
+class ChangedWorkingDirectory(object):
+  def __init__(self, new_dir):
+    self._new_dir = new_dir
+
+  def __enter__(self):
+    self._old_dir = os.getcwd()
+    os.chdir(self._new_dir)
+    return self._new_dir
+
+  def __exit__(self, *_):
+    os.chdir(self._old_dir)
+
+# Try to guess the host operating system.
+def guessOS():
+  id = platform.system()
+  if id == "Linux":
+    return "linux"
+  elif id == "Darwin":
+    return "mac"
+  elif id == "Windows" or id == "Microsoft":
+    # On Windows Vista platform.system() can return "Microsoft" with some
+    # versions of Python, see http://bugs.python.org/issue1082 for details.
+    return "win"
+  else:
+    return None
+
+
+# Try to guess the host architecture.
+def guessArchitecture():
+  id = platform.machine()
+  if id.startswith('arm'):
+    return 'arm'
+  elif (not id) or (not re.match('(x|i[3-6])86', id) is None):
+    return 'x86'
+  elif id == 'i86pc':
+    return 'x86'
+  else:
+    return None
+
+
+# Try to guess the number of cpus on this machine.
+def guessCpus():
+  if os.path.exists("/proc/cpuinfo"):
+    return int(commands.getoutput("grep -E '^processor' /proc/cpuinfo | wc -l"))
+  if os.path.exists("/usr/bin/hostinfo"):
+    return int(commands.getoutput('/usr/bin/hostinfo | grep "processors are logically available." | awk "{ print \$1 }"'))
+  win_cpu_count = os.getenv("NUMBER_OF_PROCESSORS")
+  if win_cpu_count:
+    return int(win_cpu_count)
+  return int(os.getenv("PARFAIT_NUMBER_OF_CORES", 2))
+
+
+# Returns true if we're running under Windows.
+def isWindows():
+  return guessOS() == 'win32'
+
+# Reads a text file into an array of strings - one for each
+# line. Strips comments in the process.
+def readLinesFrom(name):
+  result = []
+  for line in open(name):
+    if '#' in line:
+      line = line[:line.find('#')]
+    line = line.strip()
+    if len(line) == 0:
+      continue
+    result.append(line)
+  return result
+
+def listArgCallback(option, opt_str, value, parser):
+   if value is None:
+     value = []
+
+   for arg in parser.rargs:
+     if arg[:2].startswith('--'):
+       break
+     value.append(arg)
+
+   del parser.rargs[:len(value)]
+   setattr(parser.values, option.dest, value)
+
+
+def getCommandOutput(cmd):
+  print cmd
+  pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+  output = pipe.communicate()
+  if pipe.returncode == 0:
+    return output[0]
+  else:
+    print output[1]
+    raise Exception('Failed to run command. return code=%s' % pipe.returncode)
+
+def runCommand(cmd, env_update=None):
+  if env_update is None:
+    env_update = {}
+  print 'Running: ' + ' '.join(["%s='%s'" % (k, v) for k, v in env_update.iteritems()]) + ' ' + ' '.join(cmd)
+  env_copy = dict(os.environ.items())
+  env_copy.update(env_update)
+  p = subprocess.Popen(cmd, env=env_copy)
+  if p.wait() != 0:
+    raise Exception('Failed to run command. return code=%s' % p.returncode)
+
+def main(argv):
+  print "GuessOS() -> ", guessOS()
+  print "GuessArchitecture() -> ", guessArchitecture()
+  print "GuessCpus() -> ", guessCpus()
+  print "IsWindows() -> ", isWindows()
+
+
+if __name__ == "__main__":
+  import sys
+  main(sys.argv)
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index fdeb28d..cd457d6 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -68,6 +68,15 @@
   void handleEvent();
 };
 
+// FIXME(leafp): This is a temporary hack to get things running while
+// we are still generating _blink from the dart side idl files.
+// Once we are up and running generating dart:_blink in dartium
+// this should go away.
+[Supplemental]
+interface URL {
+  [Suppressed] static DOMString createObjectURL(WebKitMediaSource source);
+};
+
 [Supplemental]
 interface CanvasRenderingContext2D {
   [DartName=createImageDataFromImageData] ImageData createImageData(ImageData imagedata);
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 5f816451..ca8763f 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -36,7 +36,10 @@
 ]
 
 class HtmlDartGenerator(object):
-  def __init__(self, interface, options):
+  def __init__(self, interface, options, dart_use_blink):
+    # This goes away after the Chrome 35 roll (or whenever we commit to the
+    # dart:blink refactor)
+    self._dart_use_blink = dart_use_blink
     self._database = options.database
     self._interface = interface
     self._type_registry = options.type_registry
@@ -315,12 +318,13 @@
       declaration,
       generate_call,
       is_optional,
+      emitter,
       can_omit_type_check=lambda type, pos: False):
 
     parameter_names = [p.name for p in info.param_infos]
     number_of_required_in_dart = info.NumberOfRequiredInDart()
 
-    body_emitter = self._members_emitter.Emit(
+    body_emitter = emitter.Emit(
         '\n'
         '  $DECLARATION {\n'
         '$!BODY'
@@ -432,6 +436,10 @@
     def IsOptional(signature_index, argument):
       return is_optional(operations[signature_index], argument)
 
+    emitter = \
+        self._native_library_emitter if self._dart_use_blink \
+        else self._members_emitter
+
     self._GenerateOverloadDispatcher(
         info,
         [operation.arguments for operation in operations],
@@ -439,6 +447,7 @@
         declaration,
         GenerateCall,
         IsOptional,
+        emitter,
         can_omit_type_check)
 
   def AdditionalImplementedInterfaces(self):
@@ -529,13 +538,25 @@
           if param_info.is_optional:
             inits.Emit('    if ($E != null) e.$E = $E;\n', E=param_info.name)
     else:
+      custom_factory_ctr = self._interface.id in _custom_factories
+      constructor_full_name = constructor_info._ConstructorFullName(
+          self._DartType)
+
       def GenerateCall(
           stmts_emitter, call_emitter,
           version, signature_index, argument_count):
         name = emitter.Format('_create_$VERSION', VERSION=version)
-        call_emitter.Emit('$FACTORY.$NAME($FACTORY_PARAMS)',
-            FACTORY=factory_name,
-            NAME=name,
+        if self._dart_use_blink:
+            qualified_name = \
+                "_".join(["Native",self._interface.id,
+                          name + 'constructorCallback'])
+        else:
+            qualified_name = emitter.Format(
+                '$FACTORY.$NAME',
+                FACTORY=factory_name,
+                NAME=name)
+        call_emitter.Emit('$FACTORY_NAME($FACTORY_PARAMS)',
+            FACTORY_NAME=qualified_name,
             FACTORY_PARAMS= \
                 constructor_info.ParametersAsArgumentList(argument_count))
         self.EmitStaticFactoryOverload(
@@ -545,22 +566,47 @@
       def IsOptional(signature_index, argument):
         return self.IsConstructorArgumentOptional(argument)
 
-      custom_factory_ctr = self._interface.id in _custom_factories
-      constructor_full_name = constructor_info._ConstructorFullName(
-          self._DartType)
+      entry_declaration = emitter.Format(
+          '$(METADATA)$FACTORY_KEYWORD $CTOR($PARAMS)',
+          FACTORY_KEYWORD=('factory' if not custom_factory_ctr else
+                           'static %s' % constructor_full_name),
+          CTOR=(('' if not custom_factory_ctr else '_factory')
+                + constructor_full_name),
+          METADATA=metadata,
+          PARAMS=constructor_info.ParametersAsDeclaration(self._DartType))
+
+      if self._dart_use_blink:
+          overload_emitter = self._native_library_emitter
+          mname = constructor_full_name.replace(".", "_")
+          blink_name = \
+              "_".join(["Native",self._interface.id, mname])
+          qual_name = self._native_library_name + "." + blink_name
+          actuals_s = constructor_info.ParametersAsStringOfVariables()
+          self._members_emitter.Emit(
+            '\n'
+            '  $DECLARATION => $NATIVE_NAME($ACTUALS);\n',
+            DECLARATION=entry_declaration,
+            NATIVE_NAME=qual_name,
+            ACTUALS=actuals_s)
+          overload_declaration = emitter.Format(
+              '// Generated overload resolver\n'
+              '$CTOR($PARAMS)',
+              CTOR=blink_name,
+              PARAMS=actuals_s)
+
+
+      else:
+          overload_emitter = self._members_emitter
+          overload_declaration = entry_declaration
+
       self._GenerateOverloadDispatcher(
           constructor_info,
           constructor_info.idl_args,
           False,
-          emitter.Format('$(METADATA)$FACTORY_KEYWORD $CTOR($PARAMS)',
-            FACTORY_KEYWORD=('factory' if not custom_factory_ctr else
-                'static %s' % constructor_full_name),
-            CTOR=(('' if not custom_factory_ctr else '_factory')
-                + constructor_full_name),
-            METADATA=metadata,
-            PARAMS=constructor_info.ParametersAsDeclaration(self._DartType)),
+          overload_declaration,
           GenerateCall,
-          IsOptional)
+          IsOptional,
+          overload_emitter)
 
   def _AddFutureifiedOperation(self, info, html_name):
     """Given a API function that uses callbacks, convert it to using Futures.
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index dda2469..0ecc980 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -650,7 +650,7 @@
   """
 
   def __init__(self, interface, options):
-    super(Dart2JSBackend, self).__init__(interface, options)
+    super(Dart2JSBackend, self).__init__(interface, options, False)
 
     self._database = options.database
     self._template_loader = options.templates
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 3f3043e..86cf994 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -133,8 +133,7 @@
   ('DOMURL', 'createObjectUrlFromStreamCallback'): 'URLMediaStream',
   ('DOMURL', '_createObjectUrlFromWebKitSourceCallback'): 'URLMediaSource',
   ('DOMURL', '_createObjectURL_2Callback'): 'URLMediaSource',
-  ('DOMURL', '_createObjectURL_3Callback'): 'URLMediaSource',
-  ('DOMURL', '_createObjectURL_4Callback'): 'URLMediaStream',
+  ('DOMURL', '_createObjectURL_3Callback'): 'URLMediaStream',
 }
 
 _cpp_partial_map = {}
@@ -158,6 +157,109 @@
   ('Node', 'nodeType', 'Getter'),
   ('NodeList', 'length', 'Getter'),
   ('NodeList', 'item', 'Callback'),
+  ('WebGLRenderingContext', 'drawingBufferHeight', 'Getter'),
+  ('WebGLRenderingContext', 'drawingBufferWidth', 'Getter'),
+  ('WebGLRenderingContext', 'activeTexture', 'Callback'),
+  ('WebGLRenderingContext', 'attachShader', 'Callback'),
+  ('WebGLRenderingContext', 'bindAttribLocation', 'Callback'),
+  ('WebGLRenderingContext', 'bindBuffer', 'Callback'),
+  ('WebGLRenderingContext', 'bindFramebuffer', 'Callback'),
+  ('WebGLRenderingContext', 'bindRenderbuffer', 'Callback'),
+  ('WebGLRenderingContext', 'bindTexture', 'Callback'),
+  ('WebGLRenderingContext', 'blendColor', 'Callback'),
+  ('WebGLRenderingContext', 'blendEquation', 'Callback'),
+  ('WebGLRenderingContext', 'blendEquationSeparate', 'Callback'),
+  ('WebGLRenderingContext', 'blendFunc', 'Callback'),
+  ('WebGLRenderingContext', 'blendFuncSeparate', 'Callback'),
+  ('WebGLRenderingContext', 'checkFramebufferStatus', 'Callback'),
+  ('WebGLRenderingContext', 'clear', 'Callback'),
+  ('WebGLRenderingContext', 'clearColor', 'Callback'),
+  ('WebGLRenderingContext', 'clearDepth', 'Callback'),
+  ('WebGLRenderingContext', 'clearStencil', 'Callback'),
+  ('WebGLRenderingContext', 'colorMask', 'Callback'),
+  ('WebGLRenderingContext', 'compileShader', 'Callback'),
+  ('WebGLRenderingContext', 'compressedTexImage2D', 'Callback'),
+  ('WebGLRenderingContext', 'compressedTexSubImage2D', 'Callback'),
+  ('WebGLRenderingContext', 'copyTexImage2D', 'Callback'),
+  ('WebGLRenderingContext', 'copyTexSubImage2D', 'Callback'),
+  ('WebGLRenderingContext', 'cullFace', 'Callback'),
+  ('WebGLRenderingContext', 'deleteBuffer', 'Callback'),
+  ('WebGLRenderingContext', 'deleteFramebuffer', 'Callback'),
+  ('WebGLRenderingContext', 'deleteProgram', 'Callback'),
+  ('WebGLRenderingContext', 'deleteRenderbuffer', 'Callback'),
+  ('WebGLRenderingContext', 'deleteShader', 'Callback'),
+  ('WebGLRenderingContext', 'deleteTexture', 'Callback'),
+  ('WebGLRenderingContext', 'depthFunc', 'Callback'),
+  ('WebGLRenderingContext', 'depthMask', 'Callback'),
+  ('WebGLRenderingContext', 'depthRange', 'Callback'),
+  ('WebGLRenderingContext', 'detachShader', 'Callback'),
+  ('WebGLRenderingContext', 'disable', 'Callback'),
+  ('WebGLRenderingContext', 'disableVertexAttribArray', 'Callback'),
+  ('WebGLRenderingContext', 'drawArrays', 'Callback'),
+  ('WebGLRenderingContext', 'drawElements', 'Callback'),
+  ('WebGLRenderingContext', 'enable', 'Callback'),
+  ('WebGLRenderingContext', 'enableVertexAttribArray', 'Callback'),
+  ('WebGLRenderingContext', 'finish', 'Callback'),
+  ('WebGLRenderingContext', 'flush', 'Callback'),
+  ('WebGLRenderingContext', 'framebufferRenderbuffer', 'Callback'),
+  ('WebGLRenderingContext', 'framebufferTexture2D', 'Callback'),
+  ('WebGLRenderingContext', 'frontFace', 'Callback'),
+  ('WebGLRenderingContext', 'generateMipmap', 'Callback'),
+  ('WebGLRenderingContext', 'getActiveAttrib', 'Callback'),
+  ('WebGLRenderingContext', 'getActiveUniform', 'Callback'),
+  ('WebGLRenderingContext', 'getAttachedShaders', 'Callback'),
+  ('WebGLRenderingContext', 'getAttribLocation', 'Callback'),
+  ('WebGLRenderingContext', 'hint', 'Callback'),
+  ('WebGLRenderingContext', 'isBuffer', 'Callback'),
+  ('WebGLRenderingContext', 'isContextLost', 'Callback'),
+  ('WebGLRenderingContext', 'isEnabled', 'Callback'),
+  ('WebGLRenderingContext', 'isFramebuffer', 'Callback'),
+  ('WebGLRenderingContext', 'isProgram', 'Callback'),
+  ('WebGLRenderingContext', 'isRenderbuffer', 'Callback'),
+  ('WebGLRenderingContext', 'isShader', 'Callback'),
+  ('WebGLRenderingContext', 'isTexture', 'Callback'),
+  ('WebGLRenderingContext', 'lineWidth', 'Callback'),
+  ('WebGLRenderingContext', 'linkProgram', 'Callback'),
+  ('WebGLRenderingContext', 'pixelStorei', 'Callback'),
+  ('WebGLRenderingContext', 'polygonOffset', 'Callback'),
+  ('WebGLRenderingContext', 'scissor', 'Callback'),
+  ('WebGLRenderingContext', 'stencilFunc', 'Callback'),
+  ('WebGLRenderingContext', 'stencilFuncSeparate', 'Callback'),
+  ('WebGLRenderingContext', 'stencilMask', 'Callback'),
+  ('WebGLRenderingContext', 'stencilMaskSeparate', 'Callback'),
+  ('WebGLRenderingContext', 'stencilOp', 'Callback'),
+  ('WebGLRenderingContext', 'stencilOpSeparate', 'Callback'),
+  ('WebGLRenderingContext', 'uniform1f', 'Callback'),
+  ('WebGLRenderingContext', 'uniform1fv', 'Callback'),
+  ('WebGLRenderingContext', 'uniform1i', 'Callback'),
+  ('WebGLRenderingContext', 'uniform1iv', 'Callback'),
+  ('WebGLRenderingContext', 'uniform2f', 'Callback'),
+  ('WebGLRenderingContext', 'uniform2fv', 'Callback'),
+  ('WebGLRenderingContext', 'uniform2i', 'Callback'),
+  ('WebGLRenderingContext', 'uniform2iv', 'Callback'),
+  ('WebGLRenderingContext', 'uniform3f', 'Callback'),
+  ('WebGLRenderingContext', 'uniform3fv', 'Callback'),
+  ('WebGLRenderingContext', 'uniform3i', 'Callback'),
+  ('WebGLRenderingContext', 'uniform3iv', 'Callback'),
+  ('WebGLRenderingContext', 'uniform4f', 'Callback'),
+  ('WebGLRenderingContext', 'uniform4fv', 'Callback'),
+  ('WebGLRenderingContext', 'uniform4i', 'Callback'),
+  ('WebGLRenderingContext', 'uniform4iv', 'Callback'),
+  ('WebGLRenderingContext', 'uniformMatrix2fv', 'Callback'),
+  ('WebGLRenderingContext', 'uniformMatrix3fv', 'Callback'),
+  ('WebGLRenderingContext', 'uniformMatrix4fv', 'Callback'),
+  ('WebGLRenderingContext', 'useProgram', 'Callback'),
+  ('WebGLRenderingContext', 'validateProgram', 'Callback'),
+  ('WebGLRenderingContext', 'vertexAttrib1f', 'Callback'),
+  ('WebGLRenderingContext', 'vertexAttrib1fv', 'Callback'),
+  ('WebGLRenderingContext', 'vertexAttrib2f', 'Callback'),
+  ('WebGLRenderingContext', 'vertexAttrib2fv', 'Callback'),
+  ('WebGLRenderingContext', 'vertexAttrib3f', 'Callback'),
+  ('WebGLRenderingContext', 'vertexAttrib3fv', 'Callback'),
+  ('WebGLRenderingContext', 'vertexAttrib4f', 'Callback'),
+  ('WebGLRenderingContext', 'vertexAttrib4fv', 'Callback'),
+  ('WebGLRenderingContext', 'vertexAttribPointer', 'Callback'),
+  ('WebGLRenderingContext', 'viewport', 'Callback'),
 ])
 
 # TODO(vsm): This should be recoverable from IDL, but we appear to not
@@ -245,7 +347,7 @@
 
   def __init__(self, interface, native_library_emitter,
                cpp_library_emitter, options, dart_use_blink):
-    super(DartiumBackend, self).__init__(interface, options)
+    super(DartiumBackend, self).__init__(interface, options, dart_use_blink)
 
     self._interface = interface
     self._cpp_library_emitter = cpp_library_emitter
@@ -256,9 +358,6 @@
     self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
     self._metadata = options.metadata
     self._native_library_name = "_blink"
-    # This goes away after the Chrome 35 roll (or whenever we commit to the
-    # dart:blink refactor)
-    self._dart_use_blink = dart_use_blink
     # These get initialized by StartInterface
     self._cpp_header_emitter = None
     self._cpp_impl_emitter = None
@@ -450,7 +549,7 @@
 
   def _EmitConstructorInfrastructure(self,
       constructor_info, constructor_callback_cpp_name, factory_method_name,
-      argument_count=None):
+      argument_count=None, emit_to_native=False):
     constructor_callback_id = self._interface.id + '_' + constructor_callback_cpp_name
     if argument_count is None:
       argument_count = len(constructor_info.param_infos)
@@ -472,16 +571,17 @@
 
         # Then we emit the impedance matching wrapper to call out to the
         # toplevel wrapper
-        self._members_emitter.Emit(
-            '\n  @DocsEditable()\n'
-            '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
-            '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
-            INTERFACE_NAME=self._interface_type_info.interface_name(),
-            FACTORY_METHOD_NAME=factory_method_name,
-            PARAMETERS=typed_formals,
-            TOPLEVEL_NAME=DeriveQualifiedName(self._native_library_name,
-                                              dart_native_name),
-            OUTPARAMETERS=parameters)
+        if not emit_to_native:
+            self._members_emitter.Emit(
+                '\n  @DocsEditable()\n'
+                '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
+                '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
+                INTERFACE_NAME=self._interface_type_info.interface_name(),
+                FACTORY_METHOD_NAME=factory_method_name,
+                PARAMETERS=typed_formals,
+                TOPLEVEL_NAME=DeriveQualifiedName(self._native_library_name,
+                                                  dart_native_name),
+                OUTPARAMETERS=parameters)
     else:
         self._members_emitter.Emit(
             '\n  @DocsEditable()\n'
@@ -531,7 +631,8 @@
   def EmitStaticFactoryOverload(self, constructor_info, name, arguments):
     constructor_callback_cpp_name = name + 'constructorCallback'
     self._EmitConstructorInfrastructure(
-        constructor_info, constructor_callback_cpp_name, name, len(arguments))
+        constructor_info, constructor_callback_cpp_name, name, len(arguments), 
+        emit_to_native=self._dart_use_blink)
 
     ext_attrs = self._interface.ext_attrs
 
@@ -1014,34 +1115,73 @@
       if not is_custom:
         self._GenerateOperationNativeCallback(operation, operation.arguments, cpp_callback_name, auto_scope_setup)
     else:
-      self._GenerateDispatcher(info, info.operations, dart_declaration)
+      self._GenerateDispatcher(info, info.operations, dart_declaration, html_name)
 
-  def _GenerateDispatcher(self, info, operations, dart_declaration):
+  def _GenerateDispatcher(self, info, operations, dart_declaration, html_name):
 
     def GenerateCall(
         stmts_emitter, call_emitter, version, operation, argument_count):
-      overload_name = '_%s_%s' % (operation.id, version)
-      return_type = self.SecureOutputType(operation.type.id)
+      native_suffix = 'Callback'
       actuals = info.ParametersAsListOfVariables(argument_count)
-      actuals_s = ", ".join(actuals)
+      return_type = self.SecureOutputType(operation.type.id)
+      if self._dart_use_blink:
+          base_name = '_%s_%s' % (operation.id, version)
+          overload_name = \
+              DeriveNativeName(self._interface.id, base_name, native_suffix)
+          static = True
+          if not operation.is_static:
+            actuals = ['mthis'] + actuals
+          actuals_s = ", ".join(actuals)
+          dart_declaration = '%s(%s)' % (
+            base_name, actuals_s)
+      else:
+          base_name = '_%s_%s' % (operation.id, version)
+          overload_name = base_name
+          static = operation.is_static
+          actuals_s = ", ".join(actuals)
+          dart_declaration = '%s%s %s(%s)' % (
+            'static ' if static else '',
+            return_type,
+            overload_name, actuals_s)
+
       call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s)
-      dart_declaration = '%s%s %s(%s)' % (
-          'static ' if operation.is_static else '',
-          return_type,
-          overload_name, actuals_s)
       is_custom = 'Custom' in operation.ext_attrs
       native_suffix = 'Callback'
       auto_scope_setup = \
-        self._GenerateAutoSetupScope(overload_name, native_suffix)
+        self._GenerateAutoSetupScope(base_name, native_suffix)
       cpp_callback_name = self._GenerateNativeBinding(
-        overload_name, (0 if operation.is_static else 1) + argument_count,
-        dart_declaration, operation.is_static, return_type, actuals,
-        'Callback', is_custom, auto_scope_setup, emit_metadata=False)
+        base_name, (0 if static else 1) + argument_count,
+        dart_declaration, static, return_type, actuals,
+        native_suffix, is_custom, auto_scope_setup, emit_metadata=False,
+        emit_to_native=self._dart_use_blink)
       if not is_custom:
         self._GenerateOperationNativeCallback(operation,
           operation.arguments[:argument_count], cpp_callback_name,
           auto_scope_setup)
 
+
+    if self._dart_use_blink:
+        name = DeriveNativeName(self._interface.id, html_name, "")
+        qual_name = DeriveQualifiedName(self._native_library_name,
+                                        name)
+        actuals = info.ParametersAsListOfVariables()
+        formals = info.ParametersAsListOfVariables()
+        if not info.IsStatic():
+            formals = ['mthis'] + formals
+            actuals = ['this'] + actuals
+        actuals_s = ', '.join(actuals)
+        formals_s = ', '.join(formals)
+        self._members_emitter.Emit(
+        '\n'
+        '  $DECLARATION => $NATIVE_NAME($ACTUALS);\n',
+        DECLARATION=dart_declaration,
+        NATIVE_NAME=qual_name,
+        ACTUALS=actuals_s)
+
+        dart_declaration = \
+            '// Generated overload resolver\n' \
+            '%s(%s)' % (name, formals_s)
+
     self._GenerateDispatcherBody(
         info,
         operations,
@@ -1441,7 +1581,7 @@
 
   def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration,
       static, return_type, parameters, native_suffix, is_custom,
-      auto_scope_setup=True, emit_metadata=True):
+      auto_scope_setup=True, emit_metadata=True, emit_to_native=False):
     metadata = []
     if emit_metadata:
       metadata = self._metadata.GetFormattedMetadata(
@@ -1465,17 +1605,17 @@
             FORMALS=formals,
             NATIVE_BINDING=native_binding)
 
-        # We then emit a class method which calls out to the mangled toplevel
-        # function.  Eventually this will be replaced with a call to an
-        # interceptor
-        self._members_emitter.Emit(
-            '\n'
-            '  $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
-            METADATA=metadata,
-            DART_DECLARATION=dart_declaration,
-            DART_NAME=DeriveQualifiedName(self._native_library_name,
-                                          dart_native_name),
-            ACTUALS=actuals)
+        if not emit_to_native:
+            caller_emitter = self._members_emitter
+            full_dart_name = DeriveQualifiedName(self._native_library_name,
+                                                 dart_native_name)
+            caller_emitter.Emit(
+                '\n'
+                '  $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
+                METADATA=metadata,
+                DART_DECLARATION=dart_declaration,
+                DART_NAME=full_dart_name,
+                ACTUALS=actuals)
     else:
         self._members_emitter.Emit(
             '\n'
diff --git a/tools/dom/src/dart2js_CustomElementSupport.dart b/tools/dom/src/dart2js_CustomElementSupport.dart
index 009f857..62c120d 100644
--- a/tools/dom/src/dart2js_CustomElementSupport.dart
+++ b/tools/dom/src/dart2js_CustomElementSupport.dart
@@ -16,12 +16,12 @@
   };
 }
 
-_callEnteredView(receiver) {
-  return receiver.enteredView();
+_callAttached(receiver) {
+  return receiver.attached();
 }
 
-_callLeftView(receiver) {
-  return receiver.leftView();
+_callDetached(receiver) {
+  return receiver.detached();
 }
  _callAttributeChanged(receiver, name, oldValue, newValue) {
   return receiver.attributeChanged(name, oldValue, newValue);
@@ -104,9 +104,9 @@
       JS('=Object', '{value: #}',
           _makeCallbackMethod(_callConstructor(constructor, interceptor))));
   JS('void', '#.attachedCallback = #', properties,
-      JS('=Object', '{value: #}', _makeCallbackMethod(_callEnteredView)));
+      JS('=Object', '{value: #}', _makeCallbackMethod(_callAttached)));
   JS('void', '#.detachedCallback = #', properties,
-      JS('=Object', '{value: #}', _makeCallbackMethod(_callLeftView)));
+      JS('=Object', '{value: #}', _makeCallbackMethod(_callDetached)));
   JS('void', '#.attributeChangedCallback = #', properties,
       JS('=Object', '{value: #}', _makeCallbackMethod3(_callAttributeChanged)));
 
diff --git a/tools/dom/src/dartium_CustomElementSupport.dart b/tools/dom/src/dartium_CustomElementSupport.dart
index df29593..3afc56a 100644
--- a/tools/dom/src/dartium_CustomElementSupport.dart
+++ b/tools/dom/src/dartium_CustomElementSupport.dart
@@ -31,7 +31,6 @@
       throw new UnsupportedError('Element is incorrect type');
     }
     return _Utils.changeElementWrapper(element, _type);
-    return null;
   }
 }
 
diff --git a/tools/dom/src/html_native_DOMImplementation.dart b/tools/dom/src/html_native_DOMImplementation.dart
index 5d89649..af2983c 100644
--- a/tools/dom/src/html_native_DOMImplementation.dart
+++ b/tools/dom/src/html_native_DOMImplementation.dart
@@ -492,7 +492,7 @@
   String remove(String key) => _blink.Native_DOMStringMap_remove(this, key);
   void clear() => Maps.clear(this);
   void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this, keys);
+  Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this);
   Iterable<String> get values => Maps.getValues(this);
   int get length => Maps.length(this);
   bool get isEmpty => Maps.isEmpty(this);
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index d8c4edc..490dd14 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -417,7 +417,7 @@
 
   static void initializeCustomElement(HtmlElement element) native "Utils_initializeCustomElement";
 
-  static void changeElementWrapper(HtmlElement element, Type type) native "Utils_changeElementWrapper";
+  static Element changeElementWrapper(HtmlElement element, Type type) native "Utils_changeElementWrapper";
 }
 
 class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
diff --git a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
index 30b3725..dec9dba 100644
--- a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
@@ -10,6 +10,30 @@
  * up the dart:html library.
  */
 library dart.dom._blink;
+// TODO(leafp) These are mostly copied over from dart:html.  When
+// we shift dart:blink generation over to dartium, this dependency 
+// should go away, or at least be reconsidered.
+import 'dart:async';
+import 'dart:collection';
+import 'dart:html';
+import 'dart:_internal' hide Symbol, deprecated;
+import 'dart:html_common';
+import 'dart:indexed_db';
+import 'dart:isolate';
+import "dart:convert";
+import 'dart:math';
+// TODO(vsm): Remove this when we can do the proper checking in
+// native code for custom elements.
+import 'dart:mirrors';
+import 'dart:nativewrappers';
+import 'dart:typed_data';
+import 'dart:web_gl' as gl;
+import 'dart:web_sql';
+// Not actually used, but imported since dart:html can generate these objects.
+import 'dart:svg' as svg;
+import 'dart:svg' show Matrix;
+import 'dart:svg' show SvgSvgElement;
+import 'dart:web_audio' show AudioNode, AudioParam;
 
 part '$AUXILIARY_DIR/blink_native_DOMImplementation.dart';
 
diff --git a/tools/dom/templates/html/impl/impl_Document.darttemplate b/tools/dom/templates/html/impl/impl_Document.darttemplate
index 98df72e..d96f6c8 100644
--- a/tools/dom/templates/html/impl/impl_Document.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Document.darttemplate
@@ -48,8 +48,8 @@
   ElementList queryAll(String relativeSelectors) =>
       querySelectorAll(relativeSelectors);
 
-  /// Checks if [register] is supported on the current platform.
-  bool get supportsRegister {
+  /// Checks if [registerElement] is supported on the current platform.
+  bool get supportsRegisterElement {
 $if DART2JS
     return JS('bool', '("registerElement" in #)', this);
 $else
@@ -57,6 +57,10 @@
 $endif
   }
 
+  /// *Deprecated*: use [supportsRegisterElement] instead.
+  @deprecated
+  bool get supportsRegister => supportsRegisterElement;
+
   @DomName('Document.createElement')
   Element createElement(String tagName, [String typeExtension]) {
 $if DART2JS
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 4155c8d..c28b153 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -361,7 +361,7 @@
    *          // Perform any element initialization.
    *       }
    *     }
-   *     document.register('x-custom', CustomElement);
+   *     document.registerElement('x-custom', CustomElement);
    */
   Element.created() : super._created() {
     // Validate that this is a custom element & perform any additional
@@ -738,15 +738,39 @@
   /**
    * Called by the DOM when this element has been inserted into the live
    * document.
+   *
+   * More information can be found in the
+   * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-attached-callback)
+   * draft specification.
    */
   @Experimental()
-  void enteredView() {}
+  void attached() {
+    // For the deprecation period, call the old callback.
+    enteredView();
+  }
 
   /**
    * Called by the DOM when this element has been removed from the live
    * document.
+   *
+   * More information can be found in the
+   * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-detached-callback)
+   * draft specification.
    */
   @Experimental()
+  void detached() {
+    // For the deprecation period, call the old callback.
+    leftView();
+  }
+
+  /** *Deprecated*: override [attached] instead. */
+  @Experimental()
+  @deprecated
+  void enteredView() {}
+
+  /** *Deprecated*: override [detached] instead. */
+  @Experimental()
+  @deprecated
   void leftView() {}
 
   /**
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 70662bd..1cfbdcb 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -219,7 +219,7 @@
    *     }
    *
    *     main() {
-   *       document.register('x-foo', FooElement);
+   *       document.registerElement('x-foo', FooElement);
    *       var myFoo = new Element.tag('x-foo');
    *       // prints 'FooElement created!' to the console.
    *     }
@@ -236,7 +236,7 @@
    *     }
    *
    *     main() {
-   *       document.register('x-bar', BarElement);
+   *       document.registerElement('x-bar', BarElement);
    *       var myBar = new Element.tag('input', 'x-bar');
    *       // prints 'BarElement created!' to the console.
    *     }
@@ -245,16 +245,22 @@
    * `<input is="x-bar"></input>`
    *
    */
+  void registerElement(String tag, Type customElementClass,
+      {String extendsTag}) {
 $if DART2JS
-  void register(String tag, Type customElementClass, {String extendsTag}) {
     _registerCustomElement(JS('', 'window'), this, tag, customElementClass,
         extendsTag);
-  }
 $else
-  void register(String tag, Type customElementClass, {String extendsTag}) {
     _Utils.register(this, tag, customElementClass, extendsTag);
-  }
 $endif
+  }
+
+  /** *Deprecated*: use [registerElement] instead. */
+  @deprecated
+  @Experimental()
+  void register(String tag, Type customElementClass, {String extendsTag}) {
+    return registerElement(tag, customElementClass, extendsTag: extendsTag);
+  }
 
   /**
    * Static factory designed to expose `visibilitychange` events to event
diff --git a/tools/test.dart b/tools/test.dart
index ebc807b..229cf0f 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -165,7 +165,8 @@
       maxBrowserProcesses = 1;
     } else if (conf['runtime'].startsWith('safari')) {
       // Safari does not allow us to run from a fresh profile, so we can only
-      // use one browser.
+      // use one browser. Additionally, you can not start two simulators
+      // for mobile safari simultainiously.
       maxBrowserProcesses = 1;
     } else if (conf['runtime'] == 'chrome' &&
                Platform.operatingSystem == 'macos') {
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index a1a9d92..718588d 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -76,6 +76,8 @@
       browser = new Dartium(checkedMode);
     } else if (name == 'safari') {
       browser = new Safari();
+    } else if (name == 'safarimobilesim') {
+      browser = new SafariMobileSimulator();
     } else if (name.startsWith('ie')) {
       browser = new IE();
     } else {
@@ -440,6 +442,49 @@
   String toString() => "Chrome";
 }
 
+
+class SafariMobileSimulator extends Safari {
+  /**
+   * Directories where safari simulator stores state. We delete these if the
+   * deleteCache is set
+   */
+  static const List<String> CACHE_DIRECTORIES =
+      const ["Library/Application Support/iPhone Simulator/7.1/Applications"];
+
+  // Clears the cache if the static deleteCache flag is set.
+  // Returns false if the command to actually clear the cache did not complete.
+  Future<bool> clearCache() {
+    if (!Browser.deleteCache) return new Future.value(true);
+    var home = Platform.environment['HOME'];
+    Iterator iterator = CACHE_DIRECTORIES.map((s) => "$home/$s").iterator;
+    return deleteIfExists(iterator);
+  }
+
+  Future<bool> start(String url) {
+    _logEvent("Starting safari mobile simulator browser on: $url");
+    return clearCache().then((success) {
+      if (!success) {
+        _logEvent("Could not clear cache, exiting");
+	return false;
+      }
+      var args = ["-SimulateApplication",
+                  "/Applications/Xcode.app/Contents/Developer/Platforms/"
+                  "iPhoneSimulator.platform/Developer/SDKs/"
+                  "iPhoneSimulator7.1.sdk/Applications/MobileSafari.app/"
+                  "MobileSafari",
+                  "-u", url];
+      return startBrowser(_binary, args)
+        .catchError((e) {
+          _logEvent("Running $_binary --version failed with $e");
+          return false;
+        });
+    });
+  }
+
+  String toString() => "SafariMobileSimulator";
+}
+
+
 class Dartium extends Chrome {
   final bool checkedMode;
 
diff --git a/tools/testing/dart/runtime_configuration.dart b/tools/testing/dart/runtime_configuration.dart
index ae4a362..f36c43e 100644
--- a/tools/testing/dart/runtime_configuration.dart
+++ b/tools/testing/dart/runtime_configuration.dart
@@ -36,6 +36,7 @@
       case 'ie9':
       case 'opera':
       case 'safari':
+      case 'safarimobilesim':
         // TODO(ahe): Replace this with one or more browser runtimes.
         return new DummyRuntimeConfiguration();
 
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index 657da29..48824f3 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -100,7 +100,7 @@
               ['-r', '--runtime'],
               ['vm', 'd8', 'jsshell', 'drt', 'dartium', 'ff', 'firefox',
                'chrome', 'safari', 'ie9', 'ie10', 'ie11', 'opera',
-               'chromeOnAndroid',
+               'chromeOnAndroid', 'safarimobilesim',
                'ContentShellOnAndroid', 'DartiumOnAndroid', 'none'],
               'vm'),
           new _TestOptionSpecification(
@@ -603,7 +603,7 @@
         // with dart2js, we should remove it from here.
         validRuntimes = const ['d8', 'jsshell', 'drt', 'none', 'dartium',
                                'ff', 'chrome', 'safari', 'ie9', 'ie10', 'ie11',
-                               'opera', 'chromeOnAndroid'];
+                               'opera', 'chromeOnAndroid', 'safarimobilesim'];
         break;
       case 'dartanalyzer':
       case 'dart2analyzer':
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index dbcf5e3..24b1510 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -2020,6 +2020,7 @@
       'chrome',
       'ff',
       'chromeOnAndroid',
+      'safarimobilesim',
       'ContentShellOnAndroid',
       'DartiumOnAndroid'
     ];
diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
index f56ccfa..b5b5f87 100644
--- a/tools/testing/dart/utils.dart
+++ b/tools/testing/dart/utils.dart
@@ -208,6 +208,11 @@
         'safari': const {
           'macos': '/Applications/Safari.app/Contents/MacOS/Safari'
         },
+        'safarimobilesim': const {
+          'macos': '/Applications/Xcode.app/Contents/Developer/Platforms/'
+                   'iPhoneSimulator.platform/Developer/Applications/'
+                   'iPhone Simulator.app/Contents/MacOS/iPhone Simulator'
+        },
         'ie9': const {
           'windows': 'C:\\Program Files\\Internet Explorer\\iexplore.exe'
         },